LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQogKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwogKiBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQogKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgIndzYm1fZHJpdmVyLmgiCgpzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqd3NibUN1clRocmVhZEZ1bmMgPSBOVUxMOwpzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzICp3c2JtQ3VyVk5vZGVGdW5jID0gTlVMTDsKCi8qCiAqIFNpbmdsZS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbi4KICovCgpzdGF0aWMgaW50Cm5fbXV0ZXhJbml0KHN0cnVjdCBfV3NibU11dGV4ICptdXRleCwgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmMpCnsKICAgIG11dGV4LT5mdW5jID0gZnVuYzsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cm5fY29uZEluaXQoc3RydWN0IF9Xc2JtQ29uZCAqY29uZCwgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmMpCnsKICAgIGNvbmQtPmZ1bmMgPSBmdW5jOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCm5fbXV0ZXhOb25lKHN0cnVjdCBfV3NibU11dGV4ICptdXRleCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIDsKfQoKc3RhdGljIHZvaWQKbl9jb25kTm9uZShzdHJ1Y3QgX1dzYm1Db25kICpjb25kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgOwp9CgpzdGF0aWMgdm9pZApuX2NvbmRXYWl0KHN0cnVjdCBfV3NibUNvbmQgKmNvbmQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBzdHJ1Y3QgX1dzYm1NdXRleCAqbXV0ZXggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQp7CiAgICA7Cn0KCnN0YXRpYyBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyBudWxsRnVuYyA9IHsKICAgIC5tdXRleEluaXQgPSBuX211dGV4SW5pdCwKICAgIC5tdXRleEZyZWUgPSBuX211dGV4Tm9uZSwKICAgIC5tdXRleExvY2sgPSBuX211dGV4Tm9uZSwKICAgIC5tdXRleFVubG9jayA9IG5fbXV0ZXhOb25lLAogICAgLmNvbmRJbml0ID0gbl9jb25kSW5pdCwKICAgIC5jb25kRnJlZSA9IG5fY29uZE5vbmUsCiAgICAuY29uZFdhaXQgPSBuX2NvbmRXYWl0LAogICAgLmNvbmRCcm9hZGNhc3QgPSBuX2NvbmROb25lCn07CgpzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqCndzYm1OdWxsVGhyZWFkRnVuY3Modm9pZCkKewogICAgcmV0dXJuICZudWxsRnVuYzsKfQoKI2lmIChIQVZFX1BUSFJFQURTID09IDEpCiNpbmNsdWRlICJwdGhyZWFkLmgiCgovKgogKiBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbjoKICovCgpzdHJ1Y3QgX1dzYm1QTXV0ZXgKewogICAgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmM7CiAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Cn07CgpzdHJ1Y3QgX1dzYm1QQ29uZAp7CiAgICBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqZnVuYzsKICAgIHB0aHJlYWRfY29uZF90IGNvbmQ7Cn07CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBfV3NibVBNdXRleCAqCnBNdXRleENvbnZlcnQoc3RydWN0IF9Xc2JtTXV0ZXggKm0pCnsKICAgIHVuaW9uIF9QTXV0ZXhDb252ZXJ0ZXIKICAgIHsKCXN0cnVjdCBfV3NibU11dGV4IHdtOwoJc3RydWN0IF9Xc2JtUE11dGV4IHBtOwogICAgfSAgKnVtID0gY29udGFpbmVyT2YobSwgdW5pb24gX1BNdXRleENvbnZlcnRlciwgd20pOwoKICAgIHJldHVybiAmdW0tPnBtOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBfV3NibVBDb25kICoKcENvbmRDb252ZXJ0KHN0cnVjdCBfV3NibUNvbmQgKmMpCnsKICAgIHVuaW9uIF9QQ29uZENvbnZlcnRlcgogICAgewoJc3RydWN0IF9Xc2JtQ29uZCB3YzsKCXN0cnVjdCBfV3NibVBDb25kIHBjOwogICAgfSAgKnVjID0gY29udGFpbmVyT2YoYywgdW5pb24gX1BDb25kQ29udmVydGVyLCB3Yyk7CgogICAgcmV0dXJuICZ1Yy0+cGM7Cn0KCnN0YXRpYyBpbnQKcF9tdXRleEluaXQoc3RydWN0IF9Xc2JtTXV0ZXggKm11dGV4LCBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqZnVuYykKewogICAgc3RydWN0IF9Xc2JtUE11dGV4ICpwTXV0ZXggPSBwTXV0ZXhDb252ZXJ0KG11dGV4KTsKCiAgICBpZiAoc2l6ZW9mKHN0cnVjdCBfV3NibU11dGV4KSA8IHNpemVvZihzdHJ1Y3QgX1dzYm1QTXV0ZXgpKQoJcmV0dXJuIC1FSU5WQUw7CgogICAgcE11dGV4LT5mdW5jID0gZnVuYzsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcE11dGV4LT5tdXRleCwgTlVMTCk7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKcF9tdXRleEZyZWUoc3RydWN0IF9Xc2JtTXV0ZXggKm11dGV4KQp7CiAgICBzdHJ1Y3QgX1dzYm1QTXV0ZXggKnBNdXRleCA9IHBNdXRleENvbnZlcnQobXV0ZXgpOwoKICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcE11dGV4LT5tdXRleCk7Cn0KCnN0YXRpYyB2b2lkCnBfbXV0ZXhMb2NrKHN0cnVjdCBfV3NibU11dGV4ICptdXRleCkKewogICAgc3RydWN0IF9Xc2JtUE11dGV4ICpwTXV0ZXggPSBwTXV0ZXhDb252ZXJ0KG11dGV4KTsKCiAgICBwdGhyZWFkX211dGV4X2xvY2soJnBNdXRleC0+bXV0ZXgpOwp9CgpzdGF0aWMgdm9pZApwX211dGV4VW5sb2NrKHN0cnVjdCBfV3NibU11dGV4ICptdXRleCkKewogICAgc3RydWN0IF9Xc2JtUE11dGV4ICpwTXV0ZXggPSBwTXV0ZXhDb252ZXJ0KG11dGV4KTsKCiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcE11dGV4LT5tdXRleCk7Cn0KCnN0YXRpYyBpbnQKcF9jb25kSW5pdChzdHJ1Y3QgX1dzYm1Db25kICpjb25kLCBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqZnVuYykKewogICAgc3RydWN0IF9Xc2JtUENvbmQgKnBDb25kID0gcENvbmRDb252ZXJ0KGNvbmQpOwoKICAgIGlmIChzaXplb2Yoc3RydWN0IF9Xc2JtQ29uZCkgPCBzaXplb2Yoc3RydWN0IF9Xc2JtUENvbmQpKQoJcmV0dXJuIC1FSU5WQUw7CgogICAgcENvbmQtPmZ1bmMgPSBmdW5jOwogICAgcHRocmVhZF9jb25kX2luaXQoJnBDb25kLT5jb25kLCBOVUxMKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApwX2NvbmRGcmVlKHN0cnVjdCBfV3NibUNvbmQgKmNvbmQpCnsKICAgIHN0cnVjdCBfV3NibVBDb25kICpwQ29uZCA9IHBDb25kQ29udmVydChjb25kKTsKCiAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcENvbmQtPmNvbmQpOwp9CgpzdGF0aWMgdm9pZApwX2NvbmRCcm9hZGNhc3Qoc3RydWN0IF9Xc2JtQ29uZCAqY29uZCkKewogICAgc3RydWN0IF9Xc2JtUENvbmQgKnBDb25kID0gcENvbmRDb252ZXJ0KGNvbmQpOwoKICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnBDb25kLT5jb25kKTsKfQoKc3RhdGljIHZvaWQKcF9jb25kV2FpdChzdHJ1Y3QgX1dzYm1Db25kICpjb25kLCBzdHJ1Y3QgX1dzYm1NdXRleCAqbXV0ZXgpCnsKICAgIHN0cnVjdCBfV3NibVBDb25kICpwQ29uZCA9IHBDb25kQ29udmVydChjb25kKTsKICAgIHN0cnVjdCBfV3NibVBNdXRleCAqcE11dGV4ID0gcE11dGV4Q29udmVydChtdXRleCk7CgogICAgcHRocmVhZF9jb25kX3dhaXQoJnBDb25kLT5jb25kLCAmcE11dGV4LT5tdXRleCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyBwdGhyZWFkRnVuYyA9IHsKICAgIC5tdXRleEluaXQgPSBwX211dGV4SW5pdCwKICAgIC5tdXRleEZyZWUgPSBwX211dGV4RnJlZSwKICAgIC5tdXRleExvY2sgPSBwX211dGV4TG9jaywKICAgIC5tdXRleFVubG9jayA9IHBfbXV0ZXhVbmxvY2ssCiAgICAuY29uZEluaXQgPSBwX2NvbmRJbml0LAogICAgLmNvbmRGcmVlID0gcF9jb25kRnJlZSwKICAgIC5jb25kV2FpdCA9IHBfY29uZFdhaXQsCiAgICAuY29uZEJyb2FkY2FzdCA9IHBfY29uZEJyb2FkY2FzdAp9OwoKc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKgp3c2JtUFRocmVhZEZ1bmNzKHZvaWQpCnsKICAgIHJldHVybiAmcHRocmVhZEZ1bmM7Cn0KCiNlbHNlCiN3YXJuaW5nIFB0aHJlYWRzIGlzIG5vdCBwcmVzZW50LiBDb21waWxpbmcgd2l0aG91dC4KCnN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICoKd3NibVBUaHJlYWRGdW5jcyh2b2lkKQp7CiAgICByZXR1cm4gJnB0aHJlYWRGdW5jOwp9CgojZW5kaWYK