ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMmI4OWM4MS4uMGVkZTJlNiAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzA1MDkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzA1MjUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDUwOTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBCZXR0ZXIgbG9jYWwgaGVhcCBpbXBsZW1lbnRhdGlvbi4KLQktIEltcHJvdmVtZW50cyB0byAtbWFuYWdlZCBtb2RlLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTcwNTI1OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIE1hbnkgZml4ZXMgdG8gbXVsdGltZWRpYSBjb2RlLgorCS0gQmV0dGVyIG1lbnVzLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE2LDExICsxNiwxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA1MDkudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwNTA5LnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwNTA5LnRhci5negotICBmdHA6Ly9hcmlzLmNvbS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUwOS50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUwOS50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwNTI1LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUyNS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUyNS50YXIuZ3oKKyAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDUyNS50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9CVUdTIGIvQlVHUwppbmRleCA3OWVmOTM1Li4xMjUyZDhhIDEwMDY0NAotLS0gYS9CVUdTCisrKyBiL0JVR1MKQEAgLTQwLDggKzQwLDYgQEAKICAqIDMyLWJpdCBGcmVlY2VsbCBzZWdmYXVsdHMgd2hlbiBzdGFydGVkIGZyb20gdGhlIFByb2dtYW4gKGxvb2tzIGxpa2UKICAgIGEgcHJvYmxlbSB3aXRoIGNhcmRzLmRsbCkuCiAKLSAqIFdvcmQgNi4wIG9mdGVuIHNlZ2ZhdWx0cyB3aGVuIHN5c3RlbSBtZW51IGlzIGRvdWJsZS1jbGlja2VkLiAKLQogICogRWRpdCBjb250cm9scyBhcmUgcHJvbmUgdG8gc2hvdyBibGFuayBzcGFjZSB3aGVuLCBpbiBmYWN0LCB0aGVyZSBpcyBhCiAgICB0ZXh0IHRoZXJlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggNDVkMmFlZi4uZWJlM2E2ZSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDU4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUdWUgTWF5IDIwIDE5OjIwOjIzIDE5OTcgIFBhYmxvIFNhcmF0eGFnYSA8c3J0eGdAbGludXguY2hhbmFlLnN0YmVuLmJlPgorCisJKiBbcmVzb3VyY2VzL3N5c3Jlc19Fcy5yY10KKwlVcGRhdGVkIENIT09TRV9GT05ULCBDSE9PU0VfQ09MT1IsIEVESVRNRU5VIGZvciBTcGFuaXNoLgorCitNb24gTWF5IDE5IDIyOjA2OjA0IDE5OTcgIE1pY2hpZWwgdmFuIExvb24gPG1mdmxAeHM0YWxsLm5sPgorCisJKiBbbXVsdGltZWRpYS9tY2lzdHJpbmcuY10KKwlDb3JyZWN0ZWQgYnVnIGZvciBkZXZpY2UhZWxlbWVudCBjb21tYW5kLgorCisJKiBbbXVsdGltZWRpYS9tbWF1eC5jXQorCVJlcGxhY2VkIHByaW50ZiBhbmQgZnByaW50ZiBjYWxscyBieSBkcHJpbnRmX21tYXV4LgorCisJKiBbbXVsdGltZWRpYS9hdWRpby5jXQorCUNvcnJlY3RlZCBkZWJ1Z21lc3NhZ2UgaW4gd29kR2V0Vm9sdW1lLgorCUluY2x1ZGUgY29kZSBmb3IgTUNJX0NVRSBjb21tYW5kLgorCisJKiBbbXVsdGltZWRpYS9tbXN5c3RlbS5jXQorCUFkZGVkIHRoZSBNQ0lFUlJfU0VRIGVycm9yIG1lc3NhZ2VzLgorCisJKiBbaWYxNjMyL21tc3lzdGVtLnNwZWNdIFttdWx0aW1lZGlhL2F1ZGlvLmNdIFttdWx0aW1lZGlhL21tc3lzdGVtLmNdCisJQ2hhbmdlZCBjYWxsIHN0cnVjdHVyZSBvZiB3YXZlSW5PcGVuIGFuZCB3YXZlT3V0T3Blbi4KKworCSogW211bHRpbWVkaWEvbW1zeXN0ZW0uY10gW211bHRpbWVkaWEvYXVkaW8uY10gW211bHRpbWVkaWEvbWlkaS5jXQorCSAgW211bHRpbWVkaWEvbW1hdXguY10gW211bHRpbWVkaWEvbWNpY2RhLmNdIFttdWx0aW1lZGlhL21jaWFuaW0uY10KKwkgIFttdWx0aW1lZGlhL21jaXN0cmluZy5jXSBbaW5jbHVkZS9tbXN5c3RlbS5oXQorCUNoYW5nZWQgdGhlIGRldmljZUlEIHNjaGVtZS4KKworCSogW2luY2x1ZGUvcXVldWUuaF0gW2luY2x1ZGUvd2luMTZkcnYuaF0gW21zZG9zL2RwbWkuY10KKwkgIFt3aW5kb3dzL3VzZXIuY10gW3dpbmRvd3MvZHJpdmVyLmNdIFtncmFwaGljL3dpbmcuY10KKwkgIFtncmFwaGljcy94MTFkcnYvYml0bWFwLmNdIFttaXNjL3dzcHJpbnRmLmNdIFttaXNjL2NydGRsbC5jXQorCVJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3MuCisKK01vbiBNYXkgMTkgMDE6MzI6MjQgMTk5NyAgQWxleCBLb3JvYmthIDxhbGV4QHRyYW50b3IucGhhcm0uc3VueXNiLmVkdT4KKworCSogW2NvbnRyb2xzL21lbnUuY10gW3dpbmRvd3Mvd2luLmNdIFt3aW5kb3dzL2dyYXBoaWNzLmNdCisJUG9wdXAgbWVudSBzaGFkZSwgbmV3IHN5c3RlbSBtZW51IGltcGxlbWVudGF0aW9uLCAKKwlNb2RpZnlNZW51KCkgZml4ZXMsIGJldHRlciBjaGVjayBtYXJrIHBhaW50aW5nLgorCisJKiBbd2luZG93cy9tZGkuY10KKwlNREkgY2xpZW50IGZpeCBmb3IgV2luMzIuCisKK1NhdCBNYXkgMTcgMTI6MDI6MTEgMTk5NyAgQWxicmVjaHQgS2xlaW5lICA8a2xlaW5lQGFrLnNheC5kZT4KKworCSogW29iamVjdHMvbWV0YWZpbGUuY10KKwlBZGRlZCBoYW5kbGluZyBvZiBNRVRBX0RJQkJJVEJMVCwgTUVUQV9TRVRURVhUSlVTVElGSUNBVElPTgorCXBsdXMgYnVnZml4IGluIE1FVEFfRVhUVEVYVE9VVCAoc3RhcnRfb2ZfdGV4dCBldGMuKQorCitUaHUgTWF5IDE1IDIyOjUyOjAwIDE5OTcgIEppbWVuIENoaW5nICA8amNoaW5nQGZsZXguY29tPgorCisJKiBbbG9hZGVyL25lX2ltYWdlLmNdCisJTWFrZSBzdXJlIGRncm91cCBpcyB2YWxpZCBieSBjaGVja2luZyBwTW9kdWxlLT5mbGFncyBjb25zaXN0ZW50bHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFR1ZSBNYXkgIDYgMTk6MTI6MjAgMTk5NyAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtsb2FkZXIvdGFzay5jXSBbbG9hZGVyL21vZHVsZS5jXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBhZmI5ZWRkLi4wMzljNzQxIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMTIyLDcgKzEyMiw3IEBACiAJJChJTlNUQUxMX0RBVEEpIGxpYndpbmUuYSAkKGxpYmRpcikKIAogbGlid2luZS5zby4xLjA6ICQoQ09NTU9OU1VCRElSUykgJChMSUJTVUJESVJTKSBkdW1teQotCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsbGlid2luZS5zby4xIC1vJEAgJChDT01NT05PQkpTKSAkKExJQk9CSlMpICQoTERPUFRJT05TKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsbGlid2luZS5zbyAtbyRAICQoQ09NTU9OT0JKUykgJChMSUJPQkpTKSAkKExET1BUSU9OUykgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKIAogaW5zdGFsbF9saWJ3aW5lLnNvLjEuMDogZHVtbXkKIAkkKElOU1RBTExfREFUQSkgbGlid2luZS5zby4xLjAgJChsaWJkaXIpCmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IDcyZTI4OTMuLjA3Y2M1ZTEgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC00MTMsNyArNDEzLDcgQEAKICAgICAgICAgZWxzZSBpZiAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fM1NUQVRFKSB5ICs9IDIgKiBjaGVja0JveEhlaWdodDsKIAogICAgICAgICBHUkFQSF9EcmF3Qml0bWFwKCBoREMsIGhiaXRtYXBDaGVja0JveGVzLCByYm94LmxlZnQsIHJib3gudG9wICsgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGNoZWNrQm94V2lkdGgsIGNoZWNrQm94SGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGNoZWNrQm94V2lkdGgsIGNoZWNrQm94SGVpZ2h0LCBGQUxTRSApOwogICAgICAgICBpZiggdGV4dGxlbiAmJiBhY3Rpb24gIT0gT0RBX1NFTEVDVCApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2Rlc2t0b3AuYyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwppbmRleCAyNDY2ZWE3Li42NzA4ZmI3IDEwMDY0NAotLS0gYS9jb250cm9scy9kZXNrdG9wLmMKKysrIGIvY29udHJvbHMvZGVza3RvcC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJICAgIEdSQVBIX0RyYXdCaXRtYXAoIGhkYywgaW5mb1B0ci0+aGJpdG1hcFdhbGxQYXBlciwKIAkJCQkgICAgICB4LCB5LCAwLCAwLCAKIAkJCQkgICAgICBpbmZvUHRyLT5iaXRtYXBTaXplLmN4LAotCQkJCSAgICAgIGluZm9QdHItPmJpdG1hcFNpemUuY3kgKTsKKwkJCQkgICAgICBpbmZvUHRyLT5iaXRtYXBTaXplLmN5LCBGQUxTRSApOwogCX0KIAllbHNlCiAJewpAQCAtMTE2LDggKzExNiw5IEBACiAJICAgIHkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSAtIGluZm9QdHItPmJpdG1hcFNpemUuY3kpIC8gMjsKIAkgICAgaWYgKHggPCAwKSB4ID0gMDsKIAkgICAgaWYgKHkgPCAwKSB5ID0gMDsKLQkgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBpbmZvUHRyLT5oYml0bWFwV2FsbFBhcGVyLCB4LCB5LCAwLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9QdHItPmJpdG1hcFNpemUuY3gsIGluZm9QdHItPmJpdG1hcFNpemUuY3kgKTsKKwkgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBpbmZvUHRyLT5oYml0bWFwV2FsbFBhcGVyLCAKKwkJCSAgICAgIHgsIHksIDAsIDAsIGluZm9QdHItPmJpdG1hcFNpemUuY3gsIAorCQkJICAgICAgaW5mb1B0ci0+Yml0bWFwU2l6ZS5jeSwgRkFMU0UgKTsKIAl9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggOGE3ZjFkOS4uNDhiMTgxZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtNzI0LDYgKzcyNCw3IEBACiAgICAgaXRlbSA9IGRlc2NyLT5pdGVtcyArIHN0YXJ0ICsgMTsKICAgICBpZiAoSEFTX1NUUklOR1MoZGVzY3IpKQogICAgIHsKKyAgICAgICAgaWYgKCFzdHIpIHJldHVybiBMQl9FUlI7CiAgICAgICAgIGlmIChleGFjdCkKICAgICAgICAgewogICAgICAgICAgICAgZm9yIChpID0gc3RhcnQgKyAxOyBpIDwgZGVzY3ItPm5iX2l0ZW1zOyBpKyssIGl0ZW0rKykKQEAgLTE5MTUsNiArMTkxNiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZXNjci0+aXRlbXNbZGVzY3ItPmZvY3VzX2l0ZW1dLnNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKSAhPSAwICk7CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVzY3ItPnNlbGVjdGVkX2l0ZW0gPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIExJU1RCT1hfU2V0U2VsZWN0aW9uKCB3bmQsIGRlc2NyLCBkZXNjci0+Zm9jdXNfaXRlbSwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkgIT0gMCApOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoY2FyZXQgPj0gMCkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCBmMjY2ZThmLi40YzdjODJmIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0xMSwxMSArMTEsMTQgQEAKICAqIFRoaXMgaXMgcHJvYmFibHkgbm90IHRoZSBtZWFuaW5nIHRoaXMgc3R5bGUgaGFzIGluIE1TLVdpbmRvd3MuCiAgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCiAjaW5jbHVkZSAidGFzay5oIgpAQCAtMzIsNiArMzUsMTcgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKy8qIGludGVybmFsIHBvcHVwIG1lbnUgd2luZG93IG1lc3NhZ2VzICovCisKKyNkZWZpbmUgTU1fU0VUTUVOVUhBTkRMRQkoV01fVVNFUiArIDApCisjZGVmaW5lIE1NX0dFVE1FTlVIQU5ETEUJKFdNX1VTRVIgKyAxKQorCit0eXBlZGVmIHN0cnVjdAoreworICBIQklUTUFQMzIJaENoZWNrQml0OworICBIQklUTUFQMzIJaFVuQ2hlY2tCaXQ7Cit9IENCSVRNQVBTLCAqUENCSVRNQVBTOworCiAvKiBNZW51IGl0ZW0gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMzksOCArNTMsNyBAQAogICAgIFVJTlQzMiAgICAgIGl0ZW1faWQ7ICAgICAgIC8qIEl0ZW0gb3IgcG9wdXAgaWQgKi8KICAgICBSRUNUMzIgICAgICByZWN0OyAgICAgICAgICAvKiBJdGVtIGFyZWEgKHJlbGF0aXZlIHRvIG1lbnUgd2luZG93KSAqLwogICAgIFVJTlQzMiAgICAgIHhUYWI7ICAgICAgICAgIC8qIFggcG9zaXRpb24gb2YgdGV4dCBhZnRlciBUYWIgKi8KLSAgICBIQklUTUFQMzIgICBoQ2hlY2tCaXQ7ICAgICAvKiBCaXRtYXAgZm9yIGNoZWNrZWQgaXRlbSAqLwotICAgIEhCSVRNQVAzMiAgIGhVbkNoZWNrQml0OyAgIC8qIEJpdG1hcCBmb3IgdW5jaGVja2VkIGl0ZW0gKi8KKyAgICBQQ0JJVE1BUFMJcENCOwkgICAgICAgLyogY2hlY2ttYXJrIGJpdG1hcHMgKi8KICAgICBMUFNUUiAgICAgICB0ZXh0OyAgICAgICAgICAvKiBJdGVtIHRleHQgb3IgYml0bWFwIGhhbmRsZSAqLwogfSBNRU5VSVRFTTsKIApAQCAtNTgsMTcgKzcxLDM0IEBACiAgICAgVUlOVDMyICAgICAgRm9jdXNlZEl0ZW07ICAvKiBDdXJyZW50bHkgZm9jdXNlZCBpdGVtICovCiB9IFBPUFVQTUVOVSwgKkxQUE9QVVBNRU5VOwogCisvKiBpbnRlcm5hbCBmbGFncyBmb3IgbWVudSB0cmFja2luZyAqLworCisjZGVmaW5lIFRGX0VORE1FTlUgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBURl9TVVNQRU5EUE9QVVAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVEZfU0tJUFJFTU9WRQkJMHgwMDA0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyCXRyYWNrRmxhZ3M7CisgICAgSE1FTlUzMgloQ3VycmVudE1lbnU7IC8qIGN1cnJlbnQgc3VibWVudSAoY2FuIGJlIGVxdWFsIHRvIGhUb3BNZW51KSovCisgICAgSE1FTlUzMgloVG9wTWVudTsgICAgIC8qIGluaXRpYWwgbWVudSAqLworICAgIEhXTkQzMgloT3duZXJXbmQ7ICAgIC8qIHdoZXJlIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgKi8KKyAgICBQT0lOVDMyCXB0OworfSBNVFJBQ0tFUjsKKwogI2RlZmluZSBNRU5VX01BR0lDICAgMHg1NTRkICAvKiAnTVUnICovCiAKICNkZWZpbmUgSVRFTV9QUkVWCQktMQogI2RlZmluZSBJVEVNX05FWFQJCSAxCiAKLSAgLyogRGltZW5zaW9uIG9mIHRoZSBtZW51IGJpdG1hcHMgKi8KLXN0YXRpYyBXT1JEIGNoZWNrX2JpdG1hcF93aWR0aCA9IDAsIGNoZWNrX2JpdG1hcF9oZWlnaHQgPSAwOwotc3RhdGljIFdPUkQgYXJyb3dfYml0bWFwX3dpZHRoID0gMCwgYXJyb3dfYml0bWFwX2hlaWdodCA9IDA7CisgIC8qIEludGVybmFsIE1FTlVfVHJhY2tNZW51KCkgZmxhZ3MgKi8KKyNkZWZpbmUgVFBNX0lOVEVSTkFMCQkweEYwMDAwMDAwCisjZGVmaW5lIFRQTV9FTlRFUklETEVFWAkgCTB4ODAwMDAwMDAJCS8qIHNldCBvd25lciB3aW5kb3cgZm9yIFdNX0VOVEVSSURMRSAqLworI2RlZmluZSBUUE1fQlVUVE9ORE9XTgkJMHg0MDAwMDAwMAkJLyogbWVudSB3YXMgY2xpY2tlZCBiZWZvcmUgdHJhY2tpbmcgKi8KIAotICAvKiBGbGFnIHNldCBieSBFbmRNZW51KCkgdG8gZm9yY2UgYW4gZXhpdCBmcm9tIG1lbnUgdHJhY2tpbmcgKi8KLXN0YXRpYyBCT09MMzIgZkVuZE1lbnVDYWxsZWQgPSBGQUxTRTsKKyAgLyogcG9wdXAgbWVudSBzaGFkZSB0aGlja25lc3MgKi8KKyNkZWZpbmUgUE9QVVBfWFNIQURFCQk0CisjZGVmaW5lIFBPUFVQX1lTSEFERQkJNAogCiAgIC8qIFNwYWNlIGJldHdlZW4gMiBtZW51IGJhciBpdGVtcyAqLwogI2RlZmluZSBNRU5VX0JBUl9JVEVNU19TUEFDRSAgMTYKQEAgLTc5LDQ2ICsxMDksOTMgQEAKICAgLyogSGVpZ2h0IG9mIGEgc2VwYXJhdG9yIGl0ZW0gKi8KICNkZWZpbmUgU0VQQVJBVE9SX0hFSUdIVCAgICAgIDUKIAotICAvKiBWYWx1ZXMgZm9yIG1lbnUtPkZvY3VzZWRJdGVtICovCi0gIC8qIChvdGhlciB2YWx1ZXMgZ2l2ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZvY3VzZWQgaXRlbSkgKi8KKyAgLyogKG90aGVyIG1lbnUtPkZvY3VzZWRJdGVtIHZhbHVlcyBnaXZlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZm9jdXNlZCBpdGVtKSAqLwogI2RlZmluZSBOT19TRUxFQ1RFRF9JVEVNICAweGZmZmYKLSNkZWZpbmUgU1lTTUVOVV9TRUxFQ1RFRCAgMHhmZmZlICAvKiBPbmx5IHZhbGlkIG9uIG1lbnUtYmFycyAqLwogCiAjZGVmaW5lIElTX1NUUklOR19JVEVNKGZsYWdzKSBcCiAgICAgKCEoKGZsYWdzKSAmIChNRl9CSVRNQVAgfCBNRl9PV05FUkRSQVcgfCBNRl9TRVBBUkFUT1IpKSkKKyNkZWZpbmUgSVNfU1lTVEVNX01FTlUobWVudSkgIFwKKwkoISgobWVudSktPndGbGFncyAmIE1GX1BPUFVQKSAmJiAobWVudSktPndGbGFncyAmIE1GX1NZU01FTlUpCisjZGVmaW5lIElTX1NZU1RFTV9QT1BVUChtZW51KSBcCisJKChtZW51KS0+d0ZsYWdzICYgTUZfUE9QVVAgJiYgKG1lbnUpLT53RmxhZ3MgJiBNRl9TWVNNRU5VKQorCisgIC8qIERpbWVuc2lvbiBvZiB0aGUgbWVudSBiaXRtYXBzICovCitzdGF0aWMgV09SRCBjaGVja19iaXRtYXBfd2lkdGggPSAwLCBjaGVja19iaXRtYXBfaGVpZ2h0ID0gMDsKK3N0YXRpYyBXT1JEIGFycm93X2JpdG1hcF93aWR0aCA9IDAsIGFycm93X2JpdG1hcF9oZWlnaHQgPSAwOwogCiBzdGF0aWMgSEJJVE1BUDMyIGhTdGRDaGVjayA9IDA7CiBzdGF0aWMgSEJJVE1BUDMyIGhTdGRNbkFycm93ID0gMDsKLXN0YXRpYyBITUVOVTMyIE1FTlVfRGVmU3lzTWVudSA9IDA7ICAvKiBEZWZhdWx0IHN5c3RlbSBtZW51ICovCitzdGF0aWMgSEJSVVNIMzIgaFNoYWRlQnJ1c2ggPSAwOworc3RhdGljIEhNRU5VMzIgTUVOVV9EZWZTeXNQb3B1cCA9IDA7ICAvKiBEZWZhdWx0IHN5c3RlbSBtZW51IHBvcHVwICovCiAKKy8qIFVzZSBnbG9iYWwgcG9wdXAgd2luZG93IGJlY2F1c2UgdGhlcmUncyBubyB3YXkgMiBtZW51cyBjYW4KKyAqIGJlIHRyYWNrZWQgYXQgdGhlIHNhbWUgdGltZS4gICovIAogCi0vKiB3ZSBfY2FuXyB1c2UgZ2xvYmFsIHBvcHVwIHdpbmRvdyBiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IDIgbWVudWVzIGNhbgotICogYmUgdHJhY2tlZCBhdCB0aGUgc2FtZSB0aW1lLgotICovIAotCi1zdGF0aWMgV05EKiBwVG9wUFduZCAgID0gMDsKK3N0YXRpYyBXTkQqIHBUb3BQb3B1cFduZCAgID0gMDsKIHN0YXRpYyBVSU5UMzIgdVN1YlBXbmRMZXZlbCA9IDA7CiAKKyAgLyogRmxhZyBzZXQgYnkgRW5kTWVudSgpIHRvIGZvcmNlIGFuIGV4aXQgZnJvbSBtZW51IHRyYWNraW5nICovCitzdGF0aWMgQk9PTDMyIGZFbmRNZW51ID0gRkFMU0U7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUVOVV9Db3B5U3lzUG9wdXAKKyAqCisgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc3lzdGVtIG1lbnUuCisgKi8KK3N0YXRpYyBITUVOVTMyIE1FTlVfQ29weVN5c1BvcHVwKHZvaWQpCit7CisgICAgSE1FTlUzMiBoTWVudSA9IExvYWRNZW51SW5kaXJlY3QzMkEoU1lTUkVTX0dldFJlc1B0cihTWVNSRVNfTUVOVV9TWVNNRU5VKSk7CisKKyAgICBpZiggaE1lbnUgKQorICAgIHsKKyAgICAgICAgUE9QVVBNRU5VKiBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOworICAgICAgICBtZW51LT53RmxhZ3MgfD0gTUZfU1lTTUVOVSB8IE1GX1BPUFVQOworCXJldHVybiBoTWVudTsKKyAgICB9CisgICAgZWxzZSBmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gbG9hZCBkZWZhdWx0IHN5c3RlbSBtZW51XG4iICk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUVOVV9Db3B5U3lzTWVudQorICogICAgICAgICAgIE1FTlVfR2V0U3lzTWVudQogICoKLSAqIExvYWQgYSBjb3B5IG9mIHRoZSBzeXN0ZW0gbWVudS4KKyAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHN5c3RlbSBtZW51LiBTeXN0ZW0gbWVudSBpbiBXaW5kb3dzIGlzCisgKiBhIHNwZWNpYWwgbWVudS1iYXIgd2l0aCB0aGUgc2luZ2xlIGVudHJ5IC0gc3lzdGVtIG1lbnUgcG9wdXAuCisgKiBUaGlzIHBvcHVwIGlzIHByZXNlbnRlZCB0byB0aGUgb3V0c2lkZSB3b3JsZCBhcyBhICJzeXN0ZW0gbWVudSIuIAorICogSG93ZXZlciwgdGhlIHJlYWwgc3lzdGVtIG1lbnUgaGFuZGxlIGlzIHNvbWV0aW1lcyBzZWVuIGluIHRoZSAKKyAqIFdNX01FTlVTRUxFQ1QgcGFyYW1lbXRlcnMgKGFuZCBXb3JkIDYgbGlrZXMgaXQgdGhpcyB3YXkpLgogICovCi1zdGF0aWMgSE1FTlUzMiBNRU5VX0NvcHlTeXNNZW51KHZvaWQpCitITUVOVTMyIE1FTlVfR2V0U3lzTWVudSggSFdORDMyIGhXbmQsIEhNRU5VMzIgaFBvcHVwTWVudSApCiB7CiAgICAgSE1FTlUzMiBoTWVudTsKLSAgICBQT1BVUE1FTlUgKm1lbnU7CiAKLSAgICBpZiAoIShoTWVudSA9IExvYWRNZW51SW5kaXJlY3QzMkEoIFNZU1JFU19HZXRSZXNQdHIoU1lTUkVTX01FTlVfU1lTTUVOVSkpKSkKKyAgICBpZiAoKGhNZW51ID0gQ3JlYXRlTWVudTMyKCkpKQogICAgIHsKLQlkcHJpbnRmX21lbnUoc3RkZGViLCJObyBTWVNNRU5VXG4iKTsKLQlyZXR1cm4gMDsKKwlQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VKikgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKKwltZW51LT53RmxhZ3MgPSBNRl9TWVNNRU5VOworCW1lbnUtPmhXbmQgPSBoV25kOworCisJaWYgKGhQb3B1cE1lbnUgPT0gKEhNRU5VMzIpKC0xKSkKKwkgICAgaFBvcHVwTWVudSA9IE1FTlVfQ29weVN5c1BvcHVwKCk7CisJZWxzZSBpZiggIWhQb3B1cE1lbnUgKSBoUG9wdXBNZW51ID0gTUVOVV9EZWZTeXNQb3B1cDsgCisKKwlpZiAoaFBvcHVwTWVudSkKKwl7CisJICAgIEluc2VydE1lbnUzMkEoIGhNZW51LCAtMSwgTUZfU1lTTUVOVSB8IE1GX1BPUFVQIHwgTUZfQllQT1NJVElPTiwgaFBvcHVwTWVudSwgTlVMTCApOworCisJICAgIG1lbnUtPml0ZW1zWzBdLml0ZW1fZmxhZ3MgPSBNRl9TWVNNRU5VIHwgTUZfUE9QVVA7CisJICAgIG1lbnUgPSAoUE9QVVBNRU5VKikgVVNFUl9IRUFQX0xJTl9BRERSKGhQb3B1cE1lbnUpOworCSAgICBtZW51LT53RmxhZ3MgfD0gTUZfU1lTTUVOVTsKKworCSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRTeXNNZW51IGhNZW51PSUwNHggKCUwNHgpXG4iLCBoTWVudSwgaFBvcHVwTWVudSApOworCSAgICByZXR1cm4gaE1lbnU7CisJfQorCURlc3Ryb3lNZW51MzIoIGhNZW51ICk7CiAgICAgfQotICAgIG1lbnUgPSAoUE9QVVBNRU5VKikgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKLSAgICBtZW51LT53RmxhZ3MgfD0gTUZfU1lTTUVOVSB8IE1GX1BPUFVQOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkNvcHlTeXNNZW51IGhNZW51PSUwNHggIVxuIiwgaE1lbnUpOwotICAgIHJldHVybiBoTWVudTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBsb2FkIHN5c3RlbSBtZW51IVxuIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTI5LDc5ICsyMDYsNDAgQEAKICAqLwogQk9PTDMyIE1FTlVfSW5pdCgpCiB7Ci0gICAgQklUTUFQMzIgYm07CisgICAgLyogTG9hZCBtZW51IGJpdG1hcHMgKi8KIAotICAgICAgLyogTG9hZCBiaXRtYXBzICovCi0KLSAgICBpZiAoIShoU3RkQ2hlY2sgPSBMb2FkQml0bWFwMzJBKCAwLCAoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9DSEVDSykgKSkpCi0JcmV0dXJuIEZBTFNFOwotICAgIEdldE9iamVjdDMyQSggaFN0ZENoZWNrLCBzaXplb2YoYm0pLCAmYm0gKTsKLSAgICBjaGVja19iaXRtYXBfd2lkdGggPSBibS5ibVdpZHRoOwotICAgIGNoZWNrX2JpdG1hcF9oZWlnaHQgPSBibS5ibUhlaWdodDsKLSAgICBpZiAoIShoU3RkTW5BcnJvdyA9IExvYWRCaXRtYXAzMkEoMCwoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9NTkFSUk9XKSkpKQotCXJldHVybiBGQUxTRTsKLSAgICBHZXRPYmplY3QzMkEoIGhTdGRNbkFycm93LCBzaXplb2YoYm0pLCAmYm0gKTsKLSAgICBhcnJvd19iaXRtYXBfd2lkdGggPSBibS5ibVdpZHRoOwotICAgIGFycm93X2JpdG1hcF9oZWlnaHQgPSBibS5ibUhlaWdodDsKLQotICAgIGlmICghKE1FTlVfRGVmU3lzTWVudSA9IE1FTlVfQ29weVN5c01lbnUoKSkpCisgICAgaWYgKChoU3RkQ2hlY2sgPSBMb2FkQml0bWFwMzJBKCAwLCAoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9DSEVDSykgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgc3lzdGVtIG1lbnVcbiIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCUJJVE1BUDMyIGJtOworCisJR2V0T2JqZWN0MzJBKCBoU3RkQ2hlY2ssIHNpemVvZihibSksICZibSApOworCWNoZWNrX2JpdG1hcF93aWR0aCA9IGJtLmJtV2lkdGg7CisJY2hlY2tfYml0bWFwX2hlaWdodCA9IGJtLmJtSGVpZ2h0OworCisJaWYgKChoU3RkTW5BcnJvdyA9IExvYWRCaXRtYXAzMkEoMCwoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9NTkFSUk9XKSkpKQorCXsKKwkgICAgSEJJVE1BUDMyIGhCaXRtYXA7CisJICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYWRlX2JpdHNbMTZdID0geyAweDU1LCAwLCAweEFBLCAwLAorCQkJCQkJICAgIDB4NTUsIDAsIDB4QUEsIDAsCisJCQkJCQkgICAgMHg1NSwgMCwgMHhBQSwgMCwKKwkJCQkJCSAgICAweDU1LCAwLCAweEFBLCAwIH07CisJICAgIEdldE9iamVjdDMyQSggaFN0ZE1uQXJyb3csIHNpemVvZihibSksICZibSApOworCSAgICBhcnJvd19iaXRtYXBfd2lkdGggPSBibS5ibVdpZHRoOworCSAgICBhcnJvd19iaXRtYXBfaGVpZ2h0ID0gYm0uYm1IZWlnaHQ7CisKKwkgICAgaWYoKGhCaXRtYXAgPSBDcmVhdGVCaXRtYXAzMiggOCwgOCwgMSwgMSwgc2hhZGVfYml0cykpKQorCSAgICB7CisJCWlmKChoU2hhZGVCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaDMyKCBoQml0bWFwICkpKQorCQl7CisJCSAgICBEZWxldGVPYmplY3QzMiggaEJpdG1hcCApOworCQkgICAgaWYoKE1FTlVfRGVmU3lzUG9wdXAgPSBNRU5VX0NvcHlTeXNQb3B1cCgpKSkgcmV0dXJuIFRSVUU7CisJCX0KKwkgICAgfQorCX0KICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOwkvKiBmYWlsdXJlICovCiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUVOVV9HZXREZWZTeXNNZW51Ci0gKgotICogUmV0dXJuIHRoZSBkZWZhdWx0IHN5c3RlbSBtZW51LgotICovCi1ITUVOVTMyIE1FTlVfR2V0RGVmU3lzTWVudSh2b2lkKQotewotICAgIHJldHVybiBNRU5VX0RlZlN5c01lbnU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUVOVV9IYXNTeXNNZW51Ci0gKgotICogQ2hlY2sgd2hldGhlciB0aGUgd2luZG93IG93bmluZyB0aGUgbWVudSBiYXIgaGFzIGEgc3lzdGVtIG1lbnUuCi0gKi8KLXN0YXRpYyBCT09MMzIgTUVOVV9IYXNTeXNNZW51KCBQT1BVUE1FTlUgKm1lbnUgKQotewotICAgIFdORCAqd25kUHRyOwotCi0gICAgaWYgKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIG1lbnUtPmhXbmQgKSkpIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICE9IDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUVOVV9Jc0luU3lzTWVudQotICoKLSAqIENoZWNrIHdoZXRoZXIgdGhlIHBvaW50IChpbiBzY3JlZW4gY29vcmRzKSBpcyBpbiB0aGUgc3lzdGVtIG1lbnUKLSAqIG9mIHRoZSB3aW5kb3cgb3duaW5nIHRoZSBnaXZlbiBtZW51LgotICovCi1zdGF0aWMgQk9PTDMyIE1FTlVfSXNJblN5c01lbnUoIFBPUFVQTUVOVSAqbWVudSwgUE9JTlQzMiBwdCApCi17Ci0gICAgV05EICp3bmRQdHI7Ci0KLSAgICBpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIHJldHVybiBGQUxTRTsKLSAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbWVudS0+aFduZCApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKChwdC54IDwgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQpIHx8Ci0JKHB0LnggPj0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQrU1lTTUVUUklDU19DWFNJWkUrU1lTTUVUUklDU19DWEJPUkRFUikpCi0JcmV0dXJuIEZBTFNFOwotICAgIGlmICgocHQueSA+PSB3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gbWVudS0+SGVpZ2h0KSB8fAotCShwdC55IDwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCAtIG1lbnUtPkhlaWdodCAtCi0JICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NZU0laRSAtIFNZU01FVFJJQ1NfQ1lCT1JERVIpKSByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9Jbml0U3lzTWVudVBvcHVwCiAgKgpAQCAtMjY4LDI3ICszMDYsNDMgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUVOVV9GcmVlSXRlbURhdGEKKyAqLworc3RhdGljIHZvaWQgTUVOVV9GcmVlSXRlbURhdGEoIE1FTlVJVEVNKiBpdGVtICkKK3sKKyAgICAvKiBkZWxldGUgdGV4dCAqLworCisgICAgaWYgKElTX1NUUklOR19JVEVNKGl0ZW0tPml0ZW1fZmxhZ3MpICYmIGl0ZW0tPnRleHQpCisgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBpdGVtLT50ZXh0ICk7CisKKyAgICAvKiBkZWxldGUgY2hlY2ttYXJrIHN0dWZmICovCisKKyAgICBpZiAoaXRlbS0+cENCKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgaXRlbS0+cENCICk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfRmluZEl0ZW1CeUNvb3JkcwogICoKLSAqIEZpbmQgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyAoc2NyZWVuIGNvb3JkcykuCisgKiBGaW5kIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgKHNjcmVlbiBjb29yZHMpLiBEb2VzIAorICogbm90IHdvcmsgZm9yIGNoaWxkIHdpbmRvd3MgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgCisgKiBhbiBhcmJpdHJhcnkgc3lzdGVtIG1lbnUuCiAgKi8KLXN0YXRpYyBNRU5VSVRFTSAqTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBQT1BVUE1FTlUgKm1lbnUsIElOVDMyIHgsIElOVDMyIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyICpwb3MgKQorc3RhdGljIE1FTlVJVEVNICpNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIFBPUFVQTUVOVSAqbWVudSwgCisJCQkJCVBPSU5UMzIgcHQsIFVJTlQzMiAqcG9zICkKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKICAgICBXTkQgKnduZFB0cjsKICAgICBVSU5UMzIgaTsKIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtZW51LT5oV25kICkpKSByZXR1cm4gTlVMTDsKLSAgICB4IC09IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OwotICAgIHkgLT0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKKyAgICBwdC54IC09IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OworICAgIHB0LnkgLT0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKICAgICBpdGVtID0gbWVudS0+aXRlbXM7CiAgICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm5JdGVtczsgaSsrLCBpdGVtKyspCiAgICAgewotCWlmICgoeCA+PSBpdGVtLT5yZWN0LmxlZnQpICYmICh4IDwgaXRlbS0+cmVjdC5yaWdodCkgJiYKLQkgICAgKHkgPj0gaXRlbS0+cmVjdC50b3ApICYmICh5IDwgaXRlbS0+cmVjdC5ib3R0b20pKQorCWlmICgocHQueCA+PSBpdGVtLT5yZWN0LmxlZnQpICYmIChwdC54IDwgaXRlbS0+cmVjdC5yaWdodCkgJiYKKwkgICAgKHB0LnkgPj0gaXRlbS0+cmVjdC50b3ApICYmIChwdC55IDwgaXRlbS0+cmVjdC5ib3R0b20pKQogCXsKIAkgICAgaWYgKHBvcykgKnBvcyA9IGk7CiAJICAgIHJldHVybiBpdGVtOwpAQCAtMzA5LDcgKzM2MywxMSBAQAogewogICAgIGRwcmludGZfbWVudShzdGRkZWIsIlx0bG9va2luZyBmb3IgJyVjJyBpbiBbJTA0eF1cbiIsIChjaGFyKWtleSwgKFVJTlQxNilobWVudSApOwogCi0gICAgaWYgKCFJc01lbnUzMiggaG1lbnUgKSkgaG1lbnUgPSBXSU5fRmluZFduZFB0cihod25kT3duZXIpLT5oU3lzTWVudTsKKyAgICBpZiAoIUlzTWVudTMyKCBobWVudSApKSAKKyAgICB7CisJV05EKiB3ID0gV0lOX0ZpbmRXbmRQdHIoaHduZE93bmVyKTsKKwlobWVudSA9IEdldFN1Yk1lbnUzMih3LT5oU3lzTWVudSwgMCk7CisgICAgfQogCiAgICAgaWYgKGhtZW51KQogICAgIHsKQEAgLTQzNywxMiArNDk1LDEzIEBACiAgICAgbHBwb3AtPldpZHRoID0gbHBwb3AtPkhlaWdodCA9IDA7CiAgICAgaWYgKGxwcG9wLT5uSXRlbXMgPT0gMCkgcmV0dXJuOwogICAgIGhkYyA9IEdldERDMzIoIDAgKTsKLSAgICBtYXhYID0gc3RhcnQgPSAwOworICAgIHN0YXJ0ID0gMDsKKyAgICBtYXhYID0gU1lTTUVUUklDU19DWEJPUkRFUjsKICAgICB3aGlsZSAoc3RhcnQgPCBscHBvcC0+bkl0ZW1zKQogICAgIHsKIAlscGl0ZW0gPSAmbHBwb3AtPml0ZW1zW3N0YXJ0XTsKIAlvcmdYID0gbWF4WDsKLQlvcmdZID0gMDsKKwlvcmdZID0gU1lTTUVUUklDU19DWUJPUkRFUjsKIAltYXhUYWIgPSBtYXhUYWJXaWR0aCA9IDA7CiAKIAkgIC8qIFBhcnNlIGl0ZW1zIHVudGlsIGNvbHVtbiBicmVhayBvciBlbmQgb2YgbWVudSAqLwpAQCAtNDgwLDYgKzUzOSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9NZW51QmFyQ2FsY1NpemUKICAqCisgKiBGSVhNRTogV29yZCA2IGltcGxlbWVudHMgaXQncyBvd24gTURJIGFuZCBpdCdzICdjbG9zZSB3aW5kb3cnIGJpdG1hcAorICogaGVpZ2h0IGlzIG9mZiBieSAxIHBpeGVsIHdoaWNoIGNhdXNlcyBsZW5ndGh5IHdpbmRvdyByZWxvY2F0aW9ucyB3aGVuCisgKiBhY3RpdmUgZG9jdW1lbnQgd2luZG93IGlzIG1heGltaXplZC9yZXN0b3JlZC4KKyAqCiAgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIG1lbnUgYmFyLgogICovCiBzdGF0aWMgdm9pZCBNRU5VX01lbnVCYXJDYWxjU2l6ZSggSERDMzIgaGRjLCBMUFJFQ1QzMiBscHJlY3QsCkBAIC01NDQsNyArNjA3LDYgQEAKICAgICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9EcmF3TWVudUl0ZW0KICAqCkBAIC01NTUsNiArNjE3LDEzIEBACiB7CiAgICAgUkVDVDMyIHJlY3Q7CiAKKyAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfU1lTTUVOVSkKKyAgICB7CisJaWYoICFJc0ljb25pYzMyKGh3bmQpICkgTkNfRHJhd1N5c0J1dHRvbiggaHduZCwgaGRjLCAKKwkJCQlscGl0ZW0tPml0ZW1fZmxhZ3MgJiAoTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QpKTsKKwlyZXR1cm47CisgICAgfQorCiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX09XTkVSRFJBVykKICAgICB7CiAgICAgICAgIERSQVdJVEVNU1RSVUNUMzIgZGlzOwpAQCAtNjIyLDIxICs2OTEsMjMgQEAKIAogICAgIGlmICghbWVudUJhcikKICAgICB7Ci0JICAvKiBEcmF3IHRoZSBjaGVjayBtYXJrICovCisJSU5UMzIJeSA9IHJlY3QudG9wICsgcmVjdC5ib3R0b207CisKKwkgIC8qIERyYXcgdGhlIGNoZWNrIG1hcmsKKwkgICAqCisJICAgKiBDdXN0b20gY2hlY2ttYXJrIGJpdG1hcHMgYXJlIG1vbm9jaHJvbWUgYnV0IG5vdCBhbHdheXMgMWJwcC4gCisJICAgKiBJbiB0aGlzIGNhc2Ugd2Ugd2FudCBHUkFQSF9EcmF3Qml0bWFwKCkgdG8gY29weSBhIHBsYW5lIHdoaWNoIAorCSAgICogaXMgMSBmb3IgYSB3aGl0ZSBwaXhlbCBhbmQgMCBmb3IgYSBibGFjayBvbmUuIAorCSAgICovCiAKIAlpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfQ0hFQ0tFRCkKLQl7Ci0JICAgIEdSQVBIX0RyYXdCaXRtYXAoaGRjLCBscGl0ZW0tPmhDaGVja0JpdCA/IGxwaXRlbS0+aENoZWNrQml0IDoKLQkJCSAgICAgaFN0ZENoZWNrLCByZWN0LmxlZnQsCi0JCQkgICAgIChyZWN0LnRvcCtyZWN0LmJvdHRvbS1jaGVja19iaXRtYXBfaGVpZ2h0KSAvIDIsCi0JCQkgICAgIDAsIDAsIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCApOwotCX0KLQllbHNlIGlmIChscGl0ZW0tPmhVbkNoZWNrQml0ICE9IDApICAvKiBOb3QgY2hlY2tlZCAqLwotCXsKLQkgICAgR1JBUEhfRHJhd0JpdG1hcChoZGMsIGxwaXRlbS0+aFVuQ2hlY2tCaXQsIHJlY3QubGVmdCwKLQkJCSAgICAgKHJlY3QudG9wK3JlY3QuYm90dG9tLWNoZWNrX2JpdG1hcF9oZWlnaHQpIC8gMiwKLQkJCSAgICAgMCwgMCwgY2hlY2tfYml0bWFwX3dpZHRoLCBjaGVja19iaXRtYXBfaGVpZ2h0ICk7Ci0JfQorICAgICAgICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBscGl0ZW0tPnBDQiA/IGxwaXRlbS0+cENCLT5oQ2hlY2tCaXQKKwkJCSAgICAgIDogaFN0ZENoZWNrLCByZWN0LmxlZnQsICh5IC0gY2hlY2tfYml0bWFwX2hlaWdodCkgLyAyLCAKKwkJCSAgICAgIDAsIDAsIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCwgVFJVRSApOworCWVsc2UgaWYgKGxwaXRlbS0+cENCKQorCSAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIGxwaXRlbS0+cENCLT5oVW5DaGVja0JpdCwgcmVjdC5sZWZ0LCAKKwkJCSAgICAgICh5IC0gY2hlY2tfYml0bWFwX2hlaWdodCkgLyAyLCAwLCAwLAorCQkJICAgICAgY2hlY2tfYml0bWFwX3dpZHRoLCBjaGVja19iaXRtYXBfaGVpZ2h0LCBUUlVFICk7CiAKIAkgIC8qIERyYXcgdGhlIHBvcHVwLW1lbnUgYXJyb3cgKi8KIApAQCAtNjQ0LDggKzcxNSw4IEBACiAJewogCSAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIGhTdGRNbkFycm93LAogCQkJICAgICAgcmVjdC5yaWdodC1hcnJvd19iaXRtYXBfd2lkdGgtMSwKLQkJCSAgICAgIChyZWN0LnRvcCtyZWN0LmJvdHRvbS1hcnJvd19iaXRtYXBfaGVpZ2h0KSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBhcnJvd19iaXRtYXBfd2lkdGgsIGFycm93X2JpdG1hcF9oZWlnaHQgKTsKKwkJCSAgICAgICh5IC0gYXJyb3dfYml0bWFwX2hlaWdodCkgLyAyLCAwLCAwLCAKKwkJCSAgICAgIGFycm93X2JpdG1hcF93aWR0aCwgYXJyb3dfYml0bWFwX2hlaWdodCwgRkFMU0UgKTsKIAl9CiAKIAlyZWN0LmxlZnQgKz0gY2hlY2tfYml0bWFwX3dpZHRoOwpAQCAtNjU4LDcgKzcyOSw3IEBACiAgICAgewogCUdSQVBIX0RyYXdCaXRtYXAoIGhkYywgKEhCSVRNQVAzMilscGl0ZW0tPnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LCByZWN0LmJvdHRvbS1yZWN0LnRvcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0LXJlY3QubGVmdCwgcmVjdC5ib3R0b20tcmVjdC50b3AsIEZBTFNFICk7CiAJcmV0dXJuOwogICAgIH0KICAgICAvKiBObyBiaXRtYXAgLSBwcm9jZXNzIHRleHQgaWYgcHJlc2VudCAqLwpAQCAtNzA0LDE3ICs3NzUsNTQgQEAKICAqLwogc3RhdGljIHZvaWQgTUVOVV9EcmF3UG9wdXBNZW51KCBIV05EMzIgaHduZCwgSERDMzIgaGRjLCBITUVOVTMyIGhtZW51ICkKIHsKLSAgICBQT1BVUE1FTlUgKm1lbnU7Ci0gICAgTUVOVUlURU0gKml0ZW07CisgICAgSEJSVVNIMzIgaFByZXZCcnVzaCA9IDA7CiAgICAgUkVDVDMyIHJlY3Q7Ci0gICAgVUlOVDMyIGk7CiAKICAgICBHZXRDbGllbnRSZWN0MzIoIGh3bmQsICZyZWN0ICk7Ci0gICAgRmlsbFJlY3QzMiggaGRjLCAmcmVjdCwgc3lzQ29sb3JPYmplY3RzLmhicnVzaE1lbnUgKTsKLSAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7Ci0gICAgaWYgKCFtZW51IHx8ICFtZW51LT5uSXRlbXMpIHJldHVybjsKLSAgICBmb3IgKGkgPSBtZW51LT5uSXRlbXMsIGl0ZW0gPSBtZW51LT5pdGVtczsgaSA+IDA7IGktLSwgaXRlbSsrKQotCU1FTlVfRHJhd01lbnVJdGVtKCBod25kLCBoZGMsIGl0ZW0sIG1lbnUtPkhlaWdodCwgRkFMU0UgKTsKKyAgICByZWN0LmJvdHRvbSAtPSBQT1BVUF9ZU0hBREUgKiBTWVNNRVRSSUNTX0NZQk9SREVSOworICAgIHJlY3QucmlnaHQgLT0gUE9QVVBfWFNIQURFICogU1lTTUVUUklDU19DWEJPUkRFUjsKKworICAgIGlmKChoUHJldkJydXNoID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgc3lzQ29sb3JPYmplY3RzLmhicnVzaE1lbnUgKSkpCisgICAgeworCUhQRU4zMiBoUHJldlBlbjsKKworCVJlY3RhbmdsZTMyKCBoZGMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tICk7CisJaFByZXZQZW4gPSBTZWxlY3RPYmplY3QzMiggaGRjLCBHZXRTdG9ja09iamVjdDMyKCBOVUxMX1BFTiApICk7CisJaWYoIGhQcmV2UGVuICkKKwl7CisJICAgIElOVDMyIHJvcFByZXYsIGk7CisJICAgIFBPUFVQTUVOVSAqbWVudTsKKworCSAgICAvKiBkcmF3IDMtZCBzaGFkZSAqLworCisJICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhTaGFkZUJydXNoICk7CisJICAgIFNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7CisJICAgIHJvcFByZXYgPSBTZXRST1AyMzIoIGhkYywgUjJfTUFTS1BFTiApOworCisJICAgIGkgPSByZWN0LnJpZ2h0OwkJLyogd2h5IFNldEJydXNoT3JnKCkgZG9lc24ndD8gKi8KKwkgICAgUGF0Qmx0MzIoIGhkYywgaSAmIDB4ZmZmZmZmZmUsIHJlY3QudG9wICsgUE9QVVBfWVNIQURFKlNZU01FVFJJQ1NfQ1lCT1JERVIsIAorCQkgICAgICBpJTIgKyBQT1BVUF9YU0hBREUqU1lTTUVUUklDU19DWEJPUkRFUiwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgMHgwMGEwMDBjOSApOworCSAgICBpID0gcmVjdC5ib3R0b207CisJICAgIFBhdEJsdDMyKCBoZGMsIHJlY3QubGVmdCArIFBPUFVQX1hTSEFERSpTWVNNRVRSSUNTX0NYQk9SREVSLCBpICYgMHhmZmZmZmZmZSwgCisJCSAgICAgIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIGklMiArIFBPUFVQX1lTSEFERSpTWVNNRVRSSUNTX0NZQk9SREVSLCAweDAwYTAwMGM5ICk7CisJICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2UGVuICk7CisJICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2QnJ1c2ggKTsKKwkgICAgU2V0Uk9QMjMyKCBoZGMsIHJvcFByZXYgKTsKKworCSAgICAvKiBkcmF3IG1lbnUgaXRlbXMgKi8KKworCSAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CisJICAgIGlmIChtZW51ICYmIG1lbnUtPm5JdGVtcykKKwkgICAgeworCQlNRU5VSVRFTSAqaXRlbTsKKwkJVUlOVDMyIHU7CisKKwkJZm9yICh1ID0gbWVudS0+bkl0ZW1zLCBpdGVtID0gbWVudS0+aXRlbXM7IHUgPiAwOyB1LS0sIGl0ZW0rKykKKwkJICAgIE1FTlVfRHJhd01lbnVJdGVtKCBod25kLCBoZGMsIGl0ZW0sIG1lbnUtPkhlaWdodCwgRkFMU0UgKTsKKworCSAgICB9CisJfSBlbHNlIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2QnJ1c2ggKTsKKyAgICB9CiB9CiAKIApAQCAtNzUzLDM0ICs4NjEsNjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgTUVOVV9Td2l0Y2hUUFduZFRvCisgKgkgICAgIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwCiAgKi8KLUJPT0wzMiBNRU5VX1N3aXRjaFRQV25kVG8oIEhUQVNLMTYgaFRhc2sgKQorQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiBjaGVja1F1ZXVlLCBXTkQqIHduZE93bmVyICkKIHsKLSAgLyogVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgd2hlbiBwb3B1cCBpcyBoaWRkZW4uIAotICAgKiBBcHBFeGl0KCkgY2FsbHMgd2l0aCBoVGFzayA9PSAwLCBzbyB3ZSBnZXQgdGhlIG5leHQgdG8gY3VycmVudC4KLSAgICovCisgICAvKiBjaGVja1F1ZXVlIHRlbGxzIHVzIHdoZXRoZXIgd2UgaGF2ZSB0byBkaXNjb25uZWN0IHRvcAorICAgICogcG9wdXAgZnJvbSB0aGUgd25kT3duZXIgb3IgKGlmIHRoZSBsYXR0ZXIgaXMgTlVMTCkgZnJvbSAKKyAgICAqIHRoZSBjaGVja1F1ZXVlLiBJZiBjaGVja1F1ZXVlIGlzIDAgdGhlbiB3ZSBuZWVkIHRvIHNldCAKKyAgICAqIHBvcHVwIG93bmVyIHRvIHRoZSB3bmRPd25lci4KKyAgICAqCisgICAgKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCB3aGVuIHRvcCBwb3B1cCBpcyBoaWRkZW4uICovCiAKLSAgVERCKiB0YXNrOworICAgIGlmKCBwVG9wUG9wdXBXbmQgKQorICAgIHsKKwlIVEFTSzE2IGhUYXNrID0gMDsKIAotICBpZiggIXBUb3BQV25kICkgcmV0dXJuIDA7CisJZHByaW50Zl9tZW51KHN0ZGRlYiwicGF0Y2hpbmcgcmVzaWRlbnQgcG9wdXA6ICUwNHgsICUwOHhcbiIsIAorCQkJCSAgIGNoZWNrUXVldWUsICh1bnNpZ25lZCkgd25kT3duZXIpOworCWlmKCB3bmRPd25lciApCisJeworCSAgICBpZiggcFRvcFBvcHVwV25kLT5vd25lciA9PSB3bmRPd25lciApCisJICAgIHsKKwkJaWYoIGNoZWNrUXVldWUgKSBwVG9wUG9wdXBXbmQtPm93bmVyID0gTlVMTDsKKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KKwkKKwkgICAgLyogc3dpdGNoIHRvIHRoZSBuZXcgb3duZXIgKi8KIAotICBpZiggIWhUYXNrICkKLSAgewotICAgIHRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoIChoVGFzayA9IEdldEN1cnJlbnRUYXNrKCkpICk7Ci0gICAgaWYoIHRhc2sgJiYgdGFzay0+aFF1ZXVlID09IHBUb3BQV25kLT5obWVtVGFza1EgKQotCWhUYXNrID0gVEFTS19HZXROZXh0VGFzayhoVGFzayk7IAotICAgIGVsc2UgcmV0dXJuIDA7Ci0gIH0KKwkgICAgaWYoIHduZE93bmVyLT5obWVtVGFza1EgPT0gcFRvcFBvcHVwV25kLT5obWVtVGFza1EgKSAKKwkJcmV0dXJuIFRSVUU7CisJICAgIGhUYXNrID0gUVVFVUVfR2V0UXVldWVUYXNrKCB3bmRPd25lci0+aG1lbVRhc2tRICk7CisJfSAKKwllbHNlIGlmKCBwVG9wUG9wdXBXbmQtPmhtZW1UYXNrUSA9PSBjaGVja1F1ZXVlICkKKwl7CisJICAgIC8qIHN3aXRjaCB0byB0aGUgZGlmZmVyZW50IHRhc2sgKi8KIAotICB0YXNrID0gKFREQiopR2xvYmFsTG9jazE2KGhUYXNrKTsKLSAgaWYoICF0YXNrICkgcmV0dXJuIDA7CisJICAgIGhUYXNrID0gUVVFVUVfR2V0UXVldWVUYXNrKCBwVG9wUG9wdXBXbmQtPmhtZW1UYXNrUSApOworCSAgICBoVGFzayA9IFRBU0tfR2V0TmV4dFRhc2soIGhUYXNrICk7ICAKKwl9CiAKLSAgLyogaWYgdGhpcyB0YXNrIGdvdCBhcyBmYXIgYXMgbWVudSB0cmFja2luZyBpdCBtdXN0IGhhdmUgYSBxdWV1ZSAqLworCWlmKCBoVGFzayApCisJeworCSAgICBUREIqIHRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CiAKLSAgcFRvcFBXbmQtPmhJbnN0YW5jZSA9IHRhc2stPmhJbnN0YW5jZTsKLSAgcFRvcFBXbmQtPmhtZW1UYXNrUSA9IHRhc2stPmhRdWV1ZTsKLSAgcmV0dXJuIDE7CisJICAgIHBUb3BQb3B1cFduZC0+b3duZXIgPSB3bmRPd25lcjsKKwkgICAgaWYoIHRhc2sgKQorCSAgICB7CisJCXBUb3BQb3B1cFduZC0+aEluc3RhbmNlID0gdGFzay0+aEluc3RhbmNlOworCQlwVG9wUG9wdXBXbmQtPmhtZW1UYXNrUSA9IHRhc2stPmhRdWV1ZTsKKwkJcmV0dXJuIFRSVUU7CisJICAgIH0gCisJICAgIGVsc2UgZHByaW50Zl9tZW51KHN0ZGRlYiwiZmFpbGVkIHRvIHBhdGNoIHJlc2lkZW50IHBvcHVwLlxuIik7CisJfSAKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc5Miw5ICs5MjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSwgSU5UMzIgeGFuY2hvciwgSU5UMzIgeWFuY2hvciApCiB7CiAgICAgUE9QVVBNRU5VIAkqbWVudTsKLSAgICBXTkQgCSp3bmRQdHIgPSBOVUxMOwotICAgIEJPT0wzMgkgc2tpcF9pbml0ID0gMDsKLSAgICBVSU5UMzIJIHdpZHRoLCBoZWlnaHQ7CisgICAgV05EIAkqd25kT3duZXIgPSBOVUxMOwogCiAgICAgaWYgKCEobWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNKQpAQCAtODAyLDgyICs5MzQsODggQEAKIAltZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyAmPSB+KE1GX0hJTElURXxNRl9NT1VTRVNFTEVDVCk7CiAJbWVudS0+Rm9jdXNlZEl0ZW0gPSBOT19TRUxFQ1RFRF9JVEVNOwogICAgIH0KKwogICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTTE2KWhtZW51LAogICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBpZCwgKG1lbnUtPndGbGFncyAmIE1GX1NZU01FTlUpID8gMSA6IDAgKSk7Ci0gICAgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggbWVudSwgaHduZE93bmVyICk7CiAKLSAgICAvKiBhZGp1c3QgcG9wdXAgbWVudSBwb3Mgc28gdGhhdCBpdCBmaXRzIHdpdGhpbiB0aGUgZGVza3RvcCAqLwotCi0gICAgd2lkdGggPSBtZW51LT5XaWR0aCArIDIqU1lTTUVUUklDU19DWEJPUkRFUjsKLSAgICBoZWlnaHQgPSBtZW51LT5IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVI7IAotCi0gICAgaWYoIHggKyB3aWR0aCA+IFNZU01FVFJJQ1NfQ1hTQ1JFRU4gKQorICAgIGlmKCAod25kT3duZXIgPSBXSU5fRmluZFduZFB0ciggaHduZE93bmVyICkpICkKICAgICB7Ci0JaWYoIHhhbmNob3IgKQotICAgICAgICAgICAgeCAtPSB3aWR0aCAtIHhhbmNob3I7Ci0gICAgICAgIGlmKCB4ICsgd2lkdGggPiBTWVNNRVRSSUNTX0NYU0NSRUVOKQotCSAgICB4ID0gU1lTTUVUUklDU19DWFNDUkVFTiAtIHdpZHRoOwotICAgIH0KLSAgICBpZiggeCA8IDAgKQotICAgICAgICAgeCA9IDA7CisJVUlOVDMyCXdpZHRoLCBoZWlnaHQ7CiAKLSAgICBpZiggeSArIGhlaWdodCA+IFNZU01FVFJJQ1NfQ1lTQ1JFRU4gKQotICAgIHsgCi0JaWYoIHlhbmNob3IgKQotCSAgICB5IC09IGhlaWdodCArIHlhbmNob3I7CisJTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggbWVudSwgaHduZE93bmVyICk7CisKKwkvKiBhZGp1c3QgcG9wdXAgbWVudSBwb3Mgc28gdGhhdCBpdCBmaXRzIHdpdGhpbiB0aGUgZGVza3RvcCAqLworCisJd2lkdGggPSBtZW51LT5XaWR0aCArIFNZU01FVFJJQ1NfQ1hCT1JERVI7CisJaGVpZ2h0ID0gbWVudS0+SGVpZ2h0ICsgU1lTTUVUUklDU19DWUJPUkRFUjsgCisKKwlpZiggeCArIHdpZHRoID4gU1lTTUVUUklDU19DWFNDUkVFTiApCisJeworCSAgICBpZiggeGFuY2hvciApCisgICAgICAgICAgICAJeCAtPSB3aWR0aCAtIHhhbmNob3I7CisgICAgICAgICAgICBpZiggeCArIHdpZHRoID4gU1lTTUVUUklDU19DWFNDUkVFTikKKwkgICAgCXggPSBTWVNNRVRSSUNTX0NYU0NSRUVOIC0gd2lkdGg7CisJfQorCWlmKCB4IDwgMCApIHggPSAwOworCiAJaWYoIHkgKyBoZWlnaHQgPiBTWVNNRVRSSUNTX0NZU0NSRUVOICkKLQkgICAgeSA9IFNZU01FVFJJQ1NfQ1lTQ1JFRU4gLSBoZWlnaHQ7Ci0gICAgfQotICAgIGlmKCB5IDwgMCApCi0JeSA9IDA7CisJeyAKKwkgICAgaWYoIHlhbmNob3IgKQorCSAgICAJeSAtPSBoZWlnaHQgKyB5YW5jaG9yOworCSAgICBpZiggeSArIGhlaWdodCA+IFNZU01FVFJJQ1NfQ1lTQ1JFRU4gKQorCSAgICAJeSA9IFNZU01FVFJJQ1NfQ1lTQ1JFRU4gLSBoZWlnaHQ7CisJfQorCWlmKCB5IDwgMCApIHkgPSAwOwogCi0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmRPd25lciApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CisJd2lkdGggKz0gUE9QVVBfWFNIQURFICogU1lTTUVUUklDU19DWEJPUkRFUjsJLyogYWRkIHNwYWNlIGZvciBzaGFkaW5nICovCisJaGVpZ2h0ICs9IFBPUFVQX1lTSEFERSAqIFNZU01FVFJJQ1NfQ1lCT1JERVI7CiAKLSAgICBpZiAoIXBUb3BQV25kKQotICAgIHsKLQlwVG9wUFduZCA9IFdJTl9GaW5kV25kUHRyKENyZWF0ZVdpbmRvdzMyQSggUE9QVVBNRU5VX0NMQVNTX0FUT00sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19QT1BVUCB8IFdTX0JPUkRFUiwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kT3duZXIsIDAsIHduZFB0ci0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRClobWVudSApKTsKLQlpZiAoIXBUb3BQV25kKSByZXR1cm4gRkFMU0U7Ci0Jc2tpcF9pbml0ID0gVFJVRTsKLSAgICB9CisJLyogTk9URTogSW4gV2luZG93cywgdG9wIG1lbnUgcG9wdXAgaXMgbm90IG93bmVkLiAqLworCWlmICghcFRvcFBvcHVwV25kKQkvKiBjcmVhdGUgdG9wIGxldmVsIHBvcHVwIG1lbnUgd2luZG93ICovCisJeworCSAgICBhc3NlcnQoIHVTdWJQV25kTGV2ZWwgPT0gMCApOwogCi0gICAgaWYoIHVTdWJQV25kTGV2ZWwgKQotICAgIHsKLQkvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIHN1Ym1lbnUgKi8KLQlIV05EMzIgaFduZCA9IENyZWF0ZVdpbmRvdzMyQSggUE9QVVBNRU5VX0NMQVNTX0FUT00sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTX1BPUFVQIHwgV1NfQk9SREVSLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LT5oV25kLCAwLCB3bmRQdHItPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRClobWVudSApOwotCWlmKCAhaFduZCApIHJldHVybiBGQUxTRTsKLQltZW51LT5oV25kID0gaFduZDsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0JaWYoICFza2lwX2luaXQgKQotCSAgewotICAgICAgICAgICAgTUVOVV9Td2l0Y2hUUFduZFRvKEdldEN1cnJlbnRUYXNrKCkpOwotCSAgICBTZW5kTWVzc2FnZTE2KCBwVG9wUFduZC0+aHduZFNlbGYsIFdNX1VTRVIsIChXUEFSQU0xNilobWVudSwgMEwpOwotCSAgfQotCW1lbnUtPmhXbmQgPSBwVG9wUFduZC0+aHduZFNlbGY7Ci0gICAgfQorCSAgICBwVG9wUG9wdXBXbmQgPSBXSU5fRmluZFduZFB0cihDcmVhdGVXaW5kb3czMkEoIFBPUFVQTUVOVV9DTEFTU19BVE9NLCBOVUxMLAorCQkJCQkgIFdTX1BPUFVQLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkgIGh3bmRPd25lciwgMCwgd25kT3duZXItPmhJbnN0YW5jZSwKKwkJCQkJICAoTFBWT0lEKWhtZW51ICkpOworCSAgICBpZiAoIXBUb3BQb3B1cFduZCkgcmV0dXJuIEZBTFNFOworCSAgICBtZW51LT5oV25kID0gcFRvcFBvcHVwV25kLT5od25kU2VsZjsKKwl9IAorCWVsc2UKKwkgICAgaWYoIHVTdWJQV25kTGV2ZWwgKQorCSAgICB7CisJCS8qIGNyZWF0ZSBhIG5ldyB3aW5kb3cgZm9yIHRoZSBzdWJtZW51ICovCiAKLSAgICB1U3ViUFduZExldmVsKys7CisJCW1lbnUtPmhXbmQgPSBDcmVhdGVXaW5kb3czMkEoIFBPUFVQTUVOVV9DTEFTU19BVE9NLCBOVUxMLAorCQkJCQkgIFdTX1BPUFVQLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkgIG1lbnUtPmhXbmQsIDAsIHduZE93bmVyLT5oSW5zdGFuY2UsCisJCQkJCSAgKExQVk9JRClobWVudSApOworCQlpZiggIW1lbnUtPmhXbmQgKSByZXR1cm4gRkFMU0U7CisJICAgIH0KKwkgICAgZWxzZSAvKiB0b3AgbGV2ZWwgcG9wdXAgbWVudSB3aW5kb3cgYWxyZWFkeSBleGlzdHMgKi8KKwkgICAgeworCQltZW51LT5oV25kID0gcFRvcFBvcHVwV25kLT5od25kU2VsZjsKIAotICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtZW51LT5oV25kICk7CisJCU1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCAwLCB3bmRPd25lciApOworCQlTZW5kTWVzc2FnZTE2KCBwVG9wUG9wdXBXbmQtPmh3bmRTZWxmLCBNTV9TRVRNRU5VSEFORExFLCAoV1BBUkFNMTYpaG1lbnUsIDBMKTsJCiAKLSAgICBTZXRXaW5kb3dQb3MzMihtZW51LT5oV25kLCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAotCQkgIAkJICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcpOworCQkvKiBhZGp1c3QgaXRzIHNpemUgKi8KKworCSAgICAgICAgU2V0V2luZG93UG9zMzIoIG1lbnUtPmhXbmQsIDAsIHgsIHksIHdpZHRoLCBoZWlnaHQsCisJCQkJU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcpOworCSAgICB9CisKKwl1U3ViUFduZExldmVsKys7CS8qIG1lbnUgbGV2ZWwgY291bnRlciAqLworCiAgICAgICAvKiBEaXNwbGF5IHRoZSB3aW5kb3cgKi8KIAotICAgIFNldFdpbmRvd1BvczMyKCBtZW51LT5oV25kLCBIV05EX1RPUCwgMCwgMCwgMCwgMCwKLQkJICAgIFNXUF9TSE9XV0lORE9XIHwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSApOwotICAgIFVwZGF0ZVdpbmRvdzMyKCBtZW51LT5oV25kICk7Ci0gICAgcmV0dXJuIFRSVUU7CisJU2V0V2luZG93UG9zMzIoIG1lbnUtPmhXbmQsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAorCQkJU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFICk7CisJVXBkYXRlV2luZG93MzIoIG1lbnUtPmhXbmQgKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTg5MiwxMCArMTAzMCwxMSBAQAogCiAgICAgbHBwb3AgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKICAgICBpZiAoIWxwcG9wLT5uSXRlbXMpIHJldHVybjsKKwogICAgIGlmICgod0luZGV4ICE9IE5PX1NFTEVDVEVEX0lURU0pICYmIAotCSh3SW5kZXggIT0gU1lTTUVOVV9TRUxFQ1RFRCkgJiYKIAkobHBwb3AtPml0ZW1zW3dJbmRleF0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJd0luZGV4ID0gTk9fU0VMRUNURURfSVRFTTsKKwogICAgIGlmIChscHBvcC0+Rm9jdXNlZEl0ZW0gPT0gd0luZGV4KSByZXR1cm47CiAgICAgaWYgKGxwcG9wLT53RmxhZ3MgJiBNRl9QT1BVUCkgaGRjID0gR2V0REMzMiggbHBwb3AtPmhXbmQgKTsKICAgICBlbHNlIGhkYyA9IEdldERDRXgzMiggbHBwb3AtPmhXbmQsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cpOwpAQCAtOTAzLDEwNCArMTA0Miw4MyBAQAogICAgICAgLyogQ2xlYXIgcHJldmlvdXMgaGlnaGxpZ2h0ZWQgaXRlbSAqLwogICAgIGlmIChscHBvcC0+Rm9jdXNlZEl0ZW0gIT0gTk9fU0VMRUNURURfSVRFTSkgCiAgICAgewotCWlmIChscHBvcC0+Rm9jdXNlZEl0ZW0gPT0gU1lTTUVOVV9TRUxFQ1RFRCkKLQkgICAgTkNfRHJhd1N5c0J1dHRvbiggbHBwb3AtPmhXbmQsIGhkYywgRkFMU0UgKTsKLQllbHNlCi0JewotCSAgICBscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzICY9fihNRl9ISUxJVEV8TUZfTU9VU0VTRUxFQ1QpOwotCSAgICBNRU5VX0RyYXdNZW51SXRlbShscHBvcC0+aFduZCxoZGMsJmxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBwb3AtPkhlaWdodCwgIShscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICk7Ci0JfQorCWxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1fZmxhZ3MgJj1+KE1GX0hJTElURXxNRl9NT1VTRVNFTEVDVCk7CisJTUVOVV9EcmF3TWVudUl0ZW0obHBwb3AtPmhXbmQsaGRjLCZscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHBwb3AtPkhlaWdodCwgIShscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICk7CiAgICAgfQogCiAgICAgICAvKiBIaWdobGlnaHQgbmV3IGl0ZW0gKGlmIGFueSkgKi8KICAgICBscHBvcC0+Rm9jdXNlZEl0ZW0gPSB3SW5kZXg7CiAgICAgaWYgKGxwcG9wLT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNKSAKICAgICB7Ci0JaWYgKGxwcG9wLT5Gb2N1c2VkSXRlbSA9PSBTWVNNRU5VX1NFTEVDVEVEKQotICAgICAgICB7Ci0JICAgIE5DX0RyYXdTeXNCdXR0b24oIGxwcG9wLT5oV25kLCBoZGMsIFRSVUUgKTsKLSAgICAgICAgICAgIGlmIChzZW5kTWVudVNlbGVjdCkKLSAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTE2KCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9GaW5kV25kUHRyKGxwcG9wLT5oV25kKS0+aFN5c01lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGxwcG9wLT53RmxhZ3MgfCBNRl9NT1VTRVNFTEVDVCwgaG1lbnUpKTsKLSAgICAgICAgfQotCWVsc2UKLQl7Ci0JICAgIGxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1fZmxhZ3MgfD0gTUZfSElMSVRFOwotCSAgICBNRU5VX0RyYXdNZW51SXRlbSggbHBwb3AtPmhXbmQsIGhkYywgJmxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcG9wLT5IZWlnaHQsICEobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSApOwotICAgICAgICAgICAgaWYgKHNlbmRNZW51U2VsZWN0KQotCSAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggbHBwb3AtPml0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSkpOwotCX0KKwlscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzIHw9IE1GX0hJTElURTsKKwlNRU5VX0RyYXdNZW51SXRlbSggbHBwb3AtPmhXbmQsIGhkYywgJmxwcG9wLT5pdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBwb3AtPkhlaWdodCwgIShscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICk7CisgICAgICAgIGlmIChzZW5kTWVudVNlbGVjdCkKKwkgICAgU2VuZE1lc3NhZ2UxNiggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBwb3AtPml0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBscHBvcC0+aXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51KSk7CiAgICAgfQogICAgIGVsc2UgaWYgKHNlbmRNZW51U2VsZWN0KQogICAgICAgICBTZW5kTWVzc2FnZTE2KCBod25kT3duZXIsIFdNX01FTlVTRUxFQ1QsIGhtZW51LAotICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggbHBwb3AtPndGbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSApICk7CisgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBscHBvcC0+d0ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51ICkgKTsgCiAKICAgICBSZWxlYXNlREMzMiggbHBwb3AtPmhXbmQsIGhkYyApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1FTlVfU2VsZWN0SXRlbVJlbAorICogICAgICAgICAgIE1FTlVfTW92ZVNlbGVjdGlvbgogICoKKyAqIE1vdmVzIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIGFjY29yZGluZyB0byB0aGUgb2Zmc2V0IHBhcmFtZXRlci4KKyAqIElmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiB0aGVuIGl0IHNob3VsZCBzZWxlY3QgdGhlIGxhc3QgaXRlbSBpZgorICogb2Zmc2V0IGlzIElURU1fUFJFViBvciB0aGUgZmlyc3QgaXRlbSBpZiBvZmZzZXQgaXMgSVRFTV9ORVhULgogICovCi1zdGF0aWMgdm9pZCBNRU5VX1NlbGVjdEl0ZW1SZWwoIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsIElOVDMyIG9mZnNldCApCitzdGF0aWMgdm9pZCBNRU5VX01vdmVTZWxlY3Rpb24oIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsIElOVDMyIG9mZnNldCApCiB7Ci0gICAgSU5UMzIgaSwgbWluID0gMDsKKyAgICBJTlQzMiBpOwogICAgIFBPUFVQTUVOVSAqbWVudTsKIAogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKICAgICBpZiAoIW1lbnUtPml0ZW1zKSByZXR1cm47Ci0gICAgaWYgKChtZW51LT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNKSAmJgotCShtZW51LT5Gb2N1c2VkSXRlbSAhPSBTWVNNRU5VX1NFTEVDVEVEKSkKKworICAgIGlmICggbWVudS0+Rm9jdXNlZEl0ZW0gIT0gTk9fU0VMRUNURURfSVRFTSApCiAgICAgeworCWlmKCBtZW51LT5uSXRlbXMgPT0gMSApIHJldHVybjsgZWxzZQogCWZvciAoaSA9IG1lbnUtPkZvY3VzZWRJdGVtICsgb2Zmc2V0IDsgaSA+PSAwICYmIGkgPCBtZW51LT5uSXRlbXMgCiAJCQkJCSAgICA7IGkgKz0gb2Zmc2V0KQotCXsKIAkgICAgaWYgKCEobWVudS0+aXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJICAgIHsKIAkJTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBpLCBUUlVFICk7CiAJCXJldHVybjsKIAkgICAgfQotCX0KLQotCWlmIChNRU5VX0hhc1N5c01lbnUoIG1lbnUgKSkKLQl7Ci0JICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgU1lTTUVOVV9TRUxFQ1RFRCwgVFJVRSApOwotCSAgICByZXR1cm47Ci0JfQogICAgIH0KIAotICAgIGlmKCBvZmZzZXQgPiAwICkgeyBpID0gMDsgbWluID0gLTE7IH0KLSAgICBlbHNlIGkgPSBtZW51LT5uSXRlbXMgLSAxOwotICAgICAKLSAgICBmb3IgKCA7IGkgPiBtaW4gJiYgaSA8IG1lbnUtPm5JdGVtcyA7IGkgKz0gb2Zmc2V0KQotICAgIHsKKyAgICBmb3IgKCBpID0gKG9mZnNldCA+IDApID8gMCA6IG1lbnUtPm5JdGVtcyAtIDE7IAorCQkgIGkgPj0gMCAmJiBpIDwgbWVudS0+bkl0ZW1zIDsgaSArPSBvZmZzZXQpCiAJaWYgKCEobWVudS0+aXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJewogCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGksIFRSVUUgKTsKIAkgICAgcmV0dXJuOwogCX0KLSAgICB9Ci0gICAgaWYgKE1FTlVfSGFzU3lzTWVudSggbWVudSApKQotICAgICAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIFNZU01FTlVfU0VMRUNURUQsIFRSVUUgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBNRU5VX1NldEl0ZW1EYXRhCiAgKgotICogU2V0IGFuIGl0ZW0gZmxhZ3MsIGlkIGFuZCB0ZXh0IHB0ci4KKyAqIFNldCBhbiBpdGVtIGZsYWdzLCBpZCBhbmQgdGV4dCBwdHIuIENhbGxlZCBieSBJbnNlcnRNZW51KCkgYW5kCisgKiBNb2RpZnlNZW51KCkuCiAgKi8KIHN0YXRpYyBCT09MMzIgTUVOVV9TZXRJdGVtRGF0YSggTUVOVUlURU0gKml0ZW0sIFVJTlQzMiBmbGFncywgVUlOVDMyIGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgc3RyICkKIHsKICAgICBMUFNUUiBwcmV2VGV4dCA9IElTX1NUUklOR19JVEVNKGl0ZW0tPml0ZW1fZmxhZ3MpID8gaXRlbS0+dGV4dCA6IE5VTEw7CiAKKyAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJTZXRJdGVtRGF0YTogJTA0eCBbJTA4eF0gJyVzJyAgLT4gJTA0eCBbJTA4eF0gJyVzJ1xuIiwKKwkJIGl0ZW0tPml0ZW1fZmxhZ3MsIGl0ZW0tPml0ZW1faWQsIGl0ZW0tPnRleHQgPyBpdGVtLT50ZXh0IDogIiIsCisJCSBmbGFncywgaWQsIHN0ciA/IHN0ciA6ICIiICk7CisKICAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpKQogICAgIHsKICAgICAgICAgaWYgKCFzdHIpCkBAIC0xMDI1LDggKzExNDMsMjAgQEAKICAgICBlbHNlIGlmIChmbGFncyAmIE1GX09XTkVSRFJBVykgaXRlbS0+dGV4dCA9IChMUFNUUilzdHI7CiAgICAgZWxzZSBpdGVtLT50ZXh0ID0gTlVMTDsKIAorICAgIGlmIChpdGVtLT5pdGVtX2ZsYWdzICYgTUZfUE9QVVAgJiYgaXRlbS0+aXRlbV9pZCAhPSBpZCApCisJRGVzdHJveU1lbnUzMiggKEhNRU5VMzIpaXRlbS0+aXRlbV9pZCApOyAgIC8qIE1vZGlmeU1lbnUoKSBzcGVjICovCisKKyAgICBpZiAoZmxhZ3MgJiBNRl9QT1BVUCkKKyAgICB7CisJUE9QVVBNRU5VKgltZW51ID0gKFBPUFVQTUVOVSAqKVVTRVJfSEVBUF9MSU5fQUREUigoVUlOVDE2KWlkKTsKKwlpZiggbWVudSAmJiBtZW51LT53TWFnaWMgPT0gTUVOVV9NQUdJQykgbWVudS0+d0ZsYWdzIHw9IE1GX1BPUFVQOworCWVsc2UKKwkgICAgcmV0dXJuIChpdGVtLT5pdGVtX2lkID0gaXRlbS0+aXRlbV9mbGFncyA9IEZBTFNFKTsKKyAgICB9CisKICAgICBpdGVtLT5pdGVtX2ZsYWdzID0gZmxhZ3MgJiB+KE1GX0hJTElURSB8IE1GX01PVVNFU0VMRUNUKTsKICAgICBpdGVtLT5pdGVtX2lkICAgID0gaWQ7CisKICAgICBTZXRSZWN0RW1wdHkzMiggJml0ZW0tPnJlY3QgKTsKICAgICBpZiAocHJldlRleHQpIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBwcmV2VGV4dCApOwogICAgIHJldHVybiBUUlVFOwpAQCAtMTE1NSwxNCArMTI4NSwxNCBAQAogICAgIE1FTlVJVEVNICppdGVtOwogCiAgICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOworCiAgICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pIHJldHVybiAwOwotICAgIGVsc2UgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCi0JcmV0dXJuIFdJTl9GaW5kV25kUHRyKG1lbnUtPmhXbmQpLT5oU3lzTWVudTsKIAogICAgIGl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOwotICAgIGlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgfHwgIShpdGVtLT5pdGVtX2ZsYWdzICYgTUZfTU9VU0VTRUxFQ1QpKQotCXJldHVybiAwOwotICAgIHJldHVybiAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOworICAgIGlmICgoaXRlbS0+aXRlbV9mbGFncyAmIChNRl9QT1BVUCB8IE1GX01PVVNFU0VMRUNUKSkKKwkJCSA9PSAoTUZfUE9QVVAgfCBNRl9NT1VTRVNFTEVDVCkpCisJcmV0dXJuIChITUVOVTMyKWl0ZW0tPml0ZW1faWQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTE3NCwzNiArMTMwNCwzNyBAQAogc3RhdGljIHZvaWQgTUVOVV9IaWRlU3ViUG9wdXBzKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgc2VuZE1lbnVTZWxlY3QgKQogewotICAgIE1FTlVJVEVNICppdGVtOwotICAgIFBPUFVQTUVOVSAqbWVudSwgKnN1Ym1lbnU7Ci0gICAgSE1FTlUzMiBoc3VibWVudTsKKyAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOzsKIAotICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKSkpIHJldHVybjsKLSAgICBpZiAobWVudS0+Rm9jdXNlZEl0ZW0gPT0gTk9fU0VMRUNURURfSVRFTSkgcmV0dXJuOwotICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSA9PSBTWVNNRU5VX1NFTEVDVEVEKQorICAgIGlmIChtZW51ICYmIHVTdWJQV25kTGV2ZWwpCiAgICAgewotCWhzdWJtZW51ID0gV0lOX0ZpbmRXbmRQdHIobWVudS0+aFduZCktPmhTeXNNZW51OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCWl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOwotCWlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgfHwKLQkgICAgIShpdGVtLT5pdGVtX2ZsYWdzICYgTUZfTU9VU0VTRUxFQ1QpKSByZXR1cm47Ci0JaXRlbS0+aXRlbV9mbGFncyAmPSB+TUZfTU9VU0VTRUxFQ1Q7Ci0JaHN1Ym1lbnUgPSAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOwotICAgIH0KLSAgICBzdWJtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhzdWJtZW51ICk7Ci0gICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhzdWJtZW51LCBGQUxTRSApOwotICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBoc3VibWVudSwgTk9fU0VMRUNURURfSVRFTSwgc2VuZE1lbnVTZWxlY3QgKTsKLSAgICBpZiAoc3VibWVudS0+aFduZCA9PSBwVG9wUFduZC0+aHduZFNlbGYgKSAKLSAgICB7Ci0JU2hvd1dpbmRvdzMyKCBzdWJtZW51LT5oV25kLCBTV19ISURFICk7Ci0JdVN1YlBXbmRMZXZlbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JRGVzdHJveVdpbmRvdzMyKCBzdWJtZW51LT5oV25kICk7Ci0Jc3VibWVudS0+aFduZCA9IDA7CisJSE1FTlUzMiBoc3VibWVudTsKKwlQT1BVUE1FTlUgKnN1Ym1lbnU7CisJTUVOVUlURU0gKml0ZW07CisKKwlpZiAobWVudS0+Rm9jdXNlZEl0ZW0gIT0gTk9fU0VMRUNURURfSVRFTSkKKwl7CisJICAgIGl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOworCSAgICBpZiAoIShpdGVtLT5pdGVtX2ZsYWdzICYgTUZfUE9QVVApIHx8CisJCSEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX01PVVNFU0VMRUNUKSkgcmV0dXJuOworCSAgICBpdGVtLT5pdGVtX2ZsYWdzICY9IH5NRl9NT1VTRVNFTEVDVDsKKwkgICAgaHN1Ym1lbnUgPSAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOworCX0gZWxzZSByZXR1cm47CisKKwlzdWJtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhzdWJtZW51ICk7CisJTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhzdWJtZW51LCBGQUxTRSApOworCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBoc3VibWVudSwgTk9fU0VMRUNURURfSVRFTSwgc2VuZE1lbnVTZWxlY3QgKTsKKworCWlmIChzdWJtZW51LT5oV25kID09IHBUb3BQb3B1cFduZC0+aHduZFNlbGYgKSAKKwl7CisJICAgIFNob3dXaW5kb3czMiggc3VibWVudS0+aFduZCwgU1dfSElERSApOworCSAgICB1U3ViUFduZExldmVsID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgRGVzdHJveVdpbmRvdzMyKCBzdWJtZW51LT5oV25kICk7CisJICAgIHN1Ym1lbnUtPmhXbmQgPSAwOworCX0KICAgICB9CiB9CiAKQEAgLTEyMTcsODYgKzEzNDgsODcgQEAKIHN0YXRpYyBITUVOVTMyIE1FTlVfU2hvd1N1YlBvcHVwKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBzZWxlY3RGaXJzdCApCiB7CisgICAgUkVDVDMyIHJlY3Q7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFdORCAqd25kUHRyOwogCiAgICAgaWYgKCEobWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApKSkgcmV0dXJuIGhtZW51OwotICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtZW51LT5oV25kICkpKSByZXR1cm4gaG1lbnU7Ci0gICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pIHJldHVybiBobWVudTsKLSAgICBpZiAobWVudS0+Rm9jdXNlZEl0ZW0gPT0gU1lTTUVOVV9TRUxFQ1RFRCkKLSAgICB7Ci0JTUVOVV9Jbml0U3lzTWVudVBvcHVwKHduZFB0ci0+aFN5c01lbnUsIHduZFB0ci0+ZHdTdHlsZSwKLQkJCQl3bmRQdHItPmNsYXNzLT5zdHlsZSk7Ci0JTUVOVV9TaG93UG9wdXAoaHduZE93bmVyLCB3bmRQdHItPmhTeXNNZW51LCAwLCB3bmRQdHItPnJlY3RDbGllbnQubGVmdCwKLQkJd25kUHRyLT5yZWN0Q2xpZW50LnRvcCAtIG1lbnUtPkhlaWdodCAtIDIqU1lTTUVUUklDU19DWUJPUkRFUiwKLQkJU1lTTUVUUklDU19DWFNJWkUsIFNZU01FVFJJQ1NfQ1lTSVpFICk7Ci0JaWYgKHNlbGVjdEZpcnN0KQotICAgICAgICAgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCBod25kT3duZXIsIHduZFB0ci0+aFN5c01lbnUsIElURU1fTkVYVCApOwotCXJldHVybiB3bmRQdHItPmhTeXNNZW51OwotICAgIH0KKworICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBtZW51LT5oV25kICkpIHx8CisgICAgICAgICAobWVudS0+Rm9jdXNlZEl0ZW0gPT0gTk9fU0VMRUNURURfSVRFTSkpIHJldHVybiBobWVudTsKKwogICAgIGl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOwogICAgIGlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgfHwKLQkoaXRlbS0+aXRlbV9mbGFncyAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCkpKSByZXR1cm4gaG1lbnU7CisgICAgICAgICAoaXRlbS0+aXRlbV9mbGFncyAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCkpKSByZXR1cm4gaG1lbnU7CiAgICAgaXRlbS0+aXRlbV9mbGFncyB8PSBNRl9NT1VTRVNFTEVDVDsKLSAgICBpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApCisKKyAgICBpZiAoSVNfU1lTVEVNX01FTlUobWVudSkpCiAgICAgewotCU1FTlVfU2hvd1BvcHVwKCBod25kT3duZXIsIChITUVOVTE2KWl0ZW0tPml0ZW1faWQsIG1lbnUtPkZvY3VzZWRJdGVtLAotCQkgd25kUHRyLT5yZWN0V2luZG93LmxlZnQgKyBpdGVtLT5yZWN0LnJpZ2h0LWFycm93X2JpdG1hcF93aWR0aCwKLQkJIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKyBpdGVtLT5yZWN0LnRvcCwKLQkJIGl0ZW0tPnJlY3QubGVmdCAtIGl0ZW0tPnJlY3QucmlnaHQgKyAyKmFycm93X2JpdG1hcF93aWR0aCwgCi0JCSBpdGVtLT5yZWN0LnRvcCAtIGl0ZW0tPnJlY3QuYm90dG9tICk7CisJTUVOVV9Jbml0U3lzTWVudVBvcHVwKChITUVOVTE2KWl0ZW0tPml0ZW1faWQsIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5jbGFzcy0+c3R5bGUpOworCisJTkNfR2V0U3lzUG9wdXBQb3MoIHduZFB0ciwgJnJlY3QgKTsKKwlyZWN0LnRvcCA9IHJlY3QuYm90dG9tOworCXJlY3QucmlnaHQgPSBTWVNNRVRSSUNTX0NYU0laRTsgcmVjdC5ib3R0b20gPSBTWVNNRVRSSUNTX0NZU0laRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlNRU5VX1Nob3dQb3B1cCggaHduZE93bmVyLCAoSE1FTlUxNilpdGVtLT5pdGVtX2lkLCBtZW51LT5Gb2N1c2VkSXRlbSwKLQkJICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArIGl0ZW0tPnJlY3QubGVmdCwKLQkJICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wICsgaXRlbS0+cmVjdC5ib3R0b20sCi0JCQlpdGVtLT5yZWN0LnJpZ2h0IC0gaXRlbS0+cmVjdC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+cmVjdC5ib3R0b20gLSBpdGVtLT5yZWN0LnRvcCApOworCWlmIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkKKwl7CisJICAgIHJlY3QubGVmdCA9IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICsgaXRlbS0+cmVjdC5yaWdodC1hcnJvd19iaXRtYXBfd2lkdGg7CisJICAgIHJlY3QudG9wID0gd25kUHRyLT5yZWN0V2luZG93LnRvcCArIGl0ZW0tPnJlY3QudG9wOworCSAgICByZWN0LnJpZ2h0ID0gaXRlbS0+cmVjdC5sZWZ0IC0gaXRlbS0+cmVjdC5yaWdodCArIDIqYXJyb3dfYml0bWFwX3dpZHRoOworCSAgICByZWN0LmJvdHRvbSA9IGl0ZW0tPnJlY3QudG9wIC0gaXRlbS0+cmVjdC5ib3R0b207CisJfQorCWVsc2UKKwl7CisJICAgIHJlY3QubGVmdCA9IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICsgaXRlbS0+cmVjdC5sZWZ0OworCSAgICByZWN0LnRvcCA9IHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKyBpdGVtLT5yZWN0LmJvdHRvbTsKKwkgICAgcmVjdC5yaWdodCA9IGl0ZW0tPnJlY3QucmlnaHQgLSBpdGVtLT5yZWN0LmxlZnQ7CisJICAgIHJlY3QuYm90dG9tID0gaXRlbS0+cmVjdC5ib3R0b20gLSBpdGVtLT5yZWN0LnRvcDsKKwl9CiAgICAgfQorCisgICAgTUVOVV9TaG93UG9wdXAoIGh3bmRPd25lciwgKEhNRU5VMTYpaXRlbS0+aXRlbV9pZCwgbWVudS0+Rm9jdXNlZEl0ZW0sCisJCSAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSApOwogICAgIGlmIChzZWxlY3RGaXJzdCkKLSAgICAgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCBod25kT3duZXIsIChITUVOVTMyKWl0ZW0tPml0ZW1faWQsIElURU1fTkVYVCApOworICAgICAgICBNRU5VX01vdmVTZWxlY3Rpb24oIGh3bmRPd25lciwgKEhNRU5VMzIpaXRlbS0+aXRlbV9pZCwgSVRFTV9ORVhUICk7CiAgICAgcmV0dXJuIChITUVOVTMyKWl0ZW0tPml0ZW1faWQ7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTUVOVV9GaW5kTWVudUJ5Q29vcmRzCisgKiAgICAgICAgICAgTUVOVV9QdE1lbnUKICAqCi0gKiBGaW5kIHRoZSBtZW51IGNvbnRhaW5pbmcgYSBnaXZlbiBwb2ludCAoaW4gc2NyZWVuIGNvb3JkcykuCisgKiBXYWxrcyBtZW51IGNoYWluIHRyeWluZyB0byBmaW5kIGEgbWVudSBwdCBtYXBzIHRvLgogICovCi1zdGF0aWMgSE1FTlUzMiBNRU5VX0ZpbmRNZW51QnlDb29yZHMoIEhNRU5VMzIgaG1lbnUsIFBPSU5UMzIgcHQgKQorc3RhdGljIEhNRU5VMzIgTUVOVV9QdE1lbnUoIEhNRU5VMzIgaE1lbnUsIFBPSU5UMTYgcHQgKQogewotICAgIFBPUFVQTUVOVSAqbWVudTsKLSAgICBIV05EMzIgaHduZDsKKyAgIFBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoTWVudSApOworICAgcmVnaXN0ZXIgVUlOVDMyIGh0ID0gbWVudS0+Rm9jdXNlZEl0ZW07CiAKLSAgICBpZiAoIShod25kID0gV2luZG93RnJvbVBvaW50MzIoIHB0ICkpKSByZXR1cm4gMDsKLSAgICB3aGlsZSAoaG1lbnUpCi0gICAgewotCW1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKLQlpZiAobWVudS0+aFduZCA9PSBod25kKQorI2RlZmluZSBIQVNfUE9QVVAoaXRlbSkJKCgoaXRlbSkuaXRlbV9mbGFncyAmIChNRl9QT1BVUCB8IE1GX01PVVNFU0VMRUNUKSkgXAorCQkJPT0gKE1GX1BPUFVQIHwgTUZfTU9VU0VTRUxFQ1QpKQorICAgLyogdHJ5IHN1YnBvcHVwIGZpcnN0IChpZiBhbnkpICovCisgICBodCA9IChodCAhPSBOT19TRUxFQ1RFRF9JVEVNICYmIEhBU19QT1BVUChtZW51LT5pdGVtc1todF0pKQorCT8gKFVJTlQzMilNRU5VX1B0TWVudSggbWVudS0+aXRlbXNbaHRdLml0ZW1faWQsIHB0ICkgOiAwOworI3VuZGVmIEhBU19QT1BVUAorCisgICBpZiggIWh0ICkJLyogY2hlY2sgdGhlIGN1cnJlbnQgd2luZG93IChhdm9pZGluZyBXTV9ISVRURVNUKSAqLworICAgeworCWh0ID0gKFVJTlQzMilOQ19IYW5kbGVOQ0hpdFRlc3QoIG1lbnUtPmhXbmQsIHB0ICk7CisJaWYoIG1lbnUtPndGbGFncyAmIE1GX1BPUFVQICkKKwkgICAgaHQgPSAgKGh0ICE9IChVSU5UMzIpSFROT1dIRVJFICYmIAorCQkgICBodCAhPSAoVUlOVDMyKUhURVJST1IpID8gKFVJTlQzMiloTWVudSA6IDA7CisJZWxzZQogCXsKLQkgICAgaWYgKCEobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApKQotCSAgICB7Ci0JCSAgLyogTWFrZSBzdXJlIGl0J3MgaW4gdGhlIG1lbnUgYmFyIChvciBpbiBzeXN0ZW0gbWVudSkgKi8KLQkJV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbWVudS0+aFduZCApOwotCQlpZiAoKHB0LnggPCB3bmRQdHItPnJlY3RDbGllbnQubGVmdCkgfHwKLQkJICAgIChwdC54ID49IHduZFB0ci0+cmVjdENsaWVudC5yaWdodCkgfHwKLQkJICAgIChwdC55ID49IHduZFB0ci0+cmVjdENsaWVudC50b3ApKSByZXR1cm4gMDsKLQkJaWYgKHB0LnkgPCB3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gbWVudS0+SGVpZ2h0KQotCQl7Ci0JCSAgICBpZiAoIU1FTlVfSXNJblN5c01lbnUoIG1lbnUsIHB0ICkpIHJldHVybiAwOwotCQl9Ci0JCS8qIGVsc2UgaXQncyBpbiB0aGUgbWVudSBiYXIgKi8KLQkgICAgfQotCSAgICByZXR1cm4gaG1lbnU7Ci0JfQotCWhtZW51ID0gTUVOVV9HZXRTdWJQb3B1cCggaG1lbnUgKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CisJICAgIFdORCogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobWVudS0+aFduZCk7CiAKKwkgICAgaHQgPSAoIGh0ID09IEhUU1lTTUVOVSApID8gKFVJTlQzMikod25kUHRyLT5oU3lzTWVudSkKKwkJIDogKCBodCA9PSBIVE1FTlUgKSA/IChVSU5UMzIpKHduZFB0ci0+d0lEbWVudSkgOiAwOworCX0KKyAgIH0KKyAgIHJldHVybiAoSE1FTlUzMilodDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9FeGVjRm9jdXNlZEl0ZW0KQEAgLTEzMDQsMTU3ICsxNDM2LDE3NyBAQAogICogRXhlY3V0ZSBhIG1lbnUgaXRlbSAoZm9yIGluc3RhbmNlIHdoZW4gdXNlciBwcmVzc2VkIEVudGVyKS4KICAqIFJldHVybiBUUlVFIGlmIHdlIGNhbiBnbyBvbiB3aXRoIG1lbnUgdHJhY2tpbmcuCiAgKi8KLXN0YXRpYyBCT09MMzIgTUVOVV9FeGVjRm9jdXNlZEl0ZW0oIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyICpobWVudUN1cnJlbnQgKQorc3RhdGljIEJPT0wzMiBNRU5VX0V4ZWNGb2N1c2VkSXRlbSggTVRSQUNLRVIqIHBtdCwgSE1FTlUzMiBoTWVudSApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07Ci0gICAgUE9QVVBNRU5VICptZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7Ci0gICAgaWYgKCFtZW51IHx8ICFtZW51LT5uSXRlbXMgfHwgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pIHx8Ci0JKG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpKSByZXR1cm4gVFJVRTsKKyAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaE1lbnUgKTsKKyAgICBpZiAoIW1lbnUgfHwgIW1lbnUtPm5JdGVtcyB8fCAKKwkobWVudS0+Rm9jdXNlZEl0ZW0gPT0gTk9fU0VMRUNURURfSVRFTSkpIHJldHVybiBUUlVFOworCiAgICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CiAgICAgaWYgKCEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKSkKICAgICB7CiAJaWYgKCEoaXRlbS0+aXRlbV9mbGFncyAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCkpKQogCXsKLQkgICAgUG9zdE1lc3NhZ2UxNiggaHduZE93bmVyLCAobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkgPyAKLQkJCVdNX1NZU0NPTU1BTkQgOiBXTV9DT01NQU5ELCBpdGVtLT5pdGVtX2lkLCAwICk7CisJICAgIGlmKCBtZW51LT53RmxhZ3MgJiBNRl9TWVNNRU5VICkKKwkgICAgeworCQlQb3N0TWVzc2FnZTE2KCBwbXQtPmhPd25lclduZCwgV01fU1lTQ09NTUFORCwgaXRlbS0+aXRlbV9pZCwKKwkJCSAgICAgICBNQUtFTFBBUkFNKChJTlQxNilwbXQtPnB0LngsIChJTlQxNilwbXQtPnB0LnkpICk7CisJICAgIH0KKwkgICAgZWxzZQorCQlQb3N0TWVzc2FnZTE2KCBwbXQtPmhPd25lclduZCwgV01fQ09NTUFORCwKKwkJCQkJaXRlbS0+aXRlbV9pZCwgMCApOwogCSAgICByZXR1cm4gRkFMU0U7CiAJfQogCWVsc2UgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBUUlVFICk7CisJcG10LT5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cCggcG10LT5oT3duZXJXbmQsIGhNZW51LCBUUlVFICk7CiAJcmV0dXJuIFRSVUU7CiAgICAgfQogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1FTlVfQnV0dG9uRG93bgorICogICAgICAgICAgIE1FTlVfU3dpdGNoVHJhY2tpbmcKICAqCi0gKiBIYW5kbGUgYSBidXR0b24tZG93biBldmVudCBpbiBhIG1lbnUuIFBvaW50IGlzIGluIHNjcmVlbiBjb29yZHMuCi0gKiBobWVudUN1cnJlbnQgaXMgdGhlIHRvcC1tb3N0IHZpc2libGUgcG9wdXAuCi0gKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBtZW51IG5hdmlnYXRpb24gcm91dGluZXMuCiAgKi8KLXN0YXRpYyBCT09MMzIgTUVOVV9CdXR0b25Eb3duKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCwgUE9JTlQzMiBwdCApCitzdGF0aWMgdm9pZCBNRU5VX1N3aXRjaFRyYWNraW5nKCBNVFJBQ0tFUiogcG10LCBITUVOVTMyIGhQdE1lbnUsIFVJTlQzMiBpZCApCiB7Ci0gICAgUE9QVVBNRU5VICptZW51OwotICAgIE1FTlVJVEVNICppdGVtOwotICAgIFVJTlQzMiBpZDsKKyAgICBQT1BVUE1FTlUgKnB0bWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoUHRNZW51ICk7CisgICAgUE9QVVBNRU5VICp0b3BtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIHBtdC0+aFRvcE1lbnUgKTsKIAotICAgIGlmICghaG1lbnUpIHJldHVybiBGQUxTRTsgIC8qIE91dHNpZGUgYWxsIG1lbnVzICovCi0gICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwotICAgIGl0ZW0gPSBNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIG1lbnUsIHB0LngsIHB0LnksICZpZCApOwotICAgIGlmICghaXRlbSkgIC8qIE1heWJlIGluIHN5c3RlbSBtZW51ICovCisgICAgaWYoIHBtdC0+aFRvcE1lbnUgIT0gaFB0TWVudSAmJgorCSEoKHB0bWVudS0+d0ZsYWdzIHwgdG9wbWVudS0+d0ZsYWdzKSAmIE1GX1BPUFVQKSApCiAgICAgewotCWlmICghTUVOVV9Jc0luU3lzTWVudSggbWVudSwgcHQgKSkgcmV0dXJuIEZBTFNFOwotCWlkID0gU1lTTUVOVV9TRUxFQ1RFRDsKLSAgICB9CQorCS8qIGJvdGggYXJlIHRvcCBsZXZlbCBtZW51cyAoc3lzdGVtIGFuZCBtZW51LWJhcikgKi8KIAotICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSA9PSBpZCkKLSAgICB7Ci0JaWYgKGlkID09IFNZU01FTlVfU0VMRUNURUQpIHJldHVybiBGQUxTRTsKLQlpZiAoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKQotCXsKLQkgICAgaWYgKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9NT1VTRVNFTEVDVCkKLQkgICAgewotCQlpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApCi0JCXsKLQkJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudSwgVFJVRSApOwotCQkgICAgKmhtZW51Q3VycmVudCA9IGhtZW51OwotCQl9Ci0JCWVsc2UgcmV0dXJuIEZBTFNFOwotCSAgICB9Ci0JICAgIGVsc2UgKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwotCX0KKwlNRU5VX0hpZGVTdWJQb3B1cHMoIHBtdC0+aE93bmVyV25kLCBwbXQtPmhUb3BNZW51LCBGQUxTRSApOworCU1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CisgICAgICAgIHBtdC0+aFRvcE1lbnUgPSBoUHRNZW51OwogICAgIH0KLSAgICBlbHNlCi0gICAgewotCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudSwgRkFMU0UgKTsKLQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkLCBUUlVFICk7Ci0JKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBlbHNlIE1FTlVfSGlkZVN1YlBvcHVwcyggcG10LT5oT3duZXJXbmQsIGhQdE1lbnUsIEZBTFNFICk7CisgICAgTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgaWQsIFRSVUUgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNRU5VX0J1dHRvblVwCisgKiAgICAgICAgICAgTUVOVV9CdXR0b25Eb3duCiAgKgotICogSGFuZGxlIGEgYnV0dG9uLXVwIGV2ZW50IGluIGEgbWVudS4gUG9pbnQgaXMgaW4gc2NyZWVuIGNvb3Jkcy4KLSAqIGhtZW51Q3VycmVudCBpcyB0aGUgdG9wLW1vc3QgdmlzaWJsZSBwb3B1cC4KICAqIFJldHVybiBUUlVFIGlmIHdlIGNhbiBnbyBvbiB3aXRoIG1lbnUgdHJhY2tpbmcuCiAgKi8KLXN0YXRpYyBCT09MMzIgTUVOVV9CdXR0b25VcCggSFdORDMyIGh3bmRPd25lciwgSE1FTlUzMiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUzMiAqaG1lbnVDdXJyZW50LCBQT0lOVDMyIHB0ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9CdXR0b25Eb3duKCBNVFJBQ0tFUiogcG10LCBITUVOVTMyIGhQdE1lbnUgKQogewotICAgIFBPUFVQTUVOVSAqbWVudTsKLSAgICBNRU5VSVRFTSAqaXRlbTsKLSAgICBITUVOVTMyIGhzdWJtZW51ID0gMDsKLSAgICBVSU5UMzIgaWQ7Ci0KLSAgICBpZiAoIWhtZW51KSByZXR1cm4gRkFMU0U7ICAvKiBPdXRzaWRlIGFsbCBtZW51cyAqLwotICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKLSAgICBpdGVtID0gTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBtZW51LCBwdC54LCBwdC55LCAmaWQgKTsKLSAgICBpZiAoIWl0ZW0pICAvKiBNYXliZSBpbiBzeXN0ZW0gbWVudSAqLworICAgIGlmIChoUHRNZW51KQogICAgIHsKLQlpZiAoIU1FTlVfSXNJblN5c01lbnUoIG1lbnUsIHB0ICkpIHJldHVybiBGQUxTRTsKLQlpZCA9IFNZU01FTlVfU0VMRUNURUQ7Ci0JaHN1Ym1lbnUgPSBXSU5fRmluZFduZFB0cihtZW51LT5oV25kKS0+aFN5c01lbnU7Ci0gICAgfQkKKwlVSU5UMzIgaWQgPSAwOworCVBPUFVQTUVOVSAqcHRtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhQdE1lbnUgKTsKKwlNRU5VSVRFTSAqaXRlbTsKIAotICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSAhPSBpZCkgcmV0dXJuIEZBTFNFOworCWlmKCBJU19TWVNURU1fTUVOVShwdG1lbnUpICkKKwkgICAgaXRlbSA9IHB0bWVudS0+aXRlbXM7CisJZWxzZQorCSAgICBpdGVtID0gTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBwdG1lbnUsIHBtdC0+cHQsICZpZCApOwogCi0gICAgaWYgKGlkICE9IFNZU01FTlVfU0VMRUNURUQpCi0gICAgewotCWlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkpCisJaWYoIGl0ZW0gKQogCXsKLQkgICAgcmV0dXJuIE1FTlVfRXhlY0ZvY3VzZWRJdGVtKCBod25kT3duZXIsIGhtZW51LCBobWVudUN1cnJlbnQgKTsKLQl9Ci0JaHN1Ym1lbnUgPSAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOworCSAgICBpZiggcHRtZW51LT5Gb2N1c2VkSXRlbSA9PSBpZCApCisJICAgIHsKKwkJLyogbm90aGluZyB0byBkbyB3aXRoIGFscmVhZHkgc2VsZWN0ZWQgbm9uLXBvcHVwICovCisJCWlmKCAhKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgKSByZXR1cm4gVFJVRTsKKworCSAgICAgICAgaWYoIGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9NT1VTRVNFTEVDVCApCisJCXsKKwkJICAgIGlmKCBwdG1lbnUtPndGbGFncyAmIE1GX1BPUFVQICkKKwkJICAgIHsKKwkJCS8qIGhpZGUgc2VsZWN0ZWQgc3VicG9wdXAgKi8KKworCQkJTUVOVV9IaWRlU3ViUG9wdXBzKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgVFJVRSApOworCQkJcG10LT5oQ3VycmVudE1lbnUgPSBoUHRNZW51OworCQkJcmV0dXJuIFRSVUU7CisJCSAgICB9CisJCSAgICByZXR1cm4gRkFMU0U7IC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLworCQl9IAorCSAgICB9CisJICAgIGVsc2UgTUVOVV9Td2l0Y2hUcmFja2luZyggcG10LCBoUHRNZW51LCBpZCApOworCisJICAgIC8qIHRyeSB0byBkaXNwbGF5IGEgc3VicG9wdXAgKi8KKworCSAgICBwbXQtPmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKCBwbXQtPmhPd25lclduZCwgaFB0TWVudSwgRkFMU0UgKTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfSAKKwllbHNlIGRwcmludGZfbWVudShzdGRkZWIsIlx0dW5hYmxlIHRvIGZpbmQgY2xpY2tlZCBpdGVtIVxuIik7CiAgICAgfQotICAgICAgLyogU2VsZWN0IGZpcnN0IGl0ZW0gb2Ygc3ViLXBvcHVwICovCi0gICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSApOwotICAgIE1FTlVfU2VsZWN0SXRlbVJlbCggaHduZE93bmVyLCBoc3VibWVudSwgSVRFTV9ORVhUICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNRU5VX0J1dHRvblVwCisgKgorICogUmV0dXJuIFRSVUUgaWYgd2UgY2FuIGdvIG9uIHdpdGggbWVudSB0cmFja2luZy4KKyAqLworc3RhdGljIEJPT0wzMiBNRU5VX0J1dHRvblVwKCBNVFJBQ0tFUiogcG10LCBITUVOVTMyIGhQdE1lbnUgKQoreworICAgIGlmIChoUHRNZW51KQorICAgIHsKKwlVSU5UMzIgaWQgPSAwOworCVBPUFVQTUVOVSAqcHRtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhQdE1lbnUgKTsKKwlNRU5VSVRFTSAqaXRlbTsKKworICAgICAgICBpZiggSVNfU1lTVEVNX01FTlUocHRtZW51KSApCisgICAgICAgICAgICBpdGVtID0gcHRtZW51LT5pdGVtczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXRlbSA9IE1FTlVfRmluZEl0ZW1CeUNvb3JkcyggcHRtZW51LCBwbXQtPnB0LCAmaWQgKTsKKworCWlmKCBwdG1lbnUtPkZvY3VzZWRJdGVtID09IGlkICkKKwl7CisJICAgIGlmKCAhKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgKQorCQlyZXR1cm4gTUVOVV9FeGVjRm9jdXNlZEl0ZW0oIHBtdCwgaFB0TWVudSApOworCSAgICBoUHRNZW51ID0gKEhNRU5VMzIpaXRlbS0+aXRlbV9pZDsKKwkgICAgaWYoIGhQdE1lbnUgPT0gcG10LT5oQ3VycmVudE1lbnUgKQorCSAgICB7CisJICAgICAgICAvKiBTZWxlY3QgZmlyc3QgaXRlbSBvZiBzdWItcG9wdXAgKi8gICAgCisKKwkgICAgICAgIE1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIGhQdE1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CisJICAgICAgICBNRU5VX01vdmVTZWxlY3Rpb24oIHBtdC0+aE93bmVyV25kLCBoUHRNZW51LCBJVEVNX05FWFQgKTsKKwkgICAgfQorCSAgICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX01vdXNlTW92ZQogICoKLSAqIEhhbmRsZSBhIG1vdGlvbiBldmVudCBpbiBhIG1lbnUuIFBvaW50IGlzIGluIHNjcmVlbiBjb29yZHMuCi0gKiBobWVudUN1cnJlbnQgaXMgdGhlIHRvcC1tb3N0IHZpc2libGUgcG9wdXAuCiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCi1zdGF0aWMgQk9PTDMyIE1FTlVfTW91c2VNb3ZlKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUzMiAqaG1lbnVDdXJyZW50LCBQT0lOVDMyIHB0ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9Nb3VzZU1vdmUoIE1UUkFDS0VSKiBwbXQsIEhNRU5VMzIgaFB0TWVudSApCiB7Ci0gICAgTUVOVUlURU0gKml0ZW07Ci0gICAgUE9QVVBNRU5VICptZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CiAgICAgVUlOVDMyIGlkID0gTk9fU0VMRUNURURfSVRFTTsKKyAgICBQT1BVUE1FTlUgKnB0bWVudSA9IE5VTEw7CiAKLSAgICBpZiAoaG1lbnUpCisgICAgaWYoIGhQdE1lbnUgKQogICAgIHsKLQlpdGVtID0gTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBtZW51LCBwdC54LCBwdC55LCAmaWQgKTsKLQlpZiAoIWl0ZW0pICAvKiBNYXliZSBpbiBzeXN0ZW0gbWVudSAqLwotCXsKLQkgICAgaWYgKCFNRU5VX0lzSW5TeXNNZW51KCBtZW51LCBwdCApKQotCQlpZCA9IE5PX1NFTEVDVEVEX0lURU07ICAvKiBPdXRzaWRlIGFsbCBpdGVtcyAqLwotCSAgICBlbHNlIGlkID0gU1lTTUVOVV9TRUxFQ1RFRDsKLQl9Ci0gICAgfQkKLSAgICBpZiAoaWQgPT0gTk9fU0VMRUNURURfSVRFTSkKKwlwdG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaFB0TWVudSApOworICAgICAgICBpZiggSVNfU1lTVEVNX01FTlUocHRtZW51KSApCisJICAgIGlkID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTUVOVV9GaW5kSXRlbUJ5Q29vcmRzKCBwdG1lbnUsIHBtdC0+cHQsICZpZCApOworICAgIH0gCisKKyAgICBpZiggaWQgPT0gTk9fU0VMRUNURURfSVRFTSApCiAgICAgewotCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCAqaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNLCBUUlVFICk7CisJTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oQ3VycmVudE1lbnUsIAorCQkJIE5PX1NFTEVDVEVEX0lURU0sIFRSVUUgKTsKICAgICB9Ci0gICAgZWxzZSBpZiAobWVudS0+Rm9jdXNlZEl0ZW0gIT0gaWQpCisgICAgZWxzZSBpZiggcHRtZW51LT5Gb2N1c2VkSXRlbSAhPSBpZCApCiAgICAgewotCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudSwgRkFMU0UgKTsKLQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkLCBUUlVFICk7Ci0JKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOworCSAgICBNRU5VX1N3aXRjaFRyYWNraW5nKCBwbXQsIGhQdE1lbnUsIGlkICk7CisJICAgIHBtdC0+aEN1cnJlbnRNZW51ID0gTUVOVV9TaG93U3ViUG9wdXAoIHBtdC0+aE93bmVyV25kLCBoUHRNZW51LCBGQUxTRSApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTE0NjIsMTI2ICsxNjE0LDE3OCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX0RvTmV4dE1lbnUKKyAqCisgKiBOT1RFOiBXTV9ORVhUTUVOVSBkb2N1bWVudGVkIGluIFdpbjMyIGlzIGEgYml0IGRpZmZlcmVudC4KICAqLwotc3RhdGljIExSRVNVTFQgTUVOVV9Eb05leHRNZW51KCBIV05EMzIqIGh3bmRPd25lciwgSE1FTlUzMiogaG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCwgVUlOVDMyIHZrICkKK3N0YXRpYyBMUkVTVUxUIE1FTlVfRG9OZXh0TWVudSggTVRSQUNLRVIqIHBtdCwgVUlOVDMyIHZrICkKIHsKLSAgUE9QVVBNRU5VICptZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoICpobWVudSApOwotICBVSU5UMzIgICAgIGlkID0gMDsKKyAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggcG10LT5oVG9wTWVudSApOwogCi0gIGlmKCAgICAodmsgPT0gVktfTEVGVCAmJiAhbWVudS0+Rm9jdXNlZEl0ZW0pCi0gICAgICB8fCAodmsgPT0gVktfUklHSFQgJiYgbWVudS0+Rm9jdXNlZEl0ZW0gPT0gbWVudS0+bkl0ZW1zIC0gMSkgCi0gICAgICB8fCBtZW51LT5Gb2N1c2VkSXRlbSA9PSBTWVNNRU5VX1NFTEVDVEVEIAotICAgICAgfHwgKChtZW51LT53RmxhZ3MgJiAoTUZfUE9QVVAgfCBNRl9TWVNNRU5VKSkgPT0gKE1GX1BPUFVQIHwgTUZfU1lTTUVOVSkpKQotICB7Ci0gICAgTFJFU1VMVCBsID0gU2VuZE1lc3NhZ2UxNiggKmh3bmRPd25lciwgV01fTkVYVE1FTlUsIChXUEFSQU0xNil2aywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoKG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHZXRTeXN0ZW1NZW51MzIoICpod25kT3duZXIsIDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmhtZW51KSk7CisgICAgaWYoICh2ayA9PSBWS19MRUZUICYmICBtZW51LT5Gb2N1c2VkSXRlbSA9PSAwICkgfHwKKyAgICAgICAgKHZrID09IFZLX1JJR0hUICYmIG1lbnUtPkZvY3VzZWRJdGVtID09IG1lbnUtPm5JdGVtcyAtIDEpKQorICAgIHsKKwlXTkQqICAgIHduZFB0cjsKKwlITUVOVTMyIGhOZXdNZW51OworCUhXTkQzMiAgaE5ld1duZDsKKwlVSU5UMzIgIGlkID0gMDsKKwlMUkVTVUxUIGwgPSBTZW5kTWVzc2FnZTE2KCBwbXQtPmhPd25lclduZCwgV01fTkVYVE1FTlUsIChXUEFSQU0xNil2aywgCisJCShJU19TWVNURU1fTUVOVShtZW51KSkgPyBHZXRTdWJNZW51MTYocG10LT5oVG9wTWVudSwwKSA6IHBtdC0+aFRvcE1lbnUgKTsKIAotICAgIGlmKCBsID09IDAgfHwgIUlzTWVudTMyKExPV09SRChsKSkgfHwgIUlzV2luZG93MzIoSElXT1JEKGwpKSApIHJldHVybiAwOworCWRwcmludGZfbWVudShzdGRkZWIsIk5leHRNZW51OiAlMDR4IFslMDR4XSAtPiAlMDR4IFslMDR4XVxuIiwKKwkJICAgICAoVUlOVDE2KXBtdC0+aEN1cnJlbnRNZW51LCAoVUlOVDE2KXBtdC0+aE93bmVyV25kLCBMT1dPUkQobCksIEhJV09SRChsKSApOwogCi0gICAgLyogc2h1dGRvd24gY3VycmVudCBtZW51IC0KLSAgICAgKiBhbGwgdGhlc2UgY2hlY2tzIGZvciBzeXN0ZW0gcG9wdXAgd2luZG93IGFyZSBuZWVkZWQKLSAgICAgKiBvbmx5IGJlY2F1c2UgV2luZSBzeXN0ZW0gbWVudSB0cmFja2luZyBpcyB1bnN1aXRhYmxlCi0gICAgICogZm9yIGEgbG90IG9mIHRoaW5ncyAoZXNwLiB3aGVuIHdlIGRvIG5vdCBoYXZlIHdJRG1lbnUgdG8gZmFsbCBiYWNrIG9uKS4gCi0gICAgICovCi0KLSAgICBNRU5VX1NlbGVjdEl0ZW0oICpod25kT3duZXIsICpobWVudSwgTk9fU0VMRUNURURfSVRFTSwgRkFMU0UgKTsKLQotICAgIGlmKCAobWVudS0+d0ZsYWdzICYgKE1GX1BPUFVQIHwgTUZfU1lTTUVOVSkpID09IChNRl9QT1BVUCB8IE1GX1NZU01FTlUpICkKKwlpZiggbCA9PSAwICkKIAl7Ci0JICBTaG93V2luZG93MzIoIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKLQkgIHVTdWJQV25kTGV2ZWwgPSAwOworCSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihwbXQtPmhPd25lclduZCk7CiAKLQkgIGlmKCAhSXNJY29uaWMzMiggKmh3bmRPd25lciApICkKLQkgIHsgCi0JICAgIEhEQzMyIGhkYyA9IEdldERDRXgzMiggKmh3bmRPd25lciwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyk7Ci0JICAgIE5DX0RyYXdTeXNCdXR0b24oICpod25kT3duZXIsIGhkYywgRkFMU0UgKTsKLQkgICAgUmVsZWFzZURDMzIoICpod25kT3duZXIsIGhkYyApOwotCSAgfQorCSAgICBoTmV3V25kID0gcG10LT5oT3duZXJXbmQ7CisJICAgIGlmKCBJU19TWVNURU1fTUVOVShtZW51KSApCisJICAgIHsKKwkJLyogc3dpdGNoIHRvIHRoZSBtZW51IGJhciAqLworCisJCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCB8fCAhd25kUHRyLT53SURtZW51ICkgCisJCSAgICByZXR1cm4gRkFMU0U7CisKKwkgICAgICAgIGhOZXdNZW51ID0gd25kUHRyLT53SURtZW51OworCSAgICAgICAgaWYoIHZrID09IFZLX0xFRlQgKQorCSAgICAgICAgeworCQkgICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoTmV3TWVudSApOworCQkgICAgaWQgPSBtZW51LT5uSXRlbXMgLSAxOworCSAgICAgICAgfQorCSAgICB9CisJICAgIGVsc2UgaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUgKSAKKwkgICAgeworCQkvKiBzd2l0Y2ggdG8gdGhlIHN5c3RlbSBtZW51ICovCisJICAgICAgICBoTmV3TWVudSA9IHduZFB0ci0+aFN5c01lbnU7IAorCSAgICB9CisJICAgIGVsc2UgcmV0dXJuIEZBTFNFOworCX0KKwllbHNlICAgIC8qIGFwcGxpY2F0aW9uIHJldHVybmVkIGEgbmV3IG1lbnUgdG8gc3dpdGNoIHRvICovCisJeworCSAgICBoTmV3TWVudSA9IExPV09SRChsKTsgaE5ld1duZCA9IEhJV09SRChsKTsKKworCSAgICBpZiggSXNNZW51MzIoaE5ld01lbnUpICYmIElzV2luZG93MzIoaE5ld1duZCkgKQorCSAgICB7CisJCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhOZXdXbmQpOworCisJCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VICYmCisJCSAgICBHZXRTdWJNZW51MTYod25kUHRyLT5oU3lzTWVudSwgMCkgPT0gaE5ld01lbnUgKQorCQl7CisJICAgICAgICAgICAgLyogZ2V0IHRoZSByZWFsIHN5c3RlbSBtZW51ICovCisJCSAgICBoTmV3TWVudSA9ICB3bmRQdHItPmhTeXNNZW51OworCQl9CisJICAgICAgICBlbHNlIGlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCB8fCB3bmRQdHItPndJRG1lbnUgIT0gaE5ld01lbnUgKQorCQl7CisJCSAgICAvKiBGSVhNRTogTm90IHN1cmUgd2hhdCB0byBkbyBoZXJlLCBwZXJoYXBzLAorCQkgICAgICogdHJ5IHRvIHRyYWNrIGhOZXdNZW51IGFzIGEgcG9wdXA/ICovCisKKwkJICAgIGRwcmludGZfbWVudShzdGRkZWIsIk1FTlVfRG9OZXh0TWVudSgpIGdvdCBjb25mdXNlZC5cbiIpOworCQkgICAgcmV0dXJuIEZBTFNFOworCQl9CisJICAgIH0KKwkgICAgZWxzZSByZXR1cm4gRkFMU0U7CiAJfQogCi0gICAgUmVsZWFzZUNhcHR1cmUoKTsgCi0gICAqaHduZE93bmVyID0gSElXT1JEKGwpOwotICAgKmhtZW51ID0gTE9XT1JEKGwpOwotICAgIFNldENhcHR1cmUzMiggKmh3bmRPd25lciApOworCWlmKCBoTmV3TWVudSAhPSBwbXQtPmhUb3BNZW51ICkKKwl7CisJICAgIE1FTlVfU2VsZWN0SXRlbSggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CisJICAgIGlmKCBwbXQtPmhDdXJyZW50TWVudSAhPSBwbXQtPmhUb3BNZW51ICkgCisJCU1FTlVfSGlkZVN1YlBvcHVwcyggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIEZBTFNFICk7CisJfQogCi0gICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCAqaG1lbnUgKTsKKwlpZiggaE5ld1duZCAhPSBwbXQtPmhPd25lclduZCApCisJeworCSAgICBSZWxlYXNlQ2FwdHVyZSgpOyAKKwkgICAgcG10LT5oT3duZXJXbmQgPSBoTmV3V25kOworCSAgICBFVkVOVF9DYXB0dXJlKCBwbXQtPmhPd25lclduZCwgSFRNRU5VICk7CisJfQogCi0gICAgLyogaW5pdCBuZXh0IG1lbnUgKi8KKwlwbXQtPmhUb3BNZW51ID0gcG10LT5oQ3VycmVudE1lbnUgPSBoTmV3TWVudTsgLyogYWxsIHN1YnBvcHVwcyBhcmUgaGlkZGVuICovCisJTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oVG9wTWVudSwgaWQsIFRSVUUgKTsgCiAKLSAgICBpZiggKG1lbnUtPndGbGFncyAmIChNRl9QT1BVUCB8IE1GX1NZU01FTlUpKSA9PSAoTUZfUE9QVVAgfCBNRl9TWVNNRU5VKSApCisJcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUVOVV9TdXNwZW5kUG9wdXAKKyAqCisgKiBUaGUgaWRlYSBpcyBub3QgdG8gc2hvdyB0aGUgcG9wdXAgaWYgdGhlIG5leHQgaW5wdXQgbWVzc2FnZSBpcworICogZ29pbmcgdG8gaGlkZSBpdCBhbnl3YXkuCisgKi8KK3N0YXRpYyBCT09MMzIgTUVOVV9TdXNwZW5kUG9wdXAoIE1UUkFDS0VSKiBwbXQsIFVJTlQxNiB1TXNnICkKK3sKKyAgICBNU0cxNiBtc2c7CisKKyAgICBtc2cuaHduZCA9IHBtdC0+aE93bmVyV25kOworCisgICAgUGVla01lc3NhZ2UxNiggJm1zZywgMCwgMCwgMCwgUE1fTk9ZSUVMRCB8IFBNX1JFTU9WRSk7CisgICAgcG10LT50cmFja0ZsYWdzIHw9IFRGX1NLSVBSRU1PVkU7CisKKyAgICBzd2l0Y2goIHVNc2cgKQogICAgIHsKLSAgICAgICAgUkVDVDMyIHJlY3Q7Ci0gICAgICAgIFdORCogICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggKmh3bmRPd25lciApOwotCi0gICAgICAgIC8qIHN0dXBpZCBrbHVkZ2UsIHNlZSBhYm92ZSAqLwotCi0gICAgICAgIGlmKCB3bmRQdHItPndJRG1lbnUgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqaG1lbnUgPSB3bmRQdHItPndJRG1lbnU7Ci0gICAgICAgICAgICBpZCA9IFNZU01FTlVfU0VMRUNURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7IAotICAgICAgICAgICAgaWYoIE5DX0dldFN5c1BvcHVwUG9zKCB3bmRQdHIsICZyZWN0ICkgKQotICAgICAgICAgICAgICAgIE1FTlVfU2hvd1BvcHVwKCAqaHduZE93bmVyLCAqaG1lbnUsIDAsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hTSVpFLCBTWVNNRVRSSUNTX0NZU0laRSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggIUlzSWNvbmljMzIoICpod25kT3duZXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSERDMzIgaGRjID0gIEdldERDRXgzMiggKmh3bmRPd25lciwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyk7Ci0gICAgICAgICAgICAgICAgTkNfRHJhd1N5c0J1dHRvbiggKmh3bmRPd25lciwgaGRjLCBUUlVFICk7Ci0gICAgICAgICAgICAgICAgUmVsZWFzZURDMzIoICpod25kT3duZXIsIGhkYyApOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJY2FzZSBXTV9LRVlET1dOOgorCSAgICAgUGVla01lc3NhZ2UxNiggJm1zZywgMCwgMCwgMCwgUE1fTk9ZSUVMRCB8IFBNX05PUkVNT1ZFKTsKKwkgICAgIGlmKCBtc2cubWVzc2FnZSA9PSBXTV9LRVlVUCB8fCBtc2cubWVzc2FnZSA9PSBXTV9QQUlOVCApCisJICAgICB7CisJCSBQZWVrTWVzc2FnZTE2KCAmbXNnLCAwLCAwLCAwLCBQTV9OT1lJRUxEIHwgUE1fUkVNT1ZFKTsKKwkgICAgICAgICBQZWVrTWVzc2FnZTE2KCAmbXNnLCAwLCAwLCAwLCBQTV9OT1lJRUxEIHwgUE1fTk9SRU1PVkUpOworCSAgICAgICAgIGlmKCBtc2cubWVzc2FnZSA9PSBXTV9LRVlET1dOICYmCisJCSAgICAobXNnLndQYXJhbSA9PSBWS19MRUZUIHx8IG1zZy53UGFyYW0gPT0gVktfUklHSFQpKQorCSAgICAgICAgIHsKKwkJICAgICBwbXQtPnRyYWNrRmxhZ3MgfD0gVEZfU1VTUEVORFBPUFVQOworCQkgICAgIHJldHVybiBUUlVFOworCSAgICAgICAgIH0KKwkgICAgIH0KKwkgICAgIGJyZWFrOwogICAgIH0KIAotICAgIE1FTlVfU2VsZWN0SXRlbSggKmh3bmRPd25lciwgKmhtZW51LCBpZCwgVFJVRSApOyAKLSAgICByZXR1cm4gbDsKLSAgfQotICByZXR1cm4gMDsKKyAgICAvKiBmYWlsdXJlcyBnbyB0aHJvdWdoIHRoaXMgKi8KKyAgICBwbXQtPnRyYWNrRmxhZ3MgJj0gflRGX1NVU1BFTkRQT1BVUDsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfS2V5TGVmdAogICoKLSAqIEhhbmRsZSBhIFZLX0xFRlQga2V5IGV2ZW50IGluIGEgbWVudS4KLSAqIGhtZW51Q3VycmVudCBpcyB0aGUgdG9wLW1vc3QgdmlzaWJsZSBwb3B1cC4KKyAqIEhhbmRsZSBhIFZLX0xFRlQga2V5IGV2ZW50IGluIGEgbWVudS4gCiAgKi8KLXN0YXRpYyB2b2lkIE1FTlVfS2V5TGVmdCggSFdORDMyKiBod25kT3duZXIsIEhNRU5VMzIqIGhtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyICpobWVudUN1cnJlbnQgKQorc3RhdGljIHZvaWQgTUVOVV9LZXlMZWZ0KCBNVFJBQ0tFUiogcG10ICkKIHsKICAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICAgSE1FTlUzMiBobWVudXRtcCwgaG1lbnVwcmV2OwogCi0gICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCAqaG1lbnUgKTsKLSAgICBobWVudXByZXYgPSBobWVudXRtcCA9ICpobWVudTsKLSAgICB3aGlsZSAoaG1lbnV0bXAgIT0gKmhtZW51Q3VycmVudCkKKyAgICBobWVudXByZXYgPSBobWVudXRtcCA9IHBtdC0+aFRvcE1lbnU7CisgICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudXRtcCApOworCisgICAgLyogY2xvc2UgdG9wbW9zdCBwb3B1cCAqLworICAgIHdoaWxlIChobWVudXRtcCAhPSBwbXQtPmhDdXJyZW50TWVudSkKICAgICB7CisJaG1lbnVwcmV2ID0gaG1lbnV0bXA7CiAJaG1lbnV0bXAgPSBNRU5VX0dldFN1YlBvcHVwKCBobWVudXByZXYgKTsKLQlpZiAoaG1lbnV0bXAgIT0gKmhtZW51Q3VycmVudCkgaG1lbnVwcmV2ID0gaG1lbnV0bXA7CiAgICAgfQotICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggKmh3bmRPd25lciwgaG1lbnVwcmV2LCBUUlVFICk7Ci0gICAgaG1lbnV0bXAgPSAqaG1lbnU7CiAKLSAgICBpZiAoIChobWVudXByZXYgPT0gKmhtZW51KSAmJiAKLSAgICAgICAgICgobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkgfHwgIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkpICkKKyAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIHBtdC0+aE93bmVyV25kLCBobWVudXByZXYsIFRSVUUgKTsKKyAgICBwbXQtPmhDdXJyZW50TWVudSA9IGhtZW51cHJldjsgCisKKyAgICBpZiAoIChobWVudXByZXYgPT0gcG10LT5oVG9wTWVudSkgJiYgIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgKQogICAgIHsKLQkvKiBzZW5kIFdNX05FWFRNRU5VICovCisJLyogbW92ZSBtZW51IGJhciBzZWxlY3Rpb24gaWYgbm8gbW9yZSBwb3B1cHMgYXJlIGxlZnQgKi8KIAotCWlmKCAhTUVOVV9Eb05leHRNZW51KCBod25kT3duZXIsIGhtZW51LCBobWVudUN1cnJlbnQsIFZLX0xFRlQpICkKLQkgICAgIE1FTlVfU2VsZWN0SXRlbVJlbCggKmh3bmRPd25lciwgKmhtZW51LCBJVEVNX1BSRVYgKTsKLQllbHNlICpobWVudUN1cnJlbnQgPSAqaG1lbnU7CisJaWYoICFNRU5VX0RvTmV4dE1lbnUoIHBtdCwgVktfTEVGVCkgKQorCSAgICAgTUVOVV9Nb3ZlU2VsZWN0aW9uKCBwbXQtPmhPd25lclduZCwgcG10LT5oVG9wTWVudSwgSVRFTV9QUkVWICk7CiAKLQlpZiAoKmhtZW51Q3VycmVudCAhPSBobWVudXRtcCkKKwlpZiAoIGhtZW51cHJldiAhPSBobWVudXRtcCB8fCBwbXQtPnRyYWNrRmxhZ3MgJiBURl9TVVNQRU5EUE9QVVAgKQogCXsKLQkgICAgICAvKiBBIHN1YmxldmVsIG1lbnUgd2FzIGRpc3BsYXllZCAtPiBkaXNwbGF5IHRoZSBuZXh0IG9uZSAqLwotCSAgICAqaG1lbnVDdXJyZW50ID0gTUVOVV9TaG93U3ViUG9wdXAoICpod25kT3duZXIsICpobWVudSwgVFJVRSApOworCSAgIC8qIEEgc3VibGV2ZWwgbWVudSB3YXMgZGlzcGxheWVkIC0gZGlzcGxheSB0aGUgbmV4dCBvbmUKKwkgICAgKiB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBkaXNwbGFjZW1lbnQgY29taW5nIHVwICovCisKKwkgICAgaWYoICFNRU5VX1N1c3BlbmRQb3B1cCggcG10LCBXTV9LRVlET1dOICkgKQorCQlwbXQtPmhDdXJyZW50TWVudSA9IE1FTlVfU2hvd1N1YlBvcHVwKCBwbXQtPmhPd25lclduZCwKKwkJCQkJCXBtdC0+aFRvcE1lbnUsIFRSVUUgKTsKIAl9CiAgICAgfQotICAgIGVsc2UgKmhtZW51Q3VycmVudCA9IGhtZW51cHJldjsKIH0KIAogCkBAIC0xNTg5LDU3ICsxNzkzLDM5IEBACiAgKiAgICAgICAgICAgTUVOVV9LZXlSaWdodAogICoKICAqIEhhbmRsZSBhIFZLX1JJR0hUIGtleSBldmVudCBpbiBhIG1lbnUuCi0gKiBobWVudUN1cnJlbnQgaXMgdGhlIHRvcC1tb3N0IHZpc2libGUgcG9wdXAuCiAgKi8KLXN0YXRpYyB2b2lkIE1FTlVfS2V5UmlnaHQoIEhXTkQzMiogaHduZE93bmVyLCBITUVOVTMyKiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCApCitzdGF0aWMgdm9pZCBNRU5VX0tleVJpZ2h0KCBNVFJBQ0tFUiogcG10ICkKIHsKLSAgICBQT1BVUE1FTlUgKm1lbnU7CiAgICAgSE1FTlUzMiBobWVudXRtcDsKKyAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggcG10LT5oVG9wTWVudSApOwogCi0gICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCAqaG1lbnUgKTsKLQotICAgIGlmICgobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIHx8ICgqaG1lbnVDdXJyZW50ICE9ICpobWVudSkpCisgICAgaWYgKCAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIHx8IChwbXQtPmhDdXJyZW50TWVudSAhPSBwbXQtPmhUb3BNZW51KSkKICAgICB7Ci0JICAvKiBJZiBhbHJlYWR5IGRpc3BsYXlpbmcgYSBwb3B1cCwgdHJ5IHRvIGRpc3BsYXkgc3ViLXBvcHVwICovCi0JaG1lbnV0bXAgPSBNRU5VX1Nob3dTdWJQb3B1cCggKmh3bmRPd25lciwgKmhtZW51Q3VycmVudCwgVFJVRSApOwotCWlmIChobWVudXRtcCAhPSAqaG1lbnVDdXJyZW50KSAgLyogU3ViLXBvcHVwIGRpc3BsYXllZCAqLwotCXsKLQkgICAgKmhtZW51Q3VycmVudCA9IGhtZW51dG1wOwotCSAgICByZXR1cm47Ci0JfQorCS8qIElmIGFscmVhZHkgZGlzcGxheWluZyBhIHBvcHVwLCB0cnkgdG8gZGlzcGxheSBzdWItcG9wdXAgKi8KKworCWhtZW51dG1wID0gcG10LT5oQ3VycmVudE1lbnU7CisJcG10LT5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cCggcG10LT5oT3duZXJXbmQsIGhtZW51dG1wLCBUUlVFICk7CisKKwkvKiBpZiBzdWJwb3B1cCB3YXMgZGlzcGxheWVkIHRoZW4gd2UgYXJlIGRvbmUgKi8KKwlpZiAoaG1lbnV0bXAgIT0gcG10LT5oQ3VycmVudE1lbnUpIHJldHVybjsKICAgICB9CiAKLSAgICAgIC8qIElmIG1lbnUtYmFyIHRyYWNraW5nLCBnbyB0byBuZXh0IGl0ZW0gKi8KLQotICAgIGlmICghKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSB8fCAobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkpCisgICAgaWYgKCEobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApKQkvKiBtZW51IGJhciB0cmFja2luZyAqLwogICAgIHsKLQlNRU5VX0hpZGVTdWJQb3B1cHMoICpod25kT3duZXIsICpobWVudSwgRkFMU0UgKTsKLQlobWVudXRtcCA9ICpobWVudTsKLQotICAgICAgICAvKiBTZW5kIFdNX05FWFRNRU5VICovCi0KLQlpZiggIU1FTlVfRG9OZXh0TWVudSggaHduZE93bmVyLCBobWVudSwgaG1lbnVDdXJyZW50LCBWS19SSUdIVCkgKQotCSAgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCAqaHduZE93bmVyLCAqaG1lbnUsIElURU1fTkVYVCApOwotCWVsc2UgKmhtZW51Q3VycmVudCA9ICpobWVudTsKLQotCWlmICgqaG1lbnVDdXJyZW50ICE9IGhtZW51dG1wKQorCWlmKCBwbXQtPmhDdXJyZW50TWVudSAhPSBwbXQtPmhUb3BNZW51ICkKIAl7Ci0JICAgICAgLyogQSBzdWJsZXZlbCBtZW51IHdhcyBkaXNwbGF5ZWQgLT4gZGlzcGxheSB0aGUgbmV4dCBvbmUgKi8KLQkgICAgKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCAqaHduZE93bmVyLCAqaG1lbnUsIFRSVUUgKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKCpobWVudUN1cnJlbnQgIT0gKmhtZW51KSAgLyogSGlkZSBsYXN0IGxldmVsIHBvcHVwICovCi0gICAgewotCUhNRU5VMTYgaG1lbnVwcmV2OwotCWhtZW51cHJldiA9IGhtZW51dG1wID0gKmhtZW51OwotCXdoaWxlIChobWVudXRtcCAhPSAqaG1lbnVDdXJyZW50KQotCXsKLQkgICAgaG1lbnV0bXAgPSBNRU5VX0dldFN1YlBvcHVwKCBobWVudXByZXYgKTsKLQkgICAgaWYgKGhtZW51dG1wICE9ICpobWVudUN1cnJlbnQpIGhtZW51cHJldiA9IGhtZW51dG1wOwotCX0KLQlNRU5VX0hpZGVTdWJQb3B1cHMoICpod25kT3duZXIsIGhtZW51cHJldiwgVFJVRSApOwotCSpobWVudUN1cnJlbnQgPSBobWVudXByZXY7CisJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIEZBTFNFICk7CisJICAgIGhtZW51dG1wID0gcG10LT5oQ3VycmVudE1lbnUgPSBwbXQtPmhUb3BNZW51OworCX0gZWxzZSBobWVudXRtcCA9IDA7CisKKwkvKiB0cnkgdG8gbW92ZSB0byB0aGUgbmV4dCBpdGVtICovCisJaWYoICFNRU5VX0RvTmV4dE1lbnUoIHBtdCwgVktfUklHSFQpICkKKwkgICAgIE1FTlVfTW92ZVNlbGVjdGlvbiggcG10LT5oT3duZXJXbmQsIHBtdC0+aFRvcE1lbnUsIElURU1fTkVYVCApOworCisJaWYoIGhtZW51dG1wIHx8IHBtdC0+dHJhY2tGbGFncyAmIFRGX1NVU1BFTkRQT1BVUCApCisJICAgIGlmKCAhTUVOVV9TdXNwZW5kUG9wdXAocG10LCBXTV9LRVlET1dOKSApCisJCXBtdC0+aEN1cnJlbnRNZW51ID0gTUVOVV9TaG93U3ViUG9wdXAoIHBtdC0+aE93bmVyV25kLCAKKwkJCQkJCSAgICAgICBwbXQtPmhUb3BNZW51LCBUUlVFICk7CiAgICAgfQogfQogCkBAIC0xNjQ4LDg2ICsxODM0LDc1IEBACiAgKiAgICAgICAgICAgTUVOVV9UcmFja01lbnUKICAqCiAgKiBNZW51IHRyYWNraW5nIGNvZGUuCi0gKiBJZiAneCcgYW5kICd5JyBhcmUgbm90IDAsIHdlIHNpbXVsYXRlIGEgYnV0dG9uLWRvd24gZXZlbnQgYXQgKHgseSkKLSAqIGJlZm9yZSBiZWdpbm5pbmcgdHJhY2tpbmcuIFRoaXMgaXMgdG8gaGVscCBtZW51LWJhciB0cmFja2luZy4KICAqLwogc3RhdGljIEJPT0wzMiBNRU5VX1RyYWNrTWVudSggSE1FTlUzMiBobWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiBod25kLCBjb25zdCBSRUNUMzIgKmxwcmVjdCApCiB7CiAgICAgTVNHMTYgbXNnOwogICAgIFBPUFVQTUVOVSAqbWVudTsKLSAgICBITUVOVTMyIGhtZW51Q3VycmVudCA9IGhtZW51OwotICAgIEJPT0wzMiBmQ2xvc2VkID0gRkFMU0UsIGZSZW1vdmU7Ci0gICAgVUlOVDMyIHBvczsKLSAgICBQT0lOVDMyIHB0OworICAgIEJPT0wzMiBmUmVtb3ZlOworICAgIE1UUkFDS0VSIG10ID0geyAwLCBobWVudSwgaG1lbnUsIGh3bmQsIHt4LCB5fSB9OwkvKiBjb250cm9sIHN0cnVjdCAqLwogCi0gICAgZkVuZE1lbnVDYWxsZWQgPSBGQUxTRTsKKyAgICBmRW5kTWVudSA9IEZBTFNFOwogICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoeCAmJiB5KQotICAgIHsKLQlwdC54ID0geDsKLSAgICAgICAgcHQueSA9IHk7Ci0JTUVOVV9CdXR0b25Eb3duKCBod25kLCBobWVudSwgJmhtZW51Q3VycmVudCwgcHQgKTsKLSAgICB9CiAKLSAgICBFVkVOVF9DYXB0dXJlKCBod25kLCBIVE1FTlUgKTsKKyAgICBpZiAod0ZsYWdzICYgVFBNX0JVVFRPTkRPV04pIE1FTlVfQnV0dG9uRG93biggJm10LCBobWVudSApOwogCi0gICAgd2hpbGUgKCFmQ2xvc2VkKQorICAgIEVWRU5UX0NhcHR1cmUoIG10LmhPd25lclduZCwgSFRNRU5VICk7CisKKyAgICB3aGlsZSAoIWZFbmRNZW51KQogICAgIHsKKwltZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIG10LmhDdXJyZW50TWVudSApOworCW1zZy5od25kID0gKHdGbGFncyAmIFRQTV9FTlRFUklETEVFWCAmJiBtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgPyBtZW51LT5oV25kIDogMDsKKwogCS8qIHdlIGhhdmUgdG8ga2VlcCB0aGUgbWVzc2FnZSBpbiB0aGUgcXVldWUgdW50aWwgaXQncwotCSAqIGNsZWFyIHRoYXQgbWVudSBsb29wIGlzIG5vdCBvdmVyIHlldC4KLQkgKi8KKwkgKiBjbGVhciB0aGF0IG1lbnUgbG9vcCBpcyBub3Qgb3ZlciB5ZXQuICovCiAKLQlpZiAoIU1TR19JbnRlcm5hbEdldE1lc3NhZ2UoICZtc2csIDAsIGh3bmQsIE1TR0ZfTUVOVSwgCi0JCQkJCSAgICAgIFBNX05PUkVNT1ZFLCBUUlVFICkpCi0JICAgIGJyZWFrOworCWlmICghTVNHX0ludGVybmFsR2V0TWVzc2FnZSggJm1zZywgbXNnLmh3bmQsIG10LmhPd25lclduZCwKKwkJCQkgICAgIE1TR0ZfTUVOVSwgUE1fTk9SRU1PVkUsIFRSVUUgKSkgYnJlYWs7CiAKICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZTE2KCAmbXNnICk7Ci0gICAgICAgIENPTlZfUE9JTlQxNlRPMzIoICZtc2cucHQsICZwdCApOworICAgICAgICBDT05WX1BPSU5UMTZUTzMyKCAmbXNnLnB0LCAmbXQucHQgKTsKIAogICAgICAgICBmUmVtb3ZlID0gRkFMU0U7CiAJaWYgKChtc2cubWVzc2FnZSA+PSBXTV9NT1VTRUZJUlNUKSAmJiAobXNnLm1lc3NhZ2UgPD0gV01fTU9VU0VMQVNUKSkKIAl7Ci0JICAgICAgLyogRmluZCB0aGUgc3ViLXBvcHVwIGZvciB0aGlzIG1vdXNlIGV2ZW50IChpZiBhbnkpICovCisJICAgIC8qIEZpbmQgYSBtZW51IGZvciB0aGlzIG1vdXNlIGV2ZW50ICovCiAKLQkgICAgSE1FTlUzMiBoc3VibWVudSA9IE1FTlVfRmluZE1lbnVCeUNvb3JkcyggaG1lbnUsIHB0ICk7CisJICAgIGhtZW51ID0gTUVOVV9QdE1lbnUoIG10LmhUb3BNZW51LCBtc2cucHQgKTsKIAogCSAgICBzd2l0Y2gobXNnLm1lc3NhZ2UpCiAJICAgIHsKIAkJLyogbm8gV01fTkMuLi4gbWVzc2FnZXMgaW4gY2FwdHVyZWQgc3RhdGUgKi8KIAotCSAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6Ci0JICAgIGNhc2UgV01fUkJVVFRPTkRPV046Ci0JCWlmICghKHdGbGFncyAmIFRQTV9SSUdIVEJVVFRPTikpIGJyZWFrOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjYXNlIFdNX0xCVVRUT05EQkxDTEs6Ci0JICAgIGNhc2UgV01fTEJVVFRPTkRPV046Ci0JCWZDbG9zZWQgPSAhTUVOVV9CdXR0b25Eb3duKCBod25kLCBoc3VibWVudSwKLQkJCQkJICAgICZobWVudUN1cnJlbnQsIHB0ICk7Ci0JCWJyZWFrOworCQljYXNlIFdNX1JCVVRUT05EQkxDTEs6CisJCWNhc2UgV01fUkJVVFRPTkRPV046CisJCSAgICBpZiAoISh3RmxhZ3MgJiBUUE1fUklHSFRCVVRUT04pKSBicmVhazsKKwkJICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFdNX0xCVVRUT05EQkxDTEs6CisJCWNhc2UgV01fTEJVVFRPTkRPV046CisJCSAgICBmRW5kTWVudSB8PSAhTUVOVV9CdXR0b25Eb3duKCAmbXQsIGhtZW51ICk7CisJCSAgICBicmVhazsKIAkJCi0JICAgIGNhc2UgV01fUkJVVFRPTlVQOgotCQlpZiAoISh3RmxhZ3MgJiBUUE1fUklHSFRCVVRUT04pKSBicmVhazsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY2FzZSBXTV9MQlVUVE9OVVA6Ci0JCSAgLyogSWYgb3V0c2lkZSBhbGwgbWVudXMgYnV0IGluc2lkZSBscHJlY3QsIGlnbm9yZSBpdCAqLwotCQlpZiAoIWhzdWJtZW51ICYmIGxwcmVjdCAmJiBQdEluUmVjdDMyKGxwcmVjdCwgcHQpKSBicmVhazsKLQkJZkNsb3NlZCA9ICFNRU5VX0J1dHRvblVwKCBod25kLCBoc3VibWVudSwKLQkJCQkJICAmaG1lbnVDdXJyZW50LCBwdCApOwotICAgICAgICAgICAgICAgIGZSZW1vdmUgPSBUUlVFOyAgLyogUmVtb3ZlIGV2ZW50IGV2ZW4gaWYgb3V0c2lkZSBtZW51ICovCi0JCWJyZWFrOworCQljYXNlIFdNX1JCVVRUT05VUDoKKwkJICAgIGlmICghKHdGbGFncyAmIFRQTV9SSUdIVEJVVFRPTikpIGJyZWFrOworCQkgICAgLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgV01fTEJVVFRPTlVQOgorCQkgICAgLyogSWYgb3V0c2lkZSBhbGwgbWVudXMgYnV0IGluc2lkZSBscHJlY3QsIGlnbm9yZSBpdCAqLworCQkgICAgaWYgKGhtZW51IHx8ICFscHJlY3QgfHwgIVB0SW5SZWN0MzIobHByZWN0LCBtdC5wdCkpCisJCSAgICB7CisJCQlmRW5kTWVudSB8PSAhTUVOVV9CdXR0b25VcCggJm10LCBobWVudSApOworCQkJZlJlbW92ZSA9IFRSVUU7IAorCQkgICAgfQorCQkgICAgYnJlYWs7CiAJCQotCSAgICBjYXNlIFdNX01PVVNFTU9WRToKLQkJaWYgKChtc2cud1BhcmFtICYgTUtfTEJVVFRPTikgfHwKLQkJICAgICgod0ZsYWdzICYgVFBNX1JJR0hUQlVUVE9OKSAmJiAobXNnLndQYXJhbSAmIE1LX1JCVVRUT04pKSkKLQkJewotCQkgICAgZkNsb3NlZCA9ICFNRU5VX01vdXNlTW92ZSggaHduZCwgaHN1Ym1lbnUsCi0JCQkJCSAgICAgICAmaG1lbnVDdXJyZW50LCBwdCApOwotCQl9Ci0JCWJyZWFrOwotCSAgICB9CisJCWNhc2UgV01fTU9VU0VNT1ZFOgorCQkgICAgaWYgKChtc2cud1BhcmFtICYgTUtfTEJVVFRPTikgfHwgKCh3RmxhZ3MgJiBUUE1fUklHSFRCVVRUT04pIAorCQkJCQkJICAmJiAobXNnLndQYXJhbSAmIE1LX1JCVVRUT04pKSkKKwkJICAgIHsKKwkJCWZFbmRNZW51IHw9ICFNRU5VX01vdXNlTW92ZSggJm10LCBobWVudSApOworCQkgICAgfQorCSAgICB9IC8qIHN3aXRjaChtc2cubWVzc2FnZSkgLSBtb3VzZSAqLwogCX0KIAllbHNlIGlmICgobXNnLm1lc3NhZ2UgPj0gV01fS0VZRklSU1QpICYmIChtc2cubWVzc2FnZSA8PSBXTV9LRVlMQVNUKSkKIAl7CkBAIC0xNzM5LDM5ICsxOTE0LDM4IEBACiAJCXsKIAkJY2FzZSBWS19IT01FOgogCQljYXNlIFZLX0VORDoKLQkJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSApOwotCisJCSAgICBNRU5VX1NlbGVjdEl0ZW0oIG10LmhPd25lclduZCwgbXQuaEN1cnJlbnRNZW51LCAKKwkJCQkgICAgIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIFZLX1VQOgotCQkgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCBod25kLCBobWVudUN1cnJlbnQsIAorCQkgICAgTUVOVV9Nb3ZlU2VsZWN0aW9uKCBtdC5oT3duZXJXbmQsIG10LmhDdXJyZW50TWVudSwgCiAJCQkJICAgICAgIChtc2cud1BhcmFtID09IFZLX0hPTUUpPyBJVEVNX05FWFQgOiBJVEVNX1BSRVYgKTsKIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgVktfRE9XTjogLyogSWYgb24gbWVudSBiYXIsIHB1bGwtZG93biB0aGUgbWVudSAqLwogCi0JCSAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7Ci0JCSAgICBpZiAoIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgJiYgKGhtZW51Q3VycmVudCA9PSBobWVudSkpCi0JCQlobWVudUN1cnJlbnQgPSBNRU5VX1Nob3dTdWJQb3B1cCggaHduZCwgaG1lbnUsIFRSVUUgKTsKLQkJICAgIGVsc2UKLQkJCU1FTlVfU2VsZWN0SXRlbVJlbCggaHduZCwgaG1lbnVDdXJyZW50LCBJVEVNX05FWFQgKTsKKwkJICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggbXQuaEN1cnJlbnRNZW51ICk7CisJCSAgICBpZiAoIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkpCisJCQltdC5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cCggbXQuaE93bmVyV25kLCBtdC5oVG9wTWVudSwgVFJVRSApOworCQkgICAgZWxzZSAgICAgIC8qIG90aGVyd2lzZSB0cnkgdG8gbW92ZSBzZWxlY3Rpb24gKi8KKwkJCU1FTlVfTW92ZVNlbGVjdGlvbiggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsIElURU1fTkVYVCApOwogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBWS19MRUZUOgotCQkgICAgTUVOVV9LZXlMZWZ0KCAmaHduZCwgJmhtZW51LCAmaG1lbnVDdXJyZW50ICk7CisJCSAgICBNRU5VX0tleUxlZnQoICZtdCApOwogCQkgICAgYnJlYWs7CiAJCSAgICAKIAkJY2FzZSBWS19SSUdIVDoKLQkJICAgIE1FTlVfS2V5UmlnaHQoICZod25kLCAmaG1lbnUsICZobWVudUN1cnJlbnQgKTsKKwkJICAgIE1FTlVfS2V5UmlnaHQoICZtdCApOwogCQkgICAgYnJlYWs7CiAJCSAgICAKIAkJY2FzZSBWS19TUEFDRToKIAkJY2FzZSBWS19SRVRVUk46Ci0JCSAgICBmQ2xvc2VkID0gIU1FTlVfRXhlY0ZvY3VzZWRJdGVtKCBod25kLCBobWVudUN1cnJlbnQsCi0JCQkJCQkgICAgICZobWVudUN1cnJlbnQgKTsKKwkJICAgIGZFbmRNZW51IHw9ICFNRU5VX0V4ZWNGb2N1c2VkSXRlbSggJm10LCBtdC5oQ3VycmVudE1lbnUgKTsKIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgVktfRVNDQVBFOgotCQkgICAgZkNsb3NlZCA9IFRSVUU7CisJCSAgICBmRW5kTWVudSA9IFRSVUU7CiAJCSAgICBicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTc4Myw3ICsxOTU3LDcgQEAKIAkJc3dpdGNoKG1zZy53UGFyYW0pCiAJCXsKIAkJY2FzZSBWS19NRU5VOgotCQkgICAgZkNsb3NlZCA9IFRSVUU7CisJCSAgICBmRW5kTWVudSA9IFRSVUU7CiAJCSAgICBicmVhazsKIAkJICAgIAogCQl9CkBAIC0xNzkxLDgxICsxOTY1LDU4IEBACiAKIAkgICAgY2FzZSBXTV9DSEFSOgogCQl7CisJCSAgICBVSU5UMzIJcG9zOworCiAJCSAgICAgIC8qIEhhY2sgdG8gYXZvaWQgY29udHJvbCBjaGFycy4gKi8KIAkJICAgICAgLyogV2Ugd2lsbCBmaW5kIGEgYmV0dGVyIHdheSByZWFsIHNvb24uLi4gKi8KIAkJICAgIGlmICgobXNnLndQYXJhbSA8PSAzMikgfHwgKG1zZy53UGFyYW0gPj0gMTI3KSkgYnJlYWs7Ci0JCSAgICBwb3MgPSBNRU5VX0ZpbmRJdGVtQnlLZXkoIGh3bmQsIGhtZW51Q3VycmVudCwgbXNnLndQYXJhbSwgRkFMU0UgKTsKLQkJICAgIGlmIChwb3MgPT0gKFVJTlQzMiktMikgZkNsb3NlZCA9IFRSVUU7CisKKwkJICAgIHBvcyA9IE1FTlVfRmluZEl0ZW1CeUtleSggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsIAorCQkJCQkJCW1zZy53UGFyYW0sIEZBTFNFICk7CisJCSAgICBpZiAocG9zID09IChVSU5UMzIpLTIpIGZFbmRNZW51ID0gVFJVRTsKIAkJICAgIGVsc2UgaWYgKHBvcyA9PSAoVUlOVDMyKS0xKSBNZXNzYWdlQmVlcDMyKDApOwogCQkgICAgZWxzZQogCQkgICAgewotCQkJTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudUN1cnJlbnQsIHBvcywgVFJVRSApOwotCQkJZkNsb3NlZCA9ICFNRU5VX0V4ZWNGb2N1c2VkSXRlbSggaHduZCwgaG1lbnVDdXJyZW50LAotCQkJCQkJCSAmaG1lbnVDdXJyZW50ICk7Ci0JCQkKKwkJCU1FTlVfU2VsZWN0SXRlbSggbXQuaE93bmVyV25kLCBtdC5oQ3VycmVudE1lbnUsIHBvcywgVFJVRSApOworCQkJZkVuZE1lbnUgfD0gIU1FTlVfRXhlY0ZvY3VzZWRJdGVtKCAmbXQsIG10LmhDdXJyZW50TWVudSApOwogCQkgICAgfQogCQl9CQkgICAgCi0JCWJyZWFrOyAgLyogV01fQ0hBUiAqLwotCSAgICB9ICAvKiBzd2l0Y2gobXNnLm1lc3NhZ2UpICovCisJCWJyZWFrOworCSAgICB9ICAvKiBzd2l0Y2gobXNnLm1lc3NhZ2UpIC0ga2JkICovCiAJfQogCWVsc2UKIAl7CiAJICAgIERpc3BhdGNoTWVzc2FnZTE2KCAmbXNnICk7CiAJfQotCWlmIChmRW5kTWVudUNhbGxlZCkgZkNsb3NlZCA9IFRSVUU7Ci0JaWYgKCFmQ2xvc2VkKSBmUmVtb3ZlID0gVFJVRTsKIAotICAgICAgICBpZiAoZlJlbW92ZSkgIC8qIFJlbW92ZSB0aGUgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZSAqLworCWlmICghZkVuZE1lbnUpIGZSZW1vdmUgPSBUUlVFOworCisJLyogZmluYWxseSByZW1vdmUgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZSAqLworCisgICAgICAgIGlmIChmUmVtb3ZlICYmICEobXQudHJhY2tGbGFncyAmIFRGX1NLSVBSRU1PVkUpICkKIAkgICAgUGVla01lc3NhZ2UxNiggJm1zZywgMCwgbXNnLm1lc3NhZ2UsIG1zZy5tZXNzYWdlLCBQTV9SRU1PVkUgKTsKKwllbHNlIG10LnRyYWNrRmxhZ3MgJj0gflRGX1NLSVBSRU1PVkU7CiAgICAgfQogCiAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmQsIGhtZW51LCBGQUxTRSApOwotICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKLSAgICBpZiAobWVudSAmJiBtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgCisgICAgaWYoIElzV2luZG93MzIoIG10LmhPd25lclduZCApICkKICAgICB7Ci0gICAgICAgICBTaG93V2luZG93MzIoIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKLQkgdVN1YlBXbmRMZXZlbCA9IDA7CisJTUVOVV9IaWRlU3ViUG9wdXBzKCBtdC5oT3duZXJXbmQsIG10LmhUb3BNZW51LCBGQUxTRSApOworCisJbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBtdC5oVG9wTWVudSApOworCWlmIChtZW51ICYmIG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSAKKwl7CisJICAgIFNob3dXaW5kb3czMiggbWVudS0+aFduZCwgU1dfSElERSApOworCSAgICB1U3ViUFduZExldmVsID0gMDsKKwl9CisJTUVOVV9TZWxlY3RJdGVtKCBtdC5oT3duZXJXbmQsIG10LmhUb3BNZW51LCBOT19TRUxFQ1RFRF9JVEVNLCBGQUxTRSApOworCVNlbmRNZXNzYWdlMTYoIG10LmhPd25lclduZCwgV01fTUVOVVNFTEVDVCwgMCwgTUFLRUxPTkcoIDB4ZmZmZiwgMCApICk7CiAgICAgfQotICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7Ci0gICAgU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fTUVOVVNFTEVDVCwgMCwgTUFLRUxPTkcoIDB4ZmZmZiwgMCApICk7Ci0gICAgZkVuZE1lbnVDYWxsZWQgPSBGQUxTRTsKKyAgICBmRW5kTWVudSA9IEZBTFNFOwogICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNRU5VX1RyYWNrU3lzUG9wdXAKLSAqLwotc3RhdGljIHZvaWQgTUVOVV9UcmFja1N5c1BvcHVwKCBXTkQqIHBXbmQgKQotewotICAgIFJFQ1QzMiAgcmVjdDsKLSAgICBITUVOVTMyIGhNZW51ID0gcFduZC0+aFN5c01lbnU7Ci0gICAgSERDMzIgICBoREMgPSAwOwotCi0gICAgLyogdHJhY2sgdGhlIHN5c3RlbSBtZW51IGxpa2UgYSBub3JtYWwgcG9wdXAgbWVudSAqLwotCi0gICAgaWYoSXNNZW51MzIoaE1lbnUpKQotICAgIHsKLQlIV05EMzIgaFduZCA9IHBXbmQtPmh3bmRTZWxmOwotCWlmICghKHBXbmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkpCi0JewotCSAgICBoREMgPSBHZXRXaW5kb3dEQzMyKCBoV25kICk7Ci0JICAgIE5DX0RyYXdTeXNCdXR0b24oIGhXbmQsIGhEQywgVFJVRSApOwotCX0KLQlOQ19HZXRTeXNQb3B1cFBvcyggcFduZCwgJnJlY3QgKTsKLQlNRU5VX0luaXRTeXNNZW51UG9wdXAoIGhNZW51LCBwV25kLT5kd1N0eWxlLAotCQkJCSAgICAgIHBXbmQtPmNsYXNzLT5zdHlsZSk7Ci0JVHJhY2tQb3B1cE1lbnUzMiggaE1lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgMCwgaFduZCwgJnJlY3QgKTsKLQlpZiAoIShwV25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpKQotCXsKLSAgICAgICAgICAgICBOQ19EcmF3U3lzQnV0dG9uKCBoV25kLCBoREMsIEZBTFNFICk7Ci0gICAgICAgICAgICAgUmVsZWFzZURDMzIoIGhXbmQsIGhEQyApOwotCX0KLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfSW5pdFRyYWNraW5nCiAgKi8KIHN0YXRpYyBCT09MMzIgTUVOVV9Jbml0VHJhY2tpbmcoSFdORDMyIGhXbmQsIEhNRU5VMzIgaE1lbnUpCkBAIC0xODg0LDE5ICsyMDM1LDE1IEBACiAgKi8KIHZvaWQgTUVOVV9UcmFja01vdXNlTWVudUJhciggV05EKiB3bmRQdHIsIElOVDMyIGh0LCBQT0lOVDMyIHB0ICkKIHsKLSAgICBCT09MMzIgIGJUcmFja1N5cyA9ICgoaHQgPT0gSFRTWVNNRU5VICYmICF3bmRQdHItPndJRG1lbnUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHduZFB0ci0+ZHdTdHlsZSAmIChXU19NSU5JTUlaRSB8IFdTX0NISUxEKSkpOwogICAgIEhXTkQzMiAgaFduZCA9IHduZFB0ci0+aHduZFNlbGY7Ci0gICAgSE1FTlUzMiBoTWVudSA9IChiVHJhY2tTeXMpID8gd25kUHRyLT5oU3lzTWVudSA6IHduZFB0ci0+d0lEbWVudTsKKyAgICBITUVOVTMyIGhNZW51ID0gKGh0ID09IEhUU1lTTUVOVSkgPyB3bmRQdHItPmhTeXNNZW51IDogd25kUHRyLT53SURtZW51OwogCiAgICAgaWYgKElzTWVudTMyKGhNZW51KSkKICAgICB7CiAJTUVOVV9Jbml0VHJhY2tpbmcoIGhXbmQsIGhNZW51ICk7Ci0JaWYoIGJUcmFja1N5cyApCi0JICAgIE1FTlVfVHJhY2tTeXNQb3B1cCggd25kUHRyICk7Ci0JZWxzZQotCSAgICBNRU5VX1RyYWNrTWVudSggaE1lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKLQkJCSAgICBwdC54LCBwdC55LCBoV25kLCBOVUxMICk7CisJTUVOVV9UcmFja01lbnUoIGhNZW51LCBUUE1fRU5URVJJRExFRVggfCBUUE1fQlVUVE9ORE9XTiB8IAorCQkgICAgICAgIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwgcHQueCwgcHQueSwgaFduZCwgTlVMTCApOworCiAJU2VuZE1lc3NhZ2UxNiggaFduZCwgV01fRVhJVE1FTlVMT09QLCAwLCAwICk7CiAJU2hvd0NhcmV0MzIoMCk7CiAgICAgfQpAQCAtMTkxMCw3ICsyMDU3LDYgQEAKICAqLwogdm9pZCBNRU5VX1RyYWNrS2JkTWVudUJhciggV05EKiB3bmRQdHIsIFVJTlQzMiB3UGFyYW0sIElOVDMyIHZrZXkpCiB7Ci0gICBJTlQzMiBodE1lbnU7CiAgICBVSU5UMzIgdUl0ZW0gPSBOT19TRUxFQ1RFRF9JVEVNOwogICAgSE1FTlUzMiBoVHJhY2tNZW51OyAKIApAQCAtMTkxOCw1NCArMjA2NCw0NyBAQAogIAogICAgIHdoaWxlKCB3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICkKIAlpZiggISh3bmRQdHIgPSB3bmRQdHItPnBhcmVudCkgKSByZXR1cm47Ci0gICAgICAgICAgCi0gICAgaWYoICF3bmRQdHItPndJRG1lbnUgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKSApIHJldHVybjsKIAotICAgIGlmKCh3bmRQdHItPmR3U3R5bGUgJiAoV1NfQ0hJTEQgfCBXU19NSU5JTUlaRSkpIHx8ICF3bmRQdHItPndJRG1lbnUpIAorICAgIC8qIGNoZWNrIGlmIHdlIGhhdmUgdG8gdHJhY2sgYSBzeXN0ZW0gbWVudSAqLworICAgICAgICAgIAorICAgIGlmKCAod25kUHRyLT5kd1N0eWxlICYgKFdTX0NISUxEIHwgV1NfTUlOSU1JWkUpKSB8fCAKKwkhd25kUHRyLT53SURtZW51IHx8IHZrZXkgPT0gVktfU1BBQ0UgKQogICAgIHsKKwlpZiggISh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKSApIHJldHVybjsKIAloVHJhY2tNZW51ID0gd25kUHRyLT5oU3lzTWVudTsKLQlodE1lbnUgPSBIVFNZU01FTlU7CisJdUl0ZW0gPSAwOworCXdQYXJhbSB8PSBIVFNZU01FTlU7CS8qIHByZXZlbnQgaXRlbSBsb29rdXAgKi8KICAgICB9CiAgICAgZWxzZQotICAgIHsKIAloVHJhY2tNZW51ID0gd25kUHRyLT53SURtZW51OwotCWh0TWVudSA9IEhUTUVOVTsKLSAgICB9CiAKICAgICBpZiAoSXNNZW51MzIoIGhUcmFja01lbnUgKSkKICAgICB7CiAJTUVOVV9Jbml0VHJhY2tpbmcoIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUgKTsKIAotICAgICAgICBpZiggdmtleSA9PSBWS19TUEFDRSApCi0gICAgICAgICAgICB1SXRlbSA9IFNZU01FTlVfU0VMRUNURUQ7Ci0gICAgICAgIGVsc2UgaWYoIHZrZXkgKQorICAgICAgICBpZiggdmtleSAmJiB2a2V5ICE9IFZLX1NQQUNFICkKICAgICAgICAgewogICAgICAgICAgICAgdUl0ZW0gPSBNRU5VX0ZpbmRJdGVtQnlLZXkoIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUsIAotCQkJCQl2a2V5LCAoaHRNZW51ID09IEhUU1lTTUVOVSkgKTsKKwkJCQkJdmtleSwgKHdQYXJhbSAmIEhUU1lTTUVOVSkgKTsKIAkgICAgaWYoIHVJdGVtID49IChVSU5UMzIpKC0yKSApCiAJICAgIHsKIAkgICAgICAgIGlmKCB1SXRlbSA9PSAoVUlOVDMyKSgtMSkgKSBNZXNzYWdlQmVlcDMyKDApOwotCQlodE1lbnUgPSAwOworCQloVHJhY2tNZW51ID0gMDsKIAkgICAgfQogICAgICAgICB9CiAKLQlzd2l0Y2goIGh0TWVudSApCisJaWYoIGhUcmFja01lbnUgKQogCXsKLQkgICAgY2FzZSBIVE1FTlU6Ci0gCQlNRU5VX1NlbGVjdEl0ZW0oIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUsIHVJdGVtLCBUUlVFICk7Ci0JCWlmKCB1SXRlbSA9PSBOT19TRUxFQ1RFRF9JVEVNICkKLQkJICAgIE1FTlVfU2VsZWN0SXRlbVJlbCggd25kUHRyLT5od25kU2VsZiwgaFRyYWNrTWVudSwgSVRFTV9ORVhUICk7Ci0JCWVsc2UKLQkJICAgIFBvc3RNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIFdNX0tFWURPV04sIFZLX0RPV04sIDBMICk7CisgCSAgICBNRU5VX1NlbGVjdEl0ZW0oIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUsIHVJdGVtLCBUUlVFICk7CiAKLQkJTUVOVV9UcmFja01lbnUoIGhUcmFja01lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKLQkJCQkwLCAwLCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMICk7Ci0JCWJyZWFrOworCSAgICBpZiggdUl0ZW0gPT0gTk9fU0VMRUNURURfSVRFTSApCisJCU1FTlVfTW92ZVNlbGVjdGlvbiggd25kUHRyLT5od25kU2VsZiwgaFRyYWNrTWVudSwgSVRFTV9ORVhUICk7CisJICAgIGVsc2UgaWYoIHZrZXkgKQorCQlQb3N0TWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9LRVlET1dOLCBWS19ET1dOLCAwTCApOwogCi0JICAgIGNhc2UgSFRTWVNNRU5VOgotCQlNRU5VX1RyYWNrU3lzUG9wdXAoIHduZFB0ciApOworCSAgICBNRU5VX1RyYWNrTWVudSggaFRyYWNrTWVudSwgVFBNX0VOVEVSSURMRUVYIHwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAorCQkJICAgIDAsIDAsIHduZFB0ci0+aHduZFNlbGYsIE5VTEwgKTsKIAl9Ci0KICAgICAgICAgU2VuZE1lc3NhZ2UxNiggd25kUHRyLT5od25kU2VsZiwgV01fRVhJVE1FTlVMT09QLCAwLCAwICk7CiAgICAgICAgIFNob3dDYXJldDMyKDApOwogICAgIH0KQEAgLTE5OTYsNyArMjEzNSw3IEBACiAKICAgICBIaWRlQ2FyZXQzMigwKTsKICAgICBpZiAoTUVOVV9TaG93UG9wdXAoIGhXbmQsIGhNZW51LCAwLCB4LCB5LCAwLCAwICkpIAotCXJldCA9IE1FTlVfVHJhY2tNZW51KCBoTWVudSwgd0ZsYWdzLCAwLCAwLCBoV25kLCBscFJlY3QgKTsKKwlyZXQgPSBNRU5VX1RyYWNrTWVudSggaE1lbnUsIHdGbGFncyAmIH5UUE1fSU5URVJOQUwsIDAsIDAsIGhXbmQsIGxwUmVjdCApOwogICAgIFNob3dDYXJldDMyKDApOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0yMDE0LDEwICsyMTUzLDE0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBvcHVwTWVudVduZFByb2MKKyAqCisgKiBOT1RFOiBXaW5kb3dzIGhhcyB0b3RhbGx5IGRpZmZlcmVudCAoYW5kIHVuZG9jdW1lbnRlZCkgcG9wdXAgd25kcHJvYy4KICAqLwogTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCiB7ICAgIAorICAgIFdORCogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisKICAgICBzd2l0Y2gobWVzc2FnZSkKICAgICB7CiAgICAgY2FzZSBXTV9DUkVBVEU6CkBAIC0yMDM5LDIxICsyMTgyLDQ1IEBACiAJICAgIEVuZFBhaW50MzIoIGh3bmQsICZwcyApOwogCSAgICByZXR1cm4gMDsKIAl9CisgICAgY2FzZSBXTV9FUkFTRUJLR05EOgorCXJldHVybiAxOwogCiAgICAgY2FzZSBXTV9ERVNUUk9ZOgotCSAgICAvKiB6ZXJvIG91dCBnbG9iYWwgcG9pbnRlciBpbiBjYXNlIHN5c3RlbSBwb3B1cAotCSAgICAgKiB3YXMgZGVzdHJveWVkIGJ5IEFwcEV4aXQgCi0JICAgICAqLwogCi0JICAgIGlmKCBod25kID09IHBUb3BQV25kLT5od25kU2VsZiApCi0JICAgIHsJcFRvcFBXbmQgPSBOVUxMOyB1U3ViUFduZExldmVsID0gMDsgfQotCSAgICBlbHNlCi0JCXVTdWJQV25kTGV2ZWwtLTsKLQkgICAgYnJlYWs7CisJLyogemVybyBvdXQgZ2xvYmFsIHBvaW50ZXIgaW4gY2FzZSByZXNpZGVudCBwb3B1cCB3aW5kb3cKKwkgKiB3YXMgc29tZWhvdyBkZXN0cm95ZWQuICovCiAKLSAgICBjYXNlIFdNX1VTRVI6Ci0JaWYgKHdQYXJhbSkgU2V0V2luZG93TG9uZzMyQSggaHduZCwgMCwgKEhNRU5VMTYpd1BhcmFtICk7CisJaWYoIGh3bmQgPT0gcFRvcFBvcHVwV25kLT5od25kU2VsZiApCisJewkKKwkgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwicmVzaWRlbnQgcG9wdXAgZGVzdHJveWVkIVxuIik7CisKKwkgICAgcFRvcFBvcHVwV25kID0gTlVMTDsgCisJICAgIHVTdWJQV25kTGV2ZWwgPSAwOyAKKwl9CisJZWxzZQorCSAgICB1U3ViUFduZExldmVsLS07CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX1NIT1dXSU5ET1c6CisKKwlpZiggd1BhcmFtICkKKwl7CisJICAgIGlmKCAhKCooSE1FTlUzMiopd25kUHRyLT53RXh0cmEpICkKKwkJZnByaW50ZihzdGRlcnIsIk1lbnVXbmRQcm9jOiBubyBtZW51IHRvIGRpc3BsYXlcbiIpOworCX0KKwllbHNlCisJICAgICooSE1FTlUzMiopd25kUHRyLT53RXh0cmEgPSAwOworCWJyZWFrOworCisgICAgY2FzZSBNTV9TRVRNRU5VSEFORExFOgorCisJKihITUVOVTMyKil3bmRQdHItPndFeHRyYSA9IChITUVOVTMyKXdQYXJhbTsKICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1NX0dFVE1FTlVIQU5ETEU6CisKKwlyZXR1cm4gKihITUVOVTMyKil3bmRQdHItPndFeHRyYTsKKwogICAgIGRlZmF1bHQ6CiAJcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgfQpAQCAtMjA5NSw5ICsyMjYyLDExIEBACiAgICAgICAgICAgICAgICAgICBoTWVudSwgcG9zLCAoRFdPUkQpZGF0YSwgaWQsIGZsYWdzICk7CiAgICAgaWYgKGZsYWdzICYgTUZfQVBQRU5EKSByZXR1cm4gQXBwZW5kTWVudTE2KCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKKwogICAgIC8qIEZJWE1FOiBXb3JkIHBhc3NlcyB0aGUgaXRlbSBpZCBpbiAncG9zJyBhbmQgMCBvciAweGZmZmYgYXMgaWQgKi8KICAgICAvKiBmb3IgTUZfREVMRVRFLiBXZSBzaG91bGQgY2hlY2sgdGhlIHBhcmFtZXRlcnMgZm9yIGFsbCBvdGhlcnMgKi8KICAgICAvKiBNRl8qIGFjdGlvbnMgYWxzbyAoYW55Ym9keSBnb3QgYSBkb2Mgb24gQ2hhbmdlTWVudT8pLiAqLworCiAgICAgaWYgKGZsYWdzICYgTUZfREVMRVRFKSByZXR1cm4gRGVsZXRlTWVudTE2KGhNZW51LCBwb3MsIGZsYWdzICYgfk1GX0RFTEVURSk7CiAgICAgaWYgKGZsYWdzICYgTUZfQ0hBTkdFKSByZXR1cm4gTW9kaWZ5TWVudTE2KGhNZW51LCBwb3MsIGZsYWdzICYgfk1GX0NIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKQEAgLTI0MjUsOCArMjU5NCw3IEBACiAgICAgaWYgKGZsYWdzICYgTUZfUE9QVVApICAvKiBTZXQgdGhlIE1GX1BPUFVQIGZsYWcgb24gdGhlIHBvcHVwLW1lbnUgKi8KIAkoKFBPUFVQTUVOVSAqKVVTRVJfSEVBUF9MSU5fQUREUigoSE1FTlUxNilpZCkpLT53RmxhZ3MgfD0gTUZfUE9QVVA7CiAKLSAgICBpdGVtLT5oQ2hlY2tCaXQgICA9IGhTdGRDaGVjazsKLSAgICBpdGVtLT5oVW5DaGVja0JpdCA9IDA7CisgICAgaXRlbS0+cENCID0gTlVMTDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjUwMCw4ICsyNjY4LDggQEAKICAgICAKICAgICAgIC8qIFJlbW92ZSBpdGVtICovCiAKLSAgICBpZiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+aXRlbV9mbGFncykgJiYgaXRlbS0+dGV4dCkKLSAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGl0ZW0tPnRleHQgKTsKKyAgICBNRU5VX0ZyZWVJdGVtRGF0YSggaXRlbSApOworCiAgICAgaWYgKC0tbWVudS0+bkl0ZW1zID09IDApCiAgICAgewogICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbWVudS0+aXRlbXMgKTsKQEAgLTI2NTgsMTUgKzI4MjYsMTYgQEAKIAogICAgIGlmICghaE5ld0NoZWNrICYmICFoTmV3VW5DaGVjaykKICAgICB7Ci0JICAvKiBJZiBib3RoIGFyZSBOVUxMLCByZXN0b3JlIGRlZmF1bHQgYml0bWFwcyAqLwotCWl0ZW0tPmhDaGVja0JpdCAgID0gaFN0ZENoZWNrOwotCWl0ZW0tPmhVbkNoZWNrQml0ID0gMDsKKwlpZiggaXRlbS0+cENCICkgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGl0ZW0tPnBDQiApOworCWl0ZW0tPnBDQiA9IE5VTEw7CiAJaXRlbS0+aXRlbV9mbGFncyAmPSB+TUZfVVNFQ0hFQ0tCSVRNQVBTOwogICAgIH0KICAgICBlbHNlICAvKiBJbnN0YWxsIG5ldyBiaXRtYXBzICovCiAgICAgewotCWl0ZW0tPmhDaGVja0JpdCAgID0gaE5ld0NoZWNrOwotCWl0ZW0tPmhVbkNoZWNrQml0ID0gaE5ld1VuQ2hlY2s7CisJaWYoIGl0ZW0tPnBDQiA9PSBOVUxMICkgCisJICAgIGl0ZW0tPnBDQiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKENCSVRNQVBTKSk7CisJaXRlbS0+cENCLT5oQ2hlY2tCaXQgPSBoTmV3Q2hlY2s7CisJaXRlbS0+cENCLT5oVW5DaGVja0JpdCA9IGhOZXdVbkNoZWNrOwogCWl0ZW0tPml0ZW1fZmxhZ3MgfD0gTUZfVVNFQ0hFQ0tCSVRNQVBTOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTI3MTksMzUgKzI4ODgsNDIgQEAKICAqLwogQk9PTDMyIERlc3Ryb3lNZW51MzIoIEhNRU5VMzIgaE1lbnUgKQogewotICAgIExQUE9QVVBNRU5VIGxwcG9wOwogICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51KCUwNHgpXG4iLCBoTWVudSk7CiAKLSAgICBpZiAoaE1lbnUgPT0gMCkgcmV0dXJuIEZBTFNFOwotICAgIC8qIFNpbGVudGx5IGlnbm9yZSBhdHRlbXB0cyB0byBkZXN0cm95IGRlZmF1bHQgc3lzdGVtIG1lbnUgKi8KLSAgICBpZiAoaE1lbnUgPT0gTUVOVV9EZWZTeXNNZW51KSByZXR1cm4gVFJVRTsKLSAgICBscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKLSAgICBpZiAoIWxwcG9wIHx8IChscHBvcC0+d01hZ2ljICE9IE1FTlVfTUFHSUMpKSByZXR1cm4gRkFMU0U7Ci0gICAgbHBwb3AtPndNYWdpYyA9IDA7ICAvKiBNYXJrIGl0IGFzIGRlc3Ryb3llZCAqLwotICAgIGlmICgobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSAmJgotICAgICAgICBscHBvcC0+aFduZCAmJgotICAgICAgICAoIXBUb3BQV25kIHx8IChscHBvcC0+aFduZCAhPSBwVG9wUFduZC0+aHduZFNlbGYpKSkKLSAgICAgICAgRGVzdHJveVdpbmRvdzMyKCBscHBvcC0+aFduZCApOworICAgIC8qIFNpbGVudGx5IGlnbm9yZSBhdHRlbXB0cyB0byBkZXN0cm95IGRlZmF1bHQgc3lzdGVtIHBvcHVwICovCiAKLSAgICBpZiAobHBwb3AtPml0ZW1zKQorICAgIGlmIChoTWVudSAmJiBoTWVudSAhPSBNRU5VX0RlZlN5c1BvcHVwKQogICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIE1FTlVJVEVNICppdGVtID0gbHBwb3AtPml0ZW1zOwotICAgICAgICBmb3IgKGkgPSBscHBvcC0+bkl0ZW1zOyBpID4gMDsgaS0tLCBpdGVtKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpdGVtLT5pdGVtX2ZsYWdzICYgTUZfUE9QVVApCi0gICAgICAgICAgICAgICAgRGVzdHJveU1lbnUzMiggKEhNRU5VMzIpaXRlbS0+aXRlbV9pZCApOwotCSAgICBpZiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+aXRlbV9mbGFncykgJiYgaXRlbS0+dGV4dCkKLSAgICAgICAgICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgaXRlbS0+dGV4dCApOwotICAgICAgICB9Ci0gICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBscHBvcC0+aXRlbXMgKTsKKwlMUFBPUFVQTUVOVSBscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKKworCWlmKCBwVG9wUG9wdXBXbmQgJiYgKGhNZW51ID09ICooSE1FTlUzMiopcFRvcFBvcHVwV25kLT53RXh0cmEpICkKKwkgICooVUlOVDMyKilwVG9wUG9wdXBXbmQtPndFeHRyYSA9IDA7CisKKwlpZiAobHBwb3AgJiYgKGxwcG9wLT53TWFnaWMgPT0gTUVOVV9NQUdJQykpCisJeworCSAgICBscHBvcC0+d01hZ2ljID0gMDsgIC8qIE1hcmsgaXQgYXMgZGVzdHJveWVkICovCisKKwkgICAgaWYgKChscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICYmIGxwcG9wLT5oV25kICYmCisJICAgICAgICAoIXBUb3BQb3B1cFduZCB8fCAobHBwb3AtPmhXbmQgIT0gcFRvcFBvcHVwV25kLT5od25kU2VsZikpKQorCSAgICAgICAgRGVzdHJveVdpbmRvdzMyKCBscHBvcC0+aFduZCApOworCisJICAgIGlmIChscHBvcC0+aXRlbXMpCS8qIHJlY3Vyc2l2ZWx5IGRlc3Ryb3kgc3VibWVudXMgKi8KKwkgICAgeworCSAgICAgICAgaW50IGk7CisJICAgICAgICBNRU5VSVRFTSAqaXRlbSA9IGxwcG9wLT5pdGVtczsKKwkgICAgICAgIGZvciAoaSA9IGxwcG9wLT5uSXRlbXM7IGkgPiAwOyBpLS0sIGl0ZW0rKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBpZiAoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKQorCSAgICAgICAgICAgICAgICBEZXN0cm95TWVudTMyKCAoSE1FTlUzMilpdGVtLT5pdGVtX2lkICk7CisJCSAgICBNRU5VX0ZyZWVJdGVtRGF0YSggaXRlbSApOworCSAgICAgICAgfQorCSAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGxwcG9wLT5pdGVtcyApOworCSAgICB9CisJICAgIFVTRVJfSEVBUF9GUkVFKCBoTWVudSApOworCX0KKwllbHNlIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgVVNFUl9IRUFQX0ZSRUUoIGhNZW51ICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIChoTWVudSAhPSBNRU5VX0RlZlN5c1BvcHVwKTsKIH0KIAogCkBAIC0yNzY2LDE3ICsyOTQyLDMyIEBACiBITUVOVTMyIEdldFN5c3RlbU1lbnUzMiggSFdORDMyIGhXbmQsIEJPT0wzMiBiUmV2ZXJ0ICkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kICk7Ci0gICAgaWYgKCF3bmRQdHIpIHJldHVybiAwOwogCi0gICAgaWYgKCF3bmRQdHItPmhTeXNNZW51IHx8ICh3bmRQdHItPmhTeXNNZW51ID09IE1FTlVfRGVmU3lzTWVudSkpCisgICAgaWYgKHduZFB0cikKICAgICB7Ci0gICAgICAgIHduZFB0ci0+aFN5c01lbnUgPSBNRU5VX0NvcHlTeXNNZW51KCk7Ci0gICAgICAgIHJldHVybiB3bmRQdHItPmhTeXNNZW51OworCWlmKCB3bmRQdHItPmhTeXNNZW51ICkKKwl7CisJICAgIGlmKCBiUmV2ZXJ0ICkKKwkgICAgeworCQlEZXN0cm95TWVudTMyKHduZFB0ci0+aFN5c01lbnUpOyAKKwkJd25kUHRyLT5oU3lzTWVudSA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCVBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUqKSAKKwkJCSAgIFVTRVJfSEVBUF9MSU5fQUREUih3bmRQdHItPmhTeXNNZW51KTsKKwkJaWYoIG1lbnUtPml0ZW1zWzBdLml0ZW1faWQgPT0gTUVOVV9EZWZTeXNQb3B1cCApCisJCSAgICBtZW51LT5pdGVtc1swXS5pdGVtX2lkID0gTUVOVV9Db3B5U3lzUG9wdXAoKTsKKwkgICAgfQorCX0KKworCWlmKCF3bmRQdHItPmhTeXNNZW51ICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKSApCisJICAgIHduZFB0ci0+aFN5c01lbnUgPSBNRU5VX0dldFN5c01lbnUoIGhXbmQsIChITUVOVTMyKSgtMSkgKTsKKworCWlmKCB3bmRQdHItPmhTeXNNZW51ICkKKwkgICAgcmV0dXJuIEdldFN1Yk1lbnUxNih3bmRQdHItPmhTeXNNZW51LCAwKTsKICAgICB9Ci0gICAgaWYgKCFiUmV2ZXJ0KSByZXR1cm4gd25kUHRyLT5oU3lzTWVudTsKLSAgICBpZiAod25kUHRyLT5oU3lzTWVudSkgRGVzdHJveU1lbnUzMih3bmRQdHItPmhTeXNNZW51KTsKLSAgICB3bmRQdHItPmhTeXNNZW51ID0gTUVOVV9Db3B5U3lzTWVudSgpOwotICAgIHJldHVybiB3bmRQdHItPmhTeXNNZW51OworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTI3OTQsMTMgKzI5ODUsMTUgQEAKICAqLwogQk9PTDMyIFNldFN5c3RlbU1lbnUzMiggSFdORDMyIGh3bmQsIEhNRU5VMzIgaE1lbnUgKQogewotICAgIFdORCAqd25kUHRyOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAKLSAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAod25kUHRyLT5oU3lzTWVudSAmJiAod25kUHRyLT5oU3lzTWVudSAhPSBNRU5VX0RlZlN5c01lbnUpKQotICAgICAgICBEZXN0cm95TWVudTMyKCB3bmRQdHItPmhTeXNNZW51ICk7Ci0gICAgd25kUHRyLT5oU3lzTWVudSA9IGhNZW51OwotICAgIHJldHVybiBUUlVFOworICAgIGlmICh3bmRQdHIpCisgICAgeworCWlmICh3bmRQdHItPmhTeXNNZW51KSBEZXN0cm95TWVudTMyKCB3bmRQdHItPmhTeXNNZW51ICk7CisJd25kUHRyLT5oU3lzTWVudSA9IE1FTlVfR2V0U3lzTWVudSggaHduZCwgaE1lbnUgKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTI4MTAsNyArMzAwMyw4IEBACiBITUVOVTE2IEdldE1lbnUxNiggSFdORDE2IGhXbmQgKSAKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLSAgICBpZiAod25kUHRyKSByZXR1cm4gKEhNRU5VMTYpd25kUHRyLT53SURtZW51OworICAgIGlmICh3bmRQdHIgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpIAorCXJldHVybiAoSE1FTlUxNil3bmRQdHItPndJRG1lbnU7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI4MjEsNyArMzAxNSw4IEBACiBITUVOVTMyIEdldE1lbnUzMiggSFdORDMyIGhXbmQgKSAKIHsgCiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7Ci0gICAgaWYgKHduZFB0cikgcmV0dXJuIChITUVOVTMyKXduZFB0ci0+d0lEbWVudTsKKyAgICBpZiAod25kUHRyICYmICEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKSAKKwlyZXR1cm4gKEhNRU5VMzIpd25kUHRyLT53SURtZW51OwogICAgIHJldHVybiAwOwogfQogCkBAIC0yODQwLDIzICszMDM1LDMwIEBACiAgKi8KIEJPT0wzMiBTZXRNZW51MzIoIEhXTkQzMiBoV25kLCBITUVOVTMyIGhNZW51ICkKIHsKLSAgICBMUFBPUFVQTUVOVSBscG1lbnU7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7Ci0gICAgaWYgKCF3bmRQdHIpIHJldHVybiBGQUxTRTsKKwogICAgIGRwcmludGZfbWVudShzdGRkZWIsIlNldE1lbnUoJTA0eCwgJTA0eCk7XG4iLCBoV25kLCBoTWVudSk7Ci0gICAgaWYgKEdldENhcHR1cmUzMigpID09IGhXbmQpIFJlbGVhc2VDYXB0dXJlKCk7Ci0gICAgd25kUHRyLT53SURtZW51ID0gKFVJTlQzMiloTWVudTsKLSAgICBpZiAoaE1lbnUgIT0gMCkKKworICAgIGlmICh3bmRQdHIgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCiAgICAgewotICAgICAgICBpZiAoIShscG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGxwbWVudS0+aFduZCA9IGhXbmQ7Ci0gICAgICAgIGxwbWVudS0+d0ZsYWdzICY9IH5NRl9QT1BVUDsgIC8qIENhbid0IGJlIGEgcG9wdXAgKi8KLSAgICAgICAgbHBtZW51LT5IZWlnaHQgPSAwOyAgLyogTWFrZSBzdXJlIHdlIHJlY2FsY3VsYXRlIHRoZSBzaXplICovCi0gICAgfQotICAgIGlmIChJc1dpbmRvd1Zpc2libGUzMihoV25kKSkKLSAgICAgICAgU2V0V2luZG93UG9zMzIoIGhXbmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKKwlpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gaFduZCkgUmVsZWFzZUNhcHR1cmUoKTsKKworCXduZFB0ci0+d0lEbWVudSA9IChVSU5UMzIpaE1lbnU7CisJaWYgKGhNZW51ICE9IDApCisJeworCSAgICBMUFBPUFVQTUVOVSBscG1lbnU7CisKKyAgICAgICAgICAgIGlmICghKGxwbWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGxwbWVudS0+aFduZCA9IGhXbmQ7CisgICAgICAgICAgICBscG1lbnUtPndGbGFncyAmPSB+TUZfUE9QVVA7ICAvKiBDYW4ndCBiZSBhIHBvcHVwICovCisgICAgICAgICAgICBscG1lbnUtPkhlaWdodCA9IDA7ICAvKiBNYWtlIHN1cmUgd2UgcmVjYWxjdWxhdGUgdGhlIHNpemUgKi8KKwl9CisJaWYgKElzV2luZG93VmlzaWJsZTMyKGhXbmQpKQorICAgICAgICAgICAgU2V0V2luZG93UG9zMzIoIGhXbmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwgU1dQX0ZSQU1FQ0hBTkdFRCApOwotICAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtMjkxOSw4ICszMTIxLDcgQEAKICAqLwogdm9pZCBFbmRNZW51KHZvaWQpCiB7Ci0gICAgLyogRklYTUU6IHRoaXMgd29uJ3Qgd29yayB3aGVuIHdlIGhhdmUgbXVsdGlwbGUgdGFza3MuLi4gKi8KLSAgICBmRW5kTWVudUNhbGxlZCA9IFRSVUU7CisgICAgZkVuZE1lbnUgPSBUUlVFOwogfQogCiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCAwNDc2OWQ5Li43MjliZDZkIDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICBDb21ib0xCV25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsIElEQ19BUlJPVywgMCwgMCwgIkNvbWJvTEJveCIgfSwKICAgICAvKiBCSUMzMl9QT1BVUE1FTlUgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIFBvcHVwTWVudVduZFByb2MsCi0gICAgICAwLCBzaXplb2YoSE1FTlUzMiksIDAsIDAsIElEQ19BUlJPVywgMCwgMCwgUE9QVVBNRU5VX0NMQVNTX05BTUUgfSwKKyAgICAgIDAsIHNpemVvZihITUVOVTMyKSwgMCwgMCwgSURDX0FSUk9XLCBOVUxMX0JSVVNILCAwLCBQT1BVUE1FTlVfQ0xBU1NfTkFNRSB9LAogICAgIC8qIEJJQzMyX1NDUk9MTCAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcgfCBDU19QQVJFTlREQywKICAgICAgIFNjcm9sbEJhclduZFByb2MsIDAsIHNpemVvZihTQ1JPTExCQVJfSU5GTyksIDAsIDAsIElEQ19BUlJPVywgMCwgMCwgIlNjcm9sbEJhciJ9LApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJfZGlzYXNtLmMgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwppbmRleCAzMmUwZDQ0Li43MTVkZGJlIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYl9kaXNhc20uYworKysgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwpAQCAtMTUzMSw3ICsxNTMxLDcgQEAKIAkJICAgICAgfQogCiAJCSAgICBpZiAoc2VnKQotCQkJZnByaW50ZihzdGRlcnIsIiVzOiVkIixzZWcsIGRpc3BsKTsKKwkJCWZwcmludGYoc3RkZXJyLCIlczoweCV4IixzZWcsIGRpc3BsKTsKIAkJICAgIGVsc2UKIAkJCWRiX3Rhc2tfcHJpbnRzeW0oZGlzcGwsIHNob3J0X2FkZHIgPyBXT1JEIDogTE9ORyk7CiAJCSAgICBicmVhazsKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luc29jayBiL2RvY3VtZW50YXRpb24vd2luc29jawppbmRleCBkOGM0OTdlLi5hNmU0MWJmIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL3dpbnNvY2sKKysrIGIvZG9jdW1lbnRhdGlvbi93aW5zb2NrCkBAIC0xLDMgKzEsNSBAQAorLS0tLS0gSW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIG9ic29sZXRlLiAtLS0tLQorCiBXaW5zb2NrCiAKIFBsYXRmb3JtIDEuCmRpZmYgLS1naXQgYS9maWxlcy9maWxlLmMgYi9maWxlcy9maWxlLmMKaW5kZXggNjQxOTU3Zi4uMWZmNmMyMSAxMDA2NDQKLS0tIGEvZmlsZXMvZmlsZS5jCisrKyBiL2ZpbGVzL2ZpbGUuYwpAQCAtOTgxLDEwICs5ODEsMTcgQEAKICAgICBpZiAoY291bnQgPT0gMCkgIC8qIEV4cGFuZCBvciB0cnVuY2F0ZSBhdCBjdXJyZW50IHBvc2l0aW9uICovCiAgICAgICAgIHJlc3VsdCA9IGZ0cnVuY2F0ZSggZmlsZS0+dW5peF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNlZWsoIGZpbGUtPnVuaXhfaGFuZGxlLCAwLCBTRUVLX0NVUiApICk7Ci0gICAgZWxzZQorICAgIGVsc2UgZm9yICg7OykKKyAgICB7CiAgICAgICAgIHJlc3VsdCA9IHdyaXRlKCBmaWxlLT51bml4X2hhbmRsZSwgYnVmZmVyLCBjb3VudCApOworICAgICAgICBpZiAocmVzdWx0ICE9IC0xKSBicmVhazsKKyAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKQorICAgICAgICB7CisgICAgICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotICAgIGlmIChyZXN1bHQgPT0gLTEpIEZJTEVfU2V0RG9zRXJyb3IoKTsKICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbmcuYyBiL2dyYXBoaWNzL3dpbmcuYwppbmRleCBhZWQwZTM5Li45MDMyMWU1IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW5nLmMKKysrIGIvZ3JhcGhpY3Mvd2luZy5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitleHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbihEQyogKTsKKwogdHlwZWRlZiBlbnVtIFdJTkdfRElUSEVSX1RZUEUKIHsKICAgV0lOR19ESVNQRVJTRURfNHg0LCBXSU5HX0RJU1BFUlNFRF84eDgsIFdJTkdfQ0xVU1RFUkVEXzR4NApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jIGIvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCmluZGV4IGIzMDIyNDguLjMzYmYxZjYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYworKysgYi9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKK2V4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKERDKiApOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBYMTFEUlZfQklUTUFQX0luaXQKICAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYyBiL2dyYXBoaWNzL3gxMWRydi9mb250LmMKaW5kZXggMGQ0ZTJjNi4uNzgyNmRiNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYvZm9udC5jCkBAIC0zMzIsNiArMzMyLDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0ZPTlRfU2VsZWN0T2JqZWN0CisgKgorICogRklYTUU6IHRoZSBmb250cyBzaG91bGQgbm90IGJlIGNhY2hlZCBieSBoZm9udCBvbmx5LCBiZWNhdXNlCisgKiBtZXRyaWNzIG1heSBiZSBkaWZmZXJlbnQgaW4gYW4gb3RoZXIgREMuCiAgKi8KIEhGT05UMzIgWDExRFJWX0ZPTlRfU2VsZWN0T2JqZWN0KCBEQyAqIGRjLCBIRk9OVDMyIGhmb250LCBGT05UT0JKICogZm9udCApCiB7CmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IDQ4MmZmNTAuLmMwZjc1ZDEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC01NSw3ICs1NSw3IEBACiA0MDEgICAgcGFzY2FsICBXQVZFT1VUR0VUTlVNREVWUygpIHdhdmVPdXRHZXROdW1EZXZzCiA0MDIgICAgcGFzY2FsICBXQVZFT1VUR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0R2V0RGV2Q2FwcwogNDAzICAgIHBhc2NhbCAgV0FWRU9VVEdFVEVSUk9SVEVYVCh3b3JkIHB0ciB3b3JkKSB3YXZlT3V0R2V0RXJyb3JUZXh0Ci00MDQgICAgcGFzY2FsICBXQVZFT1VUT1BFTihwdHIgd29yZCBwdHIgbG9uZyBsb25nIGxvbmcpIHdhdmVPdXRPcGVuCis0MDQgICAgcGFzY2FsICBXQVZFT1VUT1BFTihwdHIgd29yZCBzZWdwdHIgbG9uZyBsb25nIGxvbmcpIHdhdmVPdXRPcGVuCiA0MDUgICAgcGFzY2FsICBXQVZFT1VUQ0xPU0Uod29yZCkgd2F2ZU91dENsb3NlCiA0MDYgICAgcGFzY2FsICBXQVZFT1VUUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0UHJlcGFyZUhlYWRlcgogNDA3ICAgIHBhc2NhbCAgV0FWRU9VVFVOUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyCkBAIC03Niw3ICs3Niw3IEBACiA1MDEgICAgcGFzY2FsICBXQVZFSU5HRVROVU1ERVZTKCkgd2F2ZUluR2V0TnVtRGV2cwogNTAyICAgIHBhc2NhbCAgV0FWRUlOR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlSW5HZXREZXZDYXBzCiA1MDMgICAgcGFzY2FsICBXQVZFSU5HRVRFUlJPUlRFWFQod29yZCBwdHIgd29yZCkgd2F2ZUluR2V0RXJyb3JUZXh0Ci01MDQgICAgcGFzY2FsICBXQVZFSU5PUEVOKHB0ciB3b3JkIHB0ciBsb25nIGxvbmcgbG9uZykgd2F2ZUluT3BlbgorNTA0ICAgIHBhc2NhbCAgV0FWRUlOT1BFTihwdHIgd29yZCBzZWdwdHIgbG9uZyBsb25nIGxvbmcpIHdhdmVJbk9wZW4KIDUwNSAgICBwYXNjYWwgIFdBVkVJTkNMT1NFKHdvcmQpIHdhdmVJbkNsb3NlCiA1MDYgICAgcGFzY2FsICBXQVZFSU5QUkVQQVJFSEVBREVSKHdvcmQgc2VncHRyIHdvcmQpIHdhdmVJblByZXBhcmVIZWFkZXIKIDUwNyAgICBwYXNjYWwgIFdBVkVJTlVOUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlSW5VbnByZXBhcmVIZWFkZXIKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5zb2NrLnNwZWMgYi9pZjE2MzIvd2luc29jay5zcGVjCmluZGV4IGZlYTE2ZWYuLjM5NjFlZDcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5zb2NrLnNwZWMKKysrIGIvaWYxNjMyL3dpbnNvY2suc3BlYwpAQCAtNTAsNyArNTAsNyBAQAogMTA3IHBhc2NhbDE2IFdTQUFzeW5jR2V0U2VydkJ5TmFtZSh3b3JkIHdvcmQgcHRyIHB0ciBzZWdwdHIgd29yZCkKICAgICAgICAgICAgICBXU0FBc3luY0dldFNlcnZCeU5hbWUKIDEwOCBwYXNjYWwxNiBXU0FDYW5jZWxBc3luY1JlcXVlc3Qod29yZCkgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0Ci0xMDkgcGFzY2FsMTYgV1NBU2V0QmxvY2tpbmdIb29rKCkgV1NBU2V0QmxvY2tpbmdIb29rCisxMDkgcGFzY2FsMTYgV1NBU2V0QmxvY2tpbmdIb29rKHNlZ3B0cikgV1NBU2V0QmxvY2tpbmdIb29rMTYKIDExMCBwYXNjYWwxNiBXU0FVbmhvb2tCbG9ja2luZ0hvb2soKSBXU0FVbmhvb2tCbG9ja2luZ0hvb2sKIDExMSBwYXNjYWwxNiBXU0FHZXRMYXN0RXJyb3IoKSBXU0FHZXRMYXN0RXJyb3IKIDExMiBwYXNjYWwgICBXU0FTZXRMYXN0RXJyb3Iod29yZCkgV1NBU2V0TGFzdEVycm9yCmRpZmYgLS1naXQgYS9pZjE2MzIvd3NvY2szMi5zcGVjIGIvaWYxNjMyL3dzb2NrMzIuc3BlYwppbmRleCBmODY4NjkwLi5jNzU5N2UyIDEwMDY0NAotLS0gYS9pZjE2MzIvd3NvY2szMi5zcGVjCisrKyBiL2lmMTYzMi93c29jazMyLnNwZWMKQEAgLTQwLDcgKzQwLDcgQEAKIDEwNiBzdHViIFdTQUFzeW5jR2V0U2VydkJ5UG9ydAogMTA3IHN0dWIgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lCiAxMDggc3R1YiBXU0FDYW5jZWxBc3luY1JlcXVlc3QKLTEwOSBzdHViIFdTQVNldEJsb2NraW5nSG9vaworMTA5IHN0ZGNhbGwgV1NBU2V0QmxvY2tpbmdIb29rKHB0cikgV1NBU2V0QmxvY2tpbmdIb29rMzIKIDExMCBzdHViIFdTQVVuaG9va0Jsb2NraW5nSG9vawogMTExIHN0dWIgV1NBR2V0TGFzdEVycm9yCiAxMTIgc3R1YiBXU0FTZXRMYXN0RXJyb3IKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwLmggYi9pbmNsdWRlL2JpdG1hcC5oCmluZGV4IDcyZGMyMTUuLjNiOGJmZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9iaXRtYXAuaApAQCAtNDIsNyArNDIsNyBAQAogCiAjZGVmaW5lIFhDUkVBVEVJTUFHRShpbWFnZSx3aWR0aCxoZWlnaHQsYnBwKSBcCiB7IFwKLSAgICBpbnQgd2lkdGhfYnl0ZXMgPSBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzWDExKCAod2lkdGgpLCAoYnBwKSApOyBcCisgICAgaW50IHdpZHRoX2J5dGVzID0gRElCX0dldFhJbWFnZVdpZHRoQnl0ZXMoICh3aWR0aCksIChicHApICk7IFwKICAgICAoaW1hZ2UpID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnBwKSwgWlBpeG1hcCwgMCwgeG1hbGxvYyggKGhlaWdodCkqd2lkdGhfYnl0ZXMgKSxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGgpLCAoaGVpZ2h0KSwgMzIsIHdpZHRoX2J5dGVzICk7IFwKQEAgLTU1LDggKzU1LDggQEAKIGV4dGVybiBCT09MMzIgQklUTUFQX0RlbGV0ZU9iamVjdCggSEJJVE1BUDE2IGhiaXRtYXAsIEJJVE1BUE9CSiAqIGJpdG1hcCApOwogCiAgIC8qIG9iamVjdHMvZGliLmMgKi8KLWV4dGVybiBpbnQgRElCX0dldEltYWdlV2lkdGhCeXRlcyggaW50IHdpZHRoLCBpbnQgZGVwdGggKTsKLWV4dGVybiBpbnQgRElCX0dldEltYWdlV2lkdGhCeXRlc1gxMSggaW50IHdpZHRoLCBpbnQgZGVwdGggKTsKK2V4dGVybiBpbnQgRElCX0dldERJQldpZHRoQnl0ZXMoIGludCB3aWR0aCwgaW50IGRlcHRoICk7CitleHRlcm4gaW50IERJQl9HZXRYSW1hZ2VXaWR0aEJ5dGVzKCBpbnQgd2lkdGgsIGludCBkZXB0aCApOwogZXh0ZXJuIGludCBESUJfQml0bWFwSW5mb1NpemUoIEJJVE1BUElORk8gKiBpbmZvLCBXT1JEIGNvbG9ydXNlICk7CiAKICAgLyogb2JqZWN0cy9vZW1iaXRtYXAuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2xvci5oIGIvaW5jbHVkZS9jb2xvci5oCmluZGV4IDFiZDI2OWIuLjk0YmU2ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29sb3IuaAorKysgYi9pbmNsdWRlL2NvbG9yLmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIENPTE9SX1ZJUlRVQUwgICAweDAwMDIgICAgICAgICAgLyogbm8gbWFwcGluZyBuZWVkZWQgLSBwaXhlbCA9PSBwaXhlbCBjb2xvciAqLwogCiAjZGVmaW5lIENPTE9SX1BSSVZBVEUgICAweDEwMDAgICAgICAgICAgLyogcHJpdmF0ZSBjb2xvcm1hcCwgaWRlbnRpdHkgbWFwcGluZyAqLworI2RlZmluZSBDT0xPUl9XSElURVNFVAkweDIwMDAKIAogI2RlZmluZSBQQ19TWVNfVVNFRCAgICAgMHg4MAkJLyogcGFsZW50cnkgaXMgdXNlZCAoYm90aCBzeXN0ZW0gYW5kIGxvZ2ljYWwpICovCiAjZGVmaW5lIFBDX1NZU19SRVNFUlZFRCAweDQwCQkvKiBzeXN0ZW0gcGFsZW50cnkgaXMgbm90IHRvIGJlIG1hcHBlZCB0byAqLwpAQCAtMjIsNiArMjMsNyBAQAogZXh0ZXJuIENvbG9ybWFwCSAgQ09MT1JfR2V0Q29sb3JtYXAoKTsKIGV4dGVybiBVSU5UMTYJICBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlU2l6ZSgpOwogZXh0ZXJuIFVJTlQxNgkgIENPTE9SX0dldFN5c3RlbVBhbGV0dGVGbGFncygpOworZXh0ZXJuIEJPT0wzMgkgIENPTE9SX0dldE1vbm9QbGFuZSggaW50KiApOwogCiBleHRlcm4gQ09MT1JSRUYJICBDT0xPUl9Mb29rdXBOZWFyZXN0Q29sb3IoIFBBTEVUVEVFTlRSWSosIGludCwgQ09MT1JSRUYgKTsKIGV4dGVybiBpbnQgICAgICAgIENPTE9SX1BhbGV0dGVMb29rdXBQaXhlbCggUEFMRVRURUVOVFJZKiwgaW50LCBpbnQqICwgQ09MT1JSRUYsIEJPT0wzMiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Zy5oIGIvaW5jbHVkZS9kZWJ1Zy5oCmluZGV4IGRkNDBkMzcuLjU1YTAxZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWcuaAorKysgYi9pbmNsdWRlL2RlYnVnLmgKQEAgLTUzLDYgKzUzLDcgQEAKICN1bmRlZiBERUJVR19NRVNTQUdFCiAjdW5kZWYgREVCVUdfTUVUQUZJTEUKICN1bmRlZiBERUJVR19NSURJCisjdW5kZWYgREVCVUdfTU1BVVgKICN1bmRlZiBERUJVR19NTUlPCiAjdW5kZWYgREVCVUdfTU1TWVMKICN1bmRlZiBERUJVR19NTVRJTUUKQEAgLTEzNSw2ICsxMzYsNyBAQAogI2RlZmluZSBERUJVR19NRVNTQUdFCiAjZGVmaW5lIERFQlVHX01FVEFGSUxFCiAjZGVmaW5lIERFQlVHX01JREkKKyNkZWZpbmUgREVCVUdfTU1BVVgKICNkZWZpbmUgREVCVUdfTU1JTwogI2RlZmluZSBERUJVR19NTVNZUwogI2RlZmluZSBERUJVR19NTVRJTUUKQEAgLTQwNyw2ICs0MDksMTEgQEAKICNlbHNlCiAgICAgMCwKICNlbmRpZgorI2lmZGVmIERFQlVHX01NQVVYCisgICAgMSwKKyNlbHNlCisgICAgMCwKKyNlbmRpZgogI2lmZGVmIERFQlVHX01NSU8KICAgICAxLAogI2Vsc2UKQEAgLTExODYsOCArMTE5MywyMSBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbW1pbyBpZighZGVidWdfbXNnX2VuYWJsZWRbNDddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1pbyBkZWJ1Z19tc2dfZW5hYmxlZFs0N10KKyNkZWZpbmUgZHByaW50Zl9tbWF1eCBpZighZGVidWdfbXNnX2VuYWJsZWRbNDddKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfbW1hdXggZGVidWdfbXNnX2VuYWJsZWRbNDddCisjZWxzZQorI2lmZGVmIERFQlVHX01NQVVYCisjZGVmaW5lIGRwcmludGZfbW1hdXggZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfbW1hdXggMQorI2Vsc2UKKyNkZWZpbmUgZHByaW50Zl9tbWF1eCB3aGlsZSgwKSBmcHJpbnRmCisjZGVmaW5lIGRlYnVnZ2luZ19tbWF1eCAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlVOVElNRQorI2RlZmluZSBkcHJpbnRmX21taW8gaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21taW8gZGVidWdfbXNnX2VuYWJsZWRbNDhdCiAjZWxzZQogI2lmZGVmIERFQlVHX01NSU8KICNkZWZpbmUgZHByaW50Zl9tbWlvIGZwcmludGYKQEAgLTExOTksOCArMTIxOSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbXN5cyBpZighZGVidWdfbXNnX2VuYWJsZWRbNDhdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1zeXMgZGVidWdfbXNnX2VuYWJsZWRbNDhdCisjZGVmaW5lIGRwcmludGZfbW1zeXMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21tc3lzIGRlYnVnX21zZ19lbmFibGVkWzQ5XQogI2Vsc2UKICNpZmRlZiBERUJVR19NTVNZUwogI2RlZmluZSBkcHJpbnRmX21tc3lzIGZwcmludGYKQEAgLTEyMTIsOCArMTIzMiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbXRpbWUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tdGltZSBkZWJ1Z19tc2dfZW5hYmxlZFs0OV0KKyNkZWZpbmUgZHByaW50Zl9tbXRpbWUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21tdGltZSBkZWJ1Z19tc2dfZW5hYmxlZFs1MF0KICNlbHNlCiAjaWZkZWYgREVCVUdfTU1USU1FCiAjZGVmaW5lIGRwcmludGZfbW10aW1lIGZwcmludGYKQEAgLTEyMjUsOCArMTI0NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tb2R1bGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1MF0KKyNkZWZpbmUgZHByaW50Zl9tb2R1bGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1MV0KICNlbHNlCiAjaWZkZWYgREVCVUdfTU9EVUxFCiAjZGVmaW5lIGRwcmludGZfbW9kdWxlIGZwcmludGYKQEAgLTEyMzgsOCArMTI1OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21zZyBkZWJ1Z19tc2dfZW5hYmxlZFs1MV0KKyNkZWZpbmUgZHByaW50Zl9tc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX21zZyBkZWJ1Z19tc2dfZW5hYmxlZFs1Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfTVNHCiAjZGVmaW5lIGRwcmludGZfbXNnIGZwcmludGYKQEAgLTEyNTEsOCArMTI3MSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9ub25jbGllbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCBkZWJ1Z19tc2dfZW5hYmxlZFs1Ml0KKyNkZWZpbmUgZHByaW50Zl9ub25jbGllbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCBkZWJ1Z19tc2dfZW5hYmxlZFs1M10KICNlbHNlCiAjaWZkZWYgREVCVUdfTk9OQ0xJRU5UCiAjZGVmaW5lIGRwcmludGZfbm9uY2xpZW50IGZwcmludGYKQEAgLTEyNjQsOCArMTI4NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9vbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX29sZSBkZWJ1Z19tc2dfZW5hYmxlZFs1M10KKyNkZWZpbmUgZHByaW50Zl9vbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX29sZSBkZWJ1Z19tc2dfZW5hYmxlZFs1NF0KICNlbHNlCiAjaWZkZWYgREVCVUdfT0xFCiAjZGVmaW5lIGRwcmludGZfb2xlIGZwcmludGYKQEAgLTEyNzcsOCArMTI5Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wYWxldHRlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wYWxldHRlIGRlYnVnX21zZ19lbmFibGVkWzU0XQorI2RlZmluZSBkcHJpbnRmX3BhbGV0dGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3BhbGV0dGUgZGVidWdfbXNnX2VuYWJsZWRbNTVdCiAjZWxzZQogI2lmZGVmIERFQlVHX1BBTEVUVEUKICNkZWZpbmUgZHByaW50Zl9wYWxldHRlIGZwcmludGYKQEAgLTEyOTAsOCArMTMxMCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wcm9maWxlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1NV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9maWxlIGRlYnVnX21zZ19lbmFibGVkWzU1XQorI2RlZmluZSBkcHJpbnRmX3Byb2ZpbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Byb2ZpbGUgZGVidWdfbXNnX2VuYWJsZWRbNTZdCiAjZWxzZQogI2lmZGVmIERFQlVHX1BST0ZJTEUKICNkZWZpbmUgZHByaW50Zl9wcm9maWxlIGZwcmludGYKQEAgLTEzMDMsOCArMTMyMyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wcm9wIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9wIGRlYnVnX21zZ19lbmFibGVkWzU2XQorI2RlZmluZSBkcHJpbnRmX3Byb3AgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Byb3AgZGVidWdfbXNnX2VuYWJsZWRbNTddCiAjZWxzZQogI2lmZGVmIERFQlVHX1BST1AKICNkZWZpbmUgZHByaW50Zl9wcm9wIGZwcmludGYKQEAgLTEzMTYsOCArMTMzNiw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZyBkZWJ1Z19tc2dfZW5hYmxlZFs1N10KKyNkZWZpbmUgZHByaW50Zl9yZWcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlZyBkZWJ1Z19tc2dfZW5hYmxlZFs1OF0KICNlbHNlCiAjaWZkZWYgREVCVUdfUkVHCiAjZGVmaW5lIGRwcmludGZfcmVnIGZwcmludGYKQEAgLTEzMjksOCArMTM0OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWdpb24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzU4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZ2lvbiBkZWJ1Z19tc2dfZW5hYmxlZFs1OF0KKyNkZWZpbmUgZHByaW50Zl9yZWdpb24gaWYoIWRlYnVnX21zZ19lbmFibGVkWzU5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlZ2lvbiBkZWJ1Z19tc2dfZW5hYmxlZFs1OV0KICNlbHNlCiAjaWZkZWYgREVCVUdfUkVHSU9OCiAjZGVmaW5lIGRwcmludGZfcmVnaW9uIGZwcmludGYKQEAgLTEzNDIsOCArMTM2Miw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZWxheSBpZighZGVidWdfbXNnX2VuYWJsZWRbNTldKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVsYXkgZGVidWdfbXNnX2VuYWJsZWRbNTldCisjZGVmaW5lIGRwcmludGZfcmVsYXkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3JlbGF5IGRlYnVnX21zZ19lbmFibGVkWzYwXQogI2Vsc2UKICNpZmRlZiBERUJVR19SRUxBWQogI2RlZmluZSBkcHJpbnRmX3JlbGF5IGZwcmludGYKQEAgLTEzNTUsOCArMTM3NSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9yZXNvdXJjZSBpZighZGVidWdfbXNnX2VuYWJsZWRbNjBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVzb3VyY2UgZGVidWdfbXNnX2VuYWJsZWRbNjBdCisjZGVmaW5lIGRwcmludGZfcmVzb3VyY2UgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Jlc291cmNlIGRlYnVnX21zZ19lbmFibGVkWzYxXQogI2Vsc2UKICNpZmRlZiBERUJVR19SRVNPVVJDRQogI2RlZmluZSBkcHJpbnRmX3Jlc291cmNlIGZwcmludGYKQEAgLTEzNjgsOCArMTM4OCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zY3JvbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCBkZWJ1Z19tc2dfZW5hYmxlZFs2MV0KKyNkZWZpbmUgZHByaW50Zl9zY3JvbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCBkZWJ1Z19tc2dfZW5hYmxlZFs2Ml0KICNlbHNlCiAjaWZkZWYgREVCVUdfU0NST0xMCiAjZGVmaW5lIGRwcmludGZfc2Nyb2xsIGZwcmludGYKQEAgLTEzODEsOCArMTQwMSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZWxlY3RvciBpZighZGVidWdfbXNnX2VuYWJsZWRbNjJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VsZWN0b3IgZGVidWdfbXNnX2VuYWJsZWRbNjJdCisjZGVmaW5lIGRwcmludGZfc2VsZWN0b3IgaWYoIWRlYnVnX21zZ19lbmFibGVkWzYzXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbGVjdG9yIGRlYnVnX21zZ19lbmFibGVkWzYzXQogI2Vsc2UKICNpZmRlZiBERUJVR19TRUxFQ1RPUgogI2RlZmluZSBkcHJpbnRmX3NlbGVjdG9yIGZwcmludGYKQEAgLTEzOTQsOCArMTQxNCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZW0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzYzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbSBkZWJ1Z19tc2dfZW5hYmxlZFs2M10KKyNkZWZpbmUgZHByaW50Zl9zZW0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbSBkZWJ1Z19tc2dfZW5hYmxlZFs2NF0KICNlbHNlCiAjaWZkZWYgREVCVUdfU0VNCiAjZGVmaW5lIGRwcmludGZfc2VtIGZwcmludGYKQEAgLTE0MDcsOCArMTQyNyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZW5kbXNnIGRlYnVnX21zZ19lbmFibGVkWzY0XQorI2RlZmluZSBkcHJpbnRmX3NlbmRtc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NlbmRtc2cgZGVidWdfbXNnX2VuYWJsZWRbNjVdCiAjZWxzZQogI2lmZGVmIERFQlVHX1NFTkRNU0cKICNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIGZwcmludGYKQEAgLTE0MjAsOCArMTQ0MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zaG0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NobSBkZWJ1Z19tc2dfZW5hYmxlZFs2NV0KKyNkZWZpbmUgZHByaW50Zl9zaG0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3NobSBkZWJ1Z19tc2dfZW5hYmxlZFs2Nl0KICNlbHNlCiAjaWZkZWYgREVCVUdfU0hNCiAjZGVmaW5lIGRwcmludGZfc2htIGZwcmludGYKQEAgLTE0MzMsOCArMTQ1Myw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY2XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs2Nl0KKyNkZWZpbmUgZHByaW50Zl9zdHJlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KICNlbHNlCiAjaWZkZWYgREVCVUdfU1RSRVNTCiAjZGVmaW5lIGRwcmludGZfc3RyZXNzIGZwcmludGYKQEAgLTE0NDYsOCArMTQ2Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJpbmcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyBkZWJ1Z19tc2dfZW5hYmxlZFs2N10KKyNkZWZpbmUgZHByaW50Zl9zdHJpbmcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyBkZWJ1Z19tc2dfZW5hYmxlZFs2OF0KICNlbHNlCiAjaWZkZWYgREVCVUdfU1RSSU5HCiAjZGVmaW5lIGRwcmludGZfc3RyaW5nIGZwcmludGYKQEAgLTE0NTksOCArMTQ3OSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90YXNrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190YXNrIGRlYnVnX21zZ19lbmFibGVkWzY4XQorI2RlZmluZSBkcHJpbnRmX3Rhc2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Rhc2sgZGVidWdfbXNnX2VuYWJsZWRbNjldCiAjZWxzZQogI2lmZGVmIERFQlVHX1RBU0sKICNkZWZpbmUgZHByaW50Zl90YXNrIGZwcmludGYKQEAgLTE0NzIsOCArMTQ5Miw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90ZXh0IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2OV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190ZXh0IGRlYnVnX21zZ19lbmFibGVkWzY5XQorI2RlZmluZSBkcHJpbnRmX3RleHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcwXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RleHQgZGVidWdfbXNnX2VuYWJsZWRbNzBdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RFWFQKICNkZWZpbmUgZHByaW50Zl90ZXh0IGZwcmludGYKQEAgLTE0ODUsOCArMTUwNSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90aW1lciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgZGVidWdfbXNnX2VuYWJsZWRbNzBdCisjZGVmaW5lIGRwcmludGZfdGltZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcxXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RpbWVyIGRlYnVnX21zZ19lbmFibGVkWzcxXQogI2Vsc2UKICNpZmRlZiBERUJVR19USU1FUgogI2RlZmluZSBkcHJpbnRmX3RpbWVyIGZwcmludGYKQEAgLTE0OTgsOCArMTUxOCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90b29saGVscCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgZGVidWdfbXNnX2VuYWJsZWRbNzFdCisjZGVmaW5lIGRwcmludGZfdG9vbGhlbHAgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Rvb2xoZWxwIGRlYnVnX21zZ19lbmFibGVkWzcyXQogI2Vsc2UKICNpZmRlZiBERUJVR19UT09MSEVMUAogI2RlZmluZSBkcHJpbnRmX3Rvb2xoZWxwIGZwcmludGYKQEAgLTE1MTEsOCArMTUzMSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92ZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3ZlciBkZWJ1Z19tc2dfZW5hYmxlZFs3Ml0KKyNkZWZpbmUgZHByaW50Zl92ZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzczXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3ZlciBkZWJ1Z19tc2dfZW5hYmxlZFs3M10KICNlbHNlCiAjaWZkZWYgREVCVUdfVkVSCiAjZGVmaW5lIGRwcmludGZfdmVyIGZwcmludGYKQEAgLTE1MjQsOCArMTU0NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92aXJ0dWFsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ192aXJ0dWFsIGRlYnVnX21zZ19lbmFibGVkWzczXQorI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc0XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3ZpcnR1YWwgZGVidWdfbXNnX2VuYWJsZWRbNzRdCiAjZWxzZQogI2lmZGVmIERFQlVHX1ZJUlRVQUwKICNkZWZpbmUgZHByaW50Zl92aXJ0dWFsIGZwcmludGYKQEAgLTE1MzcsOCArMTU1Nyw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs3NF0KKyNkZWZpbmUgZHByaW50Zl92eGQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc1XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3Z4ZCBkZWJ1Z19tc2dfZW5hYmxlZFs3NV0KICNlbHNlCiAjaWZkZWYgREVCVUdfVlhECiAjZGVmaW5lIGRwcmludGZfdnhkIGZwcmludGYKQEAgLTE1NTAsOCArMTU3MCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzc1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs3NV0KKyNkZWZpbmUgZHByaW50Zl93aW4gaWYoIWRlYnVnX21zZ19lbmFibGVkWzc2XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbiBkZWJ1Z19tc2dfZW5hYmxlZFs3Nl0KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOCiAjZGVmaW5lIGRwcmludGZfd2luIGZwcmludGYKQEAgLTE1NjMsOCArMTU4Myw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4xNmRydiBpZighZGVidWdfbXNnX2VuYWJsZWRbNzZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luMTZkcnYgZGVidWdfbXNnX2VuYWJsZWRbNzZdCisjZGVmaW5lIGRwcmludGZfd2luMTZkcnYgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc3XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbjE2ZHJ2IGRlYnVnX21zZ19lbmFibGVkWzc3XQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU4xNkRSVgogI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IGZwcmludGYKQEAgLTE1NzYsOCArMTU5Niw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW4zMiBpZighZGVidWdfbXNnX2VuYWJsZWRbNzddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luMzIgZGVidWdfbXNnX2VuYWJsZWRbNzddCisjZGVmaW5lIGRwcmludGZfd2luMzIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc4XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbjMyIGRlYnVnX21zZ19lbmFibGVkWzc4XQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU4zMgogI2RlZmluZSBkcHJpbnRmX3dpbjMyIGZwcmludGYKQEAgLTE1ODksOCArMTYwOSw4IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIGRlYnVnX21zZ19lbmFibGVkWzc4XQorI2RlZmluZSBkcHJpbnRmX3dpbnNvY2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc5XSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3dpbnNvY2sgZGVidWdfbXNnX2VuYWJsZWRbNzldCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTlNPQ0sKICNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGZwcmludGYKQEAgLTE2NTIsNiArMTY3Miw3IEBACiAgICAgIm1lc3NhZ2UiLAogICAgICJtZXRhZmlsZSIsCiAgICAgIm1pZGkiLAorICAgICJtbWF1eCIsCiAgICAgIm1taW8iLAogICAgICJtbXN5cyIsCiAgICAgIm1tdGltZSIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dyYXBoaWNzLmggYi9pbmNsdWRlL2dyYXBoaWNzLmgKaW5kZXggNmQ5MzNmZC4uMDBkOTYzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ncmFwaGljcy5oCisrKyBiL2luY2x1ZGUvZ3JhcGhpY3MuaApAQCAtMTgsNyArMTgsNyBAQAogCQkJCSBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBIUEVOMzIgaFBlbik7CiBleHRlcm4gQk9PTDMyIEdSQVBIX0RyYXdCaXRtYXAoIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHhkZXN0LCBJTlQzMiB5ZGVzdCwgSU5UMzIgeHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeXNyYywgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB5c3JjLCBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBCT09MMzIgYk1vbm8gKTsKIGV4dGVybiBCT09MMzIgR1JBUEhfU2VsZWN0Q2xpcE1hc2soIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhNb25vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21kaS5oIGIvaW5jbHVkZS9tZGkuaAppbmRleCAwYWQyNzAwLi40OTE1NzMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21kaS5oCisrKyBiL2luY2x1ZGUvbWRpLmgKQEAgLTMxLDE1ICszMSwxNSBAQAogCiB0eXBlZGVmIHN0cnVjdCAKIHsKLSAgICBXT1JEICAgCW5BY3RpdmVDaGlsZHJlbjsKKyAgICBVSU5UMTYgICAJbkFjdGl2ZUNoaWxkcmVuOwogICAgIEhXTkQxNiAgIAlod25kQ2hpbGRNYXhpbWl6ZWQ7CiAgICAgSFdORDE2ICAgCWh3bmRBY3RpdmVDaGlsZDsKICAgICBITUVOVTE2ICAJaFdpbmRvd01lbnU7Ci0gICAgV09SRCAgIAlpZEZpcnN0Q2hpbGQ7Ci0gICAgV09SRAluVG90YWxDcmVhdGVkOworICAgIFVJTlQzMiAgIAlpZEZpcnN0Q2hpbGQ7CiAgICAgTFBTVFIgCWZyYW1lVGl0bGU7Ci0gICAgV09SRCAgIAlzYk5lZWRVcGRhdGU7Ci0gICAgV09SRCAgIAlzYlJlY2FsYzsKKyAgICBVSU5UMTYJblRvdGFsQ3JlYXRlZDsKKyAgICBVSU5UMTYgICAJbWRpRmxhZ3M7CisgICAgVUlOVDE2ICAgCXNiUmVjYWxjOwkJLyogU0JfeHh4IGZsYWdzIGZvciBzY3JvbGxiYXIgZml4dXAgKi8KICAgICBIV05EMTYgICAJc2VsZjsKIH0gTURJQ0xJRU5USU5GTzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZW51LmggYi9pbmNsdWRlL21lbnUuaAppbmRleCA2OWVmODUxLi4xMjFjMDkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lbnUuaAorKysgYi9pbmNsdWRlL21lbnUuaApAQCAtNiw3ICs2LDcgQEAKICNkZWZpbmUgX19XSU5FX01FTlVfSAogCiBleHRlcm4gQk9PTDMyIE1FTlVfSW5pdCh2b2lkKTsKLWV4dGVybiBITUVOVTMyIE1FTlVfR2V0RGVmU3lzTWVudSh2b2lkKTsKK2V4dGVybiBITUVOVTMyIE1FTlVfR2V0U3lzTWVudShIV05EMzIgaFduZE93bmVyLCBITUVOVTMyIGhTeXNQb3B1cCk7CiBleHRlcm4gdm9pZCBNRU5VX0luaXRTeXNNZW51UG9wdXAoSE1FTlUzMiBobWVudSwgRFdPUkQgc3R5bGUsIERXT1JEIGNsc1N0eWxlKTsKIGV4dGVybiBVSU5UMzIgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EMzIgaHduZCwgVUlOVDMyIG1lbnViYXJXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBvcmdYLCBJTlQzMiBvcmdZICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21tc3lzdGVtLmggYi9pbmNsdWRlL21tc3lzdGVtLmgKaW5kZXggNTZiYzYxMS4uY2MxMzhmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tbXN5c3RlbS5oCisrKyBiL2luY2x1ZGUvbW1zeXN0ZW0uaApAQCAtMTQ4NSw2ICsxNDg1LDcgQEAKIAlMUFdBVkVGT1JNQVQJbHBGb3JtYXQ7CiAJRFdPUkQJCQlkd0NhbGxCYWNrOwogCURXT1JECQkJZHdJbnN0YW5jZTsKKwlVSU5UMTYgICAgICAgICAgICAgICAgICB1RGV2aWNlSUQ7CiB9IFdBVkVPUEVOREVTQywgKkxQV0FWRU9QRU5ERVNDOwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3F1ZXVlLmggYi9pbmNsdWRlL3F1ZXVlLmgKaW5kZXggMzAxMDc4NC4uODBmZTc3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9xdWV1ZS5oCisrKyBiL2luY2x1ZGUvcXVldWUuaApAQCAtNzUsOCArNzUsOCBAQAogCiBleHRlcm4gdm9pZCBRVUVVRV9EdW1wUXVldWUoIEhRVUVVRTE2IGhRdWV1ZSApOwogZXh0ZXJuIHZvaWQgUVVFVUVfV2Fsa1F1ZXVlcyh2b2lkKTsKLWV4dGVybiBCT09MMzIgUVVFVUVfSXNEb29tZWRRdWV1ZSggSFFVRVVFMTYgaFF1ZXVlICk7Ci1leHRlcm4gdm9pZCBRVUVVRV9TZXREb29tZWRRdWV1ZSggSFFVRVVFMTYgaFF1ZXVlICk7CitleHRlcm4gQk9PTDMyIFFVRVVFX0lzRXhpdGluZ1F1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKTsKK2V4dGVybiB2b2lkIFFVRVVFX1NldEV4aXRpbmdRdWV1ZSggSFFVRVVFMTYgaFF1ZXVlICk7CiBleHRlcm4gTUVTU0FHRVFVRVVFICpRVUVVRV9HZXRTeXNRdWV1ZSh2b2lkKTsKIGV4dGVybiB2b2lkIFFVRVVFX1NldFdha2VCaXQoIE1FU1NBR0VRVUVVRSAqcXVldWUsIFdPUkQgYml0ICk7CiBleHRlcm4gdm9pZCBRVUVVRV9DbGVhcldha2VCaXQoIE1FU1NBR0VRVUVVRSAqcXVldWUsIFdPUkQgYml0ICk7CkBAIC05NSw1ICs5NSw2IEBACiBleHRlcm4gdm9pZCBRVUVVRV9SZW1vdmVNc2coIE1FU1NBR0VRVUVVRSAqIG1zZ1F1ZXVlLCBpbnQgcG9zICk7CiBleHRlcm4gdm9pZCBoYXJkd2FyZV9ldmVudCggV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0sCiAJCQkgICAgaW50IHhQb3MsIGludCB5UG9zLCBEV09SRCB0aW1lLCBEV09SRCBleHRyYUluZm8gKTsKK2V4dGVybiB2b2lkIFFVRVVFX0ZsdXNoTWVzc2FnZXMoIEhRVUVVRTE2IGhRdWV1ZSApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9RVUVVRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0ZGRlYnVnLmggYi9pbmNsdWRlL3N0ZGRlYnVnLmgKaW5kZXggOTgxNzdlMC4uZTA1MTEyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdGRkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvc3RkZGVidWcuaApAQCAtMTIzLDYgKzEyMyw3IEBACiAjdW5kZWYgREVCVUdfTUVTU0FHRQogI3VuZGVmIERFQlVHX01FVEFGSUxFCiAjdW5kZWYgREVCVUdfTUlESQorI3VuZGVmIERFQlVHX01NQVVYCiAjdW5kZWYgREVCVUdfTU1JTwogI3VuZGVmIERFQlVHX01NU1lTCiAjdW5kZWYgREVCVUdfTU1USU1FCkBAIC0yMDUsNiArMjA2LDcgQEAKICNkZWZpbmUgREVCVUdfTUVTU0FHRQogI2RlZmluZSBERUJVR19NRVRBRklMRQogI2RlZmluZSBERUJVR19NSURJCisjZGVmaW5lIERFQlVHX01NQVVYCiAjZGVmaW5lIERFQlVHX01NSU8KICNkZWZpbmUgREVCVUdfTU1TWVMKICNkZWZpbmUgREVCVUdfTU1USU1FCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IGVjODI2NzMuLmQ1ZjFlODAgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC0yODEsNyArMjgxLDEzIEBACiAKIAlvZmZzZXQgID0gcmVwLT5vZmZzZXQ7CiAKLQlzd2l0Y2ggKHJlcC0+YWRkcmVzc190eXBlKQorICAgICAgICAvKiBBcHBhcmVudGx5LCBoaWdoIGJpdCBvZiBhZGRyZXNzX3R5cGUgaXMgc29tZXRpbWVzIHNldDsgKi8KKyAgICAgICAgLyogd2UgaWdub3JlIGl0IGZvciBub3cgKi8KKwlpZiAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDgwKQorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogcmVsb2MgYWRkciB0eXBlID0gMHglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgcmVwLT5hZGRyZXNzX3R5cGUgKTsKKworCXN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDdmKQogCXsKIAkgIGNhc2UgTkVfUkFERFJfTE9XQllURToKICAgICAgICAgICAgIGRvIHsKQEAgLTQxNSwxMiArNDIxLDE2IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoKnAgJiAweDAwMDIpCiAgICAgICAgICAgICAgICAgICAgIHsKLQkJCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEpIHsKKwkJCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CiAJCQkgICAgLyogY2FuIHRoaXMgaGFwcGVuPyAqLwogCQkJICAgIGZwcmludGYoIHN0ZGVyciwgIkZpeHVwUHJvbG9ncyBnb3QgY29uZnVzZWRcbiIgKTsKIAkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICpmaXh1cF9wdHIgPSAweGI4OwkvKiBNT1YgQVgsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAqKFdPUkQgKikoZml4dXBfcHRyKzEpID0gZGdyb3VwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0lOR0xFREFUQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZml4dXBfcHRyID0gMHhiODsJLyogTU9WIEFYLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICooV09SRCAqKShmaXh1cF9wdHIrMSkgPSBkZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggZjVkN2QxOC4uNzQ5ZDI4NCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtODcyLDcgKzg3Miw3IEBACiAgICAgICBwaW50ZXJuPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAgc2l6ZW9mKEdMT0JBTDMyX0lOVEVSTikpOwogICAgICAgaWYoc2l6ZSkKICAgICAgIHsKLQkgcGFsbG9jPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplK3NpemVvZihIR0xPQkFMMzIpKTsKKwkgcGFsbG9jPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBocGZsYWdzLCBzaXplK3NpemVvZihIR0xPQkFMMzIpKTsKIAkgKihIR0xPQkFMMzIgKilwYWxsb2M9SU5URVJOX1RPX0hBTkRMRShwaW50ZXJuKTsKIAkgcGludGVybi0+UG9pbnRlcj1wYWxsb2Mrc2l6ZW9mKEhHTE9CQUwzMik7CiAgICAgICB9CmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IDA3Y2VkNzkuLjJmMDUzZGEgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC0yMDIsNyArMjAyLDggQEAKICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICBHZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgc3RyICsgbGVuLCBzaXplb2Yoc3RyKSAtIGxlbiApOwogICAgIGlmICghRGxnRGlyTGlzdDMyQSggaFduZCwgc3RyLCBsc3QxLCAwLCAweDAwMDAgKSkgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBEbGdEaXJMaXN0MzJBKCBoV25kLCAiKi4qIiwgbHN0Miwgc3RjMSwgMHg4MDEwICk7CisgICAgc3RyY3B5KCBzdHIsICIqLioiICk7CisgICAgcmV0dXJuIERsZ0Rpckxpc3QzMkEoIGhXbmQsIHN0ciwgbHN0Miwgc3RjMSwgMHg4MDEwICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDA5LDcgKzQxMCw4IEBACiAgIAkJCWxwb2ZuLT5uRmlsdGVySW5kZXgsIHRtcHN0cik7CiAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoV25kLCBlZHQxLCB0bXBzdHIgKTsKICAgLyogZ2V0IGRyaXZlIGxpc3QgKi8KLSAgRGxnRGlyTGlzdENvbWJvQm94MzJBKGhXbmQsICIiLCBjbWIyLCAwLCAweEMwMDApOworICAqdG1wc3RyID0gMDsKKyAgRGxnRGlyTGlzdENvbWJvQm94MzJBKGhXbmQsIHRtcHN0ciwgY21iMiwgMCwgMHhDMDAwKTsKICAgLyogcmVhZCBpbml0aWFsIGRpcmVjdG9yeSAqLwogICBpZiAoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RySW5pdGlhbERpcikgIT0gTlVMTCkgCiAgICAgewpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggZjlhYjhjMC4uNjBkM2FlYiAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAiY3J0ZGxsLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKIAorZXh0ZXJuIElOVDMyIFdJTjMyX3dzcHJpbnRmMzJXKCBEV09SRCAqYXJncyApOworCiBVSU5UMzIgQ1JURExMX2FyZ2NfZGxsOyAgICAgICAgIC8qIENSVERMTC4yMyAqLwogTFBTVFIgKkNSVERMTF9hcmd2X2RsbDsgICAgICAgICAvKiBDUlRETEwuMjQgKi8KIExQU1RSICBDUlRETExfYWNtZGxuX2RsbDsgICAgICAgLyogQ1JURExMLjM4ICovCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IGIyNTAxODQuLjkyNmM1MTQgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC02MjgsMTkgKzYyOCwzMSBAQAogCiAgICAgc3dpdGNoKCBjbWQgKQogICAgIHsKLQljYXNlIFdTX0ZJT05SRUFEOiAgIG5ld2NtZD1GSU9OUkVBRDsgYnJlYWs7Ci0JY2FzZSBXU19GSU9OQklPOiAgICBuZXdjbWQ9RklPTkJJTzsgIAotCQkJICAgIGlmKCBwd3MtPnBfYW9wICYmICphcmdwID09IDAgKSAKLQkJCSAgICB7IAotCQkJCXB3c2ktPmVyciA9IFdTQUVJTlZBTDsgCi0JCQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsgCi0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCWNhc2UgV1NfU0lPQ0FUTUFSSzogbmV3Y21kPVNJT0NBVE1BUks7IGJyZWFrOworCWNhc2UgV1NfRklPTlJFQUQ6ICAgCisJCW5ld2NtZD1GSU9OUkVBRDsgCisJCWJyZWFrOworCisJY2FzZSBXU19GSU9OQklPOiAgICAKKwkJbmV3Y21kPUZJT05CSU87ICAKKwkJaWYoIHB3cy0+cF9hb3AgJiYgKmFyZ3AgPT0gMCApIAorCQl7CisJCSAgICBwd3NpLT5lcnIgPSBXU0FFSU5WQUw7IAorCQkgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsgCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdTX1NJT0NBVE1BUks6IAorCQluZXdjbWQ9U0lPQ0FUTUFSSzsgCisJCWJyZWFrOworCiAJY2FzZSBXU19JT1coJ2YnLDEyNSx1X2xvbmcpOiAKLQkJCSAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFdTMS4xIHNob3VsZG4ndCBiZSB1c2luZyBhc3luYyBJL09cbiIpOwotCQkJICBwd3NpLT5lcnIgPSBXU0FFSU5WQUw7IHJldHVybiBTT0NLRVRfRVJST1I7Ci0JZGVmYXVsdDoJICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogVW5rbm93biBXU19JT0NUTCBjbWQgKCUwOHgpXG4iLCBjbWQpOworCQlmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogV1MxLjEgc2hvdWxkbid0IGJlIHVzaW5nIGFzeW5jIEkvT1xuIik7CisJCXB3c2ktPmVyciA9IFdTQUVJTlZBTDsgCisJCXJldHVybiBTT0NLRVRfRVJST1I7CisKKwlkZWZhdWx0OgkgIAorCQkvKiBOZXRzY2FwZSB0cmllcyBoYXJkIHRvIHVzZSBib2d1cyBpb2N0bCAweDY2N2UgKi8KKwkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHR1bmtub3duIFdTX0lPQ1RMIGNtZCAoJTA4eClcbiIsIGNtZCk7CiAgICAgfQogICAgIGlmKCBpb2N0bChwd3MtPmZkLCBuZXdjbWQsIChjaGFyKilhcmdwICkgPT0gMCApIHJldHVybiAwOwogICAgIHB3c2ktPmVyciA9IChlcnJubyA9PSBFQkFERikgPyBXU0FFTk9UU09DSyA6IHdzYUVycm5vKCk7IApAQCAtMTQyOSw3ICsxNDQxLDcgQEAKICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KIAotRkFSUFJPQzE2IFdTQVNldEJsb2NraW5nSG9vayhGQVJQUk9DMTYgbHBCbG9ja0Z1bmMpCitGQVJQUk9DMTYgV1NBU2V0QmxvY2tpbmdIb29rMTYoRkFSUFJPQzE2IGxwQmxvY2tGdW5jKQogewogICBGQVJQUk9DMTYJCXByZXY7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CkBAIC0xNDQ1LDYgKzE0NTcsMTIgQEAKICAgcmV0dXJuIDA7CiB9CiAKK0ZBUlBST0MzMiBXU0FTZXRCbG9ja2luZ0hvb2szMihGQVJQUk9DMzIgbHBCbG9ja0Z1bmMpCit7CisgICAgZnByaW50Ziggc3RkZXJyLCAiRW1wdHkgc3R1YiBXU0FTZXRCbG9ja2luZ0hvb2szMiglcClcbiIsIGxwQmxvY2tGdW5jICk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIElOVDE2IFdTQVVuaG9va0Jsb2NraW5nSG9vayh2b2lkKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwpkaWZmIC0tZ2l0IGEvbWlzYy93c3ByaW50Zi5jIGIvbWlzYy93c3ByaW50Zi5jCmluZGV4IGJkYjY3MTMuLjRjYTQ4MjggMTAwNjQ0Ci0tLSBhL21pc2Mvd3NwcmludGYuYworKysgYi9taXNjL3dzcHJpbnRmLmMKQEAgLTUyNCw3ICs1MjQsNyBAQAogfQogCiAvKiBFbXVsYXRvciB2ZXJzaW9uICovCi1JTlQzMiBXSU4zMl93c3ByaW50ZjMyQSggaW50ICphcmdzICkKK0lOVDMyIFdJTjMyX3dzcHJpbnRmMzJBKCBEV09SRCAqYXJncyApCiB7CiAgICAgcmV0dXJuIHd2c3ByaW50ZjMyQSggKExQU1RSKWFyZ3NbMF0sIChMUENTVFIpYXJnc1sxXSwgKExQQ1ZPSUQpJmFyZ3NbMl0gKTsKIH0KQEAgLTU0Niw3ICs1NDYsNyBAQAogfQogCiAvKiBFbXVsYXRvciB2ZXJzaW9uICovCi1JTlQzMiBXSU4zMl93c3ByaW50ZjMyVyggaW50ICphcmdzICkKK0lOVDMyIFdJTjMyX3dzcHJpbnRmMzJXKCBEV09SRCAqYXJncyApCiB7CiAgICAgcmV0dXJuIHd2c3ByaW50ZjMyVyggKExQV1NUUilhcmdzWzBdLCAoTFBDV1NUUilhcmdzWzFdLCAoTFBDVk9JRCkmYXJnc1syXSk7CiB9CmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggNDA4ZTZkYy4uMDU0MDRjZSAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMjAsNiArMjAsOCBAQAogCiAjZGVmaW5lIERPU19HRVRfRFJJVkUocmVnKSAoKHJlZykgPyAocmVnKSAtIDEgOiBEUklWRV9HZXRDdXJyZW50RHJpdmUoKSkKIAordm9pZCBDcmVhdGVCUEIoaW50IGRyaXZlLCBCWVRFICpkYXRhKTsgIC8qIGRlZmluZWQgaW4gaW50MjEuYyAqLworCiAKIC8qIFN0cnVjdHVyZSBmb3IgcmVhbC1tb2RlIGNhbGxiYWNrcyAqLwogdHlwZWRlZiBzdHJ1Y3QKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCA1NTg0NjZmLi4zMWFmMzE4IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC0yNiwxMCArMjYsOSBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotaW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYpOwotCiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKICNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKKyNkZWZpbmUgTUlYRVJfREVWICIvZGV2L21peGVyIgogCiAjaWZkZWYgU09VTkRfVkVSU0lPTgogI2RlZmluZSBJT0NUTChhLGIsYykJCSgoLTE9PWlvY3RsKGEsYiwmYykpJiYocGVycm9yKCJpb2N0bDoiI2IiOiIjYyksMCkpCkBAIC0zNyw0MiArMzYsNDMgQEAKICNkZWZpbmUgSU9DVEwoYSxiLGMpCQkoYyA9IGlvY3RsKGEsYixjKSApCiAjZW5kaWYKIAotI2RlZmluZSBNQVhfV0FWT1VURFJWIAkyCi0jZGVmaW5lIE1BWF9XQVZJTkRSViAJMgotI2RlZmluZSBNQVhfTUNJV0FWRFJWIAkyCisjZGVmaW5lIE1BWF9XQVZPVVREUlYgCSgxKQorI2RlZmluZSBNQVhfV0FWSU5EUlYgCSgxKQorI2RlZmluZSBNQVhfTUNJV0FWRFJWIAkoMSkKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWludAkJCQl1bml4ZGV2OwotCWludAkJCQlzdGF0ZTsKLQlEV09SRAkJCWJ1ZnNpemU7Ci0JV0FWRU9QRU5ERVNDCXdhdmVEZXNjOwotCVdPUkQJCQl3RmxhZ3M7Ci0JUENNV0FWRUZPUk1BVAlGb3JtYXQ7Ci0JTFBXQVZFSERSIAkJbHBRdWV1ZUhkcjsKLQlEV09SRAkJCWR3VG90YWxQbGF5ZWQ7CisJaW50CQkgICAgdW5peGRldjsKKwlpbnQJCSAgICBzdGF0ZTsKKwlEV09SRAkJICAgIGJ1ZnNpemU7CisJV0FWRU9QRU5ERVNDICAgICAgICB3YXZlRGVzYzsKKwlXT1JEICAgICAgICAgICAgICAgIHdGbGFnczsKKwlQQ01XQVZFRk9STUFUCSAgICBGb3JtYXQ7CisJTFBXQVZFSERSIAkgICAgbHBRdWV1ZUhkcjsKKwlEV09SRAkJICAgIGR3VG90YWxQbGF5ZWQ7CiAJfSBMSU5VWF9XQVZFT1VUOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50CQkJCXVuaXhkZXY7Ci0JaW50CQkJCXN0YXRlOwotCURXT1JECQkJYnVmc2l6ZTsJLyogTGludXggJy9kZXYvZHNwJyBnaXZlIHVzIHRoYXQgc2l6ZSAqLwotCVdBVkVPUEVOREVTQwl3YXZlRGVzYzsKLQlXT1JECQkJd0ZsYWdzOwotCVBDTVdBVkVGT1JNQVQJRm9ybWF0OwotCUxQV0FWRUhEUiAJCWxwUXVldWVIZHI7Ci0JRFdPUkQJCQlkd1RvdGFsUmVjb3JkZWQ7CisJaW50CSAgICAgICAgICAgIHVuaXhkZXY7CisJaW50CSAgICAgICAgICAgIHN0YXRlOworCURXT1JEICAgICAgICAgICAgICAgYnVmc2l6ZTsgICAgICAgICAgICAvKiBMaW51eCAnL2Rldi9kc3AnIGdpdmUgdXMgdGhhdCBzaXplICovCisJV0FWRU9QRU5ERVNDICAgICAgICB3YXZlRGVzYzsKKwlXT1JEICAgICAgICAgICAgICAgIHdGbGFnczsKKwlQQ01XQVZFRk9STUFUICAgICAgIEZvcm1hdDsKKwlMUFdBVkVIRFIgICAgICAgICAgIGxwUXVldWVIZHI7CisJRFdPUkQgICAgICAgICAgICAgICBkd1RvdGFsUmVjb3JkZWQ7CiAJfSBMSU5VWF9XQVZFSU47CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgIG5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KLSAgICBCT09MMTYgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KLSAgICBXT1JEICAgIHdOb3RpZnlEZXZpY2VJRDsgICAgLyogTUNJIGRldmljZSBJRCB3aXRoIGEgcGVuZGluZyBub3RpZmljYXRpb24gKi8KLSAgICBIQU5ETEUxNiBoQ2FsbGJhY2s7ICAgICAgICAgIC8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gKi8KLQlITU1JTzE2CWhGaWxlOwkJCQkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudAkJKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICBuVXNlQ291bnQ7ICAgICAgICAgIC8qIEluY3JlbWVudGVkIGZvciBlYWNoIHNoYXJlZCBvcGVuICovCisJQk9PTDE2ICAgICAgICAgICAgICBmU2hhcmVhYmxlOyAgICAgICAgIC8qIFRSVUUgaWYgZmlyc3Qgb3BlbiB3YXMgc2hhcmVhYmxlICovCisJV09SRCAgICAgICAgICAgICAgICB3Tm90aWZ5RGV2aWNlSUQ7ICAgIC8qIE1DSSBkZXZpY2UgSUQgd2l0aCBhIHBlbmRpbmcgbm90aWZpY2F0aW9uICovCisJSEFORExFMTYgICAgICAgICAgICBoQ2FsbGJhY2s7ICAgICAgICAgIC8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gKi8KKwlITU1JTzE2CSAgICAgICAgICAgIGhGaWxlOwkJLyogbW1pbyBmaWxlIGhhbmRsZSBvcGVuIGFzIEVsZW1lbnQgKi8KIAlNQ0lfV0FWRV9PUEVOX1BBUk1TIG9wZW5QYXJtczsKLQlQQ01XQVZFRk9STUFUCVdhdmVGb3JtYXQ7Ci0JV0FWRUhEUgkJV2F2ZUhkcjsKLQl9IExJTlVYX01DSVdBVkU7CisJUENNV0FWRUZPUk1BVCAgICAgICBXYXZlRm9ybWF0OworCVdBVkVIRFIgICAgICAgICAgICAgV2F2ZUhkcjsKKwlCT09MMTYgICAgICAgICAgICAgIGZJbnB1dDsgICAgICAgICAgICAgLyogRkFMU0UgPSBPdXRwdXQsIFRSVUUgPSBJbnB1dCAqLworfSBMSU5VWF9NQ0lXQVZFOwogCiBzdGF0aWMgTElOVVhfV0FWRU9VVAlXT3V0RGV2W01BWF9XQVZPVVREUlZdOwogc3RhdGljIExJTlVYX1dBVkVJTglXSW5EZXZbTUFYX1dBVk9VVERSVl07CkBAIC04NSwxMiArODUsMTQgQEAKIHN0YXRpYyBEV09SRCBXQVZFX05vdGlmeUNsaWVudChVSU5UMTYgd0RldklELCBXT1JEIHdNc2csIAogCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyB3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAKLQlpZiAoV0luRGV2W2luZGV4XS53RmxhZ3MgIT0gRENCX05VTEwgJiYgIURyaXZlckNhbGxiYWNrKAotCQlXSW5EZXZbaW5kZXhdLndhdmVEZXNjLmR3Q2FsbEJhY2ssIFdJbkRldltpbmRleF0ud0ZsYWdzLCAKLQkJV0luRGV2W2luZGV4XS53YXZlRGVzYy5oV2F2ZSwgd01zZywgCi0JCVdJbkRldltpbmRleF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgeworCWlmICh3RGV2SUQgPiBNQVhfV0FWT1VURFJWKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCisJaWYgKFdJbkRldlt3RGV2SURdLndGbGFncyAhPSBEQ0JfTlVMTCAmJiAhRHJpdmVyQ2FsbGJhY2soCisJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmR3Q2FsbEJhY2ssIFdJbkRldlt3RGV2SURdLndGbGFncywgCisJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmhXYXZlLCB3TXNnLCAKKwkJV0luRGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIAkJfQpAQCAtOTksMTEgKzEwMSwxMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJV0FWRV9tY2lPcGVuCSovCisgKiAJCQkJV0FWRV9tY2lPcGVuCSAgICAgICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbF0qLwogc3RhdGljIERXT1JEIFdBVkVfbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9XQVZFX09QRU5fUEFSTVMgbHBQYXJtcykKIHsKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKLQlITE9DQUwxNgloRm9ybWF0OworCUhMT0NBTDE2ICAgICAgICBoRm9ybWF0OworCUxQV0FWRUZPUk1BVCAgICBscEZvcm1hdDsKIAlMUFBDTVdBVkVGT1JNQVQJbHBXYXZlRm9ybWF0OwogCUhMT0NBTDE2CWhEZXNjOwogCUxQV0FWRU9QRU5ERVNDIAlscERlc2M7CkBAIC0xMTUsMjMgKzExNywyMiBAQAogCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAotCXdEZXZJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKLQlpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwotCi0JaWYgKE1DSVdhdkRldltpbmRleF0ublVzZUNvdW50ID4gMCkgeworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CiAJCS8qIFRoZSBkcml2ZXIgYWxyZWFkeSBvcGVuIG9uIHRoaXMgY2hhbm5lbCAqLwogCQkvKiBJZiB0aGUgZHJpdmVyIHdhcyBvcGVuZWQgc2hhcmVhYmxlIGJlZm9yZSBhbmQgdGhpcyBvcGVuIHNwZWNpZmllcyAqLwogCQkvKiBzaGFyZWFibGUgdGhlbiBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCAqLwotCQlpZiAoTUNJV2F2RGV2W2luZGV4XS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKLQkJCSsrTUNJV2F2RGV2W2luZGV4XS5uVXNlQ291bnQ7CisJCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrTUNJV2F2RGV2W3dEZXZJRF0ublVzZUNvdW50OwogCQllbHNlCiAJCQlyZXR1cm4gTUNJRVJSX01VU1RfVVNFX1NIQVJFQUJMRTsKIAkJfQogCWVsc2UgewotCQlNQ0lXYXZEZXZbaW5kZXhdLm5Vc2VDb3VudCA9IDE7Ci0JCU1DSVdhdkRldltpbmRleF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CisJCU1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudCA9IDE7CisJCU1DSVdhdkRldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9Ci0JbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOworCisJTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0ID0gRkFMU0U7CisKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuIC8vIGJlZm9yZSBPUEVOX0VMRU1FTlRcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewpAQCAtMTQxLDIwICsxNDIsMjAgQEAKIAkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwogCQkJQ2hhclVwcGVyMzJBKHN0cik7Ci0JCQlNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKKwkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKIAkJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7Ci0JCQlpZiAoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSA9PSAwKSB7CisJCQlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewogCQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiAvLyBjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBzdHIpOwogCQkJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCQkJfQogCQkJfQogCQllbHNlIAotCQkJTUNJV2F2RGV2W2luZGV4XS5oRmlsZSA9IDA7CisJCQlNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9IDA7CiAJCX0KLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gaEZpbGU9JXVcbiIsIE1DSVdhdkRldltpbmRleF0uaEZpbGUpOwotCW1lbWNweSgmTUNJV2F2RGV2W2luZGV4XS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfV0FWRV9PUEVOX1BBUk1TKSk7Ci0JTUNJV2F2RGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7Ci0JbHBXYXZlRm9ybWF0ID0gJk1DSVdhdkRldltpbmRleF0uV2F2ZUZvcm1hdDsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gaEZpbGU9JXVcbiIsIE1DSVdhdkRldlt3RGV2SURdLmhGaWxlKTsKKwltZW1jcHkoJk1DSVdhdkRldlt3RGV2SURdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9XQVZFX09QRU5fUEFSTVMpKTsKKwlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CisJbHBXYXZlRm9ybWF0ID0gJk1DSVdhdkRldlt3RGV2SURdLldhdmVGb3JtYXQ7CiAJaERlc2MgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKFdBVkVPUEVOREVTQykpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhEZXNjKTsKIAlscERlc2MtPmhXYXZlID0gMDsKQEAgLTE2NiwxMCArMTY3LDEwIEBACiAJbHBXYXZlRm9ybWF0LT53Zi5uQXZnQnl0ZXNQZXJTZWMgPSAxMTAyNTsKIAlscFdhdmVGb3JtYXQtPndmLm5CbG9ja0FsaWduID0gMTsKICovCi0JaWYgKE1DSVdhdkRldltpbmRleF0uaEZpbGUgIT0gMCkgeworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7CiAJCU1NQ0tJTkZPCW1tY2tJbmZvOwogCQlNTUNLSU5GTwlja01haW5SSUZGOwotCQlpZiAobW1pb0Rlc2NlbmQoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKQEAgLTE4MSwxOSArMTgyLDE5IEBACiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZicsICdtJywgJ3QnLCAnICcpOwotCQlpZiAobW1pb0Rlc2NlbmQoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgIT0gMCkgewogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJCQkiV0FWRV9tY2lPcGVuIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKIAkJCQltbWNrSW5mby5ja3NpemUpOwotCQlpZiAobW1pb1JlYWQoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSwgKEhQU1RSKSBscFdhdmVGb3JtYXQsCisJCWlmIChtbWlvUmVhZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSBscFdhdmVGb3JtYXQsCiAJCSAgICAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSAhPSAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSB7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOwotCQlpZiAobW1pb0Rlc2NlbmQoTUNJV2F2RGV2W2luZGV4XS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgIT0gMCkgewogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCX0KIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKQEAgLTIwNSwzOSArMjA2LDEwNyBAQAogCQkJbHBXYXZlRm9ybWF0LT53Zi5uQ2hhbm5lbHMsIGxwV2F2ZUZvcm1hdC0+d2YublNhbXBsZXNQZXJTZWMpOwogCQlscFdhdmVGb3JtYXQtPndCaXRzUGVyU2FtcGxlID0gMDsKIAkJfQorCiAJbHBXYXZlRm9ybWF0LT53Zi5uQXZnQnl0ZXNQZXJTZWMgPSAKIAkJbHBXYXZlRm9ybWF0LT53Zi5uU2FtcGxlc1BlclNlYyAqIGxwV2F2ZUZvcm1hdC0+d2YubkJsb2NrQWxpZ247CiAJaEZvcm1hdCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoUENNV0FWRUZPUk1BVCkpOwotCWxwRGVzYy0+bHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBVU0VSX0hFQVBfTElOX0FERFIoaEZvcm1hdCk7Ci0JbWVtY3B5KGxwRGVzYy0+bHBGb3JtYXQsIGxwV2F2ZUZvcm1hdCwgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKTsKKwlscEZvcm1hdCA9ICAoTFBXQVZFRk9STUFUKSBVU0VSX0hFQVBfTElOX0FERFIoaEZvcm1hdCk7CisJbWVtY3B5KGxwRm9ybWF0LCBscFdhdmVGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7CisJbHBEZXNjLT5scEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpVVNFUl9IRUFQX1NFR19BRERSKGhGb3JtYXQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX1NFR19BRERSKGhEZXNjKTsKLQlkd1JldCA9IHdvZE1lc3NhZ2UoaW5kZXgsIFdPRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7Ci0JZHdSZXQgPSB3aWRNZXNzYWdlKGluZGV4LCBXSURNX09QRU4sIDAsIChEV09SRClscERlc2MsIENBTExCQUNLX05VTEwpOworCisvKgorICAgQnkgZGVmYXVsdCB0aGUgZGV2aWNlIHdpbGwgYmUgb3BlbmVkIGZvciBvdXRwdXQsIHRoZSBNQ0lfQ1VFIGZ1bmN0aW9uIGlzIHRoZXJlIHRvCisgICBjaGFuZ2UgZnJvbSBvdXRwdXQgdG8gaW5wdXQgYW5kIGJhY2sKKyovCisKKwlkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX09QRU4sIDAsIChEV09SRClscERlc2MsIENBTExCQUNLX05VTEwpOworCiAJVVNFUl9IRUFQX0ZSRUUoaEZvcm1hdCk7CiAJVVNFUl9IRUFQX0ZSRUUoaERlc2MpOwogCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FWRV9tY2lDdWUgICAgICAgICAgICAgW2ludGVybmFsXQorKi8KKworc3RhdGljIERXT1JEIFdBVkVfbWNpQ3VlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKK3sKKy8qCisgICBGSVhNRQorCisgICBUaGlzIHJvdXRpbmUgaXMgZmFyIGZyb20gY29tcGxldGUuIEF0IHRoZSBtb21lbnQgb25seSBhIGNoZWNrIGlzIGRvbmUgb24gdGhlCisgICBNQ0lfV0FWRV9JTlBVVCBmbGFnLiBObyBleHBsaWNpdCBjaGVjayBvbiBNQ0lfV0FWRV9PVVRQVVQgaXMgZG9uZSBzaW5jZSB0aGF0CisgICBpcyB0aGUgZGVmYXVsdC4KKworICAgVGhlIGZsYWdzIE1DSV9OT1RJRlkgKGFuZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyIGluIGxwUGFybXMpIGFuZCBNQ0lfV0FJVCBhcmUKKyAgIGlnbm9yZWQKKyovCisKKyAgICAgICAgRFdPUkQgICAgICAgICAgZHdSZXQ7CisgICAgICAgIEhMT0NBTDE2ICAgICAgIGhEZXNjOworICAgICAgICBMUFdBVkVPUEVOREVTQyBscERlc2M7CisKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaUN1ZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisKKy8qIGFsd2F5cyBjbG9zZSBlbGVtZW50cyA/ICovCisKKwlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgeworCSAgbW1pb0Nsb3NlKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAwKTsKKwkgIE1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gMDsKKwl9CisKKwloRGVzYyA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRU9QRU5ERVNDKSk7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaERlc2MpOworCisJZHdSZXQgPSBNTVNZU0VSUl9OT0VSUk9SOyAgLyogYXNzdW1lIHN1Y2Nlc3MgKi8KKworCWlmICgoZHdQYXJhbSAmIE1DSV9XQVZFX0lOUFVUKSAmJiAhTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KSB7CisKKy8qIEZJWE1FIHRoaXMgaXMganVzdCBhIGhhY2sgV091dERldiBzaG91bGQgYmUgaGlkZGVuIGhlcmUgKi8KKwkgICAgICAgIG1lbWNweShscERlc2MsJldPdXREZXZbd0RldklEXS53YXZlRGVzYyxzaXplb2YoV0FWRU9QRU5ERVNDKSk7CisKKwkgICAgICAgIGR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJICAgICAgICBpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkgICAgICAgIGR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJfQorCWVsc2UgaWYgKE1DSVdhdkRldlt3RGV2SURdLmZJbnB1dCkgeworLyogRklYTUUgdGhpcyBpcyBqdXN0IGEgaGFjayBXSW5EZXYgc2hvdWxkIGJlIGhpZGRlbiBoZXJlICovCisJICAgICAgICBtZW1jcHkobHBEZXNjLCZXSW5EZXZbd0RldklEXS53YXZlRGVzYyxzaXplb2YoV0FWRU9QRU5ERVNDKSk7CisKKwkgICAgICAgIGR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJICAgICAgICBpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkgICAgICAgIGR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJfQorCisJVVNFUl9IRUFQX0ZSRUUoaERlc2MpOworCisgICAgICAgIHJldHVybiBkd1JldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaUNsb3NlCQlbaW50ZXJuYWxdCiAqLwogc3RhdGljIERXT1JEIFdBVkVfbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCURXT1JECQlkd1JldDsKKwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCSJXQVZFX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlNQ0lXYXZEZXZbaW5kZXhdLm5Vc2VDb3VudC0tOwotCWlmIChNQ0lXYXZEZXZbaW5kZXhdLm5Vc2VDb3VudCA9PSAwKSB7Ci0JCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlICE9IDApIHsKLQkJCW1taW9DbG9zZShNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlLCAwKTsKLQkJCU1DSVdhdkRldltpbmRleF0uaEZpbGUgPSAwOwotCQkJfQotCQlkd1JldCA9IHdvZE1lc3NhZ2UoaW5kZXgsIFdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7Ci0JCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQlkd1JldCA9IHdpZE1lc3NhZ2UoaW5kZXgsIFdJRE1fQ0xPU0UsIDAsIDBMLCAwTCk7Ci0JCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCQkJIldBVkVfbWNpQ2xvc2UoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOworCU1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudC0tOworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgeworCSAgICAgICAgaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlICE9IDApIHsKKwkJICAgICAgICBtbWlvQ2xvc2UoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIDApOworCQkJTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPSAwOwogCQl9CisJCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQpCisJCSAgICAgICAgZHdSZXQgPSB3aWRNZXNzYWdlKHdEZXZJRCwgV0lETV9DTE9TRSwgMCwgMEwsIDBMKTsKKwkJZWxzZQorCQkgICAgICAgIGR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CisJICAKKwkJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0yNDcsNyArMzE2LDYgQEAKICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lQbGF5KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKIHsKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCQkJc3RhcnQsIGVuZDsKIAlMT05HCQkJYnVmc2l6ZSwgY291bnQ7CiAJSEdMT0JBTDE2CQloRGF0YTsKQEAgLTI1NSwxMyArMzIzLDIwIEBACiAJTFBXQVZFSERSCQlscFdhdmVIZHI7CiAJTFBXQVZFSERSCQlscDE2V2F2ZUhkcjsKIAlEV09SRAkJCWR3UmV0OworCiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJICJXQVZFX21jaVBsYXkoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lQbGF5IC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNQ0lXYXZEZXZbaW5kZXhdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKKworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQpIHsKKwkgICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBjYW5ub3QgcGxheSBvbiBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gTUNJRVJSX05PTkFQUExJQ0FCTEVfRlVOQ1RJT047CisJfQorCisJaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlID09IDApIHsKKyAgICAgICAgICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1DSVdhdkRldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKIAkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKLQkJfQorCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCkBAIC0yOTAsNyArMzY1LDcgQEAKIAkJfQogI2VuZGlmCiAJYnVmc2l6ZSA9IDY0MDAwOwotCWxwV2F2ZUhkciA9ICZNQ0lXYXZEZXZbaW5kZXhdLldhdmVIZHI7CisJbHBXYXZlSGRyID0gJk1DSVdhdkRldlt3RGV2SURdLldhdmVIZHI7CiAJaERhdGEgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIGJ1ZnNpemUpOwogCWxwV2F2ZUhkci0+bHBEYXRhID0gKExQU1RSKSBXSU4xNl9HbG9iYWxMb2NrMTYoaERhdGEpOwogCWxwV2F2ZUhkci0+ZHdVc2VyID0gMEw7CkBAIC0zMDAsOSArMzc1LDkgQEAKIAlscDE2V2F2ZUhkciA9IChMUFdBVkVIRFIpIFVTRVJfSEVBUF9TRUdfQUREUihoV2F2ZUhkcik7CiAJbWVtY3B5KFBUUl9TRUdfVE9fTElOKGxwMTZXYXZlSGRyKSwgbHBXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWxwV2F2ZUhkciA9IFBUUl9TRUdfVE9fTElOKGxwMTZXYXZlSGRyKTsKLQlkd1JldCA9IHdvZE1lc3NhZ2UoaW5kZXgsIFdPRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOworCWR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCXdoaWxlKFRSVUUpIHsKLQkJY291bnQgPSBtbWlvUmVhZChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlLCAKKwkJY291bnQgPSBtbWlvUmVhZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgCiAJCQlQVFJfU0VHX1RPX0xJTihscFdhdmVIZHItPmxwRGF0YSksIGJ1ZnNpemUpOwogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gbW1pb1JlYWQgYnVmc2l6ZT0lbGQgY291bnQ9JWxkXG4iLCBidWZzaXplLCBjb3VudCk7CiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwpAQCAtMzEwLDkgKzM4NSw5IEBACiAvKgkJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSBjb3VudDsgKi8KIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lQbGF5IC8vIGJlZm9yZSBXT0RNX1dSSVRFIGxwV2F2ZUhkcj0lcCBkd0J1ZmZlckxlbmd0aD0lbHUgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQlscFdhdmVIZHIsIGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgsIGxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLQkJZHdSZXQgPSB3b2RNZXNzYWdlKGluZGV4LCBXT0RNX1dSSVRFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJCWR3UmV0ID0gd29kTWVzc2FnZSh3RGV2SUQsIFdPRE1fV1JJVEUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAkJfQotCWR3UmV0ID0gd29kTWVzc2FnZShpbmRleCwgV09ETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdvZE1lc3NhZ2Uod0RldklELCBXT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWlmIChscFdhdmVIZHItPmxwRGF0YSAhPSBOVUxMKSB7CiAJCUdsb2JhbFVubG9jazE2KGhEYXRhKTsKIAkJR2xvYmFsRnJlZTE2KGhEYXRhKTsKQEAgLTMyMiw3ICszOTcsNyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJTUNJV2F2RGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTMzMyw4ICs0MDgsNyBAQAogKi8KIHN0YXRpYyBEV09SRCBXQVZFX21jaVJlY29yZChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKIHsKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKLQlpbnQJCQkJc3RhcnQsIGVuZDsKKwlpbnQJCSAgICAgICAJc3RhcnQsIGVuZDsKIAlMT05HCQkJYnVmc2l6ZTsKIAlIR0xPQkFMMTYJCWhEYXRhOwogCUhMT0NBTDE2CQloV2F2ZUhkcjsKQEAgLTM0NCwxMSArNDE4LDE3IEBACiAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lSZWNvcmQoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwotCWlmIChNQ0lXYXZEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKKworCWlmICghTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KSB7CisJICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gY2Fubm90IHJlY29yZCBvbiBvdXRwdXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE1DSUVSUl9OT05BUFBMSUNBQkxFX0ZVTkNUSU9OOworCX0KKworCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAotCQkJCU1DSVdhdkRldltpbmRleF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOworCQkJCU1DSVdhdkRldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKIAkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKLQkJfQorCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCkBAIC0zNjAsNyArNDQwLDcgQEAKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKIAkJfQogCWJ1ZnNpemUgPSA2NDAwMDsKLQlscFdhdmVIZHIgPSAmTUNJV2F2RGV2W2luZGV4XS5XYXZlSGRyOworCWxwV2F2ZUhkciA9ICZNQ0lXYXZEZXZbd0RldklEXS5XYXZlSGRyOwogCWhEYXRhID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBidWZzaXplKTsKIAlscFdhdmVIZHItPmxwRGF0YSA9IChMUFNUUikgV0lOMTZfR2xvYmFsTG9jazE2KGhEYXRhKTsKIAlscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoID0gYnVmc2l6ZTsKQEAgLTM3MSwxOCArNDUxLDE4IEBACiAJbHAxNldhdmVIZHIgPSAoTFBXQVZFSERSKSBVU0VSX0hFQVBfU0VHX0FERFIoaFdhdmVIZHIpOwogCW1lbWNweShQVFJfU0VHX1RPX0xJTihscDE2V2F2ZUhkciksIGxwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAlscFdhdmVIZHIgPSBQVFJfU0VHX1RPX0xJTihscDE2V2F2ZUhkcik7Ci0JZHdSZXQgPSB3aWRNZXNzYWdlKGluZGV4LCBXSURNX1BSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELCBXSURNX1BSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1BSRVBBUkUgXG4iKTsKIAl3aGlsZShUUlVFKSB7CiAJCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKLQkJZHdSZXQgPSB3aWRNZXNzYWdlKGluZGV4LCBXSURNX1NUQVJULCAwLCAwTCwgMEwpOworCQlkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELCBXSURNX1NUQVJULCAwLCAwTCwgMEwpOwogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogICAgICAgICAgICAgICAgICAgICAiV0FWRV9tY2lSZWNvcmQgLy8gYWZ0ZXIgV0lETV9TVEFSVCBscFdhdmVIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQkJbHBXYXZlSGRyLCBscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAJCWlmIChscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKIAkJfQogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGJlZm9yZSBXSURNX1VOUFJFUEFSRSBcbiIpOwotCWR3UmV0ID0gd2lkTWVzc2FnZShpbmRleCwgV0lETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdpZE1lc3NhZ2Uod0RldklELCBXSURNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGFmdGVyIFdJRE1fVU5QUkVQQVJFIFxuIik7CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhICE9IE5VTEwpIHsKIAkJR2xvYmFsVW5sb2NrMTYoaERhdGEpOwpAQCAtMzkzLDcgKzQ3Myw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAJICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlNQ0lXYXZEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogfQpAQCAtNTA5LDcgKzU4OSw2IEBACiAqLwogc3RhdGljIERXT1JEIFdBVkVfbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQogewotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTU5Nyw3ICs2NzYsNyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlNQ0lXYXZEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogIAlyZXR1cm4gMDsKIH0KQEAgLTY1OCw3ICs3MzcsNiBAQAogKi8KIHN0YXRpYyBEV09SRCBXQVZFX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNUyBscFBhcm1zKQogewotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaUluZm8oJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC02NjksNyArNzQ3LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9JTkZPX0ZJTEU6CiAJCQlscFBhcm1zLT5scHN0clJldHVybiA9IAotCQkJCShMUFNUUilNQ0lXYXZEZXZbaW5kZXhdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lOworCQkJCShMUFNUUilNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX0lOUFVUOgogCQkJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSAiTGludXggU291bmQgU3lzdGVtIDAuNSI7CkBAIC03MDQsOCArNzgyLDkgQEAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkgICAid29kR2V0RGV2Q2FwcygldSwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKIAlpZiAobHBDYXBzID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworCWlmIChhY2Nlc3MoU09VTkRfREVWLDApICE9IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1dST05MWSwgMCk7Ci0JaWYgKGF1ZGlvID09IC0xKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwlpZiAoYXVkaW8gPT0gLTEpIHJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQgOwogI2lmZGVmIEVNVUxBVEVfU0IxNgogCWxwQ2Fwcy0+d01pZCA9IDB4MDAwMjsKIAlscENhcHMtPndQaWQgPSAweDAxMDQ7CkBAIC03NzcsMTAgKzg1NiwxMSBAQAogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9CiAJV091dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOworCWlmIChhY2Nlc3MoU09VTkRfREVWLDApICE9IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKGF1ZGlvID09IC0xKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOwotCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRCA7CiAJCX0KIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9HRVRCTEtTSVpFLCBhYnVmX3NpemUpOwogCWlmIChhYnVmX3NpemUgPCAxMDI0IHx8IGFidWZfc2l6ZSA+IDY1NTM2KSB7CkBAIC04MTAsNyArODkwLDEwIEBACiAJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOwogCVdPdXREZXZbd0RldklEXS5idWZzaXplID0gYWJ1Zl9zaXplOwogCW1lbWNweSgmV091dERldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbHBEZXNjLT5scEZvcm1hdCA9ICVwXG4iLGxwRGVzYy0+bHBGb3JtYXQpOwogICAgICAgICBscEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpIFBUUl9TRUdfVE9fTElOKGxwRGVzYy0+bHBGb3JtYXQpOyAKKy8qCWxwRm9ybWF0ID0gbHBEZXNjLT5scEZvcm1hdDsgKi8KKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbHBGb3JtYXQgPSAlcFxuIixscEZvcm1hdCk7CiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCiAJCQkJbHBGb3JtYXQtPndGb3JtYXRUYWcpOwpAQCAtMTA0Miw3ICsxMTI1LDcgQEAKIAlpbnQJCXZvbHVtZSwgbGVmdCwgcmlnaHQ7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0Vm9sdW1lKCV1LCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOwogCWlmIChscGR3Vm9sID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCWlmICgobWl4ZXIgPSBvcGVuKCIvZGV2L21peGVyIiwgT19SRE9OTFkpKSA8IDApIHsKKwlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRPTkxZKSkgPCAwKSB7CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsICJMaW51eCAnd29kR2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KQEAgLTEwNTMsNyArMTEzNiw3IEBACiAJY2xvc2UobWl4ZXIpOwogCWxlZnQgPSB2b2x1bWUgJiAweDdGOwogCXJpZ2h0ID0gKHZvbHVtZSA+PiA4KSAmIDB4N0Y7Ci0JcHJpbnRmKCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbGVmdD0lZCByaWdodD0lZCAhXG4iLCBsZWZ0LCByaWdodCk7CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZEdldFZvbHVtZScgLy8gbGVmdD0lZCByaWdodD0lZCAhXG4iLCBsZWZ0LCByaWdodCk7CiAJKmxwZHdWb2wgPSBNQUtFTE9ORyhsZWZ0IDw8IDksIHJpZ2h0IDw8IDkpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTA2OSw3ICsxMTUyLDcgQEAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RTZXRWb2x1bWUoJXUsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKLQlpZiAoKG1peGVyID0gb3BlbigiL2Rldi9taXhlciIsIE9fV1JPTkxZKSkgPCAwKSB7CisJaWYgKChtaXhlciA9IG9wZW4oTUlYRVJfREVWLCBPX1dST05MWSkpIDwgMCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dvZFNldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CkBAIC0xMTE0LDEzICsxMTk3LDEzIEBACiAJCWNhc2UgV09ETV9HRVROVU1ERVZTOgogCQkJcmV0dXJuIDFMOwogCQljYXNlIFdPRE1fR0VUUElUQ0g6Ci0JCQlyZXR1cm4gMEw7CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogCQljYXNlIFdPRE1fU0VUUElUQ0g6Ci0JCQlyZXR1cm4gMEw7CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogCQljYXNlIFdPRE1fR0VUUExBWUJBQ0tSQVRFOgotCQkJcmV0dXJuIDBMOworCQkJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIAkJY2FzZSBXT0RNX1NFVFBMQVlCQUNLUkFURToKLQkJCXJldHVybiAwTDsKKwkJCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiAJCWNhc2UgV09ETV9HRVRWT0xVTUU6CiAJCQlyZXR1cm4gd29kR2V0Vm9sdW1lKHdEZXZJRCwgKExQRFdPUkQpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpKTsKIAkJY2FzZSBXT0RNX1NFVFZPTFVNRToKQEAgLTExNTYsMTIgKzEyMzksMTMgQEAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkid2lkR2V0RGV2Q2FwcygldSwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKIAlpZiAobHBDYXBzID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworCWlmIChhY2Nlc3MoU09VTkRfREVWLDApICE9IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1JET05MWSwgMCk7Ci0JaWYgKGF1ZGlvID09IC0xKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKKwlpZiAoYXVkaW8gPT0gLTEpIHJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQgOwogI2lmZGVmIEVNVUxBVEVfU0IxNgogCWxwQ2Fwcy0+d01pZCA9IDB4MDAwMjsKIAlscENhcHMtPndQaWQgPSAweDAwMDQ7Ci0Jc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwgIlNCMTYgV2F2ZSBPdXQiKTsKKwlzdHJjcHkobHBDYXBzLT5zelBuYW1lLCAiU0IxNiBXYXZlIEluIik7CiAjZWxzZQogCWxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCS8qIE1hbnVmYWMgSUQgKi8KIAlscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBQcm9kdWN0IElEICovCkBAIC0xMjI1LDEwICsxMzA5LDExIEBACiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJCX0KIAlXSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKKwlpZiAoYWNjZXNzKFNPVU5EX0RFViwwKSAhPSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlhdWRpbyA9IG9wZW4gKFNPVU5EX0RFViwgT19SRE9OTFksIDApOwogCWlmIChhdWRpbyA9PSAtMSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gY2FuJ3Qgb3BlbiAhXG4iKTsKLQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CisJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJCX0KIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9HRVRCTEtTSVpFLCBhYnVmX3NpemUpOwogCWlmIChhYnVmX3NpemUgPCAxMDI0IHx8IGFidWZfc2l6ZSA+IDY1NTM2KSB7CkBAIC0xMjU4LDcgKzEzNDMsOCBAQAogCVdJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSBhYnVmX3NpemU7CiAJV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkID0gMDsKIAltZW1jcHkoJldJbkRldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKLSAgICAgICAgbHBGb3JtYXQgPSBscERlc2MtPmxwRm9ybWF0OworICAgICAgICBscEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpIFBUUl9TRUdfVE9fTElOKGxwRGVzYy0+bHBGb3JtYXQpOyAKKy8qICAgICAgICBscEZvcm1hdCA9IGxwRGVzYy0+bHBGb3JtYXQ7ICovCiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCiAJCQkJCWxwRm9ybWF0LT53Rm9ybWF0VGFnKTsKQEAgLTE2MTksNiArMTcwNSw4IEBACiAJCWNhc2UgTUNJX09QRU5fRFJJVkVSOgogCQljYXNlIE1DSV9PUEVOOgogCQkJcmV0dXJuIFdBVkVfbWNpT3Blbihkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1dBVkVfT1BFTl9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworCQljYXNlIE1DSV9DVUU6CisJCQlyZXR1cm4gV0FWRV9tY2lDdWUoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX0NMT1NFX0RSSVZFUjoKIAkJY2FzZSBNQ0lfQ0xPU0U6CiAJCQlyZXR1cm4gV0FWRV9tY2lDbG9zZShkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpYW5pbS5jIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKaW5kZXggYmFiY2YyNS4uNmFiNWRkZiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lhbmltLmMKKysrIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKQEAgLTE3LDggKzE3LDYgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLWludCBNTVNZU1RFTV9EZXZJRFRvSW5kZXgoVUlOVDE2KTsKLQogI2RlZmluZSBNQVhfQU5JTURSViAJCTIKIAogI2RlZmluZSBBTklNRlJBTUVTX1BFUlNFQyAJMzAKQEAgLTU0LDI0ICs1MiwyNCBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKIAljaGFyCQlzdHJbMTI4XTsKKwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoQW5pbURldltpbmRleF0ublVzZUNvdW50ID4gMCkgeworCWlmIChBbmltRGV2W3dEZXZJRF0ublVzZUNvdW50ID4gMCkgewogCQkvKiBUaGUgZHJpdmVyIGFscmVhZHkgb3BlbiBvbiB0aGlzIGNoYW5uZWwgKi8KIAkJLyogSWYgdGhlIGRyaXZlciB3YXMgb3BlbmVkIHNoYXJlYWJsZSBiZWZvcmUgYW5kIHRoaXMgb3BlbiBzcGVjaWZpZXMgKi8KIAkJLyogc2hhcmVhYmxlIHRoZW4gaW5jcmVtZW50IHRoZSB1c2UgY291bnQgKi8KLQkJaWYgKEFuaW1EZXZbaW5kZXhdLmZTaGFyZWFibGUgJiYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEUpKQotCQkJKytBbmltRGV2W2luZGV4XS5uVXNlQ291bnQ7CisJCWlmIChBbmltRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCisJCQkrK0FuaW1EZXZbd0RldklEXS5uVXNlQ291bnQ7CiAJCWVsc2UKIAkJCXJldHVybiBNQ0lFUlJfTVVTVF9VU0VfU0hBUkVBQkxFOwogCQl9CiAJZWxzZSB7Ci0JCUFuaW1EZXZbaW5kZXhdLm5Vc2VDb3VudCA9IDE7Ci0JCUFuaW1EZXZbaW5kZXhdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOworCQlBbmltRGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKKwkJQW5pbURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKQEAgLTg1LDIxICs4MywyMSBAQAogCQkJQ2hhclVwcGVyMzJBKHN0cik7CiAJCQl9CiAJCX0KLQltZW1jcHkoJkFuaW1EZXZbaW5kZXhdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7Ci0JQW5pbURldltpbmRleF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwotCUFuaW1EZXZbaW5kZXhdLm1vZGUgPSAwOwotCUFuaW1EZXZbaW5kZXhdLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfVE1TRjsKLQlBbmltRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSAwOwotCUFuaW1EZXZbaW5kZXhdLm5UcmFja3MgPSAwOwotCUFuaW1EZXZbaW5kZXhdLmR3VG90YWxMZW4gPSAwOwotCUFuaW1EZXZbaW5kZXhdLmxwZHdUcmFja0xlbiA9IE5VTEw7Ci0JQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zID0gTlVMTDsKKwltZW1jcHkoJkFuaW1EZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOworCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CisJQW5pbURldlt3RGV2SURdLm1vZGUgPSAwOworCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1RNU0Y7CisJQW5pbURldlt3RGV2SURdLm5DdXJUcmFjayA9IDA7CisJQW5pbURldlt3RGV2SURdLm5UcmFja3MgPSAwOworCUFuaW1EZXZbd0RldklEXS5kd1RvdGFsTGVuID0gMDsKKwlBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKKwlBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zID0gTlVMTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaU9wZW4gLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAgCXJldHVybiAwOwogI2Vsc2UKQEAgLTExMywxMSArMTExLDEwIEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldltpbmRleF0ubHBkd1RyYWNrTGVuKTsKLQlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zICE9IE5VTEwpIGZyZWUoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zKTsKKwlpZiAoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbiAhPSBOVUxMKSBmcmVlKEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tMZW4pOworCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zICE9IE5VTEwpIGZyZWUoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvcyk7CiAjZW5kaWYKICAgICAgICAgcmV0dXJuIDA7CiB9CkBAIC0xODUsNyArMTgyLDYgQEAKIHsKIAlEV09SRAlkd1RpbWUgPSAwOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJVUlOVDE2CXdUcmFjazsKIAlVSU5UMTYJd01pbnV0ZXM7CiAJVUlOVDE2CXdTZWNvbmRzOwpAQCAtMjEyLDExICsyMDgsMTEgQEAKIAkJCS8qIHVua25vd24gZm9ybWF0ICEgZm9yY2UgVE1TRiAhIC4uLiAqLwogCQkJZHdGb3JtYXRUeXBlID0gTUNJX0ZPUk1BVF9UTVNGOwogCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKLQkJCWZvciAod1RyYWNrID0gMDsgd1RyYWNrIDwgQW5pbURldltpbmRleF0ublRyYWNrczsgd1RyYWNrKyspIHsKLS8qCQkJCWR3VGltZSArPSBBbmltRGV2W2luZGV4XS5scGR3VHJhY2tMZW5bd1RyYWNrIC0gMV07CisJCQlmb3IgKHdUcmFjayA9IDA7IHdUcmFjayA8IEFuaW1EZXZbd0RldklEXS5uVHJhY2tzOyB3VHJhY2srKykgeworLyoJCQkJZHdUaW1lICs9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tMZW5bd1RyYWNrIC0gMV07CiAJCQkJcHJpbnRmKCJBZGRpbmcgdHJrIyV1IGN1cnBvcz0ldSBcbiIsIGR3VGltZSk7CiAJCQkJaWYgKGR3VGltZSA+PSBkd0ZyYW1lKSBicmVhazsgKi8KLQkJCQlpZiAoQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdID49IGR3RnJhbWUpIGJyZWFrOworCQkJCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdID49IGR3RnJhbWUpIGJyZWFrOwogCQkJCX0KIAkJCXdNaW51dGVzID0gZHdGcmFtZSAvIEFOSU1GUkFNRVNfUEVSTUlOOwogCQkJd1NlY29uZHMgPSAoZHdGcmFtZSAtIEFOSU1GUkFNRVNfUEVSTUlOICogd01pbnV0ZXMpIC8gQU5JTUZSQU1FU19QRVJTRUM7CkBAIC0yNDAsNyArMjM2LDYgQEAKIHsKIAlEV09SRAlkd0ZyYW1lID0gMDsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCVVJTlQxNgl3VHJhY2s7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9DYWxjRnJhbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCiAJCQl3RGV2SUQsIGR3Rm9ybWF0VHlwZSwgZHdUaW1lKTsKQEAgLTI3MSw4ICsyNjYsOCBAQAogCQkJCU1DSV9UTVNGX1NFQ09ORChkd1RpbWUpLCBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpKTsKIAkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCiAJCQkJIkFOSU1fQ2FsY0ZyYW1lIC8vIFRNU0YgdHJhY2twb3NbJXVdPSVsdVxuIiwKLQkJCQl3VHJhY2ssIEFuaW1EZXZbaW5kZXhdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSk7Ci0JCQlkd0ZyYW1lID0gQW5pbURldltpbmRleF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdOworCQkJCXdUcmFjaywgQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSk7CisJCQlkd0ZyYW1lID0gQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXTsKIAkJCWR3RnJhbWUgKz0gQU5JTUZSQU1FU19QRVJNSU4gKiBNQ0lfVE1TRl9NSU5VVEUoZHdUaW1lKTsKIAkJCWR3RnJhbWUgKz0gQU5JTUZSQU1FU19QRVJTRUMgKiBNQ0lfVE1TRl9TRUNPTkQoZHdUaW1lKTsKIAkJCWR3RnJhbWUgKz0gTUNJX1RNU0ZfRlJBTUUoZHdUaW1lKTsKQEAgLTI4OSw3ICsyODQsNiBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaUluZm8oJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtMzAwLDcgKzI5NCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfSU5GT19GSUxFOgogCQkJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSAKLQkJCQkoTFBTVFIpQW5pbURldltpbmRleF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWU7CisJCQkJKExQU1RSKUFuaW1EZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9BTklNX0lORk9fVEVYVDoKIAkJCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gIkFuaW1hdGlvbiBXaW5kb3ciOwpAQCAtMzI0LDcgKzMxOCw2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIAogCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtMzMzLDMwICszMjYsMzAgQEAKIAkJCSJBTklNX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CiAJCQljYXNlIE1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSzoKLQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLm5DdXJUcmFjazsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5uQ3VyVHJhY2s7CiAJCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gQ1VSUkVOVF9UUkFDSz0lbHUhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewogCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3VHJhY2spOwotCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IEFuaW1EZXZbaW5kZXhdLm5UcmFja3MpCisJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQW5pbURldlt3RGV2SURdLm5UcmFja3MpCiAJCQkJCQlyZXR1cm4gTUNJRVJSX09VVE9GUkFOR0U7Ci0JCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldltpbmRleF0ubHBkd1RyYWNrTGVuW2xwUGFybXMtPmR3VHJhY2tdOworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tMZW5bbHBQYXJtcy0+ZHdUcmFja107CiAJCQkJCX0KIAkJCQllbHNlCi0JCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldltpbmRleF0uZHdUb3RhbExlbjsKKwkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKLQkJCQkJQW5pbURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1JldHVybik7CisJCQkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIExFTkdUSD0lbHUgIVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19NT0RFOgotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldltpbmRleF0ubW9kZTsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5tb2RlOwogCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTU9ERT0lMDhsWCAhXG4iLAogCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKQEAgLTM3MSwxOSArMzY0LDE5IEBACiAJCQkJaWYgKGxwUGFybXMtPmR3UmV0dXJuID09IChXT1JEKS0xKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19QT1NJVElPTjoKLQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbaW5kZXhdLmR3Q3VyRnJhbWU7CisJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0uZHdDdXJGcmFtZTsKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpIHsKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1NUQVRVU19TVEFSVCAhXG4iKTsKIAkJCQkJfQogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7Ci0JCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQW5pbURldltpbmRleF0ublRyYWNrcykKKwkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBBbmltRGV2W3dEZXZJRF0ublRyYWNrcykKIAkJCQkJCXJldHVybiBNQ0lFUlJfT1VUT0ZSQU5HRTsKLQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W2luZGV4XS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOworCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwogCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKLQkJCQkJQW5pbURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1JldHVybik7CisJCQkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19QT1NJVElPTj0lMDhsWCAhXG4iLAogCQkJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwpAQCAtNDE0LDMzICs0MDcsMzIgQEAKIHN0YXRpYyBEV09SRCBBTklNX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50IAlzdGFydCwgZW5kOwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpUGxheSgldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0Jc3RhcnQgPSAwOyAJCWVuZCA9IEFuaW1EZXZbaW5kZXhdLmR3VG90YWxMZW47Ci0JQW5pbURldltpbmRleF0ubkN1clRyYWNrID0gMTsKKwlzdGFydCA9IDA7IAkJZW5kID0gQW5pbURldlt3RGV2SURdLmR3VG90YWxMZW47CisJQW5pbURldlt3RGV2SURdLm5DdXJUcmFjayA9IDE7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IEFOSU1fQ2FsY0ZyYW1lKHdEZXZJRCwgCi0JCQlBbmltRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAorCQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdGcm9tKTsgCiAgICAgICAgIGRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpUGxheSAvLyBNQ0lfRlJPTT0lMDhsWCAtPiAldSBcbiIsCiAJCQkJbHBQYXJtcy0+ZHdGcm9tLCBzdGFydCk7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9UTykgewogCQllbmQgPSBBTklNX0NhbGNGcmFtZSh3RGV2SUQsIAotCQkJQW5pbURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKKwkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3VG8pOwogICAgICAgICAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVBsYXkgLy8gTUNJX1RPPSUwOGxYIC0+ICV1IFxuIiwKIAkJCWxwUGFybXMtPmR3VG8sIGVuZCk7CiAJCX0KLQlBbmltRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUExBWTsKKwlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCiAJCQkiQU5JTV9tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogI2Vsc2UKQEAgLTQ1NCwxNyArNDQ2LDE2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RvcCgldSwgJTA4bFgsICVwKTtcbiIsIAogCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCUFuaW1EZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVN0b3AgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAgCXJldHVybiAwOwogI2Vsc2UKQEAgLTQ3OCwxNyArNDY5LDE2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlBbmltRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUEFVU0U7CisJQW5pbURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9QQVVTRTsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVBhdXNlIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQW5pbURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwogI2Vsc2UKQEAgLTUwMiwxNyArNDkyLDE2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lSZXN1bWUoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCUFuaW1EZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKIAkJCSJBTklNX21jaVJlc3VtZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC01MjYsMTkgKzUxNSwxOCBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpU2VlayhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRUVLX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlEV09SRAlkd1JldDsKIAlNQ0lfUExBWV9QQVJNUyBQbGF5UGFybXM7CiAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTZWVrKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlBbmltRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU0VFSzsKKwlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NFRUs7CiAJc3dpdGNoKGR3RmxhZ3MpIHsKIAkJY2FzZSBNQ0lfU0VFS19UT19TVEFSVDoKIAkJCVBsYXlQYXJtcy5kd0Zyb20gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFRUtfVE9fRU5EOgotCQkJUGxheVBhcm1zLmR3RnJvbSA9IEFuaW1EZXZbaW5kZXhdLmR3VG90YWxMZW47CisJCQlQbGF5UGFybXMuZHdGcm9tID0gQW5pbURldlt3RGV2SURdLmR3VG90YWxMZW47CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfVE86CiAJCQlQbGF5UGFybXMuZHdGcm9tID0gbHBQYXJtcy0+ZHdUbzsKQEAgLTU1Miw3ICs1NDAsNyBAQAogCQkJIkFOSU1fbWNpU2VlayAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUFuaW1EZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gZHdSZXQ7CiAjZWxzZQpAQCAtNTY3LDcgKzU1NSw2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC01OTEsNyArNTc4LDcgQEAKIAkJCQlmcHJpbnRmKHN0ZGVyciwiQU5JTV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwogCQkJCXJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwogCQkJfQotCQlBbmltRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQgPSBscFBhcm1zLT5kd1RpbWVGb3JtYXQ7CisJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQgPSBscFBhcm1zLT5kd1RpbWVGb3JtYXQ7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVklERU8pIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwpAQCAtNjAxLDcgKzU4OCw3IEBACiAJCQkiQU5JTV9tY2lTZXQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlBbmltRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2ljZGEuYyBiL211bHRpbWVkaWEvbWNpY2RhLmMKaW5kZXggNWM5NzgxZC4uNDIxMzkzMyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2ljZGEuYworKysgYi9tdWx0aW1lZGlhL21jaWNkYS5jCkBAIC0yNSw4ICsyNSw2IEBACiAjaW5jbHVkZSA8c3lzL2NkaW8uaD4KICNlbmRpZgogCi1pbnQgTU1TWVNURU1fRGV2SURUb0luZGV4KFVJTlQxNik7Ci0KICNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKICNpZmRlZiBfX0ZyZWVCU0RfXwogI2RlZmluZSBDREFVRElPX0RFViAiL2Rldi9yY2QwYyIKQEAgLTQwLDcgKzM4LDcgQEAKICNkZWZpbmUgSU9DVEwoYSxiLGMpCQkoYyA9IGlvY3RsKGEsYixjKSApCiAjZW5kaWYKIAotI2RlZmluZSBNQVhfQ0RBVURJT0RSViAJCTIKKyNkZWZpbmUgTUFYX0NEQVVESU9EUlYgCQkoMSkKICNkZWZpbmUgTUFYX0NEQVVESU9fVFJBQ0tTIAkyNTYKIAogI2RlZmluZSBDREZSQU1FU19QRVJTRUMgCTc1CkBAIC04NCwxNCArODIsMTQgQEAKIHN0YXRpYyBVSU5UMTYgQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcyhVSU5UMTYgd0RldklEKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAjaWZkZWYgbGludXgKIAlzdHJ1Y3QgY2Ryb21fdG9jaGRyCWhkcjsKICNlbGlmIF9fRnJlZUJTRF9fCiAJc3RydWN0IGlvY190b2NfaGVhZGVyCWhkcjsKICNlbmRpZgotCWlmIChDREFEZXZbaW5kZXhdLm5UcmFja3MgPT0gMCkgewotCQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LAorCisJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgeworCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwKICNpZmRlZiBsaW51eAogCQkJICBDRFJPTVJFQURUT0NIRFIKICNlbGlmIF9fRnJlZUJTRF9fCkBAIC0xMDQsMTIgKzEwMiwxMiBAQAogCQkJcmV0dXJuIChXT1JEKS0xOwogCQkJfQogI2lmZGVmIGxpbnV4Ci0JCUNEQURldltpbmRleF0ublRyYWNrcyA9IGhkci5jZHRoX3RyazE7CisJCUNEQURldlt3RGV2SURdLm5UcmFja3MgPSBoZHIuY2R0aF90cmsxOwogI2VsaWYgX19GcmVlQlNEX18KLQkJQ0RBRGV2W2luZGV4XS5uVHJhY2tzID0gaGRyLmVuZGluZ190cmFjayAtIGhkci5zdGFydGluZ190cmFjayArIDE7CisJCUNEQURldlt3RGV2SURdLm5UcmFja3MgPSBoZHIuZW5kaW5nX3RyYWNrIC0gaGRyLnN0YXJ0aW5nX3RyYWNrICsgMTsKICNlbmRpZgogCQl9Ci0JcmV0dXJuIENEQURldltpbmRleF0ublRyYWNrczsKKwlyZXR1cm4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrczsKICNlbHNlCiAJcmV0dXJuIChXT1JEKS0xOwogI2VuZGlmCkBAIC0xMjIsNyArMTIwLDYgQEAKIHN0YXRpYyBCT09MMzIgQ0RBVURJT19HZXRUcmFja3NJbmZvKFVJTlQxNiB3RGV2SUQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCWksIGxlbmd0aDsKIAlpbnQJCXN0YXJ0LCBsYXN0X3N0YXJ0ID0gMDsKIAlpbnQJCXRvdGFsX2xlbmd0aCA9IDA7CkBAIC0xMzIsMzEgKzEyOSwzMiBAQAogCXN0cnVjdCBpb2NfcmVhZF90b2NfZW50cnkJZW50cnk7CiAJc3RydWN0IGNkX3RvY19lbnRyeSAgICAgICAgICAgICB0b2NfYnVmZmVyOwogI2VuZGlmCi0JaWYgKENEQURldltpbmRleF0ublRyYWNrcyA9PSAwKSB7CisKKwlpZiAoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9PSAwKSB7CiAJCWlmIChDREFVRElPX0dldE51bWJlck9mVHJhY2tzKHdEZXZJRCkgPT0gKFdPUkQpLTEpIHJldHVybiBGQUxTRTsKIAkJfQogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gblRyYWNrcz0ldVxuIiwgCi0JCUNEQURldltpbmRleF0ublRyYWNrcyk7Ci0JaWYgKENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIAotCQlmcmVlKENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuKTsKLQlDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbiA9IChMUERXT1JEKW1hbGxvYygKLQkJKENEQURldltpbmRleF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7Ci0JaWYgKENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zICE9IE5VTEwpIAotCQlmcmVlKENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zKTsKLQlDREFEZXZbaW5kZXhdLmxwZHdUcmFja1BvcyA9IChMUERXT1JEKW1hbGxvYygKLQkJKENEQURldltpbmRleF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7Ci0JaWYgKENEQURldltpbmRleF0ubHBkd1RyYWNrTGVuID09IE5VTEwgfHwKLQkJQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3MgPT0gTlVMTCkgeworCQlDREFEZXZbd0RldklEXS5uVHJhY2tzKTsKKwlpZiAoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIAorCQlmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CisJQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gKExQRFdPUkQpbWFsbG9jKAorCQkoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7CisJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyAhPSBOVUxMKSAKKwkJZnJlZShDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MpOworCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9IChMUERXT1JEKW1hbGxvYygKKwkJKENEQURldlt3RGV2SURdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOworCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gPT0gTlVMTCB8fAorCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPT0gTlVMTCkgewogICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBlcnJvciBhbGxvY2F0aW5nIHRyYWNrIHRhYmxlICFcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJCX0KLQltZW1zZXQoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tMZW4sIDAsIAotCQkoQ0RBRGV2W2luZGV4XS5uVHJhY2tzICsgMSkgKiBzaXplb2YoRFdPUkQpKTsKLQltZW1zZXQoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3MsIDAsIAotCQkoQ0RBRGV2W2luZGV4XS5uVHJhY2tzICsgMSkgKiBzaXplb2YoRFdPUkQpKTsKLQlmb3IgKGkgPSAwOyBpIDw9IENEQURldltpbmRleF0ublRyYWNrczsgaSsrKSB7Ci0JCWlmIChpID09IENEQURldltpbmRleF0ublRyYWNrcykKKwltZW1zZXQoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuLCAwLCAKKwkJKENEQURldlt3RGV2SURdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOworCW1lbXNldChDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MsIDAsIAorCQkoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyArIDEpICogc2l6ZW9mKERXT1JEKSk7CisJZm9yIChpID0gMDsgaSA8PSBDREFEZXZbd0RldklEXS5uVHJhY2tzOyBpKyspIHsKKwkJaWYgKGkgPT0gQ0RBRGV2W3dEZXZJRF0ublRyYWNrcykKICNpZmRlZiBsaW51eAogCQkJZW50cnkuY2R0ZV90cmFjayA9IENEUk9NX0xFQURPVVQ7CiAjZWxpZiBfX0ZyZWVCU0RfXwpAQCAtMTc3LDcgKzE3NSw3IEBACiAJCWVudHJ5LmRhdGFfbGVuID0gc2l6ZW9mKHRvY19idWZmZXIpOwogCSAgICAgICAgZW50cnkuZGF0YSA9ICZ0b2NfYnVmZmVyOwogI2VuZGlmCi0JCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIAorCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCiAjaWZkZWYgbGludXgKIAkJCSAgQ0RST01SRUFEVE9DRU5UUlkKICNlbGlmIF9fRnJlZUJTRF9fCkBAIC0xOTksNyArMTk3LDcgQEAKICNlbmRpZgogCQlpZiAoaSA9PSAwKSB7CiAJCQlsYXN0X3N0YXJ0ID0gc3RhcnQ7Ci0JCQlDREFEZXZbaW5kZXhdLmR3Rmlyc3RPZmZzZXQgPSBzdGFydDsKKwkJCUNEQURldlt3RGV2SURdLmR3Rmlyc3RPZmZzZXQgPSBzdGFydDsKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCQkiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIGR3Rmlyc3RPZmZzZXQ9JXVcbiIsIAogCQkJCXN0YXJ0KTsKQEAgLTIwOSwxNyArMjA3LDE2IEBACiAJCQlsYXN0X3N0YXJ0ID0gc3RhcnQ7CiAJCQlzdGFydCA9IGxhc3Rfc3RhcnQgLSBsZW5ndGg7CiAJCQl0b3RhbF9sZW5ndGggKz0gbGVuZ3RoOwotCQkJQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tMZW5baSAtIDFdID0gbGVuZ3RoOwotCQkJQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3NbaSAtIDFdID0gc3RhcnQ7CisJCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW5baSAtIDFdID0gbGVuZ3RoOworCQkJQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW2kgLSAxXSA9IHN0YXJ0OwogICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyB0cmFjayAjJXUgc3RhcnQ9JXUgbGVuPSV1XG4iLAogCQkJCWksIHN0YXJ0LCBsZW5ndGgpOwogCQkJfQogCQl9Ci0JQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gdG90YWxfbGVuZ3RoOworCUNEQURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b3RhbF9sZW5ndGg7CiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyB0b3RhbF9sZW49JXVcbiIsIAogCQl0b3RhbF9sZW5ndGgpOwotCWZmbHVzaChzdGRvdXQpOwogCXJldHVybiBUUlVFOwogI2Vsc2UKIAlyZXR1cm4gRkFMU0U7CkBAIC0yMzMsNDYgKzIzMCw0MiBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXg7CiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAotCXdEZXZJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKLQlpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwotCi0JaWYgKENEQURldltpbmRleF0ublVzZUNvdW50ID4gMCkgeworCWlmIChDREFEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CiAJCS8qIFRoZSBkcml2ZXIgYWxyZWFkeSBvcGVuIG9uIHRoaXMgY2hhbm5lbCAqLwogCQkvKiBJZiB0aGUgZHJpdmVyIHdhcyBvcGVuZWQgc2hhcmVhYmxlIGJlZm9yZSBhbmQgdGhpcyBvcGVuIHNwZWNpZmllcyAqLwogCQkvKiBzaGFyZWFibGUgdGhlbiBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCAqLwotCQlpZiAoQ0RBRGV2W2luZGV4XS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKLQkJCSsrQ0RBRGV2W2luZGV4XS5uVXNlQ291bnQ7CisJCWlmIChDREFEZXZbd0RldklEXS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrQ0RBRGV2W3dEZXZJRF0ublVzZUNvdW50OwogCQllbHNlCiAJCQlyZXR1cm4gTUNJRVJSX01VU1RfVVNFX1NIQVJFQUJMRTsKIAkJfQogCWVsc2UgewotCQlDREFEZXZbaW5kZXhdLm5Vc2VDb3VudCA9IDE7Ci0JCUNEQURldltpbmRleF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CisJCUNEQURldlt3RGV2SURdLm5Vc2VDb3VudCA9IDE7CisJCUNEQURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9CiAgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CiAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpT3BlbiAvLyBNQ0lfT1BFTl9FTEVNRU5UICFcbiIpOwogLyoJCXJldHVybiBNQ0lFUlJfTk9fRUxFTUVOVF9BTExPV0VEOyAqLwogCQl9Ci0JbWVtY3B5KCZDREFEZXZbaW5kZXhdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7Ci0JQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7Ci0JQ0RBRGV2W2luZGV4XS51bml4ZGV2ID0gb3BlbiAoQ0RBVURJT19ERVYsIE9fUkRPTkxZLCAwKTsKLQlpZiAoQ0RBRGV2W2luZGV4XS51bml4ZGV2ID09IC0xKSB7CisJbWVtY3B5KCZDREFEZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOworCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKwlDREFEZXZbd0RldklEXS51bml4ZGV2ID0gb3BlbiAoQ0RBVURJT19ERVYsIE9fUkRPTkxZLCAwKTsKKwlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAtMSkgewogCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4gLy8gY2FuJ3Qgb3BlbiAnJXMnICFcbiIsIENEQVVESU9fREVWKTsKIAkJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAkJfQotCUNEQURldltpbmRleF0ubW9kZSA9IDA7Ci0JQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1RNU0Y7Ci0JQ0RBRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSAwOwotCUNEQURldltpbmRleF0ublRyYWNrcyA9IDA7Ci0JQ0RBRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gMDsKLQlDREFEZXZbaW5kZXhdLmR3Rmlyc3RPZmZzZXQgPSAwOwotCUNEQURldltpbmRleF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKLQlDREFEZXZbaW5kZXhdLmxwZHdUcmFja1BvcyA9IE5VTEw7CisJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IDA7CisJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9UTVNGOworCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IDA7CisJQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IDA7CisJQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IDA7CisJQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldCA9IDA7CisJQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuID0gTlVMTDsKKwlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPSBOVUxMOwogCWlmICghQ0RBVURJT19HZXRUcmFja3NJbmZvKHdEZXZJRCkpIHsKIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuIC8vIGVycm9yIHJlYWRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIC8qCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOyAqLwpAQCAtMjgyLDcgKzI3NSw3IEBACiAJCQkiQ0RBVURJT19tY2lPcGVuIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtMjk2LDEyICsyODksMTEgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaUNsb3NlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlpZiAoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tMZW4gIT0gTlVMTCkgZnJlZShDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlbik7Ci0JaWYgKENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zICE9IE5VTEwpIGZyZWUoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3MpOwotCWNsb3NlKENEQURldltpbmRleF0udW5peGRldik7CisJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbiAhPSBOVUxMKSBmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CisJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyAhPSBOVUxMKSBmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvcyk7CisJY2xvc2UoQ0RBRGV2W3dEZXZJRF0udW5peGRldik7CiAjZW5kaWYKICAgICAgICAgcmV0dXJuIDA7CiB9CkBAIC0zOTYsNyArMzg4LDYgQEAKIHsKIAlEV09SRAlkd0ZyYW1lID0gMDsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCVVJTlQxNgl3VHJhY2s7CiAgICAgCiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fQ2FsY0ZyYW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCkBAIC00MjksOCArNDIwLDggQEAKIAkJCQkJTUNJX1RNU0ZfU0VDT05EKGR3VGltZSksIE1DSV9UTVNGX0ZSQU1FKGR3VGltZSkpOwogICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJCSJDREFVRElPX0NhbGNGcmFtZSAvLyBUTVNGIHRyYWNrcG9zWyV1XT0lbHVcbiIsCi0JCQkJd1RyYWNrLCBDREFEZXZbaW5kZXhdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSk7Ci0JCQlkd0ZyYW1lID0gQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV07CisJCQkJd1RyYWNrLCBDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV0pOworCQkJZHdGcmFtZSA9IENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXTsKIAkJCWR3RnJhbWUgKz0gQ0RGUkFNRVNfUEVSTUlOICogTUNJX1RNU0ZfTUlOVVRFKGR3VGltZSk7CiAJCQlkd0ZyYW1lICs9IENERlJBTUVTX1BFUlNFQyAqIE1DSV9UTVNGX1NFQ09ORChkd1RpbWUpOwogCQkJZHdGcmFtZSArPSBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpOwpAQCAtNDQ3LDM1ICs0MzgsMzQgQEAKIHN0YXRpYyBCT09MMzIgQ0RBVURJT19HZXRDRFN0YXR1cyhVSU5UMTYgd0RldklEKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7Ci0JaW50CQlvbGRtb2RlID0gQ0RBRGV2W2luZGV4XS5tb2RlOworCWludAkJb2xkbW9kZSA9IENEQURldlt3RGV2SURdLm1vZGU7CiAjaWZkZWYgX19GcmVlQlNEX18KIAlzdHJ1Y3QgaW9jX3JlYWRfc3ViY2hhbm5lbAlyZWFkX3NjOwogCiAJcmVhZF9zYy5hZGRyZXNzX2Zvcm1hdCA9IENEX01TRl9GT1JNQVQ7CiAJcmVhZF9zYy5kYXRhX2Zvcm1hdCAgICA9IENEX0NVUlJFTlRfUE9TSVRJT047CiAJcmVhZF9zYy50cmFjayAgICAgICAgICA9IDA7Ci0JcmVhZF9zYy5kYXRhX2xlbiAgICAgICA9IHNpemVvZihDREFEZXZbaW5kZXhdLnNjKTsKLQlyZWFkX3NjLmRhdGEJICAgICAgID0gKHN0cnVjdCBjZF9zdWJfY2hhbm5lbF9pbmZvICopJkNEQURldltpbmRleF0uc2M7CisJcmVhZF9zYy5kYXRhX2xlbiAgICAgICA9IHNpemVvZihDREFEZXZbd0RldklEXS5zYyk7CisJcmVhZF9zYy5kYXRhCSAgICAgICA9IChzdHJ1Y3QgY2Rfc3ViX2NoYW5uZWxfaW5mbyAqKSZDREFEZXZbd0RldklEXS5zYzsKICNlbGlmIGxpbnV4Ci0JQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKKwlDREFEZXZbd0RldklEXS5zYy5jZHNjX2Zvcm1hdCA9IENEUk9NX01TRjsKICNlbmRpZgotCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCisJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKLQkJICBDRFJPTVNVQkNITkwsICZDREFEZXZbaW5kZXhdLnNjCisJCSAgQ0RST01TVUJDSE5MLCAmQ0RBRGV2W3dEZXZJRF0uc2MKICNlbGlmIF9fRnJlZUJTRF9fCiAJCSAgQ0RJT0NSRUFEU1VCQ0hBTk5FTCwgJnJlYWRfc2MKICNlbmRpZgogCQkgICkpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gb3BlbmVkIG9yIG5vX21lZGlhICFcbiIpOwotCQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CisJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CiAJCXJldHVybiBUUlVFOwogCQl9CiAJc3dpdGNoICgKICNpZmRlZiBsaW51eAotCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfYXVkaW9zdGF0dXMKKwkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hdWRpb3N0YXR1cwogI2VsaWYgX19GcmVlQlNEX18KLQkJQ0RBRGV2W2luZGV4XS5zYy5oZWFkZXIuYXVkaW9fc3RhdHVzCisJCUNEQURldlt3RGV2SURdLnNjLmhlYWRlci5hdWRpb19zdGF0dXMKICNlbmRpZgogCQkpIHsKICNpZmRlZiBsaW51eApAQCAtNDg1LDkgKzQ3NSw5IEBACiAjZW5kaWYKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHN0YXR1cywgcmV0dXJuaW5nIE5PVF9SRUFEWS5cbiIpOwogI2lmZGVmIGxpbnV4Ci0JCQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CisJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfTk9UX1JFQURZOwogI2VsaWYgX19GcmVlQlNEX18KLQkJCUNEQURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CisJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKICNlbmRpZgogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKQEAgLTQ5NSw3ICs0ODUsNyBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19OT19TVEFUVVM6CiAjZW5kaWYKLQkJCUNEQURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CisJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9TVE9QICFcbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKQEAgLTUwMyw3ICs0OTMsNyBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19QTEFZX0lOX1BST0dSRVNTOgogI2VuZGlmCi0JCQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9QTEFZOworCQkJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfUExBWSAhXG4iKTsKIAkJCWJyZWFrOwogI2lmZGVmIGxpbnV4CkBAIC01MTEsNDUgKzUwMSw0NSBAQAogI2VsaWYgX19GcmVlQlNEX18KIAkJY2FzZSBDRF9BU19QTEFZX1BBVVNFRDoKICNlbmRpZgotCQkJQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUEFVU0U7CisJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfUEFVU0UgIVxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBzdGF0dXM9JTAyWCAhXG4iLAogI2lmZGVmIGxpbnV4Ci0JCQkJCUNEQURldltpbmRleF0uc2MuY2RzY19hdWRpb3N0YXR1cworCQkJCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2F1ZGlvc3RhdHVzCiAjZWxpZiBfX0ZyZWVCU0RfXwotCQkJCQlDREFEZXZbaW5kZXhdLnNjLmhlYWRlci5hdWRpb19zdGF0dXMKKwkJCQkJQ0RBRGV2W3dEZXZJRF0uc2MuaGVhZGVyLmF1ZGlvX3N0YXR1cwogI2VuZGlmCiAJCQkJCSk7CiAJCX0KICNpZmRlZiBsaW51eAotCUNEQURldltpbmRleF0ubkN1clRyYWNrID0gQ0RBRGV2W2luZGV4XS5zYy5jZHNjX3RyazsKLQlDREFEZXZbaW5kZXhdLmR3Q3VyRnJhbWUgPSAKLQkJQ0RGUkFNRVNfUEVSTUlOICogQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSArCi0JCUNERlJBTUVTX1BFUlNFQyAqIENEQURldltpbmRleF0uc2MuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQgKwotCQlDREFEZXZbaW5kZXhdLnNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWU7CisJQ0RBRGV2W3dEZXZJRF0ubkN1clRyYWNrID0gQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY190cms7CisJQ0RBRGV2W3dEZXZJRF0uZHdDdXJGcmFtZSA9IAorCQlDREZSQU1FU19QRVJNSU4gKiBDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSArCisJCUNERlJBTUVTX1BFUlNFQyAqIENEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2Yuc2Vjb25kICsKKwkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hYnNhZGRyLm1zZi5mcmFtZTsKICNlbGlmIF9fRnJlZUJTRF9fCi0JQ0RBRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSBDREFEZXZbaW5kZXhdLnNjLndoYXQucG9zaXRpb24udHJhY2tfbnVtYmVyOwotCUNEQURldltpbmRleF0uZHdDdXJGcmFtZSA9IAotCQlDREZSQU1FU19QRVJNSU4gKiBDREFEZXZbaW5kZXhdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YubWludXRlICsKLQkJQ0RGUkFNRVNfUEVSU0VDICogQ0RBRGV2W2luZGV4XS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLnNlY29uZCArCi0JCUNEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZTsKKwlDREFEZXZbd0RldklEXS5uQ3VyVHJhY2sgPSBDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLnRyYWNrX251bWJlcjsKKwlDREFEZXZbd0RldklEXS5kd0N1ckZyYW1lID0gCisJCUNERlJBTUVTX1BFUk1JTiAqIENEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YubWludXRlICsKKwkJQ0RGUkFNRVNfUEVSU0VDICogQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQgKworCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lOwogI2VuZGlmCiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCiAjaWZkZWYgbGludXgKLQkJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX3RyaywKLQkJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwKLQkJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwKLQkJQ0RBRGV2W2luZGV4XS5zYy5jZHNjX2Fic2FkZHIubXNmLmZyYW1lCisJCUNEQURldlt3RGV2SURdLnNjLmNkc2NfdHJrLAorCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwKKwkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCisJCUNEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YuZnJhbWUKICNlbGlmIF9fRnJlZUJTRF9fCi0JCUNEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi50cmFja19udW1iZXIsCi0JCUNEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUsCi0JCUNEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCUNEQURldltpbmRleF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZQorCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLnRyYWNrX251bWJlciwKKwkJQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUsCisJCUNEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2Yuc2Vjb25kLAorCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lCiAjZW5kaWYKIAkJCSk7Ci0JaWYgKG9sZG1vZGUgIT0gQ0RBRGV2W2luZGV4XS5tb2RlICYmIG9sZG1vZGUgPT0gTUNJX01PREVfT1BFTikgeworCWlmIChvbGRtb2RlICE9IENEQURldlt3RGV2SURdLm1vZGUgJiYgb2xkbW9kZSA9PSBNQ0lfTU9ERV9PUEVOKSB7CiAJCWlmICghQ0RBVURJT19HZXRUcmFja3NJbmZvKHdEZXZJRCkpIHsKICAgICAgICAgICAgIGRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gZXJyb3IgdXBkYXRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC01NjksMTEgKzU1OSwxMSBAQAogewogCURXT1JECWR3VGltZSA9IDA7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlVSU5UMTYJd1RyYWNrOwogCVVJTlQxNgl3TWludXRlczsKIAlVSU5UMTYJd1NlY29uZHM7CiAJVUlOVDE2CXdGcmFtZXM7CisKICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19DYWxjVGltZSglMDRYLCAlMDhsWCwgJWx1KTtcbiIsIAogCQl3RGV2SUQsIGR3Rm9ybWF0VHlwZSwgZHdGcmFtZSk7CiAKQEAgLTU5NywxMSArNTg3LDExIEBACiAJCQkvKiB1bmtub3duIGZvcm1hdCAhIGZvcmNlIFRNU0YgISAuLi4gKi8KIAkJCWR3Rm9ybWF0VHlwZSA9IE1DSV9GT1JNQVRfVE1TRjsKIAkJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6Ci0JCQlmb3IgKHdUcmFjayA9IDA7IHdUcmFjayA8IENEQURldltpbmRleF0ublRyYWNrczsgd1RyYWNrKyspIHsKLS8qCQkJCWR3VGltZSArPSBDREFEZXZbaW5kZXhdLmxwZHdUcmFja0xlblt3VHJhY2sgLSAxXTsKKwkJCWZvciAod1RyYWNrID0gMDsgd1RyYWNrIDwgQ0RBRGV2W3dEZXZJRF0ublRyYWNrczsgd1RyYWNrKyspIHsKKy8qCQkJCWR3VGltZSArPSBDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW5bd1RyYWNrIC0gMV07CiAJCQkJcHJpbnRmKCJBZGRpbmcgdHJrIyV1IGN1cnBvcz0ldSBcbiIsIGR3VGltZSk7CiAJCQkJaWYgKGR3VGltZSA+PSBkd0ZyYW1lKSBicmVhazsgKi8KLQkJCQlpZiAoQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV0gPj0gZHdGcmFtZSkgYnJlYWs7CisJCQkJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSA+PSBkd0ZyYW1lKSBicmVhazsKIAkJCQl9CiAJCQl3TWludXRlcyA9IGR3RnJhbWUgLyBDREZSQU1FU19QRVJNSU47CiAJCQl3U2Vjb25kcyA9IChkd0ZyYW1lIC0gQ0RGUkFNRVNfUEVSTUlOICogd01pbnV0ZXMpIC8gQ0RGUkFNRVNfUEVSU0VDOwpAQCAtNjI0LDI3ICs2MTQsMjYgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoQ0RBRGV2W2luZGV4XS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworCWlmIChDREFEZXZbd0RldklEXS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX0lURU0pIHsKIAkJc3dpdGNoKGxwUGFybXMtPmR3SXRlbSkgewogCQkJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CiAJCQkJaWYgKCFDREFVRElPX0dldENEU3RhdHVzKHdEZXZJRCkpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbaW5kZXhdLm5DdXJUcmFjazsKKwkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLm5DdXJUcmFjazsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIENVUlJFTlRfVFJBQ0s9JWx1IVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6Ci0JCQkJaWYgKENEQURldltpbmRleF0ublRyYWNrcyA9PSAwKSB7CisJCQkJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgewogCQkJCQlpZiAoIUNEQVVESU9fR2V0VHJhY2tzSW5mbyh3RGV2SUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBlcnJvciByZWFkaW5nIFRyYWNrc0luZm8gIVxuIik7CiAJCQkJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNjUzLDI0ICs2NDIsMjQgQEAKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewogCQkJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJbHBQYXJtcy0+ZHdUcmFjayk7Ci0JCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W2luZGV4XS5uVHJhY2tzKQorCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IENEQURldlt3RGV2SURdLm5UcmFja3MpCiAJCQkJCQlyZXR1cm4gTUNJRVJSX09VVE9GUkFOR0U7Ci0JCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5scGR3VHJhY2tMZW5bbHBQYXJtcy0+ZHdUcmFja107CisJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuW2xwUGFybXMtPmR3VHJhY2tdOwogCQkJCQl9CiAJCQkJZWxzZQotCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0uZHdUb3RhbExlbjsKKwkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5kd1RvdGFsTGVuOwogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBVURJT19DYWxjVGltZSh3RGV2SUQsIAotCQkJCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOworCQkJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIExFTkdUSD0lbHUgIVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19NT0RFOgogCQkJCWlmICghQ0RBVURJT19HZXRDRFN0YXR1cyh3RGV2SUQpKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5tb2RlOworCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0ubW9kZTsKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTU9ERT0lMDhsWCAhXG4iLAogCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UOgotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gKENEQURldltpbmRleF0ublRyYWNrcyA+IDApID8gVFJVRSA6IEZBTFNFOworCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gKENEQURldlt3RGV2SURdLm5UcmFja3MgPiAwKSA/IFRSVUUgOiBGQUxTRTsKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1FRElBX05PVF9QUkVTRU5UICFcbiIpOwogCQkJCWVsc2UKQEAgLTY4NCwxOSArNjczLDE5IEBACiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1BPU0lUSU9OOgogCQkJCWlmICghQ0RBVURJT19HZXRDRFN0YXR1cyh3RGV2SUQpKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5kd0N1ckZyYW1lOworCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdDdXJGcmFtZTsKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpIHsKLQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbaW5kZXhdLmR3Rmlyc3RPZmZzZXQ7CisJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IENEQURldltpbmRleF0ublRyYWNrcykKKwkJCQkJaWYgKGxwUGFybXMtPmR3VHJhY2sgPiBDREFEZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwotCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldltpbmRleF0ubHBkd1RyYWNrUG9zW2xwUGFybXMtPmR3VHJhY2sgLSAxXTsKKwkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwogICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQVVESU9fQ2FsY1RpbWUod0RldklELAotCQkJCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOworCQkJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CkBAIC03MDYsNyArNjk1LDcgQEAKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6CiAgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOwotCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W2luZGV4XS5kd1RpbWVGb3JtYXQ7CisJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQ7CiAJCQkgCXJldHVybiAwOwogCQkJZGVmYXVsdDoKICAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIHVua25vd24gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwpAQCAtNzI3LDM0ICs3MTYsMzQgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50IAlzdGFydCwgZW5kOwogI2lmZGVmIGxpbnV4CiAJc3RydWN0IAljZHJvbV9tc2YJbXNmOwogI2VsaWYgX19GcmVlQlNEX18KIAlzdHJ1Y3QJaW9jX3BsYXlfbXNmCW1zZjsKICNlbmRpZgorCiAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoQ0RBRGV2W2luZGV4XS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCXN0YXJ0ID0gMDsgCQllbmQgPSBDREFEZXZbaW5kZXhdLmR3VG90YWxMZW47Ci0JQ0RBRGV2W2luZGV4XS5uQ3VyVHJhY2sgPSAxOworCWlmIChDREFEZXZbd0RldklEXS51bml4ZGV2ID09IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOworCXN0YXJ0ID0gMDsgCQllbmQgPSBDREFEZXZbd0RldklEXS5kd1RvdGFsTGVuOworCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IDE7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkgewogCQlzdGFydCA9IENEQVVESU9fQ2FsY0ZyYW1lKHdEZXZJRCwgCi0JCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdGcm9tKTsgCisJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAogICAgICAgICBkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBsYXkgLy8gTUNJX0ZST009JTA4bFggLT4gJXUgXG4iLAogCQkJCWxwUGFybXMtPmR3RnJvbSwgc3RhcnQpOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKIAkJZW5kID0gQ0RBVURJT19DYWxjRnJhbWUod0RldklELCAKLQkJCUNEQURldltpbmRleF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKKwkJCUNEQURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdUbyk7CiAgICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJIkNEQVVESU9fbWNpUGxheSAvLyBNQ0lfVE89JTA4bFggLT4gJXUgXG4iLAogCQkJbHBQYXJtcy0+ZHdUbywgZW5kKTsKIAkJfQotCXN0YXJ0ICs9IENEQURldltpbmRleF0uZHdGaXJzdE9mZnNldDsJCi0JZW5kICs9IENEQURldltpbmRleF0uZHdGaXJzdE9mZnNldDsKKwlzdGFydCArPSBDREFEZXZbd0RldklEXS5kd0ZpcnN0T2Zmc2V0OwkKKwllbmQgKz0gQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldDsKICNpZmRlZiBsaW51eAogCW1zZi5jZG1zZl9taW4wID0gc3RhcnQgLyBDREZSQU1FU19QRVJNSU47CiAJbXNmLmNkbXNmX3NlYzAgPSAoc3RhcnQgJSBDREZSQU1FU19QRVJNSU4pIC8gQ0RGUkFNRVNfUEVSU0VDOwpAQCAtNzcwLDcgKzc1OSw3IEBACiAgICAgICAgIG1zZi5lbmRfcyAgICAgICA9IChlbmQgJSBDREZSQU1FU19QRVJNSU4pIC8gQ0RGUkFNRVNfUEVSU0VDOwogICAgICAgICBtc2YuZW5kX2YgICAgICAgPSBlbmQgJSBDREZSQU1FU19QRVJTRUM7CiAjZW5kaWYKLQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LAorCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LAogI2lmZGVmIGxpbnV4CiAJCSAgQ0RST01TVEFSVAogI2VsaWYgX19GcmVlQlNEX18KQEAgLTc4MCw3ICs3NjksNyBAQAogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQbGF5IC8vIG1vdG9yIGRvZXNuJ3Qgc3RhcnQgIVxuIik7CiAJCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCX0KLQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LCAKKwlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVBMQVlNU0YKICNlbGlmIF9fRnJlZUJTRF9fCkBAIC03OTksMTQgKzc4OCwxNCBAQAogCQltc2YuZW5kX20sICAgbXNmLmVuZF9zLCAgIG1zZi5lbmRfZgogI2VuZGlmCiAJCQkpOwotCUNEQURldltpbmRleF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CisJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CiAgICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJIkNEQVVESU9fbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIC8qCiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCi0JCQlDREFEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICovCiAJCX0KIAlyZXR1cm4gMDsKQEAgLTgyMSwyNCArODEwLDIzIEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0b3AoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwKKwlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwKICNpZmRlZiBsaW51eAogCQkgIENEUk9NU1RPUAogI2VsaWYgX19GcmVlQlNEX18KIAkJICBDRElPQ1NUT1AKICNlbmRpZgogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfU1RPUDsKKwlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lTdG9wIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtODUyLDI0ICs4NDAsMjMgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBhdXNlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsCisJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVBBVVNFCiAjZWxpZiBfX0ZyZWVCU0RfXwogCQkgIENESU9DUEFVU0UKICNlbmRpZgogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JQ0RBRGV2W2luZGV4XS5tb2RlID0gTUNJX01PREVfUEFVU0U7CisJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BBVVNFOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICBkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkiQ0RBVURJT19tY2lQYXVzZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC04ODMsMjQgKzg3MCwyMyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVJlc3VtZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LCAKKwlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgCiAjaWZkZWYgbGludXgKIAkJICBDRFJPTVJFU1VNRQogI2VsaWYgX19GcmVlQlNEX18KIAkJICBDRElPQ1JFU1VNRQogI2VuZGlmCiAJCSAgKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKLQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOworCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVJlc3VtZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCUNEQURldltpbmRleF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOworCQkJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtOTE0LDEzICs5MDAsMTIgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaVNlZWsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJZHdSZXQ7CiAJTUNJX1BMQVlfUEFSTVMgUGxheVBhcm1zOwogICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVNlZWsoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwKKwlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwKICNpZmRlZiBsaW51eAogCQkgIENEUk9NUkVTVU1FCiAjZWxpZiBfX0ZyZWVCU0RfXwpAQCAtOTMwLDEzICs5MTUsMTMgQEAKIAkJcGVycm9yKCJpb2N0bCBDRFJPTVJFU1VNRSIpOwogCQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCX0KLQlDREFEZXZbaW5kZXhdLm1vZGUgPSBNQ0lfTU9ERV9TRUVLOworCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TRUVLOwogCXN3aXRjaChkd0ZsYWdzKSB7CiAJCWNhc2UgTUNJX1NFRUtfVE9fU1RBUlQ6CiAJCQlQbGF5UGFybXMuZHdGcm9tID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TRUVLX1RPX0VORDoKLQkJCVBsYXlQYXJtcy5kd0Zyb20gPSBDREFEZXZbaW5kZXhdLmR3VG90YWxMZW47CisJCQlQbGF5UGFybXMuZHdGcm9tID0gQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9UTzoKIAkJCVBsYXlQYXJtcy5kd0Zyb20gPSBscFBhcm1zLT5kd1RvOwpAQCAtOTUwLDcgKzkzNSw3IEBACiAJCQkiQ0RBVURJT19tY2lTZWVrIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gZHdSZXQ7CiAjZWxzZQpAQCAtOTY1LDcgKzk1MCw2IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZXQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC05ODksMzIgKzk3MywzMiBAQAogICAgICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwogCQkJCXJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwogCQkJfQotCQlDREFEZXZbaW5kZXhdLmR3VGltZUZvcm1hdCA9IGxwUGFybXMtPmR3VGltZUZvcm1hdDsKKwkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0ID0gbHBQYXJtcy0+ZHdUaW1lRm9ybWF0OwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfT1BFTikgewogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVNldCAvLyBNQ0lfU0VUX0RPT1JfT1BFTiAhXG4iKTsKICNpZmRlZiBfX0ZyZWVCU0RfXwotCQlpZiAoaW9jdGwoQ0RBRGV2W2luZGV4XS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKLQkJaWYgKGlvY3RsKENEQURldltpbmRleF0udW5peGRldiwgQ0RJT0NFSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0JCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DUFJFVkVOVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CisJCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKKwkJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DRUpFQ1QpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NQUkVWRU5UKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKICNlbGlmIGxpbnV4Ci0JCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENEUk9NRUpFQ1QpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RST01FSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAjZW5kaWYKLQkJQ0RBRGV2W2luZGV4XS5uVHJhY2tzID0gMDsKKwkJQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA9IDA7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHsKICAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX1NFVF9ET09SX0NMT1NFRCAhXG4iKTsKICNpZmRlZiBfX0ZyZWVCU0RfXwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DQ0xPU0UpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENESU9DUFJFVkVOVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CisgICAgICAgICAgICAgICAgaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ0NMT1NFKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKKyAgICAgICAgICAgICAgICBpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RJT0NQUkVWRU5UKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKICNlbGlmIGxpbnV4Ci0JCWlmIChpb2N0bChDREFEZXZbaW5kZXhdLnVuaXhkZXYsIENEUk9NRUpFQ1QpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOworCQlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwgQ0RST01FSkVDVCkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCQkgIC8qIFhYWCBzaG91bGQgaXQgYmUgIiwxIiA/Pz8gKi8KICNlbmRpZgotCQlDREFEZXZbaW5kZXhdLm5UcmFja3MgPSAwOworCQlDREFEZXZbd0RldklEXS5uVHJhY2tzID0gMDsKIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9WSURFTykgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfT04pIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CkBAIC0xMDI0LDcgKzEwMDgsNyBAQAogCQkJIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAotCQkJQ0RBRGV2W2luZGV4XS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CisJCQlDREFEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwppbmRleCBmNjE2NzljLi40MjlmMmIyIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jCisrKyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKQEAgLTMxMSw2ICszMTEsNyBAQAogCWlmIChzIT1OVUxMKSB7CiAJCSpzKys9J1wwJzsKIAkJcFUtPm9wZW5QYXJhbXMubHBzdHJFbGVtZW50TmFtZT1TRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVAocykpOworCQlkd0ZsYWdzIHw9IE1DSV9PUEVOX0VMRU1FTlQ7CiAJfQogCWlmICghU1RSQ01QKGRldiwiY2RhdWRpbyIpKSB7CiAJCXVEZXZUeXA9TUNJX0RFVlRZUEVfQ0RfQVVESU87CkBAIC0zMzgsNyArMzM5LDcgQEAKIAkJfQogCX0KIAlHZXREcnYod0RldklEKS0+d1R5cGUJCT0gdURldlR5cDsKLQlHZXREcnYod0RldklEKS0+d0RldmljZUlECT0gd0RldklEOworCUdldERydih3RGV2SUQpLT53RGV2aWNlSUQJPSAwOyAgLyogRklYTUU/IGZvciBtdWx0aXBsZSBkZXZpY2VzICovCiAJcFUtPm9wZW5QYXJhbXMuZHdDYWxsYmFjawk9IDA7CiAJcFUtPm9wZW5QYXJhbXMud0RldmljZUlECT0gd0RldklEOwogCXBVLT5vdmx5b3BlblBhcmFtcy5kd1N0eWxlCT0gMDsgCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21pZGkuYyBiL211bHRpbWVkaWEvbWlkaS5jCmluZGV4IDdhNTJmODcuLmE0NDQ2ZTMgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWlkaS5jCisrKyBiL211bHRpbWVkaWEvbWlkaS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKQEAgLTI0LDggKzI1LDYgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgogI2VuZGlmCiAKLWludCBNTVNZU1RFTV9EZXZJRFRvSW5kZXgoVUlOVDE2KTsKLQogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAjZGVmaW5lIE1JRElfREVWICIvZGV2L3NlcXVlbmNlciIKIApAQCAtMzUsOSArMzQsOSBAQAogI2RlZmluZSBJT0NUTChhLGIsYykJCShjID0gaW9jdGwoYSxiLGMpICkKICNlbmRpZgogCi0jZGVmaW5lIE1BWF9NSURJSU5EUlYgCTIKLSNkZWZpbmUgTUFYX01JRElPVVREUlYgCTIKLSNkZWZpbmUgTUFYX01DSU1JRElEUlYgCTIKKyNkZWZpbmUgTUFYX01JRElJTkRSViAJKDEpCisjZGVmaW5lIE1BWF9NSURJT1VURFJWIAkoMSkKKyNkZWZpbmUgTUFYX01DSU1JRElEUlYgCSgxKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAJaW50CQkJCXVuaXhkZXY7CkBAIC03MSw3ICs3MCw4IEBACiAJV09SRAluVHJhY2tzOwogCVdPUkQJblRlbXBvOwogCU1DSV9PUEVOX1BBUk1TIG9wZW5QYXJtczsKLQlNSURJSERSCQlNaWRpSGRyOworLyogCU1JRElIRFIJCU1pZGlIZHI7ICovCisJSExPQ0FMMTYgICAgICAgIGhNaWRpSGRyOwogCVdPUkQJCWR3U3RhdHVzOwogCX0gTElOVVhfTUNJTUlESTsKIApAQCAtODgsMTEgKzg4LDEwIEBACiAJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7Ci0JaWYgKE1pZGlJbkRldltpbmRleF0ud0ZsYWdzICE9IERDQl9OVUxMICYmICFEcml2ZXJDYWxsYmFjaygKLQkJTWlkaUluRGV2W2luZGV4XS5taWRpRGVzYy5kd0NhbGxiYWNrLCBNaWRpSW5EZXZbaW5kZXhdLndGbGFncywgCi0JCU1pZGlJbkRldltpbmRleF0ubWlkaURlc2MuaE1pZGksIHdNc2csIAotCQlNaWRpSW5EZXZbaW5kZXhdLm1pZGlEZXNjLmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMikpIHsKKwlpZiAoTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzICE9IERDQl9OVUxMICYmICFEcml2ZXJDYWxsYmFjaygKKwkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuZHdDYWxsYmFjaywgTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzLCAKKwkJTWlkaUluRGV2W3dEZXZJRF0ubWlkaURlc2MuaE1pZGksIHdNc2csIAorCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIAkJfQpAQCAtMTA4LDEwICsxMDcsOSBAQAogKi8KIHN0YXRpYyBEV09SRCBNSURJX1JlYWRCeXRlKFVJTlQxNiB3RGV2SUQsIEJZVEUgKmxwYnl0KQogewotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaWYgKGxwYnl0ICE9IE5VTEwpIHsKLQkJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCAoSFBTVFIpbHBieXQsCisJCWlmIChtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUilscGJ5dCwKIAkJCShsb25nKSBzaXplb2YoQllURSkpID09IChsb25nKSBzaXplb2YoQllURSkpIHsKIAkJCXJldHVybiAwOwogCQkJfQpAQCAtMTk3LDM0ICsxOTUsMzMgQEAKIHN0YXRpYyBEV09SRCBNSURJX1JlYWRNVGhkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3T2Zmc2V0KQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTVRoZCglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3T2Zmc2V0KTsKLQlpZiAobW1pb1NlZWsoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKKwlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVGhkIC8vIGNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOwogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKKwlpZiAobW1pb1JlYWQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKIAkJKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpIHsKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQogCWlmIChNSURJX1JlYWRMb25nKHdEZXZJRCwgJnRvYmVyZWFkKSAhPSAwKSB7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KLQlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W2luZGV4XS53Rm9ybWF0KSAhPSAwKSB7CisJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLndGb3JtYXQpICE9IDApIHsKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQotCWlmIChNSURJX1JlYWRXb3JkKHdEZXZJRCwgJk1DSU1pZGlEZXZbaW5kZXhdLm5UcmFja3MpICE9IDApIHsKKwlpZiAoTUlESV9SZWFkV29yZCh3RGV2SUQsICZNQ0lNaWRpRGV2W3dEZXZJRF0ublRyYWNrcykgIT0gMCkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldltpbmRleF0ublRlbXBvKSAhPSAwKSB7CisJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLm5UZW1wbykgIT0gMCkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZE1UaGQgLy8gdG9iZXJlYWQ9JTA4bFgsIHdGb3JtYXQ9JTA0WCBuVHJhY2tzPSUwNFggblRlbXBvPSUwNFhcbiIsCi0JCXRvYmVyZWFkLCBNQ0lNaWRpRGV2W2luZGV4XS53Rm9ybWF0LAotCQlNQ0lNaWRpRGV2W2luZGV4XS5uVHJhY2tzLAotCQlNQ0lNaWRpRGV2W2luZGV4XS5uVGVtcG8pOworCQl0b2JlcmVhZCwgTUNJTWlkaURldlt3RGV2SURdLndGb3JtYXQsCisJCU1DSU1pZGlEZXZbd0RldklEXS5uVHJhY2tzLAorCQlNQ0lNaWRpRGV2W3dEZXZJRF0ublRlbXBvKTsKIAl0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOwogLyoKIAkJbnRya3MgPSByZWFkMTZiaXQgKCk7CkBAIC0yNDEsMTMgKzIzOCwxMiBAQAogc3RhdGljIERXT1JEIE1JRElfUmVhZE1UcmsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdPZmZzZXQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlEV09SRAl0b2JlcmVhZDsKIAlGT1VSQ0MJZm91cmNjOwotCWlmIChtbWlvU2VlayhNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgeworCWlmIChtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZE1UcmsgLy8gY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCX0KLQlpZiAobW1pb1JlYWQoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAorCWlmIChtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAogCQkobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CkBAIC0yNTYsNyArMjUyLDcgQEAKIAkJfQogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVHJrIC8vIHRvYmVyZWFkPSUwOGxYXG4iLCB0b2JlcmVhZCk7CiAJdG9iZXJlYWQgLT0gMyAqIHNpemVvZihXT1JEKTsKLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1RvdGFsTGVuID0gdG9iZXJlYWQ7CisJTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b2JlcmVhZDsKIAlyZXR1cm4gMDsKICNlbHNlCiAgICAgICAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTI3MCw3ICsyNjYsNiBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpT3BlbihVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXg7CiAJTUlESU9QRU5ERVNDIAlNaWRpRGVzYzsKIAlEV09SRAkJZHdSZXQ7CiAJRFdPUkQJCWR3T2Zmc2V0OwpAQCAtMjgwLDI0ICsyNzUsMjIgQEAKIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuKCUwOGxYLCAlcClcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAKLQl3RGV2SUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7Ci0JaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKLQotCWlmIChNQ0lNaWRpRGV2W2luZGV4XS5uVXNlQ291bnQgPiAwKSB7CisJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CiAJCS8qIFRoZSBkcml2ZXIgYWxyZWFkeSBvcGVuIG9uIHRoaXMgY2hhbm5lbCAqLwogCQkvKiBJZiB0aGUgZHJpdmVyIHdhcyBvcGVuZWQgc2hhcmVhYmxlIGJlZm9yZSBhbmQgdGhpcyBvcGVuIHNwZWNpZmllcyAqLwogCQkvKiBzaGFyZWFibGUgdGhlbiBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudCAqLwotCQlpZiAoTUNJTWlkaURldltpbmRleF0uZlNoYXJlYWJsZSAmJiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkpCi0JCQkrK01DSU1pZGlEZXZbaW5kZXhdLm5Vc2VDb3VudDsKKwkJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5mU2hhcmVhYmxlICYmIChkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFKSkKKwkJCSsrTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudDsKIAkJZWxzZQogCQkJcmV0dXJuIE1DSUVSUl9NVVNUX1VTRV9TSEFSRUFCTEU7CiAJCX0KIAllbHNlIHsKLQkJTUNJTWlkaURldltpbmRleF0ublVzZUNvdW50ID0gMTsKLQkJTUNJTWlkaURldltpbmRleF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CisJCU1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPSAxOworCQlNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CisJCU1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoTUlESUhEUikpOwogCQl9CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKLQlscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7CisvKglscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7Ki8KIAlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7CkBAIC0zMDYsMjYgKzI5OSwyNiBAQAogCQlpZiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CiAJCQlDaGFyVXBwZXIzMkEoc3RyKTsKLQkJCU1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKKwkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IG1taW9PcGVuKHN0ciwgTlVMTCwgCiAJCQkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRFdSSVRFIHwgTU1JT19FWENMVVNJVkUpOwotCQkJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID09IDApIHsKKwkJCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewogCQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKIAkJCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogCQkJCX0KIAkJCX0KIAkJZWxzZSAKLQkJCU1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlID0gMDsKKwkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IDA7CiAJCX0KLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGhGaWxlPSV1XG4iLCBNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSk7Ci0JbWVtY3B5KCZNQ0lNaWRpRGV2W2luZGV4XS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOwotCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7Ci0JTUNJTWlkaURldltpbmRleF0uZHdCZWdpbkRhdGEgPSAwOwotCU1DSU1pZGlEZXZbaW5kZXhdLmR3VG90YWxMZW4gPSAwOworCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gaEZpbGU9JXVcbiIsIE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSk7CisJbWVtY3B5KCZNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMpKTsKKwlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOworCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CisJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gMDsKKwlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IDA7CiAJTWlkaURlc2MuaE1pZGkgPSAwOwotCWlmIChNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSAhPSAwKSB7CisJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7CiAJCU1NQ0tJTkZPCWNrTWFpblJJRkY7Ci0JCWlmIChtbWlvRGVzY2VuZChNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKKwkJaWYgKG1taW9EZXNjZW5kKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIk1JRElfbWNpT3BlbiAvLyBQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCkBAIC0zNDQsMTkgKzMzNywxOSBAQAogCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBjYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9Ci0JCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKKwkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKIAkJaWYgKE1JRElfUmVhZE1Ucmsod0RldklELCBkd09mZnNldCkgIT0gMCkgewogCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBjYW4ndCByZWFkICdNVHJrJyBoZWFkZXIgXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQl9Ci0JCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldltpbmRleF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKLQkJTUNJTWlkaURldltpbmRleF0uZHdCZWdpbkRhdGEgPSBkd09mZnNldDsKKwkJZHdPZmZzZXQgPSBtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKKwkJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gZHdPZmZzZXQ7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJCShMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwKIAkJCQlja01haW5SSUZGLmNrc2l6ZSk7CiAJCX0KIAlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOwotCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZNaWRpRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisvKglkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOyAqLwogCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTM3MCwxMiArMzYzLDExIEBACiBzdGF0aWMgRFdPUkQgTUlESV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0b3AoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RvcCAvLyBNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cz0lcCAlZFxuIiwKLQkJCSZNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cywgTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMpOworCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RvcCAvLyBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwogCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtMzg5LDI0ICszODEsMjcgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCURXT1JECQlkd1JldDsKKwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUNsb3NlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwotCWlmIChNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CisJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CiAJCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCBscFBhcm1zKTsKIAkJfQotCU1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKLQlNQ0lNaWRpRGV2W2luZGV4XS5uVXNlQ291bnQtLTsKLQlpZiAoTUNJTWlkaURldltpbmRleF0ublVzZUNvdW50ID09IDApIHsKLQkJaWYgKE1DSU1pZGlEZXZbaW5kZXhdLmhGaWxlICE9IDApIHsKLQkJCW1taW9DbG9zZShNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgMCk7Ci0JCQlNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSA9IDA7CisJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKKwlNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50LS07CisJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgeworCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlICE9IDApIHsKKwkJCW1taW9DbG9zZShNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDApOworCQkJTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID0gMDsKIAkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUNsb3NlIC8vIGhGaWxlIGNsb3NlZCAhXG4iKTsKIAkJCX0KKwkJVVNFUl9IRUFQX0ZSRUUoTUNJTWlkaURldlt3RGV2SURdLmhNaWRpSGRyKTsKIAkJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9DTE9TRSwgMCwgMEwsIDBMKTsKIAkJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisvKgogCQlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX0NMT1NFLCAwLCAwTCwgMEwpOwogCQlpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKyovCiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC00MjEsMTcgKzQxNiwxOCBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpUGxheShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCQljb3VudDsKIAlpbnQJCQlzdGFydCwgZW5kOwogCUxQTUlESUhEUglscE1pZGlIZHI7CisJRFdPUkQgICAgICAgICAgIGxwMTZNaWRpSGRyOwogCURXT1JECQlkd0RhdGE7CiAJTFBXT1JECQlwdHI7CiAJRFdPUkQJCWR3UmV0OworCiAJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldltpbmRleF0uaEZpbGUgPT0gMCkgeworCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsIAotCQkJCU1DSU1pZGlEZXZbaW5kZXhdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKKwkJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwogCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogCQl9CiAJc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OwpAQCAtNDU5LDUxICs0NTUsODAgQEAKIAkJCX0KIAkJfQogI2VuZGlmCi0JbHBNaWRpSGRyID0gJk1DSU1pZGlEZXZbaW5kZXhdLk1pZGlIZHI7CisKKwlscE1pZGlIZHIgPSBVU0VSX0hFQVBfTElOX0FERFIoTUNJTWlkaURldlt3RGV2SURdLmhNaWRpSGRyKTsKKwlscDE2TWlkaUhkciA9IFVTRVJfSEVBUF9TRUdfQUREUihNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOworCiAJbHBNaWRpSGRyLT5scERhdGEgPSAoTFBTVFIpIG1hbGxvYygxMjAwKTsKIAlpZiAobHBNaWRpSGRyLT5scERhdGEgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKIAlscE1pZGlIZHItPmR3VXNlciA9IDBMOwogCWxwTWlkaUhkci0+ZHdGbGFncyA9IDBMOwotCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKwlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX1BSRVBBUkUsIDAsIChEV09SRClscDE2TWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKwogLyoJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBhZnRlciBNT0RNX1BSRVBBUkUgXG4iKTsgKi8KLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7Ci0Jd2hpbGUoTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIE1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzPSVwICVkXG4iLAotCQkJJk1DSU1pZGlEZXZbaW5kZXhdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyk7CisKKwlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOworCXdoaWxlKE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CisJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAorCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKKwogCQlwdHIgPSAoTFBXT1JEKWxwTWlkaUhkci0+bHBEYXRhOwogCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoOyBjb3VudCsrKSB7CiAJCQlpZiAoTUlESV9SZWFkVmFyeUxlbih3RGV2SUQsICZkd0RhdGEpICE9IDApIGJyZWFrOwogCQkJKnB0ciA9IExPV09SRChkd0RhdGEpOwogCQkJfQogLyoKLQkJY291bnQgPSBtbWlvUmVhZChNQ0lNaWRpRGV2W2luZGV4XS5oRmlsZSwgbHBNaWRpSGRyLT5scERhdGEsIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGgpOworCQljb3VudCA9IG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgbHBNaWRpSGRyLT5scERhdGEsIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGgpOwogKi8KKwkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOworCiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwogCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OwogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIGJlZm9yZSBNT0RNX0xPTkdEQVRBIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAogCQkJCQlscE1pZGlIZHIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLQkJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9MT05HREFUQSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKwkJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9MT05HREFUQSwgMCwgKERXT1JEKWxwMTZNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOworCQlpZiAoZHdSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikgeworCQkgIHN3aXRjaCAoZHdSZXQpIHsKKwkJICBjYXNlIE1NU1lTRVJSX05PVEVOQUJMRUQ6CisJCSAgICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfUkVBRFk7CisJCSAgICAKKwkJICBjYXNlIE1JRElFUlJfTk9ERVZJQ0U6CisJCSAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOworCisJCSAgY2FzZSBNSURJRVJSX1VOUFJFUEFSRUQ6CisJCSAgICByZXR1cm4gTUNJRVJSX0RSSVZFUl9JTlRFUk5BTDsKKworCQkgIGNhc2UgTUlESUVSUl9TVElMTFBMQVlJTkc6CisJCSAgICByZXR1cm4gTUNJRVJSX1NFUV9QT1JUX0lOVVNFOworCisJCSAgY2FzZSBNTVNZU0VSUl9JTlZBTFBBUkFNOgorCQkgICAgcmV0dXJuIE1DSUVSUl9DQU5OT1RfTE9BRF9EUklWRVI7CisJCSAgCisJCSAgZGVmYXVsdDoKKwkJICAgIHJldHVybiBNQ0lFUlJfRFJJVkVSOworCQkgIH0JCiAJCX0KLQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKKwkgICAgICB9CisJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2TWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKIAlpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgewogCQlmcmVlKGxwTWlkaUhkci0+bHBEYXRhKTsKIAkJbHBNaWRpSGRyLT5scERhdGEgPSBOVUxMOwotCQl9Ci0JTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOworCSAgICAgIH0KKwlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAjaWYgMAogCQlleGl0KDEpOwogI2VuZGlmCi0JCX0KKwkgICAgICB9CiAJcmV0dXJuIDA7CiAjZWxzZQogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogI2VuZGlmCi19CisgICAgICB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MTIsMTUgKzUzNywxNCBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50CQkJc3RhcnQsIGVuZDsKIAlMUE1JRElIRFIJbHBNaWRpSGRyOwogCURXT1JECQlkd1JldDsKIAogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKLQlpZiAoTUNJTWlkaURldltpbmRleF0uaEZpbGUgPT0gMCkgeworCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCi0JCQkJTUNJTWlkaURldltpbmRleF0ub3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOworCQkJCU1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCX0KIAlzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CkBAIC01MzIsMTcgKzU1NiwxNyBAQAogCQllbmQgPSBscFBhcm1zLT5kd1RvOwogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKIAkJfQotCWxwTWlkaUhkciA9ICZNQ0lNaWRpRGV2W2luZGV4XS5NaWRpSGRyOworCWxwTWlkaUhkciA9IFVTRVJfSEVBUF9MSU5fQUREUihNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOwogCWxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOwogCWxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGggPSAxMDI0OwogCWxwTWlkaUhkci0+ZHdVc2VyID0gMEw7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CiAJZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBhZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1JFQ09SRDsKLQl3aGlsZShNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cz0lcCAlZFxuIiwKLQkJCSZNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cywgTUNJTWlkaURldltpbmRleF0uZHdTdGF0dXMpOworCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1JFQ09SRDsKKwl3aGlsZShNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgeworCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAorCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKIAkJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwogCQlkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1NUQVJULCAwLCAwTCwgMEwpOwogCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gYWZ0ZXIgTUlETV9TVEFSVCBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKQEAgLTU1NiwxMSArNTgwLDExIEBACiAJCWZyZWUobHBNaWRpSGRyLT5scERhdGEpOwogCQlscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CiAJCX0KLQlNQ0lNaWRpRGV2W2luZGV4XS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CisJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVjb3JkIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC02NzEsNyArNjk1LDYgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0YXR1cyglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CkBAIC03NDYsNyArNzY5LDcgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKLQkJCU1DSU1pZGlEZXZbaW5kZXhdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKwkJCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KICAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtODUwLDcgKzg3Myw2IEBACiBzdGF0aWMgRFdPUkQgbWlkT3BlbihXT1JEIHdEZXZJRCwgTFBNSURJT1BFTkRFU0MgbHBEZXNjLCBEV09SRCBkd0ZsYWdzKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJaW50CQltaWRpOwogCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCSJtaWRPcGVuKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CkBAIC04NTgsMTggKzg4MCwxOCBAQAogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQl9Ci0JaWYgKGluZGV4ID49IE1BWF9NSURJSU5EUlYpIHsKKwlpZiAod0RldklEID49IE1BWF9NSURJSU5EUlYpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZE9wZW4nIC8vIE1BWF9NSURJSU5EUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAkJfQotCU1pZGlJbkRldltpbmRleF0udW5peGRldiA9IDA7CisJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1JET05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JTWlkaUluRGV2W2luZGV4XS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKLQlzd2l0Y2goTWlkaUluRGV2W2luZGV4XS53RmxhZ3MpIHsKKwlNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKKwlzd2l0Y2goTWlkaUluRGV2W3dEZXZJRF0ud0ZsYWdzKSB7CiAJCWNhc2UgRENCX05VTEw6CiAJCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkT3BlbicgLy8gQ0FMTEJBQ0tfTlVMTCAhXG4iKTsKIAkJCWJyZWFrOwpAQCAtODg2LDEwICs5MDgsMTAgQEAKIAkJCQkgICAiTGludXggJ21pZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQkJYnJlYWs7CiAJCX0KLQlNaWRpSW5EZXZbaW5kZXhdLmxwUXVldWVIZHIgPSBOVUxMOwotCU1pZGlJbkRldltpbmRleF0udW5peGRldiA9IG1pZGk7Ci0JTWlkaUluRGV2W2luZGV4XS5kd1RvdGFsUGxheWVkID0gMDsKLQlNaWRpSW5EZXZbaW5kZXhdLmJ1ZnNpemUgPSAweDNGRkY7CisJTWlkaUluRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CisJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IG1pZGk7CisJTWlkaUluRGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7CisJTWlkaUluRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTkwNiwxNSArOTI4LDE0IEBACiBzdGF0aWMgRFdPUkQgbWlkQ2xvc2UoV09SRCB3RGV2SUQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOwotCWlmIChNaWRpSW5EZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgeworCWlmIChNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQljbG9zZShNaWRpSW5EZXZbaW5kZXhdLnVuaXhkZXYpOwotCU1pZGlJbkRldltpbmRleF0udW5peGRldiA9IDA7Ci0JTWlkaUluRGV2W2luZGV4XS5idWZzaXplID0gMDsKKwljbG9zZShNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2KTsKKwlNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKKwlNaWRpSW5EZXZbd0RldklEXS5idWZzaXplID0gMDsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtMTAzNCwyOCArMTA1NSwyOCBAQAogKiAJCQkJbW9kT3BlbgkJCQkJW2ludGVybmFsXQogKi8KIHN0YXRpYyBEV09SRCBtb2RPcGVuKFdPUkQgd0RldklELCBMUE1JRElPUEVOREVTQyBscERlc2MsIERXT1JEIGR3RmxhZ3MpCi17CQkJCQkJCQkgCit7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlpbnQgaW5kZXggPSBNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKTsKIAlpbnQJCW1pZGk7CisKIAlkcHJpbnRmX21pZGkoc3RkZGViLAogCQkibW9kT3BlbiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQl9Ci0JaWYgKGluZGV4ID49IE1BWF9NSURJT1VURFJWKSB7CisJaWYgKHdEZXZJRD49IE1BWF9NSURJT1VURFJWKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9Ci0JTWlkaU91dERldltpbmRleF0udW5peGRldiA9IDA7CisJTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCW1pZGkgPSBvcGVuIChNSURJX0RFViwgT19XUk9OTFksIDApOwogCWlmIChtaWRpID09IC0xKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCU1pZGlPdXREZXZbaW5kZXhdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwotCXN3aXRjaChNaWRpT3V0RGV2W2luZGV4XS53RmxhZ3MpIHsKKwlNaWRpT3V0RGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7CisJc3dpdGNoKE1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MpIHsKIAkJY2FzZSBEQ0JfTlVMTDoKIAkJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CkBAIC0xMDcyLDEwICsxMDkzLDEwIEBACiAJCQkJIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKIAkJCWJyZWFrOwogCQl9Ci0JTWlkaU91dERldltpbmRleF0ubHBRdWV1ZUhkciA9IE5VTEw7Ci0JTWlkaU91dERldltpbmRleF0udW5peGRldiA9IG1pZGk7Ci0JTWlkaU91dERldltpbmRleF0uZHdUb3RhbFBsYXllZCA9IDA7Ci0JTWlkaU91dERldltpbmRleF0uYnVmc2l6ZSA9IDB4M0ZGRjsKKwlNaWRpT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CisJTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPSBtaWRpOworCU1pZGlPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKKwlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNT01fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTEwOTUsMTUgKzExMTYsMTQgQEAKIHN0YXRpYyBEV09SRCBtb2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RDbG9zZSglMDRYKTtcbiIsIHdEZXZJRCk7Ci0JaWYgKE1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgeworCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JY2xvc2UoTWlkaU91dERldltpbmRleF0udW5peGRldik7Ci0JTWlkaU91dERldltpbmRleF0udW5peGRldiA9IDA7Ci0JTWlkaU91dERldltpbmRleF0uYnVmc2l6ZSA9IDA7CisJY2xvc2UoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYpOworCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gMDsKKwlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CiAJaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTExMjAsMTYgKzExNDAsMTYgQEAKIHN0YXRpYyBEV09SRCBtb2REYXRhKFdPUkQgd0RldklELCBEV09SRCBkd1BhcmFtKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJV09SRAlldmVudDsKKwogCWRwcmludGZfbWlkaShzdGRkZWIsCQogCQkibW9kRGF0YSglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOwotCWlmIChNaWRpT3V0RGV2W2luZGV4XS51bml4ZGV2ID09IDApIHsKKwlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogICAgICAgICBkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kRGF0YScgLy8gY2FuJ3QgcGxheSAhXG4iKTsKIAkJcmV0dXJuIE1JRElFUlJfTk9ERVZJQ0U7CiAJCX0KIAlldmVudCA9IExPV09SRChkd1BhcmFtKTsKLQlpZiAod3JpdGUgKE1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYsIAorCWlmICh3cml0ZSAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAogCQkmZXZlbnQsIHNpemVvZihXT1JEKSkgIT0gc2l6ZW9mKFdPUkQpKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCQkibW9kRGF0YSgpIC8vIGVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIVxuIik7CkBAIC0xMTQ2LDEyICsxMTY2LDEzIEBACiBzdGF0aWMgRFdPUkQgbW9kTG9uZ0RhdGEoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWludAkJY291bnQ7CiAJTFBXT1JECXB0cjsKKwlpbnQgICAgIGVuOworCiAJZHByaW50Zl9taWRpKHN0ZGRlYiwJCiAJCSJtb2RMb25nRGF0YSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7Ci0JaWYgKE1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgeworCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAgICAgICAgIGRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RMb25nRGF0YScgLy8gY2FuJ3QgcGxheSAhXG4iKTsKIAkJcmV0dXJuIE1JRElFUlJfTk9ERVZJQ0U7CiAJCX0KQEAgLTExNjIsMjAgKzExODMsMzAgQEAKIAlscE1pZGlIZHItPmR3RmxhZ3MgfD0gTUhEUl9JTlFVRVVFOwogCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCSJtb2RMb25nRGF0YSgpIC8vIGR3Qnl0ZXNSZWNvcmRlZCAlbHUgIVxuIiwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOworCWRwcmludGZfbWlkaShzdGRkZWIsCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgJTAyWCAlMDJYICUwMlggJTAyWFxuIixscE1pZGlIZHItPmxwRGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzFdLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzJdLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWlkaUhkci0+bHBEYXRhWzNdKTsKIC8qCi0JY291bnQgPSB3cml0ZSAoTWlkaU91dERldltpbmRleF0udW5peGRldiwgCisJY291bnQgPSB3cml0ZSAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAogCQlscE1pZGlIZHItPmxwRGF0YSwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwogKi8KIAlwdHIgPSAoTFBXT1JEKWxwTWlkaUhkci0+bHBEYXRhOwogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkOyBjb3VudCsrKSB7Ci0JCWlmICh3cml0ZSAoTWlkaU91dERldltpbmRleF0udW5peGRldiwgcHRyLCAKKwkJaWYgKHdyaXRlIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiwgcHRyLCAKIAkJCXNpemVvZihXT1JEKSkgIT0gc2l6ZW9mKFdPUkQpKSBicmVhazsKIAkJcHRyKys7CiAJCX0KKworCWVuID0gZXJybm87CisJZHByaW50Zl9taWRpKHN0ZGRlYiwgIkxpbnV4ICdtb2RMb25nRGF0YScgLy8gYWZ0ZXIgd3JpdGUgY291bnQgPSAlZFxuIixjb3VudCk7CiAJaWYgKGNvdW50ICE9IGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCQkibW9kTG9uZ0RhdGEoKSAvLyBlcnJvciB3cml0dGluZyB1bml4ZGV2ICMlZCAhICglZCAhPSAlbGQpXG4iLAotCQkJTWlkaU91dERldltpbmRleF0udW5peGRldiwgY291bnQsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKKwkJCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCBjb3VudCwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOworCQlkcHJpbnRmX21pZGkoc3RkZGViLAorCQkJIiAgICAgICAgICAgICAgICAgZXJybm8gPSAlZCBlcnJvciA9ICVzXG4iLGVuLHN0cmVycm9yKGVuKSk7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0lOUVVFVUU7CkBAIC0xMTk2LDE5ICsxMjI3LDE4IEBACiBzdGF0aWMgRFdPUkQgbW9kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JaW50IGluZGV4ID0gTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCk7CiAJZHByaW50Zl9taWRpKHN0ZGRlYiwKIAkJICAibW9kUHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7Ci0JaWYgKE1pZGlPdXREZXZbaW5kZXhdLnVuaXhkZXYgPT0gMCkgeworCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RQcmVwYXJlJyAvLyBjYW4ndCBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCWlmIChNaWRpT3V0RGV2W2luZGV4XS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKKwlpZiAoTWlkaU91dERldlt3RGV2SURdLmxwUXVldWVIZHIgIT0gTlVMTCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQotCU1pZGlPdXREZXZbaW5kZXhdLmR3VG90YWxQbGF5ZWQgPSAwOwotCU1pZGlPdXREZXZbaW5kZXhdLmxwUXVldWVIZHIgPSBscE1pZGlIZHI7CisJTWlkaU91dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOworCU1pZGlPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyID0gUFRSX1NFR19UT19MSU4obHBNaWRpSGRyKTsKIAlpZiAobHBNaWRpSGRyLT5kd0ZsYWdzICYgTUhEUl9JTlFVRVVFKSByZXR1cm4gTUlESUVSUl9TVElMTFBMQVlJTkc7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfUFJFUEFSRUQ7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0RPTkU7CkBAIC0xMjI0LDEwICsxMjU0LDkgQEAKIHN0YXRpYyBEV09SRCBtb2RVbnByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWludCBpbmRleCA9IE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpOwogCWRwcmludGZfbWlkaShzdGRkZWIsCiAJCSJtb2RVbnByZXBhcmUoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwotCWlmIChNaWRpT3V0RGV2W2luZGV4XS51bml4ZGV2ID09IDApIHsKKwlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tYXV4LmMgYi9tdWx0aW1lZGlhL21tYXV4LmMKaW5kZXggNDcwYzc4ZC4uNWIyNjFkMCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbWF1eC5jCisrKyBiL211bHRpbWVkaWEvbW1hdXguYwpAQCAtMTgsOSArMTgsMTIgQEAKIAogI2lmZGVmIGxpbnV4CiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjZWxpZiBfX0ZyZWVCU0RfXworI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CiAjZW5kaWYKIAotaW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYpOworI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBTT1VORF9ERVYgIi9kZXYvZHNwIgogI2RlZmluZSBNSVhFUl9ERVYgIi9kZXYvbWl4ZXIiCkBAIC00NSwxNSArNDgsMTUgQEAKICNpZmRlZiBsaW51eAogCWludCAJbWl4ZXI7CiAJaW50CQl2b2x1bWU7Ci0JcHJpbnRmKCJBVVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKChtaXhlciA9IG9wZW4oTUlYRVJfREVWLCBPX1JEV1IpKSA8IDApIHsKLQkJcHJpbnRmKCJBVVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkFVWF9HZXREZXZDYXBzIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogICAgIGlmIChpb2N0bChtaXhlciwgU09VTkRfTUlYRVJfUkVBRF9MSU5FLCAmdm9sdW1lKSA9PSAtMSkgewogCQljbG9zZShtaXhlcik7Ci0JCXByaW50ZigiQVVYX0dldERldkNhcHMgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CisJCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0RGV2Q2FwcyAvLyB1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAljbG9zZShtaXhlcik7CkBAIC02MSw3ICs2NCw3IEBACiAJbHBDYXBzLT53TWlkID0gMHgwMDAyOwogCWxwQ2Fwcy0+dkRyaXZlclZlcnNpb24gPSAweDAyMDA7CiAJbHBDYXBzLT5kd1N1cHBvcnQgPSBBVVhDQVBTX1ZPTFVNRSB8IEFVWENBUFNfTFJWT0xVTUU7Ci0Jc3dpdGNoIChNTVNZU1RFTV9EZXZJRFRvSW5kZXgod0RldklEKSkgeworCXN3aXRjaCAod0RldklEKSB7CiAJCWNhc2UgMDoKIAkJCWxwQ2Fwcy0+d1BpZCA9IDB4MDE5NjsKIAkJCXN0cmNweShscENhcHMtPnN6UG5hbWUsICJTQjE2IEF1eDogV2F2ZSIpOwpAQCAtMTE3LDQ5ICsxMjAsNTAgQEAKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lLCBsZWZ0LCByaWdodDsKIAlpbnQJCWNtZDsKLQlwcmludGYoIkFVWF9HZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKKworCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0Vm9sdW1lKCUwNFgsICVwKTtcbiIsIHdEZXZJRCwgbHBkd1ZvbCk7CiAJaWYgKGxwZHdWb2wgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKChtaXhlciA9IG9wZW4oTUlYRVJfREVWLCBPX1JEV1IpKSA8IDApIHsKLQkJcHJpbnRmKCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CisJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0Jc3dpdGNoKE1NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpKSB7CisJc3dpdGNoKHdEZXZJRCkgewogCQljYXNlIDA6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1BDTSAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9QQ00gIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX1BDTTsKIAkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1NZTlRIICFcbiIpOworCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1NZTlRIICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9TWU5USDsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX0NEICFcbiIpOworCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX0NEICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9DRDsKIAkJCWJyZWFrOwogCQljYXNlIDM6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX0xJTkUgIVxuIik7CisJCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfTElORSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfTElORTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX01JQyAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9NSUMgIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX01JQzsKIAkJCWJyZWFrOwogCQljYXNlIDU6Ci0JCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRSAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9WT0xVTUUgIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOworCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsICJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOwogCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJcHJpbnRmKCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CisJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJY2xvc2UobWl4ZXIpOwogCWxlZnQgPSB2b2x1bWUgJiAweDdGOwogCXJpZ2h0ID0gKHZvbHVtZSA+PiA4KSAmIDB4N0Y7Ci0JcHJpbnRmKCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbGVmdD0lZCByaWdodD0lZCAhXG4iLCBsZWZ0LCByaWdodCk7CisJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKIAkqbHBkd1ZvbCA9IE1BS0VMT05HKGxlZnQgPDwgOSwgcmlnaHQgPDwgOSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAjZWxzZQpAQCAtMTc2LDQ0ICsxODAsNDQgQEAKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lOwogCWludAkJY21kOwotCXByaW50ZigiQVVYX1NldFZvbHVtZSglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOworCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfU2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlwcmludGYoIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KLQlzd2l0Y2goTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCkpIHsKKwlzd2l0Y2god0RldklEKSB7CiAJCWNhc2UgMDoKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1BDTSAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfUENNICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfUENNOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1NZTlRIICFcbiIpOworCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9XUklURV9TWU5USCAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX1NZTlRIOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0NEICFcbiIpOworCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9XUklURV9DRCAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX0NEOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUgIVxuIik7CisJCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUgIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9MSU5FOwogCQkJYnJlYWs7CiAJCWNhc2UgNDoKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX01JQyAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfTUlDICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfTUlDOwogCQkJYnJlYWs7CiAJCWNhc2UgNToKLQkJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lMDRYICFcbiIsIHdEZXZJRCk7CisJCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwgIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lMDRYICFcbiIsIHdEZXZJRCk7CiAJCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogICAgIGlmIChpb2N0bChtaXhlciwgY21kLCAmdm9sdW1lKSA9PSAtMSkgewotCQlwcmludGYoIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyB1bmFibGUgc2V0IG1peGVyICFcbiIpOworCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIHVuYWJsZSBzZXQgbWl4ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJY2xvc2UobWl4ZXIpOwpAQCAtMjMwLDIxICsyMzQsMjEgQEAKIERXT1JEIGF1eE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCXByaW50ZigiYXV4TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCWRwcmludGZfbW1hdXgoc3RkZGViLCJhdXhNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCQljYXNlIEFVWERNX0dFVERFVkNBUFM6CiAJCQlyZXR1cm4gQVVYX0dldERldkNhcHMod0RldklELCAKIAkJCQkoTFBBVVhDQVBTKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSwgZHdQYXJhbTIpOwogCQljYXNlIEFVWERNX0dFVE5VTURFVlM6Ci0JCQlwcmludGYoIkFVWF9HZXROdW1EZXZzKCkgcmV0dXJuICVkO1xuIiwgTnVtRGV2KTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0TnVtRGV2cygpIHJldHVybiAlZDtcbiIsIE51bURldik7CiAJCQlyZXR1cm4gTnVtRGV2OwogCQljYXNlIEFVWERNX0dFVFZPTFVNRToKIAkJCXJldHVybiBBVVhfR2V0Vm9sdW1lKHdEZXZJRCwgKExQRFdPUkQpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpKTsKIAkJY2FzZSBBVVhETV9TRVRWT0xVTUU6CiAJCQlyZXR1cm4gQVVYX1NldFZvbHVtZSh3RGV2SUQsIGR3UGFyYW0xKTsKIAkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCJhdXhNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKKwkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJhdXhNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggMTBkYTcwMC4uMTBkNzgwZCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQkgICAgbHBXYXZlRGVzYy0+aFdhdmUgICAgPSAwOwogCQkJICAgIGxwV2F2ZURlc2MtPmxwRm9ybWF0ID0gKExQV0FWRUZPUk1BVCkgU0VHUFRSX0dFVChscEZvcm1hdCk7CiAKLQkJCSAgICBkd1JldCA9IHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgCisJCQkgICAgZHdSZXQgPSB3b2RNZXNzYWdlKCAwLCAKIAkJCQkJCVdPRE1fT1BFTiwgMCwgKERXT1JEKVNFR1BUUl9HRVQobHBXYXZlRGVzYyksIENBTExCQUNLX05VTEwpOwogCQkJICAgIFNFR1BUUl9GUkVFKGxwRm9ybWF0KTsKIAkJCSAgICBTRUdQVFJfRlJFRShscFdhdmVEZXNjKTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCQkJCWxwV2F2ZUhkci0+ZHdGbGFncyA9IDBMOwogCQkJCWxwV2F2ZUhkci0+ZHdMb29wcyA9IDBMOwogCi0JCQkJZHdSZXQgPSB3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksCisJCQkJZHdSZXQgPSB3b2RNZXNzYWdlKCAwLAogCQkJCQkJICAgIFdPRE1fUFJFUEFSRSwgMCwgKERXT1JEKXNwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAkJCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgCiAJCQkJewpAQCAtMjE4LDEyICsyMTgsMTIgQEAKIAkJCQkJaWYgKGNvdW50IDwgMSkgYnJlYWs7CiAJCQkJCWxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGggPSBjb3VudDsKIAkJCQkvKglscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OyAqLwotCQkJCQl3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksIFdPRE1fV1JJVEUsIAorCQkJCQl3b2RNZXNzYWdlKCAwLCBXT0RNX1dSSVRFLCAKIAkJCQkJCSAgICAwLCAoRFdPUkQpc3BXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCQkJCSAgICB9Ci0JCQkJICAgIHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgCi0JCQkJCQlXT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKXNwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKLQkJCQkgICAgd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLAorCQkJCSAgICB3b2RNZXNzYWdlKCAwLCAKKwkJCQkJICAgICAgICBXT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKXNwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwkJCQkgICAgd29kTWVzc2FnZSggMCwKIAkJCQkJCVdPRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CiAKIAkJCQkgICAgYlJldCA9IFRSVUU7CkBAIC01NDcsMTcgKzU0NywzMiBAQAogCQljYXNlIE1DSUVSUl9GSUxFX1dSSVRFOgogCQkJbXNncHRyID0gIkNhbm5vdCB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBlbm91Z2ggZGlzayBzcGFjZSBvciBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIHRoZSBuZXR3b3JrLiI7CiAJCQlicmVhazsKKwkJY2FzZSBNQ0lFUlJfU0VRX0RJVl9JTkNPTVBBVElCTEU6CisJCQltc2dwdHIgPSAiVGhlIHRpbWUgZm9ybWF0cyBvZiB0aGUgXCJzb25nIHBvaW50ZXJcIiBhbmQgU01QVEUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gWW91IGNhbid0IHVzZSB0aGVtIHRvZ2V0aGVyLiI7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lFUlJfU0VRX05PTUlESVBSRVNFTlQ6CisJCQltc2dwdHIgPSAiVGhlIHN5c3RlbSBoYXMgbm8gaW5zdGFsbGVkIE1JREkgZGV2aWNlcy4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBmcm9tIHRoZSBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgYSBNSURJIGRyaXZlci4iOworCQkJYnJlYWs7CisJCWNhc2UgTUNJRVJSX1NFUV9QT1JUX0lOVVNFOgorCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgTUlESSBwb3J0IGlzIGFscmVhZHkgaW4gdXNlLiBXYWl0IHVudGlsIGl0IGlzIGZyZWU7IHRoZSB0cnkgYWdhaW4uIjsKKwkJCWJyZWFrOworCQljYXNlIE1DSUVSUl9TRVFfUE9SVF9NQVBOT0RFVklDRToKKwkJCW1zZ3B0ciA9ICJUaGUgY3VycmVudCBNSURJIE1hcHBlciBzZXR1cCByZWZlcnMgdG8gYSBNSURJIGRldmljZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBNSURJIE1hcHBlciBvcHRpb24gZnJvbSB0aGUgQ29udHJvbCBQYW5lbCB0byBlZGl0IHRoZSBzZXR1cC4iOworCQkJYnJlYWs7CisJCWNhc2UgTUNJRVJSX1NFUV9QT1JUX01JU0NFUlJPUjoKKwkJCW1zZ3B0ciA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9ydC4iOworCQkJYnJlYWs7CisJCWNhc2UgTUNJRVJSX1NFUV9QT1JUX05PTkVYSVNURU5UOgorCQkJbXNncHRyID0gIlRoZSBzcGVjaWZpZWQgTUlESSBkZXZpY2UgaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLiBVc2UgdGhlIERyaXZlcnMgb3B0aW9uIGZyb20gdGhlIENvbnRyb2wgUGFuZWwgdG8gaW5zdGFsbCBhIE1JREkgZGV2aWNlLiI7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lFUlJfU0VRX1BPUlRVTlNQRUNJRklFRDoKKwkJCW1zZ3B0ciA9ICJUaGUgc3lzdGVtIGRvZXNub3QgaGF2ZSBhIGN1cnJlbnQgTUlESSBwb3J0IHNwZWNpZmllZC4iOworCQkJYnJlYWs7CisJCWNhc2UgTUNJRVJSX1NFUV9USU1FUjoKKwkJCW1zZ3B0ciA9ICJBbGwgbXVsdGltZWRpYSB0aW1lcnMgYXJlIGJlaW5nIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zLiBRdWl0IG9uZSBvZiB0aGVzZSBhcHBsaWNhdGlvbnM7IHRoZW4sIHRyeSBhZ2Fpbi4iOworCQkJYnJlYWs7CiAKIC8qIAotI2RlZmluZSBNQ0lFUlJfU0VRX0RJVl9JTkNPTVBBVElCTEUgICAgIChNQ0lFUlJfQkFTRSArIDgwKQotI2RlZmluZSBNQ0lFUlJfU0VRX1BPUlRfSU5VU0UgICAgICAgICAgIChNQ0lFUlJfQkFTRSArIDgxKQotI2RlZmluZSBNQ0lFUlJfU0VRX1BPUlRfTk9ORVhJU1RFTlQgICAgIChNQ0lFUlJfQkFTRSArIDgyKQotI2RlZmluZSBNQ0lFUlJfU0VRX1BPUlRfTUFQTk9ERVZJQ0UgICAgIChNQ0lFUlJfQkFTRSArIDgzKQotI2RlZmluZSBNQ0lFUlJfU0VRX1BPUlRfTUlTQ0VSUk9SICAgICAgIChNQ0lFUlJfQkFTRSArIDg0KQotI2RlZmluZSBNQ0lFUlJfU0VRX1RJTUVSICAgICAgICAgICAgICAgIChNQ0lFUlJfQkFTRSArIDg1KQotI2RlZmluZSBNQ0lFUlJfU0VRX1BPUlRVTlNQRUNJRklFRCAgICAgIChNQ0lFUlJfQkFTRSArIDg2KQotI2RlZmluZSBNQ0lFUlJfU0VRX05PTUlESVBSRVNFTlQgICAgICAgIChNQ0lFUlJfQkFTRSArIDg3KQotCiBtc2cjIDUxMyA6IHZjcgogbXNnIyA1MTQgOiB2aWRlb2Rpc2MKIG1zZyMgNTE1IDogb3ZlcmxheQpAQCAtNTk1LDYgKzYxMCw3IEBACiAJCQlicmVhazsKIAkJfQogICAgICAgICBsc3RyY3B5bjMyQShscHN0ckJ1ZmZlciwgbXNncHRyLCB1TGVuZ3RoKTsKKwlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaUdldEVycm9yU3RyaW5nIC8vIG1zZyA9ICVzO1xuIiwgbXNncHRyKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNjA4LDcgKzYyNCw3IEBACiAJaWYgKCFJc1dpbmRvdzMyKGhXbmRDYWxsQmFjaykpIHJldHVybiBGQUxTRTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaURyaXZlck5vdGlmeSAvLyBiZWZvcmUgUG9zdE1lc3NhZ2VcbiIpOwogCVBvc3RNZXNzYWdlMTYoIGhXbmRDYWxsQmFjaywgTU1fTUNJTk9USUZZLCB3U3RhdHVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyh3RGV2SUQsIDApKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNjIyLDEwICs2MzgsMTIgQEAKIAlMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXM7CiAJVUlOVDE2CXVEZXZUeXAgPSAwOwogCVVJTlQxNgl3RGV2SUQgPSBNTVNZU1RFTV9GaXJzdERldklEKCk7CisJRFdPUkQgZHdyZXQ7CiAKIAlscFBhcm1zID0gUFRSX1NFR19UT19MSU4obHAxNlBhcm1zKTsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaU9wZW4oJTA4bFgsICVwICglcCkpXG4iLCBkd1BhcmFtLCBscDE2UGFybXMsIGxwUGFybXMpOwogCWlmIChscDE2UGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwogCXdoaWxlKEdldERydih3RGV2SUQpLT53VHlwZSAhPSAwKSB7CiAJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwogCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewpAQCAtNjQ3LDYgKzY2NSw3IEBACiAJCWlmICh0KSB7CiAJCQlHZXRQcm9maWxlU3RyaW5nMzJBKCJtY2kgZXh0ZW5zaW9ucyIsdCsxLCIqIixzdHIsc2l6ZW9mKHN0cikpOwogCQkJQ2hhclVwcGVyMzJBKHN0cik7CisJCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaU9wZW4gLy8gc3RyID0gJXMgXG4iLCBzdHIpOwogCQkJaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgewogCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKIAkJCX0gZWxzZQpAQCAtNzEwLDMyICs3MjksNDEgQEAKIAkJfQogCX0KIAlHZXREcnYod0RldklEKS0+d1R5cGUgPSB1RGV2VHlwOwotCUdldERydih3RGV2SUQpLT53RGV2aWNlSUQgPSB3RGV2SUQ7CisJR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCA9IDA7ICAvKiBGSVhNRT8gZm9yIG11bHRpcGxlIGRldmljZXMgKi8KIAlscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7CiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBtY2lkZXY9JWQsIHVEZXZUeXA9JTA0WCB3RGV2aWNlSUQ9JTA0WCAhXG4iLCAKIAkJCQl3RGV2SUQsIHVEZXZUeXAsIGxwUGFybXMtPndEZXZpY2VJRCk7CiAJc3dpdGNoKHVEZXZUeXApCiAgICAgICAgIHsKICAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKLSAgICAgICAgICAgIHJldHVybiBDREFVRElPX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCSAgZHdyZXQgPSBDREFVRElPX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwKKwkJCQkgICAgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCSAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86Ci0gICAgICAgICAgICByZXR1cm4gV0FWRV9Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisJICBkd3JldCA9ICBXQVZFX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCisJCQkJICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisJICBicmVhazsKICAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6Ci0gICAgICAgICAgICByZXR1cm4gTUlESV9Ecml2ZXJQcm9jKCAwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisJICBkd3JldCA9IE1JRElfRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKKwkJCQkgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCSAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOgotICAgICAgICAgICAgcmV0dXJuIEFOSU1fRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCSAgZHdyZXQgPSBBTklNX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCisJCQkJICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKwkgIGJyZWFrOwogICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86Ci0gICAgICAgICAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIE5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKKwkgIGRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7CisJICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBJbnZhbGlkIERldmljZSBOYW1lICclMDhseCcgIVxuIiwgbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKKwkgIGRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gSW52YWxpZCBEZXZpY2UgTmFtZSAnJTA4bHgnICFcbiIsIGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CisJICByZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7CiAgICAgICAgIH0KLQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOworCisJLyogb25seSBoYW5kbGVkIGRldmljZXMgZmFsbCB0aHJvdWdoICovCisJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyB3RGV2SUQgPSAlMDRYIHdEZXZpY2VJRCA9ICVkIGR3cmV0ID0gJWxkXG4iLHdEZXZJRCwgbHBQYXJtcy0+d0RldmljZUlELCBkd3JldCk7CisJcmV0dXJuIGR3cmV0OworCisvKglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOyAqLwogfQogCiAKQEAgLTc0NSw3ICs3NzMsOCBAQAogRFdPUkQgbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogCURXT1JECWR3UmV0ID0gTUNJRVJSX0lOVEVSTkFMOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpQ2xvc2UoJXUsICUwOGxYLCAlcClcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CisKKwlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaUNsb3NlKCUwNHgsICUwOGxYLCAlcClcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CiAJc3dpdGNoKEdldERydih3RGV2SUQpLT53VHlwZSkgewogCQljYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgogCQkJZHdSZXQgPSBDREFVRElPX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwwLApAQCAtNzY4LDE0ICs3OTcsMTYgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lDbG9zZSgpIC8vIHVua25vd24gZGV2aWNlIHR5cGU9JTA0WCAhXG4iLCBHZXREcnYod0RldklEKS0+d1R5cGUpOworCQkJZHdSZXQgPSBNQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ7CiAJCX0KIAlHZXREcnYod0RldklEKS0+d1R5cGUgPSAwOworCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpQ2xvc2UoKSAvLyByZXR1cm5zICVsZFxuIixkd1JldCk7CiAJcmV0dXJuIGR3UmV0OwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbWNpU291bmQJCQkJW2ludGVybmFsXQorKiAJCQkJbWNpU3lzaW5mbwkJCQlbaW50ZXJuYWxdCiAqLwogRFdPUkQgbWNpU3lzSW5mbyhEV09SRCBkd0ZsYWdzLCBMUE1DSV9TWVNJTkZPX1BBUk1TIGxwUGFybXMpCiB7CkBAIC05MzYsNyArOTY3LDcgQEAKIAlyZXR1cm4gMDsKIAogICAgIHdEZXZJRCA9IE1NU1lTVEVNX0ZpcnN0RGV2SUQoKTsKLSAgICB3aGlsZShHZXREcnYod0RldklEKS0+d1R5cGUpIHsKKyAgICB3aGlsZShNTVNZU1RFTV9EZXZJRFZhbGlkKHdEZXZJRCkgJiYgR2V0RHJ2KHdEZXZJRCktPndUeXBlKSB7CiAJaWYgKEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlICYmIAogICAgICAgICAgICAgc3RyY21wKFBUUl9TRUdfVE9fTElOKEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlKSwgbHBzdHJOYW1lKSA9PSAwKQogCSAgICByZXR1cm4gd0RldklEOwpAQCAtMTUyNCw2ICsxNTU1LDcgQEAKIAlMUFdBVkVPUEVOREVTQwlscDE2RGVzYzsKIAlEV09SRAlkd1JldCA9IDA7CiAJQk9PTDMyCWJNYXBwZXJGbGcgPSBGQUxTRTsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dE9wZW4oJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJbHBoV2F2ZU91dCwgdURldmljZUlELCBscEZvcm1hdCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CiAJaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkgewpAQCAtMTUzNSwxMyArMTU2NywxNCBAQAogCQl1RGV2aWNlSUQgPSAwOwogCQl9CiAJaWYgKGxwRm9ybWF0ID09IE5VTEwpIHJldHVybiBXQVZFUlJfQkFERk9STUFUOworCiAJaFdhdmVPdXQgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKFdBVkVPUEVOREVTQykpOwogCWlmIChscGhXYXZlT3V0ICE9IE5VTEwpICpscGhXYXZlT3V0ID0gaFdhdmVPdXQ7CiAJbHAxNkRlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9TRUdfQUREUihoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBQVFJfU0VHX1RPX0xJTihscDE2RGVzYyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9NRU07CiAJbHBEZXNjLT5oV2F2ZSA9IGhXYXZlT3V0OwotCWxwRGVzYy0+bHBGb3JtYXQgPSBscEZvcm1hdDsKKwlscERlc2MtPmxwRm9ybWF0ID0gbHBGb3JtYXQ7ICAvKiBzaG91bGQgdGhlIHN0cnVjdCBiZSBjb3BpZWQgaXNvIHBvaW50ZXI/ICovCiAJbHBEZXNjLT5kd0NhbGxCYWNrID0gZHdDYWxsYmFjazsKIAlscERlc2MtPmR3SW5zdGFuY2UgPSBkd0luc3RhbmNlOwogCXdoaWxlKHVEZXZpY2VJRCA8IE1BWFdBVkVEUklWRVJTKSB7CkBAIC0xNTU2LDYgKzE1ODksNyBAQAogCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKIAkJd2F2ZU91dENsb3NlKGhXYXZlT3V0KTsKIAkJfQorCWxwRGVzYy0+dURldmljZUlEID0gdURldmljZUlEOyAgLyogc2F2ZSBwaHlzaWNhbCBEZXZpY2UgSUQgKi8KIAlyZXR1cm4gZHdSZXQ7CiB9CiAKQEAgLTE1NjUsMTAgKzE1OTksMTEgQEAKIFVJTlQxNiB3YXZlT3V0Q2xvc2UoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRDbG9zZSglMDRYKVxuIiwgaFdhdmVPdXQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU3OCwxMSArMTYxMywxMiBAQAogICAgICBXQVZFSERSICogbHBXYXZlT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0UHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgV09ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJCShEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKIH0KIApAQCAtMTU5MywxMSArMTYyOSwxMiBAQAogICAgIFdBVkVIRFIgKiBscFdhdmVPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX1VOUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fVU5QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJCShEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKIH0KIApAQCAtMTYwNywxMCArMTY0NCwxMSBAQAogVUlOVDE2IHdhdmVPdXRXcml0ZShIV0FWRU9VVDE2IGhXYXZlT3V0LCBXQVZFSERSICogbHBXYXZlT3V0SGRyLCAgVUlOVDE2IHVTaXplKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFdyaXRlKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZU91dCwgbHBXYXZlT3V0SGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksIFdPRE1fV1JJVEUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1dSSVRFLCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJCShEV09SRClscFdhdmVPdXRIZHIsIHVTaXplKTsKIH0KIApAQCAtMTYyMCwxMCArMTY1OCwxMSBAQAogVUlOVDE2IHdhdmVPdXRQYXVzZShIV0FWRU9VVDE2IGhXYXZlT3V0KQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFBhdXNlKCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksIFdPRE1fUEFVU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKKwlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fUEFVU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjMyLDEwICsxNjcxLDExIEBACiBVSU5UMTYgd2F2ZU91dFJlc3RhcnQoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRSZXN0YXJ0KCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksIFdPRE1fUkVTVEFSVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOworCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9SRVNUQVJULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY0Nyw3ICsxNjg3LDcgQEAKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRSZXNldCglMDRYKVxuIiwgaFdhdmVPdXQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTY1OSw3ICsxNjk5LDcgQEAKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRQb3NpdGlvbiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwVGltZSwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJCShEV09SRClscFRpbWUsIChEV09SRCl1U2l6ZSk7CiB9CiAKQEAgLTE2NzIsNyArMTcxMiw3IEBACiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0UGl0Y2goJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwZHdQaXRjaCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3b2RNZXNzYWdlKCBNTVNZU1RFTV9GaXJzdERldklEKCksIFdPRE1fR0VUUElUQ0gsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0dFVFBJVENILCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJCQkoRFdPUkQpbHBkd1BpdGNoLCAwTCk7CiB9CiAKQEAgLTE2ODUsNyArMTcyNSw3IEBACiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0U2V0UGl0Y2goJTA0WCwgJTA4bFgpO1xuIiwgaFdhdmVPdXQsIGR3UGl0Y2gpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX1NFVFBJVENILCBscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClkd1BpdGNoLCAwTCk7CisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1NFVFBJVENILCBscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClkd1BpdGNoLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTcxNSw3ICsxNzU1LDcgQEAKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRQbGF5YmFja1JhdGUoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwZHdSYXRlKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgV09ETV9HRVRQTEFZQkFDS1JBVEUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0dFVFBMQVlCQUNLUkFURSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCQkJKERXT1JEKWxwZHdSYXRlLCAwTCk7CiB9CiAKQEAgLTE3MjgsNyArMTc2OCw3IEBACiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0U2V0UGxheWJhY2tSYXRlKCUwNFgsICUwOGxYKTtcbiIsIGhXYXZlT3V0LCBkd1JhdGUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX1NFVFBMQVlCQUNLUkFURSwgCisJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1NFVFBMQVlCQUNLUkFURSwgCiAJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWR3UmF0ZSwgMEwpOwogfQogCkBAIC0xNzU0LDcgKzE3OTQsOCBAQAogLyoKIAkqbHB1RGV2aWNlSUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7IAogKi8KLQlyZXR1cm4gMDsKKwkqbHB1RGV2aWNlSUQgPSBscERlc2MtPnVEZXZpY2VJRDsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTc2OCw3ICsxODA5LDcgQEAKIAkJCWhXYXZlT3V0LCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdvZE1lc3NhZ2UoIE1NU1lTVEVNX0ZpcnN0RGV2SUQoKSwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKwlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIHVNZXNzYWdlLCBscERlc2MtPmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTg1NywxMCArMTg5OCwxMSBAQAogVUlOVDE2IHdhdmVJbkNsb3NlKEhXQVZFSU4xNiBoV2F2ZUluKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluQ2xvc2UoJTA0WClcbiIsIGhXYXZlSW4pOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3aWRNZXNzYWdlKDAsIFdJRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKKwlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAKQEAgLTE4NzIsNiArMTkxNCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCUxQV0FWRUhEUiAJCWxwMzJXYXZlSW5IZHI7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwpAQCAtMTg4Miw3ICsxOTI1LDcgQEAKICAgICBscDMyV2F2ZUluSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluUHJlcGFyZUhlYWRlciAvLyBscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKIAkJbHAzMldhdmVJbkhkci0+bHBEYXRhLCBscDMyV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAorCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkJKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CiB9CiAKQEAgLTE4OTUsNiArMTkzOCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCUxQV0FWRUhEUiAJCWxwMzJXYXZlSW5IZHI7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblVucHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwpAQCAtMTkwNCw3ICsxOTQ4LDcgQEAKIAlVU0VSX0hFQVBfRlJFRShISVdPUkQoKERXT1JEKWxwMzJXYXZlSW5IZHItPmxwRGF0YSkpOwogCWxwMzJXYXZlSW5IZHItPmxwRGF0YSA9IE5VTEw7CiAJbHAzMldhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLQlyZXR1cm4gd2lkTWVzc2FnZSgwLCBXSURNX1VOUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9VTlBSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkJKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CiB9CiAKQEAgLTE5MTcsNiArMTk2MSw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCUxQV0FWRUhEUiAJCWxwMzJXYXZlSW5IZHI7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkFkZEJ1ZmZlciglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTE5MjYsNyArMTk3MSw3IEBACiAgICAgbHAzMldhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkFkZEJ1ZmZlciAvLyBscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKIAkJbHAzMldhdmVJbkhkci0+bHBEYXRhLCBscDMyV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKKwlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKIAkJCQkJCQkJKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CiB9CiAKQEAgLTE5MzcsMTAgKzE5ODIsMTEgQEAKIFVJTlQxNiB3YXZlSW5TdGFydChIV0FWRUlOMTYgaFdhdmVJbikKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblN0YXJ0KCUwNFgpXG4iLCBoV2F2ZUluKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd2lkTWVzc2FnZSgwLCBXSURNX1NUQVJULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CisJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fU1RBUlQsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogCkBAIC0xOTUwLDEwICsxOTk2LDExIEBACiBVSU5UMTYgd2F2ZUluU3RvcChIV0FWRUlOMTYgaFdhdmVJbikKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblN0b3AoJTA0WClcbiIsIGhXYXZlSW4pOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwotCXJldHVybiB3aWRNZXNzYWdlKDAsIFdJRE1fU1RPUCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOworCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX1NUT1AsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogCkBAIC0xOTYzLDEwICsyMDEwLDExIEBACiBVSU5UMTYgd2F2ZUluUmVzZXQoSFdBVkVJTjE2IGhXYXZlSW4pCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5SZXNldCglMDRYKVxuIiwgaFdhdmVJbik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOworCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIApAQCAtMTk3NiwxMCArMjAyNCwxMSBAQAogVUlOVDE2IHdhdmVJbkdldFBvc2l0aW9uKEhXQVZFSU4xNiBoV2F2ZUluLCBNTVRJTUUgKiBscFRpbWUsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkdldFBvc2l0aW9uKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFRpbWUsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd2lkTWVzc2FnZSgwLCBXSURNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLAorCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLAogCQkJICAoRFdPUkQpbHBUaW1lLCAoRFdPUkQpdVNpemUpOwogfQogCkBAIC0xOTg5LDggKzIwMzgsMTMgQEAKICovCiBVSU5UMTYgd2F2ZUluR2V0SUQoSFdBVkVJTjE2IGhXYXZlSW4sIFVJTlQxNiAqIGxwdURldmljZUlEKQogeworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0SURcbiIpOwotCWlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKKwlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOworCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCSpscHVEZXZpY2VJRCA9IGxwRGVzYy0+dURldmljZUlEOwogCXJldHVybiAwOwogfQogCkBAIC0yMDAyLDExICsyMDU2LDEyIEBACiAJCSAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCiAJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5NZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQkJaFdhdmVJbiwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7Ci0JcmV0dXJuIHdpZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKwlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KIAogCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IDU2ZTRlNDUuLmY5ZmEwYzUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC04Niw3ICs4Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlTdGFydE1NVGltZQkJCVtpbnRlcm5hbF0KICAqLwotdm9pZCBTdGFydE1NVGltZSgpCitzdGF0aWMgdm9pZCBTdGFydE1NVGltZSgpCiB7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKSB7CiAJbW1UaW1lU3RhcnRlZCA9IFRSVUU7CmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCA1MmYzZWY0Li5mZGI1OWQyIDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCXJldHVybiAwOwogICAgIH0KIAotICAgIHdpZHRoYnl0ZXMJPSBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzWDExKGJtcC0+Yml0bWFwLmJtV2lkdGgsYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwpOworICAgIHdpZHRoYnl0ZXMJPSBESUJfR2V0WEltYWdlV2lkdGhCeXRlcyhibXAtPmJpdG1hcC5ibVdpZHRoLGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsKTsKICAgICB0bXBidWZmZXIJPSAoTFBCWVRFKXhtYWxsb2Mod2lkdGhieXRlcypoZWlnaHQpOwogICAgIGltYWdlID0gWENyZWF0ZUltYWdlKCBkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKIAkJICBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCwgWlBpeG1hcCwgMCwgdG1wYnVmZmVyLApAQCAtMjIzLDggKzIyMywxMCBAQAogICAgICAgICAgICAgKnRidWYgPSAwOwogICAgICAgICAgICAgZm9yICh3PTA7dzxibXAtPmJpdG1hcC5ibVdpZHRoO3crKykKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHclOCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgKnRidWYgPSAwOwogICAgICAgICAgICAgICAgICp0YnVmIHw9IFhHZXRQaXhlbChpbWFnZSx3LGgpPDwoNy0odyY3KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCh3JjcpID09IDcpICooKyt0YnVmKSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCh3JjcpID09IDcpICsrdGJ1ZjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRidWYgKz0gcGFkOwogICAgICAgICB9CkBAIC0zNDgsNyArMzUwLDcgQEAKICAgICB9CiAgICAgc2J1ZiA9IChMUEJZVEUpYnVmZmVyOwogCi0gICAgd2lkdGhieXRlcwk9IERJQl9HZXRJbWFnZVdpZHRoQnl0ZXNYMTEoYm1wLT5iaXRtYXAuYm1XaWR0aCxibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCk7CisgICAgd2lkdGhieXRlcwk9IERJQl9HZXRYSW1hZ2VXaWR0aEJ5dGVzKGJtcC0+Yml0bWFwLmJtV2lkdGgsYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwpOwogICAgIHRtcGJ1ZmZlcgk9IChMUEJZVEUpeG1hbGxvYyh3aWR0aGJ5dGVzKmhlaWdodCk7CiAgICAgaW1hZ2UgPSBYQ3JlYXRlSW1hZ2UoIGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLAogCQkgIGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsLCBaUGl4bWFwLCAwLCB0bXBidWZmZXIsCmRpZmYgLS1naXQgYS9vYmplY3RzL2NvbG9yLmMgYi9vYmplY3RzL2NvbG9yLmMKaW5kZXggOTQzYjFkYS4uMzQ0MmQ5MSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jb2xvci5jCisrKyBiL29iamVjdHMvY29sb3IuYwpAQCAtNDAsNiArNDAsOCBAQAogICAgIENvbG9ybWFwICAgIGNvbG9yTWFwOwogICAgIFVJTlQxNiAgICAgIHNpemU7CiAgICAgVUlOVDE2ICAgICAgZmxhZ3M7CisgICAgSU5UMzIJbW9ub1BsYW5lOwkgLyogYml0IHBsYW5lIGRpZmZlcmVudCBmb3Igd2hpdGUgYW5kIGJsYWNrIHBpeGVscyAqLworICAgIEJPT0wzMgliV2hpdGVPbjsJIC8qIG1vbm9QbGFuZSBiaXQgaXMgMSBmb3IgdGhlIHdoaXRlIHBpeGVsICovCiB9IENTUEFDRTsKIAogc3RhdGljIENTUEFDRSBjU3BhY2UgPSB7MCwgMCwgMH07CkBAIC0xMjUsNiArMTI3LDEyIEBACiAgICAgcmV0dXJuIGNTcGFjZS5jb2xvck1hcDsKIH0KIAorQk9PTDMyIENPTE9SX0dldE1vbm9QbGFuZShJTlQzMiogcGxhbmUpCit7CisgICAgKnBsYW5lID0gY1NwYWNlLm1vbm9QbGFuZTsKKyAgICByZXR1cm4gKGNTcGFjZS5mbGFncyAmIENPTE9SX1dISVRFU0VUKSA/IFRSVUUgOiBGQUxTRTsKK30KKwogVUlOVDE2IENPTE9SX0dldFN5c3RlbVBhbGV0dGVTaXplKHZvaWQpCiB7CiAgICAgcmV0dXJuIChjU3BhY2UuZmxhZ3MgJiBDT0xPUl9QUklWQVRFKSA/IGNTcGFjZS5zaXplIDogMjU2OwpAQCAtNTM3LDEwICs1NDUsNiBAQAogCiAgICAgbWVtc2V0KENPTE9SX2ZyZWVMaXN0LCAwLCAyNTYqc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKIAotICAgIC8qIGNhbGN1bGF0ZSBtYXggcGFsZXR0ZSBzaXplICovCi0KLSAgICBjU3BhY2Uuc2l6ZSA9IHZpc3VhbC0+bWFwX2VudHJpZXM7Ci0KICAgICBpZiAoY1NwYWNlLmZsYWdzICYgQ09MT1JfUFJJVkFURSkKIAlDT0xPUl9CdWlsZFByaXZhdGVNYXAoICZjU3BhY2UgKTsKICAgICBlbHNlCkBAIC02MTAsMTAgKzYxNCwyMCBAQAogICovCiBIUEFMRVRURTE2IENPTE9SX0luaXQodm9pZCkKIHsKKyAgICBpbnQJbWFzaywgd2hpdGUsIGJsYWNrOworCiAgICAgdmlzdWFsID0gRGVmYXVsdFZpc3VhbCggZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSApOwogCiAgICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiQ09MT1JfSW5pdDogaW5pdGlhbGl6aW5nIHBhbGV0dGUgbWFuYWdlci4uLiIpOwogCisgICAgd2hpdGUgPSBXaGl0ZVBpeGVsT2ZTY3JlZW4oIHNjcmVlbiApOworICAgIGJsYWNrID0gQmxhY2tQaXhlbE9mU2NyZWVuKCBzY3JlZW4gKTsKKyAgICBjU3BhY2UubW9ub1BsYW5lID0gMTsKKyAgICBmb3IoIG1hc2sgPSAxOyAhKCh3aGl0ZSAmIG1hc2spXihibGFjayAmIG1hc2spKTsgbWFzayA8PD0gMSApCisJIGNTcGFjZS5tb25vUGxhbmUrKzsKKyAgICBjU3BhY2UuZmxhZ3MgPSAod2hpdGUgJiBtYXNrKSA/IENPTE9SX1dISVRFU0VUIDogMDsKKyAgICBjU3BhY2Uuc2l6ZSA9IHZpc3VhbC0+bWFwX2VudHJpZXM7CisKICAgICBzd2l0Y2godmlzdWFsLT5jbGFzcykKICAgICB7CiAgICAgY2FzZSBEaXJlY3RDb2xvcjoKQEAgLTYyNCwxOCArNjM4LDIzIEBACiAJewogCSAgICBYU2V0V2luZG93QXR0cmlidXRlcyB3aW5fYXR0cjsKIAotCSAgICBjU3BhY2UuZmxhZ3MgfD0gQ09MT1JfUFJJVkFURTsKIAkgICAgY1NwYWNlLmNvbG9yTWFwID0gWENyZWF0ZUNvbG9ybWFwKCBkaXNwbGF5LCByb290V2luZG93LAogCQkJCQkJIHZpc3VhbCwgQWxsb2NBbGwgKTsKIAkgICAgaWYgKGNTcGFjZS5jb2xvck1hcCkKIAkgICAgewotCSAgICAgICBpZiggcm9vdFdpbmRvdyAhPSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSApCi0JICAgICAgICAgeworCSAgICAgICAgY1NwYWNlLmZsYWdzIHw9IChDT0xPUl9QUklWQVRFIHwgQ09MT1JfV0hJVEVTRVQpOworCisJCWNTcGFjZS5tb25vUGxhbmUgPSAxOworCQlmb3IoIHdoaXRlID0gY1NwYWNlLnNpemUgLSAxOyAhKHdoaXRlICYgMSk7IHdoaXRlID4+PSAxICkKKwkJICAgICBjU3BhY2UubW9ub1BsYW5lKys7CisKKwkgICAgICAgIGlmKCByb290V2luZG93ICE9IERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpICkKKwkgICAgICAgIHsKIAkJICAgIHdpbl9hdHRyLmNvbG9ybWFwID0gY1NwYWNlLmNvbG9yTWFwOwogCQkgICAgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoIGRpc3BsYXksIHJvb3RXaW5kb3csCiAJCQkJCSBDV0NvbG9ybWFwLCAmd2luX2F0dHIgKTsKLQkJIH0KLQkgICAgICAgYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJICAgIH0KIAl9CiAJY1NwYWNlLmNvbG9yTWFwID0gRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oIHNjcmVlbiApOwpAQCAtNjU4LDcgKzY3Nyw4IEBACiAJYnJlYWs7CQogICAgIH0KIAotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIiB2aXN1YWwgY2xhc3MgJWlcbiIsIHZpc3VhbC0+Y2xhc3MpOworICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIiB2aXN1YWwgY2xhc3MgJWkgKCVpKVxuIiwgCisJCSAgICB2aXN1YWwtPmNsYXNzLCBjU3BhY2UubW9ub1BsYW5lKTsKIAogICAgIHJldHVybiBDT0xPUl9Jbml0UGFsZXR0ZSgpOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jdXJzb3JpY29uLmMgYi9vYmplY3RzL2N1cnNvcmljb24uYwppbmRleCA3MjEyMDg1Li5lOGE5NTM3IDEwMDY0NAotLS0gYS9vYmplY3RzL2N1cnNvcmljb24uYworKysgYi9vYmplY3RzL2N1cnNvcmljb24uYwpAQCAtNyw2ICs3LDggQEAKIC8qCiAgKiBUaGVvcnk6CiAgKgorICogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3dpbjMyZGV2L3VpL2ljb25zLmh0bQorICoKICAqIEN1cnNvcnMgYW5kIGljb25zIGFyZSBzdG9yZWQgaW4gYSBnbG9iYWwgaGVhcCBibG9jaywgd2l0aCB0aGUKICAqIGZvbGxvd2luZyBsYXlvdXQ6CiAgKgpAQCAtMzMsNyArMzUsNiBAQAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAidGFzay5oIgogCiBleHRlcm4gVUlOVDE2IENPTE9SX0dldFN5c3RlbVBhbGV0dGVTaXplKCk7CkBAIC0yMzcsMTQgKzIzOCwxNSBAQAogSEdMT0JBTDE2IENVUlNPUklDT05fTG9hZEhhbmRsZXIoIEhHTE9CQUwxNiBoYW5kbGUsIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZkN1cnNvciApCiB7Ci0gICAgSEJJVE1BUDMyIGhBbmRCaXRzLCBoWG9yQml0czsKLSAgICBIREMzMiBoZGM7Ci0gICAgaW50IHNpemUsIHNpemVBbmQsIHNpemVYb3I7Ci0gICAgUE9JTlQxNiBob3RzcG90ID0geyAwICwwIH07CisgICAgc3RhdGljIGNoYXIqIF9fbG9hZGhhbmRsZXJTdHIgPSAiQ1VSU09SSUNPTl9Mb2FkSGFuZGxlciI7CisKKyAgICBpbnQgc2l6ZUFuZCwgc2l6ZVhvcjsKKyAgICBIQklUTUFQMzIgaEFuZEJpdHMgPSAwLCBoWG9yQml0cyA9IDA7IC8qIGVycm9yIGNvbmRpdGlvbiBmb3IgbGF0ZXIgKi8KICAgICBCSVRNQVBPQkogKmJtcFhvciwgKmJtcEFuZDsKLSAgICBCSVRNQVBJTkZPICpibWksICpwSW5mbzsKKyAgICBQT0lOVDE2IGhvdHNwb3QgPSB7IDAgLDAgfTsKICAgICBDVVJTT1JJQ09OSU5GTyAqaW5mbzsKLSAgICBjaGFyICpiaXRzOworICAgIEJJVE1BUElORk8gKmJtaTsKKyAgICBIREMzMiBoZGM7CiAKICAgICBpZiAoZkN1cnNvcikgIC8qIElmIGN1cnNvciwgZ2V0IHRoZSBob3RzcG90ICovCiAgICAgewpAQCAtMjU0LDg3ICsyNTYsODEgQEAKICAgICB9CiAgICAgZWxzZSBibWkgPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZTE2KCBoYW5kbGUgKTsKIAotICAgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJpdG1hcCBoZWFkZXIgKi8KKyAgICAvKiBDaGVjayBiaXRtYXAgaGVhZGVyICovCiAKLSAgICBzaXplID0gRElCX0JpdG1hcEluZm9TaXplKCBibWksIERJQl9SR0JfQ09MT1JTICk7Ci0gICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgdGhlIG1vbm9jaHJvbWUgYml0bWFwIGxhdGVyIG9uICovCi0gICAgc2l6ZSA9IE1BWCggc2l6ZSwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgMipzaXplb2YoUkdCUVVBRCkgKTsKLSAgICBwSW5mbyA9IChCSVRNQVBJTkZPICopeG1hbGxvYyggc2l6ZSApOwotICAgIG1lbWNweSggcEluZm8sIGJtaSwgc2l6ZSApOwotCi0gICAgaWYgKHBJbmZvLT5ibWlIZWFkZXIuYmlTaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKKyAgICBpZiAoIChibWktPmJtaUhlYWRlci5iaVNpemUgIT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKSAmJgorCSAoYm1pLT5ibWlIZWFkZXIuYmlTaXplICE9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSAgfHwKKwkgIGJtaS0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gIT0gQklfUkdCKSApCiAgICAgewotICAgICAgICBpZiAocEluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uICE9IEJJX1JHQikKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gc2l6ZSBmb3IgY29tcHJlc3NlZCBpY29uIGJpdG1hcC5cbiIpOwotICAgICAgICAgICAgZnJlZSggcEluZm8gKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHBJbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQgLz0gMjsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IGludmFsaWQgYml0bWFwIGhlYWRlci5cbiIsIF9fbG9hZGhhbmRsZXJTdHIpOworICAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBlbHNlIGlmIChwSW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQQ09SRUhFQURFUikpCisKKyAgICBpZiggKGhkYyA9IEdldERDMzIoIDAgKSkgKQogICAgIHsKLSAgICAgICAgQklUTUFQQ09SRUhFQURFUiAqY29yZSA9IChCSVRNQVBDT1JFSEVBREVSICopcEluZm87Ci0gICAgICAgIGNvcmUtPmJjSGVpZ2h0IC89IDI7CisJQklUTUFQSU5GTyogcEluZm87CisgICAgICAgIElOVDMyIHNpemUgPSBESUJfQml0bWFwSW5mb1NpemUoIGJtaSwgRElCX1JHQl9DT0xPUlMgKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSByb29tIGZvciB0aGUgbW9ub2Nocm9tZSBiaXRtYXAgbGF0ZXIgb24uCisJICogTm90ZSB0aGF0IEJJVE1BUElORk9JTkZPIGFuZCBCSVRNQVBDT1JFSEVBREVSIGFyZSB0aGUgc2FtZQorCSAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGJpQml0Q291bnQuIEluLW1lbW9yeSBpY29uIHJlc291cmNlIAorCSAqIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgorCSAqCisJICogICBCSVRNQVBJTkZPSEVBREVSICAgaWNIZWFkZXIgIC8vIERJQiBoZWFkZXIKKwkgKiAgIFJHQlFVQUQgICAgICAgICBpY0NvbG9yc1tdICAgLy8gQ29sb3IgdGFibGUKKyAgCSAqICAgQllURSAgICAgICAgICAgIGljWE9SW10gICAgICAvLyBESUIgYml0cyBmb3IgWE9SIG1hc2sKKwkgKiAgIEJZVEUgICAgICAgICAgICBpY0FORFtdICAgICAgLy8gRElCIGJpdHMgZm9yIEFORCBtYXNrCisJICovCisKKyAgICAJaWYoIChwSW5mbyA9IChCSVRNQVBJTkZPICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAKKwkJCSAgTUFYKHNpemUsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIDIqc2l6ZW9mKFJHQlFVQUQpKSkpICkKKwl7CQorCSAgICBtZW1jcHkoIHBJbmZvLCBibWksIHNpemUgKTsJCisJICAgIHBJbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQgLz0gMjsKKworCSAgICAvKiBDcmVhdGUgdGhlIFhPUiBiaXRtYXAgKi8KKworCSAgICBoWG9yQml0cyA9IENyZWF0ZURJQml0bWFwMzIoIGhkYywgJnBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJtaSArIHNpemUsIHBJbmZvLCBESUJfUkdCX0NPTE9SUyApOworCSAgICBpZiggaFhvckJpdHMgKQorCSAgICB7CisJCWNoYXIqIGJpdHMgPSAoY2hhciAqKWJtaSArIHNpemUgKyBibWktPmJtaUhlYWRlci5iaUhlaWdodCAqCisJCQkJRElCX0dldERJQldpZHRoQnl0ZXMoYm1pLT5ibWlIZWFkZXIuYmlXaWR0aCwKKwkJCQkJCSAgICAgYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgLyAyOworCisJCXBJbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDE7CisJICAgICAgICBpZiAocEluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQorCSAgICAgICAgeworCSAgICAgICAgICAgIFJHQlFVQUQgKnJnYiA9IHBJbmZvLT5ibWlDb2xvcnM7CisKKwkgICAgICAgICAgICBwSW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCA9IHBJbmZvLT5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgPSAyOworCSAgICAgICAgICAgIHJnYlswXS5yZ2JCbHVlID0gcmdiWzBdLnJnYkdyZWVuID0gcmdiWzBdLnJnYlJlZCA9IDB4MDA7CisJICAgICAgICAgICAgcmdiWzFdLnJnYkJsdWUgPSByZ2JbMV0ucmdiR3JlZW4gPSByZ2JbMV0ucmdiUmVkID0gMHhmZjsKKwkgICAgICAgICAgICByZ2JbMF0ucmdiUmVzZXJ2ZWQgPSByZ2JbMV0ucmdiUmVzZXJ2ZWQgPSAwOworCSAgICAgICAgfQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCSAgICAgICAgICAgIFJHQlRSSVBMRSAqcmdiID0gKFJHQlRSSVBMRSAqKSgoKEJJVE1BUENPUkVIRUFERVIgKilwSW5mbykgKyAxKTsKKworCSAgICAgICAgICAgIHJnYlswXS5yZ2J0Qmx1ZSA9IHJnYlswXS5yZ2J0R3JlZW4gPSByZ2JbMF0ucmdidFJlZCA9IDB4MDA7CisJICAgICAgICAgICAgcmdiWzFdLnJnYnRCbHVlID0gcmdiWzFdLnJnYnRHcmVlbiA9IHJnYlsxXS5yZ2J0UmVkID0gMHhmZjsKKwkgICAgICAgIH0KKworCSAgICAgICAgLyogQ3JlYXRlIHRoZSBBTkQgYml0bWFwICovCisKKwkgICAgICAgIGhBbmRCaXRzID0gQ3JlYXRlRElCaXRtYXAzMiggaGRjLCAmcEluZm8tPmJtaUhlYWRlciwgQ0JNX0lOSVQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIHBJbmZvLCBESUJfUkdCX0NPTE9SUyApOworCQlpZiggIWhBbmRCaXRzICkgRGVsZXRlT2JqZWN0MzIoIGhYb3JCaXRzICk7CisJICAgIH0KKwkgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBJbmZvICk7IAorCX0KKwlSZWxlYXNlREMzMiggMCwgaGRjICk7CiAgICAgfQotICAgIGVsc2UKKworICAgIGlmKCAhaFhvckJpdHMgfHwgIWhBbmRCaXRzICkgCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDVVJTT1JJQ09OX0xvYWQ6IFVua25vd24gYml0bWFwIGxlbmd0aCAlbGQhXG4iLAotICAgICAgICAgICAgICAgICBwSW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSApOwotICAgICAgICBmcmVlKCBwSW5mbyApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBDcmVhdGUgdGhlIFhPUiBiaXRtYXAgKi8KLQotICAgIGlmICghKGhkYyA9IEdldERDMzIoIDAgKSkpCi0gICAgewotICAgICAgICBmcmVlKCBwSW5mbyApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBoWG9yQml0cyA9IENyZWF0ZURJQml0bWFwMzIoIGhkYywgJnBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJtaSArIHNpemUsIHBJbmZvLCBESUJfUkdCX0NPTE9SUyApOwotICAgIGlmICghaFhvckJpdHMpIHsKLSAgICAgICAgZnJlZSggcEluZm8gKTsKLSAgICAJUmVsZWFzZURDMzIoIDAsIGhkYyApOwotICAgIAlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBGaXggdGhlIGJpdG1hcCBoZWFkZXIgdG8gbG9hZCB0aGUgbW9ub2Nocm9tZSBtYXNrICovCi0KLSAgICBpZiAocEluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQotICAgIHsKLSAgICAgICAgQklUTUFQSU5GT0hFQURFUiAqYmloID0gJnBJbmZvLT5ibWlIZWFkZXI7Ci0gICAgICAgIFJHQlFVQUQgKnJnYiA9IHBJbmZvLT5ibWlDb2xvcnM7Ci0gICAgICAgIGJpdHMgPSAoY2hhciAqKWJtaSArIHNpemUgKwotICAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlcyhiaWgtPmJpV2lkdGgsYmloLT5iaUJpdENvdW50KSpiaWgtPmJpSGVpZ2h0OwotICAgICAgICBiaWgtPmJpQml0Q291bnQgPSAxOwotICAgICAgICBiaWgtPmJpQ2xyVXNlZCA9IGJpaC0+YmlDbHJJbXBvcnRhbnQgPSAyOwotICAgICAgICByZ2JbMF0ucmdiQmx1ZSA9IHJnYlswXS5yZ2JHcmVlbiA9IHJnYlswXS5yZ2JSZWQgPSAweDAwOwotICAgICAgICByZ2JbMV0ucmdiQmx1ZSA9IHJnYlsxXS5yZ2JHcmVlbiA9IHJnYlsxXS5yZ2JSZWQgPSAweGZmOwotICAgICAgICByZ2JbMF0ucmdiUmVzZXJ2ZWQgPSByZ2JbMV0ucmdiUmVzZXJ2ZWQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBCSVRNQVBDT1JFSEVBREVSICpiY2ggPSAoQklUTUFQQ09SRUhFQURFUiAqKXBJbmZvOwotICAgICAgICBSR0JUUklQTEUgKnJnYiA9IChSR0JUUklQTEUgKikoYmNoICsgMSk7Ci0gICAgICAgIGJpdHMgPSAoY2hhciAqKWJtaSArIHNpemUgKwotICAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlcyhiY2gtPmJjV2lkdGgsYmNoLT5iY0JpdENvdW50KSpiY2gtPmJjSGVpZ2h0OwotICAgICAgICBiY2gtPmJjQml0Q291bnQgPSAxOwotICAgICAgICByZ2JbMF0ucmdidEJsdWUgPSByZ2JbMF0ucmdidEdyZWVuID0gcmdiWzBdLnJnYnRSZWQgPSAweDAwOwotICAgICAgICByZ2JbMV0ucmdidEJsdWUgPSByZ2JbMV0ucmdidEdyZWVuID0gcmdiWzFdLnJnYnRSZWQgPSAweGZmOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSB0aGUgQU5EIGJpdG1hcCAqLwotCi0gICAgaEFuZEJpdHMgPSBDcmVhdGVESUJpdG1hcDMyKCBoZGMsICZwSW5mby0+Ym1pSGVhZGVyLCBDQk1fSU5JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsIHBJbmZvLCBESUJfUkdCX0NPTE9SUyApOwotICAgIFJlbGVhc2VEQzMyKCAwLCBoZGMgKTsKLSAgICBpZiAoIWhBbmRCaXRzKSB7Ci0gICAgICAgIERlbGV0ZU9iamVjdDMyKCBoWG9yQml0cyApOwotICAgICAgICBmcmVlKCBwSW5mbyApOwotICAgIAlyZXR1cm4gMDsKKwlmcHJpbnRmKHN0ZGVyciwiJXM6IHVuYWJsZSB0byBjcmVhdGUgYSBiaXRtYXAuXG4iLCBfX2xvYWRoYW5kbGVyU3RyICk7CisJcmV0dXJuIDA7CiAgICAgfQogCiAgICAgLyogTm93IGNyZWF0ZSB0aGUgQ1VSU09SSUNPTklORk8gc3RydWN0dXJlICovCkBAIC00NTEsMTIgKzQ0NywxMiBAQAogIEhUQVNLMTYgCSBoVGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgVERCKiAgCQkgcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KGhUYXNrKTsKIAotIGlmKGhJY29uKQorIGlmKGhJY29uICYmIHBUYXNrKQogICAgIGlmICghKHB0ciA9IChDVVJTT1JJQ09OSU5GTyopR2xvYmFsTG9jazE2KCBoSWNvbiApKSkgcmV0dXJuIEZBTFNFOwogICAgICAgIGlmIChwdHItPmJQbGFuZXMgKiBwdHItPmJCaXRzUGVyUGl4ZWwgPT0gMSkKICAgICAgICAgICAgaFJldCA9IENVUlNPUklDT05fQ29weSggcFRhc2stPmhJbnN0YW5jZSwgaEljb24gKTsKICAgICAgICBlbHNlCi0gICAgICAgICAgeworICAgICAgIHsKICAgICAgICAgICAgQllURSAgcEFuZEJpdHNbMTI4XTsKICAgICAgICAgICAgQllURSAgcFhvckJpdHNbMTI4XTsKIAkgICBpbnQgICB4LCB5LCBpeCwgaXksIHNoaWZ0OyAKQEAgLTQ3MSw4ICs0NjcsNiBAQAogICAgICAgICAgICBDT0xPUlJFRiAgICAgICBjb2w7CiAgICAgICAgICAgIENVUlNPUklDT05JTkZPIGNJOwogCi0gICAgICAgICAgIGlmKCFwVGFzaykgcmV0dXJuIDA7Ci0KICAgICAgICAgICAgbWVtc2V0KHBYb3JCaXRzLCAwLCAxMjgpOwogICAgICAgICAgICBjSS5iQml0c1BlclBpeGVsID0gMTsgY0kuYlBsYW5lcyA9IDE7CiAgICAgICAgICAgIGNJLnB0SG90U3BvdC54ID0gY0kucHRIb3RTcG90LnkgPSAxNTsKQEAgLTUxOSw3ICs1MTMsNyBAQAogICAgICAgICAgICAgICAgIGhSZXQgPSBDVVJTT1JJQ09OX0NvcHkoIHBUYXNrLT5oSW5zdGFuY2UgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSU09SSUNPTl9Mb2FkKDAsTUFLRUlOVFJFU09VUkNFKE9DUl9EUkFHT0JKRUNUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWENVUlNPUiwgU1lTTUVUUklDU19DWUNVUlNPUiwgMSwgVFJVRSkgKTsKLSAgICAgICAgICB9CisgICAgICAgfQogCiAgcmV0dXJuIGhSZXQ7CiB9CkBAIC0xMTQ5LDMgKzExNDMsOCBAQAogICAgICAgfQogICAgIHJldHVybiBDVVJTT1JJQ09OX0xvYWRIYW5kbGVyKCBoUmVzb3VyY2UsIDAsIEZBTFNFKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldEljb25JbmZvCQkoVVNFUjMyLjI0MSkKKyAqLworCmRpZmYgLS1naXQgYS9vYmplY3RzL2RpYi5jIGIvb2JqZWN0cy9kaWIuYwppbmRleCAwZWI3OGYwLi5hOTUxNzQ1IDEwMDY0NAotLS0gYS9vYmplY3RzL2RpYi5jCisrKyBiL29iamVjdHMvZGliLmMKQEAgLTE4LDUzICsxOCw1MSBAQAogCiBleHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbihEQyogKTsKIAorc3RhdGljIGludAliaXRtYXBEZXB0aFRhYmxlW10gPSB7IDgsIDEsIDMyLCAxNiwgMjQsIDE1LCA0LCAwIH07CitzdGF0aWMgaW50CXhpbWFnZURlcHRoVGFibGVbXSA9IHsgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAgfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlc1gxMQotICoKLSAqIFJldHVybiB0aGUgd2lkdGggb2YgYW4gWCBpbWFnZSBpbiBieXRlcworICogICAgICAgICAgIERJQl9Jbml0CiAgKi8KLWludCBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzWDExKCBpbnQgd2lkdGgsIGludCBkZXB0aCApCitCT09MMzIgRElCX0luaXQoKQogewotICAgIGludAkJd2JpdHM7Ci0gICAgWEltYWdlCSp0ZXN0aW1hZ2U7CisgICAgaW50CQlpOworICAgIFhJbWFnZSoJdGVzdGltYWdlOwogCi0jZGVmaW5lIERFUFRIQ0FTRShkZXB0aCkgCQkJCQkJXAotICAgIGNhc2UgZGVwdGg6IHsJCQkJCQkJXAotCXN0YXRpYyBpbnQgdyMjZGVwdGggPSAwOwkJCQkJXAotCWlmICghIHcjI2RlcHRoICkgewkJCQkJCVwKLQkgICAgdGVzdGltYWdlPVhDcmVhdGVJbWFnZShkaXNwbGF5LERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLFwKLQkJICAgZGVwdGgsWlBpeG1hcCwwLE5VTEwsMSwxLDMyLDIwKTsJCQlcCi0JICAgIHcjI2RlcHRoID0gdGVzdGltYWdlLT5iaXRzX3Blcl9waXhlbDsJCQlcCi0JICAgIFhEZXN0cm95SW1hZ2UodGVzdGltYWdlKTsJCQkJCVwKLQl9CQkJCQkJCQlcCi0Jd2JpdHMgPSB3aWR0aCp3IyNkZXB0aDsJCQkJCQlcCi0JYnJlYWs7CQkJCQkJCQlcCi0gICAgfQotCi0gICAgc3dpdGNoKGRlcHRoKQorICAgIGZvciggaSA9IDA7IGJpdG1hcERlcHRoVGFibGVbaV07IGkrKyApCiAgICAgewotICAgIAlERVBUSENBU0UoMSk7Ci0JREVQVEhDQVNFKDQpOwotCURFUFRIQ0FTRSg4KTsKLQlERVBUSENBU0UoMTUpOwotCURFUFRIQ0FTRSgxNik7Ci0JREVQVEhDQVNFKDI0KTsKLQlERVBUSENBU0UoMzIpOwotCWRlZmF1bHQ6Ci0gICAgICAgIAlmcHJpbnRmKHN0ZGVyciwgIkRJQjogdW5zdXBwb3J0ZWQgZGVwdGggJWQuXG4iLCBkZXB0aCApOwotCS8qIGFzc3VtZSAzMiBiaXRzL3BpeGVsICovCi0JICAgICAgICB3Yml0cyA9IHdpZHRoKjMyOwotCQlicmVhazsKKwkgdGVzdGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLAorCQkJIGJpdG1hcERlcHRoVGFibGVbaV0sIFpQaXhtYXAsIDAsIE5VTEwsIDEsIDEsIDMyLCAyMCApOworCSBpZiggdGVzdGltYWdlICkgeGltYWdlRGVwdGhUYWJsZVtpXSA9IHRlc3RpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CisJIGVsc2UgcmV0dXJuIEZBTFNFOworCSBYRGVzdHJveUltYWdlKHRlc3RpbWFnZSk7CiAgICAgfQotICAgIHJldHVybiA0ICogKCh3Yml0cyszMSkvMzIpOworICAgIHJldHVybiBUUlVFOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBESUJfR2V0SW1hZ2VXaWR0aEJ5dGVzCisgKiAgICAgICAgICAgRElCX0dldFhJbWFnZVdpZHRoQnl0ZXMKICAqCiAgKiBSZXR1cm4gdGhlIHdpZHRoIG9mIGFuIFggaW1hZ2UgaW4gYnl0ZXMKICAqLwotaW50IERJQl9HZXRJbWFnZVdpZHRoQnl0ZXMoIGludCB3aWR0aCwgaW50IGRlcHRoICkKK2ludCBESUJfR2V0WEltYWdlV2lkdGhCeXRlcyggaW50IHdpZHRoLCBpbnQgZGVwdGggKQoreworICAgIGludAkJaTsKKworICAgIGZvciggaSA9IDA7IGJpdG1hcERlcHRoVGFibGVbaV0gOyBpKysgKQorCSBpZiggYml0bWFwRGVwdGhUYWJsZVtpXSA9PSBkZXB0aCApCisJICAgICByZXR1cm4gKDQgKiAoKHdpZHRoICogeGltYWdlRGVwdGhUYWJsZVtpXSArIDMxKS8zMikpOworICAgIGZwcmludGYoc3RkZXJyLCAiRElCOiB1bnN1cHBvcnRlZCBkZXB0aCAlZC5cbiIsIGRlcHRoICk7CisgICAgcmV0dXJuICg0ICogd2lkdGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESUJfR2V0RElCV2lkdGhCeXRlcworICoKKyAqIFJldHVybiB0aGUgd2lkdGggb2YgYSBESUIgYml0bWFwIGluIGJ5dGVzLiBESUIgYml0bWFwIGRhdGEgaXMgMzItYml0IGFsaWduZWQuCisgKiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNkbi9zZGsvcGxhdGZvcm1zL2RvYy9zZGsvd2luMzIvc3RydWMvc3JjL3N0cjAxLmh0bQorICovCitpbnQgRElCX0dldERJQldpZHRoQnl0ZXMoIGludCB3aWR0aCwgaW50IGRlcHRoICkKIHsKICAgICBpbnQgd29yZHM7CiAKQEAgLTkwLDcgKzg4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERJQl9CaXRtYXBJbmZvU2l6ZQogICoKLSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYml0bWFwIGluZm8gc3RydWN0dXJlLgorICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAgaW5mbyBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGNvbG9yIHRhYmxlLgogICovCiBpbnQgRElCX0JpdG1hcEluZm9TaXplKCBCSVRNQVBJTkZPICogaW5mbywgV09SRCBjb2xvcnVzZSApCiB7CkBAIC03OTEsNiArNzg5LDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0RElCaXRzMzIgICAgKEdESTMyLjE3MCkKKyAqCisgKiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNkbi9zZGsvcGxhdGZvcm1zL2RvYy9zZGsvd2luMzIvZnVuYy9zcmMvZjMwXzE0Lmh0bQogICovCiBJTlQzMiBHZXRESUJpdHMzMiggSERDMzIgaGRjLCBIQklUTUFQMzIgaGJpdG1hcCwgVUlOVDMyIHN0YXJ0c2NhbiwKICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbGluZXMsIExQU1RSIGJpdHMsIEJJVE1BUElORk8gKiBpbmZvLApAQCAtODY0LDcgKzg2NCw3IEBACiAJc3dpdGNoKCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCApCiAJewogCSAgIGNhc2UgODoKLQkJLyogcGFkIHVwIHRvIDMyIGJpdCAoRklYTUU6IG5vdCAxNj8gKSAqLworCQkvKiBwYWQgdXAgdG8gMzIgYml0ICovCiAJCXBhZCArPSAoNCAtIChpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCAmIDMpKSAmIDM7CiAJCWZvciggeSA9IHllbmQgLSAxOyAoaW50KXkgPj0gKGludClzdGFydHNjYW47IHktLSApCiAJCXsKQEAgLTk1Myw4ICs5NTMsOCBAQAogCWluZm8tPmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CiAJaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbDsKIAlpbmZvLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSBibXAtPmJpdG1hcC5ibUhlaWdodCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9HZXRJbWFnZVdpZHRoQnl0ZXMoIGJtcC0+Yml0bWFwLmJtV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9HZXRESUJXaWR0aEJ5dGVzKCBibXAtPmJpdG1hcC5ibVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgKTsKIAlpbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IDA7CiAgICAgfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCA0NDIyZWQ4Li44OWFhZDY1IDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTE1NiwxMCArMTU2LDEyIEBACiB7CiAgICAgSFBBTEVUVEUxNiBocGFsZXR0ZTsKICAgICBleHRlcm4gQk9PTDMyIFgxMURSVl9Jbml0KHZvaWQpOworICAgIGV4dGVybiBCT09MMzIgRElCX0luaXQodm9pZCk7CiAKICAgICAvKiBJbml0aWFsaXplIGRyaXZlcnMgKi8KIAogICAgIGlmICghWDExRFJWX0luaXQoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghRElCX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAvKiBDcmVhdGUgZGVmYXVsdCBwYWxldHRlICovCiAKZGlmZiAtLWdpdCBhL29iamVjdHMvbWV0YWZpbGUuYyBiL29iamVjdHMvbWV0YWZpbGUuYwppbmRleCA0MDJlMGFhLi41YzVkYTk5IDEwMDY0NAotLS0gYS9vYmplY3RzL21ldGFmaWxlLmMKKysrIGIvb2JqZWN0cy9tZXRhZmlsZS5jCkBAIC02MDcsMzAgKzYwNywzOCBAQAogICAgIGNhc2UgTUVUQV9FWFRURVhUT1VUOgogICAgICAgewogICAgICAgICBMUElOVDE2IGR4eDsKKwlMUFNUUiBzb3Q7IAogICAgICAgICBEV09SRCBsZW47CiAKICAgICAgICAgczEgPSBtci0+cmRQYXJhbVsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdHJpbmcgbGVuZ3RoICovCiAgICAgICAgIGxlbiA9IHNpemVvZihNRVRBUkVDT1JEKSArICgoKHMxICsgMSkgPj4gMSkgKiAyKSArIDIgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICArIHNpemVvZihVSU5UMTYpICsgc2l6ZW9mKFJFQ1QxNik7Ci0gICAgICAgIGlmIChtci0+cmRTaXplID09IGxlbiAvIDIpCi0gICAgICAgICAgZHh4ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBhcnJheSBwcmVzZW50ICovCi0gICAgICAgIGVsc2UgaWYgKG1yLT5yZFNpemUgPT0gKGxlbiArIHMxICogc2l6ZW9mKElOVDE2KSkgLyAyKQotICAgICAgICAgIGR4eCA9ICZtci0+cmRQYXJhbVs4KyhzMSsxKS8yXTsgICAgICAgICAgICAgICAgLyogc3RhcnQgb2YgYXJyYXkgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICJQbGF5TWV0YUZpbGVSZWNvcmQgRXh0VGV4dE91dCBtci0+cmRTaXplID0gJTA4bHgsIGNvdW50ID0gJXhcbiIsCi0gICAgICAgICAgIG1yLT5yZFNpemUsIHMxKTsKLSAgICAgICAgICBkeHggPSBOVUxMOwotICAgICAgICB9CisJICsgc2l6ZW9mKFVJTlQxNikgKyAgKG1yLT5yZFBhcmFtWzNdID8gc2l6ZW9mKFJFQ1QxNikgOiAwKTsgIC8qIHJlYyBsZW4gd2l0aG91dCBkeCBhcnJheSAqLworCisJc290PSAoTFBTVFIpJm1yLT5yZFBhcmFtWzRdOwkJCS8qIHN0YXJ0X29mX3RleHQgKi8KKwlpZiAobXItPnJkUGFyYW1bM10pCisJICAgc290Kz1zaXplb2YoUkVDVDE2KTsJCQkJLyogdGhlcmUgaXMgYSByZWN0YW5nbGUsIHNvIGFkZCBvZmZzZXQgKi8KKwkgCisJaWYgKG1yLT5yZFNpemUgPT0gbGVuIC8gMikKKyAgICAgICAgICBkeHggPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGlmIGFycmF5IHByZXNlbnQgKi8KKyAgICAgICAgZWxzZSAKKwkgIGlmIChtci0+cmRTaXplID09IChsZW4gKyBzMSAqIHNpemVvZihJTlQxNikpIC8gMikKKyAgICAgICAgICAgIGR4eCA9IChMUElOVDE2KShzb3QrKCgoczErMSk+PjEpKjIpKTsJICAgCisgICAgICAgICAgZWxzZSAKKwkgIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisJICAgICAiUGxlYXNlIHJlcG9ydDogUGxheU1ldGFGaWxlL0V4dFRleHRPdXQgbGVuPSVsZCBzbGVuPSVkIHJkU2l6ZT0lbGQgb3B0PSUwNHhcbiIsCisJCSAgIGxlbixzMSxtci0+cmRTaXplLG1yLT5yZFBhcmFtWzNdKTsKKyAgICAgICAgICAgZHh4ID0gTlVMTDsgLyogc2hvdWxkJ3QgaGFwcGVuIC0tIGJ1dCBpZiwgd2UgY29udGludWUgd2l0aCBOVUxMIFtmb3Igd29ya2Fyb3VuZF0gKi8KKyAgICAgICAgICB9CiAgICAgICAgIEV4dFRleHRPdXQxNiggaGRjLCBtci0+cmRQYXJhbVsxXSwgICAgICAgICAgICAgIC8qIFggcG9zaXRpb24gKi8KIAkgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMF0sICAgICAgICAgICAgICAvKiBZIHBvc2l0aW9uICovCiAJICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzNdLCAgICAgICAgICAgICAgLyogb3B0aW9ucyAqLwotCSAgICAgICAgICAgICAgICAgICAoTFBSRUNUMTYpICZtci0+cmRQYXJhbVs0XSwgIC8qIHJlY3RhbmdsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikobXItPnJkUGFyYW0gKyA4KSwgICAvKiBzdHJpbmcgKi8KKwkJICAgICAJICAgbXItPnJkUGFyYW1bM10gPyAoTFBSRUNUMTYpICZtci0+cmRQYXJhbVs0XTpOVUxMLCAgLyogcmVjdGFuZ2xlICovCisJCSAgICAgICAgICAgc290LAkJCQkvKiBzdHJpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxLCBkeHgpOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoLCBkeCBhcnJheSAqLwogICAgICAgICBpZiAoZHh4KSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRVhUVEVYVE9VVCBsZW46ICVsZCAgKCVoZCAlaGQpICBbJXNdLlxuIiwKLSAgICAgICAgICAgIG1yLT5yZFNpemUsZHh4WzBdLGR4eFsxXSwoY2hhciopICYobXItPnJkUGFyYW1bOF0pICk7CisgICAgICAgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIkVYVFRFWFRPVVQ6ICVzICBsZW46ICVsZCAgZHgwOiAlZFxuIiwKKyAgICAgICAgICAgIHNvdCxtci0+cmRTaXplLGR4eFswXSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgIApAQCAtNzQwLDE2ICs3NDgsMjkgQEAKIAlHbG9iYWxGcmVlMTYoaG5kbCk7CiAJYnJlYWs7CiAKKyAgICAgY2FzZSBNRVRBX0RJQkJJVEJMVDoKKyAgICAgICAgeworICAgICAgICAgTFBCSVRNQVBJTkZPIGluZm8gPSAoTFBCSVRNQVBJTkZPKSAmKG1yLT5yZFBhcmFtWzhdKTsKKyAgICAgICAgIExQU1RSIGJpdHMgPSAoTFBTVFIpaW5mbyArIERJQl9CaXRtYXBJbmZvU2l6ZSggaW5mbywgbXItPnJkUGFyYW1bMF0gKTsKKyAgICAgICAgIFN0cmV0Y2hESUJpdHMxNihoZGMsbXItPnJkUGFyYW1bN10sbXItPnJkUGFyYW1bNl0sbXItPnJkUGFyYW1bNV0sCisgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzRdLG1yLT5yZFBhcmFtWzNdLG1yLT5yZFBhcmFtWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVs1XSxtci0+cmRQYXJhbVs0XSxiaXRzLGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTLE1BS0VMT05HKG1yLT5yZFBhcmFtWzBdLG1yLT5yZFBhcmFtWzFdKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CQorICAgICAgIAorICAgICBjYXNlIE1FVEFfU0VUVEVYVEpVU1RJRklDQVRJT046CisgICAgICAgCVNldFRleHRKdXN0aWZpY2F0aW9uMzIoaGRjLCAqKG1yLT5yZFBhcmFtICsgMSksICoobXItPnJkUGFyYW0pKTsKKwlicmVhazsKKwogI2RlZmluZSBNRVRBX1VOSU1QKHgpIGNhc2UgeDogZnByaW50ZihzdGRlcnIsIlBsYXlNZXRhRmlsZVJlY29yZDpyZWNvcmQgdHlwZSAiI3giIG5vdCBpbXBsZW1lbnRlZC5cbiIpO2JyZWFrOwogICAgIE1FVEFfVU5JTVAoTUVUQV9TRVRURVhUQ0hBUkVYVFJBKQotICAgIE1FVEFfVU5JTVAoTUVUQV9TRVRURVhUSlVTVElGSUNBVElPTikKICAgICBNRVRBX1VOSU1QKE1FVEFfRlJBTUVSRUdJT04pCiAgICAgTUVUQV9VTklNUChNRVRBX0RSQVdURVhUKQogICAgIE1FVEFfVU5JTVAoTUVUQV9TRVRESUJUT0RFVikKICAgICBNRVRBX1VOSU1QKE1FVEFfQU5JTUFURVBBTEVUVEUpCiAgICAgTUVUQV9VTklNUChNRVRBX1NFVFBBTEVOVFJJRVMpCiAgICAgTUVUQV9VTklNUChNRVRBX1JFU0laRVBBTEVUVEUpCi0gICAgTUVUQV9VTklNUChNRVRBX0RJQkJJVEJMVCkKICAgICBNRVRBX1VOSU1QKE1FVEFfRVhURkxPT0RGSUxMKQogICAgIE1FVEFfVU5JTVAoTUVUQV9SRVNFVERDKQogICAgIE1FVEFfVU5JTVAoTUVUQV9TVEFSVERPQykKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRXMucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VzLnJjCmluZGV4IGUzYjNkYWMuLmQ3YjA0OGUgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRXMucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fcy5yYwpAQCAtMSw3ICsxLDcgQEAKIAogU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKIHsKLSBNRU5VSVRFTSAiJlJlc3RhdXJlciIsIDYxNzI4CisgTUVOVUlURU0gIiZSZXN0YXVyYXIiLCA2MTcyOAogIE1FTlVJVEVNICImTW92ZXIiLCA2MTQ1NgogIE1FTlVJVEVNICImVGFtYfFvIiwgNjE0NDAKICBNRU5VSVRFTSAiTWkmbmltaXphciIsIDYxNDcyCkBAIC0yMCwxMiArMjAsMTIgQEAKIAlCRUdJTgogCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKIAkJTUVOVUlURU0gU0VQQVJBVE9SCi0JCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCi0JCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKLQkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCi0JCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gIkNvJnJ0YXIiLCBXTV9DVVQKKwkJTUVOVUlURU0gIiZDb3BpYXIiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGVnYXIiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkJvcnJhciIsIFdNX0NMRUFSCiAJCU1FTlVJVEVNIFNFUEFSQVRPUgotCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCQlNRU5VSVRFTSAiU2VsZWNjaW9uYXIgJnRvZG8iLCBFTV9TRVRTRUwzMgogCUVORAogfQogCkBAIC0xNDgsMzYgKzE0OCw2NiBAQAogfQogCiAKLUNIT09TRV9GT05UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK0NIT09TRV9GT05UIERJQUxPRyBESVNDQVJEQUJMRSAgMTMsIDU0LCAyNjQsIDE0NwogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIkZ1ZW50ZSIKIEZPTlQgOCwgIkhlbHYiCiB7Ci0gTFRFWFQgIkZ1ZW50ZToiLCAxMDg4LCA2LCA2LCA0MCwgOQotIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5Ci0gREVGUFVTSEJVVFRPTiAiQWNlcHRhciIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQ2FuY2VsYXIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorICAgIExURVhUICAgICAgICAgICAiJkZ1ZW50ZToiLDEwODggLDYsMyw0MCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzYgLDYsMTMsOTQsNTQsICBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfAorICAgICAgICAgICAgICAgICAgICBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRQorICAgIExURVhUICAgICAgICAgICAiRXN0JmlsbyBkZSBmdWVudGU6IiwxMDg5ICwxMDgsMyw0NCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzcsMTA4LDEzLDY0LDU0LCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfAorICAgICAgICAgICAgICAgICAgICBXU19WU0NST0xMIHwgV1NfVEFCU1RPUCB8IENCU19TSU1QTEUKKyAgICBMVEVYVCAgICAgICAgICAgIiZUYW1h8W86IiwxMDkwLDE3OSwzLDMwLDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzOCwxNzksMTMsMzIsNTQsIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QIHwgQ0JTX1NJTVBMRSB8IENCU19TT1JUCisgICAgREVGUFVTSEJVVFRPTiAgICJBY2VwdGFyIixJRE9LLDIxOCw2LDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJDYW5jZWxhciIsSURDQU5DRUwsMjE4LDIzLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJBJnBsaWNhciIsIDEwMjYsMjE4LDQwLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJBJnl1ZGEiICwgMTAzOCwyMTgsNTcsNDAsMTQsV1NfR1JPVVAKKyAgICBHUk9VUEJPWCAgICAgICAgIiZFZmVjdG9zIiwxMDcyLDYsNzIsODQsMzQsV1NfR1JPVVAKKyAgICBDSEVDS0JPWCAgICAgICAgIiZSYXlhZG8iLCAxMDQwLCAxMCw4Miw1MCwxMCwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUAorICAgIENIRUNLQk9YICAgICAgICAiJlN1YnJheWFkbyIsIDEwNDEsIDEwLDk0LDUwLDEwLCBCU19BVVRPQ0hFQ0tCT1gKKyAgICBMVEVYVCAgICAgICAgICAgIiZDb2xvcjoiLCAxMDkxICw2LDExMCwzMCw5CisgICAgQ09NQk9CT1ggICAgICAgIDExMzksNiwxMjAsODQsMTAwLENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfSEFTU1RSSU5HUyB8CisgICAgICAgICAgICAgICAgICAgIENCU19BVVRPSFNDUk9MTCB8ICBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorICAgIEdST1VQQk9YICAgICAgICAiRWplbXBsbyIsMTA3Myw5OCw3MiwxNjAsNDksV1NfR1JPVVAKKyAgICBDVEVYVCAgICAgICAgICAgIkFhQmJZeVp60fEiLDEwOTMsMTA0LDgxLDE0OSwzNyxTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUKIH0KIAogCi1DSE9PU0VfQ09MT1IgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDIwMAorQ0hPT1NFX0NPTE9SIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMzAwLCAyMDAKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJDb2xvciIKIEZPTlQgOCwgIkhlbHYiCiB7Ci0gTFRFWFQgIkNvbG9yZXMgJmJhc2ljb3M6IiwgMTA4OCwgNiwgNiwgNDAsIDkKLSBMVEVYVCAiQ29sb3JlcyBwZXJzb24mYWxpemFkb3M6IiwgMTA4OSwgNiwgMTI2LCA0MCwgOQotIExURVhUICJDb2xvcnxT82wmaWRvIiwgMTA5MCwgMTAwLCAxNDYsIDQwLCA5Ci0gTFRFWFQgIiZIdWU6IiwgMTA5MSwgMTUwLCAxMjYsIDQwLCA5Ci0gTFRFWFQgIiZTYXQ6IiwgMTA5MiwgMTUwLCAxNDYsIDQwLCA5Ci0gTFRFWFQgIiZMdW06IiwgMTA5MywgMTUwLCAxNjYsIDQwLCA5Ci0gTFRFWFQgIiZSb2pvOiIsIDEwOTQsIDE1MCwgMTI2LCA0MCwgOQotIExURVhUICImVmVyZGU6IiwgMTA5NSwgMTUwLCAxNDYsIDQwLCA5Ci0gTFRFWFQgIkEmenVsOiIsIDEwOTYsIDE1MCwgMTY2LCA0MCwgOQotIERFRlBVU0hCVVRUT04gIkFjZXB0YXIiLCAxLCA2LCAxODIsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIkFncmVnYXIgYSBsb3MgJmNvbG9yZXMgcGVyc29uYWxpemFkb3MiLCAxMDI0LCAxMjAsIDE4MiwgMTAwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQm9ycmFyIGNvbG9yZXMgcGVyc29uYWxpemFkb3MiLCAxMDI1LCA2LCAxNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQ2FuY2VsYXIiLCAyLCA3NiwgMTgyLCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICJDb2xvcmVzICZi4XNpY29zOiIsIDEwODgsIDQsIDQsIDE0MCwgMTAKKyBMVEVYVCAiQ29sb3JlcyBwZXJzb24mYWxpemFkb3M6IiwgMTA4OSwgNCwgMTA2LCAxNDAsIDEwCisgTFRFWFQgIkNvbG9yfFPzM2wmaWRvIiwgMTA5MCwgMTUwLCAxNTEsIDQ4LCAxMAorIExURVhUICAgIiZSb2pvOiIsIDcyNiAvKjEwOTQqLywyNDksMTI2LDI0LDEwCisgRURJVFRFWFQgNzA2LCAyNzUsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgICImVmVyZGU6Iiw3MjcvKjEwOTUqLywyNDksMTQwLDI0LDEwCisgRURJVFRFWFQgNzA3LCAyNzUsMTM4LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgICJBJnp1bDoiLDcyOCAvKjEwOTYqLywyNDksMTU0LDI0LDEwCisgRURJVFRFWFQgNzA4LCAyNzUsMTUyLDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIiZUaW50ZToiICw3MjMgLyoxMDkxKi8sMjAyLDEyNiwyMiwxMAorIEVESVRURVhUIDcwMywgMjI2LDEyNCwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgICImU2F0LjoiICw3MjQgLyoxMDkyKi8sMjAyLDE0MCwyMiwxMAorIEVESVRURVhUIDcwNCwgMjI2LDEzOCwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgICImTHVtLjoiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYgQ09OVFJPTCAiIiAsNzAyLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAyNzgsNCw4LDExNgorIENPTlRST0wgIiIgLDcwMiwiU1RBVElDIixTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMjc4LDQsOCwxMTYKKyBDT05UUk9MICIiICw3MDksIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1MiwxMjQsNDAsMjYKKyBERUZQVVNIQlVUVE9OICJBY2VwdGFyIiwgIDEsICA0LCAxNjYsIDQ0LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkNhbmNlbGFyIiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBJnl1ZGEiLCAxMDM4LDEwMCwxNjYsIDQ0LCAxNAorIFBVU0hCVVRUT04gIkFncmVnYXIgYSBsb3MgJmNvbG9yZXMgcGVyc29uYWxpemFkb3MiLCA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZEZWZpbmlyIGNvbG9yZXMgcGVyc29uYWxpemFkb3MgPj4iLCA3MTkvKjEwMjUqLywgICA0LCAxNTAsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gICImaSIsNzEzLDMwMCwyMDAsNCwxNCAgIC8qIGp1c3QgYSBkdW1teTogICdpJyBpcyAgbGlrZSAgJmkgaW4gInNvbCZpZCIgKi8KIH0KIAogCmRpZmYgLS1naXQgYS93aW4zMi9jdXJzb3JpY29uMzIuYyBiL3dpbjMyL2N1cnNvcmljb24zMi5jCmluZGV4IDBhMjJhMzguLjRjZTQxN2UgMTAwNjQ0Ci0tLSBhL3dpbjMyL2N1cnNvcmljb24zMi5jCisrKyBiL3dpbjMyL2N1cnNvcmljb24zMi5jCkBAIC0zMzksNyArMzM5LDcgQEAKICAgICAgICAgQklUTUFQSU5GT0hFQURFUiAqYmloID0gJnBJbmZvLT5ibWlIZWFkZXI7CiAgICAgICAgIFJHQlFVQUQgKnJnYiA9IHBJbmZvLT5ibWlDb2xvcnM7CiAgICAgICAgIGJpdHMgPSAoY2hhciAqKWJtaSArIHNpemUgKwotICAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlcyhiaWgtPmJpV2lkdGgsYmloLT5iaUJpdENvdW50KSpiaWgtPmJpSGVpZ2h0OworICAgICAgICAgICAgRElCX0dldERJQldpZHRoQnl0ZXMoYmloLT5iaVdpZHRoLGJpaC0+YmlCaXRDb3VudCkqYmloLT5iaUhlaWdodDsKICAgICAgICAgYmloLT5iaUJpdENvdW50ID0gMTsKICAgICAgICAgYmloLT5iaUNsclVzZWQgPSBiaWgtPmJpQ2xySW1wb3J0YW50ID0gMjsKICAgICAgICAgcmdiWzBdLnJnYkJsdWUgPSByZ2JbMF0ucmdiR3JlZW4gPSByZ2JbMF0ucmdiUmVkID0gMHgwMDsKQEAgLTM1MSw3ICszNTEsNyBAQAogICAgICAgICBCSVRNQVBDT1JFSEVBREVSICpiY2ggPSAoQklUTUFQQ09SRUhFQURFUiAqKXBJbmZvOwogICAgICAgICBSR0JUUklQTEUgKnJnYiA9IChSR0JUUklQTEUgKikoYmNoICsgMSk7CiAgICAgICAgIGJpdHMgPSAoY2hhciAqKWJtaSArIHNpemUgKwotICAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlcyhiY2gtPmJjV2lkdGgsYmNoLT5iY0JpdENvdW50KSpiY2gtPmJjSGVpZ2h0OworICAgICAgICAgICAgRElCX0dldERJQldpZHRoQnl0ZXMoYmNoLT5iY1dpZHRoLGJjaC0+YmNCaXRDb3VudCkqYmNoLT5iY0hlaWdodDsKICAgICAgICAgYmNoLT5iY0JpdENvdW50ID0gMTsKICAgICAgICAgcmdiWzBdLnJnYnRCbHVlID0gcmdiWzBdLnJnYnRHcmVlbiA9IHJnYlswXS5yZ2J0UmVkID0gMHgwMDsKICAgICAgICAgcmdiWzFdLnJnYnRCbHVlID0gcmdiWzFdLnJnYnRHcmVlbiA9IHJnYlsxXS5yZ2J0UmVkID0gMHhmZjsKZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCA5OGI0ZmZlLi4zYmI0ZmVkIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIERFQlVHX1dJTjMyCiAjaW5jbHVkZSAiZGVidWcuaCIKIAorRFdPUkQgRXJybm9Ub0xhc3RFcnJvcihpbnQgZXJybm9fbnVtKTsKIAogc3RhdGljIGludCBUcmFuc2xhdGVDcmVhdGlvbkZsYWdzKERXT1JEIGNyZWF0ZV9mbGFncyk7CiBzdGF0aWMgaW50IFRyYW5zbGF0ZUFjY2Vzc0ZsYWdzKERXT1JEIGFjY2Vzc19mbGFncyk7CmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggNTRiYWYyMy4uZGViMzRkZCAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtMzI1LDcgKzMyNSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgICAgKFVTRVIzMi4zOTkpCisgKiAgICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgICAoVVNFUjMyLjM5OSkKICAqLwogRFdPUkQgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cygKIAlEV09SRCBuQ291bnQsSEFORExFMzIgKnBIYW5kbGVzLEJPT0wzMiBmV2FpdEFsbCxEV09SRCBkd01pbGxpc2Vjb25kcywKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDIwODNkNTEuLjE2OTRhNzkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMjgsNiArMjgsOCBAQAogc3RhdGljIHNob3J0IGlGMTBLZXkgPSAwOwogc3RhdGljIHNob3J0IGlNZW51U3lzS2V5ID0gMDsKIAorZXh0ZXJuIHZvaWQgIEVuZE1lbnUodm9pZCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFRldORF9IYW5kbGVXaW5kb3dQb3NDaGFuZ2VkCiAgKgpAQCAtMzI4LDggKzMzMCw3IEBACiAJYnJlYWs7IAogCiAgICAgY2FzZSBXTV9DQU5DRUxNT0RFOgotCS8qIEVuZE1lbnUoKSBzaG91bGQgYmUgY2FsbGVkIGlmIGluIG1lbnUgc3RhdGUgYnV0IGN1cnJlbnRseSBpdCdzCi0JICAgaW1wb3NzaWJsZSB0byBkZXRlY3QgLSBtZW51IGNvZGUgc2hvdWxkIGJlIHVwZGF0ZWQqLworCWlmICh3bmRQdHItPnBhcmVudCA9PSBXSU5fR2V0RGVza3RvcCgpKSBFbmRNZW51KCk7CiAJaWYgKEdldENhcHR1cmUzMigpID09IHduZFB0ci0+aHduZFNlbGYpIFJlbGVhc2VDYXB0dXJlKCk7CiAJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZHJpdmVyLmMgYi93aW5kb3dzL2RyaXZlci5jCmluZGV4IDRlYjA4ODAuLjk0MmVjYzggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZHJpdmVyLmMKKysrIGIvd2luZG93cy9kcml2ZXIuYwpAQCAtNjEsOCArNjEsOCBAQAogCXJldHVybiAwOwogICAgIH0KIAotICAgIHJldHZhbCA9IENhbGxEcml2ZXJQcm9jKCBscGRydi0+bHBEcnZQcm9jLCAwTCAvKiBGSVhNRSAqLywgaERyaXZlciwgbXNnLAotCQkJICAgICBsUGFyYW0xLCBsUGFyYW0yICk7CisgICAgcmV0dmFsID0gQ2FsbERyaXZlclByb2MoIChGQVJQUk9DMTYpbHBkcnYtPmxwRHJ2UHJvYywgMEwgLyogRklYTUUgKi8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRHJpdmVyLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIgKTsKIAogICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJTZW5kRHJpdmVyTWVzc2FnZSAvLyByZXR2YWwgPSAlbGRcbiIsIHJldHZhbCApOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL2dyYXBoaWNzLmMgYi93aW5kb3dzL2dyYXBoaWNzLmMKaW5kZXggMzk1NTkzNy4uNDRhYTY5ZiAxMDA2NDQKLS0tIGEvd2luZG93cy9ncmFwaGljcy5jCisrKyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgogI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KICNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiZGMuaCIKQEAgLTY1LDcgKzY2LDcgQEAKICAqLwogQk9PTDMyIEdSQVBIX0RyYXdCaXRtYXAoIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhiaXRtYXAsIAogCQkJIElOVDMyIHhkZXN0LCBJTlQzMiB5ZGVzdCwgSU5UMzIgeHNyYywgSU5UMzIgeXNyYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCwgQk9PTDMyIGJNb25vICkKIHsKICAgICBCSVRNQVBPQkogKmJtcDsKICAgICBEQyAqZGM7CkBAIC03MywyNCArNzQsNDMgQEAKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEoYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBoYml0bWFwLCBCSVRNQVBfTUFHSUMgKSkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHhkZXN0ICs9IGRjLT53LkRDT3JnWDsgeWRlc3QgKz0gZGMtPncuRENPcmdZOworCiAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKICAgICBpZiAoYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMSkKICAgICB7CiAgICAgICAgIFhTZXRGb3JlZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWwgKTsKICAgICAgICAgWFNldEJhY2tncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOwogICAgICAgICBYQ29weVBsYW5lKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgeGRlc3QsIGRjLT53LkRDT3JnWSArIHlkZXN0LCAxICk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICB4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LCB4ZGVzdCwgeWRlc3QsIDEgKTsKICAgICB9CiAgICAgZWxzZSBpZiAoYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgPT0gZGMtPncuYml0c1BlclBpeGVsKQogICAgIHsKLSAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICB4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHhkZXN0LCBkYy0+dy5EQ09yZ1kgKyB5ZGVzdCApOwotICAgICAgICByZXR1cm4gVFJVRTsKKwlpZiggYk1vbm8gKQorCXsKKwkgICAgSU5UMzIJcGxhbmU7CisKKwkgICAgaWYoIENPTE9SX0dldE1vbm9QbGFuZSgmcGxhbmUpICkKKwkgICAgeworCQlYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuYmFja2dyb3VuZFBpeGVsICk7CisJCVhTZXRCYWNrZ3JvdW5kKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBkYy0+dy50ZXh0UGl4ZWwgKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOworCQlYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuYmFja2dyb3VuZFBpeGVsICk7CisJICAgIH0KKwkgICAgWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCQl4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LCB4ZGVzdCwgeWRlc3QsIHBsYW5lICk7CisJfQorCWVsc2UgCisJICAgIFhDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIAorCQkgICAgICAgZGMtPnUueC5nYywgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwgeGRlc3QsIHlkZXN0ICk7CiAgICAgfQogICAgIGVsc2UgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9rZXlib2FyZC5jIGIvd2luZG93cy9rZXlib2FyZC5jCmluZGV4IGNlMjk3YWEuLmQxYTZiMTEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mva2V5Ym9hcmQuYworKysgYi93aW5kb3dzL2tleWJvYXJkLmMKQEAgLTYzOSw3ICs2MzksNyBAQAogICAgICAgaWYgKHNlbmRtc2cpICAgICAgLyogZm91bmQgYW4gYWNjZWxlcmF0b3IsIGJ1dCBzZW5kIGEgbWVzc2FnZS4uLiA/ICovCiAgICAgICB7CiAgICAgICAgIElOVDE2ICBpU3lzU3RhdCxpU3RhdCxtZXNnPTA7Ci0gICAgICAgIEhNRU5VMTYgaFN5c01lbnUsaE1lbnU7CisgICAgICAgIEhNRU5VMTYgaE1lbnU7CiAgICAgICAgIAogICAgICAgICBpZiAobXNnLT5tZXNzYWdlID09IFdNX0tFWVVQIHx8IG1zZy0+bWVzc2FnZSA9PSBXTV9TWVNLRVlVUCkKICAgICAgICAgICBtZXNnPTE7CkBAIC02NTEsMTYgKzY1MSwxNCBAQAogICAgICAgICAgICAgbWVzZz0zOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7Ci0gICAgICAgICAgICBoTWVudT1HZXRNZW51MzIoaFduZCk7Ci0gICAgICAgICAgICBoU3lzTWVudT1HZXRTeXN0ZW1NZW51MzIoaFduZCxGQUxTRSk7Ci0gICAgICAgICAgICBpZiAoaFN5c01lbnUpCi0gICAgICAgICAgICAgIGlTeXNTdGF0PUdldE1lbnVTdGF0ZTMyKGhTeXNNZW51LGxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwsTUZfQllDT01NQU5EKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgaVN5c1N0YXQ9LTE7Ci0gICAgICAgICAgICBpZiAoaE1lbnUpCi0gICAgICAgICAgICAgIGlTdGF0PUdldE1lbnVTdGF0ZTMyKGhNZW51LGxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwsTUZfQllDT01NQU5EKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgaVN0YXQ9LTE7CisJICAgIFdORCogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICAgICAgICAgIGhNZW51ID0gKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSA/IDAgOiAoSE1FTlUzMil3bmRQdHItPndJRG1lbnU7CisJICAgIGlTeXNTdGF0ID0gKHduZFB0ci0+aFN5c01lbnUpID8gR2V0TWVudVN0YXRlMzIoR2V0U3ViTWVudTE2KHduZFB0ci0+aFN5c01lbnUsIDApLAorCQkJCQkgICAgbHBBY2NlbFRibC0+dGJsW2ldLndJRHZhbCwgTUZfQllDT01NQU5EKSA6IC0xIDsKKwkgICAgaVN0YXQgPSAoaE1lbnUpID8gR2V0TWVudVN0YXRlMzIoaE1lbnUsCisJCQkJCSAgICBscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsLCBNRl9CWUNPTU1BTkQpIDogLTEgOworCiAgICAgICAgICAgICBpZiAoaVN5c1N0YXQhPS0xKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBpZiAoaVN5c1N0YXQgJiAoTUZfRElTQUJMRUR8TUZfR1JBWUVEKSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWRpLmMgYi93aW5kb3dzL21kaS5jCmluZGV4IGUwOGUwOGQuLmUzMDFjYmYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWRpLmMKKysrIGIvd2luZG93cy9tZGkuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAorI2RlZmluZSBNRElGX05FRURVUERBVEUJCTB4MDAwMQorCiAKIHN0YXRpYyBIQklUTUFQMTYgaEJtcENsb3NlICAgPSAwOwogc3RhdGljIEhCSVRNQVAxNiBoQm1wUmVzdG9yZSA9IDA7CkBAIC01Nyw5ICs1OSw5IEBACiAKIHN0YXRpYyB2b2lkIE1ESV9Qb3N0VXBkYXRlKEhXTkQxNiBod25kLCBNRElDTElFTlRJTkZPKiBjaSwgV09SRCByZWNhbGMpCiB7Ci0gaWYoICFjaS0+c2JOZWVkVXBkYXRlICkKKyBpZiggIShjaS0+bWRpRmxhZ3MgJiBNRElGX05FRURVUERBVEUpICkKICAgIHsKLSAgICAgIGNpLT5zYk5lZWRVcGRhdGUgPSBUUlVFOworICAgICAgY2ktPm1kaUZsYWdzIHw9IE1ESUZfTkVFRFVQREFURTsKICAgICAgIFBvc3RNZXNzYWdlMTYoIGh3bmQsIFdNX01ESUNBTENDSElMRFNDUk9MTCwgMCwgMCk7CiAgICB9CiAgY2ktPnNiUmVjYWxjID0gcmVjYWxjOwpAQCAtOTgwLDcgKzk4Miw2IEBACiBMUkVTVUxUIE1ESUNsaWVudFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQxNiBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgTFBDUkVBVEVTVFJVQ1QxNiAgICAgY3M7Ci0gICAgTFBDTElFTlRDUkVBVEVTVFJVQ1QxNiBjY3M7CiAgICAgTURJQ0xJRU5USU5GTyAgICAgICAqY2k7CiAgICAgUkVDVDE2CQkgcmVjdDsKICAgICBXTkQgICAgICAgICAgICAgICAgICp3IAkgID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CkBAIC05OTksMTcgKzEwMDAsMjUgQEAKIAkgKiBzbyB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBlbnZpcm9ubWVudCB3ZSdyZSBpbi4gKi8KIAogCWlmKCB3LT5mbGFncyAmIFdJTl9JU1dJTjMyICkKLQkgICAgY2NzID0gKExQQ0xJRU5UQ1JFQVRFU1RSVUNUMTYpIGNzLT5scENyZWF0ZVBhcmFtczsKKwl7CisjZGVmaW5lIGNjcyAoKExQQ0xJRU5UQ1JFQVRFU1RSVUNUMzIpY3MtPmxwQ3JlYXRlUGFyYW1zKQorCSAgICBjaS0+aFdpbmRvd01lbnUJPSBjY3MtPmhXaW5kb3dNZW51OworCSAgICBjaS0+aWRGaXJzdENoaWxkCT0gY2NzLT5pZEZpcnN0Q2hpbGQ7CisjdW5kZWYgY2NzCisJfQogICAgICAgICBlbHNlICAgIAotCSAgICBjY3MgPSAoTFBDTElFTlRDUkVBVEVTVFJVQ1QxNikgUFRSX1NFR19UT19MSU4oY3MtPmxwQ3JlYXRlUGFyYW1zKTsKKwl7CisJICAgIExQQ0xJRU5UQ1JFQVRFU1RSVUNUMTYgY2NzID0gKExQQ0xJRU5UQ1JFQVRFU1RSVUNUMTYpIAorCQkJCSAgIFBUUl9TRUdfVE9fTElOKGNzLT5scENyZWF0ZVBhcmFtcyk7CisJICAgIGNpLT5oV2luZG93TWVudQk9IGNjcy0+aFdpbmRvd01lbnU7CisJICAgIGNpLT5pZEZpcnN0Q2hpbGQJPSBjY3MtPmlkRmlyc3RDaGlsZDsKKwl9CiAKLQljaS0+aFdpbmRvd01lbnUgICAgICAgICA9IGNjcy0+aFdpbmRvd01lbnU7Ci0JY2ktPmlkRmlyc3RDaGlsZCAgICAgICAgPSBjY3MtPmlkRmlyc3RDaGlsZDsKIAljaS0+aHduZENoaWxkTWF4aW1pemVkICA9IDA7CiAJY2ktPm5BY3RpdmVDaGlsZHJlbgk9IDA7CiAJY2ktPm5Ub3RhbENyZWF0ZWQJPSAwOwogCWNpLT5mcmFtZVRpdGxlCQk9IE5VTEw7Ci0JY2ktPnNiTmVlZFVwZGF0ZQk9IDA7CisJY2ktPm1kaUZsYWdzCQk9IDA7CiAJY2ktPnNlbGYJCT0gaHduZDsKIAl3LT5kd1N0eWxlICAgICAgICAgICAgIHw9IFdTX0NMSVBDSElMRFJFTjsKIApAQCAtMTAyMCw3ICsxMDI5LDcgQEAKICAgICAgICAgfQogCU1ESV9VcGRhdGVGcmFtZVRleHQoZnJhbWVXbmQsIGh3bmQsIE1ESV9OT0ZSQU1FUkVQQUlOVCxmcmFtZVduZC0+dGV4dCk7CiAKLQlBcHBlbmRNZW51MzJBKCBjY3MtPmhXaW5kb3dNZW51LCBNRl9TRVBBUkFUT1IsIDAsIE5VTEwgKTsKKwlBcHBlbmRNZW51MzJBKCBjaS0+aFdpbmRvd01lbnUsIE1GX1NFUEFSQVRPUiwgMCwgTlVMTCApOwogCiAJR2V0Q2xpZW50UmVjdDE2KGZyYW1lV25kLT5od25kU2VsZiwgJnJlY3QpOwogCU5DX0hhbmRsZU5DQ2FsY1NpemUoIHcsICZyZWN0ICk7CkBAIC0xMDY0LDcgKzEwNzMsNyBAQAogCQkoKExPTkcpIChjaS0+aHduZENoaWxkTWF4aW1pemVkPjApIDw8IDE2KSk7CiAKICAgICAgIGNhc2UgV01fTURJSUNPTkFSUkFOR0U6Ci0JY2ktPnNiTmVlZFVwZGF0ZSA9IFRSVUU7CisJY2ktPm1kaUZsYWdzIHw9IE1ESUZfTkVFRFVQREFURTsKIAlNRElJY29uQXJyYW5nZShod25kKTsKIAljaS0+c2JSZWNhbGMgPSBTQl9CT1RIKzE7CiAJU2VuZE1lc3NhZ2UxNihod25kLFdNX01ESUNBTENDSElMRFNDUk9MTCwwLDBMKTsKQEAgLTEwOTAsMTcgKzEwOTksMTcgQEAKICNlbmRpZgogCQogICAgICAgY2FzZSBXTV9NRElUSUxFOgotCWNpLT5zYk5lZWRVcGRhdGUgPSBUUlVFOworCWNpLT5tZGlGbGFncyB8PSBNRElGX05FRURVUERBVEU7CiAJU2hvd1Njcm9sbEJhcjMyKGh3bmQsU0JfQk9USCxGQUxTRSk7CiAJTURJVGlsZSh3LCBjaSx3UGFyYW0pOwotICAgICAgICBjaS0+c2JOZWVkVXBkYXRlID0gRkFMU0U7CisgICAgICAgIGNpLT5tZGlGbGFncyAmPSB+TURJRl9ORUVEVVBEQVRFOwogICAgICAgICByZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9WU0NST0xMOgogICAgICAgY2FzZSBXTV9IU0NST0xMOgotCWNpLT5zYk5lZWRVcGRhdGUgPSBUUlVFOworCWNpLT5tZGlGbGFncyB8PSBNRElGX05FRURVUERBVEU7CiAgICAgICAgIFNjcm9sbENoaWxkcmVuMzIoaHduZCxtZXNzYWdlLHdQYXJhbSxsUGFyYW0pOwotCWNpLT5zYk5lZWRVcGRhdGUgPSBGQUxTRTsKKwljaS0+bWRpRmxhZ3MgJj0gfk1ESUZfTkVFRFVQREFURTsKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICAgIGNhc2UgV01fU0VURk9DVVM6CkBAIC0xMTMyLDI3ICsxMTQxLDI3IEBACiAgICAgICAgIHJldHVybiAwOwogCiAgICAgICBjYXNlIFdNX1NJWkU6Ci0gICAgICAgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQotCSAgewotCSAgICAgV05EKgljaGlsZCA9IFdJTl9GaW5kV25kUHRyKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpOwotCSAgICAgUkVDVDE2CXJlY3QgID0geyAwLCAwLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKKyAgICAgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKQorCXsKKwkgICAgV05EKgljaGlsZCA9IFdJTl9GaW5kV25kUHRyKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpOworCSAgICBSRUNUMTYJcmVjdCAgPSB7IDAsIDAsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSB9OwogCi0JICAgICBBZGp1c3RXaW5kb3dSZWN0RXgxNigmcmVjdCwgY2hpbGQtPmR3U3R5bGUsIDAsIGNoaWxkLT5kd0V4U3R5bGUpOwotCSAgICAgTW92ZVdpbmRvdzE2KGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIHJlY3QubGVmdCwgcmVjdC50b3AsCi0JCQkgIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIDEpOwotCSAgfQorCSAgICBBZGp1c3RXaW5kb3dSZWN0RXgxNigmcmVjdCwgY2hpbGQtPmR3U3R5bGUsIDAsIGNoaWxkLT5kd0V4U3R5bGUpOworCSAgICBNb3ZlV2luZG93MTYoY2ktPmh3bmRDaGlsZE1heGltaXplZCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKKwkJCSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wLCAxKTsKKwl9CiAJZWxzZQogCSAgTURJX1Bvc3RVcGRhdGUoaHduZCwgY2ksIFNCX0JPVEgrMSk7CiAKIAlicmVhazsKIAogICAgICAgY2FzZSBXTV9NRElDQUxDQ0hJTERTQ1JPTEw6Ci0JaWYoIGNpLT5zYk5lZWRVcGRhdGUgKQotCSAgaWYoIGNpLT5zYlJlY2FsYyApCi0JICAgIHsKLQkgICAgICBDYWxjQ2hpbGRTY3JvbGwoaHduZCwgY2ktPnNiUmVjYWxjLTEpOwotCSAgICAgIGNpLT5zYlJlY2FsYyA9IGNpLT5zYk5lZWRVcGRhdGUgPSAwOwotCSAgICB9CisJaWYoIChjaS0+bWRpRmxhZ3MgJiBNRElGX05FRURVUERBVEUpICYmIGNpLT5zYlJlY2FsYyApCisJeworCSAgICBDYWxjQ2hpbGRTY3JvbGwoaHduZCwgY2ktPnNiUmVjYWxjLTEpOworCSAgICBjaS0+c2JSZWNhbGMgPSAwOworCSAgICBjaS0+bWRpRmxhZ3MgJj0gfk1ESUZfTkVFRFVQREFURTsKKwl9CiAJcmV0dXJuIDA7CiAgICAgfQogICAgIApAQCAtMTIzNiwyMCArMTI0NSwyMCBAQAogCiAJICAgIGlmKCAhKHduZFB0ci0+cGFyZW50LT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIAogCQkmJiBjaS0+aHduZEFjdGl2ZUNoaWxkICYmICFjaS0+aHduZENoaWxkTWF4aW1pemVkICkKLQkgICAgICB7CisJICAgIHsKIAkJLyogY29udHJvbCBtZW51IGlzIGJldHdlZW4gdGhlIGZyYW1lIHN5c3RlbSBtZW51IGFuZCAKIAkJICogdGhlIGZpcnN0IGVudHJ5IG9mIG1lbnUgYmFyICovCiAKLQkJaWYoIHdQYXJhbSA9PSBWS19MRUZUICkgCi0JCSAgeyBpZiggd25kUHRyLT5wYXJlbnQtPndJRG1lbnUgIT0gTE9XT1JEKGxQYXJhbSkgKSBicmVhazsgfQotCQllbHNlIGlmKCB3UGFyYW0gPT0gVktfUklHSFQgKQotCQkgIHsgaWYoIEdldFN5c3RlbU1lbnUxNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAwKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTE9XT1JEKGxQYXJhbSkgKSBicmVhazsgfQotCQllbHNlIGJyZWFrOwotCQkKLQkJcmV0dXJuIE1BS0VMT05HKCBHZXRTeXN0ZW1NZW51MTYoY2ktPmh3bmRBY3RpdmVDaGlsZCwgMCksIAotCQkJCSBjaS0+aHduZEFjdGl2ZUNoaWxkICk7Ci0JICAgICAgfQorCQlpZiggKHdQYXJhbSA9PSBWS19MRUZUICYmCisJCSAgICAgd25kUHRyLT5wYXJlbnQtPndJRG1lbnUgPT0gTE9XT1JEKGxQYXJhbSkpIHx8CisJCSAgICAod1BhcmFtID09IFZLX1JJR0hUICYmCisJCSAgICAgR2V0U3ViTWVudTE2KHduZFB0ci0+cGFyZW50LT5oU3lzTWVudSwgMCkgPT0gTE9XT1JEKGxQYXJhbSkpICkKKwkJeworCQkgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoY2ktPmh3bmRBY3RpdmVDaGlsZCk7CisJCSAgICByZXR1cm4gTUFLRUxPTkcoIEdldFN1Yk1lbnUxNih3bmRQdHItPmhTeXNNZW51LCAwKSwgCisJCQkJCQkgIGNpLT5od25kQWN0aXZlQ2hpbGQpOworCQl9CisJICAgIH0KIAkgICAgYnJlYWs7CiAJfQogICAgIH0KQEAgLTE0MDUsOCArMTQxNCw3IEBACiAJcmV0dXJuIDA7CiAKICAgICAgIGNhc2UgV01fU0VUVklTSUJMRToKLSAgICAgICAgIGlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkKQotICAgICAgICAgICAgIGNpLT5zYk5lZWRVcGRhdGUgPSAwOworICAgICAgICAgaWYoIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpIGNpLT5tZGlGbGFncyAmPSB+TURJRl9ORUVEVVBEQVRFOwogCSBlbHNlCiAgICAgICAgICAgICBNRElfUG9zdFVwZGF0ZShjbGllbnRXbmQtPmh3bmRTZWxmLCBjaSwgU0JfQk9USCsxKTsKIAlicmVhazsKQEAgLTE0NjksNyArMTQ3Nyw3IEBACiAgICAgICBjYXNlIFdNX05FWFRNRU5VOgogCiAJaWYoIHdQYXJhbSA9PSBWS19MRUZUICkJCS8qIHN3aXRjaCB0byBmcmFtZSBzeXN0ZW0gbWVudSAqLwotCSAgcmV0dXJuIE1BS0VMT05HKCBHZXRTeXN0ZW1NZW51MTYoY2xpZW50V25kLT5wYXJlbnQtPmh3bmRTZWxmLCAwKSwgCisJICByZXR1cm4gTUFLRUxPTkcoIEdldFN1Yk1lbnUxNihjbGllbnRXbmQtPnBhcmVudC0+aFN5c01lbnUsIDApLCAKIAkJCSAgIGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiApOwogCWlmKCB3UGFyYW0gPT0gVktfUklHSFQgKQkvKiB0byBmcmFtZSBtZW51IGJhciAqLwogCSAgcmV0dXJuIE1BS0VMT05HKCBjbGllbnRXbmQtPnBhcmVudC0+d0lEbWVudSwKQEAgLTE1OTgsNDIgKzE2MDYsNDkgQEAKICAqLwogQk9PTDE2IFRyYW5zbGF0ZU1ESVN5c0FjY2VsMTYoIEhXTkQxNiBod25kQ2xpZW50LCBMUE1TRzE2IG1zZyApCiB7Ci0gIFdORCogY2xpZW50V25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmRDbGllbnQpOwotICBXTkQqIHduZDsKLSAgTURJQ0xJRU5USU5GTyAgICAgICAqY2kgICAgID0gTlVMTDsKLSAgV1BBUkFNMTYJICAgICAgIHdQYXJhbSA9IDA7CisgICAgV05EKiBjbGllbnRXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZENsaWVudCk7CisgICAgV05EKiB3bmQ7CisgICAgTURJQ0xJRU5USU5GTyAgICAgKmNpICAgICA9IE5VTEw7CisgICAgV1BBUkFNMTYJICAgICAgIHdQYXJhbSA9IDA7CiAKLSAgaWYoIChtc2ctPm1lc3NhZ2UgIT0gV01fS0VZRE9XTiAmJiBtc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZRE9XTikgfHwgIWNsaWVudFduZCApCi0gICAgcmV0dXJuIDA7CisgICAgaWYoIGNsaWVudFduZCAmJiAobXNnLT5tZXNzYWdlID09IFdNX0tFWURPV04gfHwgbXNnLT5tZXNzYWdlID09IFdNX1NZU0tFWURPV04pKQorICAgIHsKKwlNRElDTElFTlRJTkZPCSpjaSA9IE5VTEw7CisJV05EKgkJd25kOwogCi0gIGNpID0gKE1ESUNMSUVOVElORk8qKSBjbGllbnRXbmQtPndFeHRyYTsKLSAgd25kID0gV0lOX0ZpbmRXbmRQdHIoY2ktPmh3bmRBY3RpdmVDaGlsZCk7Ci0gCi0gIGlmKCAhd25kICkgcmV0dXJuIDA7CisJY2kgPSAoTURJQ0xJRU5USU5GTyopIGNsaWVudFduZC0+d0V4dHJhOworCXduZCA9IFdJTl9GaW5kV25kUHRyKGNpLT5od25kQWN0aXZlQ2hpbGQpOworCWlmKCB3bmQgJiYgISh3bmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgKQorCXsKKwkgICAgV1BBUkFNMTYJd1BhcmFtID0gMDsKKworCSAgICAvKiB0cmFuc2xhdGUgaWYgdGhlIEN0cmwga2V5IGlzIGRvd24gYW5kIEFsdCBub3QuICovCiAgIAotICBpZiggd25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQgKSByZXR1cm4gMDsKLSAgIAotICBpZiAoKEdldEtleVN0YXRlMzIoVktfQ09OVFJPTCkgJiAweDgwMDApICYmICEoR2V0S2V5U3RhdGUzMihWS19NRU5VKSAmIDB4ODAwMCkpCi0gICAgc3dpdGNoKCBtc2ctPndQYXJhbSApCi0gICAgICB7Ci0JY2FzZSBWS19GNjoKLQljYXNlIFZLX1NFUEFSQVRPUjoKLQkgICAgIHdQYXJhbSA9ICggR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDAgKT8gU0NfTkVYVFdJTkRPVzogU0NfUFJFVldJTkRPVzsKLQkgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZLX0Y0OgotCWNhc2UgVktfUkJVVFRPTjoKLQkgICAgIHdQYXJhbSA9IFNDX0NMT1NFOyAKLQkgICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0KLSAgZHByaW50Zl9tZGkoc3RkZGViLCJUcmFuc2xhdGVNRElTeXNBY2NlbDogd1BhcmFtID0gJTA0eFxuIiwgd1BhcmFtKTsKLQotICBTZW5kTWVzc2FnZTE2KGNpLT5od25kQWN0aXZlQ2hpbGQsV01fU1lTQ09NTUFORCwgd1BhcmFtLCAoTFBBUkFNKW1zZy0+d1BhcmFtKTsKLSAgcmV0dXJuIDE7CisJICAgIGlmKCAoR2V0S2V5U3RhdGUzMihWS19DT05UUk9MKSAmIDB4ODAwMCkgJiYgCisJICAgICAgICEoR2V0S2V5U3RhdGUzMihWS19NRU5VKSAmIDB4ODAwMCkpCisJICAgIHsKKwkJc3dpdGNoKCBtc2ctPndQYXJhbSApCisJCXsKKwkJICAgIGNhc2UgVktfRjY6CisJCSAgICBjYXNlIFZLX1NFUEFSQVRPUjoKKwkJCSB3UGFyYW0gPSAoIEdldEtleVN0YXRlMzIoVktfU0hJRlQpICYgMHg4MDAwICkKKwkJCQkgID8gU0NfTkVYVFdJTkRPVyA6IFNDX1BSRVZXSU5ET1c7CisJCQkgYnJlYWs7CisJCSAgICBjYXNlIFZLX0Y0OgorCQkgICAgY2FzZSBWS19SQlVUVE9OOgorCQkJIHdQYXJhbSA9IFNDX0NMT1NFOyAKKwkJCSBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQkgcmV0dXJuIDA7CisJCX0KKwkgICAgICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiVHJhbnNsYXRlTURJU3lzQWNjZWw6IHdQYXJhbSA9ICUwNHhcbiIsIHdQYXJhbSk7CisJICAgICAgICBTZW5kTWVzc2FnZTE2KCBjaS0+aHduZEFjdGl2ZUNoaWxkLCBXTV9TWVNDT01NQU5ELCAKKwkJCQkJd1BhcmFtLCAoTFBBUkFNKW1zZy0+d1BhcmFtKTsKKwkgICAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsgLyogZmFpbHVyZSAqLwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggNzUxMjEyYy4uODBjM2U1YyAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTEwNTUsNyArMTA1NSw3IEBACiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNlbmRNZXNzYWdlMTY6IGludmFsaWQgaHduZCAlMDR4XG4iLCBod25kICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoUVVFVUVfSXNEb29tZWRRdWV1ZSh3bmRQdHItPmhtZW1UYXNrUSkpCisgICAgaWYgKFFVRVVFX0lzRXhpdGluZ1F1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSkKICAgICAgICAgcmV0dXJuIDA7ICAvKiBEb24ndCBzZW5kIGFueXRoaW5nIGlmIHRoZSB0YXNrIGlzIGR5aW5nICovCiAgICAgaWYgKHduZFB0ci0+aG1lbVRhc2tRICE9IEdldFRhc2tRdWV1ZSgwKSkKICAgICAgICAgcmV0dXJuIE1TR19TZW5kTWVzc2FnZSggd25kUHRyLT5obWVtVGFza1EsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKQEAgLTExMjAsNyArMTEyMCw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChRVUVVRV9Jc0Rvb21lZFF1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSkKKyAgICBpZiAoUVVFVUVfSXNFeGl0aW5nUXVldWUod25kUHRyLT5obWVtVGFza1EpKQogICAgICAgICByZXR1cm4gMDsgIC8qIERvbid0IHNlbmQgYW55dGhpbmcgaWYgdGhlIHRhc2sgaXMgZHlpbmcgKi8KIAogICAgIGlmICh3bmRQdHItPmhtZW1UYXNrUSAhPSBHZXRUYXNrUXVldWUoMCkpCkBAIC0xMTY4LDcgKzExNjgsNyBAQAogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZW5kTWVzc2FnZTMyVzogaW52YWxpZCBod25kICUwOHhcbiIsIGh3bmQgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChRVUVVRV9Jc0Rvb21lZFF1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSkKKyAgICBpZiAoUVVFVUVfSXNFeGl0aW5nUXVldWUod25kUHRyLT5obWVtVGFza1EpKQogICAgICAgICByZXR1cm4gMDsgIC8qIERvbid0IHNlbmQgYW55dGhpbmcgaWYgdGhlIHRhc2sgaXMgZHlpbmcgKi8KICAgICBpZiAod25kUHRyLT5obWVtVGFza1EgIT0gR2V0VGFza1F1ZXVlKDApKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IGUwYzY0MTIuLjA4ZmY5OGIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtNDY1LDExICs0NjUsMTEgQEAKICAgICBpZiggISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICkKICAgICB7CiAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwotICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCAoSXNab29tZWQzMihod25kKSA/Ci0JCQkgICAgIChkb3duID8gaGJpdG1hcFJlc3RvcmVEIDogaGJpdG1hcFJlc3RvcmUpIDoKLQkJCSAgICAgKGRvd24gPyBoYml0bWFwTWF4aW1pemVEIDogaGJpdG1hcE1heGltaXplKSksCisgICAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIChJc1pvb21lZDMyKGh3bmQpIAorCQkJICAgICA/IChkb3duID8gaGJpdG1hcFJlc3RvcmVEIDogaGJpdG1hcFJlc3RvcmUpCisJCQkgICAgIDogKGRvd24gPyBoYml0bWFwTWF4aW1pemVEIDogaGJpdG1hcE1heGltaXplKSksCiAJCSAgICAgICAgcmVjdC5yaWdodCAtIFNZU01FVFJJQ1NfQ1hTSVpFIC0gMSwgcmVjdC50b3AsCi0JCSAgICAgICAgMCwgMCwgU1lTTUVUUklDU19DWFNJWkUrMSwgU1lTTUVUUklDU19DWVNJWkUgKTsKKwkJICAgICAgICAwLCAwLCBTWVNNRVRSSUNTX0NYU0laRSsxLCBTWVNNRVRSSUNTX0NZU0laRSwgRkFMU0UgKTsKICAgICB9CiB9CiAKQEAgLTQ4OCw3ICs0ODgsNyBAQAogICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01BWElNSVpFQk9YKSByZWN0LnJpZ2h0IC09IFNZU01FVFJJQ1NfQ1hTSVpFKzE7CiAgICAgICBHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIChkb3duID8gaGJpdG1hcE1pbmltaXplRCA6IGhiaXRtYXBNaW5pbWl6ZSksCiAJCSAgICAgICAgcmVjdC5yaWdodCAtIFNZU01FVFJJQ1NfQ1hTSVpFIC0gMSwgcmVjdC50b3AsCi0JCSAgICAgICAgMCwgMCwgU1lTTUVUUklDU19DWFNJWkUrMSwgU1lTTUVUUklDU19DWVNJWkUgKTsKKwkJICAgICAgICAwLCAwLCBTWVNNRVRSSUNTX0NYU0laRSsxLCBTWVNNRVRSSUNTX0NZU0laRSwgRkFMU0UgKTsKICAgICB9CiB9CiAKQEAgLTkyNywxOSArOTI3LDE4IEBACiAgKiBJbml0aWFsaXNhdGlvbiBvZiBhIG1vdmUgb3IgcmVzaXplLCB3aGVuIGluaXRpYXRpZWQgZnJvbSBhIG1lbnUgY2hvaWNlLgogICogUmV0dXJuIGhpdCB0ZXN0IGNvZGUgZm9yIGNhcHRpb24gb3Igc2l6aW5nIGJvcmRlci4KICAqLwotc3RhdGljIExPTkcgTkNfU3RhcnRTaXplTW92ZSggSFdORDMyIGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwKK3N0YXRpYyBMT05HIE5DX1N0YXJ0U2l6ZU1vdmUoIFdORCogd25kUHRyLCBXUEFSQU0xNiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lOVDE2ICpjYXB0dXJlUG9pbnQgKQogewogICAgIExPTkcgaGl0dGVzdCA9IDA7CiAgICAgUE9JTlQxNiBwdDsKICAgICBNU0cxNiBtc2c7Ci0gICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIGlmICgod1BhcmFtICYgMHhmZmYwKSA9PSBTQ19NT1ZFKQogICAgIHsKIAkgIC8qIE1vdmUgcG9pbnRlciBhdCB0aGUgY2VudGVyIG9mIHRoZSBjYXB0aW9uICovCiAJUkVDVDMyIHJlY3Q7Ci0JTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKKwlOQ19HZXRJbnNpZGVSZWN0KCB3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCApOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKQogCSAgICByZWN0LmxlZnQgKz0gU1lTTUVUUklDU19DWFNJWkUgKyAxOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRUJPWCkKQEAgLTk0OCwyMCArOTQ3LDIxIEBACiAJICAgIHJlY3QucmlnaHQgLT0gU1lTTUVUUklDU19DWFNJWkUgKyAxOwogCXB0LnggPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDI7CiAJcHQueSA9IHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKyByZWN0LnRvcCArIFNZU01FVFJJQ1NfQ1lTSVpFLzI7CisJaGl0dGVzdCA9IEhUQ0FQVElPTjsKKwkqY2FwdHVyZVBvaW50ID0gcHQ7CisKIAlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpCiAJICAgIENsaWVudFRvU2NyZWVuMTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJnB0ICk7Ci0JaGl0dGVzdCA9IEhUQ0FQVElPTjsKICAgICB9CiAgICAgZWxzZSAgLyogU0NfU0laRSAqLwogICAgIHsKLQlTZXRDYXB0dXJlMzIoaHduZCk7CiAJd2hpbGUoIWhpdHRlc3QpCiAJewogICAgICAgICAgICAgTVNHX0ludGVybmFsR2V0TWVzc2FnZSggJm1zZywgMCwgMCwgTVNHRl9TSVpFLCBQTV9SRU1PVkUsIEZBTFNFICk7CiAJICAgIHN3aXRjaChtc2cubWVzc2FnZSkKIAkgICAgewogCSAgICBjYXNlIFdNX01PVVNFTU9WRToKLQkJaGl0dGVzdCA9IE5DX0hhbmRsZU5DSGl0VGVzdCggaHduZCwgbXNnLnB0ICk7CisJCWhpdHRlc3QgPSBOQ19IYW5kbGVOQ0hpdFRlc3QoIHduZFB0ci0+aHduZFNlbGYsIG1zZy5wdCApOwogCQlwdCA9IG1zZy5wdDsKIAkJaWYgKChoaXR0ZXN0IDwgSFRMRUZUKSB8fCAoaGl0dGVzdCA+IEhUQk9UVE9NUklHSFQpKQogCQkgICAgaGl0dGVzdCA9IDA7CkBAIC05OTgsMTAgKzk5OCwxMSBAQAogCQl9CiAJICAgIH0KIAl9CisJKmNhcHR1cmVQb2ludCA9IHB0OwogICAgIH0KLSAgICAqY2FwdHVyZVBvaW50ID0gcHQ7Ci0gICAgU2V0Q3Vyc29yUG9zMzIoIGNhcHR1cmVQb2ludC0+eCwgY2FwdHVyZVBvaW50LT55ICk7Ci0gICAgTkNfSGFuZGxlU2V0Q3Vyc29yKCBod25kLCAoV1BBUkFNMTYpaHduZCwgTUFLRUxPTkcoIGhpdHRlc3QsIFdNX01PVVNFTU9WRSApKTsKKyAgICBTZXRDdXJzb3JQb3MzMiggcHQueCwgcHQueSApOworICAgIE5DX0hhbmRsZVNldEN1cnNvciggd25kUHRyLT5od25kU2VsZiwgCisJCQl3bmRQdHItPmh3bmRTZWxmLCBNQUtFTE9ORyggaGl0dGVzdCwgV01fTU9VU0VNT1ZFICkpOwogICAgIHJldHVybiBoaXR0ZXN0OwogfQogCkBAIC0xMDMwLDE3ICsxMDMxLDE4IEBACiAgICAgaWYgKCh3UGFyYW0gJiAweGZmZjApID09IFNDX01PVkUpCiAgICAgewogCWlmICghKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pKSByZXR1cm47Ci0JaWYgKCFoaXR0ZXN0KSBoaXR0ZXN0ID0gTkNfU3RhcnRTaXplTW92ZSggaHduZCwgd1BhcmFtLCAmY2FwdHVyZVBvaW50ICk7CisJaWYgKCFoaXR0ZXN0KSAKKwkgICAgIGhpdHRlc3QgPSBOQ19TdGFydFNpemVNb3ZlKCB3bmRQdHIsIHdQYXJhbSwgJmNhcHR1cmVQb2ludCApOwogCWlmICghaGl0dGVzdCkgcmV0dXJuOwogICAgIH0KICAgICBlbHNlICAvKiBTQ19TSVpFICovCiAgICAgewogCWlmICghdGhpY2tmcmFtZSkgcmV0dXJuOwotCWlmIChoaXR0ZXN0KSBoaXR0ZXN0ICs9IEhUTEVGVC0xOworCWlmICggaGl0dGVzdCAmJiBoaXR0ZXN0ICE9IEhUU1lTTUVOVSApIGhpdHRlc3QgKz0gMjsKIAllbHNlCiAJewogCSAgICBTZXRDYXB0dXJlMzIoaHduZCk7Ci0JICAgIGhpdHRlc3QgPSBOQ19TdGFydFNpemVNb3ZlKCBod25kLCB3UGFyYW0sICZjYXB0dXJlUG9pbnQgKTsKKwkgICAgaGl0dGVzdCA9IE5DX1N0YXJ0U2l6ZU1vdmUoIHduZFB0ciwgd1BhcmFtLCAmY2FwdHVyZVBvaW50ICk7CiAJICAgIGlmICghaGl0dGVzdCkKIAkgICAgewogCQlSZWxlYXNlQ2FwdHVyZSgpOwpAQCAtMTA1NSw3ICsxMDU3LDggQEAKICAgICBzaXppbmdSZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OwogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKIAlHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJm1vdXNlUmVjdCApOwotICAgIGVsc2UgU2V0UmVjdDE2KCZtb3VzZVJlY3QsIDAsIDAsIFNZU01FVFJJQ1NfQ1hTQ1JFRU4sIFNZU01FVFJJQ1NfQ1lTQ1JFRU4pOworICAgIGVsc2UgCisgICAgICAgIFNldFJlY3QxNigmbW91c2VSZWN0LCAwLCAwLCBTWVNNRVRSSUNTX0NYU0NSRUVOLCBTWVNNRVRSSUNTX0NZU0NSRUVOKTsKICAgICBpZiAoT05fTEVGVF9CT1JERVIoaGl0dGVzdCkpCiAgICAgewogCW1vdXNlUmVjdC5sZWZ0ICA9IE1BWCggbW91c2VSZWN0LmxlZnQsIHNpemluZ1JlY3QucmlnaHQtbWF4VHJhY2sueCApOwpAQCAtMTM2MSw3ICsxMzY0LDggQEAKICAgICBjYXNlIEhUQk9UVE9NOgogICAgIGNhc2UgSFRCT1RUT01MRUZUOgogICAgIGNhc2UgSFRCT1RUT01SSUdIVDoKLQlTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TWVNDT01NQU5ELCBTQ19TSVpFICsgd1BhcmFtIC0gSFRMRUZUKzEsIGxQYXJhbSk7CisJLyogbWFrZSBzdXJlIGhpdHRlc3QgZml0cyBpbnRvIDB4ZiBhbmQgZG9lc24ndCBvdmVybGFwIHdpdGggSFRTWVNNRU5VICovCisJU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfU0laRSArIHdQYXJhbSAtIDIsIGxQYXJhbSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIEhUQk9SREVSOgpAQCAtMTQxNiwxNCArMTQyMCwxNSBAQAogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBQT0lOVDMyIHB0MzI7CisgICAgVUlOVDE2IHVDb21tYW5kID0gd1BhcmFtICYgMHhGRkYwOwogCiAgICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAiSGFuZGxpbmcgV01fU1lTQ09NTUFORCAleCAlZCwlZFxuIiwgCiAJCSAgICAgIHdQYXJhbSwgcHQueCwgcHQueSApOwogCi0gICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEICYmIHdQYXJhbSAhPSBTQ19LRVlNRU5VICkKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQgJiYgdUNvbW1hbmQgIT0gU0NfS0VZTUVOVSApCiAgICAgICAgIFNjcmVlblRvQ2xpZW50MTYoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJnB0ICk7CiAKLSAgICBzd2l0Y2ggKHdQYXJhbSAmIDB4ZmZmMCkKKyAgICBzd2l0Y2ggKHVDb21tYW5kKQogICAgIHsKICAgICBjYXNlIFNDX1NJWkU6CiAgICAgY2FzZSBTQ19NT1ZFOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IGE3NDk0NWMuLjk4NDVjMWEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgTUFYX1FVRVVFX1NJWkUgICAxMjAgIC8qIE1heC4gc2l6ZSBvZiBhIG1lc3NhZ2UgcXVldWUgKi8KIAogc3RhdGljIEhRVUVVRTE2IGhGaXJzdFF1ZXVlID0gMDsKLXN0YXRpYyBIUVVFVUUxNiBoRG9vbWVkUXVldWUgPSAwOworc3RhdGljIEhRVUVVRTE2IGhFeGl0aW5nUXVldWUgPSAwOwogc3RhdGljIEhRVUVVRTE2IGhtZW1TeXNNc2dRdWV1ZSA9IDA7CiBzdGF0aWMgTUVTU0FHRVFVRVVFICpzeXNNc2dRdWV1ZSA9IE5VTEw7CiAKQEAgLTk0LDIwICs5NCwyMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBRVUVVRV9Jc0Rvb21lZFF1ZXVlCisgKgkgICAgIFFVRVVFX0lzRXhpdGluZ1F1ZXVlCiAgKi8KLUJPT0wzMiBRVUVVRV9Jc0Rvb21lZFF1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKQorQk9PTDMyIFFVRVVFX0lzRXhpdGluZ1F1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKQogewotICAgIHJldHVybiAoaERvb21lZFF1ZXVlICYmIChoUXVldWUgPT0gaERvb21lZFF1ZXVlKSk7CisgICAgcmV0dXJuIChoRXhpdGluZ1F1ZXVlICYmIChoUXVldWUgPT0gaEV4aXRpbmdRdWV1ZSkpOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBRVUVVRV9TZXREb29tZWRRdWV1ZQorICoJICAgICBRVUVVRV9TZXRFeGl0aW5nUXVldWUKICAqLwotdm9pZCBRVUVVRV9TZXREb29tZWRRdWV1ZSggSFFVRVVFMTYgaFF1ZXVlICkKK3ZvaWQgUVVFVUVfU2V0RXhpdGluZ1F1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKQogewotICAgIGhEb29tZWRRdWV1ZSA9IGhRdWV1ZTsKKyAgICBoRXhpdGluZ1F1ZXVlID0gaFF1ZXVlOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXNlci5jIGIvd2luZG93cy91c2VyLmMKaW5kZXggYjIwNjcwZi4uMjMxNzYxYSAxMDA2NDQKLS0tIGEvd2luZG93cy91c2VyLmMKKysrIGIvd2luZG93cy91c2VyLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogV09SRCBVU0VSX0hlYXBTZWwgPSAwOwogCi1leHRlcm4gQk9PTDMyIE1FTlVfU3dpdGNoVFBXbmRUbyhIVEFTSzE2KTsKK2V4dGVybiBCT09MMzIgTUVOVV9QYXRjaFJlc2lkZW50UG9wdXAoIEhRVUVVRTE2LCBXTkQqICk7CiBleHRlcm4gdm9pZCBRVUVVRV9GbHVzaE1lc3NhZ2VzKEhRVUVVRTE2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDgsNyArMTA4LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQlVU0VSX0FwcEV4aXQKKyAqICAgICAgICAgICBVU0VSX0FwcEV4aXQKICAqLwogdm9pZCBVU0VSX0FwcEV4aXQoIEhUQVNLMTYgaFRhc2ssIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgSFFVRVVFMTYgaFF1ZXVlICkKIHsKQEAgLTEyMywxNiArMTIzLDE2IEBACiAJZGVza3RvcC0+aG1lbVRhc2tRID0gR2V0VGFza1F1ZXVlKFRBU0tfR2V0TmV4dFRhc2soaFRhc2spKTsKIAogICAgIC8qIFBhdGNoIHJlc2lkZW50IHBvcHVwIG1lbnUgd2luZG93ICovCi0gICAgTUVOVV9Td2l0Y2hUUFduZFRvKDApOworICAgIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBoUXVldWUsIE5VTEwgKTsKIAogICAgIFRJTUVSX1JlbW92ZVF1ZXVlVGltZXJzKCBoUXVldWUgKTsKIAogICAgIFFVRVVFX0ZsdXNoTWVzc2FnZXMoIGhRdWV1ZSApOwogICAgIEhPT0tfRnJlZVF1ZXVlSG9va3MoIGhRdWV1ZSApOwogCi0gICAgUVVFVUVfU2V0RG9vbWVkUXVldWUoIGhRdWV1ZSApOworICAgIFFVRVVFX1NldEV4aXRpbmdRdWV1ZSggaFF1ZXVlICk7CiAgICAgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBkZXNrdG9wLT5jaGlsZCwgaFF1ZXVlLCAoSFFVRVVFMTYpMCk7Ci0gICAgUVVFVUVfU2V0RG9vbWVkUXVldWUoIDAgKTsKKyAgICBRVUVVRV9TZXRFeGl0aW5nUXVldWUoIDAgKTsKIAogICAgIC8qIEZyZWUgdGhlIG1lc3NhZ2UgcXVldWUgKi8KIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggZTViZTZmNC4uZjA5M2FmMSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC00Myw2ICs0Myw3IEBACiBzdGF0aWMgV09SRCB3RHJhZ1dpZHRoID0gNDsKIHN0YXRpYyBXT1JEIHdEcmFnSGVpZ2h0PSAzOwogCitleHRlcm4gQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiwgV05EKiApOwogZXh0ZXJuIEhDVVJTT1IxNiBDVVJTT1JJQ09OX0ljb25Ub0N1cnNvcihISUNPTjE2LCBCT09MMzIpOwogZXh0ZXJuIEhXTkQzMiBDQVJFVF9HZXRId25kKHZvaWQpOwogZXh0ZXJuIEJPT0wzMiBXSU5QT1NfQWN0aXZhdGVPdGhlcldpbmRvdyhXTkQqIHBXbmQpOwpAQCAtNTY5LDggKzU3MCw5IEBACiAgICAgd25kUHRyLT5wVlNjcm9sbCAgICAgICA9IE5VTEw7CiAgICAgd25kUHRyLT5wSFNjcm9sbCAgICAgICA9IE5VTEw7CiAgICAgd25kUHRyLT5wUHJvcCAgICAgICAgICA9IE5VTEw7Ci0gICAgd25kUHRyLT5oU3lzTWVudSAgICAgICA9IE1FTlVfR2V0RGVmU3lzTWVudSgpOwogICAgIHduZFB0ci0+dXNlcmRhdGEgICAgICAgPSAwOworICAgIHduZFB0ci0+aFN5c01lbnUgICAgICAgPSAod25kUHRyLT5kd1N0eWxlICYgV1NfU1lTTUVOVSkKKwkJCSAgICAgPyBNRU5VX0dldFN5c01lbnUoIGh3bmQsIDAgKSA6IDA7CiAKICAgICBpZiAoY2xhc3NQdHItPmNiV25kRXh0cmEpIG1lbXNldCggd25kUHRyLT53RXh0cmEsIDAsIGNsYXNzUHRyLT5jYlduZEV4dHJhKTsKIApAQCAtMTAwMCw3ICsxMDAyLDcgQEAKICAgICAgICAgLyogRklYTUU6IGNsZWFuIHVwIHBhbGV0dGUgLSBzZWUgIkludGVybmFscyIgcC4zNTIgKi8KICAgICB9CiAKLSAgICBpZiggIVFVRVVFX0lzRG9vbWVkUXVldWUod25kUHRyLT5obWVtVGFza1EpICkKKyAgICBpZiggIVFVRVVFX0lzRXhpdGluZ1F1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSApCiAJIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCBXTV9ERVNUUk9ZLCB3bmRQdHItPndJRG1lbnUsIChMUEFSQU0paHduZCApOwogICAgIGlmICghSXNXaW5kb3czMihod25kKSkgcmV0dXJuIFRSVUU7CiAKQEAgLTEwMTIsNyArMTAxNCw3IEBACiAgICAgewogICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX0hJREVXSU5ET1cgfAogCQkgICAgICAgIFNXUF9OT0FDVElWQVRFfFNXUF9OT1pPUkRFUnxTV1BfTk9NT1ZFfFNXUF9OT1NJWkV8Ci0JCSAgICAgICAgKChRVUVVRV9Jc0Rvb21lZFF1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSk/U1dQX0RFRkVSRVJBU0U6MCkgKTsKKwkJICAgICAgICAoKFFVRVVFX0lzRXhpdGluZ1F1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSk/U1dQX0RFRkVSRVJBU0U6MCkgKTsKIAlpZiAoIUlzV2luZG93MzIoaHduZCkpIHJldHVybiBUUlVFOwogICAgIH0KIApAQCAtMTAyMCw2ICsxMDIyLDkgQEAKIAogICAgIGlmKCAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSApCiAgICAgeworICAgICAgLyogbWFrZSBzdXJlIHRvcCBtZW51IHBvcHVwIGRvZXNuJ3QgZ2V0IGRlc3Ryb3llZCAqLworICAgICAgTUVOVV9QYXRjaFJlc2lkZW50UG9wdXAoIFRSVUUsIHduZFB0ciApOworCiAgICAgICBmb3IgKDs7KQogICAgICAgewogICAgICAgICBXTkQgKnNpYmxpbmdQdHIgPSB3bmRQdHItPnBhcmVudC0+Y2hpbGQ7ICAvKiBGaXJzdCBzaWJsaW5nICovCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCBkNTg4ZGU0Li45YjkwNTY0IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTExODEsNyArMTE4MSw3IEBACiAgICAgICBod25kUHJldkFjdGl2ZSA9IDA7CiAKICAgaWYoIGh3bmRBY3RpdmUgIT0gcFduZC0+aHduZFNlbGYgJiYgCi0gICAgKCBod25kQWN0aXZlIHx8IFFVRVVFX0lzRG9vbWVkUXVldWUocFduZC0+aG1lbVRhc2tRKSkgKQorICAgICggaHduZEFjdGl2ZSB8fCBRVUVVRV9Jc0V4aXRpbmdRdWV1ZShwV25kLT5obWVtVGFza1EpKSApCiAgICAgICByZXR1cm4gMDsKIAogICBpZiggcFduZC0+ZHdTdHlsZSAmIFdTX1BPUFVQICYmCg==