LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRYLiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAyMDA5IFZtd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICogICAgICAgICAgS2VpdGggV2hpdHdlbGwgPGtlaXRody1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBfV1NCTV9NQU5BR0VSX0hfCiNkZWZpbmUgX1dTQk1fTUFOQUdFUl9IXwojaW5jbHVkZSAid3NibV9mZW5jZW1nci5oIgojaW5jbHVkZSAid3NibV91dGlsLmgiCiNpbmNsdWRlICJ3c2JtX2RyaXZlci5oIgoKI2RlZmluZSBXU0JNX1ZFUlNJT05fTUFKT1IgMQojZGVmaW5lIFdTQk1fVkVSU0lPTl9NSU5PUiAxCiNkZWZpbmUgV1NCTV9WRVJTSU9OX1BMIDAKCnN0cnVjdCBfV3NibUZlbmNlT2JqZWN0OwpzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3Q7CnN0cnVjdCBfV3NibUJ1ZmZlclBvb2w7CnN0cnVjdCBfV3NibUJ1ZmZlckxpc3Q7CgovKgogKiBUaGVzZSBmbGFncyBtaW1pY3MgdGhlIFRUTSBjbG9zZWx5LCBidXQgc2luY2UKICogdGhpcyBsaWJyYXJ5IGlzIG5vdCBkZXBlbmRhbnQgb24gVFRNLCB3ZSBuZWVkIHRvCiAqIHJlcGxpY2F0ZSB0aGVtIGhlcmUsIGFuZCBpZiB0aGVyZSBpcyBhIGRpc2NyZXBhbmN5LAogKiB0aGF0IG5lZWRzIHRvIGJlIHJlc29sdmVkIGluIHRoZSBidWZmZXIgcG9vbCB1c2luZwogKiB0aGUgVFRNIGZsYWdzLgogKi8KCiNkZWZpbmUgV1NCTV9QTF9NQVNLX01FTSAgICAgICAgIDB4MDAwMEZGRkYKCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1NZU1RFTSAgICAgICgxIDw8IDApCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1RUICAgICAgICAgICgxIDw8IDEpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1ZSQU0gICAgICAgICgxIDw8IDIpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1BSSVYwICAgICAgICgxIDw8IDMpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1NXQVBQRUQgICAgICgxIDw8IDE1KQojZGVmaW5lIFdTQk1fUExfRkxBR19DQUNIRUQgICAgICAoMSA8PCAxNikKI2RlZmluZSBXU0JNX1BMX0ZMQUdfVU5DQUNIRUQgICAgKDEgPDwgMTcpCiNkZWZpbmUgV1NCTV9QTF9GTEFHX1dDICAgICAgICAgICgxIDw8IDE4KQojZGVmaW5lIFdTQk1fUExfRkxBR19TSEFSRUQgICAgICAoMSA8PCAyMCkKI2RlZmluZSBXU0JNX1BMX0ZMQUdfTk9fRVZJQ1QgICAgKDEgPDwgMjEpCgojZGVmaW5lIFdTQk1fQUNDRVNTX1JFQUQgICAgICAgICAoMSA8PCAwKQojZGVmaW5lIFdTQk1fQUNDRVNTX1dSSVRFICAgICAgICAoMSA8PCAxKQoKI2RlZmluZSBXU0JNX1NZTkNDUFVfUkVBRCAgICAgICAgV1NCTV9BQ0NFU1NfUkVBRAojZGVmaW5lIFdTQk1fU1lOQ0NQVV9XUklURSAgICAgICBXU0JNX0FDQ0VTU19XUklURQojZGVmaW5lIFdTQk1fU1lOQ0NQVV9ET05UX0JMT0NLICAoMSA8PCAyKQojZGVmaW5lIFdTQk1fU1lOQ0NQVV9UUllfQ0FDSEVEICAoMSA8PCAzKQoKZXh0ZXJuIHZvaWQgKndzYm1CT01hcChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwgdW5zaWduZWQgbW9kZSk7CmV4dGVybiB2b2lkIHdzYm1CT1VubWFwKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKZXh0ZXJuIGludCB3c2JtQk9TeW5jRm9yQ3B1KHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLCB1bnNpZ25lZCBtb2RlKTsKZXh0ZXJuIHZvaWQgd3NibUJPUmVsZWFzZUZyb21DcHUoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCQkgdW5zaWduZWQgbW9kZSk7CgpleHRlcm4gdW5zaWduZWQgbG9uZyB3c2JtQk9PZmZzZXRIaW50KHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd3NibUJPUG9vbE9mZnNldChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CgpleHRlcm4gdWludDMyX3Qgd3NibUJPUGxhY2VtZW50SGludChzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKndzYm1CT1JlZmVyZW5jZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QKCQkJCQkJICpidWYpOwpleHRlcm4gdm9pZCB3c2JtQk9VbnJlZmVyZW5jZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKipwX2J1Zik7CgpleHRlcm4gaW50IHdzYm1CT0RhdGEoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpyX2J1ZiwKCQkgICAgICB1bnNpZ25lZCBzaXplLCBjb25zdCB2b2lkICpkYXRhLAoJCSAgICAgIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsIHVpbnQzMl90IHBsYWNlbWVudCk7CgpleHRlcm4gaW50IHdzYm1CT0RhdGFVQihzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwKICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSwgc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqbmV3UG9vbCwKICAgICAgICAgICAgdWludDMyX3QgcGxhY2VtZW50LCBjb25zdCB1bnNpZ25lZCBsb25nICp1c2VyX3B0ciwgaW50IGZkKTsKCmV4dGVybiBpbnQgd3NibUJPU2V0U3RhdHVzKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLAoJCQkgICB1aW50MzJfdCBzZXRQbGFjZW1lbnQsIHVpbnQzMl90IGNsclBsYWNlbWVudCk7CmV4dGVybiBpbnQgd3NibUJPU3ViRGF0YShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwKCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCgkJCSBjb25zdCB2b2lkICpkYXRhLAoJCQkgaW50ICgqYWNjZWxDb3B5KSAoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICosCgkJCQkJICAgc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICopKTsKZXh0ZXJuIHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqd3NibUJPQ2xvbmUoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCQkJICAgICBpbnQgKCphY2NlbENvcHkpIChzdHJ1Y3QKCQkJCQkJCSAgICAgICBfV3NibUJ1ZmZlck9iamVjdAoJCQkJCQkJICAgICAgICosCgkJCQkJCQkgICAgICAgc3RydWN0CgkJCQkJCQkgICAgICAgX1dzYm1CdWZmZXJPYmplY3QKCQkJCQkJCSAgICAgICAqKSk7CgpleHRlcm4gaW50IHdzYm1CT0dldFN1YkRhdGEoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkgICAgdm9pZCAqZGF0YSk7CmV4dGVybiBpbnQgd3NibUdlbkJ1ZmZlcnMoc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbCwKCQkJICB1bnNpZ25lZCBuLAoJCQkgIHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmZmVyc1tdLAoJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgdWludDMyX3QgcGxhY2VtZW50KTsKCnN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqd3NibUJPQ3JlYXRlU2ltcGxlKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsCgkJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkJICAgICB1aW50MzJfdCBwbGFjZW1lbnQsCgkJCQkJICAgICB1bnNpZ25lZCBhbGlnbm1lbnQsCgkJCQkJICAgICBzaXplX3QgZXh0cmFfc2l6ZSwKCQkJCQkgICAgIHNpemVfdCAqIG9mZnNldCk7CgpleHRlcm4gdm9pZCB3c2JtRGVsZXRlQnVmZmVycyh1bnNpZ25lZCBuLAoJCQkgICAgICBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZmZlcnNbXSk7CmV4dGVybiBzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0ICp3c2JtQk9DcmVhdGVMaXN0KGludCB0YXJnZXQsCgkJCQkJCWludCBoYXNLZXJuZWxCdWZmZXJzKTsKZXh0ZXJuIGludCB3c2JtQk9SZXNldExpc3Qoc3RydWN0IF9Xc2JtQnVmZmVyTGlzdCAqbGlzdCk7CmV4dGVybiBpbnQgd3NibUJPQWRkTGlzdEl0ZW0oc3RydWN0IF9Xc2JtQnVmZmVyTGlzdCAqbGlzdCwKCQkJICAgICBzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1ZiwKCQkJICAgICB1aW50NjRfdCBmbGFncywgdWludDY0X3QgbWFzaywgaW50ICppdGVtTG9jLAoJCQkgICAgIHN0cnVjdCBfVmFsaWRhdGVOb2RlICoqbm9kZSk7CgpleHRlcm4gdm9pZCB3c2JtQk9GcmVlTGlzdChzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0ICpsaXN0KTsKZXh0ZXJuIGludCB3c2JtQk9GZW5jZVVzZXJMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QsCgkJCSAgICAgICBzdHJ1Y3QgX1dzYm1GZW5jZU9iamVjdCAqZmVuY2UpOwoKZXh0ZXJuIGludCB3c2JtQk9VbnJlZlVzZXJMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QpOwpleHRlcm4gaW50IHdzYm1CT1ZhbGlkYXRlVXNlckxpc3Qoc3RydWN0IF9Xc2JtQnVmZmVyTGlzdCAqbGlzdCk7CmV4dGVybiBpbnQgd3NibUJPVW52YWxpZGF0ZVVzZXJMaXN0KHN0cnVjdCBfV3NibUJ1ZmZlckxpc3QgKmxpc3QpOwoKZXh0ZXJuIHZvaWQgd3NibUJPRmVuY2Uoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCXN0cnVjdCBfV3NibUZlbmNlT2JqZWN0ICpmZW5jZSk7CgpleHRlcm4gdm9pZCB3c2JtUG9vbFRha2VEb3duKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wpOwpleHRlcm4gaW50IHdzYm1CT1NldFJlZmVyZW5jZWQoc3RydWN0IF9Xc2JtQnVmZmVyT2JqZWN0ICpidWYsCgkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhhbmRsZSk7CnVuc2lnbmVkIGxvbmcgd3NibUJPU2l6ZShzdHJ1Y3QgX1dzYm1CdWZmZXJPYmplY3QgKmJ1Zik7CmV4dGVybiB2b2lkIHdzYm1CT1dhaXRJZGxlKHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmLCBpbnQgbGF6eSk7CmV4dGVybiBpbnQgd3NibUJPT25MaXN0KGNvbnN0IHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKCmV4dGVybiB2b2lkIHdzYm1Qb29sVGFrZURvd24oc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbCk7CgpleHRlcm4gdm9pZCB3c2JtUmVhZExvY2tLZXJuZWxCTyh2b2lkKTsKZXh0ZXJuIHZvaWQgd3NibVJlYWRVbmxvY2tLZXJuZWxCTyh2b2lkKTsKZXh0ZXJuIHZvaWQgd3NibVdyaXRlTG9ja0tlcm5lbEJPKHZvaWQpOwpleHRlcm4gdm9pZCB3c2JtV3JpdGVVbmxvY2tLZXJuZWxCTyh2b2lkKTsKCmV4dGVybiBpbnQgd3NibUluaXQoc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKnRmLCBzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzICp2Zik7CmV4dGVybiB2b2lkIHdzYm1UYWtlZG93bih2b2lkKTsKZXh0ZXJuIGludCB3c2JtSXNJbml0aWFsaXplZCh2b2lkKTsKZXh0ZXJuIHZvaWQgd3NibUNvbW1vbkRhdGFTZXQodm9pZCAqZCk7CmV4dGVybiB2b2lkICp3c2JtQ29tbW9uRGF0YUdldCh2b2lkKTsKCmV4dGVybiBzdHJ1Y3QgX1ZhbGlkYXRlTGlzdCAqd3NibUdldEtlcm5lbFZhbGlkYXRlTGlzdChzdHJ1Y3QgX1dzYm1CdWZmZXJMaXN0CgkJCQkJCSAgICAgICAqbGlzdCk7CmV4dGVybiBzdHJ1Y3QgX1ZhbGlkYXRlTGlzdCAqd3NibUdldFVzZXJWYWxpZGF0ZUxpc3Qoc3RydWN0IF9Xc2JtQnVmZmVyTGlzdAoJCQkJCQkgICAgICpsaXN0KTsKCmV4dGVybiBzdHJ1Y3QgX1ZhbGlkYXRlTm9kZSAqdmFsaWRhdGVMaXN0Tm9kZSh2b2lkICppdGVyYXRvcik7CmV4dGVybiB2b2lkICp2YWxpZGF0ZUxpc3RJdGVyYXRvcihzdHJ1Y3QgX1ZhbGlkYXRlTGlzdCAqbGlzdCk7CmV4dGVybiB2b2lkICp2YWxpZGF0ZUxpc3ROZXh0KHN0cnVjdCBfVmFsaWRhdGVMaXN0ICpsaXN0LCB2b2lkICppdGVyYXRvcik7CgpleHRlcm4gdWludDMyX3Qgd3NibUtCdWZIYW5kbGUoY29uc3Qgc3RydWN0IF9Xc2JtS2VybmVsQnVmICopOwpleHRlcm4gdm9pZCB3c2JtVXBkYXRlS0J1ZihzdHJ1Y3QgX1dzYm1LZXJuZWxCdWYgKiwKCQkJICAgdWludDY0X3QgZ3B1T2Zmc2V0LAoJCQkgICB1aW50MzJfdCBwbGFjZW1lbnQsIHVpbnQzMl90IGZlbmNlX2ZsYWdzKTsKCmV4dGVybiBzdHJ1Y3QgX1dzYm1LZXJuZWxCdWYgKndzYm1LQnVmKGNvbnN0IHN0cnVjdCBfV3NibUJ1ZmZlck9iamVjdCAqYnVmKTsKCiNlbmRpZgo=