LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAyMDA5IFZtd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICogICAgICAgICAgS2VpdGggV2hpdHdlbGwgPGtlaXRody1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBfV1NCTV9NQU5BR0VSX0hfCiNkZWZpbmUgX1dTQk1fTUFOQUdFUl9IXwojaW5jbHVkZSAid3NibV9mZW5jZW1nci5oIgojaW5jbHVkZSAid3NibV91dGlsLmgiCiNpbmNsdWRlICJ3c2JtX2RyaXZlci5oIgoKI2RlZmluZSBXU0JNX1ZFUlNJT05fTUFKT1IgMQojZGVmaW5lIFdTQk1fVkVSU0lPTl9NSU5PUiAxCiNkZWZpbmUgV1NCTV9WRVJTSU9OX1BMIDAKCnN0cnVjdCBfV3NibUZlbmNlT2JqZWN0OwpzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3Q7CnN0cnVjdCBfV3NibUJ1ZmZlclBvb2w7CnN0cnVjdCBfV3NibUJ1ZmZlckxpc3Q7CgovKgogKiBUaGVzZSBmbGFncyBtaW1pY3MgdGhlIFRUTSBjbG9zZWx5LCBidXQgc2luY2UKICogdGhpcyBsaWJyYXJ5IGlzIG5vdCBkZXBlbmRhbnQgb24gVFRNLCB3ZSBuZWVkIHRvCiAqIHJlcGxpY2F0ZSB0aGVtIGhlcmUsIGFuZCBpZiB0aGVyZSBpcyBhIGRpc2NyZXBhbmN5LAogKiB0aGF0IG5lZWRzIHRvIGJlIHJlc29sdmVkIGluIHRoZSBidWZmZXIgcG9vbCB1c2luZwogKiB0aGUgVFRNIGZsYWdzLgogKi8KCiNkZWZpbmUgV1NCTV9QTF9NQVNLX01FTSAgICAgICAgIDB4MDAwMEZGRkYKCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1NZU1RFTSAgICAgICgxIDw8IDApCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1RUICAgICAgICAgICgxIDw8IDEpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1ZSQU0gICAgICAgICgxIDw8IDIpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1BSSVYwICAgICAgICgxIDw8IDMpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1NXQVBQRUQgICAgICgxIDw8IDE1KQojZGVmaW5lIFdTQk1fUExfRkxBR19DQUNIRUQgICAgICAoMSA8PCAxNikKI2RlZmluZSBXU0JNX1BMX0ZMQUdfVU5DQUNIRUQgICAgKDEgPDwgMTcpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1dDICAgICAgICAgICgxIDw8IDE4KQojZGVmaW5lIFdTQk1fUExfRkxBR19TSEFSRUQgICAgICAoMSA8PCAyMCkKI2RlZmluZSBXU0JNX1BMX0ZMQUdfTk9fRVZJQ1QgICAgKDEgPDwgMjEpCgojZGVmaW5lIFdTQk1fQUNDRVNTX1JFQUQgICAgICAgICAoMSA8PCAwKQojZGVmaW5lIFdTQk1fQUNDRVNTX1dSSVRFICAgICAgICAoMSA8PCAxKQoKI2RlZmluZSBXU0JNX1NZTkNDUFVfUkVBRCAgICAgICAgV1NCTV9BQ0NFU1NfUkVBRAojZGVmaW5lIFdTQk1fU1lOQ0NQVV9XUklURSAgICAgICBXU0JNX0FDQ0VTU19XUklURQojZGVmaW5lIFdTQk1fU1lOQ0NQVV9ET05UX0JMT0NLICAoMSA8PCAyKQojZGVmaW5lIFdTQk1fU1lOQ0NQVV9UUllfQ0FDSEVEICAoMSA8PCAzKQoKZXh0ZXJuIHZvaWQgKndzYm1CT01hcChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwgdW5zaWduZWQgbW9kZSk7CmV4dGVybiB2b2lkIHdzYm1CT1VubWFwKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKZXh0ZXJuIGludCB3c2JtQk9TeW5jRm9yQ3B1KHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLCB1bnNpZ25lZCBtb2RlKTsKZXh0ZXJuIHZvaWQgd3NibUJPUmVsZWFzZUZyb21DcHUoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCQkgdW5zaWduZWQgbW9kZSk7CgpleHRlcm4gdW5zaWduZWQgbG9uZyB3c2JtQk9PZmZzZXRIaW50KHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd3NibUJPUG9vbE9mZnNldChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CgpleHRlcm4gdWludDMyX3Qgd3NibUJPUGxhY2VtZW50SGludChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKndzYm1CT1JlZmVyZW5jZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QKCQkJCQkJICpidWYpOwpleHRlcm4gdm9pZCB3c2JtQk9VbnJlZmVyZW5jZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKipwX2J1Zik7CgpleHRlcm4gaW50IHdzYm1CT0RhdGEoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpyX2J1ZiwKCQkgICAgICB1bnNpZ25lZCBzaXplLCBjb25zdCB2b2lkICpkYXRhLAoJCSAgICAgIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsIHVpbnQzMl90IHBsYWNlbWVudCk7CgpleHRlcm4gaW50IHdzYm1CT0RhdGFVQihzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwKICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSwgc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqbmV3UG9vbCwKICAgICAgICAgICAgdWludDMyX3QgcGxhY2VtZW50LCBjb25zdCB1bnNpZ25lZCBsb25nICp1c2VyX3B0cik7CgpleHRlcm4gaW50IHdzYm1CT1NldFN0YXR1cyhzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwKCQkJICAgdWludDMyX3Qgc2V0UGxhY2VtZW50LCB1aW50MzJfdCBjbHJQbGFjZW1lbnQpOwpleHRlcm4gaW50IHdzYm1CT1N1YkRhdGEoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkgY29uc3Qgdm9pZCAqZGF0YSwKCQkJIGludCAoKmFjY2VsQ29weSkgKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqLAoJCQkJCSAgIHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqKSk7CmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKndzYm1CT0Nsb25lKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLAoJCQkJCSAgICAgaW50ICgqYWNjZWxDb3B5KSAoc3RydWN0CgkJCQkJCQkgICAgICAgX1dzYm1CdWZmZXJPYmplY3QKCQkJCQkJCSAgICAgICAqLAoJCQkJCQkJICAgICAgIHN0cnVjdAoJCQkJCQkJICAgICAgIF9Xc2JtQnVmZmVyT2JqZWN0CgkJCQkJCQkgICAgICAgKikpOwoKZXh0ZXJuIGludCB3c2JtQk9HZXRTdWJEYXRhKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLAoJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJICAgIHZvaWQgKmRhdGEpOwpleHRlcm4gaW50IHdzYm1HZW5CdWZmZXJzKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsCgkJCSAgdW5zaWduZWQgbiwKCQkJICBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZmZlcnNbXSwKCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQsIHVpbnQzMl90IHBsYWNlbWVudCk7CgpzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKndzYm1CT0NyZWF0ZVNpbXBsZShzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sLAoJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJCSAgICAgdWludDMyX3QgcGxhY2VtZW50LAoJCQkJCSAgICAgdW5zaWduZWQgYWxpZ25tZW50LAoJCQkJCSAgICAgc2l6ZV90IGV4dHJhX3NpemUsCgkJCQkJICAgICBzaXplX3QgKiBvZmZzZXQpOwoKZXh0ZXJuIHZvaWQgd3NibURlbGV0ZUJ1ZmZlcnModW5zaWduZWQgbiwKCQkJICAgICAgc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWZmZXJzW10pOwpleHRlcm4gc3RydWN0IF9Xc2JtQnVmZmVyTGlzdCAqd3NibUJPQ3JlYXRlTGlzdChpbnQgdGFyZ2V0LAoJCQkJCQlpbnQgaGFzS2VybmVsQnVmZmVycyk7CmV4dGVybiBpbnQgd3NibUJPUmVzZXRMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QpOwpleHRlcm4gaW50IHdzYm1CT0FkZExpc3RJdGVtKHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QsCgkJCSAgICAgc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCSAgICAgdWludDY0X3QgZmxhZ3MsIHVpbnQ2NF90IG1hc2ssIGludCAqaXRlbUxvYywKCQkJICAgICBzdHJ1Y3QgX1ZhbGlkYXRlTm9kZSAqKm5vZGUpOwoKZXh0ZXJuIHZvaWQgd3NibUJPRnJlZUxpc3Qoc3RydWN0IF9Xc2JtQnVmZmVyTGlzdCAqbGlzdCk7CmV4dGVybiBpbnQgd3NibUJPRmVuY2VVc2VyTGlzdChzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0ICpsaXN0LAoJCQkgICAgICAgc3RydWN0IF9Xc2JtRmVuY2VPYmplY3QgKmZlbmNlKTsKCmV4dGVybiBpbnQgd3NibUJPVW5yZWZVc2VyTGlzdChzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0ICpsaXN0KTsKZXh0ZXJuIGludCB3c2JtQk9WYWxpZGF0ZVVzZXJMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QpOwpleHRlcm4gaW50IHdzYm1CT1VudmFsaWRhdGVVc2VyTGlzdChzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0ICpsaXN0KTsKCmV4dGVybiB2b2lkIHdzYm1CT0ZlbmNlKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLAoJCQlzdHJ1Y3QgX1dzYm1GZW5jZU9iamVjdCAqZmVuY2UpOwoKZXh0ZXJuIHZvaWQgd3NibVBvb2xUYWtlRG93bihzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sKTsKZXh0ZXJuIGludCB3c2JtQk9TZXRSZWZlcmVuY2VkKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLAoJCQkgICAgICAgdW5zaWduZWQgbG9uZyBoYW5kbGUpOwp1bnNpZ25lZCBsb25nIHdzYm1CT1NpemUoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYpOwpleHRlcm4gdm9pZCB3c2JtQk9XYWl0SWRsZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwgaW50IGxhenkpOwpleHRlcm4gaW50IHdzYm1CT09uTGlzdChjb25zdCBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CgpleHRlcm4gdm9pZCB3c2JtUG9vbFRha2VEb3duKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wpOwoKZXh0ZXJuIHZvaWQgd3NibVJlYWRMb2NrS2VybmVsQk8odm9pZCk7CmV4dGVybiB2b2lkIHdzYm1SZWFkVW5sb2NrS2VybmVsQk8odm9pZCk7CmV4dGVybiB2b2lkIHdzYm1Xcml0ZUxvY2tLZXJuZWxCTyh2b2lkKTsKZXh0ZXJuIHZvaWQgd3NibVdyaXRlVW5sb2NrS2VybmVsQk8odm9pZCk7CgpleHRlcm4gaW50IHdzYm1Jbml0KHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICp0Ziwgc3RydWN0IF9Xc2JtVk5vZGVGdW5jcyAqdmYpOwpleHRlcm4gdm9pZCB3c2JtVGFrZWRvd24odm9pZCk7CmV4dGVybiBpbnQgd3NibUlzSW5pdGlhbGl6ZWQodm9pZCk7CmV4dGVybiB2b2lkIHdzYm1Db21tb25EYXRhU2V0KHZvaWQgKmQpOwpleHRlcm4gdm9pZCAqd3NibUNvbW1vbkRhdGFHZXQodm9pZCk7CgpleHRlcm4gc3RydWN0IF9WYWxpZGF0ZUxpc3QgKndzYm1HZXRLZXJuZWxWYWxpZGF0ZUxpc3Qoc3RydWN0IF9Xc2JtQnVmZmVyTGlzdAoJCQkJCQkgICAgICAgKmxpc3QpOwpleHRlcm4gc3RydWN0IF9WYWxpZGF0ZUxpc3QgKndzYm1HZXRVc2VyVmFsaWRhdGVMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QKCQkJCQkJICAgICAqbGlzdCk7CgpleHRlcm4gc3RydWN0IF9WYWxpZGF0ZU5vZGUgKnZhbGlkYXRlTGlzdE5vZGUodm9pZCAqaXRlcmF0b3IpOwpleHRlcm4gdm9pZCAqdmFsaWRhdGVMaXN0SXRlcmF0b3Ioc3RydWN0IF9WYWxpZGF0ZUxpc3QgKmxpc3QpOwpleHRlcm4gdm9pZCAqdmFsaWRhdGVMaXN0TmV4dChzdHJ1Y3QgX1ZhbGlkYXRlTGlzdCAqbGlzdCwgdm9pZCAqaXRlcmF0b3IpOwoKZXh0ZXJuIHVpbnQzMl90IHdzYm1LQnVmSGFuZGxlKGNvbnN0IHN0cnVjdCBfV3NibUtlcm5lbEJ1ZiAqKTsKZXh0ZXJuIHZvaWQgd3NibVVwZGF0ZUtCdWYoc3RydWN0IF9Xc2JtS2VybmVsQnVmICosCgkJCSAgIHVpbnQ2NF90IGdwdU9mZnNldCwKCQkJICAgdWludDMyX3QgcGxhY2VtZW50LCB1aW50MzJfdCBmZW5jZV9mbGFncyk7CgpleHRlcm4gc3RydWN0IF9Xc2JtS2VybmVsQnVmICp3c2JtS0J1Zihjb25zdCBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CgojZW5kaWYK