From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from web53609.mail.re2.yahoo.com (web53609.mail.re2.yahoo.com [206.190.37.42]) by ozlabs.org (Postfix) with SMTP id 6A6E9DDDF2 for ; Fri, 7 Dec 2007 23:56:47 +1100 (EST) Date: Fri, 7 Dec 2007 04:56:46 -0800 (PST) From: Santanu Sen Subject: Re: NAND JFFS2 wbuf non-contiguous write problem in linux-2.4.20 To: linuxppc-embedded@ozlabs.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1032742541-1197032206=:11498" Message-ID: <397926.11498.qm@web53609.mail.re2.yahoo.com> List-Id: Linux on Embedded PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , --0-1032742541-1197032206=:11498 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Content-Id: Content-Disposition: inline Here is the current version of the wbuf.c we have . Regards. ____________________________________________________________________________________ Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now. http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ --0-1032742541-1197032206=:11498 Content-Type: application/octet-stream; name="wbuf.c" Content-Transfer-Encoding: base64 Content-Description: 590649757-wbuf.c Content-Disposition: attachment; filename="wbuf.c" LyoKICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0s IFZlcnNpb24gMi4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJl ZCBIYXQsIEluYy4KICoKICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2Ug PGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgogKgogKiBGb3IgbGljZW5z aW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRo aXMgZGlyZWN0b3J5LgogKgogKiAkSWQ6IHdidWYuYyx2IDEuMSAyMDAzLzA2 LzI2IDEzOjQzOjIwIGFuaWwgRXhwICQKICoKICovCgojaW5jbHVkZSA8bGlu dXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRl IDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgoj aW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KI2luY2x1ZGUgIm5vZGVsaXN0 LmgiCgovKiBtYXguIGVyYXNlIGZhaWx1cmVzIGJlZm9yZSB3ZSBtYXJrIGEg YmxvY2sgYmFkICovCiNkZWZpbmUgTUFYX0VSQVNFX0ZBSUxVUkVTIAk1Cgov KiB0d28gc2Vjb25kcyB0aW1lb3V0IGZvciB0aW1lZCB3YnVmLWZsdXNoaW5n ICovCiNkZWZpbmUgV0JVRl9GTFVTSF9USU1FT1VUCTIgKiBIWgoKI2RlZmlu ZSBKRkZTMl9PT0JfRUNDUE9TMAkJMAojZGVmaW5lIEpGRlMyX09PQl9FQ0NQ T1MxCQkxCiNkZWZpbmUgSkZGUzJfT09CX0VDQ1BPUzIJCTIKI2RlZmluZSBK RkZTMl9PT0JfRUNDUE9TMwkJMwojZGVmaW5lIEpGRlMyX09PQl9FQ0NQT1M0 CQk2CiNkZWZpbmUgSkZGUzJfT09CX0VDQ1BPUzUJCTcKCiNkZWZpbmUgTkFO RF9KRkZTMl9PT0I4X0ZTREFQT1MJCTYKI2RlZmluZSBOQU5EX0pGRlMyX09P QjE2X0ZTREFQT1MJOAojZGVmaW5lIE5BTkRfSkZGUzJfT09COF9GU0RBTEVO CQkyCiNkZWZpbmUgTkFORF9KRkZTMl9PT0IxNl9GU0RBTEVOCTgKCnN0cnVj dCBuYW5kX29vYmluZm8gamZmczJfb29iaW5mbyA9IHsKCXVzZWVjYzogMSwK CWVjY3Bvczoge0pGRlMyX09PQl9FQ0NQT1MwLCBKRkZTMl9PT0JfRUNDUE9T MSwgSkZGUzJfT09CX0VDQ1BPUzIsIEpGRlMyX09PQl9FQ0NQT1MzLCBKRkZT Ml9PT0JfRUNDUE9TNCwgSkZGUzJfT09CX0VDQ1BPUzV9Cn07CgpzdGF0aWMg aW5saW5lIHZvaWQgamZmczJfcmVmaWxlX3didWZfYmxvY2tzKHN0cnVjdCBq ZmZzMl9zYl9pbmZvICpjKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAq bmV4dDsKCXN0YXRpYyBpbnQgbjsKCglpZiAobGlzdF9lbXB0eSgmYy0+ZXJh c2FibGVfcGVuZGluZ193YnVmX2xpc3QpKQoJCXJldHVybjsKCglsaXN0X2Zv cl9lYWNoX3NhZmUodGhpcywgbmV4dCwgJmMtPmVyYXNhYmxlX3BlbmRpbmdf d2J1Zl9saXN0KSB7CgkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9 IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxp c3QpOwoKCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZXJhc2Vi bG9jayBhdCAweCUwOHggZnJvbSBlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlz dC4uLlxuIiwgamViLT5vZmZzZXQpKTsKCQlsaXN0X2RlbCh0aGlzKTsKCQlp ZiAoKGppZmZpZXMgKyAobisrKSkgJiAxMjcpIHsKCQkJLyogTW9zdCBvZiB0 aGUgdGltZSwgd2UganVzdCBlcmFzZSBpdCBpbW1lZGlhdGVseS4gT3RoZXJ3 aXNlIHdlCgkJCSAgIHNwZW5kIGFnZXMgc2Nhbm5pbmcgaXQgb24gbW91bnQs IGV0Yy4gKi8KCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIi4uLmFuZCBhZGRp bmcgdG8gZXJhc2VfcGVuZGluZ19saXN0XG4iKSk7CgkJCWxpc3RfYWRkX3Rh aWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CgkJCWMt Pm5yX2VyYXNpbmdfYmxvY2tzKys7CgkJCWpmZnMyX2VyYXNlX3BlbmRpbmdf dHJpZ2dlcihjKTsKCQl9IGVsc2UgewoJCQkvKiBTb21ldGltZXMsIGhvd2V2 ZXIsIHdlIGxlYXZlIGl0IGVsc2V3aGVyZSBzbyBpdCBkb2Vzbid0IGdldAoJ CQkgICBpbW1lZGlhdGVseSByZXVzZWQsIGFuZCB3ZSBzcHJlYWQgdGhlIGxv YWQgYSBiaXQuICovCgkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQg YWRkaW5nIHRvIGVyYXNhYmxlX2xpc3RcbiIpKTsKCQkJbGlzdF9hZGRfdGFp bCgmamViLT5saXN0LCAmYy0+ZXJhc2FibGVfbGlzdCk7CgkJfQoJfQp9Cgov KiAKKglUaW1lZCBmbHVzaGluZyBvZiB3YnVmLiBJZiB3ZSBoYXZlIG5vIGNv bnNlY3V0aXZlIHdyaXRlIHRvIHdidWYsIHdpdGhpbgkKKgl0aGUgc3BlY2lm aWVkIHRpbWUsIHdlIGZsdXNoIHRoZSBjb250ZW50cyB3aXRoIHBhZGRpbmcg IQoqLwp2b2lkIGpmZnMyX3didWZfdGltZW91dCAodW5zaWduZWQgbG9uZyBk YXRhKQp7CglzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IChzdHJ1Y3QgamZm czJfc2JfaW5mbyAqKSBkYXRhOwoJLyogCgkqIFdha2UgdXAgdGhlIGZsdXNo IHByb2Nlc3MsIHdlIG5lZWQgcHJvY2VzcyBjb250ZXh0IHRvIGhhdmUgdGhl IHJpZ2h0IAoJKiB0byBzbGVlcCBvbiBmbGFzaCB3cml0ZQoJKi8KCUQxKHBy aW50ayhLRVJOX0RFQlVHICJqZmZzMl93YnVmX3RpbWVvdXQoKTogdGltZXIg ZXhwaXJlZFxuIikpOwoJc2NoZWR1bGVfd29yaygmYy0+d2J1Zl90YXNrKTsK fQoKLyoKKglQcm9jZXNzIGZvciB0aW1lZCB3YnVmIGZsdXNoCioKKglGSVhN RSBXaGF0IGhhcHBlbnMsIGlmIHdlIGhhdmUgYSB3cml0ZSBmYWlsdXJlIHRo ZXJlID8/Pz8KKi8Kdm9pZCBqZmZzMl93YnVmX3Byb2Nlc3MgKHZvaWQgKmRh dGEpCnsKCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gKHN0cnVjdCBqZmZz Ml9zYl9pbmZvICopIGRhdGE7CQoJCglEMShwcmludGsoS0VSTl9ERUJVRyAi amZmczJfd2J1Zl9wcm9jZXNzKCkgZW50ZXJlZFxuIikpOwoJCgkvKiBDaGVj aywgaWYgdGhlIHRpbWVyIGlzIGFjdGl2ZSBhZ2FpbiAqLwoJaWYgKHRpbWVy X3BlbmRpbmcgKCZjLT53YnVmX3RpbWVyKSkgewoJCUQxKHByaW50ayAoS0VS Tl9ERUJVRyAiTm90aGluZyB0byBkbywgdGltZXIgaXMgYWN0aXZlIGFnYWlu XG4iKSk7CgkJcmV0dXJuOwoJfQoKCWlmIChkb3duX3RyeWxvY2soJmMtPmFs bG9jX3NlbSkpIHsKCQkvKiBJZiBzb21lb25lIGVsc2UgaGFzIHRoZSBhbGxv Y19zZW0sIHRoZXkncmUgYWJvdXQgdG8KCQkgICB3cml0ZSBhbnl3YXkuIFNv IG5vIG5lZWQgdG8gd2FzdGUgc3BhY2UgYnkKCQkgICBwYWRkaW5nICovCgkJ RDEocHJpbnRrIChLRVJOX0RFQlVHICJqZmZzMl93YnVmX3Byb2Nlc3MoKSBh bGxvY19zZW0gYWxyZWFkeSBvY2N1cGllZFxuIikpOwoJCXJldHVybjsKCX0J CgoJRDEocHJpbnRrIChLRVJOX0RFQlVHICJqZmZzMl93YnVmX3Byb2Nlc3Mo KSBhbGxvY19zZW0gZ290XG4iKSk7CgoJaWYgKCFjLT5uZXh0YmxvY2spIHsK CQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfd2J1Zl9wcm9jZXNzKCk6 IG5leHRibG9jayBOVUxMLCBub3RoaW5nIHRvIGRvXG4iKSk7CgkJaWYgKGMt PndidWZfbGVuKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3di dWZfcHJvY2VzcygpOiBjLT53YnVmX2xlbiBpcyAweCUwM3ggYnV0IG5leHRi bG9jayBpcyBOVUxMIVxuIiwgYy0+d2J1Zl9sZW4pOwoJCQl1cCgmYy0+YWxs b2Nfc2VtKTsKCQkJQlVHKCk7CgkJfQoJCXJldHVybjsKCX0KCQoJCgkvKiBp ZiAhYy0+bmV4dGJsb2NrIHRoZW4gdGhlIHRhaWwgd2lsbCBoYXZlIGdvdCBm bHVzaGVkIGZyb20KCSAgIGpmZnMyX2RvX3Jlc2VydmVfc3BhY2UoKSBhbnl3 YXkuICovCglpZihjLT5uZXh0YmxvY2spCgkJamZmczJfZmx1c2hfd2J1Zihj LCAyKTsgLyogcGFkIGFuZCBhZGp1c3QgbmV4dGJsb2NrICovCgoJdXAoJmMt PmFsbG9jX3NlbSk7Cn0KCgovKiBNZWFuaW5nIG9mIHBhZCBhcmd1bWVudDoK ICAgMDogRG8gbm90IHBhZC4gUHJvYmFibHkgcG9pbnRsZXNzIC0gd2Ugb25s eSBldmVyIHVzZSB0aGlzIHdoZW4gd2UgY2FuJ3QgcGFkIGFueXdheS4KICAg MTogUGFkLCBkbyBub3QgYWRqdXN0IG5leHRibG9jayBmcmVlX3NpemUKICAg MjogUGFkLCBhZGp1c3QgbmV4dGJsb2NrIGZyZWVfc2l6ZQoqLwppbnQgamZm czJfZmx1c2hfd2J1ZihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgaW50IHBh ZCkKewoJaW50IHJldDsKCXNpemVfdCByZXRsZW47CgoJLyogTm90aGluZyB0 byBkbyBpZiBub3QgTkFORCBmbGFzaC4gSW4gcGFydGljdWxhciwgd2Ugc2hv dWxkbid0CgkgICBkZWxfdGltZXIoKSB0aGUgdGltZXIgd2UgbmV2ZXIgaW5p dGlhbGlzZWQuICovCglpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykp CgkJcmV0dXJuIDA7CgoJaWYgKCFkb3duX3RyeWxvY2soJmMtPmFsbG9jX3Nl bSkpIHsKCQl1cCgmYy0+YWxsb2Nfc2VtKTsKCQlwcmludGsoS0VSTl9DUklU ICJqZmZzMl9mbHVzaF93YnVmKCkgY2FsbGVkIHdpdGggYWxsb2Nfc2VtIG5v dCBsb2NrZWQhXG4iKTsKCQlCVUcoKTsKCX0KCgkvKiBkZWxldGUgYSBldmVu dHVhbGx5IHN0YXJ0ZWQgdGltZWQgd2J1ZiBmbHVzaCAqLwoJZGVsX3RpbWVy X3N5bmMoJmMtPndidWZfdGltZXIpOwoKCWlmKCFjLT53YnVmIHx8ICFjLT53 YnVmX2xlbikKCQlyZXR1cm4gMDsKCgkvKiBjbGFpbSByZW1haW5pbmcgc3Bh Y2Ugb24gdGhlIHBhZ2UKCSAgIHRoaXMgaGFwcGVucywgaWYgd2UgaGF2ZSBh IGNoYW5nZSB0byBhIG5ldyBibG9jaywKCSAgIG9yIGlmIGZzeW5jIGZvcmNl cyB1cyB0byBmbHVzaCB0aGUgd3JpdGVidWZmZXIuCgkgICBpZiB3ZSBoYXZl IGEgc3dpdGNoIHRvIG5leHQgcGFnZSwgd2Ugd2lsbCBub3QgaGF2ZQoJICAg ZW5vdWdoIHJlbWFpbmluZyBzcGFjZSBmb3IgdGhpcy4gCgkqLwoJaWYgKHBh ZCkgewoJCWMtPndidWZfbGVuID0gUEFEKGMtPndidWZfbGVuKTsKCQkKCQlp ZiAoIGMtPndidWZfbGVuICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3du X25vZGUpIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgewoJCQlzdHJ1Y3QgamZmczJf dW5rbm93bl9ub2RlICpwYWRub2RlID0gKHZvaWQgKikoYy0+d2J1ZiArIGMt PndidWZfbGVuKTsKCQkJcGFkbm9kZS0+bWFnaWMgPSBjcHVfdG9famUxNihK RkZTMl9NQUdJQ19CSVRNQVNLKTsKCQkJcGFkbm9kZS0+bm9kZXR5cGUgPSBj cHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9QQURESU5HKTsKCQkJcGFkbm9k ZS0+dG90bGVuID0gY3B1X3RvX2plMzIoYy0+d2J1Zl9wYWdlc2l6ZSAtIGMt PndidWZfbGVuKTsKCQkJcGFkbm9kZS0+aGRyX2NyYyA9IGNwdV90b19qZTMy KGNyYzMyKDAsIHBhZG5vZGUsIHNpemVvZigqcGFkbm9kZSktNCkpOwoJCX0K CX0KCS8qIGVsc2UgamZmczJfZmxhc2hfd3JpdGV2IGhhcyBhY3R1YWxseSBm aWxsZWQgaW4gdGhlIHJlc3Qgb2YgdGhlCgkgICBidWZmZXIgZm9yIHVzLCBh bmQgd2lsbCBkZWFsIHdpdGggdGhlIG5vZGUgcmVmcyBldGMuIGxhdGVyLiAq LwoJCglyZXQgPSBjLT5tdGQtPndyaXRlX2VjYyhjLT5tdGQsIGMtPndidWZf b2ZzLCBjLT53YnVmX3BhZ2VzaXplLCAmcmV0bGVuLCBjLT53YnVmLCBOVUxM LCAmamZmczJfb29iaW5mbyk7CgkKCWlmIChyZXQgfHwgcmV0bGVuICE9IGMt PndidWZfcGFnZXNpemUpIHsKCQlpZiAocmV0KQoJCQlwcmludGsoS0VSTl9D UklUICJqZmZzMl9mbHVzaF93YnVmKCk6IFdyaXRlIGZhaWxlZCB3aXRoICVk XG4iLHJldCk7CgkJZWxzZQoJCQlwcmludGsoS0VSTl9DUklUICJqZmZzMl9m bHVzaF93YnVmKCk6IFdyaXRlIHdhcyBzaG9ydDogJXpkIGluc3RlYWQgb2Yg JWRcbiIsCgkJCQlyZXRsZW4sIGMtPndidWZfcGFnZXNpemUpOwoJCQkKCQly ZXQgPSAtRUlPOwkJCgkJLyogQ0hFQ0tNRSBOQU5EIAoJCSAgIFNvIHRoYXQg dGhlIGNhbGxlciBrbm93cyB3aGF0IGhhcHBlbmVkLiBJZgoJCSAgIHdlIHdl cmUgY2FsbGVkIGZyb20gamZmczJfZmxhc2hfd3JpdGV2KCksIGl0J2xsCgkJ ICAga25vdyB0byByZXR1cm4gZmFpbHVyZSBhbmQgX2l0c18gY2FsbGVyIHdp bGwKCQkgICB0cnkgYWdhaW4uIHdyaXRldiBnaXZlcyBiYWNrIHRvIGpmZnMy X3dyaXRlX3h4eCAKCQkgICBpbiB3cml0ZS5jLiBUaGVyZSBhcmUgdGhlIHJl YWwgZml4bWUncwoJCSAqLwoKCQkvKiAgRklYTUUgTkFORAoJCSAgIElmIHdl IHdlcmUgY2FsbGVkIGZyb20gR0Mgb3IgZnN5bmMsIHRoZXJlJ3Mgbm8gcmVw YWlyIGtpdCB5ZXQKCQkqLwoJCSAgICAKCQlyZXR1cm4gcmV0OyAKCX0KCgkv KiBBZGp1c3RpbmcgZnJlZSBzaXplIG9mIG5leHQgYmxvY2sgb25seSwgaWYg aXQncyBjYWxsZWQgZnJvbSBmc3luYyAhICovCglpZiAocGFkID09IDIpIHsK CQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1ZigpIGFk anVzdGluZyBmcmVlX3NpemUgb2YgYy0+bmV4dGJsb2NrXG4iKSk7CgkJc3Bp bl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwoJCWlmICghYy0+ bmV4dGJsb2NrKQoJCQlCVUcoKTsKCQkvKiB3YnVmX3BhZ2VzaXplIC0gd2J1 Zl9sZW4gaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0J3MgdG8gYmUgCgkJ ICAgcGFkZGVkLiBJZiB0aGVyZSBpcyBsZXNzIGZyZWUgc3BhY2UgaW4gdGhl IGJsb2NrIHRoYW4gdGhhdCwKCQkgICBzb21ldGhpbmcgc2NyZXdlZCB1cCAq LwoJCWlmIChjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSA8IChjLT53YnVmX3Bh Z2VzaXplIC0gYy0+d2J1Zl9sZW4pKSB7CgkJCXByaW50ayhLRVJOX0NSSVQg ImpmZnMyX2ZsdXNoX3didWYoKTogQWNjb3VudGluZyBlcnJvci4gd2J1ZiBh dCAweCUwOHggaGFzIDB4JTAzeCBieXRlcywgMHglMDN4IGxlZnQuXG4iLAoJ CQkgICAgICAgYy0+d2J1Zl9vZnMsIGMtPndidWZfbGVuLCBjLT53YnVmX3Bh Z2VzaXplLWMtPndidWZfbGVuKTsKCQkJcHJpbnRrKEtFUk5fQ1JJVCAiamZm czJfZmx1c2hfd2J1ZigpOiBCdXQgZnJlZV9zaXplIGZvciBibG9jayBhdCAw eCUwOHggaXMgb25seSAweCUwOHhcbiIsCgkJCSAgICAgICBjLT5uZXh0Ymxv Y2stPm9mZnNldCwgYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUpOwoJCQlCVUco KTsKCQl9CgkJYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgLT0gKGMtPndidWZf cGFnZXNpemUgLSBjLT53YnVmX2xlbik7CgkJYy0+ZnJlZV9zaXplIC09IChj LT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pOwoJCWMtPm5leHRibG9j ay0+d2FzdGVkX3NpemUgKz0gKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVm X2xlbik7CgkJYy0+d2FzdGVkX3NpemUgKz0gKGMtPndidWZfcGFnZXNpemUg LSBjLT53YnVmX2xlbik7CgkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBs ZXRpb25fbG9jayk7Cgl9CgoJLyogU3RpY2sgYW55IG5vdy1vYnNvbGV0ZWQg YmxvY2tzIG9uIHRoZSBlcmFzZV9wZW5kaW5nX2xpc3QgKi8KCXNwaW5fbG9j aygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKCWpmZnMyX3JlZmlsZV93 YnVmX2Jsb2NrcyhjKTsKCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0 aW9uX2xvY2spOwoKCW1lbXNldChjLT53YnVmLDB4ZmYsYy0+d2J1Zl9wYWdl c2l6ZSk7CgkvKiBhZGp1c3Qgd3JpdGUgYnVmZmVyIG9mZnNldCwgZWxzZSB3 ZSBnZXQgYSBub24gY29udGlnb3VzIHdyaXRlIGJ1ZyAqLwoJYy0+d2J1Zl9v ZnMrPSBjLT53YnVmX3BhZ2VzaXplOwoJYy0+d2J1Zl9sZW4gPSAwOwoJcmV0 dXJuIDA7Cn0KCiNkZWZpbmUgUEFHRV9ESVYoeCkgKCAoeCkgJiAofihjLT53 YnVmX3BhZ2VzaXplIC0gMSkpICkKI2RlZmluZSBQQUdFX01PRCh4KSAoICh4 KSAmIChjLT53YnVmX3BhZ2VzaXplIC0gMSkgKQppbnQgamZmczJfZmxhc2hf d3JpdGV2KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBjb25zdCBzdHJ1Y3Qg aW92ZWMgKmludmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRv LCBzaXplX3QgKnJldGxlbikKewoJc3RydWN0IGlvdmVjIG91dHZlY3NbM107 Cgl1aW50MzJfdCB0b3RsZW4gPSAwOwoJdWludDMyX3Qgc3BsaXRfb2ZzID0g MDsKCXVpbnQzMl90IG9sZF90b3RsZW47CglpbnQgcmV0LCBzcGxpdHZlYyA9 IC0xOwoJaW50IGludmVjLCBvdXR2ZWM7CglzaXplX3Qgd2J1Zl9yZXRsZW47 Cgl1bnNpZ25lZCBjaGFyICp3YnVmX3B0cjsKCXNpemVfdCBkb25lbGVuID0g MDsKCXVpbnQzMl90IG91dHZlY190byA9IHRvOwoKCS8qIElmIG5vdCBOQU5E IGZsYXNoLCBkb24ndCBib3RoZXIgKi8KCWlmICghYy0+d2J1ZikKCQlyZXR1 cm4gamZmczJfZmxhc2hfZGlyZWN0X3dyaXRldihjLCBpbnZlY3MsIGNvdW50 LCB0bywgcmV0bGVuKTsKCQoJLyogSWYgd2J1Zl9vZnMgaXMgbm90IGluaXRp YWxpemVkLCBzZXQgaXQgdG8gdGFyZ2V0IGFkZHJlc3MgKi8KCWlmIChjLT53 YnVmX29mcyA9PSAweEZGRkZGRkZGKSB7CgkJYy0+d2J1Zl9vZnMgPSBQQUdF X0RJVih0byk7CgkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CQkJCgkJ bWVtc2V0KGMtPndidWYsMHhmZixjLT53YnVmX3BhZ2VzaXplKTsKCX0KCgkv KiBTYW5pdHkgY2hlY2tzIG9uIHRhcmdldCBhZGRyZXNzLiAKCSAgIEl0J3Mg cGVybWl0dGVkIHRvIHdyaXRlIGF0IFBBRChjLT53YnVmX2xlbitjLT53YnVm X29mcyksIAoJICAgYW5kIGl0J3MgcGVybWl0dGVkIHRvIHdyaXRlIGF0IHRo ZSBiZWdpbm5pbmcgb2YgYSBuZXcgCgkgICBlcmFzZSBibG9jay4gQW55dGhp bmcgZWxzZSwgYW5kIHlvdSBkaWUuCgkgICBOZXcgYmxvY2sgc3RhcnRzIGF0 IHh4eDAwMGMgKDAtYiA9IGJsb2NrIGhlYWRlcikKCSovCglpZiAoICh0byAm IH4oYy0+c2VjdG9yX3NpemUtMSkpICE9IChjLT53YnVmX29mcyAmIH4oYy0+ c2VjdG9yX3NpemUtMSkpICkgewoJCS8qIEl0J3MgYSB3cml0ZSB0byBhIG5l dyBibG9jayAqLwoJCWlmIChjLT53YnVmX2xlbikgewoJCQlEMShwcmludGso S0VSTl9ERUJVRyAiamZmczJfZmxhc2hfd3JpdGV2KCkgdG8gMHglbHggY2F1 c2VzIGZsdXNoIG9mIHdidWYgYXQgMHglMDh4XG4iLCAodW5zaWduZWQgbG9u Zyl0bywgYy0+d2J1Zl9vZnMpKTsKCQkJcmV0ID0gamZmczJfZmx1c2hfd2J1 ZihjLCAxKTsKCQkJaWYgKHJldCkgewoJCQkJLyogdGhlIHVuZGVybHlpbmcg bGF5ZXIgaGFzIHRvIGNoZWNrIHdidWZfbGVuIHRvIGRvIHRoZSBjbGVhbnVw ICovCgkJCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9mbHVzaF93 YnVmKCkgY2FsbGVkIGZyb20gamZmczJfZmxhc2hfd3JpdGV2KCkgZmFpbGVk ICVkXG4iLCByZXQpKTsKCQkJCSpyZXRsZW4gPSAwOwoJCQkJcmV0dXJuIHJl dDsKCQkJfQoJCX0KCQkvKiBzZXQgcG9pbnRlciB0byBuZXcgYmxvY2sgKi8K CQljLT53YnVmX29mcyA9IFBBR0VfRElWKHRvKTsKCQljLT53YnVmX2xlbiA9 IFBBR0VfTU9EKHRvKTsJCQkKCX0gCgoJaWYgKHRvICE9IFBBRChjLT53YnVm X29mcyArIGMtPndidWZfbGVuKSkgewoJCS8qIFdlJ3JlIG5vdCB3cml0aW5n IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB3cml0ZWJ1ZmZlci4gQmFkLiAqLwoJ CXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBOb24t Y29udGlndW91cyB3cml0ZSB0byAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcp dG8pOwoJCWlmIChjLT53YnVmX2xlbikKCQkJcHJpbnRrKEtFUk5fQ1JJVCAi d2J1ZiB3YXMgcHJldmlvdXNseSAlMDh4LSUwOHhcbiIsCgkJCQkJICBjLT53 YnVmX29mcywgYy0+d2J1Zl9vZnMrYy0+d2J1Zl9sZW4pOwoJCUJVRygpOwoJ fQoKCS8qIE5vdGUgb3V0dmVjc1szXSBhYm92ZS4gV2Uga25vdyBjb3VudCBp cyBuZXZlciBncmVhdGVyIHRoYW4gMiAqLwoJaWYgKGNvdW50ID4gMikgewoJ CXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBjb3Vu dCBpcyAlbGRcbiIsIGNvdW50KTsKCQlCVUcoKTsKCX0KCglpbnZlYyA9IDA7 CglvdXR2ZWMgPSAwOwoKCgkvKiBGaWxsIHdyaXRlYnVmZmVyIGZpcnN0LCBp ZiBhbHJlYWR5IGluIHVzZSAqLwkKCWlmIChjLT53YnVmX2xlbikgewoJCXVp bnQzMl90IGludmVjX29mcyA9IDA7CgoJCS8qIGFkanVzdCBhbGlnbm1lbnQg b2Zmc2V0ICovIAoJCWlmIChjLT53YnVmX2xlbiAhPSBQQUdFX01PRCh0bykp IHsKCQkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CgkJCS8qIHRha2Ug Y2FyZSBvZiBhbGlnbm1lbnQgdG8gbmV4dCBwYWdlICovCgkJCWlmICghYy0+ d2J1Zl9sZW4pCgkJCQljLT53YnVmX2xlbiA9IGMtPndidWZfcGFnZXNpemU7 CgkJfQoJCQoJCXdoaWxlKGMtPndidWZfbGVuIDwgYy0+d2J1Zl9wYWdlc2l6 ZSkgewoJCQl1aW50MzJfdCB0aGlzbGVuOwoJCQkKCQkJaWYgKGludmVjID09 IGNvdW50KQoJCQkJZ290byBhbGxkb25lOwoKCQkJdGhpc2xlbiA9IGMtPndi dWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbjsKCgkJCWlmICh0aGlzbGVuID49 IGludmVjc1tpbnZlY10uaW92X2xlbikKCQkJCXRoaXNsZW4gPSBpbnZlY3Nb aW52ZWNdLmlvdl9sZW47CgkKCQkJaW52ZWNfb2ZzID0gdGhpc2xlbjsKCgkJ CW1lbWNweShjLT53YnVmICsgYy0+d2J1Zl9sZW4sIGludmVjc1tpbnZlY10u aW92X2Jhc2UsIHRoaXNsZW4pOwoJCQljLT53YnVmX2xlbiArPSB0aGlzbGVu OwoJCQlkb25lbGVuICs9IHRoaXNsZW47CgkJCS8qIEdldCBuZXh0IGludmVj LCBpZiBhY3R1YWwgZGlkIG5vdCBmaWxsIHRoZSBidWZmZXIgKi8KCQkJaWYg KGMtPndidWZfbGVuIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgCgkJCQlpbnZlYysr OwoJCX0JCQkKCQkKCQkvKiB3cml0ZSBidWZmZXIgaXMgZnVsbCwgZmx1c2gg YnVmZmVyICovCgkJcmV0ID0gamZmczJfZmx1c2hfd2J1ZihjLCAwKTsKCQlp ZiAocmV0KSB7CgkJCS8qIHRoZSB1bmRlcmx5aW5nIGxheWVyIGhhcyB0byBj aGVjayB3YnVmX2xlbiB0byBkbyB0aGUgY2xlYW51cCAqLwoJCQlEMShwcmlu dGsoS0VSTl9XQVJOSU5HICJqZmZzMl9mbHVzaF93YnVmKCkgY2FsbGVkIGZy b20gamZmczJfZmxhc2hfd3JpdGV2KCkgZmFpbGVkICVkXG4iLCByZXQpKTsK CQkJKnJldGxlbiA9IDA7CgkJCXJldHVybiByZXQ7CgkJfQoJCW91dHZlY190 byArPSBkb25lbGVuOwoJCWMtPndidWZfb2ZzID0gb3V0dmVjX3RvOwoJCQoJ CS8qIEFsbCBpbnZlY3MgZG9uZSA/ICovCgkJaWYgKGludmVjID09IGNvdW50 KQoJCQlnb3RvIGFsbGRvbmU7CgoJCS8qIFNldCB1cCB0aGUgZmlyc3Qgb3V0 dmVjLCBjb250YWluaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlCgkJICAgaW52 ZWMgd2UgcGFydGlhbGx5IHVzZWQgKi8KCQlpZiAoaW52ZWNzW2ludmVjXS5p b3ZfbGVuID4gaW52ZWNfb2ZzKSB7CgkJCW91dHZlY3NbMF0uaW92X2Jhc2Ug PSBpbnZlY3NbaW52ZWNdLmlvdl9iYXNlK2ludmVjX29mczsKCQkJdG90bGVu ID0gb3V0dmVjc1swXS5pb3ZfbGVuID0gaW52ZWNzW2ludmVjXS5pb3ZfbGVu LWludmVjX29mczsKCQkJaWYgKHRvdGxlbiA+IGMtPndidWZfcGFnZXNpemUp IHsKCQkJCXNwbGl0dmVjID0gb3V0dmVjOwoJCQkJc3BsaXRfb2ZzID0gb3V0 dmVjc1swXS5pb3ZfbGVuIC0gUEFHRV9NT0QodG90bGVuKTsKCQkJfQoJCQlv dXR2ZWMrKzsKCQl9CgkJaW52ZWMrKzsKCX0KCgkvKiBPSywgbm93IHdlJ3Zl IGZsdXNoZWQgdGhlIHdidWYgYW5kIHRoZSBzdGFydCBvZiB0aGUgYml0cwoJ ICAgd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHdyaXRlLCBub3cgdG8gd3JpdGUg dGhlIHJlc3QuLi4uICovCgoJLyogdG90bGVuIGhvbGRzIHRoZSBhbW91bnQg b2YgZGF0YSBzdGlsbCB0byBiZSB3cml0dGVuICovCglvbGRfdG90bGVuID0g dG90bGVuOwoJZm9yICggOyBpbnZlYyA8IGNvdW50OyBpbnZlYysrLG91dHZl YysrICkgewoJCW91dHZlY3Nbb3V0dmVjXS5pb3ZfYmFzZSA9IGludmVjc1tp bnZlY10uaW92X2Jhc2U7CgkJdG90bGVuICs9IG91dHZlY3Nbb3V0dmVjXS5p b3ZfbGVuID0gaW52ZWNzW2ludmVjXS5pb3ZfbGVuOwoJCWlmIChQQUdFX0RJ Vih0b3RsZW4pICE9IFBBR0VfRElWKG9sZF90b3RsZW4pKSB7CgkJCXNwbGl0 dmVjID0gb3V0dmVjOwoJCQlzcGxpdF9vZnMgPSBvdXR2ZWNzW291dHZlY10u aW92X2xlbiAtIFBBR0VfTU9EKHRvdGxlbik7CgkJCW9sZF90b3RsZW4gPSB0 b3RsZW47CgkJfQoJfQoKCS8qIE5vdyB0aGUgb3V0dmVjcyBhcnJheSBob2xk cyBhbGwgdGhlIHJlbWFpbmluZyBkYXRhIHRvIHdyaXRlICovCgkvKiBVcCB0 byBzcGxpdHZlYyxzcGxpdF9vZnMgaXMgdG8gYmUgd3JpdHRlbiBpbW1lZGlh dGVseS4gVGhlIHJlc3QKCSAgIGdvZXMgaW50byB0aGUgKG5vdy1lbXB0eSkg d2J1ZiAqLwoKCWlmIChzcGxpdHZlYyAhPSAtMSkgewoJCXVpbnQzMl90IHJl bWFpbmRlcjsKCQlpbnQgcmV0OwoKCQlyZW1haW5kZXIgPSBvdXR2ZWNzW3Nw bGl0dmVjXS5pb3ZfbGVuIC0gc3BsaXRfb2ZzOwoJCW91dHZlY3Nbc3BsaXR2 ZWNdLmlvdl9sZW4gPSBzcGxpdF9vZnM7CgoJCS8qIFdlIGRpZCBjcm9zcyBh IHBhZ2UgYm91bmRhcnksIHNvIHdlIHdyaXRlIHNvbWUgbm93ICovCgkJcmV0 ID0gYy0+bXRkLT53cml0ZXZfZWNjKGMtPm10ZCwgb3V0dmVjcywgc3BsaXR2 ZWMrMSwgb3V0dmVjX3RvLCAmd2J1Zl9yZXRsZW4sIE5VTEwsICZqZmZzMl9v b2JpbmZvKTsgCgkJaWYgKHJldCA8IDAgfHwgd2J1Zl9yZXRsZW4gIT0gUEFH RV9ESVYodG90bGVuKSkgewoJCQkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUg bm8gcHJvYmxlbSwKCQkJICAgYy0+d2J1ZiBpcyBlbXB0eS4gCgkJCSovCgkJ CSpyZXRsZW4gPSBkb25lbGVuOwoJCQlyZXR1cm4gcmV0OwoJCX0KCQkKCQlk b25lbGVuICs9IHdidWZfcmV0bGVuOwoJCWMtPndidWZfb2ZzID0gUEFHRV9E SVYob3V0dmVjX3RvKSArIFBBR0VfRElWKHRvdGxlbik7CgoJCWlmIChyZW1h aW5kZXIpIHsKCQkJb3V0dmVjc1tzcGxpdHZlY10uaW92X2Jhc2UgKz0gc3Bs aXRfb2ZzOwoJCQlvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfbGVuID0gcmVtYWlu ZGVyOwoJCX0gZWxzZSB7CgkJCXNwbGl0dmVjKys7CgkJfQoKCX0gZWxzZSB7 CgkJc3BsaXR2ZWMgPSAwOwoJfQoKCS8qIE5vdyBzcGxpdHZlYyBwb2ludHMg dG8gdGhlIHN0YXJ0IG9mIHRoZSBiaXRzIHdlIGhhdmUgdG8gY29weQoJICAg aW50byB0aGUgd2J1ZiAqLwoJd2J1Zl9wdHIgPSBjLT53YnVmOwoKCWZvciAo IDsgc3BsaXR2ZWMgPCBvdXR2ZWM7IHNwbGl0dmVjKyspIHsKCQkvKiBEb24n dCBjb3B5IHRoZSB3YnVmIGludG8gaXRzZWxmICovCgkJaWYgKG91dHZlY3Nb c3BsaXR2ZWNdLmlvdl9iYXNlID09IGMtPndidWYpCgkJCWNvbnRpbnVlOwoJ CW1lbWNweSh3YnVmX3B0ciwgb3V0dmVjc1tzcGxpdHZlY10uaW92X2Jhc2Us IG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW4pOwoJCXdidWZfcHRyICs9IG91 dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW47CgkJZG9uZWxlbiArPSBvdXR2ZWNz W3NwbGl0dmVjXS5pb3ZfbGVuOwoJfQoJYy0+d2J1Zl9sZW4gPSB3YnVmX3B0 ciAtIGMtPndidWY7CgphbGxkb25lOgkKCSpyZXRsZW4gPSBkb25lbGVuOwoJ LyogU2V0dXAgdGltZWQgd2J1ZiBmbHVzaCwgaWYgYnVmZmVyIGxlbiAhPSAw ICovCglpZiAoYy0+d2J1Zl9sZW4pIHsKCQlEMShwcmludGsgKEtFUk5fREVC VUcgImpmZnMyX2ZsYXNoX3dyaXRldjogbW9kIHdidWZfdGltZXJcbiIpKTsJ CgkJbW9kX3RpbWVyKCZjLT53YnVmX3RpbWVyLCBqaWZmaWVzICsgV0JVRl9G TFVTSF9USU1FT1VUKTsKCX0KCXJldHVybiAwOwp9CgovKgogKglUaGlzIGlz IHRoZSBlbnRyeSBmb3IgZmxhc2ggd3JpdGUuCiAqCUNoZWNrLCBpZiB3ZSB3 b3JrIG9uIE5BTkQgRkxBU0gsIGlmIHNvIGJ1aWxkIGFuIGlvdmVjIGFuZCB3 cml0ZSBpdCB2aWEgdnJpdGV2CiovCmludCBqZmZzMl9mbGFzaF93cml0ZShz dHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgbG9mZl90IG9mcywgc2l6ZV90IGxl biwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQp7CglzdHJ1 Y3QgaW92ZWMgdmVjc1sxXTsKCglpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xl dGUoYykpCgkJcmV0dXJuIGMtPm10ZC0+d3JpdGUoYy0+bXRkLCBvZnMsIGxl biwgcmV0bGVuLCBidWYpOwoKCXZlY3NbMF0uaW92X2Jhc2UgPSAodW5zaWdu ZWQgY2hhciAqKSBidWY7Cgl2ZWNzWzBdLmlvdl9sZW4gPSBsZW47CglyZXR1 cm4gamZmczJfZmxhc2hfd3JpdGV2KGMsIHZlY3MsIDEsIG9mcywgcmV0bGVu KTsKfQoKLyoKCUhhbmRsZSByZWFkYmFjayBmcm9tIHdyaXRlYnVmZmVyIGFu ZCBFQ0MgZmFpbHVyZSByZXR1cm4KKi8KaW50IGpmZnMyX2ZsYXNoX3JlYWQo c3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGxvZmZfdCBvZnMsIHNpemVfdCBs ZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKewoJbG9mZl90CW9y YmYgPSAwLCBvd2JmID0gMCwgbHdiZiA9IDA7CglpbnQJcmV0OwoKCS8qIFJl YWQgZmxhc2ggKi8KCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykp IHsKCQlyZXQgPSBjLT5tdGQtPnJlYWRfZWNjKGMtPm10ZCwgb2ZzLCBsZW4s IHJldGxlbiwgYnVmLCBOVUxMLCAmamZmczJfb29iaW5mbyk7CgoJCWlmICgg KHJldCA9PSAtRUlPKSAmJiAoKnJldGxlbiA9PSBsZW4pICkgewoJCQlwcmlu dGsoS0VSTl9XQVJOSU5HICJtdGQtPnJlYWQoMHglenggYnl0ZXMgZnJvbSAw eCVsbHgpIHJldHVybmVkIEVDQyBlcnJvclxuIiwKCQkJICAgICAgIGxlbiwg b2ZzKTsKCQkJLyogCgkJCSAqIFdlIGhhdmUgdGhlIHJhdyBkYXRhIHdpdGhv dXQgRUNDIGNvcnJlY3Rpb24gaW4gdGhlIGJ1ZmZlciwgbWF5YmUgCgkJCSAq IHdlIGFyZSBsdWNreSBhbmQgYWxsIGRhdGEgb3IgcGFydHMgYXJlIGNvcnJl Y3QuIFdlIGNoZWNrIHRoZSBub2RlLgoJCQkgKiBJZiBkYXRhIGFyZSBjb3Jy dXB0ZWQgbm9kZSBjaGVjayB3aWxsIHNvcnQgaXQgb3V0LgoJCQkgKiBXZSBr ZWVwIHRoaXMgYmxvY2ssIGl0IHdpbGwgZmFpbCBvbiB3cml0ZSBvciBlcmFz ZSBhbmQgdGhlIHdlCgkJCSAqIG1hcmsgaXQgYmFkLiBPciBzaG91bGQgd2Ug ZG8gdGhhdCBub3c/IEJ1dCB3ZSBzaG91bGQgZ2l2ZSBoaW0gYSBjaGFuY2Uu CgkJCSAqIE1heWJlIHdlIGhhZCBhIHN5c3RlbSBjcmFzaCBvciBwb3dlciBs b3NzIGJlZm9yZSB0aGUgZWNjIHdyaXRlIG9yICAKCQkJICogYSBlcmFzZSB3 YXMgY29tcGxldGVkLgoJCQkgKiBTbyB3ZSByZXR1cm4gc3VjY2Vzcy4gOikK CQkJICovCgkJIAlyZXQgPSAwOwoJCSB9CQoJfSBlbHNlCgkJcmV0dXJuIGMt Pm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CgoJ LyogaWYgbm8gd3JpdGVidWZmZXIgYXZhaWxhYmxlIG9yIHdyaXRlIGJ1ZmZl ciBlbXB0eSwgcmV0dXJuICovCglpZiAoIWMtPndidWZfcGFnZXNpemUgfHwg IWMtPndidWZfbGVuKQoJCXJldHVybiByZXQ7CgoJLyogaWYgd2UgcmVhZCBp biBhIGRpZmZlcmVudCBibG9jaywgcmV0dXJuICovCglpZiAoIChvZnMgJiB+ KGMtPnNlY3Rvcl9zaXplLTEpKSAhPSAoYy0+d2J1Zl9vZnMgJiB+KGMtPnNl Y3Rvcl9zaXplLTEpKSApIAoJCXJldHVybiByZXQ7CQoKCWlmIChvZnMgPj0g Yy0+d2J1Zl9vZnMpIHsKCQlvd2JmID0gKG9mcyAtIGMtPndidWZfb2ZzKTsJ Lyogb2Zmc2V0IGluIHdyaXRlIGJ1ZmZlciAqLwoJCWlmIChvd2JmID4gYy0+ d2J1Zl9sZW4pCQkvKiBpcyByZWFkIGJleW9uZCB3cml0ZSBidWZmZXIgPyAq LwoJCQlyZXR1cm4gcmV0OwoJCWx3YmYgPSBjLT53YnVmX2xlbiAtIG93YmY7 CS8qIG51bWJlciBvZiBieXRlcyB0byBjb3B5ICovCgkJaWYgKGx3YmYgPiBs ZW4pCQoJCQlsd2JmID0gbGVuOwoJfSBlbHNlIHsJCgkJb3JiZiA9IChjLT53 YnVmX29mcyAtIG9mcyk7CS8qIG9mZnNldCBpbiByZWFkIGJ1ZmZlciAqLwoJ CWlmIChvcmJmID4gbGVuKQkJCS8qIGlzIHdyaXRlIGJleW9uZCB3cml0ZSBi dWZmZXIgPyAqLwoJCQlyZXR1cm4gcmV0OwoJCWx3YmYgPSBsZW4gLSBvcmJm OyAJCS8qIG51bWJlciBvZiBieXRlcyB0byBjb3B5ICovCgkJaWYgKGx3YmYg PiBjLT53YnVmX2xlbikJCgkJCWx3YmYgPSBjLT53YnVmX2xlbjsKCX0JCglp ZiAobHdiZiA+IDApCgkJbWVtY3B5KGJ1ZitvcmJmLGMtPndidWYrb3diZixs d2JmKTsKCglyZXR1cm4gcmV0Owp9CgovKgogKglDaGVjaywgaWYgdGhlIG91 dCBvZiBiYW5kIGFyZWEgaXMgZW1wdHkKICovCmludCBqZmZzMl9jaGVja19v b2JfZW1wdHkoIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZm czJfZXJhc2VibG9jayAqamViLCBpbnQgbW9kZSkKewoJdW5zaWduZWQgY2hh ciAqYnVmOwoJaW50IAlyZXQgPSAwOwoJaW50CWksbGVuLGNudCxwYWdlOwoJ c2l6ZV90ICByZXRsZW47CglpbnQJZnNkYXRhX3BvcyxiYWRibG9ja19wb3Ms b29iX3NpemU7CgoJb29iX3NpemUgPSBjLT5tdGQtPm9vYnNpemU7CgoJc3dp dGNoKGMtPm10ZC0+ZWNjdHlwZSkgewoJY2FzZSBNVERfRUNDX1NXOgkJCgkJ ZnNkYXRhX3BvcyA9IChjLT53YnVmX3BhZ2VzaXplID09IDI1NikgPyBOQU5E X0pGRlMyX09PQjhfRlNEQVBPUyA6IE5BTkRfSkZGUzJfT09CMTZfRlNEQVBP UzsKCQliYWRibG9ja19wb3MgPSBOQU5EX0JBREJMT0NLX1BPUzsKCQlicmVh azsKCWRlZmF1bHQ6CgkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJf d3JpdGVfb29iX2VtcHR5KCk6IEludmFsaWQgRUNDIHR5cGVcbiIpKTsKCQly ZXR1cm4gLUVJTlZBTDsKCX0JCgoJLyogYWxsb2NhdGUgYSBidWZmZXIgZm9y IGFsbCBvb2IgZGF0YSBpbiB0aGlzIHNlY3RvciAqLwoJbGVuID0gNCAqIG9v Yl9zaXplOwoJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwoJaWYg KCFidWYpIHsKCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX2NoZWNrX29v Yl9lbXB0eSgpOiBhbGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBkYXRhIGJ1ZmZl ciBmb3Igb29iIGNoZWNrIGZhaWxlZFxuIik7CgkJcmV0dXJuIC1FTk9NRU07 Cgl9CgkvKiAKCSAqIGlmIG1vZGUgPSAwLCB3ZSBzY2FuIGZvciBhIHRvdGFs IGVtcHR5IG9vYiBhcmVhLCBlbHNlIHdlIGhhdmUKCSAqIHRvIHRha2UgY2Fy ZSBvZiB0aGUgY2xlYW5tYXJrZXIgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhl IGJsb2NrCgkqLwoJcmV0ID0gamZmczJfZmxhc2hfcmVhZF9vb2IoYywgamVi LT5vZmZzZXQsIGxlbiAsICZyZXRsZW4sIGJ1Zik7CglpZiAocmV0KSB7CgkJ RDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfb29iX2VtcHR5 KCk6IFJlYWQgT09CIGZhaWxlZCAlZCBmb3IgYmxvY2sgYXQgJTA4eFxuIiwg cmV0LCBqZWItPm9mZnNldCkpOwoJCWdvdG8gb3V0OwoJfQoJCglpZiAocmV0 bGVuIDwgbGVuKSB7CgkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJf Y2hlY2tfb29iX2VtcHR5KCk6IFJlYWQgT09CIHJldHVybiBzaG9ydCByZWFk ICIKCQkJICAiKCV6ZCBieXRlcyBub3QgJWQpIGZvciBibG9jayBhdCAlMDh4 XG4iLCByZXRsZW4sIGxlbiwgamViLT5vZmZzZXQpKTsKCQlyZXQgPSAtRUlP OwoJCWdvdG8gb3V0OwoJfQoJCgkvKiBTcGVjaWFsIGNoZWNrIGZvciBmaXJz dCB0d28gcGFnZXMgKi8KCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAyICogb29i X3NpemU7IHBhZ2UgKz0gb29iX3NpemUpIHsKCQkvKiBDaGVjayBmb3IgYmFk IGJsb2NrIG1hcmtlciAqLwoJCWlmIChidWZbcGFnZStiYWRibG9ja19wb3Nd ICE9IDB4ZmYpIHsKCQkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJf Y2hlY2tfb29iX2VtcHR5KCk6IEJhZCBvciBmYWlsZWQgYmxvY2sgYXQgJTA4 eFxuIixqZWItPm9mZnNldCkpOwoJCQkvKiBSZXR1cm4gMiBmb3IgYmFkIGFu ZCAzIGZvciBmYWlsZWQgYmxvY2sgCgkJCSAgIGJhZCBnb2VzIHRvIGxpc3Rf YmFkIGFuZCBmYWlsZWQgdG8gbGlzdF9lcmFzZSAqLwoJCQlyZXQgPSAoIXBh Z2UpID8gMiA6IDM7CgkJCWdvdG8gb3V0OwoJCX0KCQljbnQgPSBvb2Jfc2l6 ZTsKCQlpZiAobW9kZSkKCQkJY250IC09IGZzZGF0YV9wb3M7CgkJZm9yKGkg PSAwOyBpIDwgY250IDsgaSs9c2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkgewoJ CQl1bnNpZ25lZCBzaG9ydCBkYXQgPSAqKHVuc2lnbmVkIHNob3J0ICopKCZi dWZbcGFnZStpXSk7CgkJCWlmKGRhdCAhPSAweGZmZmYpIHsKCQkJCXJldCA9 IDE7IAoJCQkJZ290byBvdXQ7CgkJCX0KCQl9CgkJLyogb25seSB0aGUgZmly c3QgcGFnZSBjYW4gY29udGFpbiBhIGNsZWFubWFya2VyICEqLwoJCW1vZGUg PSAwOwoJfQkKCgkvKiB3ZSBrbm93LCB3ZSBhcmUgYWxpZ25lZCA6KSAqLwkK CWZvciAoOyBwYWdlIDwgbGVuOyBwYWdlICs9IHNpemVvZihsb25nKSkgewoJ CXVuc2lnbmVkIGxvbmcgZGF0ID0gKih1bnNpZ25lZCBsb25nICopKCZidWZb cGFnZV0pOwoJCWlmKGRhdCAhPSAtMSkgewoJCQlyZXQgPSAxOyAKCQkJZ290 byBvdXQ7CgkJfQoJfQoKb3V0OgoJa2ZyZWUoYnVmKTsJCgkKCXJldHVybiBy ZXQ7Cn0KCi8qCioJU2NhbiBmb3IgYSB2YWxpZCBjbGVhbm1hcmtlciBhbmQg Zm9yIGJhZCBibG9ja3MKKglGb3IgdmlydHVhbCBibG9ja3MgKGNvbmNhdGVu YXRlZCBwaHlzaWNhbCBibG9ja3MpIGNoZWNrIHRoZSBjbGVhbm1hcmtlcgoq CW9ubHkgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IHBoeXNpY2Fs IGJsb2NrLCBidXQgc2NhbiBmb3IgYmFkIGJsb2NrcyBpbiBhbGwKKglwaHlz aWNhbCBibG9ja3MKKi8KaW50IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJr ZXIgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJh c2VibG9jayAqamViKQp7CglzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlIG47 Cgl1bnNpZ25lZCBjaGFyIGJ1ZlszMl07Cgl1bnNpZ25lZCBjaGFyICpwOwoJ aW50IHJldCwgaSwgY250LCByZXR2YWwgPSAwOwoJc2l6ZV90IHJldGxlbiwg b2Zmc2V0OwoJaW50IGZzZGF0YV9wb3MsIGZzZGF0YV9sZW4sIG9vYl9zaXpl LCBiYWRibG9ja19wb3M7CgoJb2Zmc2V0ID0gamViLT5vZmZzZXQ7Cglvb2Jf c2l6ZSA9IGMtPm10ZC0+b29ic2l6ZTsKCglzd2l0Y2ggKGMtPm10ZC0+ZWNj dHlwZSkgewoJY2FzZSBNVERfRUNDX1NXOgoJCWZzZGF0YV9wb3MgPSAoYy0+ d2J1Zl9wYWdlc2l6ZSA9PSAyNTYpID8gTkFORF9KRkZTMl9PT0I4X0ZTREFQ T1MgOiBOQU5EX0pGRlMyX09PQjE2X0ZTREFQT1M7CgkJZnNkYXRhX2xlbiA9 IChjLT53YnVmX3BhZ2VzaXplID09IDI1NikgPyBOQU5EX0pGRlMyX09PQjhf RlNEQUxFTiA6IE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTjsKCQliYWRibG9j a19wb3MgPSBOQU5EX0JBREJMT0NLX1BPUzsKCQlicmVhazsKCWRlZmF1bHQ6 CgkJRDEgKHByaW50ayAoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9uYW5k X2NsZWFubWFya2VyKCk6IEludmFsaWQgRUNDIHR5cGVcbiIpKTsKCQlyZXR1 cm4gLUVJTlZBTDsKCX0KCgoJLyogTG9vcCB0aHJvdWdoIHRoZSBwaHlzaWNh bCBibG9ja3MgKi8KCWZvciAoY250ID0gMDsgY250IDwgKGMtPnNlY3Rvcl9z aXplIC8gYy0+bXRkLT5lcmFzZXNpemUpOyBjbnQrKykgewoJCS8qCgkJICAg KiAgICBXZSByZWFkIG9vYiBkYXRhIGZyb20gcGFnZSAwIGFuZCAxIG9mIHRo ZSBibG9jay4KCQkgICAqICAgIHBhZ2UgMCBjb250YWlucyBjbGVhbm1hcmtl ciBhbmQgYmFkYmxvY2sgaW5mbwoJCSAgICogICAgcGFnZSAxIGNvbnRhaW5z IGZhaWx1cmUgY291bnQgb2YgdGhpcyBibG9jawoJCSAqLwoJCXJldCA9IGMt Pm10ZC0+cmVhZF9vb2IgKGMtPm10ZCwgb2Zmc2V0LCBvb2Jfc2l6ZSA8PCAx LCAmcmV0bGVuLCBidWYpOwoKCQlpZiAocmV0KSB7CgkJCUQxIChwcmludGsg KEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcigp OiBSZWFkIE9PQiBmYWlsZWQgJWQgZm9yIGJsb2NrIGF0ICUwOHhcbiIsIHJl dCwgamViLT5vZmZzZXQpKTsKCQkJcmV0dXJuIHJldDsKCQl9CgkJaWYgKHJl dGxlbiA8IChvb2Jfc2l6ZSA8PCAxKSkgewoJCQlEMSAocHJpbnRrIChLRVJO X1dBUk5JTkcgImpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogUmVh ZCBPT0IgcmV0dXJuIHNob3J0IHJlYWQgKCV6ZCBieXRlcyBub3QgJWQpIGZv ciBibG9jayBhdCAlMDh4XG4iLCByZXRsZW4sIG9vYl9zaXplIDw8IDEsIGpl Yi0+b2Zmc2V0KSk7CgkJCXJldHVybiAtRUlPOwoJCX0KCgkJLyogQ2hlY2sg Zm9yIGJhZCBibG9jayBtYXJrZXIgKi8KCQlpZiAoYnVmW2JhZGJsb2NrX3Bv c10gIT0gMHhmZikgewoJCQlEMSAocHJpbnRrIChLRVJOX1dBUk5JTkcgImpm ZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogQmFkIGJsb2NrIGF0ICUw OHhcbiIsIGplYi0+b2Zmc2V0KSk7CgkJCXJldHVybiAyOwoJCX0KCgkJLyog Q2hlY2sgZm9yIGZhaWx1cmUgY291bnRlciBpbiB0aGUgc2Vjb25kIHBhZ2Ug Ki8KCQlpZiAoYnVmW2JhZGJsb2NrX3BvcyArIG9vYl9zaXplXSAhPSAweGZm KSB7CgkJCUQxIChwcmludGsgKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tf bmFuZF9jbGVhbm1hcmtlcigpOiBCbG9jayBtYXJrZWQgYXMgZmFpbGVkIGF0 ICUwOHgsIGZhaWwgY291bnQ6JWRcbiIsIGplYi0+b2Zmc2V0LCBidWZbYmFk YmxvY2tfcG9zICsgb29iX3NpemVdKSk7CgkJCXJldHVybiAzOwoJCX0KCgkJ LyogQ2hlY2sgY2xlYW5tYXJrZXIgb25seSBvbiB0aGUgZmlyc3QgcGh5c2lj YWwgYmxvY2sgKi8KCQlpZiAoIWNudCkgewoJCQluLm1hZ2ljID0gY3B1X3Rv X2plMTYgKEpGRlMyX01BR0lDX0JJVE1BU0spOwoJCQluLm5vZGV0eXBlID0g Y3B1X3RvX2plMTYgKEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKCQkJ bi50b3RsZW4gPSBjcHVfdG9famUzMiAoOCk7CgkJCXAgPSAodW5zaWduZWQg Y2hhciAqKSAmbjsKCgkJCWZvciAoaSA9IDA7IGkgPCBmc2RhdGFfbGVuOyBp KyspIHsKCQkJCWlmIChidWZbZnNkYXRhX3BvcyArIGldICE9IHBbaV0pIHsK CQkJCQlEMiAocHJpbnRrIChLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX25h bmRfY2xlYW5tYXJrZXIoKTogQ2xlYW5tYXJrZXIgbm9kZSBub3QgZGV0ZWN0 ZWQgaW4gYmxvY2sgYXQgJTA4eFxuIiwgamViLT5vZmZzZXQpKTsKCQkJCQly ZXR2YWwgPSAxOwoJCQkJfQoJCQl9CgkJfQoJCW9mZnNldCArPSBjLT5tdGQt PmVyYXNlc2l6ZTsKCX0KCXJldHVybiByZXR2YWw7Cn0KCmludCBqZmZzMl93 cml0ZV9uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpj LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQp7CglzdHJ1Y3QgCWpm ZnMyX3Vua25vd25fbm9kZSBuOwoJaW50IAlyZXQ7CglpbnQJZnNkYXRhX3Bv cyxmc2RhdGFfbGVuOwoJc2l6ZV90IAlyZXRsZW47CgoJc3dpdGNoKGMtPm10 ZC0+ZWNjdHlwZSkgewoJY2FzZSBNVERfRUNDX1NXOgkKCQlmc2RhdGFfcG9z ID0gKGMtPndidWZfcGFnZXNpemUgPT0gMjU2KSA/IE5BTkRfSkZGUzJfT09C OF9GU0RBUE9TIDogTkFORF9KRkZTMl9PT0IxNl9GU0RBUE9TOwoJCWZzZGF0 YV9sZW4gPSAoYy0+d2J1Zl9wYWdlc2l6ZSA9PSAyNTYpID8gTkFORF9KRkZT Ml9PT0I4X0ZTREFMRU4gOiBOQU5EX0pGRlMyX09PQjE2X0ZTREFMRU47CgkJ YnJlYWs7CglkZWZhdWx0OgoJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpm ZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoKTogSW52YWxpZCBFQ0MgdHlw ZVxuIikpOwoJCXJldHVybiAtRUlOVkFMOwoJfQkKCQoJbi5tYWdpYyA9IGNw dV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwoJbi5ub2RldHlwZSA9 IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKCW4u dG90bGVuID0gY3B1X3RvX2plMzIoOCk7CgoJcmV0ID0gamZmczJfZmxhc2hf d3JpdGVfb29iKGMsIGplYi0+b2Zmc2V0ICsgZnNkYXRhX3BvcywgZnNkYXRh X2xlbiwgJnJldGxlbiwgKHVuc2lnbmVkIGNoYXIgKikmbik7CgkKCWlmIChy ZXQpIHsKCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9u YW5kX2NsZWFubWFya2VyKCk6IFdyaXRlIGZhaWxlZCBmb3IgYmxvY2sgYXQg JTA4eDogZXJyb3IgJWRcbiIsIGplYi0+b2Zmc2V0LCByZXQpKTsKCQlyZXR1 cm4gcmV0OwoJfQoJaWYgKHJldGxlbiAhPSBmc2RhdGFfbGVuKSB7CgkJRDEo cHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfd3JpdGVfbmFuZF9jbGVhbm1h cmtlcigpOiBTaG9ydCB3cml0ZSBmb3IgYmxvY2sgYXQgJTA4eDogJXpkIG5v dCAlZFxuIiwgamViLT5vZmZzZXQsIHJldGxlbiwgZnNkYXRhX2xlbikpOwoJ CXJldHVybiByZXQ7Cgl9CglyZXR1cm4gMDsKfQoKLyogCiAqIFdlIHRyeSB0 byBnZXQgdGhlIGZhaWx1cmUgY291bnQgb2YgdGhpcyBibG9jay4KICovCmlu dCBqZmZzMl9uYW5kX3JlYWRfZmFpbGNudChzdHJ1Y3QgamZmczJfc2JfaW5m byAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikgewoKCXVuc2ln bmVkIGNoYXIgYnVmWzE2XTsKCWludAlyZXQ7CglzaXplX3QgCXJldGxlbjsK CWludAlvb2Jfc2l6ZSwgYmFkYmxvY2tfcG9zOwoKCW9vYl9zaXplID0gYy0+ bXRkLT5vb2JzaXplOwoKCXN3aXRjaChjLT5tdGQtPmVjY3R5cGUpIHsKCWNh c2UgTVREX0VDQ19TVzoJCgkJYmFkYmxvY2tfcG9zID0gTkFORF9CQURCTE9D S19QT1M7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUQxKHByaW50ayhLRVJOX1dB Uk5JTkcgImpmZnMyX25hbmRfcmVhZF9mYWlsY250KCk6IEludmFsaWQgRUND IHR5cGVcbiIpKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0JCgkKCXJldCA9IGMt Pm10ZC0+cmVhZF9vb2IoYy0+bXRkLCBqZWItPm9mZnNldCArIGMtPm10ZC0+ b29iYmxvY2ssIG9vYl9zaXplICwgJnJldGxlbiwgYnVmKTsKCQoJaWYgKHJl dCkgewoJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX25hbmRfcmVh ZF9mYWlsY250KCk6IFJlYWQgT09CIGZhaWxlZCAlZCBmb3IgYmxvY2sgYXQg JTA4eFxuIiwgcmV0LCBqZWItPm9mZnNldCkpOwoJCXJldHVybiByZXQ7Cgl9 CgoJaWYgKHJldGxlbiA8IG9vYl9zaXplKSB7CgkJRDEocHJpbnRrKEtFUk5f V0FSTklORyAiamZmczJfbmFuZF9yZWFkX2ZhaWxjbnQoKTogUmVhZCBPT0Ig cmV0dXJuIHNob3J0IHJlYWQgKCV6ZCBieXRlcyBub3QgJWQpIGZvciBibG9j ayBhdCAlMDh4XG4iLCByZXRsZW4sIG9vYl9zaXplLCBqZWItPm9mZnNldCkp OwoJCXJldHVybiAtRUlPOwoJfQoKCWplYi0+YmFkX2NvdW50ID0gIGJ1Zlti YWRibG9ja19wb3NdOwkKCXJldHVybiAwOwp9CgovKiAKICogT24gTkFORCB3 ZSB0cnkgdG8gbWFyayB0aGlzIGJsb2NrIGJhZC4gV2UgdHJ5IHRvIHdyaXRl IGhvdyBvZnRlbgogKiB0aGUgYmxvY2sgd2FzIGVyYXNlZCBhbmQgbWFyayBp dCBmaW5hbHkgYmFkLCBpZiB0aGUgY291bnQKICogaXMgPiBNQVhfRVJBU0Vf RkFJTFVSRVMuIFdlIHJlYWQgdGhpcyBpbmZvcm1hdGlvbiBvbiBtb3VudCAh CiAqIGplYi0+YmFkX2NvdW50IGNvbnRhaW5zIHRoZSBjb3VudCBiZWZvcmUg dGhpcyBlcmFzZS4KICogRG9uJ3QgY2FyZSBhYm91dCBmYWlsdXJlcy4gVGhp cyBibG9jayByZW1haW5zIG9uIHRoZSBlcmFzZS1wZW5kaW5nCiAqIG9yIGJh ZGJsb2NrIGxpc3QgYXMgbG9uZyBhcyBub2JvZHkgbWFuaXB1bGF0ZXMgdGhl IGZsYXNoIHdpdGgKICogYSBib290bG9hZGVyIG9yIHNvbWV0aGluZyBsaWtl IHRoYXQuCiAqLwoKaW50IGpmZnMyX3dyaXRlX25hbmRfYmFkYmxvY2soc3Ry dWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2Nr ICpqZWIpCnsKCXVuc2lnbmVkIGNoYXIgYnVmID0gMHgwOwoJaW50IAlyZXQs cG9zOwoJc2l6ZV90IAlyZXRsZW47CgoJc3dpdGNoKGMtPm10ZC0+ZWNjdHlw ZSkgewoJY2FzZSBNVERfRUNDX1NXOgkKCQlwb3MgPSBOQU5EX0JBREJMT0NL X1BPUzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJRDEocHJpbnRrKEtFUk5fV0FS TklORyAiamZmczJfd3JpdGVfbmFuZF9iYWRibG9jaygpOiBJbnZhbGlkIEVD QyB0eXBlXG4iKSk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CQoKCS8qIGlmIHRo ZSBjb3VudCBpcyA8IG1heCwgd2UgdHJ5IHRvIHdyaXRlIHRoZSBjb3VudGVy IHRvIHRoZSAybmQgcGFnZSBvb2IgYXJlYSAqLwoJaWYoICsramViLT5iYWRf Y291bnQgPCBNQVhfRVJBU0VfRkFJTFVSRVMpIHsKCQlidWYgPSAodW5zaWdu ZWQgY2hhcilqZWItPmJhZF9jb3VudDsKCQlwb3MgKz0gYy0+bXRkLT5vb2Ji bG9jazsKCX0KCQoJcmV0ID0gamZmczJfZmxhc2hfd3JpdGVfb29iKGMsIGpl Yi0+b2Zmc2V0ICsgcG9zLCAxLCAmcmV0bGVuLCAmYnVmKTsKCQoJaWYgKHJl dCkgewoJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3dyaXRlX25h bmRfYmFkYmxvY2soKTogV3JpdGUgZmFpbGVkIGZvciBibG9jayBhdCAlMDh4 OiBlcnJvciAlZFxuIiwgamViLT5vZmZzZXQsIHJldCkpOwoJCXJldHVybiBy ZXQ7Cgl9CglpZiAocmV0bGVuICE9IDEpIHsKCQlEMShwcmludGsoS0VSTl9X QVJOSU5HICJqZmZzMl93cml0ZV9uYW5kX2JhZGJsb2NrKCk6IFNob3J0IHdy aXRlIGZvciBibG9jayBhdCAlMDh4OiAlemQgbm90IDFcbiIsIGplYi0+b2Zm c2V0LCByZXRsZW4pKTsKCQlyZXR1cm4gcmV0OwoJfQoJcmV0dXJuIDA7Cn0K --0-1032742541-1197032206=:11498--