LyoKICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICoKICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgogKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICovCiNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICiNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4KCi8qCiAqIEFsZ29yaXRobSBtYXNrcyBhbmQgdHlwZXMuCiAqLwojZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUgkJMHgwMDAwMDAwMQojZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ESUdFU1QJCTB4MDAwMDAwMDIKI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAoKLyoKICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgogKi8KI2RlZmluZSBDUllQVE9fVEZNX01PREVfTUFTSwkJMHgwMDAwMDBmZgojZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19NQVNLCQkweGZmZjAwMDAwCgojZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0JDCQkweDAwMDAwMDAyCiNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NGQgkJMHgwMDAwMDAwNAojZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOICAgCTB4MDAyMDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEIAkweDAwNDAwMDAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9GTEFHUyAJMHgwMTAwMDAwMAoKLyoKICogTWlzY2VsbGFuZW91cyBzdHVmZi4KICovCiNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKI2RlZmluZSBDUllQVE9fTUFYX0FMR19OQU1FCQk2NAoKI2RlZmluZSBDUllQVE9fRElSX0VOQ1JZUFQJCTEKI2RlZmluZSBDUllQVE9fRElSX0RFQ1JZUFQJCTAKCnN0cnVjdCBzY2F0dGVybGlzdDsKCi8qCiAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCiAqLwpzdHJ1Y3QgY2lwaGVyX2FsZyB7Cgl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOwoJdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKCWludCAoKmNpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOwoJdm9pZCAoKmNpYV9lbmNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwp9OwoKc3RydWN0IGRpZ2VzdF9hbGcgewoJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOwoJdm9pZCAoKmRpYV9pbml0KSh2b2lkICpjdHgpOwoJdm9pZCAoKmRpYV91cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOwoJdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKCWludCAoKmRpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOwp9OwoKc3RydWN0IGNvbXByZXNzX2FsZyB7CglpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKCXZvaWQgKCpjb2FfZXhpdCkodm9pZCAqY3R4KTsKCWludCAoKmNvYV9jb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKCWludCAoKmNvYV9kZWNvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAoJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cn07CgojZGVmaW5lIGNyYV9jaXBoZXIJY3JhX3UuY2lwaGVyCiNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKI2RlZmluZSBjcmFfY29tcHJlc3MJY3JhX3UuY29tcHJlc3MKCnN0cnVjdCBjcnlwdG9fYWxnIHsKCXN0cnVjdCBsaXN0X2hlYWQgY3JhX2xpc3Q7Cgl1MzIgY3JhX2ZsYWdzOwoJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7Cgl1bnNpZ25lZCBpbnQgY3JhX2N0eHNpemU7Cgljb25zdCBjaGFyIGNyYV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwoKCXVuaW9uIHsKCQlzdHJ1Y3QgY2lwaGVyX2FsZyBjaXBoZXI7CgkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OwoJCXN0cnVjdCBjb21wcmVzc19hbGcgY29tcHJlc3M7Cgl9IGNyYV91OwoJCglzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOwp9OwoKLyoKICogQWxnb3JpdGhtIHJlZ2lzdHJhdGlvbiBpbnRlcmZhY2UuCiAqLwppbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKaW50IGNyeXB0b191bnJlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKCi8qCiAqIEFsZ29yaXRobSBxdWVyeSBpbnRlcmZhY2UuCiAqLwojaWZkZWYgQ09ORklHX0NSWVBUTwppbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKI2Vsc2UKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQp7CglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcwogKiBhbmQgY29yZSBwcm9jZXNzaW5nIGxvZ2ljLiAgTWFuYWdlZCB2aWEgY3J5cHRvX2FsbG9jX3RmbSgpIGFuZAogKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgogKi8Kc3RydWN0IGNyeXB0b190Zm07CgpzdHJ1Y3QgY2lwaGVyX3RmbSB7Cgl2b2lkICpjaXRfaXY7Cgl1bnNpZ25lZCBpbnQgY2l0X2l2c2l6ZTsKCXUzMiBjaXRfbW9kZTsKCWludCAoKmNpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqY2l0X2VuY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKCWludCAoKmNpdF9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKCXZvaWQgKCpjaXRfeG9yX2Jsb2NrKSh1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKfTsKCnN0cnVjdCBkaWdlc3RfdGZtIHsKCXZvaWQgKCpkaXRfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKCXZvaWQgKCpkaXRfZmluYWwpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpOwoJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CglpbnQgKCpkaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CiNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKCXZvaWQgKmRpdF9obWFjX2Jsb2NrOwojZW5kaWYKfTsKCnN0cnVjdCBjb21wcmVzc190Zm0gewoJaW50ICgqY290X2NvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKCWludCAoKmNvdF9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAoJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cn07CgojZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCiNkZWZpbmUgY3J0X2RpZ2VzdAljcnRfdS5kaWdlc3QKI2RlZmluZSBjcnRfY29tcHJlc3MJY3J0X3UuY29tcHJlc3MKCnN0cnVjdCBjcnlwdG9fdGZtIHsKCgl1MzIgY3J0X2ZsYWdzOwoJCgl1bmlvbiB7CgkJc3RydWN0IGNpcGhlcl90Zm0gY2lwaGVyOwoJCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKCQlzdHJ1Y3QgY29tcHJlc3NfdGZtIGNvbXByZXNzOwoJfSBjcnRfdTsKCQoJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKfTsKCi8qIAogKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCiAqLwogCi8qCiAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KICogSWYgdGhhdCBmYWlscyBhbmQgdGhlIGtlcm5lbCBzdXBwb3J0cyBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzLCBpdAogKiB3aWxsIHRoZW4gYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIG9mIHRoZSBzYW1lIG5hbWUgb3IgYWxpYXMuICBBIHJlZmNvdW50CiAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KICoKICogY3J5cHRvX2ZyZWVfdGZtKCkgZnJlZXMgdXAgdGhlIHRyYW5zZm9ybSBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLAogKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCiAqLwpzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7CnZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwoKLyoKICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgogKi8Kc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19uYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX25hbWU7Cn0KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbW9kbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gbW9kdWxlX25hbWUodGZtLT5fX2NydF9hbGctPmNyYV9tb2R1bGUpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19tYXhfa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKfQoKLyoKICogQVBJIHdyYXBwZXJzLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwoJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2cpCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Cgl0Zm0tPmNydF9kaWdlc3QuZGl0X3VwZGF0ZSh0Zm0sIHNnLCBuc2cpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwoJdGZtLT5jcnRfZGlnZXN0LmRpdF9maW5hbCh0Zm0sIG91dCk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2RpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Cgl0Zm0tPmNydF9kaWdlc3QuZGl0X2RpZ2VzdCh0Zm0sIHNnLCBuc2csIG91dCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19kaWdlc3Rfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CglpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT1NZUzsKCXJldHVybiB0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCW1lbWNweShkc3QsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfZGVjb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKfQoKLyoKICogSE1BQyBzdXBwb3J0LgogKi8KI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwp2b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwp2b2lkIGNyeXB0b19obWFjX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKdm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqa2V5bGVuLCB1OCAqb3V0KTsKdm9pZCBjcnlwdG9faG1hYyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbiwKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKI2VuZGlmCS8qIENPTkZJR19DUllQVE9fSE1BQyAqLwoKI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLwoK