LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQogKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwogKiBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQogKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBfV1NCTV9EUklWRVJfSAojZGVmaW5lIF9XU0JNX0RSSVZFUl9ICiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgIndzYm1fdXRpbC5oIgoKI2RlZmluZSBXU0JNX01VVEVYX1NQQUNFIDE2CiNkZWZpbmUgV1NCTV9DT05EX1NQQUNFICAxNgoKc3RydWN0IF9Xc2JtTXV0ZXgKewogICAgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmM7CiAgICB1bnNpZ25lZCBsb25nIHN0b3JhZ2VbV1NCTV9NVVRFWF9TUEFDRV07Cn07CgpzdHJ1Y3QgX1dzYm1Db25kCnsKICAgIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICpmdW5jOwogICAgdW5zaWduZWQgbG9uZyBzdG9yYWdlW1dTQk1fQ09ORF9TUEFDRV07Cn07CgpzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcwp7CiAgICBpbnQgKCptdXRleEluaXQpIChzdHJ1Y3QgX1dzYm1NdXRleCAqLCBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqKTsKICAgIHZvaWQgKCptdXRleEZyZWUpIChzdHJ1Y3QgX1dzYm1NdXRleCAqKTsKICAgIHZvaWQgKCptdXRleExvY2spIChzdHJ1Y3QgX1dzYm1NdXRleCAqKTsKICAgIHZvaWQgKCptdXRleFVubG9jaykgKHN0cnVjdCBfV3NibU11dGV4ICopOwogICAgaW50ICgqY29uZEluaXQpIChzdHJ1Y3QgX1dzYm1Db25kICosIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICopOwogICAgdm9pZCAoKmNvbmRGcmVlKSAoc3RydWN0IF9Xc2JtQ29uZCAqKTsKICAgIHZvaWQgKCpjb25kV2FpdCkgKHN0cnVjdCBfV3NibUNvbmQgKiwgc3RydWN0IF9Xc2JtTXV0ZXggKik7CiAgICB2b2lkICgqY29uZEJyb2FkY2FzdCkgKHN0cnVjdCBfV3NibUNvbmQgKik7Cn07CgpleHRlcm4gc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKndzYm1DdXJUaHJlYWRGdW5jOwoKI2RlZmluZSBXU0JNX01VVEVYX0lOSVQoX211dGV4KQkJCVwKICAgIHdzYm1UaHJlYWRGdW5jcygpLT5tdXRleEluaXQoX211dGV4LHdzYm1UaHJlYWRGdW5jcygpKQojZGVmaW5lIFdTQk1fTVVURVhfRlJFRShfbXV0ZXgpCQlcCiAgICB7CQkJCQkJXAoJKF9tdXRleCktPmZ1bmMtPm11dGV4RnJlZShfbXV0ZXgpOwlcCiAgICB9CiNkZWZpbmUgV1NCTV9NVVRFWF9MT0NLKF9tdXRleCkgXAogICAgKF9tdXRleCktPmZ1bmMtPm11dGV4TG9jayhfbXV0ZXgpOwojZGVmaW5lIFdTQk1fTVVURVhfVU5MT0NLKF9tdXRleCkgXAogICAgKF9tdXRleCktPmZ1bmMtPm11dGV4VW5sb2NrKF9tdXRleCk7CgojZGVmaW5lIFdTQk1fQ09ORF9JTklUKF9tdXRleCkJCQlcCiAgICB3c2JtVGhyZWFkRnVuY3MoKS0+Y29uZEluaXQoX211dGV4LCB3c2JtVGhyZWFkRnVuY3MoKSkKI2RlZmluZSBXU0JNX0NPTkRfRlJFRShfY29uZCkJCQlcCiAgICB7CQkJCQkJXAoJKF9jb25kKS0+ZnVuYy0+Y29uZEZyZWUoX2NvbmQpOwkJXAogICAgfQojZGVmaW5lIFdTQk1fQ09ORF9XQUlUKF9jb25kLCBfbXV0ZXgpCQlcCiAgICAoX2NvbmQpLT5mdW5jLT5jb25kV2FpdChfY29uZCwgX211dGV4KTsKI2RlZmluZSBXU0JNX0NPTkRfQlJPQURDQVNUKF9jb25kKQkJXAogICAgKF9jb25kKS0+ZnVuYy0+Y29uZEJyb2FkY2FzdChfY29uZCk7CgpzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzCnsKICAgIHN0cnVjdCBfVmFsaWRhdGVOb2RlICooKmFsbG9jKSAoc3RydWN0IF9Xc2JtVk5vZGVGdW5jcyAqLCBpbnQpOwogICAgdm9pZCAoKmZyZWUpIChzdHJ1Y3QgX1ZhbGlkYXRlTm9kZSAqKTsKICAgIHZvaWQgKCpjbGVhcikgKHN0cnVjdCBfVmFsaWRhdGVOb2RlICopOwp9OwoKZXh0ZXJuIHN0cnVjdCBfV3NibVZOb2RlRnVuY3MgKndzYm1DdXJWTm9kZUZ1bmM7CgpzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlOwpzdHJ1Y3QgX1dzYm1LZXJuZWxCdWY7CgpzdHJ1Y3QgX1ZhbGlkYXRlTm9kZQp7CiAgICB1aW50MzJfdCBoYXNoOwogICAgaW50IHR5cGVfaWQ7CiAgICBzdHJ1Y3QgX1dzYm1MaXN0SGVhZCBoZWFkOwogICAgc3RydWN0IF9Xc2JtTGlzdEhlYWQgaGFzaEhlYWQ7CiAgICBpbnQgbGlzdEl0ZW07CiAgICB1aW50NjRfdCBzZXRfZmxhZ3M7CiAgICB1aW50NjRfdCBjbHJfZmxhZ3M7CiAgICB2b2lkICpidWY7CiAgICBzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzICpmdW5jOwp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzICoKd3NibVZOb2RlRnVuY3Modm9pZCkKewogICAgcmV0dXJuIHdzYm1DdXJWTm9kZUZ1bmM7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKgp3c2JtVGhyZWFkRnVuY3Modm9pZCkKewogICAgcmV0dXJuIHdzYm1DdXJUaHJlYWRGdW5jOwp9CgpleHRlcm4gc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKndzYm1OdWxsVGhyZWFkRnVuY3Modm9pZCk7CgpleHRlcm4gc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKndzYm1QVGhyZWFkRnVuY3Modm9pZCk7CgojZW5kaWYK