ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhhOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAorICoKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqCisgKi8KKworI2luY2x1ZGUgImlibWFzbS5oIgorI2luY2x1ZGUgImRvdF9jb21tYW5kLmgiCisKKy8qKgorICogRGlzcGF0Y2ggYW4gaW5jb21pbmcgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWMgaGFuZGxlciBmb3IgdGhlIG1lc3NhZ2UuCisgKiBDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBpYm1hc21fcmVjZWl2ZV9tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKm1lc3NhZ2UsIGludCBtZXNzYWdlX3NpemUpCit7CisJdTMyIHNpemU7CisJc3RydWN0IGRvdF9jb21tYW5kX2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIgKiltZXNzYWdlOworCisJc2l6ZSA9IGdldF9kb3RfY29tbWFuZF9zaXplKG1lc3NhZ2UpOworCWlmIChzaXplID4gbWVzc2FnZV9zaXplKQorCQlzaXplID0gbWVzc2FnZV9zaXplOworCisJc3dpdGNoIChoZWFkZXItPnR5cGUpIHsKKwljYXNlIHNwX2V2ZW50OiAKKwkJaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3AsIG1lc3NhZ2UsIHNpemUpOworCQlicmVhazsKKwljYXNlIHNwX2NvbW1hbmRfcmVzcG9uc2U6CisJCWlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3AsIG1lc3NhZ2UsIHNpemUpOyAKKwkJYnJlYWs7CisJY2FzZSBzcF9oZWFydGJlYXQ6CisJCWlibWFzbV9yZWNlaXZlX2hlYXJ0YmVhdChzcCwgbWVzc2FnZSwgc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoc3AtPmRldiwgIlJlY2VpdmVkIHVua25vd24gbWVzc2FnZSBmcm9tIHNlcnZpY2UgcHJvY2Vzc29yXG4iKTsKKwl9Cit9CisKKworI2RlZmluZSBJTklUX0JVRkZFUl9TSVpFIDMyCisKKworLyoqCisgKiBzZW5kIHRoZSA0LjMuNS4xMCBkb3QgY29tbWFuZCAoZHJpdmVyIFZQRCkgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yCisgKi8KK2ludCBpYm1hc21fc2VuZF9kcml2ZXJfdnBkKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApCit7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJc3RydWN0IGRvdF9jb21tYW5kX2hlYWRlciAqaGVhZGVyOworCXU4ICp2cGRfY29tbWFuZDsKKwl1OCAqdnBkX2RhdGE7CisJaW50IHJlc3VsdCA9IDA7CisKKwljb21tYW5kID0gaWJtYXNtX25ld19jb21tYW5kKElOSVRfQlVGRkVSX1NJWkUpOworCWlmIChjb21tYW5kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaGVhZGVyID0gKHN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIgKiljb21tYW5kLT5idWZmZXI7CisJaGVhZGVyLT50eXBlICAgICAgICAgICAgICAgID0gc3Bfd3JpdGU7CisJaGVhZGVyLT5jb21tYW5kX3NpemUgICAgICAgID0gNDsKKwloZWFkZXItPmRhdGFfc2l6ZSAgICAgICAgICAgPSAxNjsKKwloZWFkZXItPnN0YXR1cyAgICAgICAgICAgICAgPSAwOworCWhlYWRlci0+cmVzZXJ2ZWQgICAgICAgICAgICA9IDA7CisKKwl2cGRfY29tbWFuZCA9IGNvbW1hbmQtPmJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG90X2NvbW1hbmRfaGVhZGVyKTsKKwl2cGRfY29tbWFuZFswXSA9IDB4NDsKKwl2cGRfY29tbWFuZFsxXSA9IDB4MzsKKwl2cGRfY29tbWFuZFsyXSA9IDB4NTsKKwl2cGRfY29tbWFuZFszXSA9IDB4YTsKKworCXZwZF9kYXRhID0gdnBkX2NvbW1hbmQgKyBoZWFkZXItPmNvbW1hbmRfc2l6ZTsKKwl2cGRfZGF0YVswXSA9IDA7CisJc3RyY2F0KHZwZF9kYXRhLCBJQk1BU01fRFJJVkVSX1ZQRCk7CisJdnBkX2RhdGFbMTBdID0gMDsKKwl2cGRfZGF0YVsxNV0gPSAwOworCQorCWlibWFzbV9leGVjX2NvbW1hbmQoc3AsIGNvbW1hbmQpOworCWlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShjb21tYW5kLCBJQk1BU01fQ01EX1RJTUVPVVRfTk9STUFMKTsKKworCWlmIChjb21tYW5kLT5zdGF0dXMgIT0gSUJNQVNNX0NNRF9DT01QTEVURSkKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKworCWNvbW1hbmRfcHV0KGNvbW1hbmQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IG9zX3N0YXRlX2NvbW1hbmQgeworCXN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIJaGVhZGVyOworCXVuc2lnbmVkIGNoYXIJCQljb21tYW5kWzNdOworCXVuc2lnbmVkIGNoYXIJCQlkYXRhOworfTsKKworLyoqCisgKiBzZW5kIHRoZSA0LjMuNiBkb3QgY29tbWFuZCAob3Mgc3RhdGUpIHRvIHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgorICogRHVyaW5nIGRyaXZlciBpbml0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgInVwIi4KKyAqIFRoaXMgY2F1c2VzIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0byBzdGFydCBzZW5kaW5nIGhlYXJ0YmVhdHMgdGhlCisgKiBkcml2ZXIuCisgKiBEdXJpbmcgZHJpdmVyIGV4aXQgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9zIHN0YXRlICJkb3duIiwgCisgKiBjYXVzaW5nIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0byBzdG9wIHRoZSBoZWFydGJlYXRzLgorICovCitpbnQgaWJtYXNtX3NlbmRfb3Nfc3RhdGUoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgaW50IG9zX3N0YXRlKQoreworCXN0cnVjdCBjb21tYW5kICpjbWQ7CisJc3RydWN0IG9zX3N0YXRlX2NvbW1hbmQgKm9zX3N0YXRlX2NtZDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWNtZCA9IGlibWFzbV9uZXdfY29tbWFuZChzaXplb2Yoc3RydWN0IG9zX3N0YXRlX2NvbW1hbmQpKTsKKwlpZiAoY21kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJb3Nfc3RhdGVfY21kID0gKHN0cnVjdCBvc19zdGF0ZV9jb21tYW5kICopY21kLT5idWZmZXI7CisJb3Nfc3RhdGVfY21kLT5oZWFkZXIudHlwZQkJPSBzcF93cml0ZTsKKwlvc19zdGF0ZV9jbWQtPmhlYWRlci5jb21tYW5kX3NpemUJPSAzOworCW9zX3N0YXRlX2NtZC0+aGVhZGVyLmRhdGFfc2l6ZQkJPSAxOworCW9zX3N0YXRlX2NtZC0+aGVhZGVyLnN0YXR1cwkJPSAwOworCW9zX3N0YXRlX2NtZC0+Y29tbWFuZFswXQkJPSA0OworCW9zX3N0YXRlX2NtZC0+Y29tbWFuZFsxXQkJPSAzOworCW9zX3N0YXRlX2NtZC0+Y29tbWFuZFsyXQkJPSA2OworCW9zX3N0YXRlX2NtZC0+ZGF0YQkJCT0gb3Nfc3RhdGU7CisKKwlpYm1hc21fZXhlY19jb21tYW5kKHNwLCBjbWQpOworCWlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShjbWQsIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwpOworCisJaWYgKGNtZC0+c3RhdHVzICE9IElCTUFTTV9DTURfQ09NUExFVEUpCisJCXJlc3VsdCA9IC1FTk9ERVY7CisKKwljb21tYW5kX3B1dChjbWQpOworCXJldHVybiByZXN1bHQ7Cit9Cg==