ZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCAwMzg3NjU0Li4wZWE2NGI5IDEwMDc1NQotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC01LDcgKzUsNyBAQAogIyMgIENvcHlyaWdodCAoYykgMTk5NiwgOTcsIDk4LCA5OSwgMjAwMCBLdW5paGlybyBJc2hpZ3VybyA8a3VuaWhpcm9AemVicmEub3JnPgogIyMgIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAwMyBQYXVsIEpha21hIDxwYXVsQGRpc2hvbmUuc3Q+CiAjIwotIyMgJElkOiBjb25maWd1cmUuYWMsdiAxLjUxIDIwMDQvMDUvMTEgMTA6NDk6MzUgcGF1bCBFeHAgJAorIyMgJElkOiBjb25maWd1cmUuYWMsdiAxLjUyIDIwMDQvMDYvMTIgMTQ6MzM6MDUgaGFzc28gRXhwICQKIEFDX1BSRVJFUSgyLjUzKQogCiBBQ19JTklUKHF1YWdnYSwgMC45Ni41LCBbaHR0cDovL2J1Z3ppbGxhLnF1YWdnYS5uZXRdKQpAQCAtMTI1LDYgKzEyNSw4IEBACiAKIEFDX0FSR19FTkFCTEUocnRhZHYsCiBbICAtLWRpc2FibGUtcnRhZHYgICAgICAgICBkaXNhYmxlIElQVjYgcm91dGVyIGFkdmVydGlzZW1lbnQgZmVhdHVyZV0pCitBQ19BUkdfRU5BQkxFKGlyZHAsCitbICAtLWVuYWJsZS1pcmRwICAgICAgICAgICBlbmFibGUgSVJEUCBzZXJ2ZXIgc3VwcG9ydCBpbiB6ZWJyYV0pCiBBQ19BUkdfRU5BQkxFKGNhcGFiaWxpdGllcywKIFsgIC0tZGlzYWJsZS1jYXBhYmlsaXRpZXMgICAgICAgIGRpc2FibGUgdXNpbmcgUE9TSVggY2FwYWJpbGl0aWVzXSkKIApAQCAtMTYzLDYgKzE2NSwxMCBAQAogICBBQ19NU0dfUkVTVUxUKG5vKQogZmkKIAoraWYgdGVzdCAiJHtlbmFibGVfaXJkcH0iID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfSVJEUCwsIElSRFAgKQorZmkKKwogaWYgdGVzdCAiJHtlbmFibGVfdXNlcn0iID0gInllcyIgfHwgdGVzdCB4IiR7ZW5hYmxlX3VzZXJ9IiA9IHgiIjsgdGhlbgogICBlbmFibGVfdXNlcj0icXVhZ2dhIgogZWxpZiB0ZXN0ICIke2VuYWJsZV91c2VyfSIgPSAibm8iOyB0aGVuCmRpZmYgLS1naXQgYS9saWIvbWVtb3J5LmggYi9saWIvbWVtb3J5LmgKaW5kZXggOTZiNWY2Yy4uNDAwODFmZSAxMDA2NDQKLS0tIGEvbGliL21lbW9yeS5oCisrKyBiL2xpYi9tZW1vcnkuaApAQCAtMzgsNiArMzgsNyBAQAogICBNVFlQRV9WVFlfSElTVCwKICAgTVRZUEVfVlRZX09VVF9CVUYsCiAgIE1UWVBFX0lGLAorICBNVFlQRV9JRl9JUkRQLAogICBNVFlQRV9DT05ORUNURUQsCiAgIE1UWVBFX0FTX1NFRywKICAgTVRZUEVfQVNfU1RSLApkaWZmIC0tZ2l0IGEvemVicmEvQ2hhbmdlTG9nIGIvemVicmEvQ2hhbmdlTG9nCmluZGV4IDA0NjE5YWUuLmRhMzIxMGUgMTAwNjQ0Ci0tLSBhL3plYnJhL0NoYW5nZUxvZworKysgYi96ZWJyYS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw3IEBACisyMDA0LTA2LTEyIFJvYmVydCBPbHNzb24gPFJvYmVydC5PbHNzb24gYXQgZGF0YS5zbHUuc2U+CisKKyAgICAgICAgKiBBZGRlZCBJUkRQIHN1cHBvcnQuCisKIDIwMDQtMDUtMTggSGFzc28gVGVwcGVyIDxoYXNzb0Blc3RwYWsuZWU+CiAKIAkqIHJ0YWR2LmM6IFJlbW92ZWQgIltub10gaXB2NiBuZCBzZW5kLXJhIiBjb21tYW5kLiBSZXBsYWNlZCAiaXB2NiBuZApkaWZmIC0tZ2l0IGEvemVicmEvTWFrZWZpbGUuYW0gYi96ZWJyYS9NYWtlZmlsZS5hbQppbmRleCA2MWZkYWVhLi42YjQ5NGU3IDEwMDY0NAotLS0gYS96ZWJyYS9NYWtlZmlsZS5hbQorKysgYi96ZWJyYS9NYWtlZmlsZS5hbQpAQCAtMjMsMTEgKzIzLDEyIEBACiAKIHplYnJhX1NPVVJDRVMgPSBcCiAJenNlcnYuYyBtYWluLmMgaW50ZXJmYWNlLmMgY29ubmVjdGVkLmMgemVicmFfcmliLmMgXAotCXJlZGlzdHJpYnV0ZS5jIGRlYnVnLmMgcnRhZHYuYyB6ZWJyYV9zbm1wLmMgemVicmFfdnR5LmMKKwlyZWRpc3RyaWJ1dGUuYyBkZWJ1Zy5jIHJ0YWR2LmMgemVicmFfc25tcC5jIHplYnJhX3Z0eS5jIFwKKwlpcmRwX21haW4uYyBpcmRwX2ludGVyZmFjZS5jIGlyZHBfcGFja2V0LmMKIAogbm9pbnN0X0hFQURFUlMgPSBcCiAJY29ubmVjdGVkLmggaW9jdGwuaCByaWIuaCBydC5oIHpzZXJ2LmggcmVkaXN0cmlidXRlLmggZGVidWcuaCBydGFkdi5oIFwKLQlpbnRlcmZhY2UuaCBpcGZvcndhcmQuaAorCWludGVyZmFjZS5oIGlwZm9yd2FyZC5oIGlyZHAuaAogCiB6ZWJyYV9MREFERCA9IC4uL2xpYi9saWJ6ZWJyYS5hICQob3RoZXJvYmopICQoTElCQ0FQKSAkKExJQl9JUFY2KQogCmRpZmYgLS1naXQgYS96ZWJyYS9pbnRlcmZhY2UuYyBiL3plYnJhL2ludGVyZmFjZS5jCmluZGV4IDc0OGJmMDAuLjNhN2E1OTEgMTAwNjQ0Ci0tLSBhL3plYnJhL2ludGVyZmFjZS5jCisrKyBiL3plYnJhL2ludGVyZmFjZS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAiemVicmEvenNlcnYuaCIKICNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKICNpbmNsdWRlICJ6ZWJyYS9kZWJ1Zy5oIgorI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKIAwKIC8qIEFsbG9jYXRlIGEgbmV3IGludGVybmFsIGludGVyZmFjZSBpbmRleCAKICAqIFRoaXMgd29ya3MgZG9uZSBmcm9tIHRoZSB0b3Agc28gdGhhdCAlZCBtYWNyb3MKQEAgLTE0MTksNiArMTQyMCwxMCBAQAogICAgICAgcnRhZHZfY29uZmlnX3dyaXRlICh2dHksIGlmcCk7CiAjZW5kaWYgLyogUlRBRFYgKi8KIAorI2lmZGVmIEhBVkVfSVJEUAorICAgICAgaXJkcF9jb25maWdfd3JpdGUgKHZ0eSwgaWZwKTsKKyNlbmRpZiAvKiBJUkRQICovCisKICAgICAgIHZ0eV9vdXQgKHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKICAgICB9CiAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvemVicmEvaW50ZXJmYWNlLmggYi96ZWJyYS9pbnRlcmZhY2UuaAppbmRleCAzYWI2MjRmLi5jMWY5ZjcxIDEwMDY0NAotLS0gYS96ZWJyYS9pbnRlcmZhY2UuaAorKysgYi96ZWJyYS9pbnRlcmZhY2UuaApAQCAtMTksNiArMTksMTAgQEAKICAqIDAyMTExLTEzMDcsIFVTQS4gIAogICovCiAKKyNpZmRlZiBIQVZFX0lSRFAKKyNpbmNsdWRlICJ6ZWJyYS9pcmRwLmgiCisjZW5kaWYKKwogLyogRm9yIGludGVyZmFjZSBtdWx0aWNhc3QgY29uZmlndXJhdGlvbi4gKi8KICNkZWZpbmUgSUZfWkVCUkFfTVVMVElDQVNUX1VOU1BFQyAwCiAjZGVmaW5lIElGX1pFQlJBX01VTFRJQ0FTVF9PTiAgICAgMQpAQCAtMTUzLDYgKzE1NywxMSBAQAogI2lmZGVmIFJUQURWCiAgIHN0cnVjdCBydGFkdmNvbmYgcnRhZHY7CiAjZW5kaWYgLyogUlRBRFYgKi8KKworI2lmZGVmIEhBVkVfSVJEUAorICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgaXJkcDsKKyNlbmRpZgorCiB9OwogCiB2b2lkIGlmX2RlbGV0ZV91cGRhdGUgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7CmRpZmYgLS1naXQgYS96ZWJyYS9pcmRwLmggYi96ZWJyYS9pcmRwLmgKaW5kZXggMGZhZDU4MS4uMmJmMTdmMCAxMDA2NDQKLS0tIGEvemVicmEvaXJkcC5oCisrKyBiL3plYnJhL2lyZHAuaApAQCAtMTksNiArMTksMTkgQEAKICAqIDAyMTExLTEzMDcsIFVTQS4gIAogICovCiAKKy8qIAorICogVGhpcyBmaWxlIGlzIG1vZGlmaWVkIGFuZCBjb21wbGV0ZWQgZm9yIHRoZSBaZWJyYSBJUkRQIGltcGxlbWVudGF0aW9uCisgKiBieSBSb2JlcnQgT2xzc29uLCBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCisgKi8KKworI2lmbmRlZiBfSVJEUF9ICisjZGVmaW5lIF9JUkRQX0gKKworI2luY2x1ZGUgImxpYi92dHkuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCiAvKiBJQ01QIE1lc3NhZ2VzICovCiAjaWZuZGVmIElDTVBfUk9VVEVSQURWRVJUCiAjZGVmaW5lIElDTVBfUk9VVEVSQURWRVJUIDkKQEAgLTMwLDE3ICs0MywzNiBAQAogCiAvKiBNdWx0aWNhc3QgZ3JvdXBzICovCiAjaWZuZGVmIElOQUREUl9BTExIT1NUU19HUk9VUAotI2RlZmluZSBJTkFERFJfQUxMSE9TVFNfR1JPVVAgMHhlMDAwMDAwMSAgICAvKiAyMjQuMC4wLjEgKi8KKyNkZWZpbmUgSU5BRERSX0FMTEhPU1RTX0dST1VQIDB4ZTAwMDAwMDFVICAgIC8qIDIyNC4wLjAuMSAqLwogI2VuZGlmIC8qIElOQUREUl9BTExIT1NUU19HUk9VUCAqLwogCiAjaWZuZGVmIElOQUREUl9BTExSVFJTX0dST1VQCi0jZGVmaW5lIElOQUREUl9BTExSVFJTX0dST1VQICAweGUwMDAwMDAyICAgIC8qIDIyNC4wLjAuMiAqLworI2RlZmluZSBJTkFERFJfQUxMUlRSU19HUk9VUCAgMHhlMDAwMDAwMlUgICAgLyogMjI0LjAuMC4yICovCiAjZW5kaWYgLyogSU5BRERSX0FMTFJUUlNfR1JPVVAgKi8KIAotLyogQ29tbWVudHMgY29tZXMgZnJvbSBSRkMxMjU2IElDTVAgUm91dGVyIERpc2NvdmVyeSBNZXNzYWdlcy4gKi8KLXN0cnVjdCBpcmRwX3JvdXRlcl9pbnRlcmZhY2UgCi17Ci0gIC8qIFRoZSBJUCBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIG11bHRpY2FzdCBSb3V0ZXIKKy8qIERlZmF1bHQgaXJkcCBwYWNrZXQgaW50ZXJ2YWwgKi8KKyNkZWZpbmUgSVJEUF9ERUZBVUxUX0lOVEVSVkFMIDMwMCAKKworLyogUm91dGVyIGNvbnN0YW50cyBmcm9tIFJGQzEyNTYgKi8KKyNkZWZpbmUgTUFYX0lOSVRJQUxfQURWRVJUX0lOVEVSVkFMIDE2CisjZGVmaW5lIE1BWF9JTklUSUFMX0FEVkVSVElTRU1FTlRTICAgMworI2RlZmluZSBNQVhfUkVTUE9OU0VfREVMQVkgICAgICAgICAgIDIKKworI2RlZmluZSBJUkRQX01BWEFEVkVSVElOVEVSVkFMIDYwMAorI2RlZmluZSBJUkRQX01JTkFEVkVSVElOVEVSVkFMIDQ1MCAvKiAwLjc1KjYwMCAqLworI2RlZmluZSBJUkRQX0xJRkVUSU1FICAgICAgICAgMTM1MCAvKiAzKjQ1MCAqLworI2RlZmluZSBJUkRQX1BSRUZFUkVOQ0UgMAorCisjZGVmaW5lIElDTVBfTUlOTEVOIDgKKworI2RlZmluZSBJUkRQX0xBU1RfQURWRVJUX01FU1NBR0VTIDIgLyogVGhlIGxhc3QgYWR2ZXJ0cyB3aXRoIEhvbGR0aW1lIDAgKi8KKworI2RlZmluZSBJUkRQX1JYX0JVRiAxNTAwCisKKy8qIAorICAgICBDb21tZW50cyBjb21lcyBmcm9tIFJGQzEyNTYgSUNNUCBSb3V0ZXIgRGlzY292ZXJ5IE1lc3NhZ2VzLiAKKworICAgICBUaGUgSVAgZGVzdGluYXRpb24gYWRkcmVzcyB0byBiZSB1c2VkIGZvciBtdWx0aWNhc3QgUm91dGVyCiAgICAgIEFkdmVydGlzZW1lbnRzIHNlbnQgZnJvbSB0aGUgaW50ZXJmYWNlLiAgVGhlIG9ubHkgcGVybWlzc2libGUKICAgICAgdmFsdWVzIGFyZSB0aGUgYWxsLXN5c3RlbXMgbXVsdGljYXN0IGFkZHJlc3MsIDIyNC4wLjAuMSwgb3IgdGhlCiAgICAgIGxpbWl0ZWQtYnJvYWRjYXN0IGFkZHJlc3MsIDI1NS4yNTUuMjU1LjI1NS4gIChUaGUgYWxsLXN5c3RlbXMKQEAgLTQ4LDEwMSArODAsNzQgQEAKICAgICAgYWxsIGxpc3RlbmluZyBob3N0cyBzdXBwb3J0IElQIG11bHRpY2FzdC4pCiAKICAgICAgRGVmYXVsdDogMjI0LjAuMC4xIGlmIHRoZSByb3V0ZXIgc3VwcG9ydHMgSVAgbXVsdGljYXN0IG9uIHRoZQotICAgICBpbnRlcmZhY2UsIGVsc2UgMjU1LjI1NS4yNTUuMjU1ICovCisgICAgIGludGVyZmFjZSwgZWxzZSAyNTUuMjU1LjI1NS4yNTUgCiAKLSAgc3RydWN0IGluX2FkZHIgQWR2ZXJ0aXNlbWVudEFkZHJlc3M7Ci0KLSAgLyogVGhlIG1heGltdW0gdGltZSBhbGxvd2VkIGJldHdlZW4gc2VuZGluZyBtdWx0aWNhc3QgUm91dGVyCisgICAgIFRoZSBtYXhpbXVtIHRpbWUgYWxsb3dlZCBiZXR3ZWVuIHNlbmRpbmcgbXVsdGljYXN0IFJvdXRlcgogICAgICBBZHZlcnRpc2VtZW50cyBmcm9tIHRoZSBpbnRlcmZhY2UsIGluIHNlY29uZHMuICBNdXN0IGJlIG5vIGxlc3MKICAgICAgdGhhbiA0IHNlY29uZHMgYW5kIG5vIGdyZWF0ZXIgdGhhbiAxODAwIHNlY29uZHMuCiAKLSAgICAgRGVmYXVsdDogNjAwIHNlY29uZHMgKi8KKyAgICAgRGVmYXVsdDogNjAwIHNlY29uZHMgCiAKLSAgdW5zaWduZWQgbG9uZyBNYXhBZHZlcnRpc2VtZW50SW50ZXJ2YWw7Ci0KLSAgLyogVGhlIG1pbmltdW0gdGltZSBhbGxvd2VkIGJldHdlZW4gc2VuZGluZyB1bnNvbGljaXRlZCBtdWx0aWNhc3QKKyAgICAgVGhlIG1pbmltdW0gdGltZSBhbGxvd2VkIGJldHdlZW4gc2VuZGluZyB1bnNvbGljaXRlZCBtdWx0aWNhc3QKICAgICAgUm91dGVyIEFkdmVydGlzZW1lbnRzIGZyb20gdGhlIGludGVyZmFjZSwgaW4gc2Vjb25kcy4gIE11c3QgYmUgbm8KICAgICAgbGVzcyB0aGFuIDMgc2Vjb25kcyBhbmQgbm8gZ3JlYXRlciB0aGFuIE1heEFkdmVydGlzZW1lbnRJbnRlcnZhbC4KIAotICAgICBEZWZhdWx0OiAwLjc1ICogTWF4QWR2ZXJ0aXNlbWVudEludGVydmFsICovCisgICAgIERlZmF1bHQ6IDAuNzUgKiBNYXhBZHZlcnRpc2VtZW50SW50ZXJ2YWwgCiAKLSAgdW5zaWduZWQgbG9uZyBNaW5BZHZlcnRpc2VtZW50SW50ZXJ2YWw7Ci0KLQotICAvKiBUaGUgdmFsdWUgdG8gYmUgcGxhY2VkIGluIHRoZSBMaWZldGltZSBmaWVsZCBvZiBSb3V0ZXIKKyAgICAgVGhlIHZhbHVlIHRvIGJlIHBsYWNlZCBpbiB0aGUgTGlmZXRpbWUgZmllbGQgb2YgUm91dGVyCiAgICAgIEFkdmVydGlzZW1lbnRzIHNlbnQgZnJvbSB0aGUgaW50ZXJmYWNlLCBpbiBzZWNvbmRzLiAgTXVzdCBiZSBubwogICAgICBsZXNzIHRoYW4gTWF4QWR2ZXJ0aXNlbWVudEludGVydmFsIGFuZCBubyBncmVhdGVyIHRoYW4gOTAwMAogICAgICBzZWNvbmRzLgogCi0gICAgIERlZmF1bHQ6IDMgKiBNYXhBZHZlcnRpc2VtZW50SW50ZXJ2YWwgKi8KKyAgICAgRGVmYXVsdDogMyAqIE1heEFkdmVydGlzZW1lbnRJbnRlcnZhbCAKIAotICB1bnNpZ25lZCBsb25nIEFkdmVydGlzZW1lbnRMaWZldGltZTsKLQotICAvKiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgYWRkcmVzcyBpcyB0byBiZSBhZHZlcnRpc2VkLgotCi0gICAgIERlZmF1bHQ6IFRSVUUgKi8KLQotICBpbnQgQWR2ZXJ0aXNlOwotCi0KLSAgLyogVGhlIHByZWZlcmFiaWxpdHkgb2YgdGhlIGFkZHJlc3MgYXMgYSBkZWZhdWx0IHJvdXRlciBhZGRyZXNzLAorICAgICBUaGUgcHJlZmVyYWJpbGl0eSBvZiB0aGUgYWRkcmVzcyBhcyBhIGRlZmF1bHQgcm91dGVyIGFkZHJlc3MsCiAgICAgIHJlbGF0aXZlIHRvIG90aGVyIHJvdXRlciBhZGRyZXNzZXMgb24gdGhlIHNhbWUgc3VibmV0LiAgQSAzMi1iaXQsCiAgICAgIHNpZ25lZCwgdHdvcy1jb21wbGVtZW50IGludGVnZXIsIHdpdGggaGlnaGVyIHZhbHVlcyBtZWFuaW5nIG1vcmUKICAgICAgcHJlZmVyYWJsZS4gIFRoZSBtaW5pbXVtIHZhbHVlIChoZXggODAwMDAwMDApIGlzIHVzZWQgdG8gaW5kaWNhdGUKICAgICAgdGhhdCB0aGUgYWRkcmVzcywgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGFkdmVydGlzZWQsIGlzIG5vdCB0byBiZQogICAgICB1c2VkIGJ5IG5laWdoYm9yaW5nIGhvc3RzIGFzIGEgZGVmYXVsdCByb3V0ZXIgYWRkcmVzcy4KIAotICAgICBEZWZhdWx0OiAwICovCisgICAgIERlZmF1bHQ6IDAgCisqLwogCi0gIHVuc2lnbmVkIGxvbmcgUHJlZmVyZW5jZUxldmVsOwotfTsKLQotc3RydWN0IGlyZHBfaG9zdF9pbnRlcmZhY2UgCitzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgCiB7Ci0gIC8qIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBob3N0IGlzIHRvIHBlcmZvcm0gSUNNUCByb3V0ZXIKLSAgICAgZGlzY292ZXJ5IG9uIHRoZSBpbnRlcmZhY2UuICovCi0gIGludCBQZXJmb3JtUm91ZXJEaXNjb3Zlcnk7Ci0gIAotICAvKiBUaGUgSVAgZGVzdGluYXRpb24gYWRkcmVzcyB0byBiZSB1c2VkIGZvciBzZW5kaW5nIFJvdXRlcgotICAgICBTb2xpY2l0YXRpb25zIGZyb20gdGhlIGludGVyZmFjZS4gIFRoZSBvbmx5IHBlcm1pc3NpYmxlIHZhbHVlcwotICAgICBhcmUgdGhlIGFsbC1yb3V0ZXJzIG11bHRpY2FzdCBhZGRyZXNzLCAyMjQuMC4wLjIsIG9yIHRoZQotICAgICBsaW1pdGVkLWJyb2FkY2FzdCBhZGRyZXNzLCAyNTUuMjU1LjI1NS4yNTUuICAoVGhlIGFsbC1yb3V0ZXJzCi0gICAgIGFkZHJlc3MgaXMgcHJlZmVycmVkIHdoZXJldmVyIHBvc3NpYmxlLCBpLmUuLCBvbiBhbnkgbGluayB3aGVyZQotICAgICBhbGwgYWR2ZXJ0aXNpbmcgcm91dGVycyBzdXBwb3J0IElQIG11bHRpY2FzdC4pICAqLwotICB1bnNpZ25lZCBsb25nIFNvbGljaXRhdGlvbkFkZHJlc3M7CisgIHVuc2lnbmVkIGxvbmcgTWF4QWR2ZXJ0SW50ZXJ2YWw7CisgIHVuc2lnbmVkIGxvbmcgTWluQWR2ZXJ0SW50ZXJ2YWw7CisgIHVuc2lnbmVkIGxvbmcgUHJlZmVyZW5jZTsKKworICB1X2ludDMyX3QgZmxhZ3M7CisKKyNkZWZpbmUgSUZfQUNUSVZFICAgICAgICAgICAgICAgKDE8PDApIC8qIElDTVAgQWN0aXZlICovCisjZGVmaW5lIElGX0JST0FEQ0FTVCAgICAgICAgICAgICgxPDwxKSAvKiAyNTUuMjU1LjI1NS4yNTUgKi8KKyNkZWZpbmUgSUZfU09MSUNJVCAgICAgICAgICAgICAgKDE8PDIpIC8qIFNvbGljaXQgYWN0aXZlICovCisjZGVmaW5lIElGX0RFQlVHX01FU1NBR0VTICAgICAgICgxPDwzKSAKKyNkZWZpbmUgSUZfREVCVUdfUEFDS0VUICAgICAgICAgKDE8PDQpIAorI2RlZmluZSBJRl9ERUJVR19NSVNDICAgICAgICAgICAoMTw8NSkgCisjZGVmaW5lIElGX1NIVVRET1dOICAgICAgICAgICAgICgxPDw2KSAKKworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB0aHJlYWQgKnRfYWR2ZXJ0aXNlOworICB1bnNpZ25lZCBsb25nIGlyZHBfc2VudDsKKyAgdV9pbnQxNl90IExpZmV0aW1lOworCisgbGlzdCBBZHZQcmVmTGlzdDsKKwogfTsKIAotCi0vKiBSb3V0ZSBwcmVmZXJlbmNlIHN0cnVjdHVyZSAqLwotc3RydWN0IGlyZHAgCitzdHJ1Y3QgQWR2IAogewotICBzdHJ1Y3QgaW5fYWRkciBwcmVmaXg7Ci0gIGxvbmcgcHJlZjsJCS8qIHByZWZlcmVuY2UgbGV2ZWwgKi8KLSAgbG9uZyB0aW1lcjsJCQkvKiBsaWZldGltZSB0aW1lciAqLwotCi0gIHN0cnVjdCBpcmRwICpuZXh0OwkJLyogZG91Ymx5IGxpbmtlZCBsaXN0ICovCi0gIHN0cnVjdCBpcmRwICpwcmV2OwkJLyogZG91Ymx5IGxpbmtlZCBsaXN0ICovCisgIHN0cnVjdCBpbl9hZGRyIGlwOworICBpbnQgcHJlZjsKIH07CiAKLS8qIERlZmF1bHQgaXJkcCBwYWNrZXQgaW50ZXJ2YWwgKi8KLSNkZWZpbmUgSVJEUF9ERUZBVUxUX0lOVEVSVkFMIDMwMAordm9pZCBpcmRwX2luaXQoKTsKK3ZvaWQgaXJkcF9maW5pc2goKTsKK3ZvaWQgaXJkcF9jb25maWdfd3JpdGUgKHN0cnVjdCB2dHkgKiwgc3RydWN0IGludGVyZmFjZSAqKTsKKyNlbmRpZiAvKiBfSVJEUF9IICovCiAKLS8qIFJvdXRlciBjb25zdGFudHMgZnJvbSBSRkMxMjU2ICovCi0jZGVmaW5lIE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTCAxNgotI2RlZmluZSBNQVhfSU5JVElBTF9BRFZFUlRJU0VNRU5UUyAgIDMKLSNkZWZpbmUgTUFYX1JFU1BPTlNFX0RFTEFZICAgICAgICAgICAyCiAKLS8qIEhvc3QgY29uc3RhbnRzIGZyb20gUkZDMTI1NiAqLwotI2RlZmluZSBNQVhfU09MSUNJVEFUSU9OX0RFTEFZICAgICAgIDEKLSNkZWZpbmUgU09MSUNJVEFUSU9OX0lOVEVSVkFMICAgICAgICAzCi0jZGVmaW5lIE1BWF9TT0xJQ0lUQVRJT05TICAgICAgICAgICAgMwogCi1lbnVtCi17Ci0gIElSRFBfTk9ORSwKLSAgSVJEUF9ST1VURVIsCi0gIElSRFBfSE9TVCwKLX07CiAKLS8qIGRlZmF1bHQgaXMgaG9zdCBtb2RlICovCi1leHRlcm4gaW50IGlyZHBfbW9kZTsKKwpkaWZmIC0tZ2l0IGEvemVicmEvaXJkcF9pbnRlcmZhY2UuYyBiL3plYnJhL2lyZHBfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1YWQwZQotLS0gL2Rldi9udWxsCisrKyBiL3plYnJhL2lyZHBfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSw3ODQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgorICogU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLiAgCisgKi8KKworLyogCisgKiBUaGlzIHdvcmsgaW5jbHVkZXMgd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgY29weXdyaXRlOgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqLworCisvKiAKKyAqIFRoYW5rcyB0byBKZW5zIEzl5XMgYXQgU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCisgKi8KKworCisjaW5jbHVkZSA8emVicmEuaD4KKworI2lmZGVmIEhBVkVfSVJEUCAKKworI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAidnR5LmgiCisjaW5jbHVkZSAic29ja3VuaW9uLmgiCisjaW5jbHVkZSAicHJlZml4LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgInN0cmVhbS5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAiY29ubmVjdGVkLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAiemNsaWVudC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInplYnJhL2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCisjaW5jbHVkZSAiemVicmEvcmliLmgiCisjaW5jbHVkZSAiemVicmEvenNlcnYuaCIKKyNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKKyNpbmNsdWRlICJ6ZWJyYS9pcmRwLmgiCisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaW5jbHVkZSAiaWYuaCIKKyNpbmNsdWRlICJzb2NrdW5pb24uaCIKKyNpbmNsdWRlICJsb2cuaCIKKworCisvKiBNYXN0ZXIgb2YgdGhyZWFkcy4gKi8KK2V4dGVybiBzdHJ1Y3QgemVicmFfdCB6ZWJyYWQ7CisKK2ludCBpbl9ja3N1bSAodm9pZCAqcHRyLCBpbnQgbmJ5dGVzKTsKK2V4dGVybiBpbnQgaXJkcF9zb2NrOworaW50IGlyZHBfc2VuZF90aHJlYWQoc3RydWN0IHRocmVhZCAqdF9hZHZlcnQpOworY2hhciAqaW5ldF8yYSh1X2ludDMyX3QgYSwgY2hhciAqYik7Cit2b2lkIGlyZHBfYWR2ZXJ0X29mZihzdHJ1Y3QgaW50ZXJmYWNlICppZnApOworCisKK2NoYXIgYjFbMTZdLCBiMlsxNl0sIGIzWzE2XSwgYjRbMTZdOyAgLyogRm9yIGluZXRfMmEgKi8KKworc3RydWN0IHByZWZpeCAqaXJkcF9nZXRfcHJlZml4KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgbGlzdG5vZGUgbm9kZTsKKyAgc3RydWN0IGNvbm5lY3RlZCAqaWZjOworICAKKyAgaWYoaWZwLT5jb25uZWN0ZWQpIAorICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpZnAtPmNvbm5lY3RlZCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworICAgICAgaWZjID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICByZXR1cm4gaWZjLT5hZGRyZXNzOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEpvaW4gdG8gdGhlIGFkZC9sZWF2ZSBtdWx0aWNhc3QgZ3JvdXAuICovCitpbnQgaWZfZ3JvdXAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCisJICBpbnQgc29jaywgCisJICB1X2ludDMyX3QgZ3JvdXAsIAorCSAgaW50IGFkZF9sZWF2ZSkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlwX21yZXEgbTsKKyAgc3RydWN0IHByZWZpeCAqcDsKKyAgaW50IHJldDsKKworICB6aSA9IGlmcC0+aW5mbzsKKworICBiemVybyAoJm0sIHNpemVvZiAobSkpOworICBtLmltcl9tdWx0aWFkZHIuc19hZGRyID0gaHRvbmwgKGdyb3VwKTsKKyAgcCA9IGlyZHBfZ2V0X3ByZWZpeChpZnApOworCisgIGlmKCFwKSB7CisgICAgICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGdldCBhZGRyZXNzIGZvciAlcyIsIGlmcC0+bmFtZSk7CisJcmV0dXJuIDE7CisgIH0KKworICBtLmltcl9pbnRlcmZhY2UgPSBwLT51LnByZWZpeDQ7CisKKyAgcmV0ID0gc2V0c29ja29wdCAoc29jaywgSVBQUk9UT19JUCwgYWRkX2xlYXZlLAorCQkgICAgKGNoYXIgKikgJm0sIHNpemVvZiAoc3RydWN0IGlwX21yZXEpKTsKKyAgaWYgKHJldCA8IDApCisgICAgemxvZ193YXJuICgiSVJEUDogJXMgY2FuJ3Qgc2V0c29ja29wdCAlczogJXMiLAorCSAgICAgICBhZGRfbGVhdmUgPT0gSVBfQUREX01FTUJFUlNISVA/ICJqb2luIGdyb3VwIjoibGVhdmUgZ3JvdXAiLCAKKyAgICAgICAgICAgICAgIGluZXRfMmEoZ3JvdXAsIGIxKSwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworCisgIHJldHVybiByZXQ7Cit9CisKK2ludCBpZl9hZGRfZ3JvdXAgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT0gaWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAgPSAmemktPmlyZHA7CisgIGludCByZXQ7CisKKyAgcmV0ID0gaWZfZ3JvdXAgKGlmcCwgaXJkcF9zb2NrLCBJTkFERFJfQUxMUlRSU19HUk9VUCwgSVBfQUREX01FTUJFUlNISVApOworICBpZiAocmV0IDwgMCkgeworICAgIHJldHVybiByZXQ7CisgIH0KKworICBpZihpcmRwLT5mbGFncyAmIElGX0RFQlVHX01JU0MgKQorICAgIHpsb2dfd2FybigiSVJEUDogQWRkaW5nIGdyb3VwICVzIGZvciAlc1xuIiwgCisJICAgICAgaW5ldF8yYShodG9ubChJTkFERFJfQUxMUlRSU19HUk9VUCksIGIxKSwKKwkgICAgICBpZnAtPm5hbWUpOworICByZXR1cm4gMDsKK30KK2ludCBpZl9kcm9wX2dyb3VwIChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9IGlmcC0+aW5mbzsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOworICBpbnQgcmV0OworCisgIHJldCA9IGlmX2dyb3VwIChpZnAsIGlyZHBfc29jaywgSU5BRERSX0FMTFJUUlNfR1JPVVAsIElQX0RST1BfTUVNQkVSU0hJUCk7CisgIGlmIChyZXQgPCAwKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQorICAgIHpsb2dfd2FybigiSVJEUDogTGVhdmluZyBncm91cCAlcyBmb3IgJXNcbiIsIAorCSAgICAgIGluZXRfMmEoaHRvbmwoSU5BRERSX0FMTFJUUlNfR1JPVVApLCBiMSksCisJICAgICAgaWZwLT5uYW1lKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbnRlcmZhY2UgKmdldF9pZmxpc3RfaWZwKGludCBpZHgpCit7CisgIGxpc3Rub2RlIG5vZGU7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZsaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7CisgICAgICBpZnAgPSBnZXRkYXRhIChub2RlKTsKKyAgICAgIGlmKGlmcC0+aWZpbmRleCA9PSBpZHgpIHJldHVybiBpZnA7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZAoraWZfc2V0X2RlZmF1bHRzKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisKKyAgaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwgPSBJUkRQX01BWEFEVkVSVElOVEVSVkFMOworICBpcmRwLT5NaW5BZHZlcnRJbnRlcnZhbCA9IElSRFBfTUlOQURWRVJUSU5URVJWQUw7CisgIGlyZHAtPlByZWZlcmVuY2UgPSBJUkRQX1BSRUZFUkVOQ0U7CisgIGlyZHAtPkxpZmV0aW1lID0gSVJEUF9MSUZFVElNRTsKK30KKworCitzdHJ1Y3QgQWR2ICpBZHZfbmV3ICgpCit7CisgIHN0cnVjdCBBZHYgKm5ldzsKKyAgbmV3ID0gWE1BTExPQyAoTVRZUEVfVE1QLCBzaXplb2YgKHN0cnVjdCBBZHYpKTsKKyAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAoc3RydWN0IEFkdikpOworICByZXR1cm4gbmV3OworfQorCit2b2lkIEFkdl9mcmVlIChzdHJ1Y3QgQWR2ICphZHYpCit7CisgIFhGUkVFIChNVFlQRV9UTVAsIGFkdik7Cit9CisKK3ZvaWQgaXJkcF9pZl9zdGFydChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIGludCBtdWx0aWNhc3QsIGludCBzZXRfZGVmYXVsdHMpCit7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9IGlmcC0+aW5mbzsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwID0gJnppLT5pcmRwOworICBsaXN0bm9kZSBub2RlOworICB1X2ludDMyX3QgdGltZXIsIHNlZWQ7CisKKyAgaWYgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFICkgeworICAgIHpsb2dfd2FybigiSVJEUDogSW50ZXJmYWNlIGlzIGFscmVhZHkgYWN0aXZlICVzXG4iLCBpZnAtPm5hbWUpOworICAgIHJldHVybjsKKyAgfQorICBpcmRwLT5mbGFncyB8PSBJRl9BQ1RJVkU7CisKKyAgaWYoIW11bHRpY2FzdCkgCisgICAgaXJkcC0+ZmxhZ3MgfD0gSUZfQlJPQURDQVNUOworCisgIGlmX2FkZF91cGRhdGUoaWZwKTsKKworICBpZiAoISAoaWZwLT5mbGFncyAmIElGRl9VUCkpIHsKKyAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBkb3duICVzXG4iLCBpZnAtPm5hbWUpOworICB9CisKKyAgLyogU2hhbGwgd2UgY2FuY2VsIGlmX3N0YXJ0IGlmIGlmX2FkZF9ncm91cCBmYWlscz8gKi8KKworICBpZiggbXVsdGljYXN0KSB7CisgICAgaWZfYWRkX2dyb3VwKGlmcCk7CisgICAgCisgICAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiAoSUZGX01VTFRJQ0FTVHxJRkZfQUxMTVVMVEkpKSkgeworICAgICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2Ugbm90IG11bHRpY2FzdCBlbmFibGVkICVzXG4iLCBpZnAtPm5hbWUpOworICAgIH0KKyAgfQorCisgIGlmKHNldF9kZWZhdWx0cykgCisgICAgaWZfc2V0X2RlZmF1bHRzKGlmcCk7CisKKyAgaXJkcC0+aXJkcF9zZW50ID0gMDsKKworICAvKiBUaGUgc3BlYyBzdWdnZXN0cyB0aGlzIGZvciByYW5kb21uZXNzICovCisKKyAgc2VlZCA9IDA7CisgIGlmKCBpZnAtPmNvbm5lY3RlZCkgCisJICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIAorCSAgeworCQkgIHN0cnVjdCBjb25uZWN0ZWQgKmlmYyA9IGdldGRhdGEgKG5vZGUpOworCQkgIHNlZWQgPSBpZmMtPmFkZHJlc3MtPnUucHJlZml4NC5zX2FkZHI7CisJICB9CisgIAorICBzcmFuZG9tKHNlZWQpOworICB0aW1lciA9ICAocmFuZG9tICgpICUgSVJEUF9ERUZBVUxUX0lOVEVSVkFMKSArIDE7IAorCisgIGlyZHAtPkFkdlByZWZMaXN0ID0gbGlzdF9uZXcoKTsKKyAgaXJkcC0+QWR2UHJlZkxpc3QtPmRlbCA9ICAodm9pZCAqKSBBZHZfZnJlZTsgLyogRGVzdHJ1Y3RvciAqLworCisKKyAgLyogQW5kIHRoaXMgZm9yIHN0YXJ0dXAuIFNwZWVkIGxpbWl0IGZyb20gMTk5MSA6LSkuIEJ1dCBpdCdzIE9LKi8KKworICBpZihpcmRwLT5pcmRwX3NlbnQgPCBNQVhfSU5JVElBTF9BRFZFUlRJU0VNRU5UUyAmJgorICAgICB0aW1lciA+IE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTCApIAorCSAgdGltZXI9IE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTDsKKworICAKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQorICAgIHpsb2dfd2FybigiSVJEUDogSW5pdCB0aW1lciBmb3IgJXMgc2V0IHRvICV1XG4iLCAKKwkgICAgICBpZnAtPm5hbWUsIAorCSAgICAgIHRpbWVyKTsKKworICBpcmRwLT50X2FkdmVydGlzZSA9IHRocmVhZF9hZGRfdGltZXIoemVicmFkLm1hc3RlciwgCisJCQkJICAgICAgIGlyZHBfc2VuZF90aHJlYWQsIAorCQkJCSAgICAgICBpZnAsIAorCQkJCSAgICAgICB0aW1lcik7Cit9CisKK3ZvaWQgaXJkcF9pZl9zdG9wKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIAorICBpZiAoaXJkcCA9PSBOVUxMKSB7CisgICAgemxvZ193YXJuICgiSW50ZXJmYWNlICVzIHN0cnVjdHVyZSBpcyBOVUxMIiwgaWZwLT5uYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoISAoaXJkcC0+ZmxhZ3MgJiBJRl9BQ1RJVkUgKSkgeworICAgIHpsb2dfd2FybigiSW50ZXJmYWNlIGlzIG5vdCBhY3RpdmUgJXNcbiIsIGlmcC0+bmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoISAoaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1QpKSAKKyAgICBpZl9kcm9wX2dyb3VwKGlmcCk7CisKKyAgaXJkcF9hZHZlcnRfb2ZmKGlmcCk7CisKKyAgbGlzdF9kZWxldGUoaXJkcC0+QWR2UHJlZkxpc3QpOworICBpcmRwLT5BZHZQcmVmTGlzdD1OVUxMOworCisgIGlyZHAtPmZsYWdzID0gMDsKK30KKworCit2b2lkIGlyZHBfaWZfc2h1dGRvd24oc3RydWN0IGludGVyZmFjZSAqaWZwKQoreworICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKKworICBpZiAoaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTiApIHsKKyAgICB6bG9nX3dhcm4oIklSRFA6IEludGVyZmFjZSBpcyBhbHJlYWR5IHNodXRkb3duICVzXG4iLCBpZnAtPm5hbWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlyZHAtPmZsYWdzIHw9IElGX1NIVVRET1dOOworICBpcmRwLT5mbGFncyAmPSB+SUZfQUNUSVZFOworCisgIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSkgCisgICAgaWZfZHJvcF9ncm91cChpZnApOworICAKKyAgLyogVGVsbCB0aGUgaG9zdHMgd2UgYXJlIG91dCBvZiBzZXJ2aWNlICovCisgIGlyZHBfYWR2ZXJ0X29mZihpZnApOworfQorCit2b2lkIGlyZHBfaWZfbm9fc2h1dGRvd24oc3RydWN0IGludGVyZmFjZSAqaWZwKQoreworICBzdHJ1Y3QgemVicmFfaWYgKnppPSBpZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCA9ICZ6aS0+aXJkcDsKKworICBpZiAoISAoaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTiApKSB7CisgICAgemxvZ193YXJuKCJJUkRQOiBJbnRlcmZhY2UgaXMgbm90IHNodXRkb3duICVzXG4iLCBpZnAtPm5hbWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlyZHAtPmZsYWdzICY9IH5JRl9TSFVURE9XTjsKKworICBpcmRwX2lmX3N0YXJ0KGlmcCwgaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1Q/IEZBTFNFIDogVFJVRSwgRkFMU0UpOyAKKworfQorCisKKy8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gdG8gdXNlciAqLworCit2b2lkIGlyZHBfY29uZmlnX3dyaXRlIChzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIHN0cnVjdCBBZHYgKmFkdjsKKyAgbGlzdG5vZGUgbm9kZTsKKworICBpZihpcmRwLT5mbGFncyAmIElGX0FDVElWRSB8fCBpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOKSB7CisKKyAgICBpZiggaXJkcC0+ZmxhZ3MgJiBJRl9TSFVURE9XTikgCisgICAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBzaHV0ZG93biAlcyIsICBWVFlfTkVXTElORSk7CisKKyAgICBpZiggaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1QpIAorICAgICAgdnR5X291dCAodnR5LCAiIGlwIGlyZHAgYnJvYWRjYXN0JXMiLCAgVlRZX05FV0xJTkUpOworICAgIGVsc2UgCisgICAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBtdWx0aWNhc3QlcyIsICBWVFlfTkVXTElORSk7CisKKyAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBwcmVmZXJlbmNlICVsZCVzIiwgIAorCSAgICAgaXJkcC0+UHJlZmVyZW5jZSwgVlRZX05FV0xJTkUpOworCisgICAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlyZHAtPkFkdlByZWZMaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7CisJICAgIGFkdiA9IGdldGRhdGEgKG5vZGUpOworCSAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBhZGRyZXNzICVzIHByZWZlcmVuY2UgJWQlcyIsCisJCSAgICAgaW5ldF8yYShhZHYtPmlwLnNfYWRkciwgYjEpLAorCQkgICAgIGFkdi0+cHJlZiwKKwkJICAgICBWVFlfTkVXTElORSk7CisKKyAgICB9CisKKyAgICB2dHlfb3V0ICh2dHksICIgaXAgaXJkcCBob2xkdGltZSAlZCVzIiwgIAorCSAgICAgaXJkcC0+TGlmZXRpbWUsIFZUWV9ORVdMSU5FKTsKKworICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIG1pbmFkdmVydGludGVydmFsICVsZCVzIiwgIAorCSAgICAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKKworICAgIHZ0eV9vdXQgKHZ0eSwgIiBpcCBpcmRwIG1heGFkdmVydGludGVydmFsICVsZCVzIiwgIAorCSAgICAgaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKKworICB9Cit9CisKKworREVGVU4gKGlwX2lyZHBfbXVsdGljYXN0LAorICAgICAgIGlwX2lyZHBfbXVsdGljYXN0X2NtZCwKKyAgICAgICAiaXAgaXJkcCBtdWx0aWNhc3QiLAorICAgICAgIElQX1NUUgorICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3Zlcnkgb24gdGhpcyBpbnRlcmZhY2UgdXNpbmcgbXVsdGljYXN0XG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgaXJkcF9pZl9zdGFydChpZnAsIFRSVUUsIFRSVUUpOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX2Jyb2FkY2FzdCwKKyAgICAgICBpcF9pcmRwX2Jyb2FkY2FzdF9jbWQsCisgICAgICAgImlwIGlyZHAgYnJvYWRjYXN0IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlIHVzaW5nIGJyb2FkY2FzdFxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIGlyZHBfaWZfc3RhcnQoaWZwLCBGQUxTRSwgVFJVRSk7CisgIHJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4gKGlwX2lyZHBfbm8sCisgICAgICAgaXBfaXJkcF9jbWRfbm8sCisgICAgICAgIm5vIGlwIGlyZHAiLAorICAgICAgIElQX1NUUgorICAgICAgICJEaXNhYmxlIElDTVAgUm91dGVyIGRpc2NvdmVyeSBvbiB0aGlzIGludGVyZmFjZVxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIGlyZHBfaWZfc3RvcChpZnApOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX3NodXRkb3duLAorICAgICAgIGlwX2lyZHBfc2h1dGRvd25fY21kLAorICAgICAgICJpcCBpcmRwIHNodXRkb3duIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IHNodXRkb3duIG9uIHRoaXMgaW50ZXJmYWNlXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgaXJkcF9pZl9zaHV0ZG93bihpZnApOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX25vX3NodXRkb3duLAorICAgICAgIGlwX2lyZHBfbm9fc2h1dGRvd25fY21kLAorICAgICAgICJubyBpcCBpcmRwIHNodXRkb3duIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG5vIHNodXRkb3duIG9uIHRoaXMgaW50ZXJmYWNlXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgaXJkcF9pZl9ub19zaHV0ZG93bihpZnApOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX2hvbGR0aW1lLAorICAgICAgIGlwX2lyZHBfaG9sZHRpbWVfY21kLAorICAgICAgICJpcCBpcmRwIGhvbGR0aW1lIDwwLTkwMDA+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCisgICAgICAgIlNldCBob2xkdGltZSB2YWx1ZVxuIgorICAgICAgICJIb2xkdGltZSB2YWx1ZSBpbiBzZWNvbmRzLiBEZWZhdWx0IGlzIDE4MDAgc2Vjb25kc1xuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgaXJkcC0+TGlmZXRpbWUgPSBhdG9pKGFyZ3ZbMF0pOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX21pbmFkdmVydGludGVydmFsLAorICAgICAgIGlwX2lyZHBfbWluYWR2ZXJ0aW50ZXJ2YWxfY21kLAorICAgICAgICJpcCBpcmRwIG1pbmFkdmVydGludGVydmFsIDwzLTE4MDA+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCisgICAgICAgIlNldCBtaW5pbXVtIHRpbWUgYmV0d2VlbiBhZHZlcnRpc2VtZW50XG4iCisgICAgICAgIk1pbmltdW0gYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworICBpZiggYXRvaShhcmd2WzBdKSA8PSBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbCkgeworICAgICAgaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgPSBhdG9pKGFyZ3ZbMF0pOworCisgICAgICByZXR1cm4gQ01EX1NVQ0NFU1M7CisgIH0KKworICB2dHlfb3V0ICh2dHksICJJQ01QIHdhcm5pbmcgbWF4YWR2ZXJ0aW50ZXJ2YWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIG1pbmFkdmVydGludGVydmFsJXMiLCAKKwkgICAgIFZUWV9ORVdMSU5FKTsKKworICB2dHlfb3V0ICh2dHksICJQbGVhc2UgY29ycmVjdCElcyIsIAorCSAgICAgVlRZX05FV0xJTkUpOworICByZXR1cm4gQ01EX1dBUk5JTkc7Cit9CisKK0RFRlVOIChpcF9pcmRwX21heGFkdmVydGludGVydmFsLAorICAgICAgIGlwX2lyZHBfbWF4YWR2ZXJ0aW50ZXJ2YWxfY21kLAorICAgICAgICJpcCBpcmRwIG1heGFkdmVydGludGVydmFsIDw0LTE4MDA+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCisgICAgICAgIlNldCBtYXhpbXVtIHRpbWUgYmV0d2VlbiBhZHZlcnRpc2VtZW50XG4iCisgICAgICAgIk1heGltdW0gYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBpbiBzZWNvbmRzXG4iKQoreworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworCisgIGlmKCBpcmRwLT5NaW5BZHZlcnRJbnRlcnZhbCA8PSBhdG9pKGFyZ3ZbMF0pICkgeworICAgIGlyZHAtPk1heEFkdmVydEludGVydmFsID0gYXRvaShhcmd2WzBdKTsKKworICAgICAgcmV0dXJuIENNRF9TVUNDRVNTOworICB9CisKKyAgdnR5X291dCAodnR5LCAiSUNNUCB3YXJuaW5nIG1heGFkdmVydGludGVydmFsIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBtaW5hZHZlcnRpbnRlcnZhbCVzIiwgCisJICAgICBWVFlfTkVXTElORSk7CisKKyAgdnR5X291dCAodnR5LCAiUGxlYXNlIGNvcnJlY3QhJXMiLCAKKwkgICAgIFZUWV9ORVdMSU5FKTsKKyAgcmV0dXJuIENNRF9XQVJOSU5HOworfQorCitERUZVTiAoaXBfaXJkcF9wcmVmZXJlbmNlLAorICAgICAgIGlwX2lyZHBfcHJlZmVyZW5jZV9jbWQsCisKKyAgICAgICAvKiBERUZVTiBuZWVkcyB0byBiZSBmaXhlZCBmb3IgbmVnYXRpdmUgcmFuYWdlcy4uLgorCSAgQmUgcG9zaXRpdmUgZm9yIG5vdy4gOi0pCisKKwkgICJpcCBpcmRwIHByZWZlcmVuY2UgPC0yMTQ3NDgzNjQ4LTIxNDc0ODM2NDc+IiwKKwkqLworCisKKyAgICAgICAiaXAgaXJkcCBwcmVmZXJlbmNlIDwwLTIxNDc0ODM2NDc+IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IG9uIHRoaXMgaW50ZXJmYWNlXG4iCisgICAgICAgIlNldCBkZWZhdWx0IHByZWZlcmVuY2UgbGV2ZWwgZm9yIHRoaXMgaW50ZXJmYWNlXG4iCisgICAgICAgIlByZWZlcmVuY2UgbGV2ZWxcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPlByZWZlcmVuY2UgPSBhdG9pKGFyZ3ZbMF0pOworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZSwKKyAgICAgICBpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWQsCisgICAgICAgImlwIGlyZHAgYWRkcmVzcyBBLkIuQy5EIHByZWZlcmVuY2UgPDAtMjE0NzQ4MzY0Nz4iLAorICAgICAgIElQX1NUUgorICAgICAgICJBbHRlciBJQ01QIFJvdXRlciBkaXNjb3ZlcnkgcHJlZmVyZW5jZSB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJTcGVjaWZ5IElSRFAgbm9uLWRlZmF1bHQgcHJlZmVyZW5jZSB0byBhZHZlcnRpc2VcbiIKKyAgICAgICAiU2V0IElSRFAgYWRkcmVzcyBmb3IgYWR2ZXJ0aXNlXG4iCisgICAgICAgIlByZWZlcmVuY2UgbGV2ZWxcbiIpCit7CisgIGxpc3Rub2RlIG5vZGU7CisgIHN0cnVjdCBpbl9hZGRyIGlwOyAKKyAgaW50IHByZWY7CisgIGludCByZXQ7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBzdHJ1Y3QgQWR2ICphZHY7CisKKyAgaWZwID0gKHN0cnVjdCBpbnRlcmZhY2UgKikgdnR5LT5pbmRleDsKKyAgaWYoIWlmcCkgeworCSAgcmV0dXJuIENNRF9XQVJOSU5HOworICB9CisKKyAgemk9aWZwLT5pbmZvOworICBpcmRwPSZ6aS0+aXJkcDsKKworICByZXQgPSBpbmV0X2F0b24oYXJndlswXSwgJmlwKTsKKyAgaWYoIXJldCkgcmV0dXJuIENNRF9XQVJOSU5HOworCisgIHByZWYgPSBhdG9pKGFyZ3ZbMV0pOworCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcmRwLT5BZHZQcmVmTGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworCSAgYWR2ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgICBpZihhZHYtPmlwLnNfYWRkciA9PSBpcC5zX2FkZHIpIHJldHVybiBDTURfU1VDQ0VTUzsKKyAgfQorCisgIGFkdiA9IEFkdl9uZXcoKTsKKyAgYWR2LT5pcCA9IGlwOworICBhZHYtPnByZWYgPSBwcmVmOworICBsaXN0bm9kZV9hZGQoaXJkcC0+QWR2UHJlZkxpc3QsIGFkdik7CisKKyAgcmV0dXJuIENNRF9TVUNDRVNTOworCit9CisKK0RFRlVOIChpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9ubywKKyAgICAgICBpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWRfbm8sCisgICAgICAgIm5vIGlwIGlyZHAgYWRkcmVzcyBBLkIuQy5EIHByZWZlcmVuY2UgPDAtMjE0NzQ4MzY0Nz4iLAorICAgICAgIElQX1NUUgorICAgICAgICJBbHRlciBJQ01QIFJvdXRlciBkaXNjb3ZlcnkgcHJlZmVyZW5jZSB0aGlzIGludGVyZmFjZVxuIgorICAgICAgICJSZW1vdmVzIElSRFAgbm9uLWRlZmF1bHQgcHJlZmVyZW5jZVxuIgorICAgICAgICJTZWxlY3QgSVJEUCBhZGRyZXNzXG4iCisgICAgICAgIk9sZCBwcmVmZXJlbmNlIGxldmVsXG4iKQoreworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgaW5fYWRkciBpcDsgCisgIGludCBwcmVmOworICBpbnQgcmV0OworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnA7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk7CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKKyAgc3RydWN0IEFkdiAqYWR2OworCisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgcmV0ID0gaW5ldF9hdG9uKGFyZ3ZbMF0sICZpcCk7CisgIGlmKCFyZXQpIHJldHVybiBDTURfV0FSTklORzsKKworICBwcmVmID0gYXRvaShhcmd2WzFdKTsKKworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXJkcC0+QWR2UHJlZkxpc3QpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKKwkgIGFkdiA9IGdldGRhdGEgKG5vZGUpOworCSAgaWYoYWR2LT5pcC5zX2FkZHIgPT0gaXAuc19hZGRyICkgeworCQkgIGxpc3Rub2RlX2RlbGV0ZShpcmRwLT5BZHZQcmVmTGlzdCwgYWR2KTsKKwkJICBicmVhazsKKwkgIH0KKyAgfQorCisgIHJldHVybiBDTURfU1VDQ0VTUzsKKworCit9CisKK0RFRlVOIChpcF9pcmRwX2RlYnVnX21lc3NhZ2VzLAorICAgICAgIGlwX2lyZHBfZGVidWdfbWVzc2FnZXNfY21kLAorICAgICAgICJpcCBpcmRwIGRlYnVnIG1lc3NhZ2VzIiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IGRlYnVnIEF2ZXJ0cy4gYW5kIFNvbGljaXRzIChzaG9ydClcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX01FU1NBR0VTOworCisgIHJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4gKGlwX2lyZHBfZGVidWdfbWlzYywKKyAgICAgICBpcF9pcmRwX2RlYnVnX21pc2NfY21kLAorICAgICAgICJpcCBpcmRwIGRlYnVnIG1pc2MiLAorICAgICAgIElQX1NUUgorICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3ZlcnkgZGVidWcgQXZlcnRzLiBhbmQgU29saWNpdHMgKHNob3J0KVxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgaXJkcC0+ZmxhZ3MgfD0gSUZfREVCVUdfTUlTQzsKKworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOIChpcF9pcmRwX2RlYnVnX3BhY2tldCwKKyAgICAgICBpcF9pcmRwX2RlYnVnX3BhY2tldF9jbWQsCisgICAgICAgImlwIGlyZHAgZGVidWcgcGFja2V0IiwKKyAgICAgICBJUF9TVFIKKyAgICAgICAiSUNNUCBSb3V0ZXIgZGlzY292ZXJ5IGRlYnVnIEF2ZXJ0cy4gYW5kIFNvbGljaXRzIChzaG9ydClcbiIpCit7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworICBpZnAgPSAoc3RydWN0IGludGVyZmFjZSAqKSB2dHktPmluZGV4OworICBpZighaWZwKSB7CisJICByZXR1cm4gQ01EX1dBUk5JTkc7CisgIH0KKworICB6aT1pZnAtPmluZm87CisgIGlyZHA9JnppLT5pcmRwOworCisgIGlyZHAtPmZsYWdzIHw9IElGX0RFQlVHX1BBQ0tFVDsKKworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4gKGlwX2lyZHBfZGVidWdfZGlzYWJsZSwKKyAgICAgICBpcF9pcmRwX2RlYnVnX2Rpc2FibGVfY21kLAorICAgICAgICJpcCBpcmRwIGRlYnVnIGRpc2FibGUiLAorICAgICAgIElQX1NUUgorICAgICAgICJJQ01QIFJvdXRlciBkaXNjb3ZlcnkgZGVidWcgQXZlcnRzLiBhbmQgU29saWNpdHMgKHNob3J0KVxuIikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGlmcCA9IChzdHJ1Y3QgaW50ZXJmYWNlICopIHZ0eS0+aW5kZXg7CisgIGlmKCFpZnApIHsKKwkgIHJldHVybiBDTURfV0FSTklORzsKKyAgfQorCisgIHppPWlmcC0+aW5mbzsKKyAgaXJkcD0memktPmlyZHA7CisKKyAgaXJkcC0+ZmxhZ3MgJj0gfklGX0RFQlVHX1BBQ0tFVDsKKyAgaXJkcC0+ZmxhZ3MgJj0gfklGX0RFQlVHX01FU1NBR0VTOworICBpcmRwLT5mbGFncyAmPSB+SUZfREVCVUdfTUlTQzsKKworICByZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK2lyZHBfaWZfaW5pdCAoKQoreworICBpbnN0YWxsX2VsZW1lbnQgKElOVEVSRkFDRV9OT0RFLCAmaXBfaXJkcF9icm9hZGNhc3RfY21kKTsKKyAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfbXVsdGljYXN0X2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2NtZF9ubyk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX3NodXRkb3duX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX25vX3NodXRkb3duX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2hvbGR0aW1lX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX21heGFkdmVydGludGVydmFsX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX21pbmFkdmVydGludGVydmFsX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX3ByZWZlcmVuY2VfY21kKTsKKyAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfYWRkcmVzc19wcmVmZXJlbmNlX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2FkZHJlc3NfcHJlZmVyZW5jZV9jbWRfbm8pOworCisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX21lc3NhZ2VzX2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX21pc2NfY21kKTsKKyAgaW5zdGFsbF9lbGVtZW50IChJTlRFUkZBQ0VfTk9ERSwgJmlwX2lyZHBfZGVidWdfcGFja2V0X2NtZCk7CisgIGluc3RhbGxfZWxlbWVudCAoSU5URVJGQUNFX05PREUsICZpcF9pcmRwX2RlYnVnX2Rpc2FibGVfY21kKTsKK30KKworI2VuZGlmIC8qIEhBVkVfSVJEUCAqLwpkaWZmIC0tZ2l0IGEvemVicmEvaXJkcF9tYWluLmMgYi96ZWJyYS9pcmRwX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM2YWVhCi0tLSAvZGV2L251bGwKKysrIGIvemVicmEvaXJkcF9tYWluLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgorICogU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLiAgCisgKi8KKworLyogCisgKiBUaGlzIHdvcmsgaW5jbHVkZXMgd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgY29weXdyaXRlOgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqLworCisvKiAKKyAqIFRoYW5rcyB0byBKZW5zIEzl5XMgYXQgU3dlZGlzaCBVbml2ZXJzaXR5IG9mIEFncmljdWx0dXJhbCBTY2llbmNlcworICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCisgKi8KKworCisjaW5jbHVkZSA8emVicmEuaD4KKworI2lmZGVmIEhBVkVfSVJEUAorCisjaW5jbHVkZSAiaWYuaCIKKyNpbmNsdWRlICJ2dHkuaCIKKyNpbmNsdWRlICJzb2NrdW5pb24uaCIKKyNpbmNsdWRlICJwcmVmaXguaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAic3RyZWFtLmgiCisjaW5jbHVkZSAiaW9jdGwuaCIKKyNpbmNsdWRlICJjb25uZWN0ZWQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ6Y2xpZW50LmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiemVicmEvaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiemVicmEvcnRhZHYuaCIKKyNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKKyNpbmNsdWRlICJ6ZWJyYS96c2Vydi5oIgorI2luY2x1ZGUgInplYnJhL3JlZGlzdHJpYnV0ZS5oIgorI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2lwX2ljbXAuaD4KKworI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAic29ja3VuaW9uLmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIEdMT0JBTCBWQVJTICovCisKKy8qIE1hc3RlciBvZiB0aHJlYWRzLiAqLworZXh0ZXJuIHN0cnVjdCB6ZWJyYV90IHplYnJhZDsKK3N0cnVjdCB0aHJlYWQgKnRfaXJkcF9yYXc7CisKKy8qIFRpbWVyIGludGVydmFsIG9mIGlyZHAuICovCitpbnQgaXJkcF90aW1lcl9pbnRlcnZhbCA9IElSRFBfREVGQVVMVF9JTlRFUlZBTDsKKworaW50IGlyZHBfcmVhZF9yYXcoc3RydWN0IHRocmVhZCAqcik7CitpbnQgaW5fY2tzdW0gKHZvaWQgKnB0ciwgaW50IG5ieXRlcyk7CitleHRlcm4gaW50IGlyZHBfc29jazsKK3ZvaWQgc2VuZF9wYWNrZXQoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKKwkJIHN0cnVjdCBzdHJlYW0gKnMsCisJCSB1X2ludDMyX3QgZHN0LAorCQkgc3RydWN0IHByZWZpeCAqcCwKKwkJIHVfaW50MzJfdCB0dGwpOworCit2b2lkIGlyZHBfaWZfaW5pdCAoKTsKKworY2hhciAqCitpbmV0XzJhKHVfaW50MzJfdCBhLCBjaGFyICpiKQoreworICBzcHJpbnRmKGIsICIldS4ldS4ldS4ldSIsIAorICAgICAgICAgIChhICAgICkgJiAweEZGLAorICAgICAgICAgIChhPj4gOCkgJiAweEZGLCAKKyAgICAgICAgICAoYT4+MTYpICYgMHhGRiwgCisgICAgICAgICAgKGE+PjI0KSAmIDB4RkYpOworICByZXR1cm4gIGI7Cit9CisKK2ludAoraXJkcF9zb2NrX2luaXQgKHZvaWQpCit7CisgIGludCByZXQsIGk7CisKKyAgaXJkcF9zb2NrID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKTsKKyAgaWYgKGlyZHBfc29jayA8IDApIHsKKyAgICB6bG9nX3dhcm4gKCJJUkRQOiBjYW4ndCBjcmVhdGUgaXJkcCBzb2NrZXQgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBpcmRwX3NvY2s7CisgIH07CisgIAorICBpID0gMTsKKyAgcmV0ID0gc2V0c29ja29wdCAoaXJkcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJmksIHNpemVvZiAoaSkpOworICBpZiAocmV0IDwgMCkgeworICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGRvIGlyZHAgc29ja29wdCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfTsKKyAgCisgIGkgPSAxOworICByZXQgPSBzZXRzb2Nrb3B0IChpcmRwX3NvY2ssIElQUFJPVE9fSVAsIElQX1BLVElORk8sIAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgJmksIHNpemVvZiAoaSkpOworICBpZiAocmV0IDwgMCkgeworICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGRvIGlyZHAgc29ja29wdCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfTsKKworICB0X2lyZHBfcmF3ID0gdGhyZWFkX2FkZF9yZWFkICh6ZWJyYWQubWFzdGVyLCBpcmRwX3JlYWRfcmF3LCBOVUxMLCBpcmRwX3NvY2spOyAKKworICByZXR1cm4gaXJkcF9zb2NrOworfQorCisKK2ludCBnZXRfcHJlZihzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHAsIHN0cnVjdCBwcmVmaXggKnApCit7CisgIGxpc3Rub2RlIG5vZGU7CisgIHN0cnVjdCBBZHYgKmFkdjsKKworICAvKiBVc2UgZGVmYXVsdCBwcmVmZXJlbmNlIG9yIHVzZSB0aGUgb3ZlcnJpZGUgcHJlZiAqLworICAKKyAgaWYoIGlyZHAtPkFkdlByZWZMaXN0ID09IE5VTEwgKSByZXR1cm4gaXJkcC0+UHJlZmVyZW5jZTsKKyAgCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcmRwLT5BZHZQcmVmTGlzdCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworICAgIGFkdiA9IGdldGRhdGEgKG5vZGUpOworICAgIGlmKCBwLT51LnByZWZpeDQuc19hZGRyID09IGFkdi0+aXAuc19hZGRyICkKKyAgICAgIHJldHVybiBhZHYtPnByZWY7CisgIH0KKyAgcmV0dXJuIGlyZHAtPlByZWZlcmVuY2U7Cit9CisKKy8qIE1ha2UgSUNNUCBSb3V0ZXIgQWR2ZXJ0aXNlbWVudCBNZXNzYWdlLiAqLworaW50IG1ha2VfYWR2ZXJ0aXNlbWVudF9wYWNrZXQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCisJCQkgICAgICAgc3RydWN0IHByZWZpeCAqcCwKKwkJCSAgICAgICBzdHJ1Y3Qgc3RyZWFtICpzKQoreworICBzdHJ1Y3QgemVicmFfaWYgKnppPWlmcC0+aW5mbzsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKKyAgaW50IHNpemU7CisgIGludCBwcmVmOworICB1X2ludDE2X3QgY2hlY2tzdW07CisKKyAgcHJlZiA9ICBnZXRfcHJlZihpcmRwLCBwKTsKKworICBzdHJlYW1fcHV0YyAocywgSUNNUF9ST1VURVJBRFZFUlQpOyAvKiBUeXBlLiAqLworICBzdHJlYW1fcHV0YyAocywgMCk7CQkvKiBDb2RlLiAqLworICBzdHJlYW1fcHV0dyAocywgMCk7CQkvKiBDaGVja3N1bS4gKi8KKyAgc3RyZWFtX3B1dGMgKHMsIDEpOwkJLyogTnVtIGFkZHJlc3MuICovCisgIHN0cmVhbV9wdXRjIChzLCAyKTsJCS8qIEFkZHJlc3MgRW50cnkgU2l6ZS4gKi8KKworICBpZihpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOKSAgCisgICAgc3RyZWFtX3B1dHcgKHMsIDApOworICBlbHNlIAorICAgIHN0cmVhbV9wdXR3IChzLCBpcmRwLT5MaWZldGltZSk7CisKKyAgc3RyZWFtX3B1dGwgKHMsIGh0b25sKHAtPnUucHJlZml4NC5zX2FkZHIpKTsgLyogUm91dGVyIGFkZHJlc3MuICovCisgIHN0cmVhbV9wdXRsIChzLCBwcmVmKTsKKworICAvKiBpbl9ja3N1bSByZXR1cm4gbmV0d29yayBieXRlIG9yZGVyIHZhbHVlICovCisgIHNpemUgPSAxNjsKKyAgY2hlY2tzdW0gPSBpbl9ja3N1bSAocy0+ZGF0YSwgc2l6ZSk7CisgIHN0cmVhbV9wdXR3X2F0IChzLCAyLCBodG9ucyhjaGVja3N1bSkpOworCisgIHJldHVybiBzaXplOworfQorCit2b2lkIGlyZHBfc2VuZChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAorCSAgICAgICBzdHJ1Y3QgcHJlZml4ICpwLCAKKwkgICAgICAgc3RydWN0IHN0cmVhbSAqcykKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIHVfaW50MzJfdCBkc3Q7CisgIHVfaW50MzJfdCB0dGw9MTsKKworICBpZiAoISAoaWZwLT5mbGFncyAmIElGRl9VUCkpIHJldHVybjsgCisKKyAgaWYgKGlyZHAtPmZsYWdzICYgSUZfQlJPQURDQVNUKSAKKyAgICBkc3QgPUlOQUREUl9CUk9BRENBU1QgOworICBlbHNlIAorICAgIGRzdCA9IGh0b25sKElOQUREUl9BTExIT1NUU19HUk9VUCk7CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NRVNTQUdFUykgCisgICAgemxvZ193YXJuKCJJUkRQOiBUWCBBZHZlcnQgb24gJXMgJXMvJWQgSG9sZHRpbWU9JWQgUHJlZmVyZW5jZT0lZCIsIAorCSAgICAgIGlmcC0+bmFtZSwKKwkgICAgICBpbmV0X250b2EocC0+dS5wcmVmaXg0KSwgCisJICAgICAgcC0+cHJlZml4bGVuLAorCSAgICAgIGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04/IDAgOiBpcmRwLT5MaWZldGltZSwKKwkgICAgICBnZXRfcHJlZihpcmRwLCBwKSk7CisKKyAgc2VuZF9wYWNrZXQgKGlmcCwgcywgZHN0LCBwLCB0dGwpOworfQorCit2b2lkIGlyZHBfYWR2ZXJ0aXNlbWVudCAoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKKwkJICAgc3RydWN0IHByZWZpeCAqcCkKK3sKKyAgc3RydWN0IHN0cmVhbSAqczsKKyAgcyA9IHN0cmVhbV9uZXcgKDEyOCk7CisgIG1ha2VfYWR2ZXJ0aXNlbWVudF9wYWNrZXQgKGlmcCwgcCwgcyk7CisgIGlyZHBfc2VuZChpZnAsIHAsIHMpOyAKK30KKworaW50IGlyZHBfc2VuZF90aHJlYWQoc3RydWN0IHRocmVhZCAqdF9hZHZlcnQpCit7CisgIHVfaW50MzJfdCB0aW1lciwgdG1wOworICBzdHJ1Y3QgaW50ZXJmYWNlICppZnAgPSBUSFJFQURfQVJHICh0X2FkdmVydCk7CisgIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOworICBzdHJ1Y3QgcHJlZml4ICpwOworICBsaXN0bm9kZSBub2RlOworICBzdHJ1Y3QgY29ubmVjdGVkICppZmM7CisKKyAgaXJkcC0+ZmxhZ3MgJj0gfklGX1NPTElDSVQ7CisKKyAgaWYoaWZwLT5jb25uZWN0ZWQpIAorICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpZnAtPmNvbm5lY3RlZCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworICAgICAgaWZjID0gZ2V0ZGF0YSAobm9kZSk7CisKKyAgICAgIHAgPSBpZmMtPmFkZHJlc3M7CisKKyAgICAgIGlyZHBfYWR2ZXJ0aXNlbWVudChpZnAsIHApOworICAgICAgaXJkcC0+aXJkcF9zZW50Kys7CisKKyAgICB9CisKKyAgdG1wID0gaXJkcC0+TWF4QWR2ZXJ0SW50ZXJ2YWwtaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWw7CisgIHRpbWVyID0gIChyYW5kb20gKCkgJSB0bXAgKSArIDE7CisgIHRpbWVyID0gaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgKyB0aW1lcjsKKworICBpZihpcmRwLT5pcmRwX3NlbnQgPCAgTUFYX0lOSVRJQUxfQURWRVJUSVNFTUVOVFMgJiYKKyAgICAgdGltZXIgPiBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwgKSAKKwkgIHRpbWVyPSBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUw7CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQorICAgIHpsb2dfd2FybigiSVJEUDogTmV3IHRpbWVyIGZvciAlcyBzZXQgdG8gJXVcbiIsIGlmcC0+bmFtZSwgdGltZXIpOworCisgIGlyZHAtPnRfYWR2ZXJ0aXNlID0gdGhyZWFkX2FkZF90aW1lcih6ZWJyYWQubWFzdGVyLCBpcmRwX3NlbmRfdGhyZWFkLCBpZnAsIHRpbWVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXJkcF9hZHZlcnRfb2ZmKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIGxpc3Rub2RlIG5vZGU7CisgIGludCBpOworICBzdHJ1Y3QgY29ubmVjdGVkICppZmM7CisgIHN0cnVjdCBwcmVmaXggKnA7CisKKyAgaWYoaXJkcC0+dF9hZHZlcnRpc2UpICB0aHJlYWRfY2FuY2VsKGlyZHAtPnRfYWR2ZXJ0aXNlKTsKKyAgaXJkcC0+dF9hZHZlcnRpc2UgPSBOVUxMOworICAKKyAgaWYoaWZwLT5jb25uZWN0ZWQpIAorICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpZnAtPmNvbm5lY3RlZCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeworICAgICAgaWZjID0gZ2V0ZGF0YSAobm9kZSk7CisKKyAgICAgIHAgPSBpZmMtPmFkZHJlc3M7CisKKyAgICAgIC8qIE91dHB1dCBzb21lIHBhY2tldHMgd2l0aCBMaWZldGltZSAwIAorCSB3ZSBzaG91bGQgYWRkIGEgd2FpdC4uLgorICAgICAgKi8KKworICAgICAgZm9yKGk9MDsgaTwgSVJEUF9MQVNUX0FEVkVSVF9NRVNTQUdFUzsgaSsrKSB7CisKKwlpcmRwLT5pcmRwX3NlbnQrKzsKKwlpcmRwX2FkdmVydGlzZW1lbnQoaWZwLCBwKTsKKyAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBwcm9jZXNzX3NvbGljaXQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCkKK3sKKyAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CisgIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CisgIHVfaW50MzJfdCB0aW1lcjsKKworICAvKiBXaGVuIFNPTElDSVQgaXMgYWN0aXZlIHdlIHJlamVjdCBmdXJ0aGVyIGluY29taW5nIHNvbGljaXRzIAorICAgICB0aGlzIGtlZXBzIGRvd24gdGhlIGFuc3dlcmluZyByYXRlIHNvIHdlIGRvbid0IGhhdmUgdGhpbmsKKyAgICAgYWJvdXQgRG9TIGF0dGFja3MgaGVyZS4gKi8KKworICBpZiggaXJkcC0+ZmxhZ3MgJiBJRl9TT0xJQ0lUKSByZXR1cm47CisKKyAgaXJkcC0+ZmxhZ3MgfD0gSUZfU09MSUNJVDsKKyAgaWYoaXJkcC0+dF9hZHZlcnRpc2UpICB0aHJlYWRfY2FuY2VsKGlyZHAtPnRfYWR2ZXJ0aXNlKTsKKyAgaXJkcC0+dF9hZHZlcnRpc2UgPSBOVUxMOworCisgIHRpbWVyID0gIChyYW5kb20gKCkgJSBNQVhfUkVTUE9OU0VfREVMQVkpICsgMTsKKworICBpcmRwLT50X2FkdmVydGlzZSA9IHRocmVhZF9hZGRfdGltZXIoemVicmFkLm1hc3RlciwgCisJCQkJICAgICAgIGlyZHBfc2VuZF90aHJlYWQsIAorCQkJCSAgICAgICBpZnAsIAorCQkJCSAgICAgICB0aW1lcik7Cit9CisKK3ZvaWQgaXJkcF9maW5pc2goKQoreworCisgIGxpc3Rub2RlIG5vZGU7CisgIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKKyAgc3RydWN0IHplYnJhX2lmICp6aTsKKyAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwOworCisgIHpsb2dfd2FybigiSVJEUDogUmVjZWl2ZWQgc2h1dGRvd24gbm90aWZpY2F0aW9uLiIpOworICAKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlmbGlzdCk7IG5vZGU7IG5vZGUgPSBuZXh0bm9kZSAobm9kZSkpCisgICAgeworICAgICAgaWZwID0gZ2V0ZGF0YShub2RlKTsKKyAgICAgIHppPSBpZnAtPmluZm87CisgICAgICBpZighIHppKSBjb250aW51ZTsKKyAgICAgIGlyZHAgPSAmemktPmlyZHA7CisgICAgICBpZighaXJkcCkgY29udGludWU7CisKKyAgICAgIGlmKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFICkgeworCWlyZHAtPmZsYWdzIHw9IElGX1NIVVRET1dOOworCWlyZHBfYWR2ZXJ0X29mZihpZnApOworICAgICAgfQorICAgIH0KK30KKwordm9pZCBpcmRwX2luaXQoKQoreworICBpcmRwX3NvY2tfaW5pdCgpOworICBpcmRwX2lmX2luaXQgKCk7Cit9CisKKworCisjZW5kaWYgLyogSEFWRV9JUkRQICovCisKKworCisKZGlmZiAtLWdpdCBhL3plYnJhL2lyZHBfcGFja2V0LmMgYi96ZWJyYS9pcmRwX3BhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2Q1OTcKLS0tIC9kZXYvbnVsbAorKysgYi96ZWJyYS9pcmRwX3BhY2tldC5jCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgUm9iZXJ0IE9sc3Nvbi4KKyAqIFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcsIFVTQS4gIAorICovCisKKy8qIAorICogVGhpcyB3b3JrIGluY2x1ZGVzIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIGNvcHl3cml0ZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDAgS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKi8KKworLyogCisgKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKKyAqIGZvciByZXZpZXdpbmcgYW5kIHRlc3RzLgorICovCisKKworI2luY2x1ZGUgPHplYnJhLmg+CisKKworI2lmZGVmIEhBVkVfSVJEUAorCisjaW5jbHVkZSAiaWYuaCIKKyNpbmNsdWRlICJ2dHkuaCIKKyNpbmNsdWRlICJzb2NrdW5pb24uaCIKKyNpbmNsdWRlICJwcmVmaXguaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAic3RyZWFtLmgiCisjaW5jbHVkZSAiaW9jdGwuaCIKKyNpbmNsdWRlICJjb25uZWN0ZWQuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ6Y2xpZW50LmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiemVicmEvaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiemVicmEvcnRhZHYuaCIKKyNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKKyNpbmNsdWRlICJ6ZWJyYS96c2Vydi5oIgorI2luY2x1ZGUgInplYnJhL3JlZGlzdHJpYnV0ZS5oIgorI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2lwX2ljbXAuaD4KKyNpbmNsdWRlICJpZi5oIgorI2luY2x1ZGUgInNvY2t1bmlvbi5oIgorI2luY2x1ZGUgImxvZy5oIgorCisKKworLyogR0xPQkFMIFZBUlMgKi8KKworaW50IGlyZHBfc29jazsKK2NoYXIgYjFbMTZdLCBiMlsxNl0sIGIzWzE2XSwgYjRbMTZdOyAgLyogRm9yIGluZXRfMmEgKi8KKworZXh0ZXJuIHN0cnVjdCB6ZWJyYV90IHplYnJhZDsKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkICp0X2lyZHBfcmF3OworZXh0ZXJuIHN0cnVjdCBpbnRlcmZhY2UgKmdldF9pZmxpc3RfaWZwKGludCBpZHgpOworaW50IGluX2Nrc3VtICh2b2lkICpwdHIsIGludCBuYnl0ZXMpOwordm9pZCBwcm9jZXNzX3NvbGljaXQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCk7CisKK3ZvaWQgcGFyc2VfaXJkcF9wYWNrZXQoY2hhciAqcCwgCisJCSAgaW50IGxlbiwgCisJCSAgc3RydWN0IGludGVyZmFjZSAqaWZwKQoreworICBzdHJ1Y3QgaXAgKmlwID0gKHN0cnVjdCBpcCAqKXAgOworICBzdHJ1Y3QgaWNtcGhkciAqaWNtcDsKKyAgc3RydWN0IGluX2FkZHIgc3JjOworICBpbnQgaXBfaGxlbiwgaXBfbGVuOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisKKyAgemkgPSBpZnAtPmluZm87CisgIGlmKCF6aSkgcmV0dXJuOworCisgIGlyZHAgPSAmemktPmlyZHA7CisgIGlmKCFpcmRwKSByZXR1cm47CisKKyAgaXBfaGxlbiA9IGlwLT5pcF9obCo0OyAKKyAgaXBfbGVuID0gbnRvaHMoaXAtPmlwX2xlbik7CisgIGxlbiA9IGxlbiAtIGlwX2hsZW47CisgIHNyYyA9IGlwLT5pcF9zcmM7CisKKyAgaWYoaXBfbGVuIDwgSUNNUF9NSU5MRU4pIHsKKyAgICB6bG9nX2VyciAoIklSRFA6IFJYIElDTVAgcGFja2V0IHRvbyBzaG9ydCBmcm9tICVzXG4iLAorCSAgICAgIGluZXRfbnRvYSAoc3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQ2hlY2sgc28gd2UgZG9uJ3QgY2hlY2tzdW0gcGFja2V0cyBsb25nZXIgdGhhbiBvdXJlIFJYX0JVRiAtIChldGhsZW4gKworICAgbGVuIG9mIElQLWhlYWRlcikgMTQrMjAgKi8KKworICBpZihpcF9sZW4gPiBJUkRQX1JYX0JVRi0zNCkgeworICAgIHpsb2dfZXJyICgiSVJEUDogUlggSUNNUCBwYWNrZXQgdG9vIGxvbmcgZnJvbSAlc1xuIiwKKwkgICAgICBpbmV0X250b2EgKHNyYykpOworICAgIHJldHVybjsKKyAgfQorCisKKyAgaWYgKGluX2Nrc3VtIChpcCwgaXBfbGVuKSkgeworICAgIHpsb2dfd2FybiAoIklSRFA6IFJYIElDTVAgcGFja2V0IGZyb20gJXMuIEJhZCBjaGVja3N1bSwgc2lsZW50bHkgaWdub3JlZCIsCisJICAgICAgIGluZXRfbnRvYSAoc3JjKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWNtcCA9IChzdHJ1Y3QgaWNtcGhkciAqKSAocCtpcF9obGVuKTsKKworCisgIC8qIEhhbmRsZSBqdXN0IG9ubHkgSVJEUCAqLworCisgIGlmKCBpY21wLT50eXBlID09IElDTVBfUk9VVEVSQURWRVJUKTsKKyAgZWxzZSBpZiggaWNtcC0+dHlwZSA9PSBJQ01QX1JPVVRFUlNPTElDSVQpOworICBlbHNlIHJldHVybjsKKworIAorICBpZiAoaWNtcC0+Y29kZSAhPSAwKSB7CisgICAgemxvZ193YXJuICgiSVJEUDogUlggcGFja2V0IHR5cGUgJWQgZnJvbSAlcy4gQmFkIElDTVAgdHlwZSBjb2RlLCBzaWxlbnRseSBpZ25vcmVkIiwKKwkgICAgICAgaWNtcC0+dHlwZSwKKwkgICAgICAgaW5ldF9udG9hIChzcmMpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZihpcC0+aXBfZHN0LnNfYWRkciA9PSBJTkFERFJfQlJPQURDQVNUICYmIAorICAgICBpcmRwLT5mbGFncyAmIElGX0JST0FEQ0FTVCk7CisKKyAgZWxzZSBpZiAoIG50b2hsKGlwLT5pcF9kc3Quc19hZGRyKSA9PSBJTkFERFJfQUxMUlRSU19HUk9VUCAmJiAKKwkgICAgISAoaXJkcC0+ZmxhZ3MgJiAgSUZfQlJPQURDQVNUKSk7CisKKyAgZWxzZSB7IC8qIEVSUk9SICovCisKKyAgICB6bG9nX3dhcm4gKCJJUkRQOiBSWCBpbGxlZ2FsIGZyb20gJXMgdG8gJXMgd2hpbGUgJXMgb3BlcmF0ZXMgaW4gJXNcbiIsCisJICAgICAgIGluZXRfbnRvYSAoc3JjKSwgCisJICAgICAgIG50b2hsKGlwLT5pcF9kc3Quc19hZGRyKSA9PSBJTkFERFJfQUxMUlRSU19HUk9VUD8gCisJICAgICAgICJtdWx0aWNhc3QiIDogaW5ldF9udG9hKGlwLT5pcF9kc3QpLAorCSAgICAgICBpZnAtPm5hbWUsCisJICAgICAgIGlyZHAtPmZsYWdzICYgIElGX0JST0FEQ0FTVD8gCisJICAgICAgICJicm9hZGNhc3QiIDogIm11bHRpY2FzdCIpOworCisgICAgemxvZ193YXJuICgiSVJEUDogUGxlYXNlIGNvcnJlY3Qgc2V0dGluZ3NcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAoaWNtcC0+dHlwZSkgCisgICAgeworICAgIGNhc2UgSUNNUF9ST1VURVJBRFZFUlQ6CisgICAgICBicmVhazsKKworICAgIGNhc2UgSUNNUF9ST1VURVJTT0xJQ0lUOgorCisgICAgICBpZihpcmRwLT5mbGFncyAmIElGX0RFQlVHX01FU1NBR0VTKSAKKwl6bG9nX3dhcm4gKCJJUkRQOiBSWCBTb2xpY2l0IG9uICVzIGZyb20gJXNcbiIsCisJCSAgIGlmcC0+bmFtZSwKKwkJICAgaW5ldF9udG9hIChzcmMpKTsKKworICAgICAgcHJvY2Vzc19zb2xpY2l0KGlmcCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB6bG9nX3dhcm4gKCJJUkRQOiBSWCB0eXBlICVkIGZyb20gJXMuIEJhZCBJQ01QIHR5cGUsIHNpbGVudGx5IGlnbm9yZWQiLAorCQkgaWNtcC0+dHlwZSwKKwkJIGluZXRfbnRvYSAoc3JjKSk7CisgICAgfQorfQorDAoraW50IGlyZHBfcmVjdm1zZyAoaW50IHNvY2ssIAorCSAgICAgIHVfY2hhciAqYnVmLCAKKwkgICAgICBpbnQgc2l6ZSwgCisJICAgICAgaW50ICppZmluZGV4KQoreworICBzdHJ1Y3QgbXNnaGRyIG1zZzsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKyAgc3RydWN0IGNtc2doZHIgKnB0cjsKKyAgY2hhciBhZGF0YVsxMDI0XTsKKyAgaW50IHJldDsKKworICBtc2cubXNnX25hbWUgPSAodm9pZCAqKTA7CisgIG1zZy5tc2dfbmFtZWxlbiA9IDA7CisgIG1zZy5tc2dfaW92ID0gJmlvdjsKKyAgbXNnLm1zZ19pb3ZsZW4gPSAxOworICBtc2cubXNnX2NvbnRyb2wgPSAodm9pZCAqKSBhZGF0YTsKKyAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mIGFkYXRhOworCisgIGlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKyAgaW92Lmlvdl9sZW4gPSBzaXplOworCisgIHJldCA9IHJlY3Ztc2cgKHNvY2ssICZtc2csIDApOworICBpZiAocmV0IDwgMCkgeworICAgIHpsb2dfd2FybigiSVJEUDogcmVjdm1zZzogcmVhZCBlcnJvciAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChtc2cubXNnX2ZsYWdzICYgTVNHX1RSVU5DKSB7CisgICAgemxvZ193YXJuKCJJUkRQOiByZWN2bXNnOiB0cnVuY2F0ZWQgbWVzc2FnZSIpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfQ1RSVU5DKSB7CisgICAgemxvZ193YXJuKCJJUkRQOiByZWN2bXNnOiB0cnVuY2F0ZWQgY29udHJvbCBtZXNzYWdlIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGZvciAocHRyID0gQ01TR19GSVJTVEhEUigmbXNnKTsgcHRyIDsgcHRyID0gQ01TR19OWFRIRFIoJm1zZywgcHRyKSkKKyAgICBpZiAocHRyLT5jbXNnX2xldmVsID09IFNPTF9JUCAmJiBwdHItPmNtc2dfdHlwZSA9PSBJUF9QS1RJTkZPKSAKKyAgICAgIHsKKyAgICAgICAgc3RydWN0IGluX3BrdGluZm8gKnBrdGluZm87CisgICAgICAgICAgIHBrdGluZm8gPSAoc3RydWN0IGluX3BrdGluZm8gKikgQ01TR19EQVRBIChwdHIpOworICAgICAgICAqaWZpbmRleCA9IHBrdGluZm8tPmlwaV9pZmluZGV4OworICAgICAgfQorICByZXR1cm4gcmV0OworfQorDAoraW50IGlyZHBfcmVhZF9yYXcoc3RydWN0IHRocmVhZCAqcikKK3sKKyAgc3RydWN0IGludGVyZmFjZSAqaWZwOworICBzdHJ1Y3QgemVicmFfaWYgKnppOworICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA7CisgIGNoYXIgYnVmW0lSRFBfUlhfQlVGXTsKKyAgaW50IHJldCwgaWZpbmRleDsKKyAgCisgIGludCBpcmRwX3NvY2sgPSBUSFJFQURfRkQgKHIpOworICB0X2lyZHBfcmF3ID0gdGhyZWFkX2FkZF9yZWFkICh6ZWJyYWQubWFzdGVyLCBpcmRwX3JlYWRfcmF3LCBOVUxMLCBpcmRwX3NvY2spOworICAKKyAgcmV0ID0gaXJkcF9yZWN2bXNnIChpcmRwX3NvY2ssIGJ1ZiwgSVJEUF9SWF9CVUYsICAmaWZpbmRleCk7CisgCisgIGlmIChyZXQgPCAwKSB6bG9nX3dhcm4gKCJJUkRQOiBSWCBFcnJvciBsZW5ndGggPSAlZCIsIHJldCk7CisKKyAgaWZwID0gZ2V0X2lmbGlzdF9pZnAoaWZpbmRleCk7CisgIGlmKCEgaWZwICkgcmV0dXJuIHJldDsKKworICB6aT0gaWZwLT5pbmZvOworICBpZighIHppICkgcmV0dXJuIHJldDsKKworICBpcmRwID0gJnppLT5pcmRwOworICBpZighIGlyZHAgKSByZXR1cm4gcmV0OworCisgIGlmKCEgKGlyZHAtPmZsYWdzICYgSUZfQUNUSVZFKSkgeworCisgICAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKSAKKyAgICAgIHpsb2dfd2FybigiSVJEUDogUlggSUNNUCBmb3IgZGlzYWJsZWQgaW50ZXJmYWNlICVzXG4iLAorCQlpZnAtPm5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19QQUNLRVQpIHsKKyAgICBpbnQgaTsKKyAgICB6bG9nX3dhcm4oIklSRFA6IFJYIChpZHggJWQpICIsIGlmaW5kZXgpOworICAgIGZvcihpPTA7IGkgPCByZXQ7IGkrKykgemxvZ193YXJuKCAiSVJEUDogUlggJXggIiwgYnVmW2ldJjB4RkYpOworICB9CisKKyAgcGFyc2VfaXJkcF9wYWNrZXQoYnVmLCByZXQsIGlmcCk7CisgIHJldHVybiByZXQ7Cit9CisMCit2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCisJICAgIHN0cnVjdCBzdHJlYW0gKnMsCisJICAgIHVfaW50MzJfdCBkc3QsCisJICAgIHN0cnVjdCBwcmVmaXggKnAsCisJICAgIHVfaW50MzJfdCB0dGwpCit7CisgIHN0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2RzdCA9IHtBRl9JTkVUfTsKKyAgc3RydWN0IGlwICppcDsKKyAgc3RydWN0IGljbXBoZHIgKmljbXA7CisgIHN0cnVjdCBtc2doZHIgKm1zZzsKKyAgc3RydWN0IGNtc2doZHIgKmNtc2c7CisgIHN0cnVjdCBpb3ZlYyBpb3ZlY3RvcjsKKyAgY2hhciBtc2didWZbMjU2XTsKKyAgY2hhciBidWZbMjU2XTsKKyAgc3RydWN0IGluX3BrdGluZm8gKnBrdGluZm87CisgIHVfbG9uZyBzcmM7CisgIGludCBvbjsKKyAKKyAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm47CisKKyAgaWYoIXApIHNyYyA9IG50b2hsKHAtPnUucHJlZml4NC5zX2FkZHIpOworICBlbHNlIHNyYyA9IDA7IC8qIElzIGZpbGxlZCBpbiAqLworICAKKyAgaXAgPSAoc3RydWN0IGlwICopIGJ1ZjsKKyAgaXAtPmlwX2hsID0gc2l6ZW9mKHN0cnVjdCBpcCkgPj4gMjsKKyAgaXAtPmlwX3YgPSBJUFZFUlNJT047CisgIGlwLT5pcF90b3MgPSAweEMwOworICBpcC0+aXBfb2ZmID0gMEw7CisgIGlwLT5pcF9wID0gMTsgICAgICAgLyogSVBfSUNNUCAqLworICBpcC0+aXBfdHRsID0gdHRsOworICBpcC0+aXBfc3JjLnNfYWRkciA9IHNyYzsKKyAgaXAtPmlwX2RzdC5zX2FkZHIgPSBkc3Q7CisgIGljbXAgPSAoc3RydWN0IGljbXBoZHIgKikgKGJ1ZiArIDIwKTsKKworICAvKiBNZXJnZSBJUCBoZWFkZXIgd2l0aCBpY21wIHBhY2tldCAqLworCisgIHN0cmVhbV9nZXQoaWNtcCwgcywgcy0+cHV0cCk7CisKKyAgLyogaWNtcC0+Y2hlY2tzdW0gaXMgYWxyZWFkeSBjYWxjdWxhdGVkICovCisgIGlwLT5pcF9sZW4gID0gc2l6ZW9mKHN0cnVjdCBpcCkgKyBzLT5wdXRwOworICBzdHJlYW1fZnJlZShzKTsgCisKKyAgb24gPSAxOworICBpZiAoc2V0c29ja29wdChpcmRwX3NvY2ssIElQUFJPVE9fSVAsIElQX0hEUklOQ0wsCisJCSAoY2hhciAqKSAmb24sIHNpemVvZihvbikpIDwgMCkKKyAgICB6bG9nX3dhcm4oInNlbmR0byAlcyIsIHN0cmVycm9yIChlcnJubykpOworCisKKyAgaWYoZHN0ID09IElOQUREUl9CUk9BRENBU1QgKSB7CisgICAgb24gPSAxOworICAgIGlmIChzZXRzb2Nrb3B0KGlyZHBfc29jaywgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULAorCQkgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpIDwgMCkKKyAgICAgIHpsb2dfd2Fybigic2VuZHRvICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgIH0KKworICBpZihkc3QgIT0gIElOQUREUl9CUk9BRENBU1QpIHsKKyAgICAgIG9uID0gMDsgCisgICAgICBpZiggc2V0c29ja29wdChpcmRwX3NvY2ssSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1AsIAorCQkgICAgIChjaGFyICopJm9uLHNpemVvZihvbikpIDwgMCkKKwl6bG9nX3dhcm4oInNlbmR0byAlcyIsIHN0cmVycm9yIChlcnJubykpOworICB9CisKKyAgYnplcm8oJnNvY2tkc3Qsc2l6ZW9mKHNvY2tkc3QpKTsKKyAgc29ja2RzdC5zaW5fZmFtaWx5PUFGX0lORVQ7CisgIHNvY2tkc3Quc2luX2FkZHIuc19hZGRyID0gZHN0OworCisgIGNtc2cgPSAoc3RydWN0IGNtc2doZHIgKikgKG1zZ2J1ZiArIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7CisgIGNtc2ctPmNtc2dfbGVuID0gc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSArIHNpemVvZihzdHJ1Y3QgaW5fcGt0aW5mbyk7CisgIGNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfSVA7CisgIGNtc2ctPmNtc2dfdHlwZSA9IElQX1BLVElORk87CisgIHBrdGluZm8gPSAoc3RydWN0IGluX3BrdGluZm8gKikgQ01TR19EQVRBKGNtc2cpOworICBwa3RpbmZvLT5pcGlfaWZpbmRleCA9IGlmcC0+aWZpbmRleDsKKyAgcGt0aW5mby0+aXBpX3NwZWNfZHN0LnNfYWRkciA9IHNyYzsKKyAgcGt0aW5mby0+aXBpX2FkZHIuc19hZGRyID0gc3JjOworIAorICBpb3ZlY3Rvci5pb3ZfYmFzZSA9ICh2b2lkICopIGJ1ZjsKKyAgaW92ZWN0b3IuaW92X2xlbiA9IGlwLT5pcF9sZW47IAorICBtc2cgPSAoc3RydWN0IG1zZ2hkciAqKSBtc2didWY7CisgIG1zZy0+bXNnX25hbWUgPSAmc29ja2RzdDsKKyAgbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzb2NrZHN0KTsKKyAgbXNnLT5tc2dfaW92ID0gJmlvdmVjdG9yOworICBtc2ctPm1zZ19pb3ZsZW4gPSAxOworICBtc2ctPm1zZ19jb250cm9sID0gY21zZzsKKyAgbXNnLT5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworIAorICBpZiAoc2VuZG1zZyhpcmRwX3NvY2ssIG1zZywgMCkgPCAwKSB7CisgICAgemxvZ193YXJuKCJzZW5kdG8gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgfQorICAvKiAgIHByaW50ZigiVFggb24gJXMgaWR4ICVkXG4iLCBpZnAtPm5hbWUsIGlmcC0+aWZpbmRleCk7ICovCit9CisKKworI2VuZGlmIC8qIEhBVkVfSVJEUCAqLworCisKKwpkaWZmIC0tZ2l0IGEvemVicmEvbWFpbi5jIGIvemVicmEvbWFpbi5jCmluZGV4IGVmYzk1NjQuLjMzODRkN2QgMTAwNjQ0Ci0tLSBhL3plYnJhL21haW4uYworKysgYi96ZWJyYS9tYWluLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJ6ZWJyYS96c2Vydi5oIgogI2luY2x1ZGUgInplYnJhL2RlYnVnLmgiCiAjaW5jbHVkZSAiemVicmEvcmliLmgiCisjaW5jbHVkZSAiemVicmEvaXJkcC5oIgogCiAvKiBaZWJyYSBpbnN0YW5jZSAqLwogc3RydWN0IHplYnJhX3QgemVicmFkID0KQEAgLTE1MSw2ICsxNTIsOSBAQAogCiAgIGlmICghcmV0YWluX21vZGUpCiAgICAgcmliX2Nsb3NlICgpOworI2lmZGVmIEhBVkVfSVJEUAorICBpcmRwX2ZpbmlzaCgpOworI2VuZGlmCiAKICAgZXhpdCAoMCk7CiB9CkBAIC0yODksNiArMjkzLDkgQEAKICAgemVicmFfdnR5X2luaXQgKCk7CiAgIGFjY2Vzc19saXN0X2luaXQgKCk7CiAgIHJ0YWR2X2luaXQgKCk7CisjaWZkZWYgSEFWRV9JUkRQCisgIGlyZHBfaW5pdCgpOworI2VuZGlmCiAKICAgLyogRm9yIGRlYnVnIHB1cnBvc2UuICovCiAgIC8qIFNFVF9GTEFHICh6ZWJyYV9kZWJ1Z19ldmVudCwgWkVCUkFfREVCVUdfRVZFTlQpOyAqLwo=