Received: with ECARTIS (v1.0.0; list xfs); Mon, 04 Jun 2007 19:20:15 -0700 (PDT) Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.10/8.12.10/SuSE Linux 0.7) with SMTP id l552K2Wt008374 for ; Mon, 4 Jun 2007 19:20:04 -0700 Received: from pc-bnaujok.melbourne.sgi.com (pc-bnaujok.melbourne.sgi.com [134.14.55.58]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id MAA06631; Tue, 5 Jun 2007 12:20:00 +1000 Date: Tue, 05 Jun 2007 12:23:32 +1000 To: "xfs@oss.sgi.com" , xfs-dev Subject: [REVIEW 3/3] - xfs_repair speedups (enhanced prefetch) From: "Barry Naujok" Organization: SGI Content-Type: multipart/mixed; boundary=----------IrJlgiTfBCmIeXv1iG6QRc MIME-Version: 1.0 Message-ID: User-Agent: Opera Mail/9.10 (Win32) X-archive-position: 11639 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs ------------IrJlgiTfBCmIeXv1iG6QRc Content-Type: text/plain; format=flowed; delsp=yes; charset=iso-8859-15 Content-Transfer-Encoding: 7bit Back in Jan 2007, Michael Nishimoto from Agami posted a patch to a 2.7.x based xfs_repair tree to perform prefetch/reahead which primed the linux block buffer for the main xfs_repair processing threads (http://oss.sgi.com/archives/xfs/2007-01/msg00135.html). Benchmarking this and 2.8.1x xfs_repair at the time revealed very interesting numbers. 2.8.x was very slow using direct I/O and the libxfs cache. Researching this technique and intergrating it with the libxfs cache proved rather challenging. Many changes were required : - proper xfs_buf_t locking for multi-threaded access. - unify I/O sizes for inodes and metadata blocks. - try to serialise as much I/O as possible. - handle queuing, I/O and processing in parallel minimising starvation, especially when only a subset of the metadata can be stored in memory. - smarter work queues. The unifying of the I/O sizes was a significant change which resulted in a lot of improvements in both performance and correctness, in particulary, with inode blocks. During phase 6, inodes are accessed using xfs_iread/xfs_iget which using inode "clusters" which are either 8KB or blocksize, whichever is greater. Phases 3/4 read using inode "chunks" which can be 16KB or larger. With libxfs caching method, this meant all data had to be flushed/purged before phase 6 started, and all the inodes read again. Also, one part of the libxfs transaction code didn't release buffers properly. This behaviour has been seen in the past with the infamous "shake on cache 0x######## left # nodes!?" warning. Batch reading/serialising I/O requests in the prefetch code had major benefits when metadata is close together, especially with RAIDs. Also, the AIO/LIO stuff was yanked with threaded I/O prefetch. The queuing/IO/processing threads and synchronising them efficiently, especially in low memory conditions was the most challenging aspect. Most of the changes for this are in prefetch.c with minor changes for I/O in the phases. Phase 6 also eliminated the dir_stack code which is not required. It now processes the directory inodes as per layout the inode AVL tree (which it did anyway after doing a path traversal). The patch will have a lot of apparenty noop changes, these are automatic EOL whitespace cleanups. ------------IrJlgiTfBCmIeXv1iG6QRc Content-Disposition: attachment; filename=prefetch Content-Type: application/octet-stream; name=prefetch Content-Transfer-Encoding: Base64 SW5kZXg6IHJlcGFpci94ZnNwcm9ncy9pbmNsdWRlL2NhY2hlLmgKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvaW5jbHVkZS9jYWNo ZS5oCTIwMDctMDQtMjcgMTM6MTM6MzUuMDAwMDAwMDAwICsxMDAwCisrKyByZXBh aXIveGZzcHJvZ3MvaW5jbHVkZS9jYWNoZS5oCTIwMDctMDYtMDQgMTc6MjM6NDIu NDE0ODQ5MTQwICsxMDAwCkBAIC0xOCw2ICsxOCw4IEBACiAjaWZuZGVmIF9fQ0FD SEVfSF9fCiAjZGVmaW5lIF9fQ0FDSEVfSF9fCiAKKyNkZWZpbmUJSEFTSF9DQUNI RV9SQVRJTwk4CisKIC8qCiAgKiBTaW1wbGUsIGdlbmVyaWMgaW1wbGVtZW50YXRp b24gb2YgYSBjYWNoZSAoYXJiaXRyYXJ5IGRhdGEpLgogICogUHJvdmlkZXMgYSBo YXNoIHRhYmxlIHdpdGggYSBjYXBwZWQgbnVtYmVyIG9mIGNhY2hlIGVudHJpZXMu CkBAIC0yOCw4ICszMCw5IEBACiBzdHJ1Y3QgY2FjaGVfbm9kZTsKIAogdHlwZWRl ZiB2b2lkICpjYWNoZV9rZXlfdDsKKwogdHlwZWRlZiB2b2lkICgqY2FjaGVfd2Fs a190KShzdHJ1Y3QgY2FjaGVfbm9kZSAqKTsKLXR5cGVkZWYgc3RydWN0IGNhY2hl X25vZGUgKiAoKmNhY2hlX25vZGVfYWxsb2NfdCkodm9pZCk7Cit0eXBlZGVmIHN0 cnVjdCBjYWNoZV9ub2RlICogKCpjYWNoZV9ub2RlX2FsbG9jX3QpKGNhY2hlX2tl eV90KTsKIHR5cGVkZWYgdm9pZCAoKmNhY2hlX25vZGVfZmx1c2hfdCkoc3RydWN0 IGNhY2hlX25vZGUgKik7CiB0eXBlZGVmIHZvaWQgKCpjYWNoZV9ub2RlX3JlbHNl X3QpKHN0cnVjdCBjYWNoZV9ub2RlICopOwogdHlwZWRlZiB1bnNpZ25lZCBpbnQg KCpjYWNoZV9ub2RlX2hhc2hfdCkoY2FjaGVfa2V5X3QsIHVuc2lnbmVkIGludCk7 CkBAIC04NCw1ICs4Nyw2IEBACiB2b2lkIGNhY2hlX25vZGVfcHV0KHN0cnVjdCBj YWNoZV9ub2RlICopOwogaW50IGNhY2hlX25vZGVfcHVyZ2Uoc3RydWN0IGNhY2hl ICosIGNhY2hlX2tleV90LCBzdHJ1Y3QgY2FjaGVfbm9kZSAqKTsKIHZvaWQgY2Fj aGVfcmVwb3J0KEZJTEUgKmZwLCBjb25zdCBjaGFyICosIHN0cnVjdCBjYWNoZSAq KTsKK2ludCBjYWNoZV9vdmVyZmxvd2VkKHN0cnVjdCBjYWNoZSAqKTsKIAogI2Vu ZGlmCS8qIF9fQ0FDSEVfSF9fICovCkluZGV4OiByZXBhaXIveGZzcHJvZ3MvaW5j bHVkZS9saWJ4ZnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3Jp Zy94ZnNwcm9ncy9pbmNsdWRlL2xpYnhmcy5oCTIwMDctMDQtMjcgMTM6MTM6MzUu MDAwMDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZzcHJvZ3MvaW5jbHVkZS9saWJ4 ZnMuaAkyMDA3LTA2LTA1IDEyOjExOjQyLjc1NjI3NTIwNyArMTAwMApAQCAtMTkw LDggKzE5MCw4IEBACiAjZGVmaW5lIExJQlhGU19NT1VOVF8zMkJJVElOT09QVAkw eDAwMDgKICNkZWZpbmUgTElCWEZTX01PVU5UX0NPTVBBVF9BVFRSCTB4MDAxMAog Ci0jZGVmaW5lIExJQlhGU19JSEFTSFNJWkUoc2JwKQkJKDE8PDE2KQkvKiB0d2Vh ayBiYXNlZCBvbiBpY291bnQ/ICovCi0jZGVmaW5lIExJQlhGU19CSEFTSFNJWkUo c2JwKQkJKDE8PDE2KQkvKiBkaXR0bywgb24gYmxvY2tzIHVzZWQ/ICovCisjZGVm aW5lIExJQlhGU19JSEFTSFNJWkUoc2JwKQkJKDE8PDEwKQorI2RlZmluZSBMSUJY RlNfQkhBU0hTSVpFKHNicCkgCQkoMTw8MTApCiAKIGV4dGVybiB4ZnNfbW91bnRf dAkqbGlieGZzX21vdW50ICh4ZnNfbW91bnRfdCAqLCB4ZnNfc2JfdCAqLAogCQkJ CWRldl90LCBkZXZfdCwgZGV2X3QsIGludCk7CkBAIC0yMTUsMTAgKzIxNSwxNyBA QAogCXhmc19kYWRkcl90CQliX2Jsa25vOwogCXVuc2lnbmVkCQliX2Jjb3VudDsK IAlkZXZfdAkJCWJfZGV2OworCXB0aHJlYWRfbXV0ZXhfdAkJYl9sb2NrOwogCXZv aWQJCQkqYl9mc3ByaXZhdGU7CiAJdm9pZAkJCSpiX2ZzcHJpdmF0ZTI7CiAJdm9p ZAkJCSpiX2ZzcHJpdmF0ZTM7CiAJY2hhcgkJCSpiX2FkZHI7CisjaWZkZWYgWEZT X0JVRl9UUkFDSU5HCisJc3RydWN0IGxpc3RfaGVhZAliX2xvY2tfbGlzdDsKKwlj b25zdCBjaGFyCQkqYl9mdW5jOworCWNvbnN0IGNoYXIJCSpiX2ZpbGU7CisJaW50 CQkJYl9saW5lOworI2VuZGlmCiB9IHhmc19idWZfdDsKIAogZW51bSB4ZnNfYnVm X2ZsYWdzX3QgewkvKiBiX2ZsYWdzIGJpdHMgKi8KQEAgLTI0NiwyNSArMjUzLDQ5 IEBACiAjZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFMyhicCx0eXBlKQkoKHR5cGUp KGJwKS0+Yl9mc3ByaXZhdGUzKQogI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZB VEUzKGJwLHZhbCkJKGJwKS0+Yl9mc3ByaXZhdGUzID0gKHZvaWQgKikodmFsKQog Ci1leHRlcm4geGZzX2J1Zl90CSpsaWJ4ZnNfZ2V0c2IgKHhmc19tb3VudF90ICos IGludCk7Ci1leHRlcm4geGZzX2J1Zl90CSpsaWJ4ZnNfcmVhZGJ1ZiAoZGV2X3Qs IHhmc19kYWRkcl90LCBpbnQsIGludCk7Ci1leHRlcm4gaW50CWxpYnhmc19yZWFk YnVmciAoZGV2X3QsIHhmc19kYWRkcl90LCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQp OwotZXh0ZXJuIGludAlsaWJ4ZnNfd3JpdGVidWYgKHhmc19idWZfdCAqLCBpbnQp OwotZXh0ZXJuIGludAlsaWJ4ZnNfd3JpdGVidWZyICh4ZnNfYnVmX3QgKik7Ci1l eHRlcm4gaW50CWxpYnhmc193cml0ZWJ1Zl9pbnQgKHhmc19idWZfdCAqLCBpbnQp OwotCiAvKiBCdWZmZXIgQ2FjaGUgSW50ZXJmYWNlcyAqLworCiBleHRlcm4gc3Ry dWN0IGNhY2hlCSpsaWJ4ZnNfYmNhY2hlOwogZXh0ZXJuIHN0cnVjdCBjYWNoZV9v cGVyYXRpb25zCWxpYnhmc19iY2FjaGVfb3BlcmF0aW9uczsKLWV4dGVybiB2b2lk CWxpYnhmc19iY2FjaGVfcHVyZ2UgKHZvaWQpOwotZXh0ZXJuIHZvaWQJbGlieGZz X2JjYWNoZV9mbHVzaCAodm9pZCk7Ci1leHRlcm4geGZzX2J1Zl90CSpsaWJ4ZnNf Z2V0YnVmIChkZXZfdCwgeGZzX2RhZGRyX3QsIGludCk7CisKKyNpZmRlZiBYRlNf QlVGX1RSQUNJTkcKKworI2RlZmluZSBsaWJ4ZnNfcmVhZGJ1ZihkZXYsIGRhZGRy LCBsZW4sIGZsYWdzKSBcCisJCWxpYnhmc190cmFjZV9yZWFkYnVmKF9fRlVOQ1RJ T05fXywgX19GSUxFX18sIF9fTElORV9fLCAoZGV2KSwgKGRhZGRyKSwgKGxlbiks IChmbGFncykpCisjZGVmaW5lIGxpYnhmc193cml0ZWJ1ZihidWYsIGZsYWdzKSBc CisJCWxpYnhmc190cmFjZV93cml0ZWJ1ZihfX0ZVTkNUSU9OX18sIF9fRklMRV9f LCBfX0xJTkVfXywgKGJ1ZiksIChmbGFncykpCisjZGVmaW5lIGxpYnhmc19nZXRi dWYoZGV2LCBkYWRkciwgbGVuKSBcCisJCWxpYnhmc190cmFjZV9nZXRidWYoX19G VU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18sIChkZXYpLCAoZGFkZHIpLCAo bGVuKSkKKyNkZWZpbmUgbGlieGZzX3B1dGJ1ZihidWYpIFwKKwkJbGlieGZzX3Ry YWNlX3B1dGJ1ZihfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXywgKGJ1 ZikpCisKK2V4dGVybiB4ZnNfYnVmX3QgKmxpYnhmc190cmFjZV9yZWFkYnVmKGNv bnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGRldl90LCB4ZnNfZGFkZHJf dCwgaW50LCBpbnQpOworZXh0ZXJuIGludAlsaWJ4ZnNfdHJhY2Vfd3JpdGVidWYo Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgeGZzX2J1Zl90ICosIGlu dCk7CitleHRlcm4geGZzX2J1Zl90ICpsaWJ4ZnNfdHJhY2VfZ2V0YnVmKGNvbnN0 IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGRldl90LCB4ZnNfZGFkZHJfdCwg aW50KTsKK2V4dGVybiB2b2lkCWxpYnhmc190cmFjZV9wdXRidWYgKGNvbnN0IGNo YXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIHhmc19idWZfdCAqKTsKKworI2Vsc2UK KworZXh0ZXJuIHhmc19idWZfdCAqbGlieGZzX3JlYWRidWYoZGV2X3QsIHhmc19k YWRkcl90LCBpbnQsIGludCk7CitleHRlcm4gaW50CWxpYnhmc193cml0ZWJ1Zih4 ZnNfYnVmX3QgKiwgaW50KTsKK2V4dGVybiB4ZnNfYnVmX3QgKmxpYnhmc19nZXRi dWYoZGV2X3QsIHhmc19kYWRkcl90LCBpbnQpOwogZXh0ZXJuIHZvaWQJbGlieGZz X3B1dGJ1ZiAoeGZzX2J1Zl90ICopOwotZXh0ZXJuIHZvaWQJbGlieGZzX3B1cmdl YnVmICh4ZnNfYnVmX3QgKik7CisKKyNlbmRpZgorCitleHRlcm4geGZzX2J1Zl90 ICpsaWJ4ZnNfZ2V0c2IoeGZzX21vdW50X3QgKiwgaW50KTsKK2V4dGVybiB2b2lk CWxpYnhmc19iY2FjaGVfcHVyZ2Uodm9pZCk7CitleHRlcm4gdm9pZAlsaWJ4ZnNf YmNhY2hlX2ZsdXNoKHZvaWQpOworZXh0ZXJuIHZvaWQJbGlieGZzX3B1cmdlYnVm KHhmc19idWZfdCAqKTsKK2V4dGVybiBpbnQJbGlieGZzX2JjYWNoZV9vdmVyZmxv d2VkKHZvaWQpOworZXh0ZXJuIGludAlsaWJ4ZnNfYmNhY2hlX3VzYWdlKHZvaWQp OwogCiAvKiBCdWZmZXIgKFJhdykgSW50ZXJmYWNlcyAqLwotZXh0ZXJuIHhmc19i dWZfdAkqbGlieGZzX2dldGJ1ZnIgKGRldl90LCB4ZnNfZGFkZHJfdCwgaW50KTsK LWV4dGVybiB2b2lkCWxpYnhmc19wdXRidWZyICh4ZnNfYnVmX3QgKik7CitleHRl cm4geGZzX2J1Zl90ICpsaWJ4ZnNfZ2V0YnVmcihkZXZfdCwgeGZzX2RhZGRyX3Qs IGludCk7CitleHRlcm4gdm9pZAlsaWJ4ZnNfcHV0YnVmcih4ZnNfYnVmX3QgKik7 CisKK2V4dGVybiBpbnQJbGlieGZzX3dyaXRlYnVmX2ludCh4ZnNfYnVmX3QgKiwg aW50KTsKK2V4dGVybiBpbnQJbGlieGZzX3JlYWRidWZyKGRldl90LCB4ZnNfZGFk ZHJfdCwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKIAogZXh0ZXJuIGludCBsaWJ4 ZnNfYmhhc2hfc2l6ZTsKIGV4dGVybiBpbnQgbGlieGZzX2loYXNoX3NpemU7CkBA IC00NzMsNyArNTA0LDcgQEAKIGV4dGVybiB2b2lkCWxpYnhmc19ibWFwX2NhbmNl bCh4ZnNfYm1hcF9mcmVlX3QgKik7CiBleHRlcm4gaW50CWxpYnhmc19ibWFwX25l eHRfb2Zmc2V0ICh4ZnNfdHJhbnNfdCAqLCB4ZnNfaW5vZGVfdCAqLAogCQkJCXhm c19maWxlb2ZmX3QgKiwgaW50KTsKLWV4dGVybiBpbnQJbGlieGZzX2JtYXBfbGFz dF9vZmZzZXQoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKiwgCitleHRlcm4g aW50CWxpYnhmc19ibWFwX2xhc3Rfb2Zmc2V0KHhmc190cmFuc190ICosIHhmc19p bm9kZV90ICosCiAJCQkJeGZzX2ZpbGVvZmZfdCAqLCBpbnQpOwogZXh0ZXJuIGlu dAlsaWJ4ZnNfYnVubWFwaSAoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKiwg eGZzX2ZpbGVvZmZfdCwKIAkJCQl4ZnNfZmlsYmxrc190LCBpbnQsIHhmc19leHRu dW1fdCwKQEAgLTU1NSwyOSArNTg2LDEwIEBACiBleHRlcm4gdm9pZCBjbW5fZXJy KGludCwgY2hhciAqLCAuLi4pOwogZW51bSBjZSB7IENFX0RFQlVHLCBDRV9DT05U LCBDRV9OT1RFLCBDRV9XQVJOLCBDRV9BTEVSVCwgQ0VfUEFOSUMgfTsKIAotLyog bGlvIGludGVyZmFjZSAqLwotLyogbGlvX2xpc3RpbygzKSBpbnRlcmZhY2UgKFBP U0lYIGxpbmtlZCBhc3luY2hyb25vdXMgSS9PKSAqLwotZXh0ZXJuIGludCBsaWJ4 ZnNfbGlvX2lub19jb3VudDsKLWV4dGVybiBpbnQgbGlieGZzX2xpb19kaXJfY291 bnQ7Ci1leHRlcm4gaW50IGxpYnhmc19saW9fYWlvX2NvdW50OwotCi1leHRlcm4g aW50IGxpYnhmc19saW9faW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGxpYnhmc19s aW9fYWxsb2NhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCAqbGlieGZzX2dldF9saW9f YnVmZmVyKGludCB0eXBlKTsKLWV4dGVybiB2b2lkIGxpYnhmc19wdXRfbGlvX2J1 ZmZlcih2b2lkICpidWZmZXIpOwotZXh0ZXJuIGludCBsaWJ4ZnNfcmVhZGJ1Zl9s aXN0KGRldl90IGRldiwgaW50IG5lbnQsIHZvaWQgKnZvaWRwLCBpbnQgdHlwZSk7 Ci0KLXR5cGVkZWYgc3RydWN0ICBsaWJ4ZnNfbGlvX3JlcSB7Ci0JeGZzX2RhZGRy X3QJYmxrbm87Ci0JaW50CQlsZW47CS8qIGJicyAqLwotfSBsaWJ4ZnNfbGlvX3Jl cV90OwotCi0jZGVmaW5lCUxJQlhGU19MSU9fVFlQRV9JTk8JCTB4MQotI2RlZmlu ZQlMSUJYRlNfTElPX1RZUEVfRElSCQkweDIKLSNkZWZpbmUJTElCWEZTX0xJT19U WVBFX1JBVwkJMHgzCiAKICNkZWZpbmUgTElCWEZTX0JCVE9PRkY2NChiYnMpCSgo KHhmc19vZmZfdCkoYmJzKSkgPDwgQkJTSElGVCkKLWV4dGVybiBpbnQgbGlieGZz X25wcm9jKHZvaWQpOworZXh0ZXJuIGludAkJbGlieGZzX25wcm9jKHZvaWQpOwor ZXh0ZXJuIHVuc2lnbmVkIGxvbmcJbGlieGZzX3BoeXNtZW0odm9pZCk7CS8qIGlu IGtpbG9ieXRlcyAqLwogCiAjaW5jbHVkZSA8eGZzL3hmc19pYWxsb2MuaD4KICNp bmNsdWRlIDx4ZnMveGZzX3J0YWxsb2MuaD4KSW5kZXg6IHJlcGFpci94ZnNwcm9n cy9saWJ4ZnMvY2FjaGUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIu b3JpZy94ZnNwcm9ncy9saWJ4ZnMvY2FjaGUuYwkyMDA3LTA0LTI3IDEzOjEzOjM1 LjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL2xpYnhmcy9jYWNo ZS5jCTIwMDctMDYtMDQgMTc6MjM6NDIuNDIyODQ4MTE0ICsxMDAwCkBAIC0zMSw3 ICszMSw2IEBACiAjZGVmaW5lIENBQ0hFX0RFQlVHIDEKICN1bmRlZiBDQUNIRV9B Qk9SVAogLyogI2RlZmluZSBDQUNIRV9BQk9SVCAxICovCi0jZGVmaW5lCUhBU0hf Q0FDSEVfUkFUSU8JOAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNhY2hlX2dlbmVy aWNfYnVsa3JlbHNlKHN0cnVjdCBjYWNoZSAqLCBzdHJ1Y3QgbGlzdF9oZWFkICop OwogCkBAIC0yNzUsNyArMjc0LDggQEAKIHN0cnVjdCBjYWNoZV9ub2RlICoKIGNh Y2hlX25vZGVfYWxsb2NhdGUoCiAJc3RydWN0IGNhY2hlICoJCWNhY2hlLAotCXN0 cnVjdCBjYWNoZV9oYXNoICoJaGFzaGxpc3QpCisJc3RydWN0IGNhY2hlX2hhc2gg KgloYXNobGlzdCwKKwljYWNoZV9rZXlfdAkJa2V5KQogewogCXVuc2lnbmVkIGlu dAkJbm9kZXNmcmVlOwogCXN0cnVjdCBjYWNoZV9ub2RlICoJbm9kZTsKQEAgLTI5 MCw3ICsyOTAsNyBAQAogCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYWNoZS0+Y19t dXRleCk7CiAJaWYgKCFub2Rlc2ZyZWUpCiAJCXJldHVybiBOVUxMOwotCWlmICgh KG5vZGUgPSBjYWNoZS0+YWxsb2MoKSkpIHsJLyogdWgtb2ggKi8KKwlpZiAoIShu b2RlID0gY2FjaGUtPmFsbG9jKGtleSkpKSB7CS8qIHVoLW9oICovCiAJCXB0aHJl YWRfbXV0ZXhfbG9jaygmY2FjaGUtPmNfbXV0ZXgpOwogCQljYWNoZS0+Y19jb3Vu dC0tOwogCQlwdGhyZWFkX211dGV4X3VubG9jaygmY2FjaGUtPmNfbXV0ZXgpOwpA QCAtMzAyLDYgKzMwMiwxMyBAQAogCXJldHVybiBub2RlOwogfQogCitpbnQKK2Nh Y2hlX292ZXJmbG93ZWQoCisJc3RydWN0IGNhY2hlICoJCWNhY2hlKQoreworCXJl dHVybiAoY2FjaGUtPmNfbWF4Y291bnQgPT0gY2FjaGUtPmNfbWF4KTsKK30KKwog LyoKICAqIExvb2t1cCBpbiB0aGUgY2FjaGUgaGFzaCB0YWJsZS4gIFdpdGggYW55 IGx1Y2sgd2UnbGwgZ2V0IGEgY2FjaGUKICAqIGhpdCwgaW4gd2hpY2ggY2FzZSB0 aGlzIHdpbGwgYWxsIGJlIG92ZXIgcXVpY2tseSBhbmQgcGFpbmxlc3NseS4KQEAg LTM0MSw3ICszNDgsNyBAQAogCQlicmVhazsKIAl9CiAJaWYgKHBvcyA9PSBoZWFk KSB7Ci0JCW5vZGUgPSBjYWNoZV9ub2RlX2FsbG9jYXRlKGNhY2hlLCBoYXNoKTsK KwkJbm9kZSA9IGNhY2hlX25vZGVfYWxsb2NhdGUoY2FjaGUsIGhhc2gsIGtleSk7 CiAJCWlmICghbm9kZSkgewogCQkJcHJpb3JpdHkgPSBjYWNoZV9zaGFrZShjYWNo ZSwgaGFzaCwgcHJpb3JpdHkpOwogCQkJZ290byByZXN0YXJ0OwpAQCAtNDI4LDcg KzQzNSw3IEBACiB9CiAKIC8qCi0gKiBGbHVzaCBhbGwgbm9kZXMgaW4gdGhlIGNh Y2hlIHRvIGRpc2suIAorICogRmx1c2ggYWxsIG5vZGVzIGluIHRoZSBjYWNoZSB0 byBkaXNrLgogICovCiB2b2lkCiBjYWNoZV9mbHVzaCgKQEAgLTQzOSwxMyArNDQ2 LDEzIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqCXBvczsKIAlzdHJ1Y3QgY2FjaGVf bm9kZSAqCW5vZGU7CiAJaW50CQkJaTsKLQkKKwogCWlmICghY2FjaGUtPmZsdXNo KQogCQlyZXR1cm47Ci0JCisKIAlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPmNfaGFz aHNpemU7IGkrKykgewogCQloYXNoID0gJmNhY2hlLT5jX2hhc2hbaV07Ci0JCQor CiAJCXB0aHJlYWRfbXV0ZXhfbG9jaygmaGFzaC0+Y2hfbXV0ZXgpOwogCQloZWFk ID0gJmhhc2gtPmNoX2xpc3Q7CiAJCWZvciAocG9zID0gaGVhZC0+bmV4dDsgcG9z ICE9IGhlYWQ7IHBvcyA9IHBvcy0+bmV4dCkgewpAQCAtNTA1LDEwICs1MTIsMTAg QEAKIAkJdG90YWwgKz0gaSpoYXNoX2J1Y2tldF9sZW5ndGhzW2ldOwogCQlpZiAo aGFzaF9idWNrZXRfbGVuZ3Roc1tpXSA9PSAwKQogCQkJY29udGludWU7Ci0JCWZw cmludGYoZnAsICJIYXNoIGJ1Y2tldHMgd2l0aCAgJTJkIGVudHJpZXMgJTVsZCAo JTNsZCUlKVxuIiwgCisJCWZwcmludGYoZnAsICJIYXNoIGJ1Y2tldHMgd2l0aCAg JTJkIGVudHJpZXMgJTVsZCAoJTNsZCUlKVxuIiwKIAkJCWksIGhhc2hfYnVja2V0 X2xlbmd0aHNbaV0sIChpKmhhc2hfYnVja2V0X2xlbmd0aHNbaV0qMTAwKS9jYWNo ZS0+Y19jb3VudCk7CiAJfQogCWlmIChoYXNoX2J1Y2tldF9sZW5ndGhzW2ldKQkv KiBsYXN0IHJlcG9ydCBidWNrZXQgaXMgdGhlIG92ZXJmbG93IGJ1Y2tldCAqLwot CQlmcHJpbnRmKGZwLCAiSGFzaCBidWNrZXRzIHdpdGggPiUyZCBlbnRyaWVzICU1 bGQgKCUzbGQlJSlcbiIsIAorCQlmcHJpbnRmKGZwLCAiSGFzaCBidWNrZXRzIHdp dGggPiUyZCBlbnRyaWVzICU1bGQgKCUzbGQlJSlcbiIsCiAJCQlpLTEsIGhhc2hf YnVja2V0X2xlbmd0aHNbaV0sICgoY2FjaGUtPmNfY291bnQtdG90YWwpKjEwMCkv Y2FjaGUtPmNfY291bnQpOwogfQpJbmRleDogcmVwYWlyL3hmc3Byb2dzL2xpYnhm cy9saW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNw cm9ncy9saWJ4ZnMvbGlvLmMJMjAwNy0wNC0yNyAxMzoxMzozNS4wMDAwMDAwMDAg KzEwMDAKKysrIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMDAwMDAw MCArMDAwMApAQCAtMSwxOTIgKzAsMCBAQAotI2luY2x1ZGUgPHhmcy9saWJ4ZnMu aD4KLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAiYWlvLmgiCi0KLSNkZWZp bmUJREVGX1BSRUZFVENIX0lOT1MJMTYKLSNkZWZpbmUJREVGX1BSRUZFVENIX0RJ UlMJMTYKLSNkZWZpbmUJREVGX1BSRUZFVENIX0FJTwkzMgotaW50CWxpYnhmc19s aW9faW5vX2NvdW50ID0gREVGX1BSRUZFVENIX0lOT1M7Ci1pbnQJbGlieGZzX2xp b19kaXJfY291bnQgPSBERUZfUFJFRkVUQ0hfRElSUzsKLWludAlsaWJ4ZnNfbGlv X2Fpb19jb3VudCA9IERFRl9QUkVGRVRDSF9BSU87Ci0KLXN0YXRpYyBwdGhyZWFk X2tleV90IGxpb19pbm9fa2V5Owotc3RhdGljIHB0aHJlYWRfa2V5X3QgbGlvX2Rp cl9rZXk7Ci0KLXZvaWQKLWxpYnhmc19saW9fYWxsb2NhdGUodm9pZCkKLXsKLSNp ZmRlZglfQUlPQ0I2NF9UX0RFRklORUQKLQlzaXplX3QJCXNpemU7Ci0Jdm9pZAkJ KnZvaWRwOwotCi0JLyoKLQkgKiBhbGxvY2F0ZSBhIHBlci10aHJlYWQgYnVmZmVy IHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBsaWJ4ZnNfcmVhZGJ1Zl9saXN0Ci0JICog aW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkgKiBsaWJ4ZnNfbGlvX3JlcV90IGFy cmF5Ci0JICogYWlvY2I2NF90IGFycmF5Ci0JICogYWlvY2I2NF90ICogYXJyYXkK LQkgKiB4ZnNfYnVmX3QgKiBhcnJheQotCSAqLwotCXNpemUgPSBzaXplb2YobGli eGZzX2xpb19yZXFfdCkgKyBzaXplb2YoYWlvY2I2NF90KSArICBzaXplb2YoYWlv Y2I2NF90ICopICsgc2l6ZW9mKHhmc19idWZfdCAqKTsKLQotCXZvaWRwID0gbWFs bG9jKGxpYnhmc19saW9faW5vX2NvdW50KnNpemUpOwotCWlmICh2b2lkcCA9PSBO VUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibGlvX2FsbG9jYXRlOiBjYW5ub3Qg YWxsb2NhdGUgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2VcbiIpOwotCQlleGl0KDEp OwotCQkvKiBOTyBSRVRVUk4gKi8KLQkJcmV0dXJuOwotCX0KLQlwdGhyZWFkX3Nl dHNwZWNpZmljKGxpb19pbm9fa2V5LCAgdm9pZHApOwotCi0Jdm9pZHAgPSBtYWxs b2MobGlieGZzX2xpb19kaXJfY291bnQqc2l6ZSk7Ci0JaWYgKHZvaWRwID09IE5V TEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsaW9fYWxsb2NhdGU6IGNhbm5vdCBh bGxvY2F0ZSB0aHJlYWQgc3BlY2lmaWMgc3RvcmFnZVxuIik7Ci0JCWV4aXQoMSk7 Ci0JCS8qIE5PIFJFVFVSTiAqLwotCQlyZXR1cm47Ci0JfQotCXB0aHJlYWRfc2V0 c3BlY2lmaWMobGlvX2Rpcl9rZXksICB2b2lkcCk7Ci0jZW5kaWYJLyogX0FJT0NC NjRfVF9ERUZJTkVEICovCi19Ci0KLWludAotbGlieGZzX2xpb19pbml0KHZvaWQp Ci17Ci0jaWZkZWYJX0FJT0NCNjRfVF9ERUZJTkVECi0JaWYgKHBsYXRmb3JtX2Fp b19pbml0KGxpYnhmc19saW9fYWlvX2NvdW50KSkgewotCQlwdGhyZWFkX2tleV9j cmVhdGUoJmxpb19pbm9fa2V5LCBOVUxMKTsKLQkJcHRocmVhZF9rZXlfY3JlYXRl KCZsaW9fZGlyX2tleSwgTlVMTCk7Ci0JCXJldHVybiAoMSk7Ci0JfQotI2VuZGlm CS8qIF9BSU9DQjY0X1RfREVGSU5FRCAqLwotCXJldHVybiAoMCk7Ci19Ci0KLXZv aWQgKgotbGlieGZzX2dldF9saW9fYnVmZmVyKGludCB0eXBlKQotewotI2lmZGVm CV9BSU9DQjY0X1RfREVGSU5FRAotCWlmICh0eXBlID09IExJQlhGU19MSU9fVFlQ RV9JTk8pCi0JCXJldHVybiBwdGhyZWFkX2dldHNwZWNpZmljKGxpb19pbm9fa2V5 KTsKLQlpZiAodHlwZSA9PSBMSUJYRlNfTElPX1RZUEVfRElSKQotCQlyZXR1cm4g cHRocmVhZF9nZXRzcGVjaWZpYyhsaW9fZGlyX2tleSk7Ci0JaWYgKHR5cGUgPT0g TElCWEZTX0xJT19UWVBFX1JBVykgewotCQkvKiB1c2UgdGhlIGlub2RlIGJ1ZmZl cnMgc2luY2UgdGhlcmUgaXMKLQkJICogbm8gb3ZlcmxhcCB3aXRoIHRoZSBvdGhl ciByZXF1ZXN0cy4KLQkJICovCi0JCXJldHVybiBwdGhyZWFkX2dldHNwZWNpZmlj KGxpb19pbm9fa2V5KTsKLQl9Ci0JZnByaW50ZihzdGRlcnIsICJnZXRfbGlvX2J1 ZmZlcjogaW52YWxpZCB0eXBlIDB4JXhcbiIsIHR5cGUpOwotCWV4aXQoMSk7Ci0j ZW5kaWYKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXZvaWQK LWxpYnhmc19wdXRfbGlvX2J1ZmZlcih2b2lkICpidWZmZXIpCi17Ci0JcmV0dXJu OwkvKiBub3RoaW5nIHRvIGRvICovCi19Ci0KLXN0YXRpYyBpbnQKLWxpb19jb21w YXJlKGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMikKLXsKLQlsaWJ4ZnNf bGlvX3JlcV90ICpyMSA9IChsaWJ4ZnNfbGlvX3JlcV90ICopIGUxOwotCWxpYnhm c19saW9fcmVxX3QgKnIyID0gKGxpYnhmc19saW9fcmVxX3QgKikgZTI7Ci0KLQly ZXR1cm4gKGludCkgKHIxLT5ibGtubyAtIHIyLT5ibGtubyk7Ci19Ci0KLWludAot bGlieGZzX3JlYWRidWZfbGlzdChkZXZfdCBkZXYsIGludCBuZW50LCB2b2lkICp2 b2lkcCwgaW50IHR5cGUpCi17Ci0jaWZkZWYJX0FJT0NCNjRfVF9ERUZJTkVECi0J bGlieGZzX2xpb19yZXFfdAkqcmJscDsKLQl4ZnNfYnVmX3QJCSpicCwgKipicGxp c3Q7Ci0JYWlvY2I2NF90CQkqYWlvY2xpc3QsICoqYWlvY3B0cjsKLQlpbnQJCQlp LCBuYnAsIGVycjsKLQlpbnQJCQlmZDsKLQotCWlmIChuZW50IDw9IDApCi0JCXJl dHVybiAwOwotCWlmICgodHlwZSA9PSBMSUJYRlNfTElPX1RZUEVfSU5PKSB8fCAo dHlwZSA9PSBMSUJYRlNfTElPX1RZUEVfUkFXKSkgewotCQlpZiAobGlieGZzX2xp b19pbm9fY291bnQgPT0gMCkKLQkJCXJldHVybiAoMCk7Ci0JCWlmIChuZW50ID4g bGlieGZzX2xpb19pbm9fY291bnQpCi0JCQluZW50ID0gbGlieGZzX2xpb19pbm9f Y291bnQ7Ci0JfQotCWVsc2UgaWYgKHR5cGUgPT0gTElCWEZTX0xJT19UWVBFX0RJ UikgewotCQlpZiAobGlieGZzX2xpb19kaXJfY291bnQgPT0gMCkKLQkJCXJldHVy biAoMCk7Ci0JCWlmIChuZW50ID4gbGlieGZzX2xpb19kaXJfY291bnQpCi0JCQlu ZW50ID0gbGlieGZzX2xpb19kaXJfY291bnQ7Ci0JCWlmIChuZW50ID4gMikKLQkJ CXFzb3J0KHZvaWRwLCBuZW50LCBzaXplb2YobGlieGZzX2xpb19yZXFfdCksIGxp b19jb21wYXJlKTsKLQl9Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSW52 YWxpZCB0eXBlIDB4JXggaW4gbGlieGZzX3JlYWRidWZfbGlzdFxuIiwgdHlwZSk7 Ci0JCWFib3J0KCk7Ci0JCS8qIE5PIFJFVFVSTiAqLwotCQlyZXR1cm4gKDApOwot CX0KLQotCS8qIHNwYWNlIGZvciBsaW9fbGlzdGlvIHByb2Nlc3NpbmcsIHNlZSBs aWJ4ZnNfbGlvX2FsbG9jYXRlICovCi0JcmJscCA9IChsaWJ4ZnNfbGlvX3JlcV90 ICopIHZvaWRwOwotCWFpb2NsaXN0ID0gKGFpb2NiNjRfdCAqKSAocmJscCArIG5l bnQpOwotCWFpb2NwdHIgPSAoYWlvY2I2NF90ICoqKSAoYWlvY2xpc3QgKyBuZW50 KTsKLQlicGxpc3QgPSAoeGZzX2J1Zl90ICoqKSAoYWlvY3B0ciArIG5lbnQpOwot Ci0JYnplcm8oYWlvY2xpc3QsIG5lbnQqc2l6ZW9mKGFpb2NiNjRfdCkpOwotCi0J LyogbG9vayBpbiBidWZmZXIgY2FjaGUgKi8KLQlmb3IgKGkgPSAwLCBuYnAgPSAw OyBpIDwgbmVudDsgaSsrKSB7Ci0JCUFTU0VSVChyYmxwW2ldLmxlbik7Ci0JCWJw ID0gbGlieGZzX2dldGJ1ZihkZXYsIHJibHBbaV0uYmxrbm8sIHJibHBbaV0ubGVu KTsKLQkJaWYgKGJwID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKGJwLT5i X2ZsYWdzICYgKExJQlhGU19CX1VQVE9EQVRFfExJQlhGU19CX0RJUlRZKSkgewot CQkJLyogYWxyZWFkeSBpbiBjYWNoZSAqLwotCQkJbGlieGZzX3B1dGJ1ZihicCk7 Ci0JCQljb250aW51ZTsKLQkJfQotCQlicGxpc3RbbmJwKytdID0gYnA7Ci0JfQot Ci0JaWYgKG5icCA9PSAwKQotCQlyZXR1cm4gKDApOyAvKiBOb3RoaW5nIHRvIGRv ICovCi0KLQlpZiAobmJwID09IDEpIHsKLQkJbGlieGZzX3B1dGJ1ZihicGxpc3Rb MF0pOwkvKiBzaW5nbGUgYnVmZmVyLCBubyBwb2ludCAqLwotCQlyZXR1cm4gKDAp OwotCX0KLQotCWZkID0gbGlieGZzX2RldmljZV90b19mZChkZXYpOwotCi0JZm9y IChpID0gMDsgaSA8IG5icDsgaSsrKSB7Ci0JCWFpb2NsaXN0W2ldLmFpb19maWxk ZXMgPSBmZDsKLQkJYWlvY2xpc3RbaV0uYWlvX25ieXRlcyA9IFhGU19CVUZfQ09V TlQoYnBsaXN0W2ldKTsKLQkJYWlvY2xpc3RbaV0uYWlvX2J1ZiA9IFhGU19CVUZf UFRSKGJwbGlzdFtpXSk7Ci0JCWFpb2NsaXN0W2ldLmFpb19vZmZzZXQgPSBMSUJY RlNfQkJUT09GRjY0KFhGU19CVUZfQUREUihicGxpc3RbaV0pKTsKLQkJYWlvY2xp c3RbaV0uYWlvX2xpb19vcGNvZGUgPSBMSU9fUkVBRDsKLQkJYWlvY3B0cltpXSA9 ICZhaW9jbGlzdFtpXTsKLQl9Ci0KLQllcnIgPSBsaW9fbGlzdGlvNjQoTElPX1dB SVQsIGFpb2NwdHIsIG5icCwgTlVMTCk7Ci0KLQlpZiAoZXJyICE9IDApIHsKLQkJ ZnByaW50ZihzdGRlcnIsICJsaW9fbGlzdGlvICglZCBlbnRyaWVzKSBmYWlsdXJl IGVyciA9ICVkXG4iLCBuYnAsIGVycik7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8 IG5icDsgaSsrKSB7Ci0JCS8qIGJ1ZmZlciB3aXRoIGRhdGEgaW4gY2FjaGUgYXZh aWxhYmxlIHZpYSBmdXR1cmUgbGlieGZzX3JlYWRidWYgKi8KLQkJaWYgKGVyciA9 PSAwKQotCQkJYnBsaXN0W2ldLT5iX2ZsYWdzIHw9IExJQlhGU19CX1VQVE9EQVRF OwotCQlsaWJ4ZnNfcHV0YnVmKGJwbGlzdFtpXSk7Ci0JfQotCi0JcmV0dXJuIChl cnIgPT0gMD8gbmJwIDogLTEpOwotI2Vsc2UJLyogX0FJT0NCNjRfVF9ERUZJTkVE ICovCi0JcmV0dXJuIC0xOwotI2VuZGlmCS8qIF9BSU9DQjY0X1RfREVGSU5FRCAq LwotfQpJbmRleDogcmVwYWlyL3hmc3Byb2dzL2xpYnhmcy9yZHdyLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvbGlieGZzL3Jk d3IuYwkyMDA3LTA0LTI3IDEzOjEzOjM1LjAwMDAwMDAwMCArMTAwMAorKysgcmVw YWlyL3hmc3Byb2dzL2xpYnhmcy9yZHdyLmMJMjAwNy0wNi0wNCAxNDowNDozNC42 MTk1NjIxNjkgKzEwMDAKQEAgLTI0LDYgKzI0LDggQEAKICNkZWZpbmUgQkRTVFJB VF9TSVpFCSgyNTYgKiAxMDI0KQogI2RlZmluZSBtaW4oeCwgeSkJKCh4KSA8ICh5 KSA/ICh4KSA6ICh5KSkKIAorI2RlZmluZSBJT19CQ09NUEFSRV9DSEVDSworCiB2 b2lkCiBsaWJ4ZnNfZGV2aWNlX3plcm8oZGV2X3QgZGV2LCB4ZnNfZGFkZHJfdCBz dGFydCwgdWludCBsZW4pCiB7CkBAIC0xODMsNiArMTg1LDcxIEBACiAJcmV0dXJu IEJCVE9CKGxlbik7CiB9CiAKKy8qCisgKiBTaW1wbGUgSS9PIChidWZmZXIgY2Fj aGUpIGludGVyZmFjZQorICovCisKKworI2lmZGVmIFhGU19CVUZfVFJBQ0lORwor CisjdW5kZWYgbGlieGZzX3JlYWRidWYKKyN1bmRlZiBsaWJ4ZnNfd3JpdGVidWYK KyN1bmRlZiBsaWJ4ZnNfZ2V0YnVmCisjdW5kZWYgbGlieGZzX3B1dGJ1ZgorCit4 ZnNfYnVmX3QgCSpsaWJ4ZnNfcmVhZGJ1ZihkZXZfdCwgeGZzX2RhZGRyX3QsIGlu dCwgaW50KTsKK2ludAkJbGlieGZzX3dyaXRlYnVmKHhmc19idWZfdCAqLCBpbnQp OworeGZzX2J1Zl90IAkqbGlieGZzX2dldGJ1ZihkZXZfdCwgeGZzX2RhZGRyX3Qs IGludCk7Cit2b2lkCQlsaWJ4ZnNfcHV0YnVmICh4ZnNfYnVmX3QgKik7CisKK3hm c19idWZfdCAqCitsaWJ4ZnNfdHJhY2VfcmVhZGJ1Zihjb25zdCBjaGFyICpmdW5j LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgZGV2X3QgZGV2LCB4ZnNfZGFk ZHJfdCBibGtubywgaW50IGxlbiwgaW50IGZsYWdzKQoreworCXhmc19idWZfdAkq YnAgPSBsaWJ4ZnNfcmVhZGJ1ZihkZXYsIGJsa25vLCBsZW4sIGZsYWdzKTsKKwor CWJwLT5iX2Z1bmMgPSBmdW5jOworCWJwLT5iX2ZpbGUgPSBmaWxlOworCWJwLT5i X2xpbmUgPSBsaW5lOworCisJcmV0dXJuIGJwOworfQorCitpbnQKK2xpYnhmc190 cmFjZV93cml0ZWJ1Zihjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmaWxl LCBpbnQgbGluZSwgeGZzX2J1Zl90ICpicCwgaW50IGZsYWdzKQoreworCWJwLT5i X2Z1bmMgPSBmdW5jOworCWJwLT5iX2ZpbGUgPSBmaWxlOworCWJwLT5iX2xpbmUg PSBsaW5lOworCisJcmV0dXJuIGxpYnhmc193cml0ZWJ1ZihicCwgZmxhZ3MpOwor fQorCit4ZnNfYnVmX3QgKgorbGlieGZzX3RyYWNlX2dldGJ1Zihjb25zdCBjaGFy ICpmdW5jLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgZGV2X3QgZGV2aWNl LCB4ZnNfZGFkZHJfdCBibGtubywgaW50IGxlbikKK3sKKwl4ZnNfYnVmX3QJKmJw ID0gbGlieGZzX2dldGJ1ZihkZXZpY2UsIGJsa25vLCBsZW4pOworCisJYnAtPmJf ZnVuYyA9IGZ1bmM7CisJYnAtPmJfZmlsZSA9IGZpbGU7CisJYnAtPmJfbGluZSA9 IGxpbmU7CisKKwlyZXR1cm4gYnA7Cit9CisKK3ZvaWQKK2xpYnhmc190cmFjZV9w dXRidWYoY29uc3QgY2hhciAqZnVuYywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxp bmUsIHhmc19idWZfdCAqYnApCit7CisJYnAtPmJfZnVuYyA9IGZ1bmM7CisJYnAt PmJfZmlsZSA9IGZpbGU7CisJYnAtPmJfbGluZSA9IGxpbmU7CisKKwlsaWJ4ZnNf cHV0YnVmKGJwKTsKK30KKworCisjZW5kaWYKKworCiB4ZnNfYnVmX3QgKgogbGli eGZzX2dldHNiKHhmc19tb3VudF90ICptcCwgaW50IGZsYWdzKQogewpAQCAtMTkw LDIzICsyNTcsMTggQEAKIAkJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgZmxhZ3Mp OwogfQogCi0KLS8qCi0gKiBTaW1wbGUgSS9PIChidWZmZXIgY2FjaGUpIGludGVy ZmFjZQotICovCi0KIHhmc196b25lX3QJKnhmc19idWZfem9uZTsKIAogdHlwZWRl ZiBzdHJ1Y3QgewogCWRldl90CQlkZXZpY2U7CiAJeGZzX2RhZGRyX3QJYmxrbm87 Ci0JdW5zaWduZWQgaW50CWNvdW50OworCXVuc2lnbmVkIGludAliYmxlbjsKIH0g eGZzX2J1ZmtleV90OwogCiBzdGF0aWMgdW5zaWduZWQgaW50CiBsaWJ4ZnNfYmhh c2goY2FjaGVfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgaGFzaHNpemUpCiB7Ci0J cmV0dXJuICgodW5zaWduZWQgaW50KSgoeGZzX2J1ZmtleV90ICopa2V5KS0+Ymxr bm8pICUgaGFzaHNpemU7CisJcmV0dXJuICgoKHVuc2lnbmVkIGludCkoKHhmc19i dWZrZXlfdCAqKWtleSktPmJsa25vKSA+PiA1KSAlIGhhc2hzaXplOwogfQogCiBz dGF0aWMgaW50CkBAIC0yMTgsMTYgKzI4MCwxNyBAQAogI2lmZGVmIElPX0JDT01Q QVJFX0NIRUNLCiAJaWYgKGJwLT5iX2RldiA9PSBia2V5LT5kZXZpY2UgJiYKIAkg ICAgYnAtPmJfYmxrbm8gPT0gYmtleS0+Ymxrbm8gJiYKLQkgICAgYnAtPmJfYmNv dW50ICE9IGJrZXktPmNvdW50KQotCQlmcHJpbnRmKHN0ZGVyciwgIkJhZG5lc3Mg aW4ga2V5IGxvb2t1cCAobGVuZ3RoKVxuIgotCQkJImJwPShibm8gJWxsdSwgbGVu ICV1IGJiKSBrZXk9KGJubyAlbGx1LCBsZW4gJXUgYmJzKVxuIiwKKwkgICAgYnAt PmJfYmNvdW50ICE9IEJCVE9CKGJrZXktPmJibGVuKSkKKwkJZnByaW50ZihzdGRl cnIsICIlbHg6IEJhZG5lc3MgaW4ga2V5IGxvb2t1cCAobGVuZ3RoKVxuIgorCQkJ ImJwPShibm8gJWxsdSwgbGVuICV1IGJ5dGVzKSBrZXk9KGJubyAlbGx1LCBsZW4g JXUgYnl0ZXMpXG4iLAorCQkJcHRocmVhZF9zZWxmKCksCiAJCQkodW5zaWduZWQg bG9uZyBsb25nKWJwLT5iX2Jsa25vLCAoaW50KWJwLT5iX2Jjb3VudCwKLQkJCSh1 bnNpZ25lZCBsb25nIGxvbmcpYmtleS0+Ymxrbm8sIChpbnQpYmtleS0+Y291bnQp OworCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylia2V5LT5ibGtubywgQkJUT0IoYmtl eS0+YmJsZW4pKTsKICNlbmRpZgogCiAJcmV0dXJuIChicC0+Yl9kZXYgPT0gYmtl eS0+ZGV2aWNlICYmCiAJCWJwLT5iX2Jsa25vID09IGJrZXktPmJsa25vICYmCi0J CWJwLT5iX2Jjb3VudCA9PSBia2V5LT5jb3VudCk7CisJCWJwLT5iX2Jjb3VudCA9 PSBCQlRPQihia2V5LT5iYmxlbikpOwogfQogCiB2b2lkCkBAIC0yMzksMjcgKzMw Miw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1saWJ4ZnNfYnJlbHNlKHN0cnVjdCBj YWNoZV9ub2RlICpub2RlKQotewotCXhmc19idWZfdAkJKmJwID0gKHhmc19idWZf dCAqKW5vZGU7Ci0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7Ci0JZXh0ZXJuIHhm c196b25lX3QJKnhmc19idWZfaXRlbV96b25lOwotCi0JaWYgKGJwICE9IE5VTEwp IHsKLQkJaWYgKGJwLT5iX2ZsYWdzICYgTElCWEZTX0JfRElSVFkpCi0JCQlsaWJ4 ZnNfd3JpdGVidWZyKGJwKTsKLQkJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAs IHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKLQkJaWYgKGJpcCkKLQkJICAgIGxpYnhm c196b25lX2ZyZWUoeGZzX2J1Zl9pdGVtX3pvbmUsIGJpcCk7Ci0JCWZyZWUoYnAt PmJfYWRkcik7Ci0JCWJwLT5iX2FkZHIgPSBOVUxMOwotCQlicC0+Yl9mbGFncyA9 IDA7Ci0JCWZyZWUoYnApOwotCQlicCA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMg dm9pZAogbGlieGZzX2luaXRidWYoeGZzX2J1Zl90ICpicCwgZGV2X3QgZGV2aWNl LCB4ZnNfZGFkZHJfdCBibm8sIHVuc2lnbmVkIGludCBieXRlcykKIHsKIAlicC0+ Yl9mbGFncyA9IDA7CkBAIC0yNzQsNiArMzE2LDEwIEBACiAJCQlzdHJlcnJvcihl cnJubykpOwogCQlleGl0KDEpOwogCX0KKyNpZmRlZiBYRlNfQlVGX1RSQUNJTkcK KwlsaXN0X2hlYWRfaW5pdCgmYnAtPmJfbG9ja19saXN0KTsKKyNlbmRpZgorCXB0 aHJlYWRfbXV0ZXhfaW5pdCgmYnAtPmJfbG9jaywgTlVMTCk7CiB9CiAKIHhmc19i dWZfdCAqCkBAIC0yODIsNDEgKzMyOCw2MyBAQAogCXhmc19idWZfdAkqYnA7CiAK IAlicCA9IGxpYnhmc196b25lX3phbGxvYyh4ZnNfYnVmX3pvbmUpOwotCWxpYnhm c19pbml0YnVmKGJwLCBkZXZpY2UsIGJsa25vLCBCQlRPQihsZW4pKTsKKwlpZiAo YnAgIT0gTlVMTCkKKwkJbGlieGZzX2luaXRidWYoYnAsIGRldmljZSwgYmxrbm8s IEJCVE9CKGxlbikpOworI2lmZGVmIElPX0RFQlVHCisJcHJpbnRmKCIlbHg6ICVz OiBhbGxvY2F0ZWQgJXUgYnl0ZXMgYnVmZmVyLCBrZXk9JWxsdSglbGx1KSwgJXBc biIsCisJCXB0aHJlYWRfc2VsZigpLCBfX0ZVTkNUSU9OX18sIEJCVE9CKGxlbiks CisJCShsb25nIGxvbmcpTElCWEZTX0JCVE9PRkY2NChibGtubyksIChsb25nIGxv bmcpYmxrbm8sIGJwKTsKKyNlbmRpZgogCXJldHVybiBicDsKIH0KIAotdm9pZAot bGlieGZzX3B1dGJ1ZnIoeGZzX2J1Zl90ICpicCkKLXsKLQlsaWJ4ZnNfYnJlbHNl KChzdHJ1Y3QgY2FjaGVfbm9kZSAqKWJwKTsKLX0KKworI2lmZGVmIFhGU19CVUZf VFJBQ0lORworc3RydWN0IGxpc3RfaGVhZAlsb2NrX2J1Zl9saXN0ID0geyZsb2Nr X2J1Zl9saXN0LCAmbG9ja19idWZfbGlzdH07CitpbnQJCQlsb2NrX2J1Zl9jb3Vu dCA9IDA7CisjZW5kaWYKIAogeGZzX2J1Zl90ICoKIGxpYnhmc19nZXRidWYoZGV2 X3QgZGV2aWNlLCB4ZnNfZGFkZHJfdCBibGtubywgaW50IGxlbikKIHsKIAl4ZnNf YnVmX3QJKmJwOwogCXhmc19idWZrZXlfdAlrZXk7Ci0JdW5zaWduZWQgaW50CWJ5 dGVzID0gQkJUT0IobGVuKTsKKwlpbnQJCW1pc3M7CiAKIAlrZXkuZGV2aWNlID0g ZGV2aWNlOwogCWtleS5ibGtubyA9IGJsa25vOwotCWtleS5jb3VudCA9IGJ5dGVz OworCWtleS5iYmxlbiA9IGxlbjsKIAotCWlmIChjYWNoZV9ub2RlX2dldChsaWJ4 ZnNfYmNhY2hlLCAma2V5LCAoc3RydWN0IGNhY2hlX25vZGUgKiopJmJwKSkgewor CW1pc3MgPSBjYWNoZV9ub2RlX2dldChsaWJ4ZnNfYmNhY2hlLCAma2V5LCAoc3Ry dWN0IGNhY2hlX25vZGUgKiopJmJwKTsKKwlpZiAoYnApIHsKKwkJcHRocmVhZF9t dXRleF9sb2NrKCZicC0+Yl9sb2NrKTsKKyNpZmRlZiBYRlNfQlVGX1RSQUNJTkcK KwkJcHRocmVhZF9tdXRleF9sb2NrKCZsaWJ4ZnNfYmNhY2hlLT5jX211dGV4KTsK KwkJbG9ja19idWZfY291bnQrKzsKKwkJbGlzdF9hZGQoJmJwLT5iX2xvY2tfbGlz dCwgJmxvY2tfYnVmX2xpc3QpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbGli eGZzX2JjYWNoZS0+Y19tdXRleCk7CisjZW5kaWYKICNpZmRlZiBJT19ERUJVRwot CQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBhbGxvY2F0ZWQgJXVieXRlcyBidWZmZXIs IGtleT0lbGx1KCVsbHUpLCAlcFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgQkJUT0Io bGVuKSwKLQkJCShsb25nIGxvbmcpTElCWEZTX0JCVE9PRkY2NChibGtubyksIChs b25nIGxvbmcpYmxrbm8sIGJwKTsKKwkJcHJpbnRmKCIlbHggJXM6ICVzIGJ1ZmZl ciAlcCBmb3IgYm5vID0gJWxsdVxuIiwKKwkJCXB0aHJlYWRfc2VsZigpLCBfX0ZV TkNUSU9OX18sIG1pc3MgPyAibWlzcyIgOiAiaGl0IiwKKwkJCWJwLCAobG9uZyBs b25nKUxJQlhGU19CQlRPT0ZGNjQoYmxrbm8pKTsKICNlbmRpZgotCQlsaWJ4ZnNf aW5pdGJ1ZihicCwgZGV2aWNlLCBibGtubywgYnl0ZXMpOwogCX0KKwogCXJldHVy biBicDsKIH0KIAogdm9pZAogbGlieGZzX3B1dGJ1Zih4ZnNfYnVmX3QgKmJwKQog eworI2lmZGVmIFhGU19CVUZfVFJBQ0lORworCXB0aHJlYWRfbXV0ZXhfbG9jaygm bGlieGZzX2JjYWNoZS0+Y19tdXRleCk7CisJbG9ja19idWZfY291bnQtLTsKKwlB U1NFUlQobG9ja19idWZfY291bnQgPj0gMCk7CisJbGlzdF9kZWxfaW5pdCgmYnAt PmJfbG9ja19saXN0KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbGlieGZzX2Jj YWNoZS0+Y19tdXRleCk7CisjZW5kaWYKKwlwdGhyZWFkX211dGV4X3VubG9jaygm YnAtPmJfbG9jayk7CiAJY2FjaGVfbm9kZV9wdXQoKHN0cnVjdCBjYWNoZV9ub2Rl ICopYnApOwogfQogCkBAIC0zMjcsMTUgKzM5NSwxOCBAQAogCiAJa2V5LmRldmlj ZSA9IGJwLT5iX2RldjsKIAlrZXkuYmxrbm8gPSBicC0+Yl9ibGtubzsKLQlrZXku Y291bnQgPSBicC0+Yl9iY291bnQ7CisJa2V5LmJibGVuID0gYnAtPmJfYmNvdW50 ID4+IEJCU0hJRlQ7CiAKIAljYWNoZV9ub2RlX3B1cmdlKGxpYnhmc19iY2FjaGUs ICZrZXksIChzdHJ1Y3QgY2FjaGVfbm9kZSAqKWJwKTsKIH0KIAogc3RhdGljIHN0 cnVjdCBjYWNoZV9ub2RlICoKLWxpYnhmc19iYWxsb2Modm9pZCkKK2xpYnhmc19i YWxsb2MoY2FjaGVfa2V5X3Qga2V5KQogewotCXJldHVybiBsaWJ4ZnNfem9uZV96 YWxsb2MoeGZzX2J1Zl96b25lKTsKKwl4ZnNfYnVma2V5X3QJKmJ1ZmtleSA9ICh4 ZnNfYnVma2V5X3QgKilrZXk7CisKKwlyZXR1cm4gKHN0cnVjdCBjYWNoZV9ub2Rl ICopbGlieGZzX2dldGJ1ZnIoYnVma2V5LT5kZXZpY2UsCisJCQkJCWJ1ZmtleS0+ Ymxrbm8sIGJ1ZmtleS0+YmJsZW4pOwogfQogCiBpbnQKQEAgLTM1NCw4ICs0MjUs OSBAQAogCQlyZXR1cm4gZXJybm87CiAJfQogI2lmZGVmIElPX0RFQlVHCi0JZnBy aW50ZihzdGRlcnIsICJyZWFkYnVmciByZWFkICV1Ynl0ZXMsIGJsa25vPSVsbHUo JWxsdSksICVwXG4iLAotCQlieXRlcywgKGxvbmcgbG9uZylMSUJYRlNfQkJUT09G RjY0KGJsa25vKSwgKGxvbmcgbG9uZylibGtubywgYnApOworCXByaW50ZigiJWx4 OiAlczogcmVhZCAldSBieXRlcywgYmxrbm89JWxsdSglbGx1KSwgJXBcbiIsCisJ CXB0aHJlYWRfc2VsZigpLCBfX0ZVTkNUSU9OX18sIGJ5dGVzLAorCQkobG9uZyBs b25nKUxJQlhGU19CQlRPT0ZGNjQoYmxrbm8pLCAobG9uZyBsb25nKWJsa25vLCBi cCk7CiAjZW5kaWYKIAlpZiAoYnAtPmJfZGV2ID09IGRldiAmJgogCSAgICBicC0+ Yl9ibGtubyA9PSBibGtubyAmJgpAQCAtMzcxLDcgKzQ0Myw3IEBACiAJaW50CQll cnJvcjsKIAogCWJwID0gbGlieGZzX2dldGJ1ZihkZXYsIGJsa25vLCBsZW4pOwot CWlmICghKGJwLT5iX2ZsYWdzICYgKExJQlhGU19CX1VQVE9EQVRFfExJQlhGU19C X0RJUlRZKSkpIHsKKwlpZiAoYnAgJiYgIShicC0+Yl9mbGFncyAmIChMSUJYRlNf Ql9VUFRPREFURXxMSUJYRlNfQl9ESVJUWSkpKSB7CiAJCWVycm9yID0gbGlieGZz X3JlYWRidWZyKGRldiwgYmxrbm8sIGJwLCBsZW4sIGZsYWdzKTsKIAkJaWYgKGVy cm9yKSB7CiAJCQlsaWJ4ZnNfcHV0YnVmKGJwKTsKQEAgLTQwMyw5ICs0NzUsMTAg QEAKIAkJcmV0dXJuIEVJTzsKIAl9CiAjaWZkZWYgSU9fREVCVUcKLQlmcHJpbnRm KHN0ZGVyciwgIndyaXRlYnVmciB3cm90ZSAldWJ5dGVzLCBibGtubz0lbGx1KCVs bHUpLCAlcFxuIiwKLQkJYnAtPmJfYmNvdW50LCAobG9uZyBsb25nKUxJQlhGU19C QlRPT0ZGNjQoYnAtPmJfYmxrbm8pLAotCQkobG9uZyBsb25nKWJwLT5iX2Jsa25v LCBicCk7CisJcHJpbnRmKCIlbHg6ICVzOiB3cm90ZSAldSBieXRlcywgYmxrbm89 JWxsdSglbGx1KSwgJXBcbiIsCisJCQlwdGhyZWFkX3NlbGYoKSwgX19GVU5DVElP Tl9fLCBicC0+Yl9iY291bnQsCisJCQkobG9uZyBsb25nKUxJQlhGU19CQlRPT0ZG NjQoYnAtPmJfYmxrbm8pLAorCQkJKGxvbmcgbG9uZylicC0+Yl9ibGtubywgYnAp OwogI2VuZGlmCiAJYnAtPmJfZmxhZ3MgfD0gTElCWEZTX0JfVVBUT0RBVEU7CiAJ YnAtPmJfZmxhZ3MgJj0gfihMSUJYRlNfQl9ESVJUWSB8IExJQlhGU19CX0VYSVQp OwpAQCAtNDMyLDcgKzUwNSw3IEBACiB7CiAjaWZkZWYgSU9fREVCVUcKIAlpZiAo Ym9mZiArIGxlbiA+IGJwLT5iX2Jjb3VudCkgewotCQlmcHJpbnRmKHN0ZGVyciwg IkJhZG5lc3MsIGlvbW92ZSBvdXQgb2YgcmFuZ2UhXG4iCisJCXByaW50ZigiQmFk bmVzcywgaW9tb3ZlIG91dCBvZiByYW5nZSFcbiIKIAkJCSJicD0oYm5vICVsbHUs IGJ5dGVzICV1KSByYW5nZT0oYm9mZiAldSwgYnl0ZXMgJXUpXG4iLAogCQkJKGxv bmcgbG9uZylicC0+Yl9ibGtubywgYnAtPmJfYmNvdW50LCBib2ZmLCBsZW4pOwog CQlhYm9ydCgpOwpAQCAtNDYwLDYgKzUzMywzNSBAQAogCQlsaWJ4ZnNfd3JpdGVi dWZyKGJwKTsKIH0KIAorc3RhdGljIHZvaWQKK2xpYnhmc19icmVsc2Uoc3RydWN0 IGNhY2hlX25vZGUgKm5vZGUpCit7CisJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1 Zl90ICopbm9kZTsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwlleHRlcm4g eGZzX3pvbmVfdAkqeGZzX2J1Zl9pdGVtX3pvbmU7CisKKwlpZiAoYnAgIT0gTlVM TCkgeworCQlpZiAoYnAtPmJfZmxhZ3MgJiBMSUJYRlNfQl9ESVJUWSkKKwkJCWxp Ynhmc193cml0ZWJ1ZnIoYnApOworCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShi cCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCQlpZiAoYmlwKQorCQkJbGlieGZz X3pvbmVfZnJlZSh4ZnNfYnVmX2l0ZW1fem9uZSwgYmlwKTsKKwkJZnJlZShicC0+ Yl9hZGRyKTsKKwkJcHRocmVhZF9tdXRleF9kZXN0cm95KCZicC0+Yl9sb2NrKTsK KwkJYnAtPmJfYWRkciA9IE5VTEw7CisJCWJwLT5iX2ZsYWdzID0gMDsKKwkJZnJl ZShicCk7CisJCWJwID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQKK2xpYnhmc19wdXRi dWZyKHhmc19idWZfdCAqYnApCit7CisJbGlieGZzX2JyZWxzZSgoc3RydWN0IGNh Y2hlX25vZGUgKilicCk7Cit9CisKKwogdm9pZAogbGlieGZzX2JjYWNoZV9wdXJn ZSh2b2lkKQogewpAQCAtNDcyLDYgKzU3NCwxMiBAQAogCWNhY2hlX2ZsdXNoKGxp Ynhmc19iY2FjaGUpOwogfQogCitpbnQKK2xpYnhmc19iY2FjaGVfb3ZlcmZsb3dl ZCh2b2lkKQoreworCXJldHVybiBjYWNoZV9vdmVyZmxvd2VkKGxpYnhmc19iY2Fj aGUpOworfQorCiBzdHJ1Y3QgY2FjaGVfb3BlcmF0aW9ucyBsaWJ4ZnNfYmNhY2hl X29wZXJhdGlvbnMgPSB7CiAJLyogLmhhc2ggKi8JbGlieGZzX2JoYXNoLAogCS8q IC5hbGxvYyAqLwlsaWJ4ZnNfYmFsbG9jLApAQCAtNjM3LDcgKzc0NSw3IEBACiB9 CiAKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVfbm9kZSAqCi1saWJ4ZnNfaWFsbG9jKHZv aWQpCitsaWJ4ZnNfaWFsbG9jKGNhY2hlX2tleV90IGtleSkKIHsKIAlyZXR1cm4g bGlieGZzX3pvbmVfemFsbG9jKHhmc19pbm9kZV96b25lKTsKIH0KSW5kZXg6IHJl cGFpci94ZnNwcm9ncy9yZXBhaXIvTWFrZWZpbGUKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL01ha2VmaWxlCTIwMDct MDQtMjcgMTM6MTM6MzUuMDAwMDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZzcHJv Z3MvcmVwYWlyL01ha2VmaWxlCTIwMDctMDYtMDQgMTc6Mzk6NTkuMTIxMDAwNTA2 ICsxMDAwCkBAIC04LDE1ICs4LDE2IEBACiBMVENPTU1BTkQgPSB4ZnNfcmVwYWly CiAKIEhGSUxFUyA9IGFnaGVhZGVyLmggYXR0cl9yZXBhaXIuaCBhdmwuaCBhdmw2 NC5oIGJtYXAuaCBkaW5vZGUuaCBkaXIuaCBcCi0JZGlyMi5oIGRpcl9zdGFjay5o IGVycl9wcm90b3MuaCBnbG9iYWxzLmggaW5jb3JlLmggcHJvdG9zLmggcnQuaCBc Ci0JcHJvZ3Jlc3MuaCBzY2FuLmggdmVyc2lvbnMuaCBwcmVmZXRjaC5oIHRocmVh ZHMuaCB0cmFja21lbS5oCisJZGlyMi5oIGVycl9wcm90b3MuaCBnbG9iYWxzLmgg aW5jb3JlLmggcHJvdG9zLmggcnQuaCBcCisJcHJvZ3Jlc3MuaCBzY2FuLmggdmVy c2lvbnMuaCBwcmVmZXRjaC5oIHJhZGl4LXRyZWUuaCB0aHJlYWRzLmggXAorCXRy YWNrbWVtLmgKIAogQ0ZJTEVTID0gYWdoZWFkZXIuYyBhdHRyX3JlcGFpci5jIGF2 bC5jIGF2bDY0LmMgYm1hcC5jIGRpbm9fY2h1bmtzLmMgXAotCWRpbm9kZS5jIGRp ci5jIGRpcjIuYyBkaXJfc3RhY2suYyBnbG9iYWxzLmMgaW5jb3JlLmMgXAorCWRp bm9kZS5jIGRpci5jIGRpcjIuYyBnbG9iYWxzLmMgaW5jb3JlLmMgXAogCWluY29y ZV9ibWMuYyBpbml0LmMgaW5jb3JlX2V4dC5jIGluY29yZV9pbm8uYyBwaGFzZTEu YyBcCi0JcGhhc2UyLmMgcGhhc2UzLmMgcGhhc2U0LmMgcGhhc2U1LmMgcGhhc2U2 LmMgcGhhc2U3LmMgcnQuYyBzYi5jIFwKLQlwcm9ncmVzcy5jIHByZWZldGNoLmMg c2Nhbi5jIHRocmVhZHMuYyB0cmFja21lbS5jIHZlcnNpb25zLmMgXAotCXhmc19y ZXBhaXIuYworCXBoYXNlMi5jIHBoYXNlMy5jIHBoYXNlNC5jIHBoYXNlNS5jIHBo YXNlNi5jIHBoYXNlNy5jIFwKKwlwcm9ncmVzcy5jIHByZWZldGNoLmMgcmFkaXgt dHJlZS5jIHJ0LmMgc2IuYyBzY2FuLmMgdGhyZWFkcy5jIFwKKwl0cmFja21lbS5j IHZlcnNpb25zLmMgeGZzX3JlcGFpci5jCiAKIExMRExJQlMgPSAkKExJQlhGUykg JChMSUJYTE9HKSAkKExJQlVVSUQpICQoTElCUFRIUkVBRCkgJChMSUJSVCkKIExU REVQRU5ERU5DSUVTID0gJChMSUJYRlMpICQoTElCWExPRykKQEAgLTQwLDYgKzQx LDggQEAKICMgLURYUl9CTERfSU5PX1RSQUNFCWJ1aWxkaW5nIG9uLWRpc2sgaW5v ZGUgYWxsb2NhdGlvbiBidHJlZXMKICMgLURYUl9CTERfQUREX0VYVEVOVAl0cmFj ayBwaGFzZSA1IGJsb2NrIGV4dGVudCBjcmVhdGlvbgogIyAtRFhSX0JDS1BUUl9E QkcJcGFyZW50IGxpc3QgZGVidWdnaW5nIGluZm8KKyMgLURYUl9QRl9UUkFDRQkJ cHJlZmV0Y2ggdHJhY2UKKyMgLURUUkFDRV9NRU1PUlkJdHJhY2sgbWVtb3J5IHVz YWdlCiAjCiAjQ0ZMQUdTICs9IC4uLgogCkluZGV4OiByZXBhaXIveGZzcHJvZ3Mv cmVwYWlyL2Rpbm9fY2h1bmtzLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVw YWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL2Rpbm9fY2h1bmtzLmMJMjAwNy0wNC0y NyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9y ZXBhaXIvZGlub19jaHVua3MuYwkyMDA3LTA1LTI5IDExOjE4OjI4LjU4NTA2OTY0 OSArMTAwMApAQCAtMjUsOSArMjUsOCBAQAogI2luY2x1ZGUgImVycl9wcm90b3Mu aCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJkaW5vZGUuaCIKLSNpbmNs dWRlICJwcmVmZXRjaC5oIgotI2luY2x1ZGUgInRocmVhZHMuaCIKICNpbmNsdWRl ICJ2ZXJzaW9ucy5oIgorI2luY2x1ZGUgInByZWZldGNoLmgiCiAjaW5jbHVkZSAi cHJvZ3Jlc3MuaCIKIAogLyoKQEAgLTE1MCwxOSArMTQ5LDE4IEBACiAJCWlmIChj aGVja19pbm9kZV9ibG9jayhtcCwgaW5vKSA9PSAwKQogCQkJcmV0dXJuKDApOwog Ci0JCVBSRVBBSVJfUldfV1JJVEVfTE9DSygmcGVyX2FnX2xvY2tbYWdub10pOwor CQlwdGhyZWFkX211dGV4X2xvY2soJmFnX2xvY2tzW2Fnbm9dKTsKKwogCQlzd2l0 Y2ggKHN0YXRlID0gZ2V0X2FnYm5vX3N0YXRlKG1wLCBhZ25vLCBhZ2JubykpICB7 CiAJCWNhc2UgWFJfRV9JTk86CiAJCQlkb193YXJuKAogCQlfKCJ1bmNlcnRhaW4g aW5vZGUgYmxvY2sgJWQvJWQgYWxyZWFkeSBrbm93blxuIiksCiAJCQkJYWdubywg YWdibm8pOwotCQkJUFJFUEFJUl9SV19VTkxPQ0soJnBlcl9hZ19sb2NrW2Fnbm9d KTsKIAkJCWJyZWFrOwogCQljYXNlIFhSX0VfVU5LTk9XTjoKIAkJY2FzZSBYUl9F X0ZSRUUxOgogCQljYXNlIFhSX0VfRlJFRToKIAkJCXNldF9hZ2Jub19zdGF0ZSht cCwgYWdubywgYWdibm8sIFhSX0VfSU5PKTsKLQkJCVBSRVBBSVJfUldfVU5MT0NL KCZwZXJfYWdfbG9ja1thZ25vXSk7CiAJCQlicmVhazsKIAkJY2FzZSBYUl9FX01V TFQ6CiAJCWNhc2UgWFJfRV9JTlVTRToKQEAgLTE3NSwxNyArMTczLDE4IEBACiAJ CV8oImlub2RlIGJsb2NrICVkLyVkIG11bHRpcGx5IGNsYWltZWQsIChzdGF0ZSAl ZClcbiIpLAogCQkJCWFnbm8sIGFnYm5vLCBzdGF0ZSk7CiAJCQlzZXRfYWdibm9f c3RhdGUobXAsIGFnbm8sIGFnYm5vLCBYUl9FX01VTFQpOwotCQkJUFJFUEFJUl9S V19VTkxPQ0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwkJCXB0aHJlYWRfbXV0ZXhf dW5sb2NrKCZhZ19sb2Nrc1thZ25vXSk7CiAJCQlyZXR1cm4oMCk7CiAJCWRlZmF1 bHQ6CiAJCQlkb193YXJuKAogCQlfKCJpbm9kZSBibG9jayAlZC8lZCBiYWQgc3Rh dGUsIChzdGF0ZSAlZClcbiIpLAogCQkJCWFnbm8sIGFnYm5vLCBzdGF0ZSk7CiAJ CQlzZXRfYWdibm9fc3RhdGUobXAsIGFnbm8sIGFnYm5vLCBYUl9FX0lOTyk7Ci0J CQlQUkVQQUlSX1JXX1VOTE9DSygmcGVyX2FnX2xvY2tbYWdub10pOwogCQkJYnJl YWs7CiAJCX0KIAorCQlwdGhyZWFkX211dGV4X3VubG9jaygmYWdfbG9ja3NbYWdu b10pOworCiAJCXN0YXJ0X2FnaW5vID0gWEZTX09GRkJOT19UT19BR0lOTyhtcCwg YWdibm8sIDApOwogCQkqc3RhcnRfaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwg YWdubywgc3RhcnRfYWdpbm8pOwogCkBAIC00MzIsNyArNDMxLDcgQEAKIAkgKiB1 c2VyIGRhdGEgLS0gd2UncmUgcHJvYmFibHkgaGVyZSBhcyBhIHJlc3VsdCBvZiBh IGRpcmVjdG9yeQogCSAqIGVudHJ5IG9yIGFuIGl1bmxpbmtlZCBwb2ludGVyCiAJ ICovCi0JUFJFUEFJUl9SV19XUklURV9MT0NLKCZwZXJfYWdfbG9ja1thZ25vXSk7 CisJcHRocmVhZF9tdXRleF9sb2NrKCZhZ19sb2Nrc1thZ25vXSk7CiAJZm9yIChq ID0gMCwgY3VyX2FnYm5vID0gY2h1bmtfc3RhcnRfYWdibm87CiAJCQljdXJfYWdi bm8gPCBjaHVua19zdG9wX2FnYm5vOyBjdXJfYWdibm8rKykgIHsKIAkJc3dpdGNo IChzdGF0ZSA9IGdldF9hZ2Jub19zdGF0ZShtcCwgYWdubywgY3VyX2FnYm5vKSkg IHsKQEAgLTQ1NiwxMSArNDU1LDExIEBACiAJCX0KIAogCQlpZiAoaikgewotCQkJ UFJFUEFJUl9SV19VTkxPQ0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwkJCXB0aHJl YWRfbXV0ZXhfdW5sb2NrKCZhZ19sb2Nrc1thZ25vXSk7CiAJCQlyZXR1cm4oMCk7 CiAJCX0KIAl9Ci0JUFJFUEFJUl9SV19VTkxPQ0soJnBlcl9hZ19sb2NrW2Fnbm9d KTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYWdfbG9ja3NbYWdub10pOwogCiAJ LyoKIAkgKiBvaywgY2h1bmsgaXMgZ29vZC4gIHB1dCB0aGUgcmVjb3JkIGludG8g dGhlIHRyZWUgaWYgcmVxdWlyZWQsCkBAIC00ODMsNyArNDgyLDggQEAKIAogCXNl dF9pbm9kZV91c2VkKGlyZWNfcCwgYWdpbm8gLSBzdGFydF9hZ2lubyk7CiAKLQlQ UkVQQUlSX1JXX1dSSVRFX0xPQ0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwlwdGhy ZWFkX211dGV4X2xvY2soJmFnX2xvY2tzW2Fnbm9dKTsKKwogCWZvciAoY3VyX2Fn Ym5vID0gY2h1bmtfc3RhcnRfYWdibm87CiAJCQljdXJfYWdibm8gPCBjaHVua19z dG9wX2FnYm5vOyBjdXJfYWdibm8rKykgIHsKIAkJc3dpdGNoIChzdGF0ZSA9IGdl dF9hZ2Jub19zdGF0ZShtcCwgYWdubywgY3VyX2FnYm5vKSkgIHsKQEAgLTUxMyw3 ICs1MTMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JUFJFUEFJUl9SV19VTkxP Q0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygm YWdfbG9ja3NbYWdub10pOwogCiAJcmV0dXJuKGlub19jbnQpOwogfQpAQCAtNTY2 LDIxICs1NjYsMjcgQEAKICAqCiAgKiAqYm9ndXMgaXMgc2V0IHRvIDEgaWYgdGhl IGVudGlyZSBzZXQgb2YgaW5vZGVzIGlzIGJhZC4KICAqLworCiAvKiBBUkdTVVNF RCAqLwotaW50Ci1wcm9jZXNzX2lub2RlX2NodW5rKHhmc19tb3VudF90ICptcCwg eGZzX2FnbnVtYmVyX3QgYWdubywgaW50IG51bV9pbm9zLAotCQkJaW5vX3RyZWVf bm9kZV90ICpmaXJzdF9pcmVjLCBpbnQgaW5vX2Rpc2NvdmVyeSwKLQkJCWludCBj aGVja19kdXBzLCBpbnQgZXh0cmFfYXR0cl9jaGVjaywgaW50ICpib2d1cykKK3N0 YXRpYyBpbnQKK3Byb2Nlc3NfaW5vZGVfY2h1bmsoCisJeGZzX21vdW50X3QgCQkq bXAsCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCisJaW50IAkJCW51bV9pbm9zLAor CWlub190cmVlX25vZGVfdCAJKmZpcnN0X2lyZWMsCisJaW50IAkJCWlub19kaXNj b3ZlcnksCisJaW50IAkJCWNoZWNrX2R1cHMsCisJaW50IAkJCWV4dHJhX2F0dHJf Y2hlY2ssCisJaW50IAkJCSpib2d1cykKIHsKIAl4ZnNfaW5vX3QJCXBhcmVudDsK IAlpbm9fdHJlZV9ub2RlX3QJCSppbm9fcmVjOwotCXhmc19idWZfdAkJKmJwOwor CXhmc19idWZfdAkJKipicGxpc3Q7CiAJeGZzX2Rpbm9kZV90CQkqZGlubzsKIAlp bnQJCQlpY250OwogCWludAkJCXN0YXR1czsKIAlpbnQJCQlpc191c2VkOwogCWlu dAkJCXN0YXRlOwotCWludAkJCWRvbmU7CiAJaW50CQkJaW5vX2RpcnR5OwogCWlu dAkJCWlyZWNfb2Zmc2V0OwogCWludAkJCWlidWZfb2Zmc2V0OwpAQCAtNTg5LDYg KzU5NSwxMCBAQAogCWludAkJCWRpcnR5ID0gMDsKIAlpbnQJCQljbGVhcmVkID0g MDsKIAlpbnQJCQlpc2FfZGlyID0gMDsKKwlpbnQJCQlibGtzX3Blcl9jbHVzdGVy OworCWludAkJCWNsdXN0ZXJfY291bnQ7CisJaW50CQkJYnBfaW5kZXg7CisJaW50 CQkJY2x1c3Rlcl9vZmZzZXQ7CiAKIAlBU1NFUlQoZmlyc3RfaXJlYyAhPSBOVUxM KTsKIAlBU1NFUlQoWEZTX0FHSU5PX1RPX09GRlNFVChtcCwgZmlyc3RfaXJlYy0+ aW5vX3N0YXJ0bnVtKSA9PSAwKTsKQEAgLTU5Niw0NCArNjA2LDc3IEBACiAJKmJv Z3VzID0gMDsKIAlBU1NFUlQoWEZTX0lBTExPQ19CTE9DS1MobXApID4gMCk7CiAK KwlibGtzX3Blcl9jbHVzdGVyID0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkg Pj4gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJaWYgKGJsa3NfcGVyX2NsdXN0ZXIg PT0gMCkKKwkJYmxrc19wZXJfY2x1c3RlciA9IDE7CisJY2x1c3Rlcl9jb3VudCA9 IFhGU19JTk9ERVNfUEVSX0NIVU5LIC8gaW5vZGVzX3Blcl9jbHVzdGVyOworCUFT U0VSVChjbHVzdGVyX2NvdW50ID4gMCk7CisKIAkvKgogCSAqIGdldCBhbGwgYmxv Y2tzIHJlcXVpcmVkIHRvIHJlYWQgaW4gdGhpcyBjaHVuayAobWF5IHdpbmQgdXAK IAkgKiBoYXZpbmcgdG8gcHJvY2VzcyBtb3JlIGNodW5rcyBpbiBhIG11bHRpLWNo dW5rIHBlciBibG9jayBmcykKIAkgKi8KIAlhZ2JubyA9IFhGU19BR0lOT19UT19B R0JOTyhtcCwgZmlyc3RfaXJlYy0+aW5vX3N0YXJ0bnVtKTsKIAotCWJwID0gbGli eGZzX3JlYWRidWYobXAtPm1fZGV2LCBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25v LCBhZ2JubyksCi0JCQlYRlNfRlNCX1RPX0JCKG1wLCBYRlNfSUFMTE9DX0JMT0NL UyhtcCkpLCAwKTsKLQlpZiAoIWJwKSB7Ci0JCWRvX3dhcm4oXygiY2Fubm90IHJl YWQgaW5vZGUgJWxsdSwgZGlzayBibG9jayAlbGxkLCBjbnQgJWRcbiIpLAotCQkJ WEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgZmlyc3RfaXJlYy0+aW5vX3N0YXJ0 bnVtKSwKLQkJCVhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKSwKLQkJ CShpbnQpWEZTX0ZTQl9UT19CQihtcCwgWEZTX0lBTExPQ19CTE9DS1MobXApKSk7 Ci0JCXJldHVybigxKTsKLQl9Ci0KIAkvKgogCSAqIHNldCB1cCBmaXJzdCBpcmVj CiAJICovCiAJaW5vX3JlYyA9IGZpcnN0X2lyZWM7CisKKwlicGxpc3QgPSBtYWxs b2MoY2x1c3Rlcl9jb3VudCAqIHNpemVvZih4ZnNfYnVmX3QgKikpOworCWlmIChi cGxpc3QgPT0gTlVMTCkKKwkJZG9fZXJyb3IoXygiZmFpbGVkIHRvIGFsbG9jYXRl ICVkIGJ5dGVzIG9mIG1lbW9yeVxuIiksCisJCQljbHVzdGVyX2NvdW50ICogc2l6 ZW9mKHhmc19idWZfdCopKTsKKworCWZvciAoYnBfaW5kZXggPSAwOyBicF9pbmRl eCA8IGNsdXN0ZXJfY291bnQ7IGJwX2luZGV4KyspIHsKKyNpZmRlZiBYUl9QRl9U UkFDRQorCQlwZnRyYWNlKCJhYm91dCB0byByZWFkIG9mZiAlbGx1IGluIEFHICVk IiwKKwkJCShsb25nIGxvbmcpWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdi bm8pLCBhZ25vKTsKKyNlbmRpZgorCQlicGxpc3RbYnBfaW5kZXhdID0gbGlieGZz X3JlYWRidWYobXAtPm1fZGV2LAorCQkJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBh Z25vLCBhZ2JubyksCisJCQkJCVhGU19GU0JfVE9fQkIobXAsIGJsa3NfcGVyX2Ns dXN0ZXIpLCAwKTsKKwkJaWYgKCFicGxpc3RbYnBfaW5kZXhdKSB7CisJCQlkb193 YXJuKF8oImNhbm5vdCByZWFkIGlub2RlICVsbHUsIGRpc2sgYmxvY2sgJWxsZCwg Y250ICVkXG4iKSwKKwkJCQlYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBmaXJz dF9pcmVjLT5pbm9fc3RhcnRudW0pLAorCQkJCVhGU19BR0JfVE9fREFERFIobXAs IGFnbm8sIGFnYm5vKSwKKwkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIGJsa3Nf cGVyX2NsdXN0ZXIpKTsKKwkJCXdoaWxlIChicF9pbmRleCA+IDApIHsKKwkJCQli cF9pbmRleC0tOworCQkJCWxpYnhmc19wdXRidWYoYnBsaXN0W2JwX2luZGV4XSk7 CisJCQl9CisJCQlmcmVlKGJwbGlzdCk7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJ YWdibm8gKz0gYmxrc19wZXJfY2x1c3RlcjsKKworI2lmZGVmIFhSX1BGX1RSQUNF CisJCXBmdHJhY2UoInJlYWRidWYgJXAgKCVsbHUsICVkKSBpbiBBRyAlZCIsIGJw bGlzdFticF9pbmRleF0sCisJCQkobG9uZyBsb25nKVhGU19CVUZfQUREUihicGxp c3RbYnBfaW5kZXhdKSwKKwkJCVhGU19CVUZfQ09VTlQoYnBsaXN0W2JwX2luZGV4 XSksIGFnbm8pOworI2VuZGlmCisJfQorCWFnYm5vID0gWEZTX0FHSU5PX1RPX0FH Qk5PKG1wLCBmaXJzdF9pcmVjLT5pbm9fc3RhcnRudW0pOworCiAJLyoKIAkgKiBp bml0aWFsaXplIGNvdW50ZXJzCiAJICovCiAJaXJlY19vZmZzZXQgPSAwOwogCWli dWZfb2Zmc2V0ID0gMDsKKwljbHVzdGVyX29mZnNldCA9IDA7CiAJaWNudCA9IDA7 CiAJc3RhdHVzID0gMDsKLQlkb25lID0gMDsKKwlicF9pbmRleCA9IDA7CiAKIAkv KgogCSAqIHZlcmlmeSBpbm9kZSBjaHVuayBpZiBuZWNlc3NhcnkKIAkgKi8KIAlp ZiAoaW5vX2Rpc2NvdmVyeSkgIHsKLQkJd2hpbGUgKCFkb25lKSAgeworCQlmb3Ig KDs7KSAgewogCQkJLyoKIAkJCSAqIG1ha2UgaW5vZGUgcG9pbnRlcgogCQkJICov Ci0JCQlkaW5vID0gWEZTX01BS0VfSVBUUihtcCwgYnAsIGljbnQpOworCQkJZGlu byA9IFhGU19NQUtFX0lQVFIobXAsIGJwbGlzdFticF9pbmRleF0sIGNsdXN0ZXJf b2Zmc2V0KTsKIAkJCWFnaW5vID0gaXJlY19vZmZzZXQgKyBpbm9fcmVjLT5pbm9f c3RhcnRudW07CiAKIAkJCS8qCkBAIC02NTEsNiArNjk0LDcgQEAKIAogCQkJaXJl Y19vZmZzZXQrKzsKIAkJCWljbnQrKzsKKwkJCWNsdXN0ZXJfb2Zmc2V0Kys7CiAK IAkJCWlmIChpY250ID09IFhGU19JQUxMT0NfSU5PREVTKG1wKSAmJgogCQkJCQlp cmVjX29mZnNldCA9PSBYRlNfSU5PREVTX1BFUl9DSFVOSykgIHsKQEAgLTY1OCw4 ICs3MDIsNiBAQAogCQkJCSAqIGRvbmUhIC0gZmluaXNoZWQgdXAgaXJlYyBhbmQg YmxvY2sKIAkJCQkgKiBzaW11bHRhbmVvdXNseQogCQkJCSAqLwotCQkJCWxpYnhm c19wdXRidWYoYnApOwotCQkJCWRvbmUgPSAxOwogCQkJCWJyZWFrOwogCQkJfSBl bHNlIGlmIChpcmVjX29mZnNldCA9PSBYRlNfSU5PREVTX1BFUl9DSFVOSykgIHsK IAkJCQkvKgpAQCAtNjY5LDYgKzcxMSwxMCBAQAogCQkJCUFTU0VSVChpbm9fcmVj LT5pbm9fc3RhcnRudW0gPT0gYWdpbm8gKyAxKTsKIAkJCQlpcmVjX29mZnNldCA9 IDA7CiAJCQl9CisJCQlpZiAoY2x1c3Rlcl9vZmZzZXQgPT0gaW5vZGVzX3Blcl9j bHVzdGVyKSB7CisJCQkJYnBfaW5kZXgrKzsKKwkJCQljbHVzdGVyX29mZnNldCA9 IDA7CisJCQl9CiAJCX0KIAogCQkvKgpAQCAtNjc3LDggKzcyMyw5IEBACiAJCSAq LwogCQlpZiAoIXN0YXR1cykgIHsKIAkJCSpib2d1cyA9IDE7Ci0JCQlpZiAoIWRv bmUpIC8qIGFscmVhZHkgZnJlZSdkICovCi0JCQkgIGxpYnhmc19wdXRidWYoYnAp OworCQkJZm9yIChicF9pbmRleCA9IDA7IGJwX2luZGV4IDwgY2x1c3Rlcl9jb3Vu dDsgYnBfaW5kZXgrKykKKwkJCQlsaWJ4ZnNfcHV0YnVmKGJwbGlzdFticF9pbmRl eF0pOworCQkJZnJlZShicGxpc3QpOwogCQkJcmV0dXJuKDApOwogCQl9CiAKQEAg LTY4OCw1NiArNzM1LDQwIEBACiAJCWlub19yZWMgPSBmaXJzdF9pcmVjOwogCiAJ CWlyZWNfb2Zmc2V0ID0gMDsKLQkJaWJ1Zl9vZmZzZXQgPSAwOworCQljbHVzdGVy X29mZnNldCA9IDA7CisJCWJwX2luZGV4ID0gMDsKIAkJaWNudCA9IDA7CiAJCXN0 YXR1cyA9IDA7Ci0JCWRvbmUgPSAwOwotCi0JCS8qIG5hdGhhbnMgVE9ETyAuLi4g bWVtb3J5IGxlYWsgaGVyZT86ICovCi0KLQkJLyoKLQkJICogZ2V0IGZpcnN0IGJs b2NrCi0JCSAqLwotCQlicCA9IGxpYnhmc19yZWFkYnVmKG1wLT5tX2RldiwKLQkJ CQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBhZ2JubyksCi0JCQkJWEZTX0ZT Ql9UT19CQihtcCwgWEZTX0lBTExPQ19CTE9DS1MobXApKSwgMCk7Ci0JCWlmICgh YnApIHsKLQkJCWRvX3dhcm4oXygiY2FuJ3QgcmVhZCBpbm9kZSAlbGx1LCBkaXNr IGJsb2NrICVsbGQsICIKLQkJCQkiY250ICVkXG4iKSwgWEZTX0FHSU5PX1RPX0lO TyhtcCwgYWdubywgYWdpbm8pLAotCQkJCVhGU19BR0JfVE9fREFERFIobXAsIGFn bm8sIGFnYm5vKSwKLQkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIFhGU19JQUxM T0NfQkxPQ0tTKG1wKSkpOwotCQkJcmV0dXJuKDEpOwotCQl9CiAJfQogCiAJLyoK IAkgKiBtYXJrIGJsb2NrIGFzIGFuIGlub2RlIGJsb2NrIGluIHRoZSBpbmNvcmUg Yml0bWFwCiAJICovCi0JUFJFUEFJUl9SV19XUklURV9MT0NLKCZwZXJfYWdfbG9j a1thZ25vXSk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZhZ19sb2Nrc1thZ25vXSk7 CiAJc3dpdGNoIChzdGF0ZSA9IGdldF9hZ2Jub19zdGF0ZShtcCwgYWdubywgYWdi bm8pKSAgewotCWNhc2UgWFJfRV9JTk86CS8qIGFscmVhZHkgbWFya2VkICovCi0J CWJyZWFrOwotCWNhc2UgWFJfRV9VTktOT1dOOgotCWNhc2UgWFJfRV9GUkVFOgot CWNhc2UgWFJfRV9GUkVFMToKLQkJc2V0X2FnYm5vX3N0YXRlKG1wLCBhZ25vLCBh Z2JubywgWFJfRV9JTk8pOwotCQlicmVhazsKLQljYXNlIFhSX0VfQkFEX1NUQVRF OgotCQlkb19lcnJvcihfKCJiYWQgc3RhdGUgaW4gYmxvY2sgbWFwICVkXG4iKSwg c3RhdGUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXRfYWdibm9fc3RhdGUo bXAsIGFnbm8sIGFnYm5vLCBYUl9FX01VTFQpOwotCQlkb193YXJuKF8oImlub2Rl IGJsb2NrICVsbHUgbXVsdGlwbHkgY2xhaW1lZCwgc3RhdGUgd2FzICVkXG4iKSwK LQkJCVhGU19BR0JfVE9fRlNCKG1wLCBhZ25vLCBhZ2JubyksIHN0YXRlKTsKLQkJ YnJlYWs7CisJCWNhc2UgWFJfRV9JTk86CS8qIGFscmVhZHkgbWFya2VkICovCisJ CQlicmVhazsKKwkJY2FzZSBYUl9FX1VOS05PV046CisJCWNhc2UgWFJfRV9GUkVF OgorCQljYXNlIFhSX0VfRlJFRTE6CisJCQlzZXRfYWdibm9fc3RhdGUobXAsIGFn bm8sIGFnYm5vLCBYUl9FX0lOTyk7CisJCQlicmVhazsKKwkJY2FzZSBYUl9FX0JB RF9TVEFURToKKwkJCWRvX2Vycm9yKF8oImJhZCBzdGF0ZSBpbiBibG9jayBtYXAg JWRcbiIpLCBzdGF0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNldF9h Z2Jub19zdGF0ZShtcCwgYWdubywgYWdibm8sIFhSX0VfTVVMVCk7CisJCQlkb193 YXJuKF8oImlub2RlIGJsb2NrICVsbHUgbXVsdGlwbHkgY2xhaW1lZCwgc3RhdGUg d2FzICVkXG4iKSwKKwkJCQlYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgYWdibm8p LCBzdGF0ZSk7CisJCQlicmVhazsKIAl9Ci0JUFJFUEFJUl9SV19VTkxPQ0soJnBl cl9hZ19sb2NrW2Fnbm9dKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYWdfbG9j a3NbYWdub10pOwogCi0Jd2hpbGUgKCFkb25lKSAgeworCWZvciAoOzspIHsKIAkJ LyoKIAkJICogbWFrZSBpbm9kZSBwb2ludGVyCiAJCSAqLwotCQlkaW5vID0gWEZT X01BS0VfSVBUUihtcCwgYnAsIGljbnQpOworCQlkaW5vID0gWEZTX01BS0VfSVBU UihtcCwgYnBsaXN0W2JwX2luZGV4XSwgY2x1c3Rlcl9vZmZzZXQpOwogCQlhZ2lu byA9IGlyZWNfb2Zmc2V0ICsgaW5vX3JlYy0+aW5vX3N0YXJ0bnVtOwogCiAJCWlz X3VzZWQgPSAzOwpAQCAtODY4LDE4ICs4OTksMjQgQEAKIAkJaXJlY19vZmZzZXQr KzsKIAkJaWJ1Zl9vZmZzZXQrKzsKIAkJaWNudCsrOworCQljbHVzdGVyX29mZnNl dCsrOwogCiAJCWlmIChpY250ID09IFhGU19JQUxMT0NfSU5PREVTKG1wKSAmJgog CQkJCWlyZWNfb2Zmc2V0ID09IFhGU19JTk9ERVNfUEVSX0NIVU5LKSAgewogCQkJ LyoKIAkJCSAqIGRvbmUhIC0gZmluaXNoZWQgdXAgaXJlYyBhbmQgYmxvY2sgc2lt dWx0YW5lb3VzbHkKIAkJCSAqLwotCQkJaWYgKGRpcnR5ICYmICFub19tb2RpZnkp Ci0JCQkJbGlieGZzX3dyaXRlYnVmKGJwLCAwKTsKLQkJCWVsc2UKLQkJCQlsaWJ4 ZnNfcHV0YnVmKGJwKTsKLQotCQkJZG9uZSA9IDE7CisJCQlmb3IgKGJwX2luZGV4 ID0gMDsgYnBfaW5kZXggPCBjbHVzdGVyX2NvdW50OyBicF9pbmRleCsrKSB7Cisj aWZkZWYgWFJfUEZfVFJBQ0UKKwkJCQlwZnRyYWNlKCJwdXQvd3JpdGVidWYgJXAg KCVsbHUpIGluIEFHICVkIiwgYnBsaXN0W2JwX2luZGV4XSwKKwkJCQkJKGxvbmcg bG9uZylYRlNfQlVGX0FERFIoYnBsaXN0W2JwX2luZGV4XSksIGFnbm8pOworI2Vu ZGlmCisJCQkJaWYgKGRpcnR5ICYmICFub19tb2RpZnkpCisJCQkJCWxpYnhmc193 cml0ZWJ1ZihicGxpc3RbYnBfaW5kZXhdLCAwKTsKKwkJCQllbHNlCisJCQkJCWxp Ynhmc19wdXRidWYoYnBsaXN0W2JwX2luZGV4XSk7CisJCQl9CisJCQlmcmVlKGJw bGlzdCk7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChpYnVmX29mZnNldCA9PSBt cC0+bV9zYi5zYl9pbm9wYmxvY2spICB7CiAJCQkvKgpAQCAtODg5LDcgKzkyNiw3 IEBACiAJCQlpYnVmX29mZnNldCA9IDA7CiAJCQlhZ2JubysrOwogCi0JCQlQUkVQ QUlSX1JXX1dSSVRFX0xPQ0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwkJCXB0aHJl YWRfbXV0ZXhfbG9jaygmYWdfbG9ja3NbYWdub10pOwogCQkJc3dpdGNoIChzdGF0 ZSA9IGdldF9hZ2Jub19zdGF0ZShtcCwgYWdubywgYWdibm8pKSAgewogCQkJY2Fz ZSBYUl9FX0lOTzoJLyogYWxyZWFkeSBtYXJrZWQgKi8KIAkJCQlicmVhazsKQEAg LTkwOSw3ICs5NDYsNyBAQAogCQkJCQlYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywg YWdibm8pLCBzdGF0ZSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlQUkVQQUlSX1JX X1VOTE9DSygmcGVyX2FnX2xvY2tbYWdub10pOworCQkJcHRocmVhZF9tdXRleF91 bmxvY2soJmFnX2xvY2tzW2Fnbm9dKTsKIAogCQl9IGVsc2UgaWYgKGlyZWNfb2Zm c2V0ID09IFhGU19JTk9ERVNfUEVSX0NIVU5LKSAgewogCQkJLyoKQEAgLTkxOSw2 ICs5NTYsMTAgQEAKIAkJCUFTU0VSVChpbm9fcmVjLT5pbm9fc3RhcnRudW0gPT0g YWdpbm8gKyAxKTsKIAkJCWlyZWNfb2Zmc2V0ID0gMDsKIAkJfQorCQlpZiAoY2x1 c3Rlcl9vZmZzZXQgPT0gaW5vZGVzX3Blcl9jbHVzdGVyKSB7CisJCQlicF9pbmRl eCsrOworCQkJY2x1c3Rlcl9vZmZzZXQgPSAwOworCQl9CiAJfQogCXJldHVybigw KTsKIH0KQEAgLTkzNiwxNiArOTc3LDIxIEBACiAgKiBwaGFzZSA0IGFmdGVyIHdl J3ZlIHJ1biB0aHJvdWdoIGFuZCBzZXQgdGhlIGJpdG1hcCBvbmNlLgogICovCiB2 b2lkCi1wcm9jZXNzX2FnaW5vZGVzKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVt YmVyX3QgYWdubywKLQkJaW50IGlub19kaXNjb3ZlcnksIGludCBjaGVja19kdXBz LCBpbnQgZXh0cmFfYXR0cl9jaGVjaykKK3Byb2Nlc3NfYWdpbm9kZXMoCisJeGZz X21vdW50X3QJCSptcCwKKwlwcmVmZXRjaF9hcmdzX3QJCSpwZl9hcmdzLAorCXhm c19hZ251bWJlcl90CQlhZ25vLAorCWludCAJCQlpbm9fZGlzY292ZXJ5LAorCWlu dCAJCQljaGVja19kdXBzLAorCWludCAJCQlleHRyYV9hdHRyX2NoZWNrKQogewot CWludCBudW1faW5vcywgYm9ndXM7Ci0JaW5vX3RyZWVfbm9kZV90ICppbm9fcmVj LCAqZmlyc3RfaW5vX3JlYywgKnByZXZfaW5vX3JlYzsKLQlpbm9fdHJlZV9ub2Rl X3QgKmlub19yYTsKLQotCWlub19yYSA9IGRvX3ByZWZldGNoID8gcHJlZmV0Y2hf aW5vZGVfY2h1bmtzKG1wLCBhZ25vLCBOVUxMKSA6IE5VTEw7Ci0KKwlpbnQgCQkJ bnVtX2lub3MsIGJvZ3VzOworCWlub190cmVlX25vZGVfdCAJKmlub19yZWMsICpm aXJzdF9pbm9fcmVjLCAqcHJldl9pbm9fcmVjOworI2lmZGVmIFhSX1BGX1RSQUNF CisJaW50CQkJY291bnQ7CisjZW5kaWYKIAlmaXJzdF9pbm9fcmVjID0gaW5vX3Jl YyA9IGZpbmRmaXJzdF9pbm9kZV9yZWMoYWdubyk7CisKIAl3aGlsZSAoaW5vX3Jl YyAhPSBOVUxMKSAgewogCQkvKgogCQkgKiBwYXJhbm9pYSAtIHN0ZXAgdGhyb3Vn aCBpbm9kZSByZWNvcmRzIHVudGlsIHdlIHN0ZXAKQEAgLTk1Nyw3ICsxMDAzLDYg QEAKIAkJICovCiAJCW51bV9pbm9zID0gWEZTX0lOT0RFU19QRVJfQ0hVTks7CiAJ CXdoaWxlIChudW1faW5vcyA8IFhGU19JQUxMT0NfSU5PREVTKG1wKSAmJiBpbm9f cmVjICE9IE5VTEwpICB7Ci0JCQlBU1NFUlQoaW5vX3JlYyAhPSBOVUxMKTsKIAkJ CS8qCiAJCQkgKiBpbm9kZXMgY2h1bmtzIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQg YW5kIHNpemVkCiAJCQkgKiBjb3JyZWN0bHkKQEAgLTk2OCwxMSArMTAxMywxOCBA QAogCiAJCUFTU0VSVChudW1faW5vcyA9PSBYRlNfSUFMTE9DX0lOT0RFUyhtcCkp OwogCi0JCWlmIChkb19wcmVmZXRjaCAmJiBpbm9fcmEgJiYgKGZpcnN0X2lub19y ZWMtPmlub19zdGFydG51bSA+PSBpbm9fcmEtPmlub19zdGFydG51bSkpCi0JCQlp bm9fcmEgPSBwcmVmZXRjaF9pbm9kZV9jaHVua3MobXAsIGFnbm8sIGlub19yYSk7 CisJCWlmIChwZl9hcmdzKSB7CisJCQlzZW1fcG9zdCgmcGZfYXJncy0+cmFfY291 bnQpOworI2lmZGVmIFhSX1BGX1RSQUNFCisJCQlzZW1fZ2V0dmFsdWUoJnBmX2Fy Z3MtPnJhX2NvdW50LCAmY291bnQpOworCQkJcGZ0cmFjZSgicHJvY2Vzc2luZyBp bm9kZSBjaHVuayAlcCBpbiBBRyAlZCAoc2VtIGNvdW50ID0gJWQpIiwKKwkJCQlm aXJzdF9pbm9fcmVjLCBhZ25vLCBjb3VudCk7CisjZW5kaWYKKwkJfQogCiAJCWlm IChwcm9jZXNzX2lub2RlX2NodW5rKG1wLCBhZ25vLCBudW1faW5vcywgZmlyc3Rf aW5vX3JlYywKLQkJCQlpbm9fZGlzY292ZXJ5LCBjaGVja19kdXBzLCBleHRyYV9h dHRyX2NoZWNrLCAmYm9ndXMpKSAgeworCQkJCWlub19kaXNjb3ZlcnksIGNoZWNr X2R1cHMsIGV4dHJhX2F0dHJfY2hlY2ssCisJCQkJJmJvZ3VzKSkgIHsKIAkJCS8q IFhYWCAtIGkvbyBlcnJvciwgd2UndmUgZ290IGEgcHJvYmxlbSAqLwogCQkJYWJv cnQoKTsKIAkJfQpJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9kaXIuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9yZXBh aXIvZGlyLmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEwMDAKKysr IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGlyLmMJMjAwNy0wNC0yNyAxNDoxMjoz NC4xMzk1NzAyODkgKzEwMDAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJk aW5vZGUuaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJibWFwLmgiCi0j aW5jbHVkZSAicHJlZmV0Y2guaCIKIAogI2lmIFhGU19ESVJfTEVBRl9NQVBTSVpF ID49IFhGU19BVFRSX0xFQUZfTUFQU0laRQogI2RlZmluZSBYUl9EQV9MRUFGX01B UFNJWkUJWEZTX0RJUl9MRUFGX01BUFNJWkUKQEAgLTc4MSw5ICs3ODAsNiBAQAog CW5vZGUgPSBOVUxMOwogCWRhX2N1cnNvci0+YWN0aXZlID0gMDsKIAotCWlmIChk b19wcmVmZXRjaCAmJiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspKQotCQlw cmVmZXRjaF9kaXIxKG1wLCBibm8sIGRhX2N1cnNvcik7Ci0KIAlkbyB7CiAJCS8q CiAJCSAqIHJlYWQgaW4gZWFjaCBibG9jayBhbG9uZyB0aGUgd2F5IGFuZCBzZXQg dXAgY3Vyc29yCkluZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL2RpcjIuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9yZXBh aXIvZGlyMi5jCTIwMDctMDQtMjcgMTQ6MTE6NDEuMDAwMDAwMDAwICsxMDAwCisr KyByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL2RpcjIuYwkyMDA3LTA1LTI5IDExOjIy OjEyLjY4NDE2MDE1MSArMTAwMApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUg ImRpcjIuaCIKICNpbmNsdWRlICJibWFwLmgiCiAjaW5jbHVkZSAicHJlZmV0Y2gu aCIKKyNpbmNsdWRlICJwcm9ncmVzcy5oIgogCiAvKgogICogVGFnIGJhZCBkaXJl Y3RvcnkgZW50cmllcyB3aXRoIHRoaXMuCkBAIC04NywxMCArODgsMTkgQEAKIAl4 ZnNfYnVmX3QJKmJwYXJyYXlbNF07CiAJeGZzX2J1Zl90CSoqYnBsaXN0OwogCXhm c19kYWJ1Zl90CSpkYWJ1ZjsKLQlpbnQJCWk7CisJaW50CQlpLCBqOwogCWludAkJ b2ZmOworCWludAkJbmJsb2NrczsKKworCS8qCisJICogZHVlIHRvIGxpbWl0YXRp b25zIGluIGxpYnhmc19jYWNoZSwgd2UgbmVlZCB0byByZWFkIHRoZQorCSAqIGJs b2NrcyBpbiBmc2Jsb2NrIHNpemUgY2h1bmtzCisJICovCisKKwlmb3IgKGkgPSAw LCBuYmxvY2tzID0gMDsgaSA8IG5leDsgaSsrKQorCQluYmxvY2tzICs9IGJtcFtp XS5ibG9ja2NvdW50OwogCi0JaWYgKG5leCA+IChzaXplb2YoYnBhcnJheSkvc2l6 ZW9mKHhmc19idWZfdCAqKSkpIHsKKwlpZiAobmJsb2NrcyA+IChzaXplb2YoYnBh cnJheSkvc2l6ZW9mKHhmc19idWZfdCAqKSkpIHsKIAkJYnBsaXN0ID0gY2FsbG9j KG5leCwgc2l6ZW9mKCpicGxpc3QpKTsKIAkJaWYgKGJwbGlzdCA9PSBOVUxMKSB7 CiAJCQlkb19lcnJvcihfKCJjb3VsZG4ndCBtYWxsb2MgZGlyMiBidWZmZXIgbGlz dFxuIikpOwpAQCAtMTAxLDIxICsxMTEsMzkgQEAKIAkJLyogY29tbW9uIGNhc2Ug YXZvaWRzIGNhbGxvYy9mcmVlICovCiAJCWJwbGlzdCA9IGJwYXJyYXk7CiAJfQot CWZvciAoaSA9IDA7IGkgPCBuZXg7IGkrKykgewotCQlicGxpc3RbaV0gPSBsaWJ4 ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsCi0JCQkJWEZTX0ZTQl9UT19EQUREUihtcCwg Ym1wW2ldLnN0YXJ0YmxvY2spLAotCQkJCVhGU19GU0JfVE9fQkIobXAsIGJtcFtp XS5ibG9ja2NvdW50KSwgMCk7Ci0JCWlmICghYnBsaXN0W2ldKQotCQkJZ290byBm YWlsZWQ7CisJZm9yIChpID0gMCwgaiA9IDA7IGogPCBuZXg7IGorKykgeworCQl4 ZnNfZGZzYm5vX3QJYm5vOworCQlpbnQJCWM7CisKKwkJYm5vID0gYm1wW2pdLnN0 YXJ0YmxvY2s7CisJCWZvciAoYyA9IDA7IGMgPCBibXBbal0uYmxvY2tjb3VudDsg YysrLCBibm8rKykgeworI2lmZGVmIFhSX1BGX1RSQUNFCisJCQlwZnRyYWNlKCJh Ym91dCB0byByZWFkIG9mZiAlbGx1IiwKKwkJCQkobG9uZyBsb25nKVhGU19GU0Jf VE9fREFERFIobXAsIGJubykpOworI2VuZGlmCisJCQlicGxpc3RbaV0gPSBsaWJ4 ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsCisJCQkJCVhGU19GU0JfVE9fREFERFIobXAs IGJubyksCisJCQkJCVhGU19GU0JfVE9fQkIobXAsIDEpLCAwKTsKKwkJCWlmICgh YnBsaXN0W2ldKQorCQkJCWdvdG8gZmFpbGVkOworI2lmZGVmIFhSX1BGX1RSQUNF CisJCQlwZnRyYWNlKCJyZWFkYnVmICVwICglbGx1LCAlZCkiLCBicGxpc3RbaV0s CisJCQkJKGxvbmcgbG9uZylYRlNfQlVGX0FERFIoYnBsaXN0W2ldKSwKKwkJCQlY RlNfQlVGX0NPVU5UKGJwbGlzdFtpXSkpOworI2VuZGlmCisJCQlpKys7CisJCX0K IAl9Ci0JZGFidWYgPSBtYWxsb2MoWEZTX0RBX0JVRl9TSVpFKG5leCkpOworCUFT U0VSVChpID09IG5ibG9ja3MpOworCisJZGFidWYgPSBtYWxsb2MoWEZTX0RBX0JV Rl9TSVpFKG5ibG9ja3MpKTsKIAlpZiAoZGFidWYgPT0gTlVMTCkgewogCQlkb19l cnJvcihfKCJjb3VsZG4ndCBtYWxsb2MgZGlyMiBidWZmZXIgaGVhZGVyXG4iKSk7 CiAJCWV4aXQoMSk7CiAJfQogCWRhYnVmLT5kaXJ0eSA9IDA7CiAJZGFidWYtPm5i dWYgPSBuZXg7Ci0JaWYgKG5leCA9PSAxKSB7CisJaWYgKG5ibG9ja3MgPT0gMSkg ewogCQlicCA9IGJwbGlzdFswXTsKIAkJZGFidWYtPmJiY291bnQgPSAoc2hvcnQp QlRPQkIoWEZTX0JVRl9DT1VOVChicCkpOwogCQlkYWJ1Zi0+ZGF0YSA9IFhGU19C VUZfUFRSKGJwKTsKQEAgLTEzMCw3ICsxNTgsNyBAQAogCQkJZG9fZXJyb3IoXygi Y291bGRuJ3QgbWFsbG9jIGRpcjIgYnVmZmVyIGRhdGFcbiIpKTsKIAkJCWV4aXQo MSk7CiAJCX0KLQkJZm9yIChpID0gb2ZmID0gMDsgaSA8IG5leDsgaSsrLCBvZmYg Kz0gWEZTX0JVRl9DT1VOVChicCkpIHsKKwkJZm9yIChpID0gb2ZmID0gMDsgaSA8 IG5ibG9ja3M7IGkrKywgb2ZmICs9IFhGU19CVUZfQ09VTlQoYnApKSB7CiAJCQli cCA9IGJwbGlzdFtpXTsKIAkJCWJjb3B5KFhGU19CVUZfUFRSKGJwKSwgKGNoYXIg KilkYWJ1Zi0+ZGF0YSArIG9mZiwKIAkJCQlYRlNfQlVGX0NPVU5UKGJwKSk7CkBA IC0xNDAsNyArMTY4LDcgQEAKIAkJZnJlZShicGxpc3QpOwogCXJldHVybiBkYWJ1 ZjsKIGZhaWxlZDoKLQlmb3IgKGkgPSAwOyBpIDwgbmV4OyBpKyspCisJZm9yIChp ID0gMDsgaSA8IG5ibG9ja3M7IGkrKykKIAkJbGlieGZzX3B1dGJ1ZihicGxpc3Rb aV0pOwogCWlmIChicGxpc3QgIT0gYnBhcnJheSkKIAkJZnJlZShicGxpc3QpOwpA QCAtMjM2LDggKzI2NCwxMiBAQAogCQliY29weShkYWJ1Zi0+YnBzLCBicGxpc3Qs IG5idWYgKiBzaXplb2YoKmJwbGlzdCkpOwogCX0KIAlkYV9idWZfZG9uZShkYWJ1 Zik7Ci0JZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykKKwlmb3IgKGkgPSAwOyBp IDwgbmJ1ZjsgaSsrKSB7CisjaWZkZWYgWFJfUEZfVFJBQ0UKKwkJcGZ0cmFjZSgi cHV0YnVmICVwICglbGx1KSIsIGJwbGlzdFtpXSwgKGxvbmcgbG9uZylYRlNfQlVG X0FERFIoYnBsaXN0W2ldKSk7CisjZW5kaWYKIAkJbGlieGZzX3B1dGJ1ZihicGxp c3RbaV0pOworCX0KIAlpZiAoYnBsaXN0ICE9ICZicCkKIAkJZnJlZShicGxpc3Qp OwogfQpAQCAtODUzLDcgKzg4NSw3IEBACiAKIAlzZnAgPSAmZGlwLT5kaV91LmRp X2RpcjJzZjsKIAltYXhfc2l6ZSA9IFhGU19ERk9SS19EU0laRShkaXAsIG1wKTsK LQludW1fZW50cmllcyA9IElOVF9HRVQoc2ZwLT5oZHIuY291bnQsIEFSQ0hfQ09O VkVSVCk7CisJbnVtX2VudHJpZXMgPSBzZnAtPmhkci5jb3VudDsKIAlpbm9fZGly X3NpemUgPSBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9zaXplLCBBUkNIX0NPTlZF UlQpOwogCW9mZnNldCA9IFhGU19ESVIyX0RBVEFfRklSU1RfT0ZGU0VUOwogCWJh ZF9vZmZzZXQgPSAqcmVwYWlyID0gMDsKQEAgLTE5ODYsOSArMjAxOCw2IEBACiAJ aW50CQkJdDsKIAlibWFwX2V4dF90CQlsYm1wOwogCi0JaWYgKGRvX3ByZWZldGNo KQotCQlwcmVmZXRjaF9kaXIyKG1wLCBibGttYXApOwotCiAJKnJlcGFpciA9ICpk b3QgPSAqZG90ZG90ID0gZ29vZCA9IDA7CiAJKnBhcmVudCA9IE5VTExGU0lOTzsK IAluZGJubyA9IE5VTExERklMT0ZGOwpJbmRleDogcmVwYWlyL3hmc3Byb2dzL3Jl cGFpci9kaXJfc3RhY2suYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIu b3JpZy94ZnNwcm9ncy9yZXBhaXIvZGlyX3N0YWNrLmMJMjAwNy0wNC0yNyAxMzox MzozNS4wMDAwMDAwMDAgKzEwMDAKKysrIC9kZXYvbnVsbAkxOTcwLTAxLTAxIDAw OjAwOjAwLjAwMDAwMDAwMCArMDAwMApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAq IENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUgU2lsaWNvbiBHcmFwaGljcywg SW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAot ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBu b3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMu LCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx MC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGlieGZzLmg+Ci0jaW5jbHVk ZSAiZGlyX3N0YWNrLmgiCi0jaW5jbHVkZSAiZXJyX3Byb3Rvcy5oIgotI2luY2x1 ZGUgInRocmVhZHMuaCIKLQotLyoKLSAqIGEgZGlyZWN0b3J5IHN0YWNrIGZvciBo b2xkaW5nIGRpcmVjdG9yaWVzIHdoaWxlCi0gKiB3ZSB0cmF2ZXJzZSBmaWxlc3lz dGVtIGhpZXJhcmNoeSBzdWJ0cmVlcy4KLSAqIG5hbWVzIGFyZSBraW5kIG9mIG1p c2xlYWRpbmcgYXMgdGhpcyBpcyByZWFsbHkKLSAqIGltcGxlbWVudGVkIGFzIGFu IGlub2RlIHN0YWNrLiAgc28gc3VlIG1lLi4uCi0gKi8KLQotc3RhdGljIGRpcl9z dGFja190CWRpcnN0YWNrX2ZyZWVsaXN0Owotc3RhdGljIGludAkJZGlyc3RhY2tf aW5pdCA9IDA7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90CWRpcnN0YWNrX211dGV4 Owotc3RhdGljIHB0aHJlYWRfbXV0ZXhhdHRyX3QgZGlyc3RhY2tfbXV0ZXhhdHRy OwotCi0KLXZvaWQKLWRpcl9zdGFja19pbml0KGRpcl9zdGFja190ICpzdGFjaykK LXsKLQlzdGFjay0+Y250ID0gMDsKLQlzdGFjay0+aGVhZCA9IE5VTEw7Ci0KLQlp ZiAoZGlyc3RhY2tfaW5pdCA9PSAwKSAgewotCQlkaXJzdGFja19pbml0ID0gMTsK LQkJUFJFUEFJUl9NVFhfQVRUUl9JTklUKCZkaXJzdGFja19tdXRleGF0dHIpOwot I2lmZGVmIFBUSFJFQURfTVVURVhfU1BJTkJMT0NLX05QCi0JCVBSRVBBSVJfTVRY X0FUVFJfU0VUKCZkaXJzdGFja19tdXRleGF0dHIsIFBUSFJFQURfTVVURVhfU1BJ TkJMT0NLX05QKTsKLSNlbmRpZgotCQlQUkVQQUlSX01UWF9MT0NLX0lOSVQoJmRp cnN0YWNrX211dGV4LCAmZGlyc3RhY2tfbXV0ZXhhdHRyKTsKLQkJZGlyX3N0YWNr X2luaXQoJmRpcnN0YWNrX2ZyZWVsaXN0KTsKLQl9Ci0KLQlzdGFjay0+Y250ID0g MDsKLQlzdGFjay0+aGVhZCA9IE5VTEw7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRp YyB2b2lkCi1kaXJfc3RhY2tfcHVzaChkaXJfc3RhY2tfdCAqc3RhY2ssIGRpcl9z dGFja19lbGVtX3QgKmVsZW0pCi17Ci0JQVNTRVJUKHN0YWNrLT5jbnQgPiAwIHx8 IChzdGFjay0+Y250ID09IDAgJiYgc3RhY2stPmhlYWQgPT0gTlVMTCkpOwotCi0J ZWxlbS0+bmV4dCA9IHN0YWNrLT5oZWFkOwotCXN0YWNrLT5oZWFkID0gZWxlbTsK LQlzdGFjay0+Y250Kys7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBkaXJfc3Rh Y2tfZWxlbV90ICoKLWRpcl9zdGFja19wb3AoZGlyX3N0YWNrX3QgKnN0YWNrKQot ewotCWRpcl9zdGFja19lbGVtX3QgKmVsZW07Ci0KLQlpZiAoc3RhY2stPmNudCA9 PSAwKSAgewotCQlBU1NFUlQoc3RhY2stPmhlYWQgPT0gTlVMTCk7Ci0JCXJldHVy bihOVUxMKTsKLQl9Ci0KLQllbGVtID0gc3RhY2stPmhlYWQ7Ci0KLQlBU1NFUlQo ZWxlbSAhPSBOVUxMKTsKLQotCXN0YWNrLT5oZWFkID0gZWxlbS0+bmV4dDsKLQll bGVtLT5uZXh0ID0gTlVMTDsKLQlzdGFjay0+Y250LS07Ci0KLQlyZXR1cm4oZWxl bSk7Ci19Ci0KLXZvaWQKLXB1c2hfZGlyKGRpcl9zdGFja190ICpzdGFjaywgeGZz X2lub190IGlubykKLXsKLQlkaXJfc3RhY2tfZWxlbV90ICplbGVtOwotCi0JUFJF UEFJUl9NVFhfTE9DSygmZGlyc3RhY2tfbXV0ZXgpOwotCWlmIChkaXJzdGFja19m cmVlbGlzdC5jbnQgPT0gMCkgIHsKLQkJaWYgKChlbGVtID0gbWFsbG9jKHNpemVv ZihkaXJfc3RhY2tfZWxlbV90KSkpID09IE5VTEwpICB7Ci0JCQlQUkVQQUlSX01U WF9VTkxPQ0soJmRpcnN0YWNrX211dGV4KTsKLQkJCWRvX2Vycm9yKAotCQlfKCJj b3VsZG4ndCBtYWxsb2MgZGlyIHN0YWNrIGVsZW1lbnQsIHRyeSBtb3JlIHN3YXBc biIpKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9IGVsc2UgIHsKLQkJZWxlbSA9IGRp cl9zdGFja19wb3AoJmRpcnN0YWNrX2ZyZWVsaXN0KTsKLQl9Ci0JUFJFUEFJUl9N VFhfVU5MT0NLKCZkaXJzdGFja19tdXRleCk7Ci0KLQllbGVtLT5pbm8gPSBpbm87 Ci0KLQlkaXJfc3RhY2tfcHVzaChzdGFjaywgZWxlbSk7Ci0KLQlyZXR1cm47Ci19 Ci0KLXhmc19pbm9fdAotcG9wX2RpcihkaXJfc3RhY2tfdCAqc3RhY2spCi17Ci0J ZGlyX3N0YWNrX2VsZW1fdCAqZWxlbTsKLQl4ZnNfaW5vX3QgaW5vOwotCi0JZWxl bSA9IGRpcl9zdGFja19wb3Aoc3RhY2spOwotCi0JaWYgKGVsZW0gPT0gTlVMTCkK LQkJcmV0dXJuKE5VTExGU0lOTyk7Ci0KLQlpbm8gPSBlbGVtLT5pbm87Ci0JZWxl bS0+aW5vID0gTlVMTEZTSU5POwotCi0JUFJFUEFJUl9NVFhfTE9DSygmZGlyc3Rh Y2tfbXV0ZXgpOwotCWRpcl9zdGFja19wdXNoKCZkaXJzdGFja19mcmVlbGlzdCwg ZWxlbSk7Ci0JUFJFUEFJUl9NVFhfVU5MT0NLKCZkaXJzdGFja19tdXRleCk7Ci0K LQlyZXR1cm4oaW5vKTsKLX0KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIv Z2xvYmFscy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hm c3Byb2dzL3JlcGFpci9nbG9iYWxzLmgJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAw MDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZ2xvYmFscy5o CTIwMDctMDYtMDQgMTc6MjI6NTkuMTA0NDA0ODgzICsxMDAwCkBAIC0yMyw4ICsy Myw2IEBACiAjZGVmaW5lIEVYVEVSTiBleHRlcm4KICNlbmRpZgogCi0jZGVmaW5l IFRSQUNLX01FTU9SWQotCiAjaWZkZWYgVFJBQ0tfTUVNT1JZCiAjaW5jbHVkZSAi dHJhY2ttZW0uaCIKICNlbmRpZgpAQCAtMTU0LDcgKzE1Miw3IEBACiAvKiBjb25m aWd1cmF0aW9uIHZhcnMgLS0gZnMgZ2VvbWV0cnkgZGVwZW5kZW50ICovCiAKIEVY VEVSTiBpbnQJCWlub2Rlc19wZXJfYmxvY2s7Ci1FWFRFUk4gaW50CQlpbm9kZXNf cGVyX2NsdXN0ZXI7CS8qIGlub2RlcyBwZXIgaW5vZGUgYnVmZmVyICovCitFWFRF Uk4gaW50CQlpbm9kZXNfcGVyX2NsdXN0ZXI7CiBFWFRFUk4gdW5zaWduZWQgaW50 CWdsb2JfYWdjb3VudDsKIEVYVEVSTiBpbnQJCWNodW5rc19wYmxvY2s7CS8qICMg b2YgNjQtaW5vIGNodW5rcyBwZXIgYWxsb2NhdGlvbiAqLwogRVhURVJOIGludAkJ bWF4X3N5bWxpbmtfYmxvY2tzOwpAQCAtMTk4LDExICsxOTYsMTYgQEAKIGV4dGVy biBzaXplX3QgCQl0c19kaXJfZnJlZW1hcF9zaXplOwogZXh0ZXJuIHNpemVfdCAJ CXRzX2F0dHJfZnJlZW1hcF9zaXplOwogCi1FWFRFUk4gcHRocmVhZF9yd2xvY2tf dAkqcGVyX2FnX2xvY2s7CitFWFRFUk4gcHRocmVhZF9tdXRleF90CSphZ19sb2Nr czsKKworRVhURVJOIGludCAJCXJlcG9ydF9pbnRlcnZhbDsKK0VYVEVSTiBfX3Vp bnQ2NF90IAkqcHJvZ19ycHRfZG9uZTsKIAotRVhURVJOIGludCByZXBvcnRfaW50 ZXJ2YWw7Ci1FWFRFUk4gX191aW50NjRfdCAqcHJvZ19ycHRfZG9uZTsKKyNpZmRl ZiBYUl9QRl9UUkFDRQorRVhURVJOIEZJTEUJCSpwZl90cmFjZV9maWxlOworI2Vu ZGlmCiAKIEVYVEVSTiBpbnQJCWFnX3N0cmlkZTsKK0VYVEVSTiBpbnQJCXRocmVh ZF9jb3VudDsKIAogI2VuZGlmIC8qIF9YRlNfUkVQQUlSX0dMT0JBTF9IICovCklu ZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL2luY29yZS5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9pbmNvcmUu YwkyMDA3LTA0LTI3IDEzOjEzOjM1LjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWly L3hmc3Byb2dzL3JlcGFpci9pbmNvcmUuYwkyMDA3LTA1LTE2IDEyOjAyOjM5LjYx MjY1NDUzMCArMTAwMApAQCAtNjEsMTEgKzYxLDEyIEBACiAJc2l6ZV90IHNpemUg PSAwOwogCiAJYmFfYm1hcCA9IChfX3VpbnQ2NF90KiopbWFsbG9jKGFnbm8qc2l6 ZW9mKF9fdWludDY0X3QgKikpOwotCWlmICghYmFfYm1hcCkgIHsKKwlpZiAoIWJh X2JtYXApCiAJCWRvX2Vycm9yKF8oImNvdWxkbid0IGFsbG9jYXRlIGJsb2NrIG1h cCBwb2ludGVyc1xuIikpOwotCQlyZXR1cm47Ci0JfQotCVBSRVBBSVJfUldfTE9D S19BTExPQyhwZXJfYWdfbG9jaywgYWdubyk7CisJYWdfbG9ja3MgPSBtYWxsb2Mo YWdubyAqIHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKwlpZiAoIWFnX2xvY2tz KQorCQlkb19lcnJvcihfKCJjb3VsZG4ndCBhbGxvY2F0ZSBibG9jayBtYXAgbG9j a3NcbiIpKTsKKwogCWZvciAoaSA9IDA7IGkgPCBhZ25vOyBpKyspICB7CiAJCXNp emUgPSByb3VuZHVwKChudW1ibG9ja3MrKE5CQlkvWFJfQkIpLTEpIC8gKE5CQlkv WFJfQkIpLAogCQkgICAgICAgCQlzaXplb2YoX191aW50NjRfdCkpOwpAQCAtNzcs NyArNzgsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWJ6ZXJvKGJhX2JtYXBbaV0s IHNpemUpOwotCQlQUkVQQUlSX1JXX0xPQ0tfSU5JVCgmcGVyX2FnX2xvY2tbaV0s IE5VTEwpOworCQlwdGhyZWFkX211dGV4X2luaXQoJmFnX2xvY2tzW2ldLCBOVUxM KTsKIAl9CiAKIAlpZiAocnRibG9ja3MgPT0gMCkgIHsKSW5kZXg6IHJlcGFpci94 ZnNwcm9ncy9yZXBhaXIvaW5jb3JlLmgKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g cmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL2luY29yZS5oCTIwMDctMDQtMjcg MTM6NDY6NTEuMDAwMDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZzcHJvZ3MvcmVw YWlyL2luY29yZS5oCTIwMDctMDUtMTYgMTI6MDI6MzkuNjEyNjU0NTMwICsxMDAw CkBAIC0xNiw2ICsxNiwxMCBAQAogICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBG aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KIAor I2lmbmRlZiBYRlNfUkVQQUlSX0lOQ09SRV9ICisjZGVmaW5lIFhGU19SRVBBSVJf SU5DT1JFX0gKKworI2luY2x1ZGUgImF2bC5oIgogLyoKICAqIGNvbnRhaW5zIGRl ZmluaXRpb24gaW5mb3JtYXRpb24uICBpbXBsZW1lbnRhdGlvbiAoY29kZSkKICAq IGlzIHNwcmVhZCBvdXQgaW4gc2VwYXJhdGUgZmlsZXMuCkBAIC02MDMsNyArNjA3 LDcgQEAKICNkZWZpbmUgYWRkX2lub2RlX3JlZmNoZWNrZWQoaW5vLCBpbm9fcmVj LCBpbm9fb2Zmc2V0KSBcCiAJCVhGU19JTk9QUk9DX1NFVF9QUk9DKChpbm9fcmVj KSwgKGlub19vZmZzZXQpKQogI2RlZmluZSBpc19pbm9kZV9yZWZjaGVja2VkKGlu bywgaW5vX3JlYywgaW5vX29mZnNldCkgXAotCQkoWEZTX0lOT1BST0NfSVNfUFJP Qyhpbm9fcmVjLCBpbm9fb2Zmc2V0KSA9PSAwTEwgPyAwIDogMSkKKwkJKFhGU19J Tk9QUk9DX0lTX1BST0MoaW5vX3JlYywgaW5vX29mZnNldCkgIT0gMExMKQogI2Vs c2UKIHZvaWQgYWRkX2lub2RlX3JlZmNoZWNrZWQoeGZzX2lub190IGlubywKIAkJ CWlub190cmVlX25vZGVfdCAqaW5vX3JlYywgaW50IGlub19vZmZzZXQpOwpAQCAt NjQ3LDMgKzY1MSw1IEBACiB9IGJtYXBfY3Vyc29yX3Q7CiAKIHZvaWQgaW5pdF9i bV9jdXJzb3IoYm1hcF9jdXJzb3JfdCAqY3Vyc29yLCBpbnQgbnVtX2xldmVsKTsK KworI2VuZGlmIC8qIFhGU19SRVBBSVJfSU5DT1JFX0ggKi8KSW5kZXg6IHJlcGFp ci94ZnNwcm9ncy9yZXBhaXIvaW5jb3JlX2V4dC5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9pbmNvcmVfZXh0LmMJ MjAwNy0wNC0yNyAxMzoxMzozNS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94 ZnNwcm9ncy9yZXBhaXIvaW5jb3JlX2V4dC5jCTIwMDctMDQtMjcgMTQ6MTI6MzQu MTUxNTY4NzIyICsxMDAwCkBAIC05NSw5ICs5NSw5IEBACiAvKgogICogbG9ja3Mu CiAgKi8KLXN0YXRpYyBwdGhyZWFkX3J3bG9ja190IGV4dF9mbGlzdF9sb2NrOwot c3RhdGljIHB0aHJlYWRfcndsb2NrX3QgcnRfZXh0X3RyZWVfbG9jazsKLXN0YXRp YyBwdGhyZWFkX3J3bG9ja190IHJ0X2V4dF9mbGlzdF9sb2NrOworc3RhdGljIHB0 aHJlYWRfbXV0ZXhfdAlleHRfZmxpc3RfbG9jazsKK3N0YXRpYyBwdGhyZWFkX211 dGV4X3QJcnRfZXh0X3RyZWVfbG9jazsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QJ cnRfZXh0X2ZsaXN0X2xvY2s7CiAKIC8qCiAgKiBleHRlbnQgdHJlZSBzdHVmZiBp cyBhdmwgdHJlZXMgb2YgZHVwbGljYXRlIGV4dGVudHMsCkBAIC0xMTIsNyArMTEy LDcgQEAKIAlleHRlbnRfdHJlZV9ub2RlX3QgKm5ldzsKIAlleHRlbnRfYWxsb2Nf cmVjX3QgKnJlYzsKIAotCVBSRVBBSVJfUldfV1JJVEVfTE9DSygmZXh0X2ZsaXN0 X2xvY2spOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmZXh0X2ZsaXN0X2xvY2spOwog CWlmIChleHRfZmxpc3QuY250ID09IDApICB7CiAJCUFTU0VSVChleHRfZmxpc3Qu bGlzdCA9PSBOVUxMKTsKIApAQCAtMTM5LDcgKzEzOSw3IEBACiAJZXh0X2ZsaXN0 Lmxpc3QgPSAoZXh0ZW50X3RyZWVfbm9kZV90ICopIG5ldy0+YXZsX25vZGUuYXZs X25leHRpbm87CiAJZXh0X2ZsaXN0LmNudC0tOwogCW5ldy0+YXZsX25vZGUuYXZs X25leHRpbm8gPSBOVUxMOwotCVBSRVBBSVJfUldfVU5MT0NLKCZleHRfZmxpc3Rf bG9jayk7CisJcHRocmVhZF9tdXRleF91bmxvY2soJmV4dF9mbGlzdF9sb2NrKTsK IAogCS8qIGluaXRpYWxpemUgbm9kZSAqLwogCkBAIC0xNTUsMTEgKzE1NSwxMSBA QAogdm9pZAogcmVsZWFzZV9leHRlbnRfdHJlZV9ub2RlKGV4dGVudF90cmVlX25v ZGVfdCAqbm9kZSkKIHsKLQlQUkVQQUlSX1JXX1dSSVRFX0xPQ0soJmV4dF9mbGlz dF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJmV4dF9mbGlzdF9sb2NrKTsK IAlub2RlLT5hdmxfbm9kZS5hdmxfbmV4dGlubyA9IChhdmxub2RlX3QgKikgZXh0 X2ZsaXN0Lmxpc3Q7CiAJZXh0X2ZsaXN0Lmxpc3QgPSBub2RlOwogCWV4dF9mbGlz dC5jbnQrKzsKLQlQUkVQQUlSX1JXX1VOTE9DSygmZXh0X2ZsaXN0X2xvY2spOwor CXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZleHRfZmxpc3RfbG9jayk7CiAKIAlyZXR1 cm47CiB9CkBAIC0zMjcsMTEgKzMyNywxMSBAQAogCQkgKiBhdmwgdHJlZSBjb2Rl IGRvZXNuJ3QgaGFuZGxlIGR1cHMgc28gaW5zZXJ0CiAJCSAqIG9udG8gbGlua2Vk IGxpc3QgaW4gaW5jcmVhc2luZyBzdGFydGJsb2NrIG9yZGVyCiAJCSAqCi0JCSAq IHdoZW4gY2FsbGVkIGZyb20gbWtfaW5jb3JlX2ZzdHJlZSwgCisJCSAqIHdoZW4g Y2FsbGVkIGZyb20gbWtfaW5jb3JlX2ZzdHJlZSwKIAkJICogc3RhcnRibG9jayBp cyBpbiBpbmNyZWFzaW5nIG9yZGVyLgogCQkgKiBjdXJyZW50IGlzIGFuICJhbmNo b3IiIG5vZGUuCiAJCSAqIHF1aWNrIGNoZWNrIGlmIHRoZSBuZXcgZXh0IGdvZXMg dG8gdGhlIGVuZC4KLQkJICogaWYgc28sIGFwcGVuZCBhdCB0aGUgZW5kLCB1c2lu ZyB0aGUgbGFzdCBmaWVsZCAKKwkJICogaWYgc28sIGFwcGVuZCBhdCB0aGUgZW5k LCB1c2luZyB0aGUgbGFzdCBmaWVsZAogCQkgKiBvZiB0aGUgImFuY2hvciIuCiAJ CSAqLwogCQlBU1NFUlQoY3VycmVudC0+bGFzdCAhPSBOVUxMKTsKQEAgLTM0MSw3 ICszNDEsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJLyogCisJCS8qCiAJCSAq IHNjYW4sIHRvIGZpbmQgdGhlIHByb3BlciBsb2NhdGlvbiBmb3IgbmV3IGVudHJ5 LgogCQkgKiB0aGlzIHNjYW4gaXMgKnZlcnkqIGV4cGVuc2l2ZSBhbmQgZ2V0cyB3 b3JzZSB3aXRoCiAJCSAqIHdpdGggaW5jcmVhc2luZyBlbnRyaWVzLgpAQCAtNjcw LDcgKzY3MCw3IEBACiAJcnRfZXh0ZW50X3RyZWVfbm9kZV90ICpuZXc7CiAJcnRf ZXh0ZW50X2FsbG9jX3JlY190ICpyZWM7CiAKLQlQUkVQQUlSX1JXX1dSSVRFX0xP Q0soJnJ0X2V4dF9mbGlzdF9sb2NrKTsKKwlwdGhyZWFkX211dGV4X2xvY2soJnJ0 X2V4dF9mbGlzdF9sb2NrKTsKIAlpZiAocnRfZXh0X2ZsaXN0LmNudCA9PSAwKSAg ewogCQlBU1NFUlQocnRfZXh0X2ZsaXN0Lmxpc3QgPT0gTlVMTCk7CiAKQEAgLTY5 Nyw3ICs2OTcsNyBAQAogCXJ0X2V4dF9mbGlzdC5saXN0ID0gKHJ0X2V4dGVudF90 cmVlX25vZGVfdCAqKSBuZXctPmF2bF9ub2RlLmF2bF9uZXh0aW5vOwogCXJ0X2V4 dF9mbGlzdC5jbnQtLTsKIAluZXctPmF2bF9ub2RlLmF2bF9uZXh0aW5vID0gTlVM TDsKLQlQUkVQQUlSX1JXX1VOTE9DSygmcnRfZXh0X2ZsaXN0X2xvY2spOworCXB0 aHJlYWRfbXV0ZXhfdW5sb2NrKCZydF9leHRfZmxpc3RfbG9jayk7CiAKIAkvKiBp bml0aWFsaXplIG5vZGUgKi8KIApAQCAtNzc2LDcgKzc3Niw3IEBACiAJeGZzX2Ry dGJub190IG5ld19zdGFydGJsb2NrOwogCXhmc19leHRsZW5fdCBuZXdfYmxvY2tj b3VudDsKIAotCVBSRVBBSVJfUldfV1JJVEVfTE9DSygmcnRfZXh0X3RyZWVfbG9j ayk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZydF9leHRfdHJlZV9sb2NrKTsKIAlh dmw2NF9maW5kcmFuZ2VzKHJ0X2V4dF90cmVlX3B0ciwgc3RhcnRibG9jayAtIDEs CiAJCXN0YXJ0YmxvY2sgKyBibG9ja2NvdW50ICsgMSwKIAkJKGF2bDY0bm9kZV90 ICoqKSAmZmlyc3QsIChhdmw2NG5vZGVfdCAqKikgJmxhc3QpOwpAQCAtNzk0LDcg Kzc5NCw3IEBACiAJCQlkb19lcnJvcihfKCJkdXBsaWNhdGUgZXh0ZW50IHJhbmdl XG4iKSk7CiAJCX0KIAotCQlQUkVQQUlSX1JXX1VOTE9DSygmcnRfZXh0X3RyZWVf bG9jayk7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZydF9leHRfdHJlZV9sb2Nr KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODE5LDcgKzgxOSw3IEBACiAJCSAqLwog CQlpZiAoZXh0LT5ydF9zdGFydGJsb2NrIDw9IHN0YXJ0YmxvY2sgJiYKIAkJCQll eHQtPnJ0X2Jsb2NrY291bnQgPj0gYmxvY2tjb3VudCkgewotCQkJUFJFUEFJUl9S V19VTkxPQ0soJnJ0X2V4dF90cmVlX2xvY2spOworCQkJcHRocmVhZF9tdXRleF91 bmxvY2soJnJ0X2V4dF90cmVlX2xvY2spOwogCQkJcmV0dXJuOwogCQl9CiAJCS8q CkBAIC04NDksNyArODQ5LDcgQEAKIAkJZG9fZXJyb3IoXygiZHVwbGljYXRlIGV4 dGVudCByYW5nZVxuIikpOwogCX0KIAotCVBSRVBBSVJfUldfVU5MT0NLKCZydF9l eHRfdHJlZV9sb2NrKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmcnRfZXh0X3Ry ZWVfbG9jayk7CiAJcmV0dXJuOwogfQogCkBAIC04NjIsMTIgKzg2MiwxMiBAQAog ewogCWludCByZXQ7CiAKLQlQUkVQQUlSX1JXX1JFQURfTE9DSygmcnRfZXh0X3Ry ZWVfbG9jayk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZydF9leHRfdHJlZV9sb2Nr KTsKIAlpZiAoYXZsNjRfZmluZHJhbmdlKHJ0X2V4dF90cmVlX3B0ciwgYm5vKSAh PSBOVUxMKQogCQlyZXQgPSAxOwogCWVsc2UKIAkJcmV0ID0gMDsKLQlQUkVQQUlS X1JXX1VOTE9DSygmcnRfZXh0X3RyZWVfbG9jayk7CisJcHRocmVhZF9tdXRleF91 bmxvY2soJnJ0X2V4dF90cmVlX2xvY2spOwogCXJldHVybihyZXQpOwogfQogCkBA IC04OTcsOSArODk3LDkgQEAKIAogCWJhX2xpc3QgPSBOVUxMOwogCXJ0X2JhX2xp c3QgPSBOVUxMOwotCVBSRVBBSVJfUldfTE9DS19JTklUKCZleHRfZmxpc3RfbG9j aywgTlVMTCk7Ci0JUFJFUEFJUl9SV19MT0NLX0lOSVQoJnJ0X2V4dF90cmVlX2xv Y2ssIE5VTEwpOwotCVBSRVBBSVJfUldfTE9DS19JTklUKCZydF9leHRfZmxpc3Rf bG9jaywgTlVMTCk7CisJcHRocmVhZF9tdXRleF9pbml0KCZleHRfZmxpc3RfbG9j aywgTlVMTCk7CisJcHRocmVhZF9tdXRleF9pbml0KCZydF9leHRfdHJlZV9sb2Nr LCBOVUxMKTsKKwlwdGhyZWFkX211dGV4X2luaXQoJnJ0X2V4dF9mbGlzdF9sb2Nr LCBOVUxMKTsKIAogCWlmICgoZXh0ZW50X3RyZWVfcHRycyA9IG1hbGxvYyhhZ2Nv dW50ICoKIAkJCQkJc2l6ZW9mKGF2bHRyZWVfZGVzY190ICopKSkgPT0gTlVMTCkK SW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvaW5jb3JlX2luby5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9p bmNvcmVfaW5vLmMJMjAwNy0wNC0yNyAxNDowOTozNy4wMDAwMDAwMDAgKzEwMDAK KysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvaW5jb3JlX2luby5jCTIwMDctMDQt MjcgMTQ6MTI6MzQuMTU1NTY4MjAwICsxMDAwCkBAIC0yNSw3ICsyNSw3IEBACiAj aW5jbHVkZSAidGhyZWFkcy5oIgogI2luY2x1ZGUgImVycl9wcm90b3MuaCIKIAot c3RhdGljIHB0aHJlYWRfcndsb2NrX3QgaW5vX2ZsaXN0X2xvY2s7CitzdGF0aWMg cHRocmVhZF9tdXRleF90CWlub19mbGlzdF9sb2NrOwogZXh0ZXJuIGF2bG5vZGVf dAkqYXZsX2ZpcnN0aW5vKGF2bG5vZGVfdCAqcm9vdCk7CiAKIC8qCkBAIC0yNTks NyArMjU5LDcgQEAKIAlpbm9fdHJlZV9ub2RlX3QgCSppbm9fcmVjOwogCWF2bG5v ZGVfdCAJCSpub2RlOwogCi0JUFJFUEFJUl9SV19XUklURV9MT0NLKCZpbm9fZmxp c3RfbG9jayk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZpbm9fZmxpc3RfbG9jayk7 CiAJaWYgKGlub19mbGlzdC5jbnQgPT0gMCkgIHsKIAkJQVNTRVJUKGlub19mbGlz dC5saXN0ID09IE5VTEwpOwogCkBAIC0yODMsNyArMjgzLDcgQEAKIAlpbm9fZmxp c3QuY250LS07CiAJbm9kZSA9ICZpbm9fcmVjLT5hdmxfbm9kZTsKIAlub2RlLT5h dmxfbmV4dGlubyA9IG5vZGUtPmF2bF9mb3J3ID0gbm9kZS0+YXZsX2JhY2sgPSBO VUxMOwotCVBSRVBBSVJfUldfVU5MT0NLKCZpbm9fZmxpc3RfbG9jayk7CisJcHRo cmVhZF9tdXRleF91bmxvY2soJmlub19mbGlzdF9sb2NrKTsKIAogCS8qIGluaXRp YWxpemUgbm9kZSAqLwogCkBAIC0zMTEsNyArMzExLDcgQEAKIAlpbm9fcmVjLT5h dmxfbm9kZS5hdmxfZm9ydyA9IE5VTEw7CiAJaW5vX3JlYy0+YXZsX25vZGUuYXZs X2JhY2sgPSBOVUxMOwogCi0JUFJFUEFJUl9SV19XUklURV9MT0NLKCZpbm9fZmxp c3RfbG9jayk7CisJcHRocmVhZF9tdXRleF9sb2NrKCZpbm9fZmxpc3RfbG9jayk7 CiAJaWYgKGlub19mbGlzdC5saXN0ICE9IE5VTEwpICB7CiAJCUFTU0VSVChpbm9f Zmxpc3QuY250ID4gMCk7CiAJCWlub19yZWMtPmF2bF9ub2RlLmF2bF9uZXh0aW5v ID0gKGF2bG5vZGVfdCAqKSBpbm9fZmxpc3QubGlzdDsKQEAgLTMzMyw5ICszMzMs NyBAQAogCQlmcmVlKGlub19yZWMtPmlub191bi5leF9kYXRhKTsKIAogCX0KLQlQ UkVQQUlSX1JXX1VOTE9DSygmaW5vX2ZsaXN0X2xvY2spOwotCi0JcmV0dXJuOwor CXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbm9fZmxpc3RfbG9jayk7CiB9CiAKIC8q CkBAIC00MDMsOCArNDAxLDYgQEAKIAkgKiBzZXQgY2FjaGUgZW50cnkKIAkgKi8K IAlsYXN0X3JlY1thZ25vXSA9IGlub19yZWM7Ci0KLQlyZXR1cm47CiB9CiAKIC8q CkBAIC00NTIsOCArNDQ4LDYgQEAKIGNsZWFyX3VuY2VydGFpbl9pbm9fY2FjaGUo eGZzX2FnbnVtYmVyX3QgYWdubykKIHsKIAlsYXN0X3JlY1thZ25vXSA9IE5VTEw7 Ci0KLQlyZXR1cm47CiB9CiAKIApAQCAtNTIxLDggKzUxNSw2IEBACiBmcmVlX2lu b2RlX3JlYyh4ZnNfYWdudW1iZXJfdCBhZ25vLCBpbm9fdHJlZV9ub2RlX3QgKmlu b19yZWMpCiB7CiAJZnJlZV9pbm9fdHJlZV9ub2RlKGlub19yZWMpOwotCi0JcmV0 dXJuOwogfQogCiB2b2lkCkBAIC01MzQsNyArNTI2LDYgQEAKIAogCWF2bF9maW5k cmFuZ2VzKGlub2RlX3RyZWVfcHRyc1thZ25vXSwgc3RhcnRfaW5vLAogCQllbmRf aW5vLCAoYXZsbm9kZV90ICoqKSBmaXJzdCwgKGF2bG5vZGVfdCAqKikgbGFzdCk7 Ci0JcmV0dXJuOwogfQogCiAvKgpAQCAtNzE2LDggKzcwNyw2IEBACiAjZW5kaWYK IAlpcmVjLT5pbm9fdW4ucGxpc3QtPnBlbnRyaWVzW3RhcmdldF0gPSBwYXJlbnQ7 CiAJaXJlYy0+aW5vX3VuLnBsaXN0LT5wbWFzayB8PSAoMUxMIDw8IG9mZnNldCk7 Ci0KLQlyZXR1cm47CiB9CiAKIHhmc19pbm9fdApAQCAtODEwLDcgKzc5OSw3IEBA CiAJaW50IGk7CiAJaW50IGFnY291bnQgPSBtcC0+bV9zYi5zYl9hZ2NvdW50Owog Ci0JUFJFUEFJUl9SV19MT0NLX0lOSVQoJmlub19mbGlzdF9sb2NrLCBOVUxMKTsK KwlwdGhyZWFkX211dGV4X2luaXQoJmlub19mbGlzdF9sb2NrLCBOVUxMKTsKIAlp ZiAoKGlub2RlX3RyZWVfcHRycyA9IG1hbGxvYyhhZ2NvdW50ICoKIAkJCQkJc2l6 ZW9mKGF2bHRyZWVfZGVzY190ICopKSkgPT0gTlVMTCkKIAkJZG9fZXJyb3IoXygi Y291bGRuJ3QgbWFsbG9jIGlub2RlIHRyZWUgZGVzY3JpcHRvciB0YWJsZVxuIikp OwpAQCAtODQyLDggKzgzMSw2IEBACiAJYnplcm8obGFzdF9yZWMsIHNpemVvZihp bm9fdHJlZV9ub2RlX3QgKikgKiBhZ2NvdW50KTsKIAogCWZ1bGxfaW5vX2V4X2Rh dGEgPSAwOwotCi0JcmV0dXJuOwogfQogCiAjaWZkZWYgWFJfSU5PX1JFRl9ERUJV RwpAQCAtODUzLDggKzg0MCw2IEBACiAJWEZTX0lOT1BST0NfU0VUX1BST0MoKGlu b19yZWMpLCAoaW5vX29mZnNldCkpOwogCiAJQVNTRVJUKGlzX2lub2RlX3JlZmNo ZWNrZWQoaW5vLCBpbm9fcmVjLCBpbm9fb2Zmc2V0KSk7Ci0KLQlyZXR1cm47CiB9 CiAKIGludApJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9pbml0LmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWly L2luaXQuYwkyMDA3LTA0LTI3IDE0OjExOjQxLjAwMDAwMDAwMCArMTAwMAorKysg cmVwYWlyL3hmc3Byb2dzL3JlcGFpci9pbml0LmMJMjAwNy0wNC0yNyAxNDoxMjoz NC4xNTU1NjgyMDAgKzEwMDAKQEAgLTIyLDcgKzIyLDExIEBACiAjaW5jbHVkZSAi cHJvdG9zLmgiCiAjaW5jbHVkZSAiZXJyX3Byb3Rvcy5oIgogI2luY2x1ZGUgInB0 aHJlYWQuaCIKKyNpbmNsdWRlICJhdmwuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNp bmNsdWRlICJpbmNvcmUuaCIKICNpbmNsdWRlICJwcmVmZXRjaC5oIgorI2luY2x1 ZGUgInJhZGl4LXRyZWUuaCIKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAog c3RhdGljIHB0aHJlYWRfa2V5X3QgZGlyYnVmX2tleTsKQEAgLTE0NCw5ICsxNDgs NSBAQAogCXRzX2NyZWF0ZSgpOwogCXRzX2luaXQoKTsKIAlpbmNyZWFzZV9ybGlt aXQoKTsKLQlpZiAoZG9fcHJlZmV0Y2gpIHsKLQkJZG9fcHJlZmV0Y2ggPSBsaWJ4 ZnNfbGlvX2luaXQoKTsKLQkJaWYgKGRvX3ByZWZldGNoKQotCQkJbGlieGZzX2xp b19hbGxvY2F0ZSgpOwotCX0KKwlyYWRpeF90cmVlX2luaXQoKTsKIH0KSW5kZXg6 IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcGhhc2UzLmMKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL3BoYXNlMy5jCTIw MDctMDQtMjcgMTQ6MTE6NDEuMDAwMDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZz cHJvZ3MvcmVwYWlyL3BoYXNlMy5jCTIwMDctMDUtMDEgMTY6NTQ6NTguNzExMTc0 NDUyICsxMDAwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiZGlub2RlLmgi CiAjaW5jbHVkZSAidGhyZWFkcy5oIgogI2luY2x1ZGUgInByb2dyZXNzLmgiCisj aW5jbHVkZSAicHJlZmV0Y2guaCIKIAogLyoKICAqIHdhbGtzIGFuIHVubGlua2Vk IGxpc3QsIHJldHVybnMgMSBvbiBhbiBlcnJvciAoYm9ndXMgcG9pbnRlcikgb3IK QEAgLTU5LDcgKzYwLDcgQEAKIAkJCQlhZGRfYWdpbm9kZV91bmNlcnRhaW4oYWdu bywgY3VycmVudF9pbm8sIDEpOwogCQkJCWFnYm5vID0gWEZTX0FHSU5PX1RPX0FH Qk5PKG1wLCBjdXJyZW50X2lubyk7CiAKLQkJCQlQUkVQQUlSX1JXX1dSSVRFX0xP Q0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsKKwkJCQlwdGhyZWFkX211dGV4X2xvY2so JmFnX2xvY2tzW2Fnbm9dKTsKIAkJCQlzd2l0Y2ggKHN0YXRlID0gZ2V0X2FnYm5v X3N0YXRlKG1wLAogCQkJCQkJCWFnbm8sIGFnYm5vKSkgIHsKIAkJCQljYXNlIFhS X0VfVU5LTk9XTjoKQEAgLTY3LDE0ICs2OCwxMSBAQAogCQkJCWNhc2UgWFJfRV9G UkVFMToKIAkJCQkJc2V0X2FnYm5vX3N0YXRlKG1wLCBhZ25vLCBhZ2JubywKIAkJ CQkJCVhSX0VfSU5PKTsKLQkJCQkJUFJFUEFJUl9SV19VTkxPQ0soJnBlcl9hZ19s b2NrW2Fnbm9dKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBYUl9FX0JBRF9TVEFU RToKLQkJCQkJUFJFUEFJUl9SV19VTkxPQ0soJnBlcl9hZ19sb2NrW2Fnbm9dKTsK IAkJCQkJZG9fZXJyb3IoXygKIAkJCQkJCSJiYWQgc3RhdGUgaW4gYmxvY2sgbWFw ICVkXG4iKSwKIAkJCQkJCXN0YXRlKTsKLQkJCQkJYWJvcnQoKTsKIAkJCQkJYnJl YWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJLyoKQEAgLTg5LDkgKzg3LDkgQEAKIAkJ CQkJICovCiAJCQkJCXNldF9hZ2Jub19zdGF0ZShtcCwgYWdubywgYWdibm8sCiAJ CQkJCQlYUl9FX0lOTyk7Ci0JCQkJCVBSRVBBSVJfUldfVU5MT0NLKCZwZXJfYWdf bG9ja1thZ25vXSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KKwkJCQlwdGhyZWFkX211 dGV4X3VubG9jaygmYWdfbG9ja3NbYWdub10pOwogCQkJfQogCQkJY3VycmVudF9p bm8gPSBkaXAtPmRpX25leHRfdW5saW5rZWQ7CiAJCX0gZWxzZSAgewpAQCAtMTQ5 LDIxICsxNDcsNjcgQEAKIAkJbGlieGZzX3B1dGJ1ZihicCk7CiB9CiAKLXZvaWQK LXBhcmFsbGVsX3AzX3Byb2Nlc3NfYWdpbm9kZXMoeGZzX21vdW50X3QgKm1wLCB4 ZnNfYWdudW1iZXJfdCBhZ25vKQorc3RhdGljIHZvaWQKK3Byb2Nlc3NfYWdfZnVu YygKKwl3b3JrX3F1ZXVlX3QJCSp3cSwKKwl4ZnNfYWdudW1iZXJfdCAJCWFnbm8s CisJdm9pZAkJCSphcmcpCiB7CiAJLyoKIAkgKiB0dXJuIG9uIGRpcmVjdG9yeSBw cm9jZXNzaW5nIChpbm9kZSBkaXNjb3ZlcnkpIGFuZAogCSAqIGF0dHJpYnV0ZSBw cm9jZXNzaW5nIChleHRyYV9hdHRyX2NoZWNrKQogCSAqLworCXdhaXRfZm9yX2lu b2RlX3ByZWZldGNoKGFyZyk7CiAJZG9fbG9nKF8oIiAgICAgICAgLSBhZ25vID0g JWRcbiIpLCBhZ25vKTsKLQlwcm9jZXNzX2FnaW5vZGVzKG1wLCBhZ25vLCAxLCAw LCAxKTsKKwlwcm9jZXNzX2FnaW5vZGVzKHdxLT5tcCwgYXJnLCBhZ25vLCAxLCAw LCAxKTsKKwljbGVhbnVwX2lub2RlX3ByZWZldGNoKGFyZyk7Cit9CisKK3N0YXRp YyB2b2lkCitwcm9jZXNzX2FncygKKwl4ZnNfbW91bnRfdAkJKm1wKQoreworCWlu dCAJCQlpLCBqOworCXdvcmtfcXVldWVfdAkJKnF1ZXVlczsKKwlwcmVmZXRjaF9h cmdzX3QJCSpwZl9hcmdzWzJdOworCisJcXVldWVzID0gbWFsbG9jKHRocmVhZF9j b3VudCAqIHNpemVvZih3b3JrX3F1ZXVlX3QpKTsKKworCWlmIChhZ19zdHJpZGUp IHsKKwkJLyoKKwkJICogY3JlYXRlIG9uZSB3b3JrZXIgdGhyZWFkIGZvciBlYWNo IHNlZ21lbnQgb2YgdGhlIHZvbHVtZQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8 IHRocmVhZF9jb3VudDsgaSsrKSB7CisJCQljcmVhdGVfd29ya19xdWV1ZSgmcXVl dWVzW2ldLCBtcCwgMSk7CisJCQlwZl9hcmdzWzBdID0gTlVMTDsKKwkJCWZvciAo aiA9IGk7IGogPCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBqICs9IGFnX3N0cmlkZSkg eworCQkJCXBmX2FyZ3NbMF0gPSBzdGFydF9pbm9kZV9wcmVmZXRjaChqLCAwLCBw Zl9hcmdzWzBdKTsKKwkJCQlxdWV1ZV93b3JrKCZxdWV1ZXNbaV0sIHByb2Nlc3Nf YWdfZnVuYywgaiwgcGZfYXJnc1swXSk7CisJCQl9CisJCX0KKwkJLyoKKwkJICog d2FpdCBmb3Igd29ya2VycyB0byBjb21wbGV0ZQorCQkgKi8KKwkJZm9yIChpID0g MDsgaSA8IHRocmVhZF9jb3VudDsgaSsrKQorCQkJZGVzdHJveV93b3JrX3F1ZXVl KCZxdWV1ZXNbaV0pOworCX0gZWxzZSB7CisJCXF1ZXVlc1swXS5tcCA9IG1wOwor CQlwZl9hcmdzWzBdID0gc3RhcnRfaW5vZGVfcHJlZmV0Y2goMCwgMCwgTlVMTCk7 CisJCWZvciAoaSA9IDA7IGkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBpKyspIHsK KwkJCXBmX2FyZ3NbKH5pKSAmIDFdID0gc3RhcnRfaW5vZGVfcHJlZmV0Y2goaSAr IDEsIDAsCisJCQkJCXBmX2FyZ3NbaSAmIDFdKTsKKwkJCXByb2Nlc3NfYWdfZnVu YygmcXVldWVzWzBdLCBpLCBwZl9hcmdzW2kgJiAxXSk7CisJCX0KKwl9CisJZnJl ZShxdWV1ZXMpOwogfQogCiB2b2lkCiBwaGFzZTMoeGZzX21vdW50X3QgKm1wKQog ewotCWludCBpLCBqOworCWludCAJCQlpLCBqOworCisJcHJpbnRmKCJNYWluIHRo cmVhZCA9ICVseFxuIiwgcHRocmVhZF9zZWxmKCkpOwogCiAJZG9fbG9nKF8oIlBo YXNlIDMgLSBmb3IgZWFjaCBBRy4uLlxuIikpOwogCWlmICghbm9fbW9kaWZ5KQpA QCAtMTkyLDE2ICsyMzYsOSBAQAogCSAgICAiICAgICAgICAtIHByb2Nlc3Mga25v d24gaW5vZGVzIGFuZCBwZXJmb3JtIGlub2RlIGRpc2NvdmVyeS4uLlxuIikpOwog CiAJc2V0X3Byb2dyZXNzX21zZyhQUk9HX0ZNVF9QUk9DRVNTX0lOTywgKF9fdWlu dDY0X3QpIG1wLT5tX3NiLnNiX2ljb3VudCk7Ci0JaWYgKGFnX3N0cmlkZSkgewot CQlpbnQgCXN0ZXBzID0gKG1wLT5tX3NiLnNiX2FnY291bnQgKyBhZ19zdHJpZGUg LSAxKSAvIGFnX3N0cmlkZTsKLQkJZm9yIChpID0gMDsgaSA8IHN0ZXBzOyBpKysp Ci0JCQlmb3IgKGogPSBpOyBqIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaiArPSBh Z19zdHJpZGUpCi0JCQkJcXVldWVfd29yayhwYXJhbGxlbF9wM19wcm9jZXNzX2Fn aW5vZGVzLCBtcCwgaik7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IG1w LT5tX3NiLnNiX2FnY291bnQ7IGkrKykKLQkJCXBhcmFsbGVsX3AzX3Byb2Nlc3Nf YWdpbm9kZXMobXAsIGkpOwotCX0KLQl3YWl0X2Zvcl93b3JrZXJzKCk7CisKKwlw cm9jZXNzX2FncyhtcCk7CisKIAlwcmludF9maW5hbF9ycHQoKTsKIAogCS8qCklu ZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3BoYXNlNC5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9waGFzZTQu YwkyMDA3LTA0LTI3IDE0OjExOjQxLjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWly L3hmc3Byb2dzL3JlcGFpci9waGFzZTQuYwkyMDA3LTA0LTI3IDE0OjEyOjM0LjE3 MTU2NjExMiArMTAwMApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImRpcjIu aCIKICNpbmNsdWRlICJ0aHJlYWRzLmgiCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIK KyNpbmNsdWRlICJwcmVmZXRjaC5oIgogCiAKIC8qCkBAIC0xMTQsMTEgKzExNSwx NiBAQAogfQogCiAKLXZvaWQKLXBhcmFsbGVsX3A0X3Byb2Nlc3NfYWdpbm9kZXMo eGZzX21vdW50X3QgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vKQorc3RhdGljIHZv aWQKK3Byb2Nlc3NfYWdfZnVuYygKKwl3b3JrX3F1ZXVlX3QJCSp3cSwKKwl4ZnNf YWdudW1iZXJfdCAJCWFnbm8sCisJdm9pZAkJCSphcmcpCiB7CisJd2FpdF9mb3Jf aW5vZGVfcHJlZmV0Y2goYXJnKTsKIAlkb19sb2coXygiICAgICAgICAtIGFnbm8g PSAlZFxuIiksIGFnbm8pOwotCXByb2Nlc3NfYWdpbm9kZXMobXAsIGFnbm8sIDAs IDEsIDApOworCXByb2Nlc3NfYWdpbm9kZXMod3EtPm1wLCBhcmcsIGFnbm8sIDAs IDEsIDApOworCWNsZWFudXBfaW5vZGVfcHJlZmV0Y2goYXJnKTsKIAogCS8qCiAJ ICogbm93IHJlY3ljbGUgdGhlIHBlci1BRyBkdXBsaWNhdGUgZXh0ZW50IHJlY29y ZHMKQEAgLTEyNiw2ICsxMzIsNTQgQEAKIAlyZWxlYXNlX2R1cF9leHRlbnRfdHJl ZShhZ25vKTsKIH0KIAorc3RhdGljIHZvaWQKK3Byb2Nlc3NfYWdzKAorCXhmc19t b3VudF90CQkqbXApCit7CisJaW50IAkJCWksIGo7CisJd29ya19xdWV1ZV90CQkq cXVldWVzOworCXByZWZldGNoX2FyZ3NfdAkJKnBmX2FyZ3NbMl07CisKKwlxdWV1 ZXMgPSBtYWxsb2ModGhyZWFkX2NvdW50ICogc2l6ZW9mKHdvcmtfcXVldWVfdCkp OworCisJaWYgKCFsaWJ4ZnNfYmNhY2hlX292ZXJmbG93ZWQoKSkgeworCQlxdWV1 ZXNbMF0ubXAgPSBtcDsKKwkJY3JlYXRlX3dvcmtfcXVldWUoJnF1ZXVlc1swXSwg bXAsIGxpYnhmc19ucHJvYygpKTsKKwkJZm9yIChpID0gMDsgaSA8IG1wLT5tX3Ni LnNiX2FnY291bnQ7IGkrKykKKwkJCXF1ZXVlX3dvcmsoJnF1ZXVlc1swXSwgcHJv Y2Vzc19hZ19mdW5jLCBpLCBOVUxMKTsKKwkJZGVzdHJveV93b3JrX3F1ZXVlKCZx dWV1ZXNbMF0pOworCX0gZWxzZSB7CisJCWlmIChhZ19zdHJpZGUpIHsKKwkJCS8q CisJCQkgKiBjcmVhdGUgb25lIHdvcmtlciB0aHJlYWQgZm9yIGVhY2ggc2VnbWVu dCBvZiB0aGUgdm9sdW1lCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCB0aHJl YWRfY291bnQ7IGkrKykgeworCQkJCWNyZWF0ZV93b3JrX3F1ZXVlKCZxdWV1ZXNb aV0sIG1wLCAxKTsKKwkJCQlwZl9hcmdzWzBdID0gTlVMTDsKKwkJCQlmb3IgKGog PSBpOyBqIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaiArPSBhZ19zdHJpZGUpIHsK KwkJCQkJcGZfYXJnc1swXSA9IHN0YXJ0X2lub2RlX3ByZWZldGNoKGosIDAsIHBm X2FyZ3NbMF0pOworCQkJCQlxdWV1ZV93b3JrKCZxdWV1ZXNbaV0sIHByb2Nlc3Nf YWdfZnVuYywgaiwgcGZfYXJnc1swXSk7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJ CSAqIHdhaXQgZm9yIHdvcmtlcnMgdG8gY29tcGxldGUKKwkJCSAqLworCQkJZm9y IChpID0gMDsgaSA8IHRocmVhZF9jb3VudDsgaSsrKQorCQkJCWRlc3Ryb3lfd29y a19xdWV1ZSgmcXVldWVzW2ldKTsKKwkJfSBlbHNlIHsKKwkJCXF1ZXVlc1swXS5t cCA9IG1wOworCQkJcGZfYXJnc1swXSA9IHN0YXJ0X2lub2RlX3ByZWZldGNoKDAs IDAsIE5VTEwpOworCQkJZm9yIChpID0gMDsgaSA8IG1wLT5tX3NiLnNiX2FnY291 bnQ7IGkrKykgeworCQkJCXBmX2FyZ3NbKH5pKSAmIDFdID0gc3RhcnRfaW5vZGVf cHJlZmV0Y2goaSArIDEsCisJCQkJCQkwLCBwZl9hcmdzW2kgJiAxXSk7CisJCQkJ cHJvY2Vzc19hZ19mdW5jKCZxdWV1ZXNbMF0sIGksIHBmX2FyZ3NbaSAmIDFdKTsK KwkJCX0KKwkJfQorCX0KKwlmcmVlKHF1ZXVlcyk7Cit9CisKKwogdm9pZAogcGhh c2U0KHhmc19tb3VudF90ICptcCkKIHsKQEAgLTMyOCwxNyArMzgyLDcgQEAKIAkg KiBhbmQgYXR0cmlidXRlIHByb2Nlc3NpbmcgaXMgdHVybmVkIE9GRiBzaW5jZSB3 ZSBkaWQgdGhhdAogCSAqIGFscmVhZHkgaW4gcGhhc2UgMy4KIAkgKi8KLQlpZiAo YWdfc3RyaWRlKSB7Ci0JCWludCAJc3RlcHMgPSAobXAtPm1fc2Iuc2JfYWdjb3Vu dCArIGFnX3N0cmlkZSAtIDEpIC8gYWdfc3RyaWRlOwotCQlmb3IgKGkgPSAwOyBp IDwgc3RlcHM7IGkrKykKLQkJCWZvciAoaiA9IGk7IGogPCBtcC0+bV9zYi5zYl9h Z2NvdW50OyBqICs9IGFnX3N0cmlkZSkKLQkJCQlxdWV1ZV93b3JrKHBhcmFsbGVs X3A0X3Byb2Nlc3NfYWdpbm9kZXMsIG1wLCBqKTsKLQl9IGVsc2UgewotCQlmb3Ig KGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaSsrKQotCQkJcGFyYWxs ZWxfcDRfcHJvY2Vzc19hZ2lub2RlcyhtcCwgaSk7Ci0JfQotCi0Jd2FpdF9mb3Jf d29ya2VycygpOworCXByb2Nlc3NfYWdzKG1wKTsKIAlwcmludF9maW5hbF9ycHQo KTsKIAogCS8qCkluZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3BoYXNlNS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3Jl cGFpci9waGFzZTUuYwkyMDA3LTA0LTI3IDEzOjEzOjM1LjAwMDAwMDAwMCArMTAw MAorKysgcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9waGFzZTUuYwkyMDA3LTA0LTI3 IDE0OjEyOjM0LjE3NTU2NTU5MCArMTAwMApAQCAtMTQxOSw4ICsxNDE5LDEwIEBA CiAJCXNldF9pbm9kZV91c2VkKGlyZWMsIGkpOwogfQogCi12b2lkCi1waGFzZTVf ZnVuY3Rpb24oeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vKQor c3RhdGljIHZvaWQKK3BoYXNlNV9mdW5jKAorCXhmc19tb3VudF90CSptcCwKKwl4 ZnNfYWdudW1iZXJfdAlhZ25vKQogewogCV9fdWludDY0X3QJbnVtX2lub3M7CiAJ X191aW50NjRfdAludW1fZnJlZV9pbm9zOwpAQCAtMTU5OCw3ICsxNjAwLDcgQEAK IHZvaWQKIHBoYXNlNSh4ZnNfbW91bnRfdCAqbXApCiB7Ci0JeGZzX2FnbnVtYmVy X3QgYWdubzsKKwl4ZnNfYWdudW1iZXJfdAkJYWdubzsKIAogCWRvX2xvZyhfKCJQ aGFzZSA1IC0gcmVidWlsZCBBRyBoZWFkZXJzIGFuZCB0cmVlcy4uLlxuIikpOwog CXNldF9wcm9ncmVzc19tc2coUFJPR19GTVRfUkVCVUlMRF9BRywgKF9fdWludDY0 X3QgKWdsb2JfYWdjb3VudCk7CkBAIC0xNjQxLDEwICsxNjQzLDkgQEAKIAlpZiAo c2JfZmRibG9ja3NfYWcgPT0gTlVMTCkKIAkJZG9fZXJyb3IoXygiY2Fubm90IGFs bG9jIHNiX2ZkYmxvY2tzX2FnIGJ1ZmZlcnNcbiIpKTsKIAotCWZvciAoYWdubyA9 IDA7IGFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBhZ25vKyspICB7Ci0JCXF1 ZXVlX3dvcmsocGhhc2U1X2Z1bmN0aW9uLCBtcCwgYWdubyk7Ci0JfQotCXdhaXRf Zm9yX3dvcmtlcnMoKTsKKwlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgbXAtPm1fc2Iu c2JfYWdjb3VudDsgYWdubysrKQorCQlwaGFzZTVfZnVuYyhtcCwgYWdubyk7CisK IAlwcmludF9maW5hbF9ycHQoKTsKIAogCS8qIGFnZ3JlZ2F0ZSBwZXIgYWcgY291 bnRlcnMgKi8KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcGhhc2U2LmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVw YWlyL3BoYXNlNi5jCTIwMDctMDQtMjcgMTQ6MTE6NDEuMDAwMDAwMDAwICsxMDAw CisrKyByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3BoYXNlNi5jCTIwMDctMDUtMjIg MTE6NTc6MzMuMDA3NTQ5Njc0ICsxMDAwCkBAIC0yMywxOCArMjMsMTcgQEAKICNp bmNsdWRlICJpbmNvcmUuaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJk aXIyLmgiCi0jaW5jbHVkZSAiZGlyX3N0YWNrLmgiCiAjaW5jbHVkZSAicHJvdG9z LmgiCiAjaW5jbHVkZSAiZXJyX3Byb3Rvcy5oIgogI2luY2x1ZGUgImRpbm9kZS5o IgogI2luY2x1ZGUgInByZWZldGNoLmgiCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIK KyNpbmNsdWRlICJ0aHJlYWRzLmgiCiAjaW5jbHVkZSAidmVyc2lvbnMuaCIKIAog c3RhdGljIHN0cnVjdCBjcmVkCQl6ZXJvY3I7CiBzdGF0aWMgc3RydWN0IGZzeGF0 dHIgCQl6ZXJvZnN4Owogc3RhdGljIHhmc19pbm9fdAkJb3JwaGFuYWdlX2lubzsK LXN0YXRpYyB4ZnNfaW5vZGVfdAkJKm9ycGhhbmFnZV9pcDsKIAogLyoKICAqIERh dGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgdG8ga2VlcCB0cmFjayBvZiBkaXJl Y3RvcnkgZW50cmllcwpAQCAtMjM2LDggKzIzNSw4IEBACiAJaW50CQloc2l6ZTsK IAogCWhzaXplID0gc2l6ZSAvICgxNiAqIDQpOwotCWlmIChoc2l6ZSA+IDEwMjQp Ci0JCWhzaXplID0gMTAyNDsKKwlpZiAoaHNpemUgPiA2NTUzNikKKwkJaHNpemUg PSA2MzMzNjsKIAllbHNlIGlmIChoc2l6ZSA8IDE2KQogCQloc2l6ZSA9IDE2Owog CWlmICgoaGFzaHRhYiA9IGNhbGxvYyhESVJfSEFTSF9UQUJfU0laRShoc2l6ZSks IDEpKSA9PSBOVUxMKQpAQCAtOTAyLDYgKzkwMSw3IEBACiAJeGZzX2lub190CQlp bm8sCQkvKiBpbm9kZSAjIHRvIGJlIG1vdmVkICovCiAJaW50CQkJaXNhX2RpcikJ LyogMSBpZiBpbm9kZSBpcyBhIGRpcmVjdG9yeSAqLwogeworCXhmc19pbm9kZV90 CQkqb3JwaGFuYWdlX2lwOwogCXhmc19pbm9fdAkJZW50cnlfaW5vX251bTsKIAl4 ZnNfaW5vZGVfdAkJKmlub19wOwogCXhmc190cmFuc190CQkqdHA7CkBAIC05MTcs NyArOTE3LDkgQEAKIAlmbmFtZWxlbiA9IHNucHJpbnRmKGZuYW1lLCBzaXplb2Yo Zm5hbWUpLCAiJWxsdSIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWlubyk7CiAK LQlBU1NFUlQob3JwaGFuYWdlX2lwICE9IE5VTEwpOworCWVyciA9IGxpYnhmc19p Z2V0KG1wLCBOVUxMLCBvcnBoYW5hZ2VfaW5vLCAwLCAmb3JwaGFuYWdlX2lwLCAw KTsKKwlpZiAoZXJyKQorCQlkb19lcnJvcihfKCIlZCAtIGNvdWxkbid0IGlnZXQg b3JwaGFuYWdlIGlub2RlXG4iKSwgZXJyKTsKIAkvKgogCSAqIE1ha2Ugc3VyZSB0 aGUgZmlsZW5hbWUgaXMgdW5pcXVlIGluIHRoZSBsb3N0K2ZvdW5kCiAJICovCkBA IC0xMDY4LDcgKzEwNzAsNyBAQAogICogUmV0dXJucyB0aGUgZnNibm8gb2YgdGhl IGZpcnN0IChsZWZ0bW9zdCkgYmxvY2sgaW4gdGhlIGRpcmVjdG9yeSBsZWFmLgog ICogc2V0cyAqYm5vIHRvIHRoZSBkaXJlY3RvcnkgYmxvY2sgIyBjb3JyZXNwb25k aW5nIHRvIHRoZSByZXR1cm5lZCBmc2Juby4KICAqLwoteGZzX2Rmc2Jub190Citz dGF0aWMgeGZzX2Rmc2Jub190CiBtYXBfZmlyc3RfZGJsb2NrX2ZzYm5vKHhmc19t b3VudF90CSptcCwKIAkJCXhmc19pbm9fdAlpbm8sCiAJCQl4ZnNfaW5vZGVfdAkq aXAsCkBAIC0xMDg0LDcgKzEwODYsNiBAQAogCWludAkJCWk7CiAJaW50CQkJZXJy b3I7CiAJY2hhcgkJCSpmdHlwZTsKLQl4ZnNfZnNibG9ja190CQlmYmxvY2syOwog CiAJLyoKIAkgKiB0cmF2ZXJzZSBkb3duIGxlZnQtc2lkZSBvZiB0cmVlIHVudGls IHdlIGhpdCB0aGUKQEAgLTExMzIsMTEgKzExMzMsNiBAQAogCWlmIChYRlNfU0Jf VkVSU0lPTl9IQVNESVJWMigmbXAtPm1fc2IpKQogCQlyZXR1cm4oZnNibm8pOwog Ci0JaWYgKGRvX3ByZWZldGNoKSB7Ci0gICAgICAgICAgICAgICAgZmJsb2NrMiA9 IE5VTExGU0JMT0NLOwotICAgICAgICAgICAgICAgIHByZWZldGNoX3A2X2RpcjEo bXAsIGlubywgaXAsIDAsICZmYmxvY2syKTsKLSAgICAgICAgfQotCiAJZG8gewog CQkvKgogCQkgKiB3YWxrIGRvd24gbGVmdCBzaWRlIG9mIGJ0cmVlLCByZWxlYXNl IGJ1ZmZlcnMgYXMgeW91CkBAIC0xMjE5LDcgKzEyMTUsNyBAQAogICoKICAqIHRo aXMgcm91dGluZSBjYW4gTk9UIGJlIGNhbGxlZCBpZiBydW5uaW5nIGluIG5vIG1v ZGlmeSBtb2RlCiAgKi8KLWludAorc3RhdGljIGludAogcHJ1bmVfbGZfZGlyX2Vu dHJ5KHhmc19tb3VudF90ICptcCwgeGZzX2lub190IGlubywgeGZzX2lub2RlX3Qg KmlwLAogCQkJeGZzX2RhaGFzaF90ICpoYXNodmFsKQogewpAQCAtMTQxNCwxNCAr MTQxMCwxMyBAQAogICogcHJvY2VzcyBhIGxlYWYgYmxvY2ssIGFsc28gY2hlY2tz IGZvciAuLiBlbnRyeQogICogYW5kIGNvcnJlY3RzIGl0IHRvIG1hdGNoIHdoYXQg d2UgdGhpbmsgLi4gc2hvdWxkIGJlCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBs Zl9ibG9ja19kaXJfZW50cnlfY2hlY2soeGZzX21vdW50X3QJCSptcCwKIAkJCXhm c19pbm9fdAkJaW5vLAogCQkJeGZzX2Rpcl9sZWFmYmxvY2tfdAkqbGVhZiwKIAkJ CWludAkJCSpkaXJ0eSwKIAkJCWludAkJCSpudW1faWxsZWdhbCwKIAkJCWludAkJ CSpuZWVkX2RvdCwKLQkJCWRpcl9zdGFja190CQkqc3RhY2ssCiAJCQlpbm9fdHJl ZV9ub2RlX3QJCSpjdXJyZW50X2lyZWMsCiAJCQlpbnQJCQljdXJyZW50X2lub19v ZmZzZXQsCiAJCQlkaXJfaGFzaF90YWJfdAkJKmhhc2h0YWIsCkBAIC0xNjE0LDkg KzE2MDksNiBAQAogCQl9IGVsc2UgaWYgKHBhcmVudCA9PSBpbm8pICB7CiAJCQlh ZGRfaW5vZGVfcmVhY2hlZChpcmVjLCBpbm9fb2Zmc2V0KTsKIAkJCWFkZF9pbm9k ZV9yZWYoY3VycmVudF9pcmVjLCBjdXJyZW50X2lub19vZmZzZXQpOwotCi0JCQlp ZiAoIWRvX3ByZWZldGNoICYmICFpc19pbm9kZV9yZWZjaGVja2VkKGxpbm8sIGly ZWMsIGlub19vZmZzZXQpKQotCQkJCXB1c2hfZGlyKHN0YWNrLCBsaW5vKTsKIAkJ fSBlbHNlICB7CiAJCQlqdW5raXQgPSAxOwogCQkJZG9fd2FybigKQEAgLTE2NTAs MTMgKzE2NDIsMTIgQEAKICAqIGhhcHBlbiBpbiBmaWxlIGJsb2Nrcy4gIHRoZSBp bm9kZSBzaXplIGFuZCBvdGhlciBjb3JlIGluZm8KICAqIGlzIGFscmVhZHkgY29y cmVjdCwgaXQncyBqdXN0IHRoZSBsZWFmIGVudHJpZXMgdGhhdCBnZXQgYWx0ZXJl ZC4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGxvbmdmb3JtX2Rpcl9lbnRyeV9j aGVjayh4ZnNfbW91bnRfdAkqbXAsCiAJCQl4ZnNfaW5vX3QJaW5vLAogCQkJeGZz X2lub2RlX3QJKmlwLAogCQkJaW50CQkqbnVtX2lsbGVnYWwsCiAJCQlpbnQJCSpu ZWVkX2RvdCwKLQkJCWRpcl9zdGFja190CSpzdGFjaywKIAkJCWlub190cmVlX25v ZGVfdAkqaXJlYywKIAkJCWludAkJaW5vX29mZnNldCwKIAkJCWRpcl9oYXNoX3Rh Yl90CSpoYXNodGFiKQpAQCAtMTcyMiw3ICsxNzEzLDcgQEAKIAogCQlpZiAoIXNr aXBpdCkKIAkJCWxmX2Jsb2NrX2Rpcl9lbnRyeV9jaGVjayhtcCwgaW5vLCBsZWFm LCAmZGlydHksCi0JCQkJCW51bV9pbGxlZ2FsLCBuZWVkX2RvdCwgc3RhY2ssIGly ZWMsCisJCQkJCW51bV9pbGxlZ2FsLCBuZWVkX2RvdCwgaXJlYywKIAkJCQkJaW5v X29mZnNldCwgaGFzaHRhYiwgZGFfYm5vKTsKIAogCQlkYV9ibm8gPSBJTlRfR0VU KGxlYWYtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCk7CkBAIC0xNzg2LDgg KzE3NzcsNyBAQAogCXhmc19maWxlb2ZmX3QJCWxhc3RibG9jazsKIAl4ZnNfZnNi bG9ja190CQlmaXJzdGJsb2NrOwogCXhmc19ibWFwX2ZyZWVfdAkJZmxpc3Q7Ci0J eGZzX2lub190CQlwYXJlbnRpbm87Ci0JeGZzX2lub2RlX3QJCSpwaXA7CisJeGZz X2lub2RlX3QJCXBpcDsKIAlpbnQJCQlieWhhc2g7CiAJZGlyX2hhc2hfZW50X3QJ CSpwOwogCWludAkJCWNvbW1pdHRlZDsKQEAgLTE4MDIsMTMgKzE3OTIsMTUgQEAK IAogCS8qCiAJICogZmlyc3QgYXR0ZW1wdCB0byBsb2NhdGUgdGhlIHBhcmVudCBp bm9kZSwgaWYgaXQgY2FuJ3QgYmUgZm91bmQsCi0JICogd2UnbGwgdXNlIHRoZSBs b3N0K2ZvdW5kIGlub2RlCisJICogc2V0IGl0IHRvIHRoZSByb290IGlub2RlIGFu ZCBpdCdsbCBiZSBhZGp1c3RlZCBvciBmaXhlZCBsYXRlcgorCSAqIGlmIGluY29y cmVjdCAodGhlIGlub2RlIG51bWJlciBoZXJlIG5lZWRzIHRvIGJlIHZhbGlkIGZv ciB0aGUKKwkgKiBsaWJ4ZnNfZGlyMl9pbml0KCkgY2FsbCkuCiAJICovCiAJYnlo YXNoID0gRElSX0hBU0hfRlVOQyhoYXNodGFiLCBsaWJ4ZnNfZGFfaGFzaG5hbWUo KHVjaGFyX3QqKSIuLiIsIDIpKTsKLQlwYXJlbnRpbm8gPSBvcnBoYW5hZ2VfaW5v OworCXBpcC5pX2lubyA9IG1wLT5tX3NiLnNiX3Jvb3Rpbm87CiAJZm9yIChwID0g aGFzaHRhYi0+YnloYXNoW2J5aGFzaF07IHA7IHAgPSBwLT5uZXh0YnloYXNoKSB7 CiAJCWlmIChwLT5uYW1lbGVuID09IDIgJiYgcC0+bmFtZVswXSA9PSAnLicgJiYg cC0+bmFtZVsxXSA9PSAnLicpIHsKLQkJCXBhcmVudGlubyA9IHAtPmludW07CisJ CQlwaXAuaV9pbm8gPSBwLT5pbnVtOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0x ODI5LDE5ICsxODIxLDYgQEAKIAkJZG9fZXJyb3IoXygieGZzX2JtYXBfbGFzdF9v ZmZzZXQgZmFpbGVkIC0tIGVycm9yIC0gJWRcbiIpLAogCQkJZXJyb3IpOwogCi0J LyogcmUtaW5pdCB0aGUgZGlyZWN0b3J5IHRvIHNob3J0Zm9ybSAqLwotCWlmICgo ZXJyb3IgPSBsaWJ4ZnNfdHJhbnNfaWdldChtcCwgdHAsIHBhcmVudGlubywgMCwg MCwgJnBpcCkpKSB7Ci0JCWRvX3dhcm4oCi0JCV8oImNvdWxkbid0IGlnZXQgcGFy ZW50IGlub2RlICVsbHUgLS0gZXJyb3IgLSAlZFxuIiksCi0JCQlwYXJlbnRpbm8s IGVycm9yKTsKLQkJLyogd2UnbGwgdHJ5IHRvIHVzZSB0aGUgb3JwaGFuYWdlIGlu byB0aGVuICovCi0JCXBhcmVudGlubyA9IG9ycGhhbmFnZV9pbm87Ci0JCWlmICgo ZXJyb3IgPSBsaWJ4ZnNfdHJhbnNfaWdldChtcCwgdHAsIHBhcmVudGlubywgMCwg MCwgJnBpcCkpKQotCQkJZG9fZXJyb3IoCi0JCV8oImNvdWxkbid0IGlnZXQgbG9z dCtmb3VuZCBpbm9kZSAlbGx1IC0tIGVycm9yIC0gJWRcbiIpLAotCQkJCXBhcmVu dGlubywgZXJyb3IpOwotCX0KLQogCS8qIGZyZWUgYWxsIGRhdGEsIGxlYWYsIG5v ZGUgYW5kIGZyZWVzcGFjZSBibG9ja3MgKi8KIAogCWlmICgoZXJyb3IgPSBsaWJ4 ZnNfYnVubWFwaSh0cCwgaXAsIDAsIGxhc3RibG9jaywKQEAgLTE4NTUsNyArMTgz NCw3IEBACiAKIAlBU1NFUlQoZG9uZSk7CiAKLQlsaWJ4ZnNfZGlyMl9pbml0KHRw LCBpcCwgcGlwKTsKKwlsaWJ4ZnNfZGlyMl9pbml0KHRwLCBpcCwgJnBpcCk7CiAK IAllcnJvciA9IGxpYnhmc19ibWFwX2ZpbmlzaCgmdHAsICZmbGlzdCwgZmlyc3Ri bG9jaywgJmNvbW1pdHRlZCk7CiAKQEAgLTE5NzEsNyArMTk1MCw2IEBACiAJeGZz X2lub2RlX3QJCSppcCwKIAlpbnQJCQkqbnVtX2lsbGVnYWwsCiAJaW50CQkJKm5l ZWRfZG90LAotCWRpcl9zdGFja190CQkqc3RhY2ssCiAJaW5vX3RyZWVfbm9kZV90 CQkqY3VycmVudF9pcmVjLAogCWludAkJCWN1cnJlbnRfaW5vX29mZnNldCwKIAl4 ZnNfZGFidWZfdAkJKipicHAsCkBAIC0yMTgyLDYgKzIxNjAsMTcgQEAKIAkJcHRy ICs9IFhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pOwogCQlpbnVt ID0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CiAJCWxhc3Rm cmVlID0gMDsKKwkJLyoKKwkJICogc2tpcCBib2d1cyBlbnRyaWVzIChsZWFkaW5n ICcvJykuICB0aGV5J2xsIGJlIGRlbGV0ZWQKKwkJICogbGF0ZXIuICBtdXN0IHN0 aWxsIGxvZyBpdCwgZWxzZSB3ZSBsZWFrIHJlZmVyZW5jZXMgdG8KKwkJICogYnVm ZmVycy4KKwkJICovCisJCWlmIChkZXAtPm5hbWVbMF0gPT0gJy8nKSAgeworCQkJ bmJhZCsrOworCQkJaWYgKCFub19tb2RpZnkpCisJCQkJbGlieGZzX2RpcjJfZGF0 YV9sb2dfZW50cnkodHAsIGJwLCBkZXApOworCQkJY29udGludWU7CisJCX0KIAog CQlpcmVjID0gZmluZF9pbm9kZV9yZWMoWEZTX0lOT19UT19BR05PKG1wLCBpbnVt KSwKIAkJCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgaW51bSkpOwpAQCAtMjI1Miwx NyArMjI0MSw3IEBACiAJCQl9CiAJCQljb250aW51ZTsKIAkJfQotCQkvKgotCQkg KiBza2lwIGJvZ3VzIGVudHJpZXMgKGxlYWRpbmcgJy8nKS4gIHRoZXknbGwgYmUg ZGVsZXRlZAotCQkgKiBsYXRlci4gIG11c3Qgc3RpbGwgbG9nIGl0LCBlbHNlIHdl IGxlYWsgcmVmZXJlbmNlcyB0bwotCQkgKiBidWZmZXJzLgotCQkgKi8KLQkJaWYg KGRlcC0+bmFtZVswXSA9PSAnLycpICB7Ci0JCQluYmFkKys7Ci0JCQlpZiAoIW5v X21vZGlmeSkKLQkJCQlsaWJ4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAs IGRlcCk7Ci0JCQljb250aW51ZTsKLQkJfQorCiAJCWp1bmtpdCA9IDA7CiAJCWJj b3B5KGRlcC0+bmFtZSwgZm5hbWUsIGRlcC0+bmFtZWxlbik7CiAJCWZuYW1lW2Rl cC0+bmFtZWxlbl0gPSAnXDAnOwpAQCAtMjMyMiw4ICsyMzAxLDYgQEAKIAkJfSBl bHNlIGlmIChwYXJlbnQgPT0gaXAtPmlfaW5vKSAgewogCQkJYWRkX2lub2RlX3Jl YWNoZWQoaXJlYywgaW5vX29mZnNldCk7CiAJCQlhZGRfaW5vZGVfcmVmKGN1cnJl bnRfaXJlYywgY3VycmVudF9pbm9fb2Zmc2V0KTsKLQkJCWlmICghZG9fcHJlZmV0 Y2ggJiYgIWlzX2lub2RlX3JlZmNoZWNrZWQoaW51bSwgaXJlYywgaW5vX29mZnNl dCkpCi0JCQkJcHVzaF9kaXIoc3RhY2ssIGludW0pOwogCQl9IGVsc2UgIHsKIAkJ CWp1bmtpdCA9IDE7CiAJCQlkb193YXJuKApAQCAtMjM2MCw3ICsyMzM3LDcgQEAK IC8qCiAgKiBDaGVjayBjb250ZW50cyBvZiBsZWFmLWZvcm0gYmxvY2suCiAgKi8K LWludAorc3RhdGljIGludAogbG9uZ2Zvcm1fZGlyMl9jaGVja19sZWFmKAogCXhm c19tb3VudF90CQkqbXAsCiAJeGZzX2lub2RlX3QJCSppcCwKQEAgLTI0MjcsNyAr MjQwNCw3IEBACiAgKiBDaGVjayBjb250ZW50cyBvZiB0aGUgbm9kZSBibG9ja3Mg KGxlYXZlcykKICAqIExvb2tzIGZvciBtYXRjaGluZyBoYXNoIHZhbHVlcyBmb3Ig dGhlIGRhdGEgZW50cmllcy4KICAqLwotaW50CitzdGF0aWMgaW50CiBsb25nZm9y bV9kaXIyX2NoZWNrX25vZGUoCiAJeGZzX21vdW50X3QJCSptcCwKIAl4ZnNfaW5v ZGVfdAkJKmlwLApAQCAtMjU2MCwxMyArMjUzNywxMiBAQAogICogZGVzdHJveSB0 aGUgZW50cnkgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCByZWNvdmVyZWQgbmFt ZS9pbm9kZSBwYWlycy4KICAqIChpZS4gZ2V0IGxpYnhmcyB0byBkbyBhbGwgdGhl IGdydW50IHdvcmspCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBsb25nZm9ybV9k aXIyX2VudHJ5X2NoZWNrKHhmc19tb3VudF90CSptcCwKIAkJCXhmc19pbm9fdAlp bm8sCiAJCQl4ZnNfaW5vZGVfdAkqaXAsCiAJCQlpbnQJCSpudW1faWxsZWdhbCwK IAkJCWludAkJKm5lZWRfZG90LAotCQkJZGlyX3N0YWNrX3QJKnN0YWNrLAogCQkJ aW5vX3RyZWVfbm9kZV90CSppcmVjLAogCQkJaW50CQlpbm9fb2Zmc2V0LAogCQkJ ZGlyX2hhc2hfdGFiX3QJKmhhc2h0YWIpCkBAIC0yNjA2LDkgKzI1ODIsNiBAQAog CWxpYnhmc19kaXIyX2lzYmxvY2soTlVMTCwgaXAsICZpc2Jsb2NrKTsKIAlsaWJ4 ZnNfZGlyMl9pc2xlYWYoTlVMTCwgaXAsICZpc2xlYWYpOwogCi0JaWYgKGRvX3By ZWZldGNoICYmICFpc2Jsb2NrKQotCQlwcmVmZXRjaF9wNl9kaXIyKG1wLCBpcCk7 Ci0KIAkvKiBjaGVjayBkaXJlY3RvcnkgImRhdGEiIGJsb2NrcyAoaWUuIG5hbWUv aW5vZGUgcGFpcnMpICovCiAJZm9yIChkYV9ibm8gPSAwLCBuZXh0X2RhX2JubyA9 IDA7CiAJICAgICBuZXh0X2RhX2JubyAhPSBOVUxMRklMRU9GRiAmJiBkYV9ibm8g PCBtcC0+bV9kaXJsZWFmYmxrOwpAQCAtMjYzNSw3ICsyNjA4LDcgQEAKIAkJCWNv bnRpbnVlOwkvKiB0cnkgYW5kIHJlYWQgYWxsICJkYXRhIiBibG9ja3MgKi8KIAkJ fQogCQlsb25nZm9ybV9kaXIyX2VudHJ5X2NoZWNrX2RhdGEobXAsIGlwLCBudW1f aWxsZWdhbCwgbmVlZF9kb3QsCi0JCQkJc3RhY2ssIGlyZWMsIGlub19vZmZzZXQs ICZicGxpc3RbZGJdLCBoYXNodGFiLAorCQkJCWlyZWMsIGlub19vZmZzZXQsICZi cGxpc3RbZGJdLCBoYXNodGFiLAogCQkJCSZmcmVldGFiLCBkYV9ibm8sIGlzYmxv Y2spOwogCX0KIAlmaXhpdCA9ICgqbnVtX2lsbGVnYWwgIT0gMCkgfHwgZGlyMl9p c19iYWRpbm8oaW5vKTsKQEAgLTI2NzYsMTIgKzI2NDksMTEgQEAKICAqIHNob3J0 Zm9ybSBkaXJlY3RvcnkgcHJvY2Vzc2luZyByb3V0aW5lcyAtLSBlbnRyeSB2ZXJp ZmljYXRpb24gYW5kCiAgKiBiYWQgZW50cnkgZGVsZXRpb24gKHBydW5pbmcpLgog ICovCi12b2lkCitzdGF0aWMgdm9pZAogc2hvcnRmb3JtX2Rpcl9lbnRyeV9jaGVj ayh4ZnNfbW91bnRfdAkqbXAsCiAJCQl4ZnNfaW5vX3QJaW5vLAogCQkJeGZzX2lu b2RlX3QJKmlwLAogCQkJaW50CQkqaW5vX2RpcnR5LAotCQkJZGlyX3N0YWNrX3QJ KnN0YWNrLAogCQkJaW5vX3RyZWVfbm9kZV90CSpjdXJyZW50X2lyZWMsCiAJCQlp bnQJCWN1cnJlbnRfaW5vX29mZnNldCwKIAkJCWRpcl9oYXNoX3RhYl90CSpoYXNo dGFiKQpAQCAtMjg2OCwxMCArMjg0MCw2IEBACiAJCQl9IGVsc2UgaWYgKHBhcmVu dCA9PSBpbm8pICB7CiAJCQkJYWRkX2lub2RlX3JlYWNoZWQoaXJlYywgaW5vX29m ZnNldCk7CiAJCQkJYWRkX2lub2RlX3JlZihjdXJyZW50X2lyZWMsIGN1cnJlbnRf aW5vX29mZnNldCk7Ci0KLQkJCQlpZiAoIWRvX3ByZWZldGNoICYmICFpc19pbm9k ZV9yZWZjaGVja2VkKGxpbm8sIGlyZWMsCi0JCQkJCQlpbm9fb2Zmc2V0KSkKLQkJ CQkJcHVzaF9kaXIoc3RhY2ssIGxpbm8pOwogCQkJfSBlbHNlICB7CiAJCQkJanVu a2l0ID0gMTsKIAkJCQlkb193YXJuKF8oImVudHJ5IFwiJXNcIiBpbiBkaXIgJWxs dSBub3QgIgpAQCAtMjk2NCw3ICsyOTMyLDcgQEAKIH0KIAogLyogQVJHU1VTRUQg Ki8KLXZvaWQKK3N0YXRpYyB2b2lkCiBwcnVuZV9zZl9kaXJfZW50cnkoeGZzX21v dW50X3QgKm1wLCB4ZnNfaW5vX3QgaW5vLCB4ZnNfaW5vZGVfdCAqaXApCiB7CiAJ CQkJLyogUkVGRVJFTkNFRCAqLwpAQCAtMzA2MSwxMiArMzAyOSwxMSBAQAogICog c2hvcnRmb3JtIGRpcmVjdG9yeSB2MiBwcm9jZXNzaW5nIHJvdXRpbmVzIC0tIGVu dHJ5IHZlcmlmaWNhdGlvbiBhbmQKICAqIGJhZCBlbnRyeSBkZWxldGlvbiAocHJ1 bmluZykuCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBzaG9ydGZvcm1fZGlyMl9l bnRyeV9jaGVjayh4ZnNfbW91bnRfdAkqbXAsCiAJCQl4ZnNfaW5vX3QJaW5vLAog CQkJeGZzX2lub2RlX3QJKmlwLAogCQkJaW50CQkqaW5vX2RpcnR5LAotCQkJZGly X3N0YWNrX3QJKnN0YWNrLAogCQkJaW5vX3RyZWVfbm9kZV90CSpjdXJyZW50X2ly ZWMsCiAJCQlpbnQJCWN1cnJlbnRfaW5vX29mZnNldCwKIAkJCWRpcl9oYXNoX3Rh Yl90CSpoYXNodGFiKQpAQCAtMzI2MywxMCArMzIzMCw2IEBACiAJCQl9IGVsc2Ug aWYgKHBhcmVudCA9PSBpbm8pICB7CiAJCQkJYWRkX2lub2RlX3JlYWNoZWQoaXJl YywgaW5vX29mZnNldCk7CiAJCQkJYWRkX2lub2RlX3JlZihjdXJyZW50X2lyZWMs IGN1cnJlbnRfaW5vX29mZnNldCk7Ci0KLQkJCQlpZiAoIWRvX3ByZWZldGNoICYm ICFpc19pbm9kZV9yZWZjaGVja2VkKGxpbm8sIGlyZWMsCi0JCQkJCQlpbm9fb2Zm c2V0KSkKLQkJCQkJcHVzaF9kaXIoc3RhY2ssIGxpbm8pOwogCQkJfSBlbHNlICB7 CiAJCQkJanVua2l0ID0gMTsKIAkJCQlkb193YXJuKF8oImVudHJ5IFwiJXNcIiBp biBkaXJlY3RvcnkgaW5vZGUgJWxsdSIKQEAgLTMzNzcsODcgKzMzNDAsNzggQEAK IH0KIAogLyoKLSAqIHByb2Nlc3NlcyBhbGwgZGlyZWN0b3JpZXMgcmVhY2hhYmxl IHZpYSB0aGUgaW5vZGVzIG9uIHRoZSBzdGFjawotICogcmV0dXJucyAwIGlmIHRo aW5ncyBhcmUgZ29vZCwgMSBpZiB0aGVyZSdzIGEgcHJvYmxlbQorICogcHJvY2Vz c2VzIGFsbCByZWFjaGFibGUgaW5vZGVzIGluIGRpcmVjdG9yaWVzCiAgKi8KLXZv aWQKLXByb2Nlc3NfZGlyc3RhY2soeGZzX21vdW50X3QgKm1wLCBkaXJfc3RhY2tf dCAqc3RhY2spCitzdGF0aWMgdm9pZAorcHJvY2Vzc19kaXJfaW5vZGUoCisJeGZz X21vdW50X3QgCQkqbXAsCisJeGZzX2lub190CQlpbm8sCisJaW5vX3RyZWVfbm9k ZV90CQkqaXJlYywKKwlpbnQJCQlpbm9fb2Zmc2V0KQogewogCXhmc19ibWFwX2Zy ZWVfdAkJZmxpc3Q7CiAJeGZzX2ZzYmxvY2tfdAkJZmlyc3Q7Ci0JeGZzX2lub190 CQlpbm87CiAJeGZzX2lub2RlX3QJCSppcDsKIAl4ZnNfdHJhbnNfdAkJKnRwOwog CXhmc19kYWhhc2hfdAkJaGFzaHZhbDsKLQlpbm9fdHJlZV9ub2RlX3QJCSppcmVj OwogCWRpcl9oYXNoX3RhYl90CQkqaGFzaHRhYjsKLQlpbnQJCQlpbm9fb2Zmc2V0 LCBuZWVkX2RvdCwgY29tbWl0dGVkOworCWludAkJCW5lZWRfZG90LCBjb21taXR0 ZWQ7CiAJaW50CQkJZGlydHksIG51bV9pbGxlZ2FsLCBlcnJvciwgbnJlczsKIAog CS8qCi0JICogcHVsbCBkaXJlY3RvcnkgaW5vZGUgIyBvZmYgZGlyZWN0b3J5IHN0 YWNrCi0JICoKIAkgKiBvcGVuIHVwIGRpcmVjdG9yeSBpbm9kZSwgY2hlY2sgYWxs IGVudHJpZXMsCiAJICogdGhlbiBjYWxsIHBydW5lX2Rpcl9lbnRyaWVzIHRvIHJl bW92ZSBhbGwKIAkgKiByZW1haW5pbmcgaWxsZWdhbCBkaXJlY3RvcnkgZW50cmll cy4KIAkgKi8KIAotCXdoaWxlICgoaW5vID0gcG9wX2RpcihzdGFjaykpICE9IE5V TExGU0lOTykgIHsKLQkJaXJlYyA9IGZpbmRfaW5vZGVfcmVjKFhGU19JTk9fVE9f QUdOTyhtcCwgaW5vKSwKLQkJCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgaW5vKSk7 Ci0JCUFTU0VSVChpcmVjICE9IE5VTEwpOwotCi0JCWlub19vZmZzZXQgPSBYRlNf SU5PX1RPX0FHSU5PKG1wLCBpbm8pIC0gaXJlYy0+aW5vX3N0YXJ0bnVtOwotCi0J CUFTU0VSVCghaXNfaW5vZGVfcmVmY2hlY2tlZChpbm8sIGlyZWMsIGlub19vZmZz ZXQpKTsKLQotCQlpZiAoKGVycm9yID0gbGlieGZzX2lnZXQobXAsIE5VTEwsIGlu bywgMCwgJmlwLCAwKSkpIHsKLQkJCWlmICghbm9fbW9kaWZ5KQotCQkJCWRvX2Vy cm9yKAotCQkJCV8oImNvdWxkbid0IG1hcCBpbm9kZSAlbGx1LCBlcnIgPSAlZFxu IiksCi0JCQkJCWlubywgZXJyb3IpOwotCQkJZWxzZSAgewotCQkJCWRvX3dhcm4o Ci0JCQkJXygiY291bGRuJ3QgbWFwIGlub2RlICVsbHUsIGVyciA9ICVkXG4iKSwK LQkJCQkJaW5vLCBlcnJvcik7Ci0JCQkJLyoKLQkJCQkgKiBzZWUgYmVsb3cgZm9y IHdoYXQgd2UncmUgZG9pbmcgaWYgdGhpcwotCQkJCSAqIGlzIHJvb3QuICBXaHkg ZG8gd2UgbmVlZCB0byBkbyB0aGlzIGhlcmU/Ci0JCQkJICogdG8gZW5zdXJlIHRo YXQgdGhlIHJvb3QgZG9lc24ndCBzaG93IHVwCi0JCQkJICogYXMgYmVpbmcgZGlz Y29ubmVjdGVkIGluIHRoZSBub19tb2RpZnkgY2FzZS4KLQkJCQkgKi8KLQkJCQlp ZiAobXAtPm1fc2Iuc2Jfcm9vdGlubyA9PSBpbm8pICB7Ci0JCQkJCWFkZF9pbm9k ZV9yZWFjaGVkKGlyZWMsIDApOwotCQkJCQlhZGRfaW5vZGVfcmVmKGlyZWMsIDAp OwotCQkJCX0KLQkJCX0KKwlBU1NFUlQoIWlzX2lub2RlX3JlZmNoZWNrZWQoaW5v LCBpcmVjLCBpbm9fb2Zmc2V0KSk7CiAKLQkJCWFkZF9pbm9kZV9yZWZjaGVja2Vk KGlubywgaXJlYywgMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCW5lZWRfZG90 ID0gZGlydHkgPSBudW1faWxsZWdhbCA9IDA7Ci0KLQkJaWYgKG1wLT5tX3NiLnNi X3Jvb3Rpbm8gPT0gaW5vKSAgeworCWVycm9yID0gbGlieGZzX2lnZXQobXAsIE5V TEwsIGlubywgMCwgJmlwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKCFub19t b2RpZnkpCisJCQlkb19lcnJvcihfKCJjb3VsZG4ndCBtYXAgaW5vZGUgJWxsdSwg ZXJyID0gJWRcbiIpLAorCQkJCWlubywgZXJyb3IpOworCQllbHNlICB7CisJCQlk b193YXJuKF8oImNvdWxkbid0IG1hcCBpbm9kZSAlbGx1LCBlcnIgPSAlZFxuIiks CisJCQkJaW5vLCBlcnJvcik7CiAJCQkvKgotCQkJICogbWFyayByb290IGlub2Rl IHJlYWNoZWQgYW5kIGJ1bXAgdXAKLQkJCSAqIGxpbmsgY291bnQgZm9yIHJvb3Qg aW5vZGUgdG8gYWNjb3VudAotCQkJICogZm9yICcuLicgZW50cnkgc2luY2UgdGhl IHJvb3QgaW5vZGUgaXMKLQkJCSAqIG5ldmVyIHJlYWNoZWQgYnkgYSBwYXJlbnQu ICB3ZSBrbm93Ci0JCQkgKiB0aGF0IHJvb3QncyAnLi4nIGlzIGFsd2F5cyBnb29k IC0tCi0JCQkgKiBndWFyYW50ZWVkIGJ5IHBoYXNlIDMgYW5kL29yIGJlbG93Lgor CQkJICogc2VlIGJlbG93IGZvciB3aGF0IHdlJ3JlIGRvaW5nIGlmIHRoaXMKKwkJ CSAqIGlzIHJvb3QuICBXaHkgZG8gd2UgbmVlZCB0byBkbyB0aGlzIGhlcmU/CisJ CQkgKiB0byBlbnN1cmUgdGhhdCB0aGUgcm9vdCBkb2Vzbid0IHNob3cgdXAKKwkJ CSAqIGFzIGJlaW5nIGRpc2Nvbm5lY3RlZCBpbiB0aGUgbm9fbW9kaWZ5IGNhc2Uu CiAJCQkgKi8KLQkJCWFkZF9pbm9kZV9yZWFjaGVkKGlyZWMsIGlub19vZmZzZXQp OworCQkJaWYgKG1wLT5tX3NiLnNiX3Jvb3Rpbm8gPT0gaW5vKSAgeworCQkJCWFk ZF9pbm9kZV9yZWFjaGVkKGlyZWMsIDApOworCQkJCWFkZF9pbm9kZV9yZWYoaXJl YywgMCk7CisJCQl9CiAJCX0KIAotCQlhZGRfaW5vZGVfcmVmY2hlY2tlZChpbm8s IGlyZWMsIGlub19vZmZzZXQpOworCQlhZGRfaW5vZGVfcmVmY2hlY2tlZChpbm8s IGlyZWMsIDApOworCQlyZXR1cm47CisJfQogCi0JCWhhc2h0YWIgPSBkaXJfaGFz aF9pbml0KGlwLT5pX2QuZGlfc2l6ZSk7CisJbmVlZF9kb3QgPSBkaXJ0eSA9IG51 bV9pbGxlZ2FsID0gMDsKIAorCWlmIChtcC0+bV9zYi5zYl9yb290aW5vID09IGlu bykgIHsKIAkJLyoKLQkJICogbG9vayBmb3IgYm9ndXMgZW50cmllcworCQkgKiBt YXJrIHJvb3QgaW5vZGUgcmVhY2hlZCBhbmQgYnVtcCB1cAorCQkgKiBsaW5rIGNv dW50IGZvciByb290IGlub2RlIHRvIGFjY291bnQKKwkJICogZm9yICcuLicgZW50 cnkgc2luY2UgdGhlIHJvb3QgaW5vZGUgaXMKKwkJICogbmV2ZXIgcmVhY2hlZCBi eSBhIHBhcmVudC4gIHdlIGtub3cKKwkJICogdGhhdCByb290J3MgJy4uJyBpcyBh bHdheXMgZ29vZCAtLQorCQkgKiBndWFyYW50ZWVkIGJ5IHBoYXNlIDMgYW5kL29y IGJlbG93LgogCQkgKi8KLQkJc3dpdGNoIChpcC0+aV9kLmRpX2Zvcm1hdCkgIHsK KwkJYWRkX2lub2RlX3JlYWNoZWQoaXJlYywgaW5vX29mZnNldCk7CisJfQorCisJ YWRkX2lub2RlX3JlZmNoZWNrZWQoaW5vLCBpcmVjLCBpbm9fb2Zmc2V0KTsKKwor CWhhc2h0YWIgPSBkaXJfaGFzaF9pbml0KGlwLT5pX2QuZGlfc2l6ZSk7CisKKwkv KgorCSAqIGxvb2sgZm9yIGJvZ3VzIGVudHJpZXMKKwkgKi8KKwlzd2l0Y2ggKGlw LT5pX2QuZGlfZm9ybWF0KSAgewogCQljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVO VFM6CiAJCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CiAJCQkvKgpAQCAtMzQ2 OSwxNiArMzQyMywxNSBAQAogCQkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0RJUlYy KCZtcC0+bV9zYikpCiAJCQkJbG9uZ2Zvcm1fZGlyMl9lbnRyeV9jaGVjayhtcCwg aW5vLCBpcCwKIAkJCQkJCQkmbnVtX2lsbGVnYWwsICZuZWVkX2RvdCwKLQkJCQkJ CQlzdGFjaywgaXJlYywKLQkJCQkJCQlpbm9fb2Zmc2V0LAorCQkJCQkJCWlyZWMs IGlub19vZmZzZXQsCiAJCQkJCQkJaGFzaHRhYik7CiAJCQllbHNlCiAJCQkJbG9u Z2Zvcm1fZGlyX2VudHJ5X2NoZWNrKG1wLCBpbm8sIGlwLAogCQkJCQkJCSZudW1f aWxsZWdhbCwgJm5lZWRfZG90LAotCQkJCQkJCXN0YWNrLCBpcmVjLAotCQkJCQkJ CWlub19vZmZzZXQsCisJCQkJCQkJaXJlYywgaW5vX29mZnNldCwKIAkJCQkJCQlo YXNodGFiKTsKIAkJCWJyZWFrOworCiAJCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9D QUw6CiAJCQl0cCA9IGxpYnhmc190cmFuc19hbGxvYyhtcCwgMCk7CiAJCQkvKgpA QCAtMzUwMCw1MiArMzQ1MywxNjcgQEAKIAogCQkJaWYgKFhGU19TQl9WRVJTSU9O X0hBU0RJUlYyKCZtcC0+bV9zYikpCiAJCQkJc2hvcnRmb3JtX2RpcjJfZW50cnlf Y2hlY2sobXAsIGlubywgaXAsICZkaXJ0eSwKLQkJCQkJCQlzdGFjaywgaXJlYywK LQkJCQkJCQlpbm9fb2Zmc2V0LAorCQkJCQkJCWlyZWMsIGlub19vZmZzZXQsCiAJ CQkJCQkJaGFzaHRhYik7CiAJCQllbHNlCiAJCQkJc2hvcnRmb3JtX2Rpcl9lbnRy eV9jaGVjayhtcCwgaW5vLCBpcCwgJmRpcnR5LAotCQkJCQkJCXN0YWNrLCBpcmVj LAotCQkJCQkJCWlub19vZmZzZXQsCisJCQkJCQkJaXJlYywgaW5vX29mZnNldCwK IAkJCQkJCQloYXNodGFiKTsKIAogCQkJQVNTRVJUKGRpcnR5ID09IDAgfHwgKGRp cnR5ICYmICFub19tb2RpZnkpKTsKIAkJCWlmIChkaXJ0eSkgIHsKIAkJCQlsaWJ4 ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwKIAkJCQkJWEZTX0lMT0dfQ09SRSB8 IFhGU19JTE9HX0REQVRBKTsKLQkJCQlsaWJ4ZnNfdHJhbnNfY29tbWl0KHRwLCBY RlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTCi0JCQkJCQl8WEZTX1RSQU5TX1NZTkMs IDApOworCQkJCWxpYnhmc190cmFuc19jb21taXQodHAsCisJCQkJCVhGU19UUkFO U19SRUxFQVNFX0xPR19SRVMgfAorCQkJCQlYRlNfVFJBTlNfU1lOQywgMCk7CiAJ CQl9IGVsc2UgIHsKLQkJCQlsaWJ4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJB TlNfUkVMRUFTRV9MT0dfUkVTKTsKKwkJCQlsaWJ4ZnNfdHJhbnNfY2FuY2VsKHRw LAorCQkJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTKTsKIAkJCX0KIAkJCWJy ZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKLQkJfQotCQlkaXJfaGFzaF9k b25lKGhhc2h0YWIpOworCX0KKwlkaXJfaGFzaF9kb25lKGhhc2h0YWIpOworCisJ aGFzaHZhbCA9IDA7CisKKwkvKgorCSAqIGlmIHdlIGhhdmUgdG8gY3JlYXRlIGEg Li4gZm9yIC8sIGRvIGl0IG5vdyAqYmVmb3JlKgorCSAqIHdlIGRlbGV0ZSB0aGUg Ym9ndXMgZW50cmllcywgb3RoZXJ3aXNlIHRoZSBkaXJlY3RvcnkKKwkgKiBjb3Vs ZCB0cmFuc2Zvcm0gaW50byBhIHNob3J0Zm9ybSBkaXIgd2hpY2ggd291bGQKKwkg KiBwcm9iYWJseSBjYXVzZSB0aGUgc2ltdWxhdGlvbiB0byBjaG9rZS4gIEV2ZW4K KwkgKiBpZiB0aGUgaWxsZWdhbCBlbnRyaWVzIGdldCBzaGlmdGVkIGFyb3VuZCwg aXQncyBvaworCSAqIGJlY2F1c2UgdGhlIGVudHJpZXMgYXJlIHN0cnVjdHVyYWxs eSBpbnRhY3QgYW5kIGluCisJICogaW4gaGFzaC12YWx1ZSBvcmRlciBzbyB0aGUg c2ltdWxhdGlvbiB3b24ndCBnZXQgY29uZnVzZWQKKwkgKiBpZiBpdCBoYXMgdG8g bW92ZSB0aGVtIGFyb3VuZC4KKwkgKi8KKwlpZiAoIW5vX21vZGlmeSAmJiBuZWVk X3Jvb3RfZG90ZG90ICYmIGlubyA9PSBtcC0+bV9zYi5zYl9yb290aW5vKSAgewor CQlBU1NFUlQoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9D QUwpOwogCi0JCWhhc2h2YWwgPSAwOworCQlkb193YXJuKF8oInJlY3JlYXRpbmcg cm9vdCBkaXJlY3RvcnkgLi4gZW50cnlcbiIpKTsKKworCQl0cCA9IGxpYnhmc190 cmFuc19hbGxvYyhtcCwgMCk7CisJCUFTU0VSVCh0cCAhPSBOVUxMKTsKKworCQlu cmVzID0gWEZTX01LRElSX1NQQUNFX1JFUyhtcCwgMik7CisJCWVycm9yID0gbGli eGZzX3RyYW5zX3Jlc2VydmUodHAsIG5yZXMsIFhGU19NS0RJUl9MT0dfUkVTKG1w KSwKKwkJCQkwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfTUtESVJfTE9H X0NPVU5UKTsKKwkJaWYgKGVycm9yKQorCQkJcmVzX2ZhaWxlZChlcnJvcik7CisK KwkJbGlieGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CisJCWxpYnhmc190cmFu c19paG9sZCh0cCwgaXApOworCisJCVhGU19CTUFQX0lOSVQoJmZsaXN0LCAmZmly c3QpOworCisJCWVycm9yID0gZGlyX2NyZWF0ZW5hbWUobXAsIHRwLCBpcCwgIi4u IiwgMiwgaXAtPmlfaW5vLCAmZmlyc3QsCisJCQkJJmZsaXN0LCBucmVzKTsKKwkJ aWYgKGVycm9yKQorCQkJZG9fZXJyb3IoXygiY2FuJ3QgbWFrZSBcIi4uXCIgZW50 cnkgaW4gcm9vdCBpbm9kZSAiCisJCQkJIiVsbHUsIGNyZWF0ZW5hbWUgZXJyb3Ig JWRcbiIpLCBpbm8sIGVycm9yKTsKKworCQlsaWJ4ZnNfdHJhbnNfbG9nX2lub2Rl KHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKKwkJZXJyb3IgPSBsaWJ4ZnNfYm1h cF9maW5pc2goJnRwLCAmZmxpc3QsIGZpcnN0LCAmY29tbWl0dGVkKTsKKwkJQVNT RVJUKGVycm9yID09IDApOworCQlsaWJ4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNf VFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQlYRlNfVFJBTlNfU1lOQywgMCk7 CisKKwkJbmVlZF9yb290X2RvdGRvdCA9IDA7CisJfSBlbHNlIGlmIChuZWVkX3Jv b3RfZG90ZG90ICYmIGlubyA9PSBtcC0+bV9zYi5zYl9yb290aW5vKSAgeworCQlk b193YXJuKF8oIndvdWxkIHJlY3JlYXRlIHJvb3QgZGlyZWN0b3J5IC4uIGVudHJ5 XG4iKSk7CisJfQorCisJLyoKKwkgKiBkZWxldGUgYW55IGlsbGVnYWwgZW50cmll cyAtLSB3aGljaCBzaG91bGQgb25seSBleGlzdAorCSAqIGlmIHRoZSBkaXJlY3Rv cnkgaXMgYSBsb25nZm9ybSBkaXJlY3RvcnkuICBib2d1cworCSAqIHNob3J0Zm9y bSBkaXJlY3RvcnkgZW50cmllcyB3ZXJlIGRlbGV0ZWQgaW4gcGhhc2UgNC4KKwkg Ki8KKwlpZiAoIW5vX21vZGlmeSAmJiBudW1faWxsZWdhbCA+IDApICB7CisJCUFT U0VSVChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCk7 CisJCUFTU0VSVCghWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoJm1wLT5tX3NiKSk7 CisKKwkJd2hpbGUgKG51bV9pbGxlZ2FsID4gMCAmJiBpcC0+aV9kLmRpX2Zvcm1h dCAhPQorCQkJCVhGU19ESU5PREVfRk1UX0xPQ0FMKSAgeworCQkJcHJ1bmVfbGZf ZGlyX2VudHJ5KG1wLCBpbm8sIGlwLCAmaGFzaHZhbCk7CisJCQludW1faWxsZWdh bC0tOworCQl9CiAKIAkJLyoKLQkJICogaWYgd2UgaGF2ZSB0byBjcmVhdGUgYSAu LiBmb3IgLywgZG8gaXQgbm93ICpiZWZvcmUqCi0JCSAqIHdlIGRlbGV0ZSB0aGUg Ym9ndXMgZW50cmllcywgb3RoZXJ3aXNlIHRoZSBkaXJlY3RvcnkKLQkJICogY291 bGQgdHJhbnNmb3JtIGludG8gYSBzaG9ydGZvcm0gZGlyIHdoaWNoIHdvdWxkCi0J CSAqIHByb2JhYmx5IGNhdXNlIHRoZSBzaW11bGF0aW9uIHRvIGNob2tlLiAgRXZl bgotCQkgKiBpZiB0aGUgaWxsZWdhbCBlbnRyaWVzIGdldCBzaGlmdGVkIGFyb3Vu ZCwgaXQncyBvawotCQkgKiBiZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBzdHJ1Y3R1 cmFsbHkgaW50YWN0IGFuZCBpbgotCQkgKiBpbiBoYXNoLXZhbHVlIG9yZGVyIHNv IHRoZSBzaW11bGF0aW9uIHdvbid0IGdldCBjb25mdXNlZAotCQkgKiBpZiBpdCBo YXMgdG8gbW92ZSB0aGVtIGFyb3VuZC4KLQkJICovCi0JCWlmICghbm9fbW9kaWZ5 ICYmIG5lZWRfcm9vdF9kb3Rkb3QgJiYKLQkJCQlpbm8gPT0gbXAtPm1fc2Iuc2Jf cm9vdGlubykgIHsKLQkJCUFTU0VSVChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNf RElOT0RFX0ZNVF9MT0NBTCk7CisJCSogaGFuZGxlIGNhc2Ugd2hlcmUgd2UndmUg ZGVsZXRlZCBzbyBtYW55CisJCSogZW50cmllcyB0aGF0IHRoZSBkaXJlY3Rvcnkg aGFzIGNoYW5nZWQgZnJvbQorCQkqIGEgbG9uZ2Zvcm0gdG8gYSBzaG9ydGZvcm0g ZGlyZWN0b3J5LiAgaGF2ZQorCQkqIHRvIGFsbG9jYXRlIGEgdHJhbnNhY3Rpb24g c2luY2Ugd2UncmUgd29ya2luZworCQkqIHdpdGggdGhlIGluY29yZSBkYXRhIGZv cmsuCisJCSovCisJCWlmIChudW1faWxsZWdhbCA+IDApICB7CisJCQlBU1NFUlQo aXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpOworCQkJ dHAgPSBsaWJ4ZnNfdHJhbnNfYWxsb2MobXAsIDApOworCQkJLyoKKwkJCSogdXNp bmcgdGhlIHJlbW92ZSByZXNlcnZhdGlvbiBpcyBvdmVya2lsbAorCQkJKiBzaW5j ZSBhdCBtb3N0IHdlJ2xsIG9ubHkgbmVlZCB0byBsb2cgdGhlCisJCQkqIGlub2Rl IGJ1dCBpdCdzIGVhc2llciB0aGFuIHdlZGdpbmcgYQorCQkJKiBuZXcgZGVmaW5l IGluIG91cnNlbHZlcy4gIDEwIGJsb2NrIGZzCisJCQkqIHNwYWNlIHJlc2VydmF0 aW9uIGlzIGFsc28gb3ZlcmtpbGwgYnV0CisJCQkqIHdoYXQgdGhlIGhlY2suLi4K KwkJCSovCisJCQlucmVzID0gWEZTX1JFTU9WRV9TUEFDRV9SRVMobXApOworCQkJ ZXJyb3IgPSBsaWJ4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgbnJlcywKKwkJCQkJWEZT X1JFTU9WRV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkJWEZTX1RSQU5TX1BFUk1fTE9H X1JFUywKKwkJCQkJWEZTX1JFTU9WRV9MT0dfQ09VTlQpOworCQkJaWYgKGVycm9y KQorCQkJCXJlc19mYWlsZWQoZXJyb3IpOwogCi0JCQlkb193YXJuKF8oInJlY3Jl YXRpbmcgcm9vdCBkaXJlY3RvcnkgLi4gZW50cnlcbiIpKTsKKwkJCWxpYnhmc190 cmFuc19pam9pbih0cCwgaXAsIDApOworCQkJbGlieGZzX3RyYW5zX2lob2xkKHRw LCBpcCk7CisKKwkJCXBydW5lX3NmX2Rpcl9lbnRyeShtcCwgaW5vLCBpcCk7CisK KwkJCWxpYnhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLAorCQkJCQlYRlNfSUxP R19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworCQkJQVNTRVJUKGVycm9yID09IDAp OworCQkJbGlieGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0Vf TE9HX1JFUworCQkJCQl8WEZTX1RSQU5TX1NZTkMsIDApOworCQl9CisJfQorCisJ LyoKKwkgKiBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgJy4nIGVudHJ5LCBkbyBz byBvbmx5IGlmCisJICogdGhlIGRpcmVjdG9yeSBpcyBhIGxvbmdmb3JtIGRpci4g IGl0IGl0J3MgYmVlbgorCSAqIHR1cm5lZCBpbnRvIGEgc2hvcnRmb3JtIGRpciwg dGhlbiB0aGUgaW5vZGUgaXMgb2sKKwkgKiBzaW5jZSBzaG9ydGZvcm0gZGlycyBo YXZlIG5vICcuJyBlbnRyeSBhbmQgdGhlIGlub2RlCisJICogaGFzIGFscmVhZHkg YmVlbiBjb21taXR0ZWQgYnkgcHJ1bmVfbGZfZGlyX2VudHJ5KCkuCisJICovCisJ aWYgKG5lZWRfZG90KSAgeworCQkvKgorCQkgKiBidW1wIHVwIG91ciBsaW5rIGNv dW50IGJ1dCBkb24ndAorCQkgKiBidW1wIHVwIHRoZSBpbm9kZSBsaW5rIGNvdW50 LiAgY2hhbmNlcworCQkgKiBhcmUgZ29vZCB0aGF0IGV2ZW4gdGhvdWdoIHdlIGxv c3QgJy4nCisJCSAqIHRoZSBpbm9kZSBsaW5rIGNvdW50cyByZWZsZWN0ICcuJyBz bworCQkgKiBsZWF2ZSB0aGUgaW5vZGUgbGluayBjb3VudCBhbG9uZSBhbmQgaWYK KwkJICogaXQgdHVybnMgb3V0IHRvIGJlIHdyb25nLCB3ZSdsbCBjYXRjaAorCQkg KiB0aGF0IGluIHBoYXNlIDcuCisJCSAqLworCQlhZGRfaW5vZGVfcmVmKGlyZWMs IGlub19vZmZzZXQpOworCisJCWlmIChub19tb2RpZnkpICB7CisJCQlkb193YXJu KF8oIndvdWxkIGNyZWF0ZSBtaXNzaW5nIFwiLlwiIGVudHJ5IGluIGRpciBpbm8g JWxsdVxuIiksCisJCQkJaW5vKTsKKwkJfSBlbHNlIGlmIChpcC0+aV9kLmRpX2Zv cm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgIHsKKwkJCS8qCisJCQkgKiBu ZWVkIHRvIGNyZWF0ZSAuIGVudHJ5IGluIGxvbmdmb3JtIGRpci4KKwkJCSAqLwor CQkJZG9fd2FybihfKCJjcmVhdGluZyBtaXNzaW5nIFwiLlwiIGVudHJ5IGluIGRp ciBpbm8gJWxsdVxuIiksCisJCQkJaW5vKTsKIAogCQkJdHAgPSBsaWJ4ZnNfdHJh bnNfYWxsb2MobXAsIDApOwogCQkJQVNTRVJUKHRwICE9IE5VTEwpOwogCi0JCQlu cmVzID0gWEZTX01LRElSX1NQQUNFX1JFUyhtcCwgMik7CisJCQlucmVzID0gWEZT X01LRElSX1NQQUNFX1JFUyhtcCwgMSk7CiAJCQllcnJvciA9IGxpYnhmc190cmFu c19yZXNlcnZlKHRwLCBucmVzLAogCQkJCQlYRlNfTUtESVJfTE9HX1JFUyhtcCks CiAJCQkJCTAsCkBAIC0zNTYwLDEwICszNjI4LDExIEBACiAKIAkJCVhGU19CTUFQ X0lOSVQoJmZsaXN0LCAmZmlyc3QpOwogCi0JCQlpZiAoKGVycm9yID0gZGlyX2Ny ZWF0ZW5hbWUobXAsIHRwLCBpcCwgIi4uIiwgMiwKLQkJCQkJaXAtPmlfaW5vLCAm Zmlyc3QsICZmbGlzdCwgbnJlcykpKQotCQkJCWRvX2Vycm9yKAotXygiY2FuJ3Qg bWFrZSBcIi4uXCIgZW50cnkgaW4gcm9vdCBpbm9kZSAlbGx1LCBjcmVhdGVuYW1l IGVycm9yICVkXG4iKSwKKwkJCWlmICgoZXJyb3IgPSBkaXJfY3JlYXRlbmFtZSht cCwgdHAsIGlwLCAiLiIsCisJCQkJCTEsIGlwLT5pX2lubywgJmZpcnN0LCAmZmxp c3QsCisJCQkJCW5yZXMpKSkKKwkJCQlkb19lcnJvcihfKCJjYW4ndCBtYWtlIFwi LlwiIGVudHJ5IGluIGRpciBpbm8gIgorCQkJCQkiJWxsdSwgY3JlYXRlbmFtZSBl cnJvciAlZFxuIiksCiAJCQkJCWlubywgZXJyb3IpOwogCiAJCQlsaWJ4ZnNfdHJh bnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CkBAIC0zNTczLDEz NSArMzY0MiwxMCBAQAogCQkJQVNTRVJUKGVycm9yID09IDApOwogCQkJbGlieGZz X3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUwogCQkJ CQl8WEZTX1RSQU5TX1NZTkMsIDApOwotCi0JCQluZWVkX3Jvb3RfZG90ZG90ID0g MDsKLQkJfSBlbHNlIGlmIChuZWVkX3Jvb3RfZG90ZG90ICYmIGlubyA9PSBtcC0+ bV9zYi5zYl9yb290aW5vKSAgewotCQkJZG9fd2FybihfKCJ3b3VsZCByZWNyZWF0 ZSByb290IGRpcmVjdG9yeSAuLiBlbnRyeVxuIikpOwotCQl9Ci0KLQkJLyoKLQkJ ICogZGVsZXRlIGFueSBpbGxlZ2FsIGVudHJpZXMgLS0gd2hpY2ggc2hvdWxkIG9u bHkgZXhpc3QKLQkJICogaWYgdGhlIGRpcmVjdG9yeSBpcyBhIGxvbmdmb3JtIGRp cmVjdG9yeS4gIGJvZ3VzCi0JCSAqIHNob3J0Zm9ybSBkaXJlY3RvcnkgZW50cmll cyB3ZXJlIGRlbGV0ZWQgaW4gcGhhc2UgNC4KLQkJICovCi0JCWlmICghbm9fbW9k aWZ5ICYmIG51bV9pbGxlZ2FsID4gMCkgIHsKLQkJCUFTU0VSVChpcC0+aV9kLmRp X2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCk7Ci0JCQlBU1NFUlQoIVhG U19TQl9WRVJTSU9OX0hBU0RJUlYyKCZtcC0+bV9zYikpOwotCi0JCQl3aGlsZSAo bnVtX2lsbGVnYWwgPiAwICYmIGlwLT5pX2QuZGlfZm9ybWF0ICE9Ci0JCQkJCVhG U19ESU5PREVfRk1UX0xPQ0FMKSAgewotCQkJCXBydW5lX2xmX2Rpcl9lbnRyeSht cCwgaW5vLCBpcCwgJmhhc2h2YWwpOwotCQkJCW51bV9pbGxlZ2FsLS07Ci0JCQl9 Ci0KLQkJCS8qCi0JCQkgKiBoYW5kbGUgY2FzZSB3aGVyZSB3ZSd2ZSBkZWxldGVk IHNvIG1hbnkKLQkJCSAqIGVudHJpZXMgdGhhdCB0aGUgZGlyZWN0b3J5IGhhcyBj aGFuZ2VkIGZyb20KLQkJCSAqIGEgbG9uZ2Zvcm0gdG8gYSBzaG9ydGZvcm0gZGly ZWN0b3J5LiAgaGF2ZQotCQkJICogdG8gYWxsb2NhdGUgYSB0cmFuc2FjdGlvbiBz aW5jZSB3ZSdyZSB3b3JraW5nCi0JCQkgKiB3aXRoIHRoZSBpbmNvcmUgZGF0YSBm b3JrLgotCQkJICovCi0JCQlpZiAobnVtX2lsbGVnYWwgPiAwKSAgewotCQkJCUFT U0VSVChpcC0+aV9kLmRpX2Zvcm1hdCA9PQotCQkJCQlYRlNfRElOT0RFX0ZNVF9M T0NBTCk7Ci0JCQkJdHAgPSBsaWJ4ZnNfdHJhbnNfYWxsb2MobXAsIDApOwotCQkJ CS8qCi0JCQkJICogdXNpbmcgdGhlIHJlbW92ZSByZXNlcnZhdGlvbiBpcyBvdmVy a2lsbAotCQkJCSAqIHNpbmNlIGF0IG1vc3Qgd2UnbGwgb25seSBuZWVkIHRvIGxv ZyB0aGUKLQkJCQkgKiBpbm9kZSBidXQgaXQncyBlYXNpZXIgdGhhbiB3ZWRnaW5n IGEKLQkJCQkgKiBuZXcgZGVmaW5lIGluIG91cnNlbHZlcy4gIDEwIGJsb2NrIGZz Ci0JCQkJICogc3BhY2UgcmVzZXJ2YXRpb24gaXMgYWxzbyBvdmVya2lsbCBidXQK LQkJCQkgKiB3aGF0IHRoZSBoZWNrLi4uCi0JCQkJICovCi0JCQkJbnJlcyA9IFhG U19SRU1PVkVfU1BBQ0VfUkVTKG1wKTsKLQkJCQllcnJvciA9IGxpYnhmc190cmFu c19yZXNlcnZlKHRwLCBucmVzLAotCQkJCQkJWEZTX1JFTU9WRV9MT0dfUkVTKG1w KSwgMCwKLQkJCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCi0JCQkJCQlYRlNf UkVNT1ZFX0xPR19DT1VOVCk7Ci0JCQkJaWYgKGVycm9yKQotCQkJCQlyZXNfZmFp bGVkKGVycm9yKTsKLQotCQkJCWxpYnhmc190cmFuc19pam9pbih0cCwgaXAsIDAp OwotCQkJCWxpYnhmc190cmFuc19paG9sZCh0cCwgaXApOwotCi0JCQkJcHJ1bmVf c2ZfZGlyX2VudHJ5KG1wLCBpbm8sIGlwKTsKLQotCQkJCWxpYnhmc190cmFuc19s b2dfaW5vZGUodHAsIGlwLAotCQkJCQkJWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9H X0REQVRBKTsKLQkJCQlBU1NFUlQoZXJyb3IgPT0gMCk7Ci0JCQkJbGlieGZzX3Ry YW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUwotCQkJCQkJ fFhGU19UUkFOU19TWU5DLCAwKTsKLQkJCX0KIAkJfQotCi0JCS8qCi0JCSAqIGlm IHdlIG5lZWQgdG8gY3JlYXRlIHRoZSAnLicgZW50cnksIGRvIHNvIG9ubHkgaWYK LQkJICogdGhlIGRpcmVjdG9yeSBpcyBhIGxvbmdmb3JtIGRpci4gIGl0IGl0J3Mg YmVlbgotCQkgKiB0dXJuZWQgaW50byBhIHNob3J0Zm9ybSBkaXIsIHRoZW4gdGhl IGlub2RlIGlzIG9rCi0JCSAqIHNpbmNlIHNob3J0Zm9ybSBkaXJzIGhhdmUgbm8g Jy4nIGVudHJ5IGFuZCB0aGUgaW5vZGUKLQkJICogaGFzIGFscmVhZHkgYmVlbiBj b21taXR0ZWQgYnkgcHJ1bmVfbGZfZGlyX2VudHJ5KCkuCi0JCSAqLwotCQlpZiAo bmVlZF9kb3QpICB7Ci0JCQkvKgotCQkJICogYnVtcCB1cCBvdXIgbGluayBjb3Vu dCBidXQgZG9uJ3QKLQkJCSAqIGJ1bXAgdXAgdGhlIGlub2RlIGxpbmsgY291bnQu ICBjaGFuY2VzCi0JCQkgKiBhcmUgZ29vZCB0aGF0IGV2ZW4gdGhvdWdoIHdlIGxv c3QgJy4nCi0JCQkgKiB0aGUgaW5vZGUgbGluayBjb3VudHMgcmVmbGVjdCAnLicg c28KLQkJCSAqIGxlYXZlIHRoZSBpbm9kZSBsaW5rIGNvdW50IGFsb25lIGFuZCBp ZgotCQkJICogaXQgdHVybnMgb3V0IHRvIGJlIHdyb25nLCB3ZSdsbCBjYXRjaAot CQkJICogdGhhdCBpbiBwaGFzZSA3LgotCQkJICovCi0JCQlhZGRfaW5vZGVfcmVm KGlyZWMsIGlub19vZmZzZXQpOwotCi0JCQlpZiAobm9fbW9kaWZ5KSAgewotCQkJ CWRvX3dhcm4oCi0JXygid291bGQgY3JlYXRlIG1pc3NpbmcgXCIuXCIgZW50cnkg aW4gZGlyIGlubyAlbGx1XG4iKSwKLQkJCQkJaW5vKTsKLQkJCX0gZWxzZSBpZiAo aXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpICB7Ci0J CQkJLyoKLQkJCQkgKiBuZWVkIHRvIGNyZWF0ZSAuIGVudHJ5IGluIGxvbmdmb3Jt IGRpci4KLQkJCQkgKi8KLQkJCQlkb193YXJuKAotCV8oImNyZWF0aW5nIG1pc3Np bmcgXCIuXCIgZW50cnkgaW4gZGlyIGlubyAlbGx1XG4iKSwKLQkJCQkJaW5vKTsK LQotCQkJCXRwID0gbGlieGZzX3RyYW5zX2FsbG9jKG1wLCAwKTsKLQkJCQlBU1NF UlQodHAgIT0gTlVMTCk7Ci0KLQkJCQlucmVzID0gWEZTX01LRElSX1NQQUNFX1JF UyhtcCwgMSk7Ci0JCQkJZXJyb3IgPSBsaWJ4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwg bnJlcywKLQkJCQkJCVhGU19NS0RJUl9MT0dfUkVTKG1wKSwKLQkJCQkJCTAsCi0J CQkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAotCQkJCQkJWEZTX01LRElSX0xP R19DT1VOVCk7Ci0KLQkJCQlpZiAoZXJyb3IpCi0JCQkJCXJlc19mYWlsZWQoZXJy b3IpOwotCi0JCQkJbGlieGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7Ci0JCQkJ bGlieGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7Ci0KLQkJCQlYRlNfQk1BUF9JTklU KCZmbGlzdCwgJmZpcnN0KTsKLQotCQkJCWlmICgoZXJyb3IgPSBkaXJfY3JlYXRl bmFtZShtcCwgdHAsIGlwLCAiLiIsCi0JCQkJCQkxLCBpcC0+aV9pbm8sICZmaXJz dCwgJmZsaXN0LAotCQkJCQkJbnJlcykpKQotCQkJCQlkb19lcnJvcigKLQlfKCJj YW4ndCBtYWtlIFwiLlwiIGVudHJ5IGluIGRpciBpbm8gJWxsdSwgY3JlYXRlbmFt ZSBlcnJvciAlZFxuIiksCi0JCQkJCQlpbm8sIGVycm9yKTsKLQotCQkJCWxpYnhm c190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKLQotCQkJ CWVycm9yID0gbGlieGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdCwK LQkJCQkJCSZjb21taXR0ZWQpOwotCQkJCUFTU0VSVChlcnJvciA9PSAwKTsKLQkJ CQlsaWJ4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0df UkVTCi0JCQkJCQl8WEZTX1RSQU5TX1NZTkMsIDApOwotCQkJfQotCQl9Ci0KLQkJ bGlieGZzX2lwdXQoaXAsIDApOwogCX0KKworCWxpYnhmc19pcHV0KGlwLCAwKTsK IH0KIAogLyoKQEAgLTM3NTksMTAgKzM3MDMsMTAgQEAKIHN0YXRpYyB2b2lkCiBj aGVja19mb3Jfb3JwaGFuZWRfaW5vZGVzKAogCXhmc19tb3VudF90CQkqbXAsCisJ eGZzX2FnbnVtYmVyX3QJCWFnbm8sCiAJaW5vX3RyZWVfbm9kZV90CQkqaXJlYykK IHsKIAlpbnQJCQlpOwotCWludAkJCWVycjsKIAl4ZnNfaW5vX3QJCWlubzsKIAog CWZvciAoaSA9IDA7IGkgPCBYRlNfSU5PREVTX1BFUl9DSFVOSzsgaSsrKSAgewpA QCAtMzc3MCw5MyArMzcxNCwxMDEgQEAKIAkJaWYgKGlzX2lub2RlX2ZyZWUoaXJl YywgaSkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWlzX2lub2RlX3JlYWNoZWQo aXJlYywgaSkpIHsKLQkJCUFTU0VSVChpbm9kZV9pc2FkaXIoaXJlYywgaSkgfHwK LQkJCQludW1faW5vZGVfcmVmZXJlbmNlcyhpcmVjLCBpKSA9PSAwKTsKLQkJCWlu byA9IFhGU19BR0lOT19UT19JTk8obXAsIGksIGkgKyBpcmVjLT5pbm9fc3RhcnRu dW0pOwotCQkJaWYgKGlub2RlX2lzYWRpcihpcmVjLCBpKSkKLQkJCQlkb193YXJu KF8oImRpc2Nvbm5lY3RlZCBkaXIgaW5vZGUgJWxsdSwgIiksIGlubyk7Ci0JCQll bHNlCi0JCQkJZG9fd2FybihfKCJkaXNjb25uZWN0ZWQgaW5vZGUgJWxsdSwgIiks IGlubyk7Ci0JCQlpZiAoIW5vX21vZGlmeSkgIHsKLQkJCSAgICAJaWYgKCFvcnBo YW5hZ2VfaW5vKQotCQkJCQlvcnBoYW5hZ2VfaW5vID0gbWtfb3JwaGFuYWdlKG1w KTsKLQkJCQlpZiAoIW9ycGhhbmFnZV9pcCkgewotCQkJCQllcnIgPSBsaWJ4ZnNf aWdldChtcCwgTlVMTCwgb3JwaGFuYWdlX2lubywgMCwgJm9ycGhhbmFnZV9pcCwg MCk7Ci0JCQkJCWlmIChlcnIpCi0JCQkJCQlkb19lcnJvcihfKCIlZCAtIGNvdWxk bid0IGlnZXQgb3JwaGFuYWdlIGlub2RlXG4iKSwgZXJyKTsKLQkJCQl9Ci0JCQkJ ZG9fd2FybihfKCJtb3ZpbmcgdG8gJXNcbiIpLCBPUlBIQU5BR0UpOwotCQkJCW12 X29ycGhhbmFnZShtcCwgaW5vLCBpbm9kZV9pc2FkaXIoaXJlYywgaSkpOwotCQkJ fSBlbHNlICB7Ci0JCQkJZG9fd2FybihfKCJ3b3VsZCBtb3ZlIHRvICVzXG4iKSwg T1JQSEFOQUdFKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBmb3IgcmVhZC1vbmx5IGNh c2UsIGV2ZW4gdGhvdWdoIHRoZSBpbm9kZSBpc24ndAotCQkJICogcmVhbGx5IHJl YWNoYWJsZSwgc2V0IHRoZSBmbGFnIChhbmQgYnVtcCBvdXIgbGluawotCQkJICog Y291bnQpIGFueXdheSB0byBmb29sIHBoYXNlIDcKLQkJCSAqLwotCQkJYWRkX2lu b2RlX3JlYWNoZWQoaXJlYywgaSk7CisJCWlmIChpc19pbm9kZV9yZWFjaGVkKGly ZWMsIGkpKQorCQkJY29udGludWU7CisKKwkJQVNTRVJUKGlub2RlX2lzYWRpcihp cmVjLCBpKSB8fAorCQkJbnVtX2lub2RlX3JlZmVyZW5jZXMoaXJlYywgaSkgPT0g MCk7CisKKwkJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgaSArIGly ZWMtPmlub19zdGFydG51bSk7CisJCWlmIChpbm9kZV9pc2FkaXIoaXJlYywgaSkp CisJCQlkb193YXJuKF8oImRpc2Nvbm5lY3RlZCBkaXIgaW5vZGUgJWxsdSwgIiks IGlubyk7CisJCWVsc2UKKwkJCWRvX3dhcm4oXygiZGlzY29ubmVjdGVkIGlub2Rl ICVsbHUsICIpLCBpbm8pOworCQlpZiAoIW5vX21vZGlmeSkgIHsKKwkJICAgIAlp ZiAoIW9ycGhhbmFnZV9pbm8pCisJCQkJb3JwaGFuYWdlX2lubyA9IG1rX29ycGhh bmFnZShtcCk7CisJCQlkb193YXJuKF8oIm1vdmluZyB0byAlc1xuIiksIE9SUEhB TkFHRSk7CisJCQltdl9vcnBoYW5hZ2UobXAsIGlubywgaW5vZGVfaXNhZGlyKGly ZWMsIGkpKTsKKwkJfSBlbHNlICB7CisJCQlkb193YXJuKF8oIndvdWxkIG1vdmUg dG8gJXNcbiIpLCBPUlBIQU5BR0UpOwogCQl9CisJCS8qCisJCSAqIGZvciByZWFk LW9ubHkgY2FzZSwgZXZlbiB0aG91Z2ggdGhlIGlub2RlIGlzbid0CisJCSAqIHJl YWxseSByZWFjaGFibGUsIHNldCB0aGUgZmxhZyAoYW5kIGJ1bXAgb3VyIGxpbmsK KwkJICogY291bnQpIGFueXdheSB0byBmb29sIHBoYXNlIDcKKwkJICovCisJCWFk ZF9pbm9kZV9yZWFjaGVkKGlyZWMsIGkpOwogCX0KIH0KIAogc3RhdGljIHZvaWQK LXRyYXZlcnNlX2Z1bmN0aW9uKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVy X3QgYWdubykKK3RyYXZlcnNlX2Z1bmN0aW9uKAorCXdvcmtfcXVldWVfdAkJKndx LAorCXhmc19hZ251bWJlcl90IAkJYWdubywKKwl2b2lkCQkJKmFyZykKIHsKLQly ZWdpc3RlciBpbm9fdHJlZV9ub2RlX3QgKmlyZWM7Ci0JaW50CQkJajsKLQl4ZnNf aW5vX3QJCWlubzsKLQlkaXJfc3RhY2tfdAkJc3RhY2s7CisJaW5vX3RyZWVfbm9k ZV90IAkqaXJlYzsKKwlpbnQJCQlpOworCXByZWZldGNoX2FyZ3NfdAkJKnBmX2Fy Z3MgPSBhcmc7CisKKwl3YWl0X2Zvcl9pbm9kZV9wcmVmZXRjaChwZl9hcmdzKTsK IAogCWlmICh2ZXJib3NlKQogCQlkb19sb2coXygiICAgICAgICAtIGFnbm8gPSAl ZFxuIiksIGFnbm8pOwogCi0JZGlyX3N0YWNrX2luaXQoJnN0YWNrKTsKLQlpcmVj ID0gZmluZGZpcnN0X2lub2RlX3JlYyhhZ25vKTsKLQotCXdoaWxlIChpcmVjICE9 IE5VTEwpICB7Ci0JCWZvciAoaiA9IDA7IGogPCBYRlNfSU5PREVTX1BFUl9DSFVO SzsgaisrKSAgewotCQkJaWYgKCFpbm9kZV9pc2FkaXIoaXJlYywgaikpIHsKLQkJ CQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLAotCQkJCQlpcmVjLT5p bm9fc3RhcnRudW0gKyBqKTsKLQkJCQlpZiAobXAtPm1fc2Iuc2Jfcm9vdGlubyAh PSBpbm8pCi0JCQkJCWNvbnRpbnVlOwotCQkJfQorCWZvciAoaXJlYyA9IGZpbmRm aXJzdF9pbm9kZV9yZWMoYWdubyk7IGlyZWM7IGlyZWMgPSBuZXh0X2lub19yZWMo aXJlYykpIHsKKwkJaWYgKGlyZWMtPmlub19pc2FfZGlyID09IDApCisJCQljb250 aW51ZTsKIAotCQkJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywKLQkJ CQlpcmVjLT5pbm9fc3RhcnRudW0gKyBqKTsKKwkJaWYgKHBmX2FyZ3MpCisJCQlz ZW1fcG9zdCgmcGZfYXJncy0+cmFfY291bnQpOwogCi0JCQlwdXNoX2Rpcigmc3Rh Y2ssIGlubyk7Ci0JCQlwcm9jZXNzX2RpcnN0YWNrKG1wLCAmc3RhY2spOworCQlm b3IgKGkgPSAwOyBpIDwgWEZTX0lOT0RFU19QRVJfQ0hVTks7IGkrKykgIHsKKwkJ CWlmIChpbm9kZV9pc2FkaXIoaXJlYywgaSkpCisJCQkJcHJvY2Vzc19kaXJfaW5v ZGUod3EtPm1wLAorCQkJCQlYRlNfQUdJTk9fVE9fSU5PKHdxLT5tcCwgYWdubywK KwkJCQkJaXJlYy0+aW5vX3N0YXJ0bnVtICsgaSksIGlyZWMsIGkpOwogCQl9Ci0J CWlyZWMgPSBuZXh0X2lub19yZWMoaXJlYyk7CiAJfQotCXJldHVybjsKKwljbGVh bnVwX2lub2RlX3ByZWZldGNoKHBmX2FyZ3MpOwogfQogCiBzdGF0aWMgdm9pZAot dHJhdmVyc2VfYWx0KHhmc19tb3VudF90ICptcCkKK3RyYXZlcnNlX2FncygKKwl4 ZnNfbW91bnRfdCAJCSptcCkKIHsKIAlpbnQJCQlpOworCXdvcmtfcXVldWVfdAkJ KnF1ZXVlczsKKwlwcmVmZXRjaF9hcmdzX3QJCSpwZl9hcmdzWzJdOworCisJcXVl dWVzID0gbWFsbG9jKHRocmVhZF9jb3VudCAqIHNpemVvZih3b3JrX3F1ZXVlX3Qp KTsKKwlxdWV1ZXNbMF0ubXAgPSBtcDsKIAotCXNldF9wcm9ncmVzc19tc2coUFJP R19GTVRfVFJBVkVSU0FMLCAoX191aW50NjRfdCkgZ2xvYl9hZ2NvdW50KTsKLQlm b3IgKGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgaSsrKSAgewotCQl0 cmF2ZXJzZV9mdW5jdGlvbihtcCwgaSk7Ci0JCVBST0dfUlBUX0lOQyhwcm9nX3Jw dF9kb25lW2ldLCAxKTsKKwlpZiAoIWxpYnhmc19iY2FjaGVfb3ZlcmZsb3dlZCgp KSB7CisJCS8qY3JlYXRlX3dvcmtfcXVldWUoJnF1ZXVlc1swXSwgbXAsIGxpYnhm c19ucHJvYygpKTsKKwkJZm9yIChpID0gMDsgaSA8IGdsb2JfYWdjb3VudDsgaSsr KQorCQkJcXVldWVfd29yaygmcXVldWVzWzBdLCB0cmF2ZXJzZV9mdW5jdGlvbiwg aSwgTlVMTCk7CisJCWRlc3Ryb3lfd29ya19xdWV1ZSgmcXVldWVzWzBdKTsqLwor CQlmb3IgKGkgPSAwOyBpIDwgZ2xvYl9hZ2NvdW50OyBpKyspCisJCQl0cmF2ZXJz ZV9mdW5jdGlvbigmcXVldWVzWzBdLCBpLCBOVUxMKTsKKwl9IGVsc2UgeworCQkv KiBUT0RPOiBBRyBzdHJpZGUgc3VwcG9ydCAqLworCQlwZl9hcmdzWzBdID0gc3Rh cnRfaW5vZGVfcHJlZmV0Y2goMCwgMSwgTlVMTCk7CisJCWZvciAoaSA9IDA7IGkg PCBnbG9iX2FnY291bnQ7IGkrKykgeworCQkJcGZfYXJnc1sofmkpICYgMV0gPSBz dGFydF9pbm9kZV9wcmVmZXRjaChpICsgMSwgMSwKKwkJCQkJcGZfYXJnc1tpICYg MV0pOworCQkJdHJhdmVyc2VfZnVuY3Rpb24oJnF1ZXVlc1swXSwgaSwgcGZfYXJn c1tpICYgMV0pOworCQl9CiAJfQotCXByaW50X2ZpbmFsX3JwdCgpOworCWZyZWUo cXVldWVzKTsKIH0KIAogdm9pZAogcGhhc2U2KHhmc19tb3VudF90ICptcCkKIHsK LQl4ZnNfaW5vX3QJCWlubzsKIAlpbm9fdHJlZV9ub2RlX3QJCSppcmVjOwotCWRp cl9zdGFja190CQlzdGFjazsKIAlpbnQJCQlpOwotCWludAkJCWo7Ci0JeGZzX2lu b190CQlvcnBoYW5hZ2VfaW5vOwogCiAJYnplcm8oJnplcm9jciwgc2l6ZW9mKHN0 cnVjdCBjcmVkKSk7CiAJYnplcm8oJnplcm9mc3gsIHNpemVvZihzdHJ1Y3QgZnN4 YXR0cikpOwpAQCAtMzkyNCwzNCArMzg3Niw5IEBACiAJCX0KIAl9CiAKLQlkaXJf c3RhY2tfaW5pdCgmc3RhY2spOwotCiAJbWFya19zdGFuZGFsb25lX2lub2Rlcyht cCk7CiAKLQkvKgotCSAqIHB1c2ggcm9vdCBkaXIgb24gc3RhY2ssIHRoZW4gZ28K LQkgKi8KLQlpZiAoIW5lZWRfcm9vdF9pbm9kZSkgIHsKLQkJZG9fbG9nKF8oIiAg ICAgICAgLSB0cmF2ZXJzaW5nIGZpbGVzeXN0ZW0gc3RhcnRpbmcgYXQgLyAuLi4g XG4iKSk7Ci0KLQkJaWYgKGRvX3ByZWZldGNoKSB7Ci0JCQl0cmF2ZXJzZV9hbHQo bXApOwotCQl9IGVsc2UgewotCQkJcHVzaF9kaXIoJnN0YWNrLCBtcC0+bV9zYi5z Yl9yb290aW5vKTsKLQkJCXByb2Nlc3NfZGlyc3RhY2sobXAsICZzdGFjayk7Ci0J CX0KLQotCQlkb19sb2coXygiICAgICAgICAtIHRyYXZlcnNhbCBmaW5pc2hlZCAu Li4gXG4iKSk7Ci0JfSBlbHNlICB7Ci0JCUFTU0VSVChub19tb2RpZnkgIT0gMCk7 Ci0KLQkJZG9fbG9nKAotXygiICAgICAgICAtIHJvb3QgaW5vZGUgbG9zdCwgY2Fu bm90IG1ha2UgbmV3IG9uZSBpbiBubyBtb2RpZnkgbW9kZSAuLi4gXG4iKSk7Ci0J CWRvX2xvZygKLV8oIiAgICAgICAgLSBza2lwcGluZyBmaWxlc3lzdGVtIHRyYXZl cnNhbCBmcm9tIC8gLi4uIFxuIikpOwotCX0KLQotCWRvX2xvZyhfKCIgICAgICAg IC0gdHJhdmVyc2luZyBhbGwgdW5hdHRhY2hlZCBzdWJ0cmVlcyAuLi4gXG4iKSk7 CisJZG9fbG9nKF8oIiAgICAgICAgLSB0cmF2ZXJzaW5nIGZpbGVzeXN0ZW0gLi4u IFxuIikpOwogCiAJaXJlYyA9IGZpbmRfaW5vZGVfcmVjKFhGU19JTk9fVE9fQUdO TyhtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubyksCiAJCQkJWEZTX0lOT19UT19BR0lO TyhtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubykpOwpAQCAtMzk2NSw0MiArMzg5Miw5 IEBACiAJfQogCiAJLyoKLQkgKiB0aGVuIHByb2Nlc3MgYWxsIHVucmVhY2hlZCBp bm9kZXMKLQkgKiBieSB3YWxraW5nIGluY29yZSBpbm9kZSB0cmVlCi0JICoKLQkg KglnZXQgbmV4dCB1bnJlYWNoZWQgZGlyZWN0b3J5IGlub2RlICMgZnJvbQotCSAq CQlpbmNvcmUgbGlzdAotCSAqCXB1c2ggaW5vZGUgb24gZGlyIHN0YWNrCi0JICoJ Y2FsbCBwcm9jZXNzX2RpcnN0YWNrCisJICogdGhlbiBwcm9jZXNzIGFsbCBpbm9k ZXMgYnkgd2Fsa2luZyBpbmNvcmUgaW5vZGUgdHJlZQogCSAqLwotCWZvciAoaSA9 IDA7IGkgPCBnbG9iX2FnY291bnQ7IGkrKykgIHsKLQkJaXJlYyA9IGZpbmRmaXJz dF9pbm9kZV9yZWMoaSk7Ci0KLQkJaWYgKGlyZWMgPT0gTlVMTCkKLQkJCWNvbnRp bnVlOwotCi0JCXdoaWxlIChpcmVjICE9IE5VTEwpICB7Ci0JCQlmb3IgKGogPSAw OyBqIDwgWEZTX0lOT0RFU19QRVJfQ0hVTks7IGorKykgIHsKLQkJCQlpZiAoIWlz X2lub2RlX2NvbmZpcm1lZChpcmVjLCBqKSkKLQkJCQkJY29udGludWU7Ci0JCQkJ LyoKLQkJCQkgKiBza2lwIGRpcmVjdG9yaWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJl ZW4KLQkJCQkgKiBwcm9jZXNzZWQsIGV2ZW4gaWYgdGhleSBoYXZlbid0IGJlZW4K LQkJCQkgKiByZWFjaGVkLiAgSWYgdGhleSBhcmUgcmVhY2hhYmxlLCB3ZSdsbAot CQkJCSAqIHBpY2sgdGhlbSB1cCB3aGVuIHdlIHByb2Nlc3MgdGhlaXIgcGFyZW50 LgotCQkJCSAqLwotCQkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGksCi0J CQkJCQlqICsgaXJlYy0+aW5vX3N0YXJ0bnVtKTsKLQkJCQlpZiAoaW5vZGVfaXNh ZGlyKGlyZWMsIGopICYmCi0JCQkJCQkhaXNfaW5vZGVfcmVmY2hlY2tlZChpbm8s Ci0JCQkJCQkJaXJlYywgaikpIHsKLQkJCQkJcHVzaF9kaXIoJnN0YWNrLCBpbm8p OwotCQkJCQlwcm9jZXNzX2RpcnN0YWNrKG1wLCAmc3RhY2spOwotCQkJCX0KLQkJ CX0KLQkJCWlyZWMgPSBuZXh0X2lub19yZWMoaXJlYyk7Ci0JCX0KLQl9CisJdHJh dmVyc2VfYWdzKG1wKTsKIAogCWRvX2xvZyhfKCIgICAgICAgIC0gdHJhdmVyc2Fs cyBmaW5pc2hlZCAuLi4gXG4iKSk7CiAJZG9fbG9nKF8oIiAgICAgICAgLSBtb3Zp bmcgZGlzY29ubmVjdGVkIGlub2RlcyB0byAlcyAuLi4gXG4iKSwKQEAgLTQwMTIs NyArMzkwNiw3IEBACiAJZm9yIChpID0gMDsgaSA8IGdsb2JfYWdjb3VudDsgaSsr KSAgewogCQlpcmVjID0gZmluZGZpcnN0X2lub2RlX3JlYyhpKTsKIAkJd2hpbGUg KGlyZWMgIT0gTlVMTCkgIHsKLQkJCWNoZWNrX2Zvcl9vcnBoYW5lZF9pbm9kZXMo bXAsIGlyZWMpOworCQkJY2hlY2tfZm9yX29ycGhhbmVkX2lub2RlcyhtcCwgaSwg aXJlYyk7CiAJCQlpcmVjID0gbmV4dF9pbm9fcmVjKGlyZWMpOwogCQl9CiAJfQpJ bmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9waGFzZTcuYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9yZXBhaXIvcGhhc2U3 LmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFp ci94ZnNwcm9ncy9yZXBhaXIvcGhhc2U3LmMJMjAwNy0wNC0yNyAxNDoxMjozNC4x OTE1NjM1MDEgKzEwMDAKQEAgLTI1LDkgKzI1LDcgQEAKICNpbmNsdWRlICJlcnJf cHJvdG9zLmgiCiAjaW5jbHVkZSAiZGlub2RlLmgiCiAjaW5jbHVkZSAidmVyc2lv bnMuaCIKLSNpbmNsdWRlICJwcmVmZXRjaC5oIgogI2luY2x1ZGUgInByb2dyZXNz LmgiCi0jaW5jbHVkZSAidGhyZWFkcy5oIgogCiAvKiBkaW5vYyBpcyBhIHBvaW50 ZXIgdG8gdGhlIElOLUNPUkUgZGlub2RlIGNvcmUgKi8KIHN0YXRpYyB2b2lkCkBA IC0xMTYsNTcgKzExNCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotcGhhc2U3 X2FsdF9mdW5jdGlvbih4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFn bm8pCi17Ci0JaW5vX3RyZWVfbm9kZV90IAkqaXJlYzsKLQlpbnQJCQlqOwotCV9f dWludDMyX3QJCW5yZWZzOwotCi0JLyoKLQkgKiB1c2luZyB0aGUgbmxpbmsgdmFs dWVzIG1lbW9yaXNlZCBkdXJpbmcgcGhhc2UzLzQsIGNvbXBhcmUgdG8gdGhlCi0J ICogbmxpbmsgY291bnRlZCBpbiBwaGFzZSA2LCBhbmQgaWYgZGlmZmVyZW50LCB1 cGRhdGUgb24tZGlzay4KLQkgKi8KLQotCWlyZWMgPSBmaW5kZmlyc3RfaW5vZGVf cmVjKGFnbm8pOwotCi0Jd2hpbGUgKGlyZWMgIT0gTlVMTCkgIHsKLQkJZm9yIChq ID0gMDsgaiA8IFhGU19JTk9ERVNfUEVSX0NIVU5LOyBqKyspICB7Ci0JCQlhc3Nl cnQoaXNfaW5vZGVfY29uZmlybWVkKGlyZWMsIGopKTsKLQotCQkJaWYgKGlzX2lu b2RlX2ZyZWUoaXJlYywgaikpCi0JCQkJY29udGludWU7Ci0KLQkJCWFzc2VydChu b19tb2RpZnkgfHwgaXNfaW5vZGVfcmVhY2hlZChpcmVjLCBqKSk7Ci0JCQlhc3Nl cnQobm9fbW9kaWZ5IHx8IGlzX2lub2RlX3JlZmVyZW5jZWQoaXJlYywgaikpOwot Ci0JCQlucmVmcyA9IG51bV9pbm9kZV9yZWZlcmVuY2VzKGlyZWMsIGopOwotCi0g CQkJaWYgKGdldF9pbm9kZV9kaXNrX25saW5rcyhpcmVjLCBqKSAhPSBucmVmcykK LSAJCQkJdXBkYXRlX2lub2RlX25saW5rcyhtcCwgWEZTX0FHSU5PX1RPX0lOTyht cCwKLSAJCQkJCQlhZ25vLCBpcmVjLT5pbm9fc3RhcnRudW0gKyBqKSwKLSAJCQkJ CQlucmVmcyk7Ci0JCX0KLQkJaXJlYyA9IG5leHRfaW5vX3JlYyhpcmVjKTsKLQkJ UFJPR19SUFRfSU5DKHByb2dfcnB0X2RvbmVbYWdub10sIFhGU19JTk9ERVNfUEVS X0NIVU5LKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1waGFzZTdfYWx0KHhmc19t b3VudF90ICptcCkKLXsKLQlpbnQJCWk7Ci0KLQlzZXRfcHJvZ3Jlc3NfbXNnKG5v X21vZGlmeSA/IFBST0dSRVNTX0ZNVF9WUkZZX0xJTksgOiBQUk9HUkVTU19GTVRf Q09SUl9MSU5LLAotCQkoX191aW50NjRfdCkgbXAtPm1fc2Iuc2JfaWNvdW50KTsK LQotCWZvciAoaSA9IDA7IGkgPCBnbG9iX2FnY291bnQ7IGkrKykgIHsKLQkJcXVl dWVfd29yayhwaGFzZTdfYWx0X2Z1bmN0aW9uLCBtcCwgaSk7Ci0JfQotCXdhaXRf Zm9yX3dvcmtlcnMoKTsKLQlwcmludF9maW5hbF9ycHQoKTsKLX0KLQogdm9pZAog cGhhc2U3KHhmc19tb3VudF90ICptcCkKIHsKQEAgLTE4MCwxMSArMTI3LDYgQEAK IAllbHNlCiAJCWRvX2xvZyhfKCJQaGFzZSA3IC0gdmVyaWZ5IGxpbmsgY291bnRz Li4uXG4iKSk7CiAKLQlpZiAoZG9fcHJlZmV0Y2gpIHsKLQkJcGhhc2U3X2FsdCht cCk7Ci0JCXJldHVybjsKLQl9Ci0KIAkvKgogCSAqIGZvciBlYWNoIGFnLCBsb29r IGF0IGVhY2ggaW5vZGUgMSBhdCBhIHRpbWUuIElmIHRoZSBudW1iZXIgb2YKIAkg KiBsaW5rcyBpcyBiYWQsIHJlc2V0IGl0LCBsb2cgdGhlIGlub2RlIGNvcmUsIGNv bW1pdCB0aGUgdHJhbnNhY3Rpb24KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBh aXIvcHJlZmV0Y2guYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3Jp Zy94ZnNwcm9ncy9yZXBhaXIvcHJlZmV0Y2guYwkyMDA3LTA0LTI3IDEzOjEzOjM1 LjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9wcmVm ZXRjaC5jCTIwMDctMDYtMDUgMTE6MzQ6MDEuOTU3NzMyOTY0ICsxMDAwCkBAIC0x LDYgKzEsNiBAQAogI2luY2x1ZGUgPGxpYnhmcy5oPgotI2luY2x1ZGUgInByZWZl dGNoLmgiCi0jaW5jbHVkZSAiYWlvLmgiCisjaW5jbHVkZSA8cHRocmVhZC5oPgor I2luY2x1ZGUgPHNjaGVkLmg+CiAjaW5jbHVkZSAiYXZsLmgiCiAjaW5jbHVkZSAi Z2xvYmFscy5oIgogI2luY2x1ZGUgImFnaGVhZGVyLmgiCkBAIC0xMyw0NTQgKzEz LDc4MiBAQAogI2luY2x1ZGUgImRpbm9kZS5oIgogI2luY2x1ZGUgImJtYXAuaCIK ICNpbmNsdWRlICJ2ZXJzaW9ucy5oIgorI2luY2x1ZGUgInRocmVhZHMuaCIKKyNp bmNsdWRlICJwcmVmZXRjaC5oIgorI2luY2x1ZGUgInByb2dyZXNzLmgiCisjaW5j bHVkZSAicmFkaXgtdHJlZS5oIgogCiBpbnQgZG9fcHJlZmV0Y2ggPSAxOwogCi1p bm9fdHJlZV9ub2RlX3QgKgotcHJlZmV0Y2hfaW5vZGVfY2h1bmtzKHhmc19tb3Vu dF90ICptcCwKLQkJeGZzX2FnbnVtYmVyX3QgYWdubywKLQkJaW5vX3RyZWVfbm9k ZV90ICppbm9fcmEpCi17Ci0JeGZzX2FnYmxvY2tfdCBhZ2JubzsKLQlsaWJ4ZnNf bGlvX3JlcV90ICpsaW9wOwotCWludCBpOwotCi0JaWYgKGxpYnhmc19saW9faW5v X2NvdW50ID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JbGlvcCA9IChsaWJ4ZnNf bGlvX3JlcV90ICopIGxpYnhmc19nZXRfbGlvX2J1ZmZlcihMSUJYRlNfTElPX1RZ UEVfSU5PKTsKLQlpZiAobGlvcCA9PSBOVUxMKSB7Ci0JCWRvX3ByZWZldGNoID0g MDsKLQkJcmV0dXJuIE5VTEw7CisvKgorICogUGVyZm9ybXMgcHJlZmV0Y2hpbmcg YnkgcHJpbWluZyB0aGUgbGlieGZzIGNhY2hlIGJ5IHVzaW5nIGEgZGVkaWNhdGUg dGhyZWFkCisgKiBzY2FubmluZyBpbm9kZXMgYW5kIHJlYWRpbmcgYmxvY2tzIGlu IGFoZWFkIG9mIHRpbWUgdGhleSBhcmUgcmVxdWlyZWQuCisgKgorICogQW55IEkv TyBlcnJvcnMgY2FuIGJlIHNhZmVseSBpZ25vcmVkLgorICovCisKK3N0YXRpYyB4 ZnNfbW91bnRfdAkqbXA7CitzdGF0aWMgaW50IAkJbXBfZmQ7CitzdGF0aWMgaW50 CQlwZl9tYXhfYnl0ZXM7CitzdGF0aWMgaW50CQlwZl9tYXhfYmJzOworc3RhdGlj IGludAkJcGZfbWF4X2ZzYnM7CitzdGF0aWMgaW50CQlwZl9iYXRjaF9ieXRlczsK K3N0YXRpYyBpbnQJCXBmX2JhdGNoX2ZzYnM7CisKKyNkZWZpbmUgQl9JTk9ERQkJ MHgxMDAwMDAwCisjZGVmaW5lIEJfTUVUQQkJMHgyMDAwMDAwCisKKyNkZWZpbmUg SU9fVEhSRVNIT0xECTIwMAorCisjZGVmaW5lIERFRl9CQVRDSF9CWVRFUwkweDEw MDAwCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGZfc3RhcnRfcHJvY2Vzc2luZygK KwlwcmVmZXRjaF9hcmdzX3QJCSphcmdzKQoreworCWlmICghYXJncy0+Y2FuX3N0 YXJ0X3Byb2Nlc3NpbmcpIHsKKyNpZmRlZiBYUl9QRl9UUkFDRQorCQlwZnRyYWNl KCJzaWduYWxsaW5nIHByb2Nlc3NpbmcgZm9yIEFHICVkIiwgYXJncy0+YWdubyk7 CisjZW5kaWYKKwkJYXJncy0+Y2FuX3N0YXJ0X3Byb2Nlc3NpbmcgPSAxOworCQlw dGhyZWFkX2NvbmRfc2lnbmFsKCZhcmdzLT5zdGFydF9wcm9jZXNzaW5nKTsKIAl9 Cit9CiAKLQlpZiAoaW5vX3JhID09IE5VTEwpCi0JCWlub19yYSA9IGZpbmRmaXJz dF9pbm9kZV9yZWMoYWdubyk7Ci0KLQlpID0gMDsKLQl3aGlsZSAoaW5vX3JhKSB7 Ci0JCWFnYm5vID0gWEZTX0FHSU5PX1RPX0FHQk5PKG1wLCBpbm9fcmEtPmlub19z dGFydG51bSk7Ci0JCWxpb3BbaV0uYmxrbm8gPSBYRlNfQUdCX1RPX0RBRERSKG1w LCBhZ25vLCBhZ2Jubyk7Ci0JCWxpb3BbaV0ubGVuID0gKGludCkgWEZTX0ZTQl9U T19CQihtcCwgWEZTX0lBTExPQ19CTE9DS1MobXApKTsKLQkJaSsrOwotCQlpbm9f cmEgPSBuZXh0X2lub19yZWMoaW5vX3JhKTsKLQkJaWYgKGkgPj0gbGlieGZzX2xp b19pbm9fY291bnQpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkpIHsKLQkJaWYgKGxp Ynhmc19yZWFkYnVmX2xpc3QobXAtPm1fZGV2LCBpLCAodm9pZCAqKSBsaW9wLCBM SUJYRlNfTElPX1RZUEVfSU5PKSA9PSAtMSkKLQkJCWRvX3ByZWZldGNoID0gMDsK K3N0YXRpYyBpbmxpbmUgdm9pZAorcGZfc3RhcnRfaW9fd29ya2VycygKKwlwcmVm ZXRjaF9hcmdzX3QJCSphcmdzKQoreworCWlmICghYXJncy0+Y2FuX3N0YXJ0X3Jl YWRpbmcpIHsKKyNpZmRlZiBYUl9QRl9UUkFDRQorCQlwZnRyYWNlKCJzaWduYWxs aW5nIHJlYWRpbmcgZm9yIEFHICVkIiwgYXJncy0+YWdubyk7CisjZW5kaWYKKwkJ YXJncy0+Y2FuX3N0YXJ0X3JlYWRpbmcgPSAxOworCQlwdGhyZWFkX2NvbmRfYnJv YWRjYXN0KCZhcmdzLT5zdGFydF9yZWFkaW5nKTsKIAl9Ci0JbGlieGZzX3B1dF9s aW9fYnVmZmVyKCh2b2lkICopIGxpb3ApOwotCXJldHVybiAoaW5vX3JhKTsKIH0K IAorCiBzdGF0aWMgdm9pZAotcHJlZmV0Y2hfbm9kZSgKLQl4ZnNfbW91bnRfdAkJ Km1wLAotCXhmc19idWZfdAkJKmJwLAotCWRhX2J0X2N1cnNvcl90CQkqZGFfY3Vy c29yKQorcGZfcXVldWVfaW8oCisJcHJlZmV0Y2hfYXJnc190CQkqYXJncywKKwl4 ZnNfZnNibG9ja190CQlmc2JubywKKwlpbnQJCQlibGVuLAorCWludAkJCWZsYWcp CiB7Ci0JeGZzX2RhX2ludG5vZGVfdAkqbm9kZTsKLQlsaWJ4ZnNfbGlvX3JlcV90 CSpsaW9wOwotCWludAkJCWk7Ci0JeGZzX2Rmc2Jub190CQlmc2JubzsKKwl4ZnNf YnVmX3QJCSpicDsKIAotCW5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKVhGU19C VUZfUFRSKGJwKTsKLQlpZiAoSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hf Q09OVkVSVCkgPD0gMSkKKwlicCA9IGxpYnhmc19nZXRidWYobXAtPm1fZGV2LCBY RlNfRlNCX1RPX0RBRERSKG1wLCBmc2JubyksCisJCQlYRlNfRlNCX1RPX0JCKG1w LCBibGVuKSk7CisJaWYgKGJwLT5iX2ZsYWdzICYgTElCWEZTX0JfVVBUT0RBVEUp IHsKKwkJbGlieGZzX3B1dGJ1ZihicCk7CiAJCXJldHVybjsKKwl9CisJYnAtPmJf ZmxhZ3MgfD0gZmxhZzsKIAotCWlmICgobGlvcCA9IChsaWJ4ZnNfbGlvX3JlcV90 ICopIGxpYnhmc19nZXRfbGlvX2J1ZmZlcihMSUJYRlNfTElPX1RZUEVfRElSKSkg PT0gTlVMTCkgewotCQlyZXR1cm47CisJcHRocmVhZF9tdXRleF9sb2NrKCZhcmdz LT5sb2NrKTsKKworCWlmIChmc2JubyA+IGFyZ3MtPmxhc3RfYm5vX3JlYWQpIHsK KwkJcmFkaXhfdHJlZV9pbnNlcnQoJmFyZ3MtPnByaW1hcnlfaW9fcXVldWUsIGZz Ym5vLCBicCk7CisJCWlmIChmbGFnID09IEJfTUVUQSkKKwkJCXJhZGl4X3RyZWVf dGFnX3NldCgmYXJncy0+cHJpbWFyeV9pb19xdWV1ZSwgZnNibm8sIDApOworCQll bHNlIHsKKwkJCWFyZ3MtPmlub2RlX2J1ZnNfcXVldWVkKys7CisJCQlpZiAoYXJn cy0+aW5vZGVfYnVmc19xdWV1ZWQgPT0gSU9fVEhSRVNIT0xEKQorCQkJCXBmX3N0 YXJ0X2lvX3dvcmtlcnMoYXJncyk7CisJCX0KKyNpZmRlZiBYUl9QRl9UUkFDRQor CQlwZnRyYWNlKCJnZXRidWYgJXAgKCVsbHUpIGluIEFHICVkIChmc2JubyA9ICVs dSkgYWRkZWQgdG8gIgorCQkJInByaW1hcnkgcXVldWUgKGlub2RlX2J1ZnNfcXVl dWVkID0gJWQsIGxhc3RfYm5vID0gJWx1KSIsIGJwLAorCQkJKGxvbmcgbG9uZylY RlNfQlVGX0FERFIoYnApLCBhcmdzLT5hZ25vLCBmc2JubywKKwkJCWFyZ3MtPmlu b2RlX2J1ZnNfcXVldWVkLCBhcmdzLT5sYXN0X2Jub19yZWFkKTsKKyNlbmRpZgor CX0gZWxzZSB7CisJCUFTU0VSVChmbGFnID09IEJfTUVUQSk7CisJCXJhZGl4X3Ry ZWVfaW5zZXJ0KCZhcmdzLT5zZWNvbmRhcnlfaW9fcXVldWUsIGZzYm5vLCBicCk7 CisjaWZkZWYgWFJfUEZfVFJBQ0UKKwkJcGZ0cmFjZSgiZ2V0YnVmICVwICglbGx1 KSBpbiBBRyAlZCAoZnNibm8gPSAlbHUpIGFkZGVkIHRvICIKKwkJCSJzZWNvbmRh cnkgcXVldWUgKGxhc3RfYm5vID0gJWx1KSIsIGJwLAorCQkJKGxvbmcgbG9uZylY RlNfQlVGX0FERFIoYnApLCBhcmdzLT5hZ25vLCBmc2JubywKKwkJCWFyZ3MtPmxh c3RfYm5vX3JlYWQpOworI2VuZGlmCiAJfQogCi0JZm9yIChpID0gMDsgaSA8IElO VF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKLQkJ aWYgKGkgPT0gbGlieGZzX2xpb19kaXJfY291bnQpCi0JCQlicmVhazsKKwlwZl9z dGFydF9wcm9jZXNzaW5nKGFyZ3MpOwogCi0JCWZzYm5vID0gYmxrbWFwX2dldChk YV9jdXJzb3ItPmJsa21hcCwgSU5UX0dFVChub2RlLT5idHJlZVtpXS5iZWZvcmUs IEFSQ0hfQ09OVkVSVCkpOwotCQlpZiAoZnNibm8gPT0gTlVMTERGU0JOTykgewot CQkJbGlieGZzX3B1dF9saW9fYnVmZmVyKCh2b2lkICopIGxpb3ApOwotCQkJcmV0 dXJuOwotCQl9CisJcHRocmVhZF9tdXRleF91bmxvY2soJmFyZ3MtPmxvY2spOwor fQogCi0JCWxpb3BbaV0uYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Ju byk7Ci0JCWxpb3BbaV0ubGVuID0gIFhGU19GU0JfVE9fQkIobXAsIDEpOworc3Rh dGljIGludAorcGZfcmVhZF9ibWJ0X3JlY2xpc3QoCisJcHJlZmV0Y2hfYXJnc190 CQkqYXJncywKKwl4ZnNfYm1idF9yZWNfdAkJKnJwLAorCWludAkJCW51bXJlY3Mp Cit7CisJaW50CQkJaTsKKwl4ZnNfZGZzYm5vX3QJCXM7CQkvKiBzdGFydCAqLwor CXhmc19kZmlsYmxrc190CQljOwkJLyogY291bnQgKi8KKwl4ZnNfZGZpbG9mZl90 CQlvOwkJLyogb2Zmc2V0ICovCisJeGZzX2RmaWxibGtzX3QJCWNwID0gMDsJCS8q IHByZXYgY291bnQgKi8KKwl4ZnNfZGZpbG9mZl90CQlvcCA9IDA7CQkvKiBwcmV2 IG9mZnNldCAqLworCWludAkJCWZsYWc7CQkvKiBleHRlbnQgZmxhZyAqLworCisJ Zm9yIChpID0gMDsgaSA8IG51bXJlY3M7IGkrKywgcnArKykgeworCQljb252ZXJ0 X2V4dGVudCgoeGZzX2JtYnRfcmVjXzMyX3QqKXJwLCAmbywgJnMsICZjLCAmZmxh Zyk7CisKKwkJaWYgKCgoaSA+IDApICYmIChvcCArIGNwID4gbykpIHx8IChjID09 IDApIHx8CisJCQkJKG8gPj0gZnNfbWF4X2ZpbGVfb2Zmc2V0KSkKKwkJCXJldHVy biAwOworCisJCWlmICghdmVyaWZ5X2Rmc2JubyhtcCwgcykgfHwgIXZlcmlmeV9k ZnNibm8obXAsIHMgKyBjIC0gMSkpCisJCQlyZXR1cm4gMDsKKworCQlvcCA9IG87 CisJCWNwID0gYzsKKworCQl3aGlsZSAoYykgeworI2lmZGVmIFhSX1BGX1RSQUNF CisJCQlwZnRyYWNlKCJxdWV1aW5nIGRpciBleHRlbnQgaW4gQUcgJWQiLCBhcmdz LT5hZ25vKTsKKyNlbmRpZgorCQkJcGZfcXVldWVfaW8oYXJncywgcywgMSwgQl9N RVRBKTsKKwkJCWMtLTsKKwkJCXMrKzsKKwkJfQogCX0KKwlyZXR1cm4gMTsKK30K IAotCWlmIChpID4gMSkgewotCQlpZiAobGlieGZzX3JlYWRidWZfbGlzdChtcC0+ bV9kZXYsIGksICh2b2lkICopIGxpb3AsIExJQlhGU19MSU9fVFlQRV9ESVIpID09 IC0xKQotCQkJZG9fcHJlZmV0Y2ggPSAwOwotCX0KKy8qCisgKiBzaW1wbGlmaWVk IHZlcnNpb24gb2YgdGhlIG1haW4gc2Nhbl9sYnRyZWUuIFJldHVybnMgMCB0byBz dG9wLgorICovCisKK3N0YXRpYyBpbnQKK3BmX3NjYW5fbGJ0cmVlKAorCXhmc19k ZnNibm9fdAkJZGJubywKKwlpbnQJCQlsZXZlbCwKKwlwcmVmZXRjaF9hcmdzX3QJ CSphcmdzLAorCWludAkJCSgqZnVuYykoeGZzX2J0cmVlX2xibG9ja190CSpibG9j aywKKwkJCQkJaW50CQkJbGV2ZWwsCisJCQkJCXByZWZldGNoX2FyZ3NfdAkJKmFy Z3MpKQoreworCXhmc19idWZfdAkJKmJwOworCWludAkJCXJjOworCisJYnAgPSBs aWJ4ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsIFhGU19GU0JfVE9fREFERFIobXAsIGRi bm8pLAorCQkJWEZTX0ZTQl9UT19CQihtcCwgMSksIDApOworCWlmICghYnApCisJ CXJldHVybiAwOwogCi0JbGlieGZzX3B1dF9saW9fYnVmZmVyKCh2b2lkICopIGxp b3ApOwotCXJldHVybjsKKwlyYyA9ICgqZnVuYykoKHhmc19idHJlZV9sYmxvY2tf dCAqKVhGU19CVUZfUFRSKGJwKSwgbGV2ZWwgLSAxLCBhcmdzKTsKKworCWxpYnhm c19wdXRidWYoYnApOworCisJcmV0dXJuIHJjOwogfQogCi12b2lkCi1wcmVmZXRj aF9kaXIxKAotCXhmc19tb3VudF90CQkqbXAsCi0JeGZzX2RhYmxrX3QJCWJubywK LQlkYV9idF9jdXJzb3JfdAkJKmRhX2N1cnNvcikKK3N0YXRpYyBpbnQKK3BmX3Nj YW5mdW5jX2JtYXAoCisJeGZzX2J0cmVlX2xibG9ja190CSpibG9jaywKKwlpbnQJ CQlsZXZlbCwKKwlwcmVmZXRjaF9hcmdzX3QJCSphcmdzKQogewotCXhmc19kYV9p bnRub2RlX3QJKm5vZGU7Ci0JeGZzX2J1Zl90CQkqYnA7Ci0JeGZzX2Rmc2Jub190 CQlmc2JubzsKKwl4ZnNfYm1idF9yZWNfdAkJKnJwOworCXhmc19ibWJ0X3B0cl90 CQkqcHA7CisJaW50IAkJCW51bXJlY3M7CiAJaW50CQkJaTsKKwl4ZnNfZGZzYm5v X3QJCWRibm87CiAKLQlmc2JubyA9IGJsa21hcF9nZXQoZGFfY3Vyc29yLT5ibGtt YXAsIGJubyk7Ci0JaWYgKGZzYm5vID09IE5VTExERlNCTk8pCi0JCXJldHVybjsK KwkvKgorCSAqIGRvIHNvbWUgdmFsaWRhdGlvbiBvbiB0aGUgYmxvY2sgY29udGVu dHMKKwkgKi8KKwlpZiAoKGJlMzJfdG9fY3B1KGJsb2NrLT5iYl9tYWdpYykgIT0g WEZTX0JNQVBfTUFHSUMpIHx8CisJCQkoYmUxNl90b19jcHUoYmxvY2stPmJiX2xl dmVsKSAhPSBsZXZlbCkpCisJCXJldHVybiAwOwogCi0JYnAgPSBsaWJ4ZnNfcmVh ZGJ1ZihtcC0+bV9kZXYsIFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKSwKLQkJ CVhGU19GU0JfVE9fQkIobXAsIDEpLCAwKTsKKwludW1yZWNzID0gYmUxNl90b19j cHUoYmxvY2stPmJiX251bXJlY3MpOwogCi0JaWYgKGJwID09IE5VTEwpCi0JIAly ZXR1cm47CisJaWYgKGxldmVsID09IDApIHsKKwkJaWYgKG51bXJlY3MgPiBtcC0+ bV9ibWFwX2RteHJbMF0pCisJCQlyZXR1cm4gMDsKIAorCQlycCA9IFhGU19CVFJF RV9SRUNfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsIHhmc19ibWJ0LAorCQkJ CWJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMF0pOwogCi0Jbm9kZSA9ICh4ZnNf ZGFfaW50bm9kZV90ICopWEZTX0JVRl9QVFIoYnApOwotCWlmIChJTlRfR0VUKG5v ZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EQV9OT0RF X01BR0lDKSAgewotCQlsaWJ4ZnNfcHV0YnVmKGJwKTsKLQkJcmV0dXJuOworCQly ZXR1cm4gcGZfcmVhZF9ibWJ0X3JlY2xpc3QoYXJncywgcnAsIG51bXJlY3MpOwog CX0KIAotCXByZWZldGNoX25vZGUobXAsIGJwLCBkYV9jdXJzb3IpOworCWlmIChu dW1yZWNzID4gbXAtPm1fYm1hcF9kbXhyWzFdKQorCQlyZXR1cm4gMDsKIAotCS8q IHNraXAgcHJlZmV0Y2hpbmcgaWYgbmV4dCBsZXZlbCBpcyBsZWFmIGxldmVsICov Ci0JaWYgKElOVF9HRVQobm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpID4g MSkgewotCQlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChub2RlLT5oZHIuY291bnQs IEFSQ0hfQ09OVkVSVCk7IGkrKykgewotCQkJcHJlZmV0Y2hfZGlyMShtcCwKLQkJ CQlJTlRfR0VUKG5vZGUtPmJ0cmVlW2ldLmJlZm9yZSwgQVJDSF9DT05WRVJUKSwK LQkJCQlkYV9jdXJzb3IpOwotCQl9CisJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIo bXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYm1idCwgYmxvY2ssIDEsCisJCQlt cC0+bV9ibWFwX2RteHJbMV0pOworCisJZm9yIChpID0gMDsgaSA8IG51bXJlY3M7 IGkrKykgeworCQlkYm5vID0gYmU2NF90b19jcHUocHBbaV0pOworCQlpZiAoIXZl cmlmeV9kZnNibm8obXAsIGRibm8pKQorCQkJcmV0dXJuIDA7CisJCWlmICghcGZf c2Nhbl9sYnRyZWUoZGJubywgbGV2ZWwsIGFyZ3MsIHBmX3NjYW5mdW5jX2JtYXAp KQorCQkJcmV0dXJuIDA7CiAJfQotCQotCWxpYnhmc19wdXRidWYoYnApOwotCXJl dHVybjsKKwlyZXR1cm4gMTsKIH0KIAotdm9pZAotcHJlZmV0Y2hfZGlyMigKLQl4 ZnNfbW91bnRfdCAgICAgKm1wLAotCWJsa21hcF90ICAgICAgICAqYmxrbWFwKQot ewotCXhmc19kZmlsb2ZmX3QJCWRibm87Ci0JeGZzX2RmaWxvZmZfdAkJcGRibm87 Ci0JYm1hcF9leHRfdAkJKmJtcDsJCi0JaW50CQkJbmV4OwotCWludAkJCWksIGos IHQ7Ci0JbGlieGZzX2xpb19yZXFfdAkqbGlvcDsKIAotCWxpb3AgPSAobGlieGZz X2xpb19yZXFfdCAqKSBsaWJ4ZnNfZ2V0X2xpb19idWZmZXIoTElCWEZTX0xJT19U WVBFX0RJUik7Ci0JaWYgKGxpb3AgPT0gTlVMTCkKK3N0YXRpYyB2b2lkCitwZl9y ZWFkX2J0aW5vZGUoCisJcHJlZmV0Y2hfYXJnc190CQkqYXJncywKKwl4ZnNfZGlu b2RlX3QJCSpkaW5vKQoreworCXhmc19ibWRyX2Jsb2NrX3QJKmRpYjsKKwl4ZnNf Ym1idF9wdHJfdAkJKnBwOworCWludAkJCWk7CisJaW50CQkJbGV2ZWw7CisJaW50 CQkJbnVtcmVjczsKKwlpbnQJCQlkc2l6ZTsKKwl4ZnNfZGZzYm5vX3QJCWRibm87 CisKKwlkaWIgPSAoeGZzX2JtZHJfYmxvY2tfdCAqKVhGU19ERk9SS19EUFRSKGRp bm8pOworCisJbGV2ZWwgPSBiZTE2X3RvX2NwdShkaWItPmJiX2xldmVsKTsKKwlu dW1yZWNzID0gYmUxNl90b19jcHUoZGliLT5iYl9udW1yZWNzKTsKKworCWlmICgo bnVtcmVjcyA9PSAwKSB8fCAobGV2ZWwgPT0gMCkgfHwKKwkJCShsZXZlbCA+IFhG U19CTV9NQVhMRVZFTFMobXAsIFhGU19EQVRBX0ZPUkspKSkKKwkJcmV0dXJuOwor CS8qCisJICogdXNlIGJtZHIvZGZvcmtfZHNpemUgc2luY2UgdGhlIHJvb3QgYmxv Y2sgaXMgaW4gdGhlIGRhdGEgZm9yaworCSAqLworCWlmIChYRlNfQk1EUl9TUEFD RV9DQUxDKG51bXJlY3MpID4gWEZTX0RGT1JLX0RTSVpFKGRpbm8sIG1wKSkKIAkJ cmV0dXJuOwogCi0JcGRibm8gPSBOVUxMREZJTE9GRjsJLyogcHJldmlvdXMgZGJu byBpcyBOVUxMREZJTE9GRiAqLwotCWkgPSAwOwotCXdoaWxlICgoZGJubyA9IGJs a21hcF9uZXh0X29mZihibGttYXAsIHBkYm5vLCAmdCkpIDwgbXAtPm1fZGlyZnJl ZWJsaykgewotCQlpZiAoaSA9PSBsaWJ4ZnNfbGlvX2Rpcl9jb3VudCkKKwlkc2l6 ZSA9IFhGU19ERk9SS19EU0laRShkaW5vLCBtcCk7CisJcHAgPSBYRlNfQlRSRUVf UFRSX0FERFIoZHNpemUsIHhmc19ibWRyLCBkaWIsIDEsCisJCQlYRlNfQlRSRUVf QkxPQ0tfTUFYUkVDUyhkc2l6ZSwgeGZzX2JtZHIsIDApKTsKKworCWZvciAoaSA9 IDA7IGkgPCBudW1yZWNzOyBpKyspIHsKKwkJZGJubyA9IGJlNjRfdG9fY3B1KHBw W2ldKTsKKwkJaWYgKCF2ZXJpZnlfZGZzYm5vKG1wLCBkYm5vKSkKIAkJCWJyZWFr OwotCQlpZiAoZGJubyA9PSBOVUxMREZJTE9GRikKKwkJaWYgKCFwZl9zY2FuX2xi dHJlZShkYm5vLCBsZXZlbCwgYXJncywgcGZfc2NhbmZ1bmNfYm1hcCkpCiAJCQli cmVhazsKLQkJaWYgKG1wLT5tX2RpcmJsa2ZzYnMgPT0gMSkgewotCQkJeGZzX2Rm c2Jub190IGJsazsKLQotCQkJLyogYXZvaWQgYm1wIHJlYWxsb2MvZnJlZSBvdmVy aGVhZCwgdXNlIGJsa21hcF9nZXQgKi8KLQkJCWJsayA9IGJsa21hcF9nZXQoYmxr bWFwLCBkYm5vKTsKLQkJCWlmIChibGsgPT0gTlVMTERGU0JOTykKLQkJCQlicmVh azsKLQkJCXBkYm5vID0gZGJubzsKLQkJCWxpb3BbaV0uYmxrbm8gPSBYRlNfRlNC X1RPX0RBRERSKG1wLCBibGspOwotCQkJbGlvcFtpXS5sZW4gPSAoaW50KSBYRlNf RlNCX1RPX0JCKG1wLCAxKTsKLQkJCWkrKzsKLQkJfQotCQllbHNlIGlmIChtcC0+ bV9kaXJibGtmc2JzID4gMSkgewotCQkJbmV4ID0gYmxrbWFwX2dldG4oYmxrbWFw LCBkYm5vLCBtcC0+bV9kaXJibGtmc2JzLCAmYm1wLCBOVUxMKTsKLQkJCWlmIChu ZXggPT0gMCkKLQkJCQlicmVhazsKLQkJCXBkYm5vID0gZGJubyArIG1wLT5tX2Rp cmJsa2ZzYnMgLSAxOwotCQkJZm9yIChqID0gMDsgaiA8IG5leDsgaisrKSB7Ci0J CQkJbGlvcFtpXS5ibGtubyA9IFhGU19GU0JfVE9fREFERFIobXAsIGJtcFtqXS5z dGFydGJsb2NrKTsKLQkJCQlsaW9wW2ldLmxlbiA9IChpbnQpIFhGU19GU0JfVE9f QkIobXAsIGJtcFtqXS5ibG9ja2NvdW50KTsKLQkJCQlpKys7Ci0JCQkJaWYgKGkg PT0gbGlieGZzX2xpb19kaXJfY291bnQpCi0JCQkJCWJyZWFrOwkvKiBmb3IgbG9v cCAqLwotCQkJfQotCQkJZnJlZShibXApOwotCQl9Ci0JCWVsc2UgewotCQkJZG9f ZXJyb3IoImludmFsaWQgbXAtPm1fZGlyYmxrZnNicyAlZFxuIiwgbXAtPm1fZGly YmxrZnNicyk7Ci0JCX0KLQl9Ci0JaWYgKGkgPiAxKSB7Ci0JCWlmIChsaWJ4ZnNf cmVhZGJ1Zl9saXN0KG1wLT5tX2RldiwgaSwgKHZvaWQgKikgbGlvcCwgTElCWEZT X0xJT19UWVBFX0RJUikgPT0gLTEpCi0JCQlkb19wcmVmZXRjaCA9IDA7CiAJfQot CWxpYnhmc19wdXRfbGlvX2J1ZmZlcigodm9pZCAqKSBsaW9wKTsKIH0KIAogc3Rh dGljIHZvaWQKLXByZWZldGNoX3A2X25vZGUoCi0JeGZzX21vdW50X3QJCSptcCwK LQl4ZnNfaW5vZGVfdAkJKmlwLAotCXhmc19idWZfdAkJKmJwKQorcGZfcmVhZF9l eGlub2RlKAorCXByZWZldGNoX2FyZ3NfdAkJKmFyZ3MsCisJeGZzX2Rpbm9kZV90 CQkqZGlubykKIHsKLQl4ZnNfZGFfaW50bm9kZV90CSpub2RlOwotCWxpYnhmc19s aW9fcmVxX3QJKmxpb3A7Ci0JaW50CQkJaTsKLQl4ZnNfZnNibG9ja190CQlmYmxv Y2s7Ci0JeGZzX2Rmc2Jub190CQlmc2JubzsKLQl4ZnNfYm1idF9pcmVjX3QJCW1h cDsKLQlpbnQJCQlubWFwOwotCWludAkJCWVycm9yOwotCi0Jbm9kZSA9ICh4ZnNf ZGFfaW50bm9kZV90ICopWEZTX0JVRl9QVFIoYnApOwotCWlmIChJTlRfR0VUKG5v ZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA8PSAxKQotCQlyZXR1cm47CisJ cGZfcmVhZF9ibWJ0X3JlY2xpc3QoYXJncywgKHhmc19ibWJ0X3JlY190ICopWEZT X0RGT1JLX0RQVFIoZGlubyksCisJCQliZTMyX3RvX2NwdShkaW5vLT5kaV9jb3Jl LmRpX25leHRlbnRzKSk7Cit9CiAKLQlpZiAoKGxpb3AgPSAobGlieGZzX2xpb19y ZXFfdCAqKSBsaWJ4ZnNfZ2V0X2xpb19idWZmZXIoTElCWEZTX0xJT19UWVBFX0RJ UikpID09IE5VTEwpIHsKLQkJcmV0dXJuOworc3RhdGljIHZvaWQKK3BmX3JlYWRf aW5vZGVfZGlycygKKwlwcmVmZXRjaF9hcmdzX3QJCSphcmdzLAorCXhmc19idWZf dAkJKmJwKQoreworCXhmc19kaW5vZGVfdAkJKmRpbm87CisJaW50CQkJaWNudCA9 IDA7CisJeGZzX2Rpbm9kZV9jb3JlX3QJKmRpbm9jOworCisJZm9yIChpY250ID0g MDsgaWNudCA8IChYRlNfQlVGX0NPVU5UKGJwKSA+PiBtcC0+bV9zYi5zYl9pbm9k ZWxvZyk7IGljbnQrKykgeworCQlkaW5vID0gWEZTX01BS0VfSVBUUihtcCwgYnAs IGljbnQpOworCQlkaW5vYyA9ICZkaW5vLT5kaV9jb3JlOworCisJCS8qCisJCSAq IFdlIGFyZSBvbmx5IHByZWZldGNoaW5nIGRpcmVjdG9yeSBjb250ZW50cyBpbiBl eHRlbnRzCisJCSAqLworCQlpZiAoKChiZTE2X3RvX2NwdShkaW5vYy0+ZGlfbW9k ZSkgJiBTX0lGTVQpICE9IFNfSUZESVIpIHx8CisJCQkJKGRpbm9jLT5kaV9mb3Jt YXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkJCWRpbm9jLT5kaV9m b3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpKQorCQkJY29udGludWU7CisK KwkJLyoKKwkJICogZG8gc29tZSBjaGVja3Mgb24gdGhlIGlub2RlIHRvIHNlZSBp ZiB3ZSBjYW4gcHJlZmV0Y2gKKwkJICogaXRzIGRpcmVjdG9yeSBkYXRhLiBJdCdz IGEgY3V0IGRvd24gdmVyc2lvbiBvZgorCQkgKiBwcm9jZXNzX2Rpbm9kZV9pbnQo KSBpbiBkaW5vZGUuYy4KKwkJICovCisJCWlmIChiZTE2X3RvX2NwdShkaW5vYy0+ ZGlfbWFnaWMpICE9IFhGU19ESU5PREVfTUFHSUMpCisJCQljb250aW51ZTsKKwor CQlpZiAoIVhGU19ESU5PREVfR09PRF9WRVJTSU9OKGRpbm9jLT5kaV92ZXJzaW9u KSB8fAorCQkJCSghZnNfaW5vZGVfbmxpbmsgJiYgZGlub2MtPmRpX3ZlcnNpb24g PgorCQkJCQlYRlNfRElOT0RFX1ZFUlNJT05fMSkpCisJCQljb250aW51ZTsKKwor CQlpZiAoYmU2NF90b19jcHUoZGlub2MtPmRpX3NpemUpIDw9IFhGU19ERk9SS19E U0laRShkaW5vLCBtcCkpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRpbm9jLT5k aV9mb3Jrb2ZmICE9IDApICYmCisJCQkJKGRpbm9jLT5kaV9mb3Jrb2ZmID49IChY RlNfTElUSU5PKG1wKSA+PiAzKSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2gg KGRpbm9jLT5kaV9mb3JtYXQpIHsKKwkJCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhU RU5UUzoKKwkJCQlwZl9yZWFkX2V4aW5vZGUoYXJncywgZGlubyk7CisJCQkJYnJl YWs7CisJCQljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQkJCXBmX3JlYWRf YnRpbm9kZShhcmdzLCBkaW5vKTsKKwkJCQlicmVhazsKKwkJfQogCX0KK30KIAot CWZibG9jayA9IE5VTExGU0JMT0NLOwotCi0JZm9yIChpID0gMDsgaSA8IElOVF9H RVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKLQkJaWYg KGkgPT0gbGlieGZzX2xpb19kaXJfY291bnQpCi0JCQlicmVhazsKKyNkZWZpbmUg TUFYX0JVRlMJMTI4CiAKLQkJbm1hcCA9IDE7Ci0JCWVycm9yID0gbGlieGZzX2Jt YXBpKE5VTEwsIGlwLCAoeGZzX2ZpbGVvZmZfdCkKLQkJCQlJTlRfR0VUKG5vZGUt PmJ0cmVlW2ldLmJlZm9yZSwgQVJDSF9DT05WRVJUKSwgMSwKLQkJCQlYRlNfQk1B UElfTUVUQURBVEEsICZmYmxvY2ssIDAsCi0JCQkJJm1hcCwgJm5tYXAsIE5VTEwp OwordHlwZWRlZiBlbnVtIHBmX3doaWNoCit7CisJUEZfUFJJTUFSWSwKKwlQRl9T RUNPTkRBUlksCisJUEZfTUVUQV9PTkxZCit9IHBmX3doaWNoX3Q7CisKKy8qCisg KiBwZl9iYXRjaF9yZWFkIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgbG9j a2VkLgorICovCiAKLQkJaWYgKGVycm9yIHx8IChubWFwICE9IDEpKSB7Ci0JCQls aWJ4ZnNfcHV0X2xpb19idWZmZXIoKHZvaWQgKikgbGlvcCk7Ci0JCQlyZXR1cm47 CitzdGF0aWMgdm9pZAorcGZfYmF0Y2hfcmVhZCgKKwlwcmVmZXRjaF9hcmdzX3QJ CSphcmdzLAorCXBmX3doaWNoX3QJCXdoaWNoLAorCXZvaWQJCQkqYnVmKQorewor CXN0cnVjdCByYWRpeF90cmVlX3Jvb3QJKnF1ZXVlOworCXhmc19idWZfdAkJKmJw bGlzdFtNQVhfQlVGU107CisJdW5zaWduZWQgaW50CQludW07CisJb2ZmNjRfdAkJ CWZpcnN0X29mZiwgbGFzdF9vZmYsIG5leHRfb2ZmOworCWludAkJCWxlbiwgc2l6 ZTsKKwlpbnQJCQlpOworCWludAkJCWlub2RlX2J1ZnM7CisJdW5zaWduZWQgbG9u ZwkJZnNibm87CisJY2hhcgkJCSpwYnVmOworCisJcXVldWUgPSAod2hpY2ggIT0g UEZfU0VDT05EQVJZKSA/ICZhcmdzLT5wcmltYXJ5X2lvX3F1ZXVlCisJCQkJOiAm YXJncy0+c2Vjb25kYXJ5X2lvX3F1ZXVlOworCisJd2hpbGUgKHJhZGl4X3RyZWVf bG9va3VwX2ZpcnN0KHF1ZXVlLCAmZnNibm8pICE9IE5VTEwpIHsKKworCQlpZiAo d2hpY2ggIT0gUEZfTUVUQV9PTkxZKSB7CisJCQludW0gPSByYWRpeF90cmVlX2dh bmdfbG9va3VwX2V4KHF1ZXVlLAorCQkJCQkodm9pZCoqKSZicGxpc3RbMF0sIGZz Ym5vLAorCQkJCQlmc2JubyArIHBmX21heF9mc2JzLCBNQVhfQlVGUyk7CisJCQlB U1NFUlQobnVtID4gMCk7CisJCQlBU1NFUlQoWEZTX0ZTQl9UT19EQUREUihtcCwg ZnNibm8pID09CisJCQkJWEZTX0JVRl9BRERSKGJwbGlzdFswXSkpOworCQl9IGVs c2UgeworCQkJbnVtID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcocXVldWUs CisJCQkJCSh2b2lkKiopJmJwbGlzdFswXSwgZnNibm8sCisJCQkJCU1BWF9CVUZT IC8gNCwgMCk7CisJCQlpZiAobnVtID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAK LQkJaWYgKChmc2JubyA9IG1hcC5icl9zdGFydGJsb2NrKSA9PSBIT0xFU1RBUlRC TE9DSykgewotCQkJbGlieGZzX3B1dF9saW9fYnVmZmVyKCh2b2lkICopIGxpb3Ap OwotCQkJcmV0dXJuOworCQkvKgorCQkgKiBkbyBhIGJpZyByZWFkIGlmIDI1JSBv ZiB0aGUgcG90ZW50aWFsIGJ1ZmZlciBpcyB1c2VmdWwsCisJCSAqIG90aGVyd2lz ZSwgZmluZCBhcyBtYW55IGNsb3NlIHRvZ2V0aGVyIGJsb2NrcyBhbmQKKwkJICog cmVhZCB0aGVtIGluIG9uZSByZWFkCisJCSAqLworCQlmaXJzdF9vZmYgPSBMSUJY RlNfQkJUT09GRjY0KFhGU19CVUZfQUREUihicGxpc3RbMF0pKTsKKwkJbGFzdF9v ZmYgPSBMSUJYRlNfQkJUT09GRjY0KFhGU19CVUZfQUREUihicGxpc3RbbnVtLTFd KSkgKworCQkJWEZTX0JVRl9TSVpFKGJwbGlzdFtudW0tMV0pOworCQl3aGlsZSAo bGFzdF9vZmYgLSBmaXJzdF9vZmYgPiBwZl9tYXhfYnl0ZXMpIHsKKwkJCW51bS0t OworCQkJbGFzdF9vZmYgPSBMSUJYRlNfQkJUT09GRjY0KFhGU19CVUZfQUREUihi cGxpc3RbbnVtLTFdKSkgKworCQkJCVhGU19CVUZfU0laRShicGxpc3RbbnVtLTFd KTsKKwkJfQorCQlpZiAobnVtIDwgKChsYXN0X29mZiAtIGZpcnN0X29mZikgPj4g KG1wLT5tX3NiLnNiX2Jsb2NrbG9nICsgMykpKSB7CisJCQkvKgorCQkJICogbm90 IGVub3VnaCBibG9ja3MgZm9yIG9uZSBiaWcgcmVhZCwgc28gZGV0ZXJtaW5lCisJ CQkgKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGFyZSBjbG9zZSBlbm91Z2gu CisJCQkgKi8KKwkJCWxhc3Rfb2ZmID0gZmlyc3Rfb2ZmICsgWEZTX0JVRl9TSVpF KGJwbGlzdFswXSk7CisJCQlmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspIHsKKwkJ CQluZXh0X29mZiA9IExJQlhGU19CQlRPT0ZGNjQoWEZTX0JVRl9BRERSKGJwbGlz dFtpXSkpICsKKwkJCQkJCVhGU19CVUZfU0laRShicGxpc3RbaV0pOworCQkJCWlm IChuZXh0X29mZiAtIGxhc3Rfb2ZmID4gcGZfYmF0Y2hfYnl0ZXMpCisJCQkJCWJy ZWFrOworCQkJCWxhc3Rfb2ZmID0gbmV4dF9vZmY7CisJCQl9CisJCQludW0gPSBp OwogCQl9Ci0JCWxpb3BbaV0uYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBm c2Jubyk7Ci0JCWxpb3BbaV0ubGVuID0gIFhGU19GU0JfVE9fQkIobXAsIDEpOwot CX0KIAotCWlmIChpID4gMSkgewotCQlpZiAobGlieGZzX3JlYWRidWZfbGlzdCht cC0+bV9kZXYsIGksICh2b2lkICopIGxpb3AsIExJQlhGU19MSU9fVFlQRV9ESVIp ID09IC0xKQotCQkJZG9fcHJlZmV0Y2ggPSAwOworCQlmb3IgKGkgPSAwOyBpIDwg bnVtOyBpKyspIHsKKwkJCWlmIChyYWRpeF90cmVlX2RlbGV0ZShxdWV1ZSwgWEZT X0RBRERSX1RPX0ZTQihtcCwKKwkJCQkJWEZTX0JVRl9BRERSKGJwbGlzdFtpXSkp KSA9PSBOVUxMKQorCQkJCWRvX2Vycm9yKF8oInByZWZldGNoIGNvcnJ1cHRpb25c biIpKTsKKwkJfQorCisJCWlmICh3aGljaCA9PSBQRl9QUklNQVJZKSB7CisJCQlp ZiAoKGZpcnN0X29mZiA+PiBtcC0+bV9zYi5zYl9ibG9ja2xvZykgPiBwZl9iYXRj aF9mc2JzKQorCQkJCWFyZ3MtPmxhc3RfYm5vX3JlYWQgPSAoZmlyc3Rfb2ZmID4+ IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKTsKKwkJfQorCisJCXB0aHJlYWRfbXV0ZXhf dW5sb2NrKCZhcmdzLT5sb2NrKTsKKworI2lmZGVmIFhSX1BGX1RSQUNFCisJCXBm dHJhY2UoInJlYWRpbmcgYmJzICVsbHUgdG8gJWxsdSAoJWQgYnVmcykgZnJvbSAl cyBxdWV1ZSBpbiBBRyAlZCAobGFzdF9ibm8gPSAlbHUpIiwKKwkJCShsb25nIGxv bmcpWEZTX0JVRl9BRERSKGJwbGlzdFswXSksCisJCQkobG9uZyBsb25nKVhGU19C VUZfQUREUihicGxpc3RbbnVtLTFdKSwgbnVtLAorCQkJKHdoaWNoICE9IFBGX1NF Q09OREFSWSkgPyAicHJpIiA6ICJzZWMiLCBhcmdzLT5hZ25vLAorCQkJYXJncy0+ bGFzdF9ibm9fcmVhZCk7CisjZW5kaWYKKwkJLyoKKwkJICogbm93IHJlYWQgdGhl IGRhdGEgYW5kIHB1dCBpbnRvIHRoZSB4ZnNfYnV0X3QncworCQkgKi8KKwkJbGVu ID0gcHJlYWQ2NChtcF9mZCwgYnVmLCAoaW50KShsYXN0X29mZiAtIGZpcnN0X29m ZiksIGZpcnN0X29mZik7CisJCWlmIChsZW4gPiAwKSB7CisJCQkvKgorCQkJICog Z28gdGhyb3VnaCB0aGUgeGZzX2J1Zl90IGxpc3QgY29weWluZyBmcm9tIHRoZQor CQkJICogcmVhZCBidWZmZXIgaW50byB0aGUgeGZzX2J1Zl90J3MgYW5kIHJlbGVh c2UgdGhlbS4KKwkJCSAqLworCQkJbGFzdF9vZmYgPSBmaXJzdF9vZmY7CisJCQlm b3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKworCQkJCXBidWYgPSAoKGNoYXIg KilidWYpICsgKExJQlhGU19CQlRPT0ZGNjQoWEZTX0JVRl9BRERSKGJwbGlzdFtp XSkpIC0gZmlyc3Rfb2ZmKTsKKwkJCQlzaXplID0gWEZTX0JVRl9TSVpFKGJwbGlz dFtpXSk7CisJCQkJaWYgKGxlbiA8IHNpemUpCisJCQkJCWJyZWFrOworCQkJCW1l bWNweShYRlNfQlVGX1BUUihicGxpc3RbaV0pLCBwYnVmLCBzaXplKTsKKwkJCQli cGxpc3RbaV0tPmJfZmxhZ3MgfD0gTElCWEZTX0JfVVBUT0RBVEU7CisJCQkJbGVu IC09IHNpemU7CisJCQkJaWYgKGJwbGlzdFtpXS0+Yl9mbGFncyAmIEJfSU5PREUp CisJCQkJCXBmX3JlYWRfaW5vZGVfZGlycyhhcmdzLCBicGxpc3RbaV0pOworI2lm ZGVmIFhSX1BGX1RSQUNFCisJCQkJcGZ0cmFjZSgicHV0YnVmICVwICglbGx1KSBp biBBRyAlZCIsIGJwbGlzdFtpXSwKKwkJCQkJKGxvbmcgbG9uZylYRlNfQlVGX0FE RFIoYnBsaXN0W2ldKSwKKwkJCQkJYXJncy0+YWdubyk7CisjZW5kaWYKKwkJCX0K KwkJfQorCQlpbm9kZV9idWZzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG51bTsg aSsrKSB7CisJCQlpZiAoYnBsaXN0W2ldLT5iX2ZsYWdzICYgQl9JTk9ERSkKKwkJ CQlpbm9kZV9idWZzKys7CisJCQlsaWJ4ZnNfcHV0YnVmKGJwbGlzdFtpXSk7CisJ CX0KKwkJcHRocmVhZF9tdXRleF9sb2NrKCZhcmdzLT5sb2NrKTsKKwkJaWYgKHdo aWNoICE9IFBGX1NFQ09OREFSWSkgeworCQkJYXJncy0+aW5vZGVfYnVmc19xdWV1 ZWQgLT0gaW5vZGVfYnVmczsKKyNpZmRlZiBYUl9QRl9UUkFDRQorCQkJcGZ0cmFj ZSgiaW5vZGVfYnVmc19xdWV1ZWQgZm9yIEFHICVkID0gJWQiLCBhcmdzLT5hZ25v LAorCQkJCWFyZ3MtPmlub2RlX2J1ZnNfcXVldWVkKTsKKyNlbmRpZgorCQkJLyoK KwkJCSAqIGlmIHByaW1hcnkgaW5vZGUgcXVldWUgcnVubmluZyBsb3csIHByb2Nl c3MgbWV0YWRhdGEKKwkJCSAqIGluIGJvdGhzIHF1ZXVlcyB0byBhdm9pZCBJL08g c3RhcnZhdGlvbiBhcyB0aGUKKwkJCSAqIHByb2Nlc3NpbmcgdGhyZWFkIHdvdWxk IGJlIHdhaXRpbmcgZm9yIGEgbWV0YWRhdGEKKwkJCSAqIGJ1ZmZlcgorCQkJICov CisJCQlpZiAod2hpY2ggPT0gUEZfUFJJTUFSWSAmJiAhYXJncy0+cXVldWluZ19k b25lICYmCisJCQkJCWFyZ3MtPmlub2RlX2J1ZnNfcXVldWVkIDwgSU9fVEhSRVNI T0xEKSB7CisjaWZkZWYgWFJfUEZfVFJBQ0UKKwkJCQlwZnRyYWNlKCJyZWFkaW5n IG1ldGFkYXRhIGJ1ZnMgZnJvbSBwcmltYXJ5IHF1ZXVlIGZvciBBRyAlZCIsCisJ CQkJCWFyZ3MtPmFnbm8pOworI2VuZGlmCisJCQkJcGZfYmF0Y2hfcmVhZChhcmdz LCBQRl9NRVRBX09OTFksIGJ1Zik7CisjaWZkZWYgWFJfUEZfVFJBQ0UKKwkJCQlw ZnRyYWNlKCJyZWFkaW5nIGJ1ZnMgZnJvbSBzZWNvbmRhcnkgcXVldWUgZm9yIEFH ICVkIiwKKwkJCQkJYXJncy0+YWdubyk7CisjZW5kaWYKKwkJCQlwZl9iYXRjaF9y ZWFkKGFyZ3MsIFBGX1NFQ09OREFSWSwgYnVmKTsKKwkJCX0KKwkJfQogCX0KK30K IAotCWxpYnhmc19wdXRfbGlvX2J1ZmZlcigodm9pZCAqKSBsaW9wKTsKLQlyZXR1 cm47CitzdGF0aWMgdm9pZCAqCitwZl9pb193b3JrZXIoCisJdm9pZAkJCSpwYXJh bSkKK3sKKwlwcmVmZXRjaF9hcmdzX3QJCSphcmdzID0gcGFyYW07CisJdm9pZAkJ CSpidWYgPSBtZW1hbGlnbihsaWJ4ZnNfZGV2aWNlX2FsaWdubWVudCgpLCBwZl9t YXhfYnl0ZXMpOworCXN0cnVjdCBzY2hlZF9wYXJhbQlzcGFyYW07CisJaW50CQkJ cG9saWN5OworCisJcHRocmVhZF9nZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigp LCAmcG9saWN5LCAmc3BhcmFtKTsKKwlzcGFyYW0uc2NoZWRfcHJpb3JpdHkrKzsK KwlwdGhyZWFkX3NldHNjaGVkcGFyYW0ocHRocmVhZF9zZWxmKCksIHBvbGljeSwg JnNwYXJhbSk7CisKKwlwdGhyZWFkX211dGV4X2xvY2soJmFyZ3MtPmxvY2spOwor CXdoaWxlICghYXJncy0+cXVldWluZ19kb25lIHx8IGFyZ3MtPnByaW1hcnlfaW9f cXVldWUuaGVpZ2h0KSB7CisKKyNpZmRlZiBYUl9QRl9UUkFDRQorCQlwZnRyYWNl KCJ3YWl0aW5nIHRvIHN0YXJ0IHByZWZldGNoIEkvTyBmb3IgQUcgJWQiLCBhcmdz LT5hZ25vKTsKKyNlbmRpZgorCQl3aGlsZSAoIWFyZ3MtPmNhbl9zdGFydF9yZWFk aW5nICYmICFhcmdzLT5xdWV1aW5nX2RvbmUpCisJCQlwdGhyZWFkX2NvbmRfd2Fp dCgmYXJncy0+c3RhcnRfcmVhZGluZywgJmFyZ3MtPmxvY2spOworI2lmZGVmIFhS X1BGX1RSQUNFCisJCXBmdHJhY2UoInN0YXJ0aW5nIHByZWZldGNoIEkvTyBmb3Ig QUcgJWQiLCBhcmdzLT5hZ25vKTsKKyNlbmRpZgorCQlwZl9iYXRjaF9yZWFkKGFy Z3MsIFBGX1BSSU1BUlksIGJ1Zik7CisJCXBmX2JhdGNoX3JlYWQoYXJncywgUEZf U0VDT05EQVJZLCBidWYpOworCisjaWZkZWYgWFJfUEZfVFJBQ0UKKwkJcGZ0cmFj ZSgicmFuIG91dCBvZiBidWZzIHRvIHByZWZldGNoIGZvciBBRyAlZCIsIGFyZ3Mt PmFnbm8pOworI2VuZGlmCisJCWlmICghYXJncy0+cXVldWluZ19kb25lKQorCQkJ YXJncy0+Y2FuX3N0YXJ0X3JlYWRpbmcgPSAwOworCX0KKwlwdGhyZWFkX211dGV4 X3VubG9jaygmYXJncy0+bG9jayk7CisKKwlmcmVlKGJ1Zik7CisKKyNpZmRlZiBY Ul9QRl9UUkFDRQorCXBmdHJhY2UoImZpbmlzaGVkIHByZWZldGNoIEkvTyBmb3Ig QUcgJWQiLCBhcmdzLT5hZ25vKTsKKyNlbmRpZgorCXJldHVybiBOVUxMOwogfQog Ci12b2lkCi1wcmVmZXRjaF9wNl9kaXIxKAotCXhmc19tb3VudF90CQkqbXAsCi0J eGZzX2lub190CQlpbm8sCi0JeGZzX2lub2RlX3QJCSppcCwKLQl4ZnNfZGFibGtf dAkJZGFfYm5vLAotCXhmc19mc2Jsb2NrX3QJCSpmYmxvY2twKQorc3RhdGljIGlu dAorcGZfY3JlYXRlX3ByZWZldGNoX3RocmVhZCgKKwlwcmVmZXRjaF9hcmdzX3QJ CSphcmdzKTsKKworc3RhdGljIHZvaWQgKgorcGZfcXVldWluZ193b3JrZXIoCisJ dm9pZAkJCSpwYXJhbSkKIHsKLQl4ZnNfZGFfaW50bm9kZV90CSpub2RlOwotCXhm c19idWZfdAkJKmJwOwotCXhmc19kZnNibm9fdAkJZnNibm87Ci0JeGZzX2JtYnRf aXJlY190CQltYXA7Ci0JaW50CQkJbm1hcDsKKwlwcmVmZXRjaF9hcmdzX3QJCSph cmdzID0gcGFyYW07CisJaW50CQkJbnVtX2lub3M7CisJaW5vX3RyZWVfbm9kZV90 CQkqaXJlYzsKKwlpbm9fdHJlZV9ub2RlX3QJCSpjdXJfaXJlYzsKKwlpbnQJCQli bGtzX3Blcl9jbHVzdGVyOworCWludAkJCWlub3NfcGVyX2NsdXN0ZXI7CisJeGZz X2FnYmxvY2tfdAkJYm5vOwogCWludAkJCWk7Ci0JaW50CQkJZXJyb3I7CisJaW50 CQkJZXJyOwogCi0Jbm1hcCA9IDE7Ci0JZXJyb3IgPSBsaWJ4ZnNfYm1hcGkoTlVM TCwgaXAsICh4ZnNfZmlsZW9mZl90KSBkYV9ibm8sIDEsCi0JCQlYRlNfQk1BUElf TUVUQURBVEEsIGZibG9ja3AsIDAsCi0JCQkmbWFwLCAmbm1hcCwgTlVMTCk7Ci0J aWYgKGVycm9yIHx8IChubWFwICE9IDEpKSAgewotCQlyZXR1cm47CisJYmxrc19w ZXJfY2x1c3RlciA9ICBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSA+PiBtcC0+ bV9zYi5zYl9ibG9ja2xvZzsKKwlpZiAoYmxrc19wZXJfY2x1c3RlciA9PSAwKQor CQlibGtzX3Blcl9jbHVzdGVyID0gMTsKKwlpbm9zX3Blcl9jbHVzdGVyID0gYmxr c19wZXJfY2x1c3RlciAqIG1wLT5tX3NiLnNiX2lub3BibG9jazsKKworCWZvciAo aSA9IDA7IGkgPCBQRl9USFJFQURfQ09VTlQ7IGkrKykgeworCQllcnIgPSBwdGhy ZWFkX2NyZWF0ZSgmYXJncy0+aW9fdGhyZWFkc1tpXSwgTlVMTCwKKwkJCQlwZl9p b193b3JrZXIsIGFyZ3MpOworCQlpZiAoZXJyICE9IDApIHsKKwkJCWRvX3dhcm4o XygiZmFpbGVkIHRvIGNyZWF0ZSBwcmVmZXRjaCB0aHJlYWQ6ICVzXG4iKSwKKwkJ CQlzdHJlcnJvcihlcnIpKTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlwZl9zdGFy dF9wcm9jZXNzaW5nKGFyZ3MpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJ LyoKKwkJCSAqIHNpbmNlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIEkvTyB0aHJlYWQs IHVzZSB0aGVtIGZvcgorCQkJICogcHJlZmV0Y2gKKwkJCSAqLworCQkJYnJlYWs7 CisJCX0KIAl9CiAKLQlpZiAoKGZzYm5vID0gbWFwLmJyX3N0YXJ0YmxvY2spID09 IEhPTEVTVEFSVEJMT0NLKQotCQlyZXR1cm47CisjaWZkZWYgWFJfUEZfVFJBQ0UK KwlwZnRyYWNlKCJzdGFydGluZyBwcmVmZXRjaCBmb3IgQUcgJWQiLCBhcmdzLT5h Z25vKTsKKyNlbmRpZgorCisJZm9yIChpcmVjID0gZmluZGZpcnN0X2lub2RlX3Jl YyhhcmdzLT5hZ25vKTsgaXJlYyAhPSBOVUxMOworCQkJaXJlYyA9IG5leHRfaW5v X3JlYyhpcmVjKSkgeworCisJCWN1cl9pcmVjID0gaXJlYzsKKworCQludW1faW5v cyA9IFhGU19JTk9ERVNfUEVSX0NIVU5LOworCQl3aGlsZSAobnVtX2lub3MgPCBY RlNfSUFMTE9DX0lOT0RFUyhtcCkgJiYgaXJlYyAhPSBOVUxMKSB7CisJCQlpcmVj ID0gbmV4dF9pbm9fcmVjKGlyZWMpOworCQkJbnVtX2lub3MgKz0gWEZTX0lOT0RF U19QRVJfQ0hVTks7CisJCX0KKworCQlpZiAoYXJncy0+ZGlyc19vbmx5ICYmIGN1 cl9pcmVjLT5pbm9faXNhX2RpciA9PSAwKQorCQkJY29udGludWU7CisjaWZkZWYg WFJfUEZfVFJBQ0UKKwkJc2VtX2dldHZhbHVlKCZhcmdzLT5yYV9jb3VudCwgJmkp OworCQlwZnRyYWNlKCJxdWV1aW5nIGlyZWMgJXAgaW4gQUcgJWQsIHNlbSBjb3Vu dCA9ICVkIiwKKwkJCWlyZWMsIGFyZ3MtPmFnbm8sIGkpOworI2VuZGlmCisJCXNl bV93YWl0KCZhcmdzLT5yYV9jb3VudCk7CisKKwkJbnVtX2lub3MgPSAwOworCQli bm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGN1cl9pcmVjLT5pbm9fc3RhcnRu dW0pOworCisJCWRvIHsKKwkJCXBmX3F1ZXVlX2lvKGFyZ3MsIFhGU19BR0JfVE9f RlNCKG1wLCBhcmdzLT5hZ25vLCBibm8pLAorCQkJCQlibGtzX3Blcl9jbHVzdGVy LCBCX0lOT0RFKTsKKwkJCWJubyArPSBibGtzX3Blcl9jbHVzdGVyOworCQkJbnVt X2lub3MgKz0gaW5vc19wZXJfY2x1c3RlcjsKKwkJfSB3aGlsZSAobnVtX2lub3Mg PCBYRlNfSUFMTE9DX0lOT0RFUyhtcCkpOworCX0KKworCXB0aHJlYWRfbXV0ZXhf bG9jaygmYXJncy0+bG9jayk7CisKKyNpZmRlZiBYUl9QRl9UUkFDRQorCXBmdHJh Y2UoImZpbmlzaGVkIHF1ZXVpbmcgaW5vZGVzIGZvciBBRyAlZCAoaW5vZGVfYnVm c19xdWV1ZWQgPSAlZCkiLAorCQlhcmdzLT5hZ25vLCBhcmdzLT5pbm9kZV9idWZz X3F1ZXVlZCk7CisjZW5kaWYKKwlhcmdzLT5xdWV1aW5nX2RvbmUgPSAxOworCXBm X3N0YXJ0X2lvX3dvcmtlcnMoYXJncyk7CisJcGZfc3RhcnRfcHJvY2Vzc2luZyhh cmdzKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYXJncy0+bG9jayk7CisKKwkv KiBub3cgd2FpdCBmb3IgdGhlIHJlYWRlcnMgdG8gZmluaXNoICovCisJZm9yIChp ID0gMDsgaSA8IFBGX1RIUkVBRF9DT1VOVDsgaSsrKQorCQlpZiAoYXJncy0+aW9f dGhyZWFkc1tpXSkKKwkJCXB0aHJlYWRfam9pbihhcmdzLT5pb190aHJlYWRzW2ld LCBOVUxMKTsKKworI2lmZGVmIFhSX1BGX1RSQUNFCisJcGZ0cmFjZSgicHJlZmV0 Y2ggZm9yIEFHICVkIGZpbmlzaGVkIiwgYXJncy0+YWdubyk7CisjZW5kaWYKKwlw dGhyZWFkX211dGV4X2xvY2soJmFyZ3MtPmxvY2spOworCisJQVNTRVJUKGFyZ3Mt PnByaW1hcnlfaW9fcXVldWUuaGVpZ2h0ID09IDApOworCUFTU0VSVChhcmdzLT5z ZWNvbmRhcnlfaW9fcXVldWUuaGVpZ2h0ID09IDApOworCisJYXJncy0+cHJlZmV0 Y2hfZG9uZSA9IDE7CisJaWYgKGFyZ3MtPm5leHRfYXJncykKKwkJcGZfY3JlYXRl X3ByZWZldGNoX3RocmVhZChhcmdzLT5uZXh0X2FyZ3MpOwogCi0JYnAgPSBsaWJ4 ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsIFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5v KSwKLQkJCVhGU19GU0JfVE9fQkIobXAsIDEpLCAwKTsKKwlwdGhyZWFkX211dGV4 X3VubG9jaygmYXJncy0+bG9jayk7CiAKLQlpZiAoYnAgPT0gTlVMTCkKLQkgCXJl dHVybjsKKwlyZXR1cm4gTlVMTDsKK30KIAorc3RhdGljIGludAorcGZfY3JlYXRl X3ByZWZldGNoX3RocmVhZCgKKwlwcmVmZXRjaF9hcmdzX3QJCSphcmdzKQorewor CWludAkJCWVycjsKIAotCW5vZGUgPSAoeGZzX2RhX2ludG5vZGVfdCAqKVhGU19C VUZfUFRSKGJwKTsKLQlpZiAoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywg QVJDSF9DT05WRVJUKSAhPSBYRlNfREFfTk9ERV9NQUdJQykgIHsKLQkJbGlieGZz X3B1dGJ1ZihicCk7Ci0JCXJldHVybjsKKyNpZmRlZiBYUl9QRl9UUkFDRQorCXBm dHJhY2UoImNyZWF0aW5nIHF1ZXVlIHRocmVhZCBmb3IgQUcgJWQiLCBhcmdzLT5h Z25vKTsKKyNlbmRpZgorCWVyciA9IHB0aHJlYWRfY3JlYXRlKCZhcmdzLT5xdWV1 aW5nX3RocmVhZCwgTlVMTCwKKwkJCXBmX3F1ZXVpbmdfd29ya2VyLCBhcmdzKTsK KwlpZiAoZXJyICE9IDApIHsKKwkJZG9fd2FybihfKCJmYWlsZWQgdG8gY3JlYXRl IHByZWZldGNoIHRocmVhZDogJXNcbiIpLAorCQkJc3RyZXJyb3IoZXJyKSk7CisJ CWNsZWFudXBfaW5vZGVfcHJlZmV0Y2goYXJncyk7CiAJfQogCi0JcHJlZmV0Y2hf cDZfbm9kZShtcCwgaXAsIGJwKTsKLQotCS8qIHNraXAgcHJlZmV0Y2hpbmcgaWYg bmV4dCBsZXZlbCBpcyBsZWFmIGxldmVsICovCi0JaWYgKElOVF9HRVQobm9kZS0+ aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpID4gMSkgewotCQlmb3IgKGkgPSAwOyBp IDwgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykg ewotCQkJKHZvaWQpIHByZWZldGNoX3A2X2RpcjEobXAsIGlubywgaXAsCi0JCQkJ SU5UX0dFVChub2RlLT5idHJlZVtpXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCksCi0J CQkJZmJsb2NrcCk7Ci0JCX0KLQl9Ci0JCi0JbGlieGZzX3B1dGJ1ZihicCk7Ci0J cmV0dXJuOworCXJldHVybiBlcnIgPT0gMDsKIH0KIAotI2RlZmluZQlOTUFQUAk0 Ci0KIHZvaWQKLXByZWZldGNoX3A2X2RpcjIoCi0JeGZzX21vdW50X3QgICAgICpt cCwKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JeGZzX2ZpbGVvZmZfdAkJZGFfYm5v OwotCXhmc19maWxlb2ZmX3QJCW5leHRfZGFfYm5vOwotCWludAkJCWksIGo7Ci0J bGlieGZzX2xpb19yZXFfdAkqbGlvcDsKLQl4ZnNfZnNibG9ja190CQlmc2I7Ci0J aW50CQkJbmZzYjsKLQlpbnQJCQllcnJvcjsKK2luaXRfcHJlZmV0Y2goCisJeGZz X21vdW50X3QJCSpwbXApCit7CisJbXAgPSBwbXA7CisJbXBfZmQgPSBsaWJ4ZnNf ZGV2aWNlX3RvX2ZkKG1wLT5tX2Rldik7CisJcGZfbWF4X2J5dGVzID0gc3lzY29u ZihfU0NfUEFHRV9TSVpFKSA8PCA3OworCXBmX21heF9iYnMgPSBwZl9tYXhfYnl0 ZXMgPj4gQkJTSElGVDsKKwlwZl9tYXhfZnNicyA9IHBmX21heF9ieXRlcyA+PiBt cC0+bV9zYi5zYl9ibG9ja2xvZzsKKwlwZl9iYXRjaF9ieXRlcyA9IERFRl9CQVRD SF9CWVRFUzsKKwlwZl9iYXRjaF9mc2JzID0gREVGX0JBVENIX0JZVEVTID4+ICht cC0+bV9zYi5zYl9ibG9ja2xvZyArIDEpOworfQogCi0JaWYgKChsaW9wID0gKGxp Ynhmc19saW9fcmVxX3QgKikgbGlieGZzX2dldF9saW9fYnVmZmVyKExJQlhGU19M SU9fVFlQRV9ESVIpKSA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JaSA9IDA7 Ci0JZm9yIChkYV9ibm8gPSAwLCBuZXh0X2RhX2JubyA9IDA7IG5leHRfZGFfYm5v ICE9IE5VTExGSUxFT0ZGOyBkYV9ibm8gPSBuZXh0X2RhX2JubykgewotCQlpZiAo aSA9PSBsaWJ4ZnNfbGlvX2Rpcl9jb3VudCkKLQkJCWJyZWFrOwotCQluZXh0X2Rh X2JubyA9IGRhX2JubyArIG1wLT5tX2RpcmJsa2ZzYnMgLSAxOwotCQlpZiAobGli eGZzX2JtYXBfbmV4dF9vZmZzZXQoTlVMTCwgaXAsICZuZXh0X2RhX2JubywgWEZT X0RBVEFfRk9SSykpCi0JCQlicmVhazsKK3ByZWZldGNoX2FyZ3NfdCAqCitzdGFy dF9pbm9kZV9wcmVmZXRjaCgKKwl4ZnNfYWdudW1iZXJfdAkJYWdubywKKwlpbnQJ CQlkaXJzX29ubHksCisJcHJlZmV0Y2hfYXJnc190CQkqcHJldl9hcmdzKQorewor CXByZWZldGNoX2FyZ3NfdAkJKmFyZ3M7CiAKLQkJaWYgKG1wLT5tX2RpcmJsa2Zz YnMgPT0gMSkgewotCQkJaWYgKChlcnJvciA9IGxpYnhmc19ibWFwaV9zaW5nbGUo TlVMTCwgaXAsIFhGU19EQVRBX0ZPUkssICZmc2IsIGRhX2JubykpICE9IDApIHsK LQkJCQlsaWJ4ZnNfcHV0X2xpb19idWZmZXIoKHZvaWQgKikgbGlvcCk7Ci0JCQkJ ZG9fcHJlZmV0Y2ggPSAwOwotCQkJCWRvX3dhcm4oInBoYXNlNiBwcmVmZXRjaDog Y2Fubm90IGJtYXAgc2luZ2xlIGJsb2NrIGVyciA9ICVkXG4iLCBlcnJvcik7Ci0J CQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZzYiA9PSBOVUxMRlNCTE9DSykgewot CQkJCWxpYnhmc19wdXRfbGlvX2J1ZmZlcigodm9pZCAqKSBsaW9wKTsKLQkJCQly ZXR1cm47Ci0JCQl9CisJaWYgKGFnbm8gPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCB8 fCAhZG9fcHJlZmV0Y2gpCisJCXJldHVybiBOVUxMOwogCi0JCQlsaW9wW2ldLmJs a25vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNiKTsKLQkJCWxpb3BbaV0ubGVu ID0gIFhGU19GU0JfVE9fQkIobXAsIDEpOwotCQkJaSsrOwotCQl9Ci0JCWVsc2Ug aWYgKChuZnNiID0gbXAtPm1fZGlyYmxrZnNicykgPiAxKSB7Ci0JCQl4ZnNfZnNi bG9ja190ICAgZmlyc3RibG9jazsKLQkJCXhmc19ibWJ0X2lyZWNfdCBtYXBbTk1B UFBdOwotCQkJeGZzX2JtYnRfaXJlY190ICptYXBwOwotCQkJaW50ICAgICAgICAg ICAgIG5tYXA7Ci0KLQkJCWlmIChuZnNiID4gTk1BUFApIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIAltYXBwID0gbWFsbG9jKHNpemVvZigqbWFwcCkgKiBuZnNi KTsKLQkJCQlpZiAobWFwcCA9PSBOVUxMKSB7Ci0JCQkJCWxpYnhmc19wdXRfbGlv X2J1ZmZlcigodm9pZCAqKSBsaW9wKTsKLQkJCQkJZG9fcHJlZmV0Y2ggPSAwOwot CQkJCQlkb193YXJuKCJwaGFzZTYgcHJlZmV0Y2g6IGNhbm5vdCBhbGxvY2F0ZSBt ZW0gZm9yIG1hcFxuIik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQll bHNlIHsKLQkJCQltYXBwID0gbWFwOwotCQkJfQotICAgICAgICAgICAgICAgICAg ICAgICAgZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOwotICAgICAgICAgICAgICAg ICAgICAgICAgbm1hcCA9IG5mc2I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp ZiAoKGVycm9yID0gbGlieGZzX2JtYXBpKE5VTEwsIGlwLCBkYV9ibm8sCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZzYiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRlNfQk1BUElfTUVU QURBVEEgfCBYRlNfQk1BUElfQUZMQUcoWEZTX0RBVEFfRk9SSyksCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0YmxvY2ssIDAs IG1hcHAsICZubWFwLCBOVUxMKSkpIHsKLQkJCQlsaWJ4ZnNfcHV0X2xpb19idWZm ZXIoKHZvaWQgKikgbGlvcCk7Ci0JCQkJZG9fcHJlZmV0Y2ggPSAwOwotCQkJCWRv X3dhcm4oInBoYXNlNiBwcmVmZXRjaDogY2Fubm90IGJtYXAgZXJyID0gJWRcbiIs IGVycm9yKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGogPSAwOyBqIDwg bm1hcDsgaisrKSB7Ci0JCQkJbGlvcFtpXS5ibGtubyA9IFhGU19GU0JfVE9fREFE RFIobXAsIG1hcHBbal0uYnJfc3RhcnRibG9jayk7Ci0JCQkJbGlvcFtpXS5sZW4g PSAoaW50KVhGU19GU0JfVE9fQkIobXAsIG1hcHBbal0uYnJfYmxvY2tjb3VudCk7 Ci0JCQkJaSsrOwotCQkJCWlmIChpID09IGxpYnhmc19saW9fZGlyX2NvdW50KQot CQkJCQlicmVhazsgLyogZm9yIGxvb3AgKi8KLQkJCX0KLQkJCWlmIChtYXBwICE9 IG1hcCkKLQkJCQlmcmVlKG1hcHApOworCWFyZ3MgPSBjYWxsb2MoMSwgc2l6ZW9m KHByZWZldGNoX2FyZ3NfdCkpOwogCi0JCX0KLQkJZWxzZSB7Ci0JCQlkb19lcnJv cigicGhhc2U2OiBpbnZhbGlkIG1wLT5tX2RpcmJsa2ZzYnMgJWRcbiIsIG1wLT5t X2RpcmJsa2ZzYnMpOwotCQl9Ci0JfQotCWlmIChpID4gMSkgewotCQlpZiAobGli eGZzX3JlYWRidWZfbGlzdChtcC0+bV9kZXYsIGksICh2b2lkICopIGxpb3AsIExJ QlhGU19MSU9fVFlQRV9ESVIpID09IC0xKQotCQkJZG9fcHJlZmV0Y2ggPSAwOwor CUlOSVRfUkFESVhfVFJFRSgmYXJncy0+cHJpbWFyeV9pb19xdWV1ZSwgMCk7CisJ SU5JVF9SQURJWF9UUkVFKCZhcmdzLT5zZWNvbmRhcnlfaW9fcXVldWUsIDApOwor CXB0aHJlYWRfbXV0ZXhfaW5pdCgmYXJncy0+bG9jaywgTlVMTCk7CisJcHRocmVh ZF9jb25kX2luaXQoJmFyZ3MtPnN0YXJ0X3JlYWRpbmcsIE5VTEwpOworCXB0aHJl YWRfY29uZF9pbml0KCZhcmdzLT5zdGFydF9wcm9jZXNzaW5nLCBOVUxMKTsKKwlh cmdzLT5hZ25vID0gYWdubzsKKwlhcmdzLT5kaXJzX29ubHkgPSBkaXJzX29ubHk7 CisKKwkvKgorCSAqIHVzZSBvbmx5IDEvNCBvZiB0aGUgbGlieGZzIGNhY2hlIGFz IHdlIGFyZSBvbmx5IGNvdW50aW5nIGlub2RlcworCSAqIGFuZCBub3QgYW55IG90 aGVyIGFzc29jaWF0ZWQgbWV0YWRhdGEgbGlrZSBkaXJlY3RvcmllcworCSAqLwor CisJc2VtX2luaXQoJmFyZ3MtPnJhX2NvdW50LCAwLCBsaWJ4ZnNfYmNhY2hlLT5j X21heGNvdW50IC8gdGhyZWFkX2NvdW50IC8KKwkJKFhGU19JQUxMT0NfQkxPQ0tT KG1wKSAvIChYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSA+PiBtcC0+bV9zYi5z Yl9ibG9ja2xvZykpIC8gNCk7CisKKwlpZiAoIXByZXZfYXJncykgeworCQlpZiAo IXBmX2NyZWF0ZV9wcmVmZXRjaF90aHJlYWQoYXJncykpCisJCQlyZXR1cm4gTlVM TDsKKwl9IGVsc2UgeworCQlwdGhyZWFkX211dGV4X2xvY2soJnByZXZfYXJncy0+ bG9jayk7CisJCWlmIChwcmV2X2FyZ3MtPnByZWZldGNoX2RvbmUpIHsKKwkJCWlm ICghcGZfY3JlYXRlX3ByZWZldGNoX3RocmVhZChhcmdzKSkKKwkJCQlhcmdzID0g TlVMTDsKKwkJfSBlbHNlCisJCQlwcmV2X2FyZ3MtPm5leHRfYXJncyA9IGFyZ3M7 CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwcmV2X2FyZ3MtPmxvY2spOwogCX0K LQlsaWJ4ZnNfcHV0X2xpb19idWZmZXIoKHZvaWQgKikgbGlvcCk7CisKKwlyZXR1 cm4gYXJnczsKIH0KIAogdm9pZAotcHJlZmV0Y2hfc2IoeGZzX21vdW50X3QgKm1w LCB4ZnNfYWdudW1iZXJfdCAgYWdubykKK3dhaXRfZm9yX2lub2RlX3ByZWZldGNo KAorCXByZWZldGNoX2FyZ3NfdAkJKmFyZ3MpCiB7Ci0JbGlieGZzX2xpb19yZXFf dAkqbGlvcDsKLQotCWlmICgobGlvcCA9IChsaWJ4ZnNfbGlvX3JlcV90ICopIGxp Ynhmc19nZXRfbGlvX2J1ZmZlcihMSUJYRlNfTElPX1RZUEVfUkFXKSkgPT0gTlVM TCkgewotCQlkb19wcmVmZXRjaCA9IDA7CisJaWYgKGFyZ3MgPT0gTlVMTCkKIAkJ cmV0dXJuOwotCX0KIAotCWxpb3BbMF0uYmxrbm8gPSBYRlNfQUdfREFERFIobXAs IGFnbm8sIFhGU19TQl9EQUREUik7Ci0JbGlvcFsxXS5ibGtubyA9IFhGU19BR19E QUREUihtcCwgYWdubywgWEZTX0FHRl9EQUREUihtcCkpOwotCWxpb3BbMl0uYmxr bm8gPSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKTsK LQlsaW9wWzBdLmxlbiA9IFhGU19GU1NfVE9fQkIobXAsIDEpOwotCWxpb3BbMV0u bGVuID0gWEZTX0ZTU19UT19CQihtcCwgMSk7Ci0JbGlvcFsyXS5sZW4gPSBYRlNf RlNTX1RPX0JCKG1wLCAxKTsKLQlpZiAobGlieGZzX3JlYWRidWZfbGlzdChtcC0+ bV9kZXYsIDMsICh2b2lkICopIGxpb3AsIExJQlhGU19MSU9fVFlQRV9SQVcpID09 IC0xKQotCQlkb19wcmVmZXRjaCA9IDA7CisJcHRocmVhZF9tdXRleF9sb2NrKCZh cmdzLT5sb2NrKTsKIAotCWxpYnhmc19wdXRfbGlvX2J1ZmZlcigodm9pZCAqKSBs aW9wKTsKKwl3aGlsZSAoIWFyZ3MtPmNhbl9zdGFydF9wcm9jZXNzaW5nKSB7Cisj aWZkZWYgWFJfUEZfVFJBQ0UKKwkJcGZ0cmFjZSgid2FpdGluZyB0byBzdGFydCBw cm9jZXNzaW5nIEFHICVkIiwgYXJncy0+YWdubyk7CisjZW5kaWYKKwkJcHRocmVh ZF9jb25kX3dhaXQoJmFyZ3MtPnN0YXJ0X3Byb2Nlc3NpbmcsICZhcmdzLT5sb2Nr KTsKKwl9CisjaWZkZWYgWFJfUEZfVFJBQ0UKKwlwZnRyYWNlKCJjYW4gc3RhcnQg cHJvY2Vzc2luZyBBRyAlZCIsIGFyZ3MtPmFnbm8pOworI2VuZGlmCisJcHRocmVh ZF9tdXRleF91bmxvY2soJmFyZ3MtPmxvY2spOwogfQogCiB2b2lkCi1wcmVmZXRj aF9yb290cyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sCi0J CXhmc19hZ2ZfdCAqYWdmLCB4ZnNfYWdpX3QgKmFnaSkKK2NsZWFudXBfaW5vZGVf cHJlZmV0Y2goCisJcHJlZmV0Y2hfYXJnc190CQkqYXJncykKIHsKLQlpbnQJCQlp OwotCWxpYnhmc19saW9fcmVxX3QJKmxpb3A7Ci0KLQlpZiAoKGxpb3AgPSAobGli eGZzX2xpb19yZXFfdCAqKSBsaWJ4ZnNfZ2V0X2xpb19idWZmZXIoTElCWEZTX0xJ T19UWVBFX1JBVykpID09IE5VTEwpIHsKLQkJZG9fcHJlZmV0Y2ggPSAwOworCWlm IChhcmdzID09IE5VTEwpCiAJCXJldHVybjsKLQl9CiAKLQlpID0gMDsKLQlpZiAo YWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0JOT10gIT0gMCAmJgotCQkJdmVyaWZ5 X2FnYm5vKG1wLCBhZ25vLCBhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQk5PXSkp IHsKLQkJbGlvcFtpXS5ibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8s IGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9CTk9dKTsKLQkJbGlvcFtpXS5sZW4g PSBYRlNfRlNCX1RPX0JCKG1wLCAxKTsKLQkJaSsrOwotCX0KLQlpZiAoYWdmLT5h Z2Zfcm9vdHNbWEZTX0JUTlVNX0NOVF0gIT0gMCAmJgotCQkJdmVyaWZ5X2FnYm5v KG1wLCBhZ25vLCBhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQ05UXSkpIHsKLQkJ bGlvcFtpXS5ibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnZi0+ YWdmX3Jvb3RzW1hGU19CVE5VTV9DTlRdKTsKLQkJbGlvcFtpXS5sZW4gPSBYRlNf RlNCX1RPX0JCKG1wLCAxKTsKLQkJaSsrOwotCX0KLQlpZiAoYWdpLT5hZ2lfcm9v dCAhPSAwICYmIHZlcmlmeV9hZ2JubyhtcCwgYWdubywgYWdpLT5hZ2lfcm9vdCkp IHsKLQkJbGlvcFtpXS5ibGtubyA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8s IGFnaS0+YWdpX3Jvb3QpOwotCQlsaW9wW2ldLmxlbiA9IFhGU19GU0JfVE9fQkIo bXAsIDEpOwotCQlpKys7Ci0JfQotCWlmIChpID4gMSkgewotCQlpZiAobGlieGZz X3JlYWRidWZfbGlzdChtcC0+bV9kZXYsIGksICh2b2lkICopIGxpb3AsIExJQlhG U19MSU9fVFlQRV9SQVcpID09IC0xKQotCQkJZG9fcHJlZmV0Y2ggPSAwOwotCX0K KyNpZmRlZiBYUl9QRl9UUkFDRQorCXBmdHJhY2UoIndhaXRpbmcgQUcgJWQgcHJl ZmV0Y2ggdG8gZmluaXNoIiwgYXJncy0+YWdubyk7CisjZW5kaWYKKwlpZiAoYXJn cy0+cXVldWluZ190aHJlYWQpCisJCXB0aHJlYWRfam9pbihhcmdzLT5xdWV1aW5n X3RocmVhZCwgTlVMTCk7CisKKyNpZmRlZiBYUl9QRl9UUkFDRQorCXBmdHJhY2Uo IkFHICVkIHByZWZldGNoIGRvbmUiLCBhcmdzLT5hZ25vKTsKKyNlbmRpZgorCXB0 aHJlYWRfbXV0ZXhfZGVzdHJveSgmYXJncy0+bG9jayk7CisJcHRocmVhZF9jb25k X2Rlc3Ryb3koJmFyZ3MtPnN0YXJ0X3JlYWRpbmcpOworCXB0aHJlYWRfY29uZF9k ZXN0cm95KCZhcmdzLT5zdGFydF9wcm9jZXNzaW5nKTsKKwlzZW1fZGVzdHJveSgm YXJncy0+cmFfY291bnQpOworCisJZnJlZShhcmdzKTsKK30KKworI2lmZGVmIFhS X1BGX1RSQUNFCiAKLQlsaWJ4ZnNfcHV0X2xpb19idWZmZXIoKHZvaWQgKikgbGlv cCk7Cit2b2lkCitfcGZ0cmFjZShjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFy ICptc2csIC4uLikKK3sKKwljaGFyCQlidWZbMTI4XTsKKwlzdHJ1Y3QgdGltZXZh bAl0djsKKwl2YV9saXN0IAlhcmdzOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVM TCk7CisKKwl2YV9zdGFydChhcmdzLCBtc2cpOworCXZzbnByaW50ZihidWYsIHNp emVvZihidWYpLCBtc2csIGFyZ3MpOworCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdc MCc7CisJdmFfZW5kKGFyZ3MpOworCisJZnByaW50ZihwZl90cmFjZV9maWxlLCAi JWx1LiUwNmx1ICAlczogJXNcbiIsIHR2LnR2X3NlYywgdHYudHZfdXNlYywgZnVu YywgYnVmKTsKIH0KKworI2VuZGlmCkluZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVw YWlyL3ByZWZldGNoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9y aWcveGZzcHJvZ3MvcmVwYWlyL3ByZWZldGNoLmgJMjAwNy0wNC0yNyAxMzoxMzoz NS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcHJl ZmV0Y2guaAkyMDA3LTA2LTA1IDEyOjA3OjIyLjUwMjI3MjU3MiArMTAwMApAQCAt MSw0NSArMSw1OSBAQAogI2lmbmRlZiBfWEZTX1JFUEFJUl9QUkVGRVRDSF9ICiAj ZGVmaW5lCV9YRlNfUkVQQUlSX1BSRUZFVENIX0gKIAotc3RydWN0IGJsa21hcDsK LXN0cnVjdCBkYV9idF9jdXJzb3I7Ci1zdHJ1Y3QgeGZzX21vdW50OwotCi1leHRl cm4gCWludCBkb19wcmVmZXRjaDsKLQotc3RydWN0IGlub190cmVlX25vZGUgKnBy ZWZldGNoX2lub2RlX2NodW5rcygKLQlzdHJ1Y3QgeGZzX21vdW50ICosCi0JeGZz X2FnbnVtYmVyX3QsCi0Jc3RydWN0IGlub190cmVlX25vZGUgKik7Ci0KLWV4dGVy biB2b2lkIHByZWZldGNoX2RpcjEoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0J eGZzX2RhYmxrX3QJCWJubywKLQlzdHJ1Y3QgZGFfYnRfY3Vyc29yCSpkYV9jdXJz b3IpOwotCi1leHRlcm4gdm9pZCBwcmVmZXRjaF9kaXIyKAotCXN0cnVjdCB4ZnNf bW91bnQJKm1wLAotCXN0cnVjdCBibGttYXAJCSpibGttYXApOwotCi1leHRlcm4g dm9pZCBwcmVmZXRjaF9wNl9kaXIxKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAot CXhmc19pbm9fdAkJaW5vLAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXhmc19k YWJsa190CQlkYV9ibm8sCi0JeGZzX2ZzYmxvY2tfdAkJKmZibG9ja3ApOwotCi1l eHRlcm4gdm9pZCBwcmVmZXRjaF9wNl9kaXIyKAotCXN0cnVjdCB4ZnNfbW91bnQJ Km1wLAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKTsKLQotZXh0ZXJuIHZvaWQgcHJl ZmV0Y2hfc2IoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0JeGZzX2FnbnVtYmVy X3QJCWFnbm8pOwotCi1leHRlcm4gdm9pZCBwcmVmZXRjaF9yb290cygKLQlzdHJ1 Y3QgeGZzX21vdW50IAkqbXAsCi0JeGZzX2FnbnVtYmVyX3QgCQlhZ25vLAotCXhm c19hZ2ZfdAkJKmFnZiwKLQl4ZnNfYWdpX3QJCSphZ2kpOworI2luY2x1ZGUgPHNl bWFwaG9yZS5oPgorI2luY2x1ZGUgImluY29yZS5oIgorI2luY2x1ZGUgInJhZGl4 LXRyZWUuaCIKKworCitleHRlcm4gaW50IAlkb19wcmVmZXRjaDsKKworI2RlZmlu ZSBQRl9USFJFQURfQ09VTlQJNAorCit0eXBlZGVmIHN0cnVjdCBwcmVmZXRjaF9h cmdzIHsKKwlwdGhyZWFkX211dGV4X3QJCWxvY2s7CisJcHRocmVhZF90CQlxdWV1 aW5nX3RocmVhZDsKKwlwdGhyZWFkX3QJCWlvX3RocmVhZHNbUEZfVEhSRUFEX0NP VU5UXTsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290CXByaW1hcnlfaW9fcXVldWU7 CisJc3RydWN0IHJhZGl4X3RyZWVfcm9vdAlzZWNvbmRhcnlfaW9fcXVldWU7CisJ cHRocmVhZF9jb25kX3QJCXN0YXJ0X3JlYWRpbmc7CisJcHRocmVhZF9jb25kX3QJ CXN0YXJ0X3Byb2Nlc3Npbmc7CisJaW50CQkJYWdubzsKKwlpbnQJCQlkaXJzX29u bHk7CisJdm9sYXRpbGUgaW50CQljYW5fc3RhcnRfcmVhZGluZzsKKwl2b2xhdGls ZSBpbnQJCWNhbl9zdGFydF9wcm9jZXNzaW5nOworCXZvbGF0aWxlIGludAkJcHJl ZmV0Y2hfZG9uZTsKKwl2b2xhdGlsZSBpbnQJCXF1ZXVpbmdfZG9uZTsKKwl2b2xh dGlsZSBpbnQJCWlub2RlX2J1ZnNfcXVldWVkOworCXZvbGF0aWxlIHhmc19mc2Js b2NrX3QJbGFzdF9ibm9fcmVhZDsKKwlzZW1fdAkJCXJhX2NvdW50OworCXN0cnVj dCBwcmVmZXRjaF9hcmdzCSpuZXh0X2FyZ3M7Cit9IHByZWZldGNoX2FyZ3NfdDsK KworCisKK3ZvaWQKK2luaXRfcHJlZmV0Y2goCisJeGZzX21vdW50X3QJCSpwbXAp OworCitwcmVmZXRjaF9hcmdzX3QgKgorc3RhcnRfaW5vZGVfcHJlZmV0Y2goCisJ eGZzX2FnbnVtYmVyX3QJCWFnbm8sCisJaW50CQkJZGlyc19vbmx5LAorCXByZWZl dGNoX2FyZ3NfdAkJKnByZXZfYXJncyk7CisKK3ZvaWQKK3dhaXRfZm9yX2lub2Rl X3ByZWZldGNoKAorCXByZWZldGNoX2FyZ3NfdAkJKmFyZ3MpOworCit2b2lkCitj bGVhbnVwX2lub2RlX3ByZWZldGNoKAorCXByZWZldGNoX2FyZ3NfdAkJKmFyZ3Mp OworCisKKyNpZmRlZiBYUl9QRl9UUkFDRQorI2RlZmluZSBwZnRyYWNlKG1zZy4u LikJX3BmdHJhY2UoX19GVU5DVElPTl9fLCAjIyBtc2cpCit2b2lkCV9wZnRyYWNl KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI2VuZGlmCiAKICNl bmRpZiAvKiBfWEZTX1JFUEFJUl9QUkVGRVRDSF9IICovCkluZGV4OiByZXBhaXIv eGZzcHJvZ3MvcmVwYWlyL3Byb2dyZXNzLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL3Byb2dyZXNzLmMJMjAwNy0w NC0yNyAxMzoxMzozNS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9n cy9yZXBhaXIvcHJvZ3Jlc3MuYwkyMDA3LTA2LTA1IDEyOjE0OjIzLjgzMTI0MDg5 NSArMTAwMApAQCAtMSw3ICsxLDcgQEAKIAogI2luY2x1ZGUgPGxpYnhmcy5oPgot I2luY2x1ZGUgInByb2dyZXNzLmgiCiAjaW5jbHVkZSAiZ2xvYmFscy5oIgorI2lu Y2x1ZGUgInByb2dyZXNzLmgiCiAjaW5jbHVkZSAiZXJyX3Byb3Rvcy5oIgogI2lu Y2x1ZGUgPHNpZ25hbC5oPgogCkBAIC05Niw3ICs5Niw3IEBACiAJdGltZV90CQlz dGFydDsKIAl0aW1lX3QJCWVuZDsKIAl0aW1lX3QJCWR1cmF0aW9uOwotCV9fdWlu dDY0X3QJaXRlbV9jb3VudHNbNF07CQorCV9fdWludDY0X3QJaXRlbV9jb3VudHNb NF07CiB9IHBoYXNlX3RpbWVzX3Q7CiBzdGF0aWMgcGhhc2VfdGltZXNfdCBwaGFz ZV90aW1lc1s4XTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJLyoKIAkgKiBTcGVj aWZ5IGEgcmVwZWF0aW5nIHRpbWVyIHRoYXQgZmlyZXMgZWFjaCBNU0dfSU5URVJW QUwgc2Vjb25kcy4KIAkgKi8KLQkKKwogCXRpbWVzcGVjLml0X3ZhbHVlLnR2X3Nl YyA9IG1zZ3AtPmludGVydmFsOwogCXRpbWVzcGVjLml0X3ZhbHVlLnR2X25zZWMg PSAwOwogCXRpbWVzcGVjLml0X2ludGVydmFsLnR2X3NlYyA9IG1zZ3AtPmludGVy dmFsOwpAQCAtMjg1LDcgKzI4NSw3IEBACiBzZXRfcHJvZ3Jlc3NfbXNnIChpbnQg cmVwb3J0LCBfX3VpbnQ2NF90IHRvdGFsKQogewogCi0JaWYgKCFkb19wYXJhbGxl bCkKKwlpZiAoIWFnX3N0cmlkZSkKIAkJcmV0dXJuICgwKTsKIAogCWlmIChwdGhy ZWFkX211dGV4X2xvY2soJmdsb2JhbF9tc2dzLm11dGV4KSkKQEAgLTMxNCw4ICsz MTQsOCBAQAogCV9fdWludDY0X3Qgc3VtOwogCW1zZ19ibG9ja190IAkqbXNncCA9 ICZnbG9iYWxfbXNnczsKIAljaGFyCQltc2didWZbRFVSQVRJT05fQlVGX1NJWkVd OwotCQotCWlmICghZG9fcGFyYWxsZWwpCisKKwlpZiAoIWFnX3N0cmlkZSkKIAkJ cmV0dXJuIDA7CiAKIAlpZiAocHRocmVhZF9tdXRleF9sb2NrKCZnbG9iYWxfbXNn cy5tdXRleCkpCkBAIC0zNzksNiArMzc5LDkgQEAKIAl0aW1lX3QgICAgbm93Owog CXN0cnVjdCB0bSAqdG1wOwogCisJaWYgKHZlcmJvc2UgPiAxKQorCQljYWNoZV9y ZXBvcnQoc3RkZXJyLCAibGlieGZzX2JjYWNoZSIsIGxpYnhmc19iY2FjaGUpOwor CiAJbm93ID0gdGltZShOVUxMKTsKIAogCWlmIChlbmQpIHsKQEAgLTQ2MSw3ICs0 NjQsNyBAQAogCQkJfQogCQkJc3RyY2F0KGJ1ZiwgdGVtcCk7CiAJCX0KLQkJCQor CiAJfQogCWlmIChsZW5ndGggPj0gT05FTUlOVVRFKSB7CiAJCW1pbnV0ZXMgPSAo bGVuZ3RoIC0gc3VtKSAvIE9ORU1JTlVURTsKQEAgLTQ4OCw3ICs0OTEsNyBAQAog CQkJc3RyY2F0KGJ1ZiwgXygiLCAiKSk7CiAJCXN0cmNhdChidWYsIHRlbXApOwog CX0KLQkJCisKIAlyZXR1cm4oYnVmKTsKIH0KIApJbmRleDogcmVwYWlyL3hmc3By b2dzL3JlcGFpci9wcm9ncmVzcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJl cGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9wcm9ncmVzcy5oCTIwMDctMDQtMjcg MTM6MTM6MzUuMDAwMDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZzcHJvZ3MvcmVw YWlyL3Byb2dyZXNzLmgJMjAwNy0wNS0yOSAxMToyMTowMS40NjkzNDc0MjUgKzEw MDAKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUJUFJPR19GTVRfUkVCVUlMRF9B Rwk5CS8qIFBoYXNlIDUgKi8KIAogI2RlZmluZQlQUk9HX0ZNVF9UUkFWRVJTQUwJ MTAJLyogUGhhc2UgNiAqLwotI2RlZmluZQlQUk9HX0ZNVF9UUkFWRVJTU1VCCTEx CQotI2RlZmluZQlQUk9HX0ZNVF9ESVNDT05JTk9ERQkxMgkKKyNkZWZpbmUJUFJP R19GTVRfVFJBVkVSU1NVQgkxMQorI2RlZmluZQlQUk9HX0ZNVF9ESVNDT05JTk9E RQkxMgogCiAjZGVmaW5lCVBST0dSRVNTX0ZNVF9DT1JSX0xJTksJMTMJLyogUGhh c2UgNyAqLwogI2RlZmluZQlQUk9HUkVTU19GTVRfVlJGWV9MSU5LIAkxNApAQCAt MzgsNiArMzgsNiBAQAogZXh0ZXJuIGNoYXIgKmR1cmF0aW9uKGludCB2YWwsIGNo YXIgKmJ1Zik7CiBleHRlcm4gaW50IGRvX3BhcmFsbGVsOwogCi0jZGVmaW5lCVBS T0dfUlBUX0lOQyhhLGIpIGlmIChkb19wYXJhbGxlbCAmJiBwcm9nX3JwdF9kb25l KSAoYSkgKz0gKGIpCisjZGVmaW5lCVBST0dfUlBUX0lOQyhhLGIpIGlmIChhZ19z dHJpZGUgJiYgcHJvZ19ycHRfZG9uZSkgKGEpICs9IChiKQogCiAjZW5kaWYJLyog X1hGU19SRVBBSVJfUFJPR1JFU1NfUlBUX0hfICovCkluZGV4OiByZXBhaXIveGZz cHJvZ3MvcmVwYWlyL3JhZGl4LXRyZWUuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSAvZGV2L251bGwJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAK KysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcmFkaXgtdHJlZS5jCTIwMDctMDUt MTcgMTM6MDg6MjYuMzYxMjM5ODEyICsxMDAwCkBAIC0wLDAgKzEsODA1IEBACisv KgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1vbWNoaWwgVmVsaWtvdgorICogUG9y dGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzdG9waCBIZWxsd2lnCisgKiBD b3B5cmlnaHQgKEMpIDIwMDUgU0dJLCBDaHJpc3RvcGggTGFtZXRlciA8Y2xhbWV0 ZXJAc2dpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAq IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2 NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisj aW5jbHVkZSA8bGlieGZzLmg+CisjaW5jbHVkZSAicmFkaXgtdHJlZS5oIgorCisj aWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9m KHgpIC8gc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworI2RlZmluZSBSQURJWF9U UkVFX01BUF9TSElGVAk2CisjZGVmaW5lIFJBRElYX1RSRUVfTUFQX1NJWkUJKDFV TCA8PCBSQURJWF9UUkVFX01BUF9TSElGVCkKKyNkZWZpbmUgUkFESVhfVFJFRV9N QVBfTUFTSwkoUkFESVhfVFJFRV9NQVBfU0laRS0xKQorCisjaWZkZWYgUkFESVhf VFJFRV9UQUdTCisjZGVmaW5lIFJBRElYX1RSRUVfVEFHX0xPTkdTCVwKKwkoKFJB RElYX1RSRUVfTUFQX1NJWkUgKyBCSVRTX1BFUl9MT05HIC0gMSkgLyBCSVRTX1BF Ul9MT05HKQorI2VuZGlmCisKK3N0cnVjdCByYWRpeF90cmVlX25vZGUgeworCXVu c2lnbmVkIGludAljb3VudDsKKwl2b2lkCQkqc2xvdHNbUkFESVhfVFJFRV9NQVBf U0laRV07CisjaWZkZWYgUkFESVhfVFJFRV9UQUdTCisJdW5zaWduZWQgbG9uZwl0 YWdzW1JBRElYX1RSRUVfTUFYX1RBR1NdW1JBRElYX1RSRUVfVEFHX0xPTkdTXTsK KyNlbmRpZgorfTsKKworc3RydWN0IHJhZGl4X3RyZWVfcGF0aCB7CisJc3RydWN0 IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwlpbnQgb2Zmc2V0OworfTsKKworI2Rl ZmluZSBSQURJWF9UUkVFX0lOREVYX0JJVFMgICg4IC8qIENIQVJfQklUICovICog c2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorI2RlZmluZSBSQURJWF9UUkVFX01BWF9Q QVRIIChSQURJWF9UUkVFX0lOREVYX0JJVFMvUkFESVhfVFJFRV9NQVBfU0hJRlQg KyAyKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoZWlnaHRfdG9fbWF4aW5kZXhb UkFESVhfVFJFRV9NQVhfUEFUSF07CisKKy8qCisgKiBSYWRpeCB0cmVlIG5vZGUg Y2FjaGUuCisgKi8KKworI2RlZmluZSByYWRpeF90cmVlX25vZGVfYWxsb2Mocikg CSgoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKSBcCisJCWNhbGxvYygxLCBzaXpl b2Yoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSkpKQorI2RlZmluZSByYWRpeF90cmVl X25vZGVfZnJlZShuKSAJZnJlZShuKQorCisjaWZkZWYgUkFESVhfVFJFRV9UQUdT CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YWdfc2V0KHN0cnVjdCByYWRpeF90cmVl X25vZGUgKm5vZGUsIHVuc2lnbmVkIGludCB0YWcsCisJCWludCBvZmZzZXQpCit7 CisJKigoX191aW50MzJfdCAqKW5vZGUtPnRhZ3NbdGFnXSArIChvZmZzZXQgPj4g NSkpIHw9ICgxIDw8IChvZmZzZXQgJiAzMSkpOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQgdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIHVu c2lnbmVkIGludCB0YWcsCisJCWludCBvZmZzZXQpCit7CisJX191aW50MzJfdCAJ KnAgPSAoX191aW50MzJfdCopbm9kZS0+dGFnc1t0YWddICsgKG9mZnNldCA+PiA1 KTsKKwlfX3VpbnQzMl90IAltID0gMSA8PCAob2Zmc2V0ICYgMzEpOworCSpwICY9 IH5tOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YWdfZ2V0KHN0cnVjdCByYWRp eF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGludCB0YWcsCisJCWludCBvZmZz ZXQpCit7CisJcmV0dXJuIDEgJiAoKChjb25zdCBfX3VpbnQzMl90ICopbm9kZS0+ dGFnc1t0YWddKVtvZmZzZXQgPj4gNV0gPj4gKG9mZnNldCAmIDMxKSk7Cit9CisK Ky8qCisgKiBSZXR1cm5zIDEgaWYgYW55IHNsb3QgaW4gdGhlIG5vZGUgaGFzIHRo aXMgdGFnIHNldC4KKyAqIE90aGVyd2lzZSByZXR1cm5zIDAuCisgKi8KK3N0YXRp YyBpbmxpbmUgaW50IGFueV90YWdfc2V0KHN0cnVjdCByYWRpeF90cmVlX25vZGUg Km5vZGUsIHVuc2lnbmVkIGludCB0YWcpCit7CisJaW50IGlkeDsKKwlmb3IgKGlk eCA9IDA7IGlkeCA8IFJBRElYX1RSRUVfVEFHX0xPTkdTOyBpZHgrKykgeworCQlp ZiAobm9kZS0+dGFnc1t0YWddW2lkeF0pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0 dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKgorICoJUmV0dXJuIHRoZSBtYXhpbXVt IGtleSB3aGljaCBjYW4gYmUgc3RvcmUgaW50byBhCisgKglyYWRpeCB0cmVlIHdp dGggaGVpZ2h0IEhFSUdIVC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBs b25nIHJhZGl4X3RyZWVfbWF4aW5kZXgodW5zaWduZWQgaW50IGhlaWdodCkKK3sK KwlyZXR1cm4gaGVpZ2h0X3RvX21heGluZGV4W2hlaWdodF07Cit9CisKKy8qCisg KglFeHRlbmQgYSByYWRpeCB0cmVlIHNvIGl0IGNhbiBzdG9yZSBrZXkgQGluZGV4 LgorICovCitzdGF0aWMgaW50IHJhZGl4X3RyZWVfZXh0ZW5kKHN0cnVjdCByYWRp eF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJc3Ry dWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0 OworI2lmZGVmIFJBRElYX1RSRUVfVEFHUworCWNoYXIgdGFnc1tSQURJWF9UUkVF X01BWF9UQUdTXTsKKwlpbnQgdGFnOworI2VuZGlmCisKKwkvKiBGaWd1cmUgb3V0 IHdoYXQgdGhlIGhlaWdodCBzaG91bGQgYmUuICAqLworCWhlaWdodCA9IHJvb3Qt PmhlaWdodCArIDE7CisJd2hpbGUgKGluZGV4ID4gcmFkaXhfdHJlZV9tYXhpbmRl eChoZWlnaHQpKQorCQloZWlnaHQrKzsKKworCWlmIChyb290LT5ybm9kZSA9PSBO VUxMKSB7CisJCXJvb3QtPmhlaWdodCA9IGhlaWdodDsKKwkJZ290byBvdXQ7CisJ fQorCisjaWZkZWYgUkFESVhfVFJFRV9UQUdTCisJLyoKKwkgKiBQcmVwYXJlIHRo ZSB0YWcgc3RhdHVzIG9mIHRoZSB0b3AtbGV2ZWwgbm9kZSBmb3IgcHJvcGFnYXRp b24KKwkgKiBpbnRvIHRoZSBuZXdseS1wdXNoZWQgdG9wLWxldmVsIG5vZGUocykK KwkgKi8KKwlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7 IHRhZysrKSB7CisJCXRhZ3NbdGFnXSA9IDA7CisJCWlmIChhbnlfdGFnX3NldChy b290LT5ybm9kZSwgdGFnKSkKKwkJCXRhZ3NbdGFnXSA9IDE7CisJfQorI2VuZGlm CisJZG8geworCQlpZiAoIShub2RlID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKHJv b3QpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIEluY3JlYXNlIHRoZSBo ZWlnaHQuICAqLworCQlub2RlLT5zbG90c1swXSA9IHJvb3QtPnJub2RlOworCisj aWZkZWYgUkFESVhfVFJFRV9UQUdTCisJCS8qIFByb3BhZ2F0ZSB0aGUgYWdncmVn YXRlZCB0YWcgaW5mbyBpbnRvIHRoZSBuZXcgcm9vdCAqLworCQlmb3IgKHRhZyA9 IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKSB7CisJCQlpZiAo dGFnc1t0YWddKQorCQkJCXRhZ19zZXQobm9kZSwgdGFnLCAwKTsKKwkJfQorI2Vu ZGlmCisJCW5vZGUtPmNvdW50ID0gMTsKKwkJcm9vdC0+cm5vZGUgPSBub2RlOwor CQlyb290LT5oZWlnaHQrKzsKKwl9IHdoaWxlIChoZWlnaHQgPiByb290LT5oZWln aHQpOworb3V0OgorCXJldHVybiAwOworfQorCisvKioKKyAqCXJhZGl4X3RyZWVf aW5zZXJ0ICAgIC0gICAgaW5zZXJ0IGludG8gYSByYWRpeCB0cmVlCisgKglAcm9v dDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQGluZGV4OgkJaW5kZXgga2V5CisgKglA aXRlbToJCWl0ZW0gdG8gaW5zZXJ0CisgKgorICoJSW5zZXJ0IGFuIGl0ZW0gaW50 byB0aGUgcmFkaXggdHJlZSBhdCBwb3NpdGlvbiBAaW5kZXguCisgKi8KK2ludCBy YWRpeF90cmVlX2luc2VydChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAor CQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqaXRlbSkKK3sKKwlzdHJ1Y3Qg cmFkaXhfdHJlZV9ub2RlICpub2RlID0gTlVMTCwgKnNsb3Q7CisJdW5zaWduZWQg aW50IGhlaWdodCwgc2hpZnQ7CisJaW50IG9mZnNldDsKKwlpbnQgZXJyb3I7CisK KwkvKiBNYWtlIHN1cmUgdGhlIHRyZWUgaXMgaGlnaCBlbm91Z2guICAqLworCWlm ICgoIWluZGV4ICYmICFyb290LT5ybm9kZSkgfHwKKwkJCWluZGV4ID4gcmFkaXhf dHJlZV9tYXhpbmRleChyb290LT5oZWlnaHQpKSB7CisJCWVycm9yID0gcmFkaXhf dHJlZV9leHRlbmQocm9vdCwgaW5kZXgpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1 cm4gZXJyb3I7CisJfQorCisJc2xvdCA9IHJvb3QtPnJub2RlOworCWhlaWdodCA9 IHJvb3QtPmhlaWdodDsKKwlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVF X01BUF9TSElGVDsKKworCW9mZnNldCA9IDA7CQkJLyogdW5pbml0aWFsaXNlZCB2 YXIgd2FybmluZyAqLworCWRvIHsKKwkJaWYgKHNsb3QgPT0gTlVMTCkgeworCQkJ LyogSGF2ZSB0byBhZGQgYSBjaGlsZCBub2RlLiAgKi8KKwkJCWlmICghKHNsb3Qg PSByYWRpeF90cmVlX25vZGVfYWxsb2Mocm9vdCkpKQorCQkJCXJldHVybiAtRU5P TUVNOworCQkJaWYgKG5vZGUpIHsKKwkJCQlub2RlLT5zbG90c1tvZmZzZXRdID0g c2xvdDsKKwkJCQlub2RlLT5jb3VudCsrOworCQkJfSBlbHNlCisJCQkJcm9vdC0+ cm5vZGUgPSBzbG90OworCQl9CisKKwkJLyogR28gYSBsZXZlbCBkb3duICovCisJ CW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNL OworCQlub2RlID0gc2xvdDsKKwkJc2xvdCA9IG5vZGUtPnNsb3RzW29mZnNldF07 CisJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOworCQloZWlnaHQtLTsK Kwl9IHdoaWxlIChoZWlnaHQgPiAwKTsKKworCWlmIChzbG90ICE9IE5VTEwpCisJ CXJldHVybiAtRUVYSVNUOworCisJQVNTRVJUKG5vZGUpOworCW5vZGUtPmNvdW50 Kys7CisJbm9kZS0+c2xvdHNbb2Zmc2V0XSA9IGl0ZW07CisjaWZkZWYgUkFESVhf VFJFRV9UQUdTCisJQVNTRVJUKCF0YWdfZ2V0KG5vZGUsIDAsIG9mZnNldCkpOwor CUFTU0VSVCghdGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKKyNlbmRpZgorCXJl dHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKipfX2xvb2t1cF9zbG90 KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkJICAgdW5zaWduZWQg bG9uZyBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKKwlz dHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqc2xvdDsKKworCWhlaWdodCA9IHJvb3Qt PmhlaWdodDsKKwlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdo dCkpCisJCXJldHVybiBOVUxMOworCisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFE SVhfVFJFRV9NQVBfU0hJRlQ7CisJc2xvdCA9ICZyb290LT5ybm9kZTsKKworCXdo aWxlIChoZWlnaHQgPiAwKSB7CisJCWlmICgqc2xvdCA9PSBOVUxMKQorCQkJcmV0 dXJuIE5VTEw7CisKKwkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoq KQorCQkJKCgqc2xvdCktPnNsb3RzICsKKwkJCQkoKGluZGV4ID4+IHNoaWZ0KSAm IFJBRElYX1RSRUVfTUFQX01BU0spKTsKKwkJc2hpZnQgLT0gUkFESVhfVFJFRV9N QVBfU0hJRlQ7CisJCWhlaWdodC0tOworCX0KKworCXJldHVybiAodm9pZCAqKilz bG90OworfQorCisvKioKKyAqCXJhZGl4X3RyZWVfbG9va3VwX3Nsb3QgICAgLSAg ICBsb29rdXAgYSBzbG90IGluIGEgcmFkaXggdHJlZQorICoJQHJvb3Q6CQlyYWRp eCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQorICoKKyAqCUxvb2t1 cCB0aGUgc2xvdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3NpdGlvbiBAaW5kZXgg aW4gdGhlIHJhZGl4IHRyZWUKKyAqCUByb290LiBUaGlzIGlzIHVzZWZ1bCBmb3Ig dXBkYXRlLWlmLWV4aXN0cyBvcGVyYXRpb25zLgorICovCit2b2lkICoqcmFkaXhf dHJlZV9sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1 bnNpZ25lZCBsb25nIGluZGV4KQoreworCXJldHVybiBfX2xvb2t1cF9zbG90KHJv b3QsIGluZGV4KTsKK30KKworLyoqCisgKglyYWRpeF90cmVlX2xvb2t1cCAgICAt ICAgIHBlcmZvcm0gbG9va3VwIG9wZXJhdGlvbiBvbiBhIHJhZGl4IHRyZWUKKyAq CUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAaW5kZXg6CQlpbmRleCBrZXkK KyAqCisgKglMb29rdXAgdGhlIGl0ZW0gYXQgdGhlIHBvc2l0aW9uIEBpbmRleCBp biB0aGUgcmFkaXggdHJlZSBAcm9vdC4KKyAqLwordm9pZCAqcmFkaXhfdHJlZV9s b29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9u ZyBpbmRleCkKK3sKKwl2b2lkICoqc2xvdDsKKworCXNsb3QgPSBfX2xvb2t1cF9z bG90KHJvb3QsIGluZGV4KTsKKwlyZXR1cm4gc2xvdCAhPSBOVUxMID8gKnNsb3Qg OiBOVUxMOworfQorCisvKioKKyAqCXJhaWRfdHJlZV9maXJzdF9rZXkgLSBmaW5k IHRoZSBmaXJzdCBpbmRleCBrZXkgaW4gdGhlIHJhZGl4IHRyZWUKKyAqCUByb290 OgkJcmFkaXggdHJlZSByb290CisgKglAaW5kZXg6CQl3aGVyZSB0aGUgZmlyc3Qg aW5kZXggd2lsbCBiZSBwbGFjZWQKKyAqCisgKglSZXR1cm5zIHRoZSBmaXJzdCBl bnRyeSBhbmQgaW5kZXgga2V5IGluIHRoZSByYWRpeCB0cmVlIEByb290LgorICov Cit2b2lkICpyYWRpeF90cmVlX2xvb2t1cF9maXJzdChzdHJ1Y3QgcmFkaXhfdHJl ZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nICppbmRleCkKK3sKKwl1bnNpZ25l ZCBpbnQgaGVpZ2h0LCBzaGlmdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpz bG90OworCXVuc2lnbmVkIGxvbmcgaTsKKworCWhlaWdodCA9IHJvb3QtPmhlaWdo dDsKKwkqaW5kZXggPSAwOworCWlmIChoZWlnaHQgPT0gMCkKKwkJcmV0dXJuIE5V TEw7CisKKwlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVFX01BUF9TSElG VDsKKwlzbG90ID0gcm9vdC0+cm5vZGU7CisKKwlmb3IgKDsgaGVpZ2h0ID4gMTsg aGVpZ2h0LS0pIHsKKwkJZm9yIChpID0gMDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJ WkU7IGkrKykgeworCQkJaWYgKHNsb3QtPnNsb3RzW2ldICE9IE5VTEwpCisJCQkJ YnJlYWs7CisJCX0KKwkJQVNTRVJUKGkgPCBSQURJWF9UUkVFX01BUF9TSVpFKTsK KworCQkqaW5kZXggfD0gKGkgPDwgc2hpZnQpOworCQlzaGlmdCAtPSBSQURJWF9U UkVFX01BUF9TSElGVDsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzW2ldOworCX0KKwlm b3IgKGkgPSAwOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CisJCWlm IChzbG90LT5zbG90c1tpXSAhPSBOVUxMKSB7CisJCQkqaW5kZXggfD0gaTsKKwkJ CXJldHVybiBzbG90LT5zbG90c1tpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsK K30KKworI2lmZGVmIFJBRElYX1RSRUVfVEFHUworCisvKioKKyAqCXJhZGl4X3Ry ZWVfdGFnX3NldCAtIHNldCBhIHRhZyBvbiBhIHJhZGl4IHRyZWUgbm9kZQorICoJ QHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQor ICoJQHRhZzogCQl0YWcgaW5kZXgKKyAqCisgKglTZXQgdGhlIHNlYXJjaCB0YWcg KHdoaWNoIG11c3QgYmUgPCBSQURJWF9UUkVFX01BWF9UQUdTKQorICoJY29ycmVz cG9uZGluZyB0byBAaW5kZXggaW4gdGhlIHJhZGl4IHRyZWUuICBGcm9tCisgKgl0 aGUgcm9vdCBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSBsZWFmIG5vZGUuCisgKgor ICoJUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdGFnZ2VkIGl0ZW0uICAgU2V0 dGluZyBhIHRhZyBvbiBhIG5vdC1wcmVzZW50CisgKglpdGVtIGlzIGEgYnVnLgor ICovCit2b2lkICpyYWRpeF90cmVlX3RhZ19zZXQoc3RydWN0IHJhZGl4X3RyZWVf cm9vdCAqcm9vdCwKKwkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGlu dCB0YWcpCit7CisJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7CisJc3RydWN0 IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKKworCWhlaWdodCA9IHJvb3QtPmhlaWdo dDsKKwlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCisJ CXJldHVybiBOVUxMOworCisJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJWF9U UkVFX01BUF9TSElGVDsKKwlzbG90ID0gcm9vdC0+cm5vZGU7CisKKwl3aGlsZSAo aGVpZ2h0ID4gMCkgeworCQlpbnQgb2Zmc2V0OworCisJCW9mZnNldCA9IChpbmRl eCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOworCQlpZiAoIXRhZ19n ZXQoc2xvdCwgdGFnLCBvZmZzZXQpKQorCQkJdGFnX3NldChzbG90LCB0YWcsIG9m ZnNldCk7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOworCQlBU1NFUlQo c2xvdCAhPSBOVUxMKTsKKwkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7 CisJCWhlaWdodC0tOworCX0KKworCXJldHVybiBzbG90OworfQorCisvKioKKyAq CXJhZGl4X3RyZWVfdGFnX2NsZWFyIC0gY2xlYXIgYSB0YWcgb24gYSByYWRpeCB0 cmVlIG5vZGUKKyAqCUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAaW5kZXg6 CQlpbmRleCBrZXkKKyAqCUB0YWc6IAkJdGFnIGluZGV4CisgKgorICoJQ2xlYXIg dGhlIHNlYXJjaCB0YWcgKHdoaWNoIG11c3QgYmUgPCBSQURJWF9UUkVFX01BWF9U QUdTKQorICoJY29ycmVzcG9uZGluZyB0byBAaW5kZXggaW4gdGhlIHJhZGl4IHRy ZWUuICBJZgorICoJdGhpcyBjYXVzZXMgdGhlIGxlYWYgbm9kZSB0byBoYXZlIG5v IHRhZ3Mgc2V0IHRoZW4gY2xlYXIgdGhlIHRhZyBpbiB0aGUKKyAqCW5leHQtdG8t bGVhZiBub2RlLCBldGMuCisgKgorICoJUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0 aGUgdGFnZ2VkIGl0ZW0gb24gc3VjY2VzcywgZWxzZSBOVUxMLiAgaWU6CisgKglo YXMgdGhlIHNhbWUgcmV0dXJuIHZhbHVlIGFuZCBzZW1hbnRpY3MgYXMgcmFkaXhf dHJlZV9sb29rdXAoKS4KKyAqLwordm9pZCAqcmFkaXhfdHJlZV90YWdfY2xlYXIo c3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXVuc2lnbmVkIGxvbmcg aW5kZXgsIHVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IHJhZGl4X3RyZWVf cGF0aCBwYXRoW1JBRElYX1RSRUVfTUFYX1BBVEhdLCAqcGF0aHAgPSBwYXRoOwor CXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CisJdW5zaWduZWQgaW50IGhl aWdodCwgc2hpZnQ7CisJdm9pZCAqcmV0ID0gTlVMTDsKKworCWhlaWdodCA9IHJv b3QtPmhlaWdodDsKKwlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhl aWdodCkpCisJCWdvdG8gb3V0OworCisJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBS QURJWF9UUkVFX01BUF9TSElGVDsKKwlwYXRocC0+bm9kZSA9IE5VTEw7CisJc2xv dCA9IHJvb3QtPnJub2RlOworCisJd2hpbGUgKGhlaWdodCA+IDApIHsKKwkJaW50 IG9mZnNldDsKKworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisK KwkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01B U0s7CisJCXBhdGhwWzFdLm9mZnNldCA9IG9mZnNldDsKKwkJcGF0aHBbMV0ubm9k ZSA9IHNsb3Q7CisJCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOworCQlwYXRo cCsrOworCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwkJaGVpZ2h0 LS07CisJfQorCisJcmV0ID0gc2xvdDsKKwlpZiAocmV0ID09IE5VTEwpCisJCWdv dG8gb3V0OworCisJZG8geworCQlpZiAoIXRhZ19nZXQocGF0aHAtPm5vZGUsIHRh ZywgcGF0aHAtPm9mZnNldCkpCisJCQlnb3RvIG91dDsKKwkJdGFnX2NsZWFyKHBh dGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZzZXQpOworCQlpZiAoYW55X3RhZ19z ZXQocGF0aHAtPm5vZGUsIHRhZykpCisJCQlnb3RvIG91dDsKKwkJcGF0aHAtLTsK Kwl9IHdoaWxlIChwYXRocC0+bm9kZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30K KworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK19fbG9va3VwKHN0cnVj dCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKipyZXN1bHRzLCB1bnNpZ25l ZCBsb25nIGluZGV4LAorCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVk IGxvbmcgKm5leHRfaW5kZXgpCit7CisJdW5zaWduZWQgaW50IG5yX2ZvdW5kID0g MDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKKwlzdHJ1Y3QgcmFkaXhf dHJlZV9ub2RlICpzbG90OworCXVuc2lnbmVkIGxvbmcgaTsKKworCWhlaWdodCA9 IHJvb3QtPmhlaWdodDsKKwlpZiAoaGVpZ2h0ID09IDApCisJCWdvdG8gb3V0Owor CisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisJ c2xvdCA9IHJvb3QtPnJub2RlOworCisJZm9yICggOyBoZWlnaHQgPiAxOyBoZWln aHQtLSkgeworCisJCWZvciAoaSA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9U UkVFX01BUF9NQVNLIDsKKwkJCQlpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsr KSB7CisJCQlpZiAoc2xvdC0+c2xvdHNbaV0gIT0gTlVMTCkKKwkJCQlicmVhazsK KwkJCWluZGV4ICY9IH4oKDFVTCA8PCBzaGlmdCkgLSAxKTsKKwkJCWluZGV4ICs9 IDFVTCA8PCBzaGlmdDsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJCWdvdG8gb3V0 OwkvKiAzMi1iaXQgd3JhcGFyb3VuZCAqLworCQl9CisJCWlmIChpID09IFJBRElY X1RSRUVfTUFQX1NJWkUpCisJCQlnb3RvIG91dDsKKworCQlzaGlmdCAtPSBSQURJ WF9UUkVFX01BUF9TSElGVDsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzW2ldOworCX0K KworCS8qIEJvdHRvbSBsZXZlbDogZ3JhYiBzb21lIGl0ZW1zICovCisJZm9yIChp ID0gaW5kZXggJiBSQURJWF9UUkVFX01BUF9NQVNLOyBpIDwgUkFESVhfVFJFRV9N QVBfU0laRTsgaSsrKSB7CisJCWluZGV4Kys7CisJCWlmIChzbG90LT5zbG90c1tp XSkgeworCQkJcmVzdWx0c1tucl9mb3VuZCsrXSA9IHNsb3QtPnNsb3RzW2ldOwor CQkJaWYgKG5yX2ZvdW5kID09IG1heF9pdGVtcykKKwkJCQlnb3RvIG91dDsKKwkJ fQorCX0KK291dDoKKwkqbmV4dF9pbmRleCA9IGluZGV4OworCXJldHVybiBucl9m b3VuZDsKK30KKworLyoqCisgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwIC0gcGVy Zm9ybSBtdWx0aXBsZSBsb29rdXAgb24gYSByYWRpeCB0cmVlCisgKglAcm9vdDoJ CXJhZGl4IHRyZWUgcm9vdAorICoJQHJlc3VsdHM6CXdoZXJlIHRoZSByZXN1bHRz IG9mIHRoZSBsb29rdXAgYXJlIHBsYWNlZAorICoJQGZpcnN0X2luZGV4OglzdGFy dCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBtYXhfaXRlbXM6CXBsYWNl IHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cworICoKKyAqCVBlcmZv cm1zIGFuIGluZGV4LWFzY2VuZGluZyBzY2FuIG9mIHRoZSB0cmVlIGZvciBwcmVz ZW50IGl0ZW1zLiAgUGxhY2VzCisgKgl0aGVtIGF0ICpAcmVzdWx0cyBhbmQgcmV0 dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHdoaWNoIHdlcmUgcGxhY2VkIGF0Cisg KgkqQHJlc3VsdHMuCisgKgorICoJVGhlIGltcGxlbWVudGF0aW9uIGlzIG5haXZl LgorICovCit1bnNpZ25lZCBpbnQKK3JhZGl4X3RyZWVfZ2FuZ19sb29rdXAoc3Ry dWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCisJCQl1 bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBpbnQgbWF4X2l0ZW1z KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4X2luZGV4ID0gcmFkaXhfdHJl ZV9tYXhpbmRleChyb290LT5oZWlnaHQpOworCXVuc2lnbmVkIGxvbmcgY3VyX2lu ZGV4ID0gZmlyc3RfaW5kZXg7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwl3 aGlsZSAocmV0IDwgbWF4X2l0ZW1zKSB7CisJCXVuc2lnbmVkIGludCBucl9mb3Vu ZDsKKwkJdW5zaWduZWQgbG9uZyBuZXh0X2luZGV4OwkvKiBJbmRleCBvZiBuZXh0 IHNlYXJjaCAqLworCisJCWlmIChjdXJfaW5kZXggPiBtYXhfaW5kZXgpCisJCQli cmVhazsKKwkJbnJfZm91bmQgPSBfX2xvb2t1cChyb290LCByZXN1bHRzICsgcmV0 LCBjdXJfaW5kZXgsCisJCQkJCW1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgp OworCQlyZXQgKz0gbnJfZm91bmQ7CisJCWlmIChuZXh0X2luZGV4ID09IDApCisJ CQlicmVhazsKKwkJY3VyX2luZGV4ID0gbmV4dF9pbmRleDsKKwl9CisJcmV0dXJu IHJldDsKK30KKworLyoqCisgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwX2V4IC0g cGVyZm9ybSBtdWx0aXBsZSBsb29rdXAgb24gYSByYWRpeCB0cmVlCisgKglAcm9v dDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQHJlc3VsdHM6CXdoZXJlIHRoZSByZXN1 bHRzIG9mIHRoZSBsb29rdXAgYXJlIHBsYWNlZAorICoJQGZpcnN0X2luZGV4Oglz dGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBsYXN0X2luZGV4Oglk b24ndCBsb29rdXAgcGFzdCB0aGlzIGtleQorICoJQG1heF9pdGVtczoJcGxhY2Ug dXAgdG8gdGhpcyBtYW55IGl0ZW1zIGF0ICpyZXN1bHRzCisgKgorICoJUGVyZm9y bXMgYW4gaW5kZXgtYXNjZW5kaW5nIHNjYW4gb2YgdGhlIHRyZWUgZm9yIHByZXNl bnQgaXRlbXMgc3RhcnRpbmcKKyAqCUBmaXJzdF9pbmRleCB1bnRpbCBAbGFzdF9p bmRleCB1cCB0byBhcyBtYW55IGFzIEBtYXhfaXRlbXMuICBQbGFjZXMKKyAqCXRo ZW0gYXQgKkByZXN1bHRzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMg d2hpY2ggd2VyZSBwbGFjZWQKKyAqCWF0ICpAcmVzdWx0cy4KKyAqCisgKglUaGUg aW1wbGVtZW50YXRpb24gaXMgbmFpdmUuCisgKi8KK3Vuc2lnbmVkIGludAorcmFk aXhfdHJlZV9nYW5nX2xvb2t1cF9leChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpy b290LCB2b2lkICoqcmVzdWx0cywKKwkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5k ZXgsIHVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleCwKKwkJCXVuc2lnbmVkIGludCBt YXhfaXRlbXMpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBtYXhfaW5kZXggPSBy YWRpeF90cmVlX21heGluZGV4KHJvb3QtPmhlaWdodCk7CisJdW5zaWduZWQgbG9u ZyBjdXJfaW5kZXggPSBmaXJzdF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgcmV0ID0g MDsKKworCXdoaWxlIChyZXQgPCBtYXhfaXRlbXMgJiYgY3VyX2luZGV4IDwgbGFz dF9pbmRleCkgeworCQl1bnNpZ25lZCBpbnQgbnJfZm91bmQ7CisJCXVuc2lnbmVk IGxvbmcgbmV4dF9pbmRleDsJLyogSW5kZXggb2YgbmV4dCBzZWFyY2ggKi8KKwor CQlpZiAoY3VyX2luZGV4ID4gbWF4X2luZGV4KQorCQkJYnJlYWs7CisJCW5yX2Zv dW5kID0gX19sb29rdXAocm9vdCwgcmVzdWx0cyArIHJldCwgY3VyX2luZGV4LAor CQkJCQltYXhfaXRlbXMgLSByZXQsICZuZXh0X2luZGV4KTsKKwkJcmV0ICs9IG5y X2ZvdW5kOworCQlpZiAobmV4dF9pbmRleCA9PSAwKQorCQkJYnJlYWs7CisJCWN1 cl9pbmRleCA9IG5leHRfaW5kZXg7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNp ZmRlZiBSQURJWF9UUkVFX1RBR1MKKworc3RhdGljIHVuc2lnbmVkIGludAorX19s b29rdXBfdGFnKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKipy ZXN1bHRzLCB1bnNpZ25lZCBsb25nIGluZGV4LAorCXVuc2lnbmVkIGludCBtYXhf aXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgsIHVuc2lnbmVkIGludCB0 YWcpCit7CisJdW5zaWduZWQgaW50IG5yX2ZvdW5kID0gMDsKKwl1bnNpZ25lZCBp bnQgc2hpZnQ7CisJdW5zaWduZWQgaW50IGhlaWdodCA9IHJvb3QtPmhlaWdodDsK KwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OworCisJc2hpZnQgPSAoaGVp Z2h0IC0gMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKKwlzbG90ID0gcm9vdC0+ cm5vZGU7CisKKwl3aGlsZSAoaGVpZ2h0ID4gMCkgeworCQl1bnNpZ25lZCBsb25n IGkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKwor CQlmb3IgKCA7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJCWlm ICh0YWdfZ2V0KHNsb3QsIHRhZywgaSkpIHsKKwkJCQlBU1NFUlQoc2xvdC0+c2xv dHNbaV0gIT0gTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpbmRleCAmPSB+ KCgxVUwgPDwgc2hpZnQpIC0gMSk7CisJCQlpbmRleCArPSAxVUwgPDwgc2hpZnQ7 CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQlnb3RvIG91dDsJLyogMzItYml0IHdy YXBhcm91bmQgKi8KKwkJfQorCQlpZiAoaSA9PSBSQURJWF9UUkVFX01BUF9TSVpF KQorCQkJZ290byBvdXQ7CisJCWhlaWdodC0tOworCQlpZiAoaGVpZ2h0ID09IDAp IHsJLyogQm90dG9tIGxldmVsOiBncmFiIHNvbWUgaXRlbXMgKi8KKwkJCXVuc2ln bmVkIGxvbmcgaiA9IGluZGV4ICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKworCQkJ Zm9yICggOyBqIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaisrKSB7CisJCQkJaW5k ZXgrKzsKKwkJCQlpZiAodGFnX2dldChzbG90LCB0YWcsIGopKSB7CisJCQkJCUFT U0VSVChzbG90LT5zbG90c1tqXSAhPSBOVUxMKTsKKwkJCQkJcmVzdWx0c1tucl9m b3VuZCsrXSA9IHNsb3QtPnNsb3RzW2pdOworCQkJCQlpZiAobnJfZm91bmQgPT0g bWF4X2l0ZW1zKQorCQkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJ CXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOworCQlzbG90ID0gc2xvdC0+ c2xvdHNbaV07CisJfQorb3V0OgorCSpuZXh0X2luZGV4ID0gaW5kZXg7CisJcmV0 dXJuIG5yX2ZvdW5kOworfQorCisvKioKKyAqCXJhZGl4X3RyZWVfZ2FuZ19sb29r dXBfdGFnIC0gcGVyZm9ybSBtdWx0aXBsZSBsb29rdXAgb24gYSByYWRpeCB0cmVl CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGEgdGFn CisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQHJlc3VsdHM6CXdoZXJl IHRoZSByZXN1bHRzIG9mIHRoZSBsb29rdXAgYXJlIHBsYWNlZAorICoJQGZpcnN0 X2luZGV4OglzdGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBtYXhf aXRlbXM6CXBsYWNlIHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cwor ICoJQHRhZzoJCXRoZSB0YWcgaW5kZXggKDwgUkFESVhfVFJFRV9NQVhfVEFHUykK KyAqCisgKglQZXJmb3JtcyBhbiBpbmRleC1hc2NlbmRpbmcgc2NhbiBvZiB0aGUg dHJlZSBmb3IgcHJlc2VudCBpdGVtcyB3aGljaAorICoJaGF2ZSB0aGUgdGFnIGlu ZGV4ZWQgYnkgQHRhZyBzZXQuICBQbGFjZXMgdGhlIGl0ZW1zIGF0ICpAcmVzdWx0 cyBhbmQKKyAqCXJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyB3aGljaCB3ZXJl IHBsYWNlZCBhdCAqQHJlc3VsdHMuCisgKi8KK3Vuc2lnbmVkIGludAorcmFkaXhf dHJlZV9nYW5nX2xvb2t1cF90YWcoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9v dCwgdm9pZCAqKnJlc3VsdHMsCisJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgs IHVuc2lnbmVkIGludCBtYXhfaXRlbXMsCisJCXVuc2lnbmVkIGludCB0YWcpCit7 CisJY29uc3QgdW5zaWduZWQgbG9uZyBtYXhfaW5kZXggPSByYWRpeF90cmVlX21h eGluZGV4KHJvb3QtPmhlaWdodCk7CisJdW5zaWduZWQgbG9uZyBjdXJfaW5kZXgg PSBmaXJzdF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKworCXdoaWxl IChyZXQgPCBtYXhfaXRlbXMpIHsKKwkJdW5zaWduZWQgaW50IG5yX2ZvdW5kOwor CQl1bnNpZ25lZCBsb25nIG5leHRfaW5kZXg7CS8qIEluZGV4IG9mIG5leHQgc2Vh cmNoICovCisKKwkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKKwkJCWJyZWFr OworCQlucl9mb3VuZCA9IF9fbG9va3VwX3RhZyhyb290LCByZXN1bHRzICsgcmV0 LCBjdXJfaW5kZXgsCisJCQkJCW1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgs IHRhZyk7CisJCXJldCArPSBucl9mb3VuZDsKKwkJaWYgKG5leHRfaW5kZXggPT0g MCkKKwkJCWJyZWFrOworCQljdXJfaW5kZXggPSBuZXh0X2luZGV4OworCX0KKwly ZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworLyoqCisgKglyYWRpeF90cmVlX3No cmluayAgICAtICAgIHNocmluayBoZWlnaHQgb2YgYSByYWRpeCB0cmVlIHRvIG1p bmltYWwKKyAqCUByb290CQlyYWRpeCB0cmVlIHJvb3QKKyAqLworc3RhdGljIGlu bGluZSB2b2lkIHJhZGl4X3RyZWVfc2hyaW5rKHN0cnVjdCByYWRpeF90cmVlX3Jv b3QgKnJvb3QpCit7CisJLyogdHJ5IHRvIHNocmluayB0cmVlIGhlaWdodCAqLwor CXdoaWxlIChyb290LT5oZWlnaHQgPiAxICYmCisJCQlyb290LT5ybm9kZS0+Y291 bnQgPT0gMSAmJgorCQkJcm9vdC0+cm5vZGUtPnNsb3RzWzBdKSB7CisJCXN0cnVj dCByYWRpeF90cmVlX25vZGUgKnRvX2ZyZWUgPSByb290LT5ybm9kZTsKKworCQly b290LT5ybm9kZSA9IHRvX2ZyZWUtPnNsb3RzWzBdOworCQlyb290LT5oZWlnaHQt LTsKKwkJLyogbXVzdCBvbmx5IGZyZWUgemVyb2VkIG5vZGVzIGludG8gdGhlIHNs YWIgKi8KKyNpZmRlZiBSQURJWF9UUkVFX1RBR1MKKwkJdGFnX2NsZWFyKHRvX2Zy ZWUsIDAsIDApOworCQl0YWdfY2xlYXIodG9fZnJlZSwgMSwgMCk7CisjZW5kaWYK KwkJdG9fZnJlZS0+c2xvdHNbMF0gPSBOVUxMOworCQl0b19mcmVlLT5jb3VudCA9 IDA7CisJCXJhZGl4X3RyZWVfbm9kZV9mcmVlKHRvX2ZyZWUpOworCX0KK30KKwor LyoqCisgKglyYWRpeF90cmVlX2RlbGV0ZSAgICAtICAgIGRlbGV0ZSBhbiBpdGVt IGZyb20gYSByYWRpeCB0cmVlCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAor ICoJQGluZGV4OgkJaW5kZXgga2V5CisgKgorICoJUmVtb3ZlIHRoZSBpdGVtIGF0 IEBpbmRleCBmcm9tIHRoZSByYWRpeCB0cmVlIHJvb3RlZCBhdCBAcm9vdC4KKyAq CisgKglSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWxldGVkIGl0ZW0sIG9y IE5VTEwgaWYgaXQgd2FzIG5vdCBwcmVzZW50LgorICovCit2b2lkICpyYWRpeF90 cmVlX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25l ZCBsb25nIGluZGV4KQoreworCXN0cnVjdCByYWRpeF90cmVlX3BhdGggcGF0aFtS QURJWF9UUkVFX01BWF9QQVRIXSwgKnBhdGhwID0gcGF0aDsKKwlzdHJ1Y3QgcmFk aXhfdHJlZV9wYXRoICpvcmlnX3BhdGhwOworCXN0cnVjdCByYWRpeF90cmVlX25v ZGUgKnNsb3Q7CisJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7CisJdm9pZCAq cmV0ID0gTlVMTDsKKyNpZmRlZiBSQURJWF9UUkVFX1RBR1MKKwljaGFyIHRhZ3Nb UkFESVhfVFJFRV9NQVhfVEFHU107CisJaW50IG5yX2NsZWFyZWRfdGFnczsKKwlp bnQgdGFnOworI2VuZGlmCisJaW50IG9mZnNldDsKKworCWhlaWdodCA9IHJvb3Qt PmhlaWdodDsKKwlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdo dCkpCisJCWdvdG8gb3V0OworCisJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJ WF9UUkVFX01BUF9TSElGVDsKKwlwYXRocC0+bm9kZSA9IE5VTEw7CisJc2xvdCA9 IHJvb3QtPnJub2RlOworCisJZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSkg eworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisKKwkJcGF0aHAr KzsKKwkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQ X01BU0s7CisJCXBhdGhwLT5vZmZzZXQgPSBvZmZzZXQ7CisJCXBhdGhwLT5ub2Rl ID0gc2xvdDsKKwkJc2xvdCA9IHNsb3QtPnNsb3RzW29mZnNldF07CisJCXNoaWZ0 IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOworCX0KKworCXJldCA9IHNsb3Q7CisJ aWYgKHJldCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCW9yaWdfcGF0aHAgPSBw YXRocDsKKworI2lmZGVmIFJBRElYX1RSRUVfVEFHUworCS8qCisJICogQ2xlYXIg YWxsIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LWRlbGV0ZWQgaXRlbQor CSAqLworCW5yX2NsZWFyZWRfdGFncyA9IDA7CisJZm9yICh0YWcgPSAwOyB0YWcg PCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykgeworCQl0YWdzW3RhZ10gPSAx OworCQlpZiAodGFnX2dldChwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0 KSkgeworCQkJdGFnX2NsZWFyKHBhdGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZz ZXQpOworCQkJaWYgKCFhbnlfdGFnX3NldChwYXRocC0+bm9kZSwgdGFnKSkgewor CQkJCXRhZ3NbdGFnXSA9IDA7CisJCQkJbnJfY2xlYXJlZF90YWdzKys7CisJCQl9 CisJCX0KKwl9CisKKwlmb3IgKHBhdGhwLS07IG5yX2NsZWFyZWRfdGFncyAmJiBw YXRocC0+bm9kZTsgcGF0aHAtLSkgeworCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJB RElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKSB7CisJCQlpZiAodGFnc1t0YWddKQor CQkJCWNvbnRpbnVlOworCisJCQl0YWdfY2xlYXIocGF0aHAtPm5vZGUsIHRhZywg cGF0aHAtPm9mZnNldCk7CisJCQlpZiAoYW55X3RhZ19zZXQocGF0aHAtPm5vZGUs IHRhZykpIHsKKwkJCQl0YWdzW3RhZ10gPSAxOworCQkJCW5yX2NsZWFyZWRfdGFn cy0tOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJLyogTm93IGZyZWUgdGhlIG5v ZGVzIHdlIGRvIG5vdCBuZWVkIGFueW1vcmUgKi8KKwlmb3IgKHBhdGhwID0gb3Jp Z19wYXRocDsgcGF0aHAtPm5vZGU7IHBhdGhwLS0pIHsKKwkJcGF0aHAtPm5vZGUt PnNsb3RzW3BhdGhwLT5vZmZzZXRdID0gTlVMTDsKKwkJcGF0aHAtPm5vZGUtPmNv dW50LS07CisKKwkJaWYgKHBhdGhwLT5ub2RlLT5jb3VudCkgeworCQkJaWYgKHBh dGhwLT5ub2RlID09IHJvb3QtPnJub2RlKQorCQkJCXJhZGl4X3RyZWVfc2hyaW5r KHJvb3QpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBOb2RlIHdpdGggemVy byBzbG90cyBpbiB1c2Ugc28gZnJlZSBpdCAqLworCQlyYWRpeF90cmVlX25vZGVf ZnJlZShwYXRocC0+bm9kZSk7CisJfQorCXJvb3QtPnJub2RlID0gTlVMTDsKKwly b290LT5oZWlnaHQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKyNpZmRl ZiBSQURJWF9UUkVFX1RBR1MKKy8qKgorICoJcmFkaXhfdHJlZV90YWdnZWQgLSB0 ZXN0IHdoZXRoZXIgYW55IGl0ZW1zIGluIHRoZSB0cmVlIGFyZSB0YWdnZWQKKyAq CUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAdGFnOgkJdGFnIHRvIHRlc3QK KyAqLworaW50IHJhZGl4X3RyZWVfdGFnZ2VkKHN0cnVjdCByYWRpeF90cmVlX3Jv b3QgKnJvb3QsIHVuc2lnbmVkIGludCB0YWcpCit7CisgIAlzdHJ1Y3QgcmFkaXhf dHJlZV9ub2RlICpybm9kZTsKKyAgCXJub2RlID0gcm9vdC0+cm5vZGU7CisgIAlp ZiAoIXJub2RlKQorICAJCXJldHVybiAwOworCXJldHVybiBhbnlfdGFnX3NldChy bm9kZSwgdGFnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBf X21heGluZGV4KHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisJdW5zaWduZWQgaW50 IHRtcCA9IGhlaWdodCAqIFJBRElYX1RSRUVfTUFQX1NISUZUOworCXVuc2lnbmVk IGxvbmcgaW5kZXggPSAofjBVTCA+PiAoUkFESVhfVFJFRV9JTkRFWF9CSVRTIC0g dG1wIC0gMSkpID4+IDE7CisKKwlpZiAodG1wID49IFJBRElYX1RSRUVfSU5ERVhf QklUUykKKwkJaW5kZXggPSB+MFVMOworCXJldHVybiBpbmRleDsKK30KKworc3Rh dGljIHZvaWQgcmFkaXhfdHJlZV9pbml0X21heGluZGV4KHZvaWQpCit7CisJdW5z aWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZWln aHRfdG9fbWF4aW5kZXgpOyBpKyspCisJCWhlaWdodF90b19tYXhpbmRleFtpXSA9 IF9fbWF4aW5kZXgoaSk7Cit9CisKK3ZvaWQgcmFkaXhfdHJlZV9pbml0KHZvaWQp Cit7CisJcmFkaXhfdHJlZV9pbml0X21heGluZGV4KCk7Cit9CkluZGV4OiByZXBh aXIveGZzcHJvZ3MvcmVwYWlyL3JhZGl4LXRyZWUuaAo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSAvZGV2L251bGwJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAg KzAwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcmFkaXgtdHJlZS5oCTIw MDctMDUtMDMgMTg6Mzk6MDYuNzA1ODE1Njg3ICsxMDAwCkBAIC0wLDAgKzEsNzYg QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTW9tY2hpbCBWZWxpa292Cisg KiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcK KyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUs IENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZiBfX1hGU19T VVBQT1JUX1JBRElYX1RSRUVfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfUkFE SVhfVFJFRV9IX18KKworI2RlZmluZSBSQURJWF9UUkVFX1RBR1MKKworc3RydWN0 IHJhZGl4X3RyZWVfcm9vdCB7CisJdW5zaWduZWQgaW50CQloZWlnaHQ7CisJc3Ry dWN0IHJhZGl4X3RyZWVfbm9kZQkqcm5vZGU7Cit9OworCisjZGVmaW5lIFJBRElY X1RSRUVfSU5JVChtYXNrKQl7CQkJCQlcCisJLmhlaWdodCA9IDAsCQkJCQkJCVwK Kwkucm5vZGUgPSBOVUxMLAkJCQkJCQlcCit9CisKKyNkZWZpbmUgUkFESVhfVFJF RShuYW1lLCBtYXNrKSBcCisJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCBuYW1lID0g UkFESVhfVFJFRV9JTklUKG1hc2spCisKKyNkZWZpbmUgSU5JVF9SQURJWF9UUkVF KHJvb3QsIG1hc2spCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCShyb290KS0+aGVp Z2h0ID0gMDsJCQkJCQlcCisJKHJvb3QpLT5ybm9kZSA9IE5VTEw7CQkJCQkJXAor fSB3aGlsZSAoMCkKKworI2lmZGVmIFJBRElYX1RSRUVfVEFHUworI2RlZmluZSBS QURJWF9UUkVFX01BWF9UQUdTIDIKKyNlbmRpZgorCitpbnQgcmFkaXhfdHJlZV9p bnNlcnQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nLCB2 b2lkICopOwordm9pZCAqcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHJhZGl4X3Ry ZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgKipyYWRpeF90cmVlX2xv b2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9u Zyk7Cit2b2lkICpyYWRpeF90cmVlX2xvb2t1cF9maXJzdChzdHJ1Y3QgcmFkaXhf dHJlZV9yb290ICosIHVuc2lnbmVkIGxvbmcgKik7Cit2b2lkICpyYWRpeF90cmVl X2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICosIHVuc2lnbmVkIGxvbmcp OwordW5zaWduZWQgaW50CityYWRpeF90cmVlX2dhbmdfbG9va3VwKHN0cnVjdCBy YWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKipyZXN1bHRzLAorCQkJdW5zaWdu ZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcyk7Cit1 bnNpZ25lZCBpbnQKK3JhZGl4X3RyZWVfZ2FuZ19sb29rdXBfZXgoc3RydWN0IHJh ZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCisJCQl1bnNpZ25l ZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXgsCisJ CQl1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zKTsKKwordm9pZCByYWRpeF90cmVlX2lu aXQodm9pZCk7CisKKyNpZmRlZiBSQURJWF9UUkVFX1RBR1MKK3ZvaWQgKnJhZGl4 X3RyZWVfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJ dW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IHRhZyk7Cit2b2lkICpy YWRpeF90cmVlX3RhZ19jbGVhcihzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290 LAorCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IHRhZyk7Citp bnQgcmFkaXhfdHJlZV90YWdfZ2V0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJv b3QsCisJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBpbnQgdGFnKTsK K3Vuc2lnbmVkIGludAorcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcoc3RydWN0 IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCisJCQl1bnNp Z25lZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zLAor CQkJdW5zaWduZWQgaW50IHRhZyk7CitpbnQgcmFkaXhfdHJlZV90YWdnZWQoc3Ry dWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgaW50IHRhZyk7Cisj ZW5kaWYKKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfUkFESVhfVFJFRV9IX18g Ki8KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvc2Nhbi5jCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9zY2Fu LmMJMjAwNy0wNC0yNyAxMzoxMzozNS4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFp ci94ZnNwcm9ncy9yZXBhaXIvc2Nhbi5jCTIwMDctMDUtMTYgMTI6MDI6MzkuNjQw NjUwOTEwICsxMDAwCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAic2Nhbi5o IgogI2luY2x1ZGUgInZlcnNpb25zLmgiCiAjaW5jbHVkZSAiYm1hcC5oIgotI2lu Y2x1ZGUgInByZWZldGNoLmgiCiAjaW5jbHVkZSAicHJvZ3Jlc3MuaCIKIAogZXh0 ZXJuIGludCB2ZXJpZnlfc2V0X2FnaGVhZGVyKHhmc19tb3VudF90ICptcCwgeGZz X2J1Zl90ICpzYnVmLCB4ZnNfc2JfdCAqc2IsCkBAIC0xMTQ3LDkgKzExNDYsNiBA QAogCiAJYWdpX2RpcnR5ID0gYWdmX2RpcnR5ID0gc2JfZGlydHkgPSAwOwogCi0J aWYgKGRvX3ByZWZldGNoKQotCQlwcmVmZXRjaF9zYihtcCwgYWdubyk7Ci0KIAlz YmJ1ZiA9IGxpYnhmc19yZWFkYnVmKG1wLT5tX2RldiwgWEZTX0FHX0RBRERSKG1w LCBhZ25vLCBYRlNfU0JfREFERFIpLAogCQkJCVhGU19GU1NfVE9fQkIobXAsIDEp LCAwKTsKIAlpZiAoIXNiYnVmKSAgewpAQCAtMTI0MSw5ICsxMjM3LDYgQEAKIAog CXNjYW5fZnJlZWxpc3QoYWdmKTsKIAotCWlmIChkb19wcmVmZXRjaCkKLQkJIHBy ZWZldGNoX3Jvb3RzKG1wLCBhZ25vLCBhZ2YsIGFnaSk7Ci0KIAlpZiAoSU5UX0dF VChhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQk5PXSwgQVJDSF9DT05WRVJUKSAh PSAwICYmCiAJICAgIHZlcmlmeV9hZ2JubyhtcCwgYWdubywKIAkJCUlOVF9HRVQo YWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0JOT10sIEFSQ0hfQ09OVkVSVCkpKQpJ bmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci90aHJlYWRzLmMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL3RocmVh ZHMuYwkyMDA3LTA0LTI3IDEzOjEzOjM1LjAwMDAwMDAwMCArMTAwMAorKysgcmVw YWlyL3hmc3Byb2dzL3JlcGFpci90aHJlYWRzLmMJMjAwNy0wNC0yNyAxNDoxMjoz NC4yMTk1NTk4NDcgKzEwMDAKQEAgLTEsMTM4ICsxLDYwIEBACiAjaW5jbHVkZSA8 bGlieGZzLmg+Ci0jaW5jbHVkZSAicHRocmVhZC5oIgotI2luY2x1ZGUgInNpZ25h bC5oIgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4K ICNpbmNsdWRlICJ0aHJlYWRzLmgiCiAjaW5jbHVkZSAiZXJyX3Byb3Rvcy5oIgog I2luY2x1ZGUgInByb3Rvcy5oIgorI2luY2x1ZGUgImdsb2JhbHMuaCIKIAotaW50 IGRvX3BhcmFsbGVsID0gMTsKLWludCB0aHJlYWRfY291bnQ7Ci0KLS8qIEEgcXVh bnR1bSBvZiB3b3JrICovCi10eXBlZGVmIHN0cnVjdCB3b3JrX3MgewotCXN0cnVj dCB3b3JrX3MJKm5leHQ7Ci0JZGlzcF9mdW5jX3QJKmZ1bmN0aW9uOwotCXhmc19t b3VudF90CSptcDsKLQl4ZnNfYWdudW1iZXJfdAlhZ25vOwotfSB3b3JrX3Q7Ci0K LXR5cGVkZWYgc3RydWN0ICB3b3JrX3F1ZXVlX3MgewotCXdvcmtfdAkJKm5leHQ7 Ci0Jd29ya190CQkqbGFzdDsKLQlpbnQJCWFjdGl2ZV90aHJlYWRzOwotCWludAkJ d29ya19jb3VudDsKLQlwdGhyZWFkX2NvbmRfdAltY3Y7CS8qIG1haW4gdGhyZWFk IGNvbmRpdGlvbmFsIHZhcmlhYmxlICovCi0JcHRocmVhZF9jb25kX3QJd2N2Owkv KiB3b3JrZXIgdGhyZWFkcyBjb25kaXRpb25hbCB2YXJpYWJsZSAqLwotCXB0aHJl YWRfbXV0ZXhfdAltdXRleDsKLX0gd29ya19xdWV1ZV90OwotCi1zdGF0aWMJd29y a19xdWV1ZV90CXdvcmtfcXVldWU7Ci1zdGF0aWMJcHRocmVhZF90CSp3b3JrX3Ro cmVhZHM7Ci0KLXN0YXRpYwl2b2lkCSp3b3JrZXJfdGhyZWFkKHZvaWQgKmFyZyk7 Ci0KLXN0YXRpYyB2b2lkCi1pbml0X3dvcmtlcnMod29ya19xdWV1ZV90ICp3cSwg aW50IG53KQorc3RhdGljIHZvaWQgKgord29ya2VyX3RocmVhZCh2b2lkICphcmcp CiB7Ci0JaW50CQkJZXJyOwotCXB0aHJlYWRfbXV0ZXhhdHRyX3QJbXR4YXR0cjsK LQotCW1lbXNldCh3cSwgMCwgc2l6ZW9mKHdvcmtfcXVldWVfdCkpOwotCXdxLT5h Y3RpdmVfdGhyZWFkcyA9IG53OwotCi0JcHRocmVhZF9jb25kX2luaXQoJndxLT5t Y3YsIE5VTEwpOwotCXB0aHJlYWRfY29uZF9pbml0KCZ3cS0+d2N2LCBOVUxMKTsK LQlwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdHhhdHRyKTsKLQotI2lmZGVmCVBU SFJFQURfTVVURVhfU1BJTkJMT0NLX05QCi0JLyogTlAgLSBOb24gUG9ydGFibGUg LSBJcml4ICovCi0JaWYgKChlcnIgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBl KCZtdHhhdHRyLAotCQkJUFRIUkVBRF9NVVRFWF9TUElOQkxPQ0tfTlApKSA+IDAp IHsKLQkJZG9fZXJyb3IoXygiaW5pdF93b3JrZXJzOiB0aHJlYWQgMHgleDogcHRo cmVhZF9tdXRleGF0dHJfc2V0dHlwZSBlcnJvciAlZDogJXNcbiIpLAotCQkJcHRo cmVhZF9zZWxmKCksIGVyciwgc3RyZXJyb3IoZXJyKSk7Ci0JfQotI2VuZGlmCi0j aWZkZWYJUFRIUkVBRF9NVVRFWF9GQVNUX05QCi0JLyogTlAgLSBOb24gUG9ydGFi bGUgLSBMaW51eCAqLwotCWlmICgoZXJyID0gcHRocmVhZF9tdXRleGF0dHJfc2V0 dHlwZSgmbXR4YXR0ciwKLQkJCVBUSFJFQURfTVVURVhfRkFTVF9OUCkpID4gMCkg ewotCQlkb19lcnJvcihfKCJpbml0X3dvcmtlcnM6IHRocmVhZCAweCV4OiBwdGhy ZWFkX211dGV4YXR0cl9zZXR0eXBlIGVycm9yICVkOiAlc1xuIiksCi0JCQlwdGhy ZWFkX3NlbGYoKSwgZXJyLCBzdHJlcnJvcihlcnIpKTsKLQl9Ci0jZW5kaWYKLQlp ZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmd3EtPm11dGV4LCAmbXR4YXR0 cikpID4gMCkgewotCQlkb19lcnJvcihfKCJpbml0X3dvcmtlcnM6IHRocmVhZCAw eCV4OiBwdGhyZWFkX211dGV4X2luaXQgZXJyb3IgJWQ6ICVzXG4iKSwKLQkJCXB0 aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVycm9yKGVycikpOwotCX0KLX0KKwl3b3Jr X3F1ZXVlX3QJKndxOworCXdvcmtfaXRlbV90CSp3aTsKIAotc3RhdGljIHZvaWQK LXF1aWVzY2Vfd29ya2Vycyh3b3JrX3F1ZXVlX3QgKndxKQotewotCWludAllcnI7 CisJd3EgPSAod29ya19xdWV1ZV90Kilhcmc7CiAKLQlpZiAoKGVyciA9IHB0aHJl YWRfbXV0ZXhfbG9jaygmd3EtPm11dGV4KSkgPiAwKQotCQlkb19lcnJvcihfKCJx dWllc2NlX3dvcmtlcnM6IHRocmVhZCAweCV4OiBwdGhyZWFkX211dGV4X2xvY2sg ZXJyb3IgJWQ6ICVzXG4iKSwKLQkJCXB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVy cm9yKGVycikpOwotCWlmICh3cS0+YWN0aXZlX3RocmVhZHMgPiAwKSB7Ci0JCWlm ICgoZXJyID0gcHRocmVhZF9jb25kX3dhaXQoJndxLT5tY3YsICZ3cS0+bXV0ZXgp KSA+IDApCi0JCQlkb19lcnJvcihfKCJxdWllc2NlX3dvcmtlcnM6IHRocmVhZCAw eCV4OiBwdGhyZWFkX2NvbmRfd2FpdCBlcnJvciAlZDogJXNcbiIpLAotCQkJCXB0 aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVycm9yKGVycikpOwotCX0KLQlBU1NFUlQo d3EtPmFjdGl2ZV90aHJlYWRzID09IDApOwotCWlmICgoZXJyID0gcHRocmVhZF9t dXRleF91bmxvY2soJndxLT5tdXRleCkpID4gMCkKLQkJZG9fZXJyb3IoXygicXVp ZXNjZV93b3JrZXJzOiB0aHJlYWQgMHgleDogcHRocmVhZF9tdXRleF91bmxvY2sg ZXJyb3IgJWQ6ICVzXG4iKSwKLQkJCXB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVy cm9yKGVycikpOwotfQorCS8qCisJICogTG9vcCBwdWxsaW5nIHdvcmsgZnJvbSB0 aGUgcGFzc2VkIGluIHdvcmsgcXVldWUuCisJICogQ2hlY2sgZm9yIG5vdGlmaWNh dGlvbiB0byBleGl0IGFmdGVyIGV2ZXJ5IGNodW5rIG9mIHdvcmsuCisJICovCisJ d2hpbGUgKDEpIHsKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZ3cS0+bG9jayk7CiAK LXN0YXRpYyB2b2lkCi1zdGFydF93b3JrZXJzKHdvcmtfcXVldWVfdCAqd3EsIHVu c2lnbmVkIHRoY250LCBwdGhyZWFkX2F0dHJfdCAqYXR0cnApCi17Ci0JaW50CQll cnI7Ci0JdW5zaWduZWQgbG9uZwlpOworCQkvKgorCQkgKiBXYWl0IGZvciB3b3Jr LgorCQkgKi8KKwkJd2hpbGUgKHdxLT5uZXh0X2l0ZW0gPT0gTlVMTCAmJiAhd3Et PnRlcm1pbmF0ZSkgeworCQkJQVNTRVJUKHdxLT5pdGVtX2NvdW50ID09IDApOwor CQkJcHRocmVhZF9jb25kX3dhaXQoJndxLT53YWtldXAsICZ3cS0+bG9jayk7CisJ CX0KKwkJaWYgKHdxLT5uZXh0X2l0ZW0gPT0gTlVMTCAmJiB3cS0+dGVybWluYXRl KSB7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmd3EtPmxvY2spOworCQkJYnJl YWs7CisJCX0KIAotCWluaXRfd29ya2Vycyh3cSwgdGhjbnQpOworCQkvKgorCQkg KiAgRGVxdWV1ZSB3b3JrIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJCSAq LworCQlBU1NFUlQod3EtPml0ZW1fY291bnQgPiAwKTsKKwkJd2kgPSB3cS0+bmV4 dF9pdGVtOworCQl3cS0+bmV4dF9pdGVtID0gd2ktPm5leHQ7CisJCXdxLT5pdGVt X2NvdW50LS07CiAKLQlpZiAoKHdvcmtfdGhyZWFkcyA9IChwdGhyZWFkX3QgKilt YWxsb2Moc2l6ZW9mKHB0aHJlYWRfdCkgKiB0aGNudCkpID09IE5VTEwpCi0JCWRv X2Vycm9yKF8oImNhbm5vdCBtYWxsb2MgJWxkIGJ5dGVzIGZvciB3b3JrX3RocmVh ZHMgYXJyYXlcbiIpLAotCQkJCXNpemVvZihwdGhyZWFkX3QpICogdGhjbnQpOwor CQlwdGhyZWFkX211dGV4X3VubG9jaygmd3EtPmxvY2spOwogCi0JLyoKLQkqKiAg Q3JlYXRlIHdvcmtlciB0aHJlYWRzCi0JKi8KLQlmb3IgKGkgPSAwOyBpIDwgdGhj bnQ7IGkrKykgewotCQllcnIgPSBwdGhyZWFkX2NyZWF0ZSgmd29ya190aHJlYWRz W2ldLCBhdHRycCwgd29ya2VyX3RocmVhZCwgKHZvaWQgKikgaSk7Ci0JCWlmKGVy ciA+IDApIHsKLQkJICAgICAgICBkb19lcnJvcihfKCJjYW5ub3QgY3JlYXRlIHdv cmtlciB0aHJlYWRzLCBzdGF0dXMgPSBbJWRdICVzXG4iKSwKLQkJCQllcnIsIHN0 cmVycm9yKGVycikpOwotCQl9CisJCSh3aS0+ZnVuY3Rpb24pKHdpLT5xdWV1ZSwg d2ktPmFnbm8sIHdpLT5hcmcpOworCQlmcmVlKHdpKTsKIAl9Ci0JZG9fbG9nKF8o IiAgICAgICAgLSBjcmVhdGluZyAlZCB3b3JrZXIgdGhyZWFkKHMpXG4iKSwgdGhj bnQpOwogCi0JLyoKLQkqKiAgV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRv IGluaXRpYWxpemUKLQkqLwotCXF1aWVzY2Vfd29ya2Vycyh3cSk7CisJcmV0dXJu IE5VTEw7CiB9CiAKIHZvaWQKIHRocmVhZF9pbml0KHZvaWQpCiB7Ci0JaW50CQlz dGF0dXM7Ci0JcHRocmVhZF9hdHRyX3QJYXR0cjsKIAlzaWdzZXRfdAlibG9ja2Vk OwogCi0JaWYgKGRvX3BhcmFsbGVsID09IDApCi0JCXJldHVybjsKLQlpZiAodGhy ZWFkX2NvdW50ID09IDApCi0JCXRocmVhZF9jb3VudCA9IDIgKiBsaWJ4ZnNfbnBy b2MoKTsKLQotCWlmICgoc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoJmF0dHIp KSAhPSAwKQotCQlkb19lcnJvcihfKCJzdGF0dXMgZnJvbSBwdGhyZWFkX2F0dHJf aW5pdDogJWQiKSxzdGF0dXMpOwotCi0JaWYgKChzdGF0dXMgPSBwdGhyZWFkX3Nl dGNvbmN1cnJlbmN5KHRocmVhZF9jb3VudCkpICE9IDApCi0JCWRvX2Vycm9yKF8o IlN0YXR1cyBmcm9tIHB0aHJlYWRfc2V0Y29uY3VycmVuY3koJWQpOiAlZCIpLCB0 aHJlYWRfY291bnQsIHN0YXR1cyk7Ci0KIAkvKgogCSAqICBibG9jayBkZWxpdmVy eSBvZiBwcm9ncmVzcyByZXBvcnQgc2lnbmFsIHRvIGFsbCB0aHJlYWRzCiAgICAg ICAgICAqLwpAQCAtMTQwLDE2MCArNjIsOTAgQEAKIAlzaWdhZGRzZXQoJmJsb2Nr ZWQsIFNJR0hVUCk7CiAJc2lnYWRkc2V0KCZibG9ja2VkLCBTSUdBTFJNKTsKIAlw dGhyZWFkX3NpZ21hc2soU0lHX0JMT0NLLCAmYmxvY2tlZCwgTlVMTCk7Ci0KLQlz dGFydF93b3JrZXJzKCZ3b3JrX3F1ZXVlLCB0aHJlYWRfY291bnQsICZhdHRyKTsK IH0KIAotLyoKLSAqIERlcXVldWUgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdC4K LSAqIHdxLT5tdXRleCBoZWxkLgotICovCi1zdGF0aWMgd29ya190ICoKLWRlcXVl dWUod29ya19xdWV1ZV90ICp3cSkKKwordm9pZAorY3JlYXRlX3dvcmtfcXVldWUo CisJd29ya19xdWV1ZV90CQkqd3EsCisJeGZzX21vdW50X3QJCSptcCwKKwlpbnQJ CQlud29ya2VycykKIHsKLQl3b3JrX3QJKndwOworCWludAkJCWVycjsKKwlpbnQJ CQlpOwogCi0JQVNTRVJUKHdxLT53b3JrX2NvdW50ID4gMCk7Ci0Jd3AgPSB3cS0+ bmV4dDsKLQl3cS0+bmV4dCA9IHdwLT5uZXh0OwotCXdxLT53b3JrX2NvdW50LS07 Ci0JaWYgKHdxLT5uZXh0ID09IE5VTEwpIHsKLQkJQVNTRVJUKHdxLT53b3JrX2Nv dW50ID09IDApOwotCQl3cS0+bGFzdCA9IE5VTEw7Ci0JfQotCXdwLT5uZXh0ID0g TlVMTDsKLQlyZXR1cm4gKHdwKTsKLX0KKwltZW1zZXQod3EsIDAsIHNpemVvZih3 b3JrX3F1ZXVlX3QpKTsKIAotc3RhdGljIHZvaWQgKgotd29ya2VyX3RocmVhZCh2 b2lkICphcmcpCi17Ci0Jd29ya19xdWV1ZV90CSp3cTsKLQl3b3JrX3QJCSp3cDsK LQlpbnQJCWVycjsKLQl1bnNpZ25lZCBsb25nCW15aWQ7Ci0KLQl3cSA9ICZ3b3Jr X3F1ZXVlOwotCW15aWQgPSAodW5zaWduZWQgbG9uZykgYXJnOwotCXRzX2luaXQo KTsKLQlsaWJ4ZnNfbGlvX2FsbG9jYXRlKCk7CisJcHRocmVhZF9jb25kX2luaXQo JndxLT53YWtldXAsIE5VTEwpOworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmd3EtPmxv Y2ssIE5VTEwpOwogCi0JLyoKLQkgKiBMb29wIHB1bGxpbmcgd29yayBmcm9tIHRo ZSBnbG9iYWwgd29yayBxdWV1ZS4KLQkgKiBDaGVjayBmb3Igbm90aWZpY2F0aW9u IHRvIGV4aXQgYWZ0ZXIgZXZlcnkgY2h1bmsgb2Ygd29yay4KLQkgKi8KLQl3aGls ZSAoMSkgewotCQlpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmd3EtPm11 dGV4KSkgPiAwKQotCQkJZG9fZXJyb3IoXygid29ya190aHJlYWQlZDogdGhyZWFk IDB4JXg6IHB0aHJlYWRfbXV0ZXhfbG9jayBlcnJvciAlZDogJXNcbiIpLAotCQkJ CW15aWQsIHB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVycm9yKGVycikpOwotCQkv KgotCQkgKiBXYWl0IGZvciB3b3JrLgotCQkgKi8KLQkJd2hpbGUgKHdxLT5uZXh0 ID09IE5VTEwpIHsKLQkJCUFTU0VSVCh3cS0+d29ya19jb3VudCA9PSAwKTsKLQkJ CS8qCi0JCQkgKiBMYXN0IHRocmVhZCBnb2luZyB0byBpZGxlIHNsZWVwIG11c3Qg d2FrZXVwCi0JCQkgKiB0aGUgbWFzdGVyIHRocmVhZC4gIFNhbWUgbXV0ZXggaXMg dXNlZCB0byBsb2NrCi0JCQkgKiBhcm91bmQgdHdvIGRpZmZlcmVudCBjb25kaXRp b24gdmFyaWFibGVzLgotCQkJICovCi0JCQl3cS0+YWN0aXZlX3RocmVhZHMtLTsK LQkJCUFTU0VSVCh3cS0+YWN0aXZlX3RocmVhZHMgPj0gMCk7Ci0JCQlpZiAoIXdx LT5hY3RpdmVfdGhyZWFkcykgewotCQkJCWlmICgoZXJyID0gcHRocmVhZF9jb25k X3NpZ25hbCgmd3EtPm1jdikpID4gMCkKLQkJCQkJZG9fZXJyb3IoXygid29ya190 aHJlYWQlZDogdGhyZWFkIDB4JXg6IHB0aHJlYWRfY29uZF9zaWduYWwgZXJyb3Ig JWQ6ICVzXG4iKSwKLQkJCQkJCW15aWQsIHB0aHJlYWRfc2VsZigpLCBlcnIsIHN0 cmVycm9yKGVycikpOwotCQkJfQotCQkJaWYgKChlcnIgPSBwdGhyZWFkX2NvbmRf d2FpdCgmd3EtPndjdiwgJndxLT5tdXRleCkpID4gMCkKLQkJCQlkb19lcnJvcihf KCJ3b3JrX3RocmVhZCVkOiB0aHJlYWQgMHgleDogcHRocmVhZF9jb25kX3dhaXQg ZXJyb3IgJWQ6ICVzXG4iKSwKLQkJCQkJbXlpZCwgcHRocmVhZF9zZWxmKCksIGVy ciwgc3RyZXJyb3IoZXJyKSk7Ci0JCQl3cS0+YWN0aXZlX3RocmVhZHMrKzsKKwl3 cS0+bXAgPSBtcDsKKwl3cS0+dGhyZWFkX2NvdW50ID0gbndvcmtlcnM7CisJd3Et PnRocmVhZHMgPSBtYWxsb2MobndvcmtlcnMgKiBzaXplb2YocHRocmVhZF90KSk7 CisJd3EtPnRlcm1pbmF0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbndvcmtl cnM7IGkrKykgeworCQllcnIgPSBwdGhyZWFkX2NyZWF0ZSgmd3EtPnRocmVhZHNb aV0sIE5VTEwsIHdvcmtlcl90aHJlYWQsIHdxKTsKKwkJaWYgKGVyciAhPSAwKSB7 CisJCQlkb19lcnJvcihfKCJjYW5ub3QgY3JlYXRlIHdvcmtlciB0aHJlYWRzLCBl cnJvciA9IFslZF0gJXNcbiIpLAorCQkJCWVyciwgc3RyZXJyb3IoZXJyKSk7CiAJ CX0KLQkJLyoKLQkJICogIERlcXVldWUgd29yayBmcm9tIHRoZSBoZWFkIG9mIHRo ZSBsaXN0LgotCQkgKi8KLQkJQVNTRVJUKHdxLT53b3JrX2NvdW50ID4gMCk7Ci0J CXdwID0gZGVxdWV1ZSh3cSk7Ci0JCWlmICgoZXJyID0gcHRocmVhZF9tdXRleF91 bmxvY2soJndxLT5tdXRleCkpID4gMCkKLQkJCWRvX2Vycm9yKF8oIndvcmtfdGhy ZWFkJWQ6IHRocmVhZCAweCV4OiBwdGhyZWFkX211dGV4X3VubG9jayBlcnJvciAl ZDogJXNcbiIpLAotCQkJCW15aWQsIHB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVy cm9yKGVycikpOwotCQkvKgotCQkgKiAgRG8gdGhlIHdvcmsuCi0JCSAqLwotCQko d3AtPmZ1bmN0aW9uKSh3cC0+bXAsIHdwLT5hZ25vKTsKLQotCQlmcmVlKHdwKTsK IAl9Ci0JLyogTk9UIFJFQUNIRUQgKi8KLQlwdGhyZWFkX2V4aXQoTlVMTCk7Ci0J cmV0dXJuIChOVUxMKTsKLX0KIAotaW50Ci1xdWV1ZV93b3JrKGRpc3BfZnVuY190 IGZ1bmMsIHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubykKLXsK LQl3b3JrX3F1ZXVlX3QgKndxOwotCXdvcmtfdAkqd3A7Cit9CiAKLQlpZiAoZG9f cGFyYWxsZWwgPT0gMCkgewotCQlmdW5jKG1wLCBhZ25vKTsKLQkJcmV0dXJuIDA7 Ci0JfQotCXdxID0gJndvcmtfcXVldWU7Ci0JLyoKLQkgKiBHZXQgbWVtb3J5IGZv ciBhIG5ldyB3b3JrIHN0cnVjdHVyZS4KLQkgKi8KLQlpZiAoKHdwID0gKHdvcmtf dCAqKW1lbWFsaWduKDgsIHNpemVvZih3b3JrX3QpKSkgPT0gTlVMTCkKLQkJcmV0 dXJuIChFTk9NRU0pOwotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgbmV3IHdvcmsg c3RydWN0dXJlLgotCSAqLwotCXdwLT5mdW5jdGlvbiA9IGZ1bmM7Ci0Jd3AtPm1w ID0gbXA7Ci0Jd3AtPmFnbm8gPSBhZ25vOwordm9pZAorcXVldWVfd29yaygKKwl3 b3JrX3F1ZXVlX3QJKndxLAorCXdvcmtfZnVuY190CWZ1bmMsCisJeGZzX2FnbnVt YmVyX3QJYWdubywKKwl2b2lkCQkqYXJnKQoreworCXdvcmtfaXRlbV90CSp3aTsK KworCXdpID0gKHdvcmtfaXRlbV90ICopbWFsbG9jKHNpemVvZih3b3JrX2l0ZW1f dCkpOworCWlmICh3aSA9PSBOVUxMKQorCQlkb19lcnJvcihfKCJjYW5ub3QgYWxs b2NhdGUgd29ya2VyIGl0ZW0sIGVycm9yID0gWyVkXSAlc1xuIiksCisJCQllcnJu bywgc3RyZXJyb3IoZXJybm8pKTsKKworCXdpLT5mdW5jdGlvbiA9IGZ1bmM7CisJ d2ktPmFnbm8gPSBhZ25vOworCXdpLT5hcmcgPSBhcmc7CisJd2ktPnF1ZXVlID0g d3E7CisJd2ktPm5leHQgPSBOVUxMOwogCiAJLyoKIAkgKiAgTm93IHF1ZXVlIHRo ZSBuZXcgd29yayBzdHJ1Y3R1cmUgdG8gdGhlIHdvcmsgcXVldWUuCiAJICovCi0J aWYgKHdxLT5uZXh0ID09IE5VTEwpIHsKLQkJd3EtPm5leHQgPSB3cDsKKwlwdGhy ZWFkX211dGV4X2xvY2soJndxLT5sb2NrKTsKKwlpZiAod3EtPm5leHRfaXRlbSA9 PSBOVUxMKSB7CisJCXdxLT5uZXh0X2l0ZW0gPSB3aTsKKwkJQVNTRVJUKHdxLT5p dGVtX2NvdW50ID09IDApOworCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3cS0+d2Fr ZXVwKTsKIAl9IGVsc2UgewotCQl3cS0+bGFzdC0+bmV4dCA9IHdwOworCQl3cS0+ bGFzdF9pdGVtLT5uZXh0ID0gd2k7CiAJfQotCXdxLT5sYXN0ID0gd3A7Ci0Jd3At Pm5leHQgPSBOVUxMOwotCXdxLT53b3JrX2NvdW50Kys7Ci0KLQlyZXR1cm4gKDAp OworCXdxLT5sYXN0X2l0ZW0gPSB3aTsKKwl3cS0+aXRlbV9jb3VudCsrOworCXB0 aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3cS0+bG9jayk7CiB9CiAKIHZvaWQKLXdhaXRf Zm9yX3dvcmtlcnModm9pZCkKK2Rlc3Ryb3lfd29ya19xdWV1ZSgKKwl3b3JrX3F1 ZXVlX3QJKndxKQogewotCWludAkJZXJyOwotCXdvcmtfcXVldWVfdAkqd3E7CisJ aW50CQlpOwogCi0JaWYgKGRvX3BhcmFsbGVsID09IDApCi0JCXJldHVybjsKLQl3 cSA9ICZ3b3JrX3F1ZXVlOwotCWlmICgoZXJyID0gcHRocmVhZF9tdXRleF9sb2Nr KCZ3cS0+bXV0ZXgpKSA+IDApCi0JCWRvX2Vycm9yKF8oIndhaXRfZm9yX3dvcmtl cnM6IHRocmVhZCAweCV4OiBwdGhyZWFkX211dGV4X2xvY2sgZXJyb3IgJWQ6ICVz XG4iKSwKLQkJCXB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVycm9yKGVycikpOwot Ci0JQVNTRVJUKHdxLT5hY3RpdmVfdGhyZWFkcyA9PSAwKTsKLQlpZiAod3EtPndv cmtfY291bnQgPiAwKSB7Ci0JCS8qIGdldCB0aGUgd29ya2VycyBnb2luZyAqLwot CQlpZiAoKGVyciA9IHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJndxLT53Y3YpKSA+ IDApCi0JCQlkb19lcnJvcihfKCJ3YWl0X2Zvcl93b3JrZXJzOiB0aHJlYWQgMHgl eDogcHRocmVhZF9jb25kX2Jyb2FkY2FzdCBlcnJvciAlZDogJXNcbiIpLAotCQkJ CXB0aHJlYWRfc2VsZigpLCBlcnIsIHN0cmVycm9yKGVycikpOwotCQkvKiBhbmQg d2FpdCBmb3IgdGhlbSAqLwotCQlpZiAoKGVyciA9IHB0aHJlYWRfY29uZF93YWl0 KCZ3cS0+bWN2LCAmd3EtPm11dGV4KSkgPiAwKQotCQkJZG9fZXJyb3IoXygid2Fp dF9mb3Jfd29ya2VyczogdGhyZWFkIDB4JXg6IHB0aHJlYWRfY29uZF93YWl0IGVy cm9yICVkOiAlc1xuIiksCi0JCQkJcHRocmVhZF9zZWxmKCksIGVyciwgc3RyZXJy b3IoZXJyKSk7Ci0JfQotCUFTU0VSVCh3cS0+YWN0aXZlX3RocmVhZHMgPT0gMCk7 Ci0JQVNTRVJUKHdxLT53b3JrX2NvdW50ID09IDApOworCXB0aHJlYWRfbXV0ZXhf bG9jaygmd3EtPmxvY2spOworCXdxLT50ZXJtaW5hdGUgPSAxOworCXB0aHJlYWRf bXV0ZXhfdW5sb2NrKCZ3cS0+bG9jayk7CisKKwlwdGhyZWFkX2NvbmRfYnJvYWRj YXN0KCZ3cS0+d2FrZXVwKTsKKworCWZvciAoaSA9IDA7IGkgPCB3cS0+dGhyZWFk X2NvdW50OyBpKyspCisJCXB0aHJlYWRfam9pbih3cS0+dGhyZWFkc1tpXSwgTlVM TCk7CiAKLQlpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3cS0+bXV0 ZXgpKSA+IDApCi0JCWRvX2Vycm9yKF8oIndhaXRfZm9yX3dvcmtlcnM6IHRocmVh ZCAweCV4OiBwdGhyZWFkX211dGV4X3VubG9jayBlcnJvciAlZDogJXNcbiIpLAot CQkJcHRocmVhZF9zZWxmKCksIGVyciwgc3RyZXJyb3IoZXJyKSk7CisJZnJlZSh3 cS0+dGhyZWFkcyk7CisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZ3cS0+bG9jayk7 CisJcHRocmVhZF9jb25kX2Rlc3Ryb3koJndxLT53YWtldXApOwogfQpJbmRleDog cmVwYWlyL3hmc3Byb2dzL3JlcGFpci90aHJlYWRzLmgKPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL3RocmVhZHMuaAky MDA3LTA0LTI3IDEzOjEzOjM1LjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWlyL3hm c3Byb2dzL3JlcGFpci90aHJlYWRzLmgJMjAwNy0wNC0yNyAxNDoxMjozNC4yMTk1 NTk4NDcgKzEwMDAKQEAgLTEsMzcgKzEsNDcgQEAKICNpZm5kZWYJX1hGU19SRVBB SVJfVEhSRUFEU19IXwogI2RlZmluZQlfWEZTX1JFUEFJUl9USFJFQURTX0hfCiAK LWV4dGVybiBpbnQJCWRvX3BhcmFsbGVsOwotZXh0ZXJuIGludAkJdGhyZWFkX2Nv dW50OwotLyoKLSoqICBsb2NraW5nIHZhcmlhbnRzIC0gcndsb2NrL211dGV4Ci0q LwotI2RlZmluZSBQUkVQQUlSX1JXX0xPQ0tfQVRUUgkJUFRIUkVBRF9QUk9DRVNT X1BSSVZBVEUKLQotI2RlZmluZQlQUkVQQUlSX1JXX0xPQ0tfQUxMT0MobGtwLCBu KQkJCQlcCi0JaWYgKGRvX3BhcmFsbGVsKSB7CQkJCQlcCi0JCWxrcCA9IG1hbGxv YyhuKnNpemVvZihwdGhyZWFkX3J3bG9ja190KSk7CVwKLQkJaWYgKGxrcCA9PSBO VUxMKQkJCQlcCi0JCQlkb19lcnJvcigiY2Fubm90IGFsbG9jICVkIGxvY2tzXG4i LCBuKTsJXAotCQkJLyogTk8gUkVUVVJOICovCQkJCVwKLQl9Ci0jZGVmaW5lIFBS RVBBSVJfUldfTE9DS19JTklUKGwsYSkJaWYgKGRvX3BhcmFsbGVsKSBwdGhyZWFk X3J3bG9ja19pbml0KChsKSwoYSkpCi0jZGVmaW5lIFBSRVBBSVJfUldfUkVBRF9M T0NLKGwpIAlpZiAoZG9fcGFyYWxsZWwpIHB0aHJlYWRfcndsb2NrX3JkbG9jaygo bCkpCi0jZGVmaW5lIFBSRVBBSVJfUldfV1JJVEVfTE9DSyhsKQlpZiAoZG9fcGFy YWxsZWwpIHB0aHJlYWRfcndsb2NrX3dybG9jaygobCkpCi0jZGVmaW5lIFBSRVBB SVJfUldfVU5MT0NLKGwpCQlpZiAoZG9fcGFyYWxsZWwpIHB0aHJlYWRfcndsb2Nr X3VubG9jaygobCkpCi0jZGVmaW5lIFBSRVBBSVJfUldfV1JJVEVfTE9DS19OT1RF U1QobCkJcHRocmVhZF9yd2xvY2tfd3Jsb2NrKChsKSkKLSNkZWZpbmUgUFJFUEFJ Ul9SV19VTkxPQ0tfTk9URVNUKGwpCXB0aHJlYWRfcndsb2NrX3VubG9jaygobCkp Ci0jZGVmaW5lIFBSRVBBSVJfUldfTE9DS19ERUxFVEUobCkJaWYgKGRvX3BhcmFs bGVsKSBwdGhyZWFkX3J3bG9ja19kZXN0cm95KChsKSkKLQotI2RlZmluZSBQUkVQ QUlSX01UWF9MT0NLX0lOSVQobSwgYSkJaWYgKGRvX3BhcmFsbGVsKSBwdGhyZWFk X211dGV4X2luaXQoKG0pLCAoYSkpCi0jZGVmaW5lIFBSRVBBSVJfTVRYX0FUVFJf SU5JVChhKQlpZiAoZG9fcGFyYWxsZWwpIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQo KGEpKQotI2RlZmluZSBQUkVQQUlSX01UWF9BVFRSX1NFVChhLCBsKQlpZiAoZG9f cGFyYWxsZWwpIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoKGEpLCBsKQotI2Rl ZmluZSBQUkVQQUlSX01UWF9MT0NLKG0pCQlpZiAoZG9fcGFyYWxsZWwpIHB0aHJl YWRfbXV0ZXhfbG9jayhtKQotI2RlZmluZSBQUkVQQUlSX01UWF9VTkxPQ0sobSkJ CWlmIChkb19wYXJhbGxlbCkgcHRocmVhZF9tdXRleF91bmxvY2sobSkKLQotCi10 eXBlZGVmIHZvaWQJZGlzcF9mdW5jX3QoeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdu dW1iZXJfdCBhZ25vKTsKLWV4dGVybglpbnQJcXVldWVfd29yayhkaXNwX2Z1bmNf dCBmdW5jLCB4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8pOwot ZXh0ZXJuCXZvaWQJd2FpdF9mb3Jfd29ya2Vycyh2b2lkKTsKK3ZvaWQJdGhyZWFk X2luaXQodm9pZCk7CisKK3N0cnVjdCAgd29ya19xdWV1ZTsKKwordHlwZWRlZiB2 b2lkIHdvcmtfZnVuY190KHN0cnVjdCB3b3JrX3F1ZXVlICosIHhmc19hZ251bWJl cl90LCB2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCB3b3JrX2l0ZW0geworCXN0 cnVjdCB3b3JrX2l0ZW0JKm5leHQ7CisJd29ya19mdW5jX3QJCSpmdW5jdGlvbjsK KwlzdHJ1Y3Qgd29ya19xdWV1ZQkqcXVldWU7CisJeGZzX2FnbnVtYmVyX3QJCWFn bm87CisJdm9pZAkJCSphcmc7Cit9IHdvcmtfaXRlbV90OworCit0eXBlZGVmIHN0 cnVjdCAgd29ya19xdWV1ZSB7CisJd29ya19pdGVtX3QJCSpuZXh0X2l0ZW07CisJ d29ya19pdGVtX3QJCSpsYXN0X2l0ZW07CisJaW50CQkJaXRlbV9jb3VudDsKKwlp bnQJCQl0aHJlYWRfY291bnQ7CisJcHRocmVhZF90CQkqdGhyZWFkczsKKwl4ZnNf bW91bnRfdAkJKm1wOworCXB0aHJlYWRfbXV0ZXhfdAkJbG9jazsKKwlwdGhyZWFk X2NvbmRfdAkJd2FrZXVwOworCWludAkJCXRlcm1pbmF0ZTsKK30gd29ya19xdWV1 ZV90OworCit2b2lkCitjcmVhdGVfd29ya19xdWV1ZSgKKwl3b3JrX3F1ZXVlX3QJ CSp3cSwKKwl4ZnNfbW91bnRfdAkJKm1wLAorCWludAkJCW53b3JrZXJzKTsKKwor dm9pZAorcXVldWVfd29yaygKKwl3b3JrX3F1ZXVlX3QJCSp3cSwKKwl3b3JrX2Z1 bmNfdCAJCWZ1bmMsCisJeGZzX2FnbnVtYmVyX3QgCQlhZ25vLAorCXZvaWQJCQkq YXJnKTsKKwordm9pZAorZGVzdHJveV93b3JrX3F1ZXVlKAorCXdvcmtfcXVldWVf dAkJKndxKTsKIAogI2VuZGlmCS8qIF9YRlNfUkVQQUlSX1RIUkVBRFNfSF8gKi8K SW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIveGZzX3JlcGFpci5jCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci94 ZnNfcmVwYWlyLmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEwMDAK KysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIveGZzX3JlcGFpci5jCTIwMDctMDUt MzEgMTE6MjM6MjUuMjQ0NjI3MDUwICsxMDAwCkBAIC01OSwxNyArNTksMTQgQEAK IAkiaWhhc2giLAogI2RlZmluZQlCSEFTSF9TSVpFCTMKIAkiYmhhc2giLAotI2Rl ZmluZQlQUkVGRVRDSF9JTk9fQ05UCTQKLQkicGZpbm8iLAotI2RlZmluZQlQUkVG RVRDSF9ESVJfQ05UCTUKLQkicGZkaXIiLAotI2RlZmluZQlQUkVGRVRDSF9BSU9f Q05UCTYKLQkicGZhaW8iLAotI2RlZmluZQlBR19TVFJJREUJCTcKKyNkZWZpbmUJ QUdfU1RSSURFCTQKIAkiYWdfc3RyaWRlIiwKIAlOVUxMCiB9OwogCitzdGF0aWMg aW50CWloYXNoX29wdGlvbl91c2VkOworc3RhdGljIGludAliaGFzaF9vcHRpb25f dXNlZDsKKwogc3RhdGljIHZvaWQKIHVzYWdlKHZvaWQpCiB7CkBAIC0xODcsOCAr MTg0LDcgQEAKIAlwcmVfNjVfYmV0YSA9IDA7CiAJZnNfc2hhcmVkX2FsbG93ZWQg PSAxOwogCWFnX3N0cmlkZSA9IDA7Ci0JdGhyZWFkX2NvdW50ID0gMDsKLQlkb19w YXJhbGxlbCA9IDA7CisJdGhyZWFkX2NvdW50ID0gMTsKIAlyZXBvcnRfaW50ZXJ2 YWwgPSBQUk9HX1JQVF9ERUZBVUxUOwogCiAJLyoKQEAgLTIyMywxOCArMjE5LDEx IEBACiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgSUhBU0hfU0laRToKIAkJCQkJbGli eGZzX2loYXNoX3NpemUgPSAoaW50KSBzdHJ0b2wodmFsLCAwLCAwKTsKKwkJCQkJ aWhhc2hfb3B0aW9uX3VzZWQgPSAxOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEJI QVNIX1NJWkU6CiAJCQkJCWxpYnhmc19iaGFzaF9zaXplID0gKGludCkgc3RydG9s KHZhbCwgMCwgMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUFJFRkVUQ0hfSU5P X0NOVDoKLQkJCQkJbGlieGZzX2xpb19pbm9fY291bnQgPSAoaW50KSBzdHJ0b2wo dmFsLCAwLCAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQUkVGRVRDSF9ESVJf Q05UOgotCQkJCQlsaWJ4ZnNfbGlvX2Rpcl9jb3VudCA9IChpbnQpIHN0cnRvbCh2 YWwsIDAsIDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBSRUZFVENIX0FJT19D TlQ6Ci0JCQkJCWxpYnhmc19saW9fYWlvX2NvdW50ID0gKGludCkgc3RydG9sKHZh bCwgMCwgMCk7CisJCQkJCWJoYXNoX29wdGlvbl91c2VkID0gMTsKIAkJCQkJYnJl YWs7CiAJCQkJY2FzZSBBR19TVFJJREU6CiAJCQkJCWFnX3N0cmlkZSA9IChpbnQp IHN0cnRvbCh2YWwsIDAsIDApOwpAQCAtMjcyLDEwICsyNjEsNyBAQAogCQkJcHJp bnRmKF8oIiVzIHZlcnNpb24gJXNcbiIpLCBwcm9nbmFtZSwgVkVSU0lPTik7CiAJ CQlleGl0KDApOwogCQljYXNlICdQJzoKLQkJCWRvX3ByZWZldGNoIF49IDE7Ci0J CQlicmVhazsKLQkJY2FzZSAnTSc6Ci0JCQlkb19wYXJhbGxlbCBePSAxOworCQkJ ZG9fcHJlZmV0Y2ggPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgJ3QnOgogCQkJcmVw b3J0X2ludGVydmFsID0gKGludCkgc3RydG9sKG9wdGFyZywgMCwgMCk7CkBAIC00 ODMsMTIgKzQ2OSwxOSBAQAogCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FM RURJUik7CiAJdGV4dGRvbWFpbihQQUNLQUdFKTsKIAorI2lmZGVmIFhSX1BGX1RS QUNFCisJcGZfdHJhY2VfZmlsZSA9IGZvcGVuKCIvdG1wL3hmc19yZXBhaXJfcHJl ZmV0Y2gudHJhY2UiLCAidyIpOworCXNldHZidWYocGZfdHJhY2VfZmlsZSwgTlVM TCwgX0lPTEJGLCAxMDI0KTsKKyNlbmRpZgorCiAJdGVtcF9tcCA9ICZ4ZnNfbTsK IAlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKIAogCXByb2Nlc3NfYXJncyhhcmdjLCBh cmd2KTsKIAl4ZnNfaW5pdCgmeCk7CiAKKwltc2didWYgPSBtYWxsb2MoRFVSQVRJ T05fQlVGX1NJWkUpOworCiAJdGltZXN0YW1wKFBIQVNFX1NUQVJULCAwLCBOVUxM KTsKIAl0aW1lc3RhbXAoUEhBU0VfRU5ELCAwLCBOVUxMKTsKIApAQCAtNTI5LDIy ICs1MjIsNzcgQEAKIAlpbm9kZXNfcGVyX2NsdXN0ZXIgPSBYRlNfSU5PREVfQ0xV U1RFUl9TSVpFKG1wKSA+PiBtcC0+bV9zYi5zYl9pbm9kZWxvZzsKIAogCWlmIChh Z19zdHJpZGUpIHsKLQkJZG9fcGFyYWxsZWwgPSAxOwotCQl0aHJlYWRfY291bnQg PSAobXAtPm1fc2Iuc2JfYWdjb3VudCArIGFnX3N0cmlkZSAtIDEpIC8gYWdfc3Ry aWRlOworCQl0aHJlYWRfY291bnQgPSAoZ2xvYl9hZ2NvdW50ICsgYWdfc3RyaWRl IC0gMSkgLyBhZ19zdHJpZGU7CiAJCXRocmVhZF9pbml0KCk7CiAJfQogCi0JaWYg KGRvX3BhcmFsbGVsICYmIHJlcG9ydF9pbnRlcnZhbCkgeworCWlmIChhZ19zdHJp ZGUgJiYgcmVwb3J0X2ludGVydmFsKSB7CiAJCWluaXRfcHJvZ3Jlc3NfcnB0KCk7 Ci0JCW1zZ2J1ZiA9IG1hbGxvYyhEVVJBVElPTl9CVUZfU0laRSk7CiAJCWlmICht c2didWYpIHsKIAkJCWRvX2xvZyhfKCIgICAgICAgIC0gcmVwb3J0aW5nIHByb2dy ZXNzIGluIGludGVydmFscyBvZiAlc1xuIiksCiAJCQlkdXJhdGlvbihyZXBvcnRf aW50ZXJ2YWwsIG1zZ2J1ZikpOwotCQkJZnJlZShtc2didWYpOwogCQl9CiAJfQog CiAJLyoKKwkgKiBBZGp1c3QgbGlieGZzIGNhY2hlIHNpemVzIGJhc2VkIG9uIHN5 c3RlbSBtZW1vcnksCisJICogZmlsZXN5c3RlbSBzaXplIGFuZCBpbm9kZSBjb3Vu dC4KKwkgKgorCSAqIFdlJ2xsIHNldCB0aGUgY2FjaGUgc2l6ZSBiYXNlZCBvbiAz LzRzIHRoZSBtZW1vcnkgbWludXMKKwkgKiBzcGFjZSB1c2VkIGJ5IHRoZSBpbm9k ZSBBVkwgdHJlZSBhbmQgYmxvY2sgdXNhZ2UgbWFwLgorCSAqCisJICogSW5vZGUg QVZMIHRyZWUgc3BhY2UgaXMgYXBwcm94aW1hdGVseSA0IGJ5dGVzIHBlciBpbm9k ZSwKKwkgKiBibG9jayB1c2FnZSBtYXAgaXMgY3VycmVudGx5IDEgYnl0ZSBmb3Ig MiBibG9ja3MuCisJICoKKwkgKiBXZSBhc3N1bWUgbW9zdCBibG9ja3Mgd2lsbCBi ZSBpbm9kZSBjbHVzdGVycy4KKwkgKgorCSAqIENhbGN1bGF0aW9ucyBhcmUgZG9u ZSBpbiBraWxvYnl0ZSB1bml0cy4KKwkgKi8KKworCWlmICghYmhhc2hfb3B0aW9u X3VzZWQpIHsKKwkJdW5zaWduZWQgbG9uZyAJbWVtX3VzZWQ7CisJCXVuc2lnbmVk IGxvbmcJcGh5c19tZW07CisKKwkJbGlieGZzX2ljYWNoZV9wdXJnZSgpOworCQls aWJ4ZnNfYmNhY2hlX3B1cmdlKCk7CisJCWNhY2hlX2Rlc3Ryb3kobGlieGZzX2lj YWNoZSk7CisJCWNhY2hlX2Rlc3Ryb3kobGlieGZzX2JjYWNoZSk7CisKKwkJbWVt X3VzZWQgPSAobXAtPm1fc2Iuc2JfaWNvdW50ID4+ICgxMCAtIDIpKSArCisJCQkJ CShtcC0+bV9zYi5zYl9kYmxvY2tzID4+ICgxMCArIDEpKTsKKwkJcGh5c19tZW0g PSBsaWJ4ZnNfcGh5c21lbSgpICogMyAvIDQ7CisKKwkJaWYgKHBoeXNfbWVtIDw9 IG1lbV91c2VkKSB7CisJCQkvKgorCQkJICogVHVybiBvZmYgcHJlZmV0Y2ggYW5k IG1pbmltaXNlIGxpYnhmcyBjYWNoZSBpZgorCQkJICogcGh5c2ljYWwgbWVtb3J5 IGlzIGRlZW1lZCBpbnN1ZmZpY2llbnQKKwkJCSAqLworCQkJZG9fcHJlZmV0Y2gg PSAwOworCQkJbGlieGZzX2JoYXNoX3NpemUgPSA2NDsKKwkJfSBlbHNlIHsKKwkJ CXBoeXNfbWVtIC09IG1lbV91c2VkOworCQkJaWYgKHBoeXNfbWVtID49ICgxIDw8 IDMwKSkKKwkJCQlwaHlzX21lbSA9IDEgPDwgMzA7CisJCQlsaWJ4ZnNfYmhhc2hf c2l6ZSA9IHBoeXNfbWVtIC8gKEhBU0hfQ0FDSEVfUkFUSU8gKgorCQkJCQkobXAt Pm1faW5vZGVfY2x1c3Rlcl9zaXplID4+IDEwKSk7CisJCQlpZiAobGlieGZzX2Jo YXNoX3NpemUgPCA1MTIpCisJCQkJbGlieGZzX2JoYXNoX3NpemUgPSA1MTI7CisJ CX0KKworCQlpZiAodmVyYm9zZSkKKwkJCWRvX2xvZyhfKCIgICAgICAgIC0gYmxv Y2sgY2FjaGUgc2l6ZSBzZXQgdG8gJWQgZW50cmllc1xuIiksCisJCQkJbGlieGZz X2JoYXNoX3NpemUgKiBIQVNIX0NBQ0hFX1JBVElPKTsKKworCQlpZiAoIWloYXNo X29wdGlvbl91c2VkKQorCQkJbGlieGZzX2loYXNoX3NpemUgPSBsaWJ4ZnNfYmhh c2hfc2l6ZTsKKworCQlsaWJ4ZnNfaWNhY2hlID0gY2FjaGVfaW5pdChsaWJ4ZnNf aWhhc2hfc2l6ZSwKKwkJCQkJCSZsaWJ4ZnNfaWNhY2hlX29wZXJhdGlvbnMpOwor CQlsaWJ4ZnNfYmNhY2hlID0gY2FjaGVfaW5pdChsaWJ4ZnNfYmhhc2hfc2l6ZSwK KwkJCQkJCSZsaWJ4ZnNfYmNhY2hlX29wZXJhdGlvbnMpOworCX0KKworCS8qCiAJ ICogY2FsY3VsYXRlIHdoYXQgbWtmcyB3b3VsZCBkbyB0byB0aGlzIGZpbGVzeXN0 ZW0KIAkgKi8KIAljYWxjX21rZnMobXApOwpAQCAtNTY0LDE2ICs2MTIsMTUgQEAK IAlwaGFzZTIobXApOwogCXRpbWVzdGFtcChQSEFTRV9FTkQsIDIsIE5VTEwpOwog CisJaWYgKGRvX3ByZWZldGNoKQorCQlpbml0X3ByZWZldGNoKG1wKTsKKwogCXBo YXNlMyhtcCk7CiAJdGltZXN0YW1wKFBIQVNFX0VORCwgMywgTlVMTCk7CiAKIAlw aGFzZTQobXApOwogCXRpbWVzdGFtcChQSEFTRV9FTkQsIDQsIE5VTEwpOwogCi0J LyogWFhYOiBuYXRoYW5zIC0gc29tZXRoaW5nIGluIHBoYXNlNCBhaW4ndCBwbGF5 aW5nIGJ5ICovCi0JLyogdGhlIGJ1ZmZlciBjYWNoZSBydWxlcy4uIHdoeSBkb2Vz bid0IElSSVggaGl0IHRoaXM/ICovCi0JbGlieGZzX2JjYWNoZV9mbHVzaCgpOwot CiAJaWYgKG5vX21vZGlmeSkKIAkJcHJpbnRmKF8oIk5vIG1vZGlmeSBmbGFnIHNl dCwgc2tpcHBpbmcgcGhhc2UgNVxuIikpOwogCWVsc2UgewpAQCAtNTg1LDggKzYz Miw2IEBACiAJCXBoYXNlNihtcCk7CiAJCXRpbWVzdGFtcChQSEFTRV9FTkQsIDYs IE5VTEwpOwogCi0JCWxpYnhmc19iY2FjaGVfZmx1c2goKTsKLQogCQlwaGFzZTco bXApOwogCQl0aW1lc3RhbXAoUEhBU0VfRU5ELCA3LCBOVUxMKTsKIAl9IGVsc2Ug IHsKQEAgLTY0OCw3ICs2OTMsNyBAQAogCQl9CiAJfQogCi0JaWYgKGRvX3BhcmFs bGVsICYmIHJlcG9ydF9pbnRlcnZhbCkKKwlpZiAoYWdfc3RyaWRlICYmIHJlcG9y dF9pbnRlcnZhbCkKIAkJc3RvcF9wcm9ncmVzc19ycHQoKTsKIAogI2lmZGVmIFRS QUNLX01FTU9SWQpAQCAtNjY3LDEyICs3MTIsNiBAQAogCX0KIAogCS8qCi0JICog RG9uZSwgZmx1c2ggYWxsIGNhY2hlZCBidWZmZXJzIGFuZCBpbm9kZXMuCi0JICov Ci0JbGlieGZzX2ljYWNoZV9wdXJnZSgpOwotCWxpYnhmc19iY2FjaGVfcHVyZ2Uo KTsKLQotCS8qCiAJICogQ2xlYXIgdGhlIHF1b3RhIGZsYWdzIGlmIHRoZXkncmUg b24uCiAJICovCiAJc2JwID0gbGlieGZzX2dldHNiKG1wLCAwKTsKQEAgLTY5OCw2 ICs3MzcsMTEgQEAKIAogCWxpYnhmc193cml0ZWJ1ZihzYnAsIDApOwogCisJLyoK KwkgKiBEb25lLCBmbHVzaCBhbGwgY2FjaGVkIGJ1ZmZlcnMgYW5kIGlub2Rlcy4K KwkgKi8KKwlsaWJ4ZnNfYmNhY2hlX2ZsdXNoKCk7CisKIAlsaWJ4ZnNfdW1vdW50 KG1wKTsKIAlpZiAoeC5ydGRldikKIAkJbGlieGZzX2RldmljZV9jbG9zZSh4LnJ0 ZGV2KTsKQEAgLTcwOCw1ICs3NTIsOCBAQAogCWlmICh2ZXJib3NlKQogCQlzdW1t YXJ5X3JlcG9ydCgpOwogCWRvX2xvZyhfKCJkb25lXG4iKSk7CisjaWZkZWYgWFJf UEZfVFJBQ0UKKwlmY2xvc2UocGZfdHJhY2VfZmlsZSk7CisjZW5kaWYKIAlyZXR1 cm4gKDApOwogfQpJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9kaW5vZGUu Ywo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9y ZXBhaXIvZGlub2RlLmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEw MDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGlub2RlLmMJMjAwNy0wNS0x NiAxMjowMjozOS42MTI2NTQ1MzAgKzEwMDAKQEAgLTUxNCwyOCArNTE0LDYgQEAK IAlyZXR1cm4oTlVMTERGU0JOTyk7CiB9CiAKLS8qCi0gKiBwcm9jZXNzX2JtYnRf cmVjbGlzdF9pbnQgaXMgdGhlIG1vc3QgY29tcHV0ZSBpbnRlbnNpdmUKLSAqIGZ1 bmN0aW9uIGluIHJlcGFpci4gVGhlIGZvbGxvd2luZyBtYWNyb3MgcmVkdWNlIHRo ZQotICogdGhlIGxhcmdlIG51bWJlciBvZiBsb2NrL3VubG9jayBzdGVwcyBpdCB3 b3VsZCBvdGhlcndpc2UKLSAqIGNhbGwuCi0gKi8KLSNkZWZpbmUJUFJPQ0VTU19C TUJUX0RFQ0wodHlwZSwgdmFyKQl0eXBlIHZhcgotCi0jZGVmaW5lCVBST0NFU1Nf Qk1CVF9MT0NLKGFnbm8pCQkJCQkJCVwKLQlpZiAoZG9fcGFyYWxsZWwgJiYgKGFn bm8gIT0gbG9ja2VkX2Fnbm8pKSB7CQkJCVwKLQkJaWYgKGxvY2tlZF9hZ25vICE9 IC0xKQkvKiByZWxlYXNlIG9sZCBhZyBsb2NrICovCQlcCi0JCQlQUkVQQUlSX1JX X1VOTE9DS19OT1RFU1QoJnBlcl9hZ19sb2NrW2xvY2tlZF9hZ25vXSk7CVwKLQkJ UFJFUEFJUl9SV19XUklURV9MT0NLX05PVEVTVCgmcGVyX2FnX2xvY2tbYWdub10p OwkJXAotCQlsb2NrZWRfYWdubyA9IGFnbm87CQkJCQkJXAotCX0KLQotI2RlZmlu ZQlQUk9DRVNTX0JNQlRfVU5MT0NLX1JFVFVSTih2YWwpCQkJCQkJXAotCWRvIHsJ CQkJCQkJCQlcCi0JCWlmIChsb2NrZWRfYWdubyAhPSAtMSkgCQkJCQkJXAotCQkJ UFJFUEFJUl9SV19VTkxPQ0tfTk9URVNUKCZwZXJfYWdfbG9ja1tsb2NrZWRfYWdu b10pOwlcCi0JCXJldHVybiAodmFsKTsJCQkJCQkJXAotCX0gd2hpbGUgKDApCiAK IHN0YXRpYyBpbnQKIHByb2Nlc3NfcnRfcmVjKApAQCAtNjg5LDggKzY2Nyw4IEBA CiAJeGZzX2Rmc2Jub190CQllOwogCXhmc19hZ251bWJlcl90CQlhZ25vOwogCXhm c19hZ2Jsb2NrX3QJCWFnYm5vOwotCVBST0NFU1NfQk1CVF9ERUNMCi0JCQkJKHhm c19hZ251bWJlcl90LCBsb2NrZWRfYWdubz0tMSk7CisJeGZzX2FnbnVtYmVyX3QJ CWxvY2tlZF9hZ25vID0gLTE7CisJaW50CQkJZXJyb3IgPSAxOwogCiAJaWYgKHdo aWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKQogCQlmb3JrbmFtZSA9IF8oImRhdGEi KTsKQEAgLTcwOSwxMSArNjg3LDEwIEBACiAJCWVsc2UKIAkJCSpsYXN0X2tleSA9 IG87CiAJCWlmIChpID4gMCAmJiBvcCArIGNwID4gbykgIHsKLQkJCWRvX3dhcm4o Ci0JXygiYm1hcCByZWMgb3V0IG9mIG9yZGVyLCBpbm9kZSAlbGx1IGVudHJ5ICVk ICIKLQkgICJbbyBzIGNdIFslbGx1ICVsbHUgJWxsdV0sICVkIFslbGx1ICVsbHUg JWxsdV1cbiIpLAorCQkJZG9fd2FybihfKCJibWFwIHJlYyBvdXQgb2Ygb3JkZXIs IGlub2RlICVsbHUgZW50cnkgJWQgIgorCSAgCQkJIltvIHMgY10gWyVsbHUgJWxs dSAlbGx1XSwgJWQgWyVsbHUgJWxsdSAlbGx1XVxuIiksCiAJCQkJaW5vLCBpLCBv LCBzLCBjLCBpLTEsIG9wLCBzcCwgY3ApOwotCQkJUFJPQ0VTU19CTUJUX1VOTE9D S19SRVRVUk4oMSk7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJb3AgPSBvOwogCQlj cCA9IGM7CkBAIC03MjMsMTAgKzcwMCw5IEBACiAJCSAqIGNoZWNrIG51bWVyaWMg dmFsaWRpdHkgb2YgdGhlIGV4dGVudAogCQkgKi8KIAkJaWYgKGMgPT0gMCkgIHsK LQkJCWRvX3dhcm4oCi0JXygiemVybyBsZW5ndGggZXh0ZW50IChvZmYgPSAlbGx1 LCBmc2JubyA9ICVsbHUpIGluIGlubyAlbGx1XG4iKSwKLQkJCQlvLCBzLCBpbm8p OwotCQkJUFJPQ0VTU19CTUJUX1VOTE9DS19SRVRVUk4oMSk7CisJCQlkb193YXJu KF8oInplcm8gbGVuZ3RoIGV4dGVudCAob2ZmID0gJWxsdSwgIgorCQkJCSJmc2Ju byA9ICVsbHUpIGluIGlubyAlbGx1XG4iKSwgbywgcywgaW5vKTsKKwkJCWdvdG8g ZG9uZTsKIAkJfQogCiAJCWlmICh0eXBlID09IFhSX0lOT19SVERBVEEgJiYgd2hp Y2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKQEAgLTc0MywzOSArNzE5LDM4IEBA CiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qCisJCSAqIHJlZ3VsYXIgZmlsZSBk YXRhIGZvcmsgb3IgYXR0cmlidXRlIGZvcmsKKwkJICovCiAJCXN3aXRjaCAodmVy aWZ5X2Rmc2Jub19yYW5nZShtcCwgcywgYykpIHsKIAkJCWNhc2UgWFJfREZTQk5P UkFOR0VfVkFMSUQ6CiAJCQkJYnJlYWs7CisKIAkJCWNhc2UgWFJfREZTQk5PUkFO R0VfQkFEU1RBUlQ6Ci0JCQkJZG9fd2FybigKLQlfKCJpbm9kZSAlbGx1IC0gYmFk IGV4dGVudCBzdGFydGluZyBibG9jayBudW1iZXIgJWxsdSwgb2Zmc2V0ICVsbHVc biIpLAorCQkJCWRvX3dhcm4oXygiaW5vZGUgJWxsdSAtIGJhZCBleHRlbnQgc3Rh cnRpbmcgIgorCQkJCQkiYmxvY2sgbnVtYmVyICVsbHUsIG9mZnNldCAlbGx1XG4i KSwKIAkJCQkJaW5vLCBzLCBvKTsKLQkJCQlQUk9DRVNTX0JNQlRfVU5MT0NLX1JF VFVSTigxKTsKKwkJCQlnb3RvIGRvbmU7CisKIAkJCWNhc2UgWFJfREZTQk5PUkFO R0VfQkFERU5EOgotCQkJCWRvX3dhcm4oCi0JXygiaW5vZGUgJWxsdSAtIGJhZCBl eHRlbnQgbGFzdCBibG9jayBudW1iZXIgJWxsdSwgb2Zmc2V0ICVsbHVcbiIpLAor CQkJCWRvX3dhcm4oXygiaW5vZGUgJWxsdSAtIGJhZCBleHRlbnQgbGFzdCBibG9j ayAiCisJCQkJCSJudW1iZXIgJWxsdSwgb2Zmc2V0ICVsbHVcbiIpLAogCQkJCQlp bm8sIHMgKyBjIC0gMSwgbyk7Ci0JCQkJUFJPQ0VTU19CTUJUX1VOTE9DS19SRVRV Uk4oMSk7Ci0JCQljYXNlIFhSX0RGU0JOT1JBTkdFX09WRVJGTE9XOgotCQkJCWRv X3dhcm4oCisJCQkJZ290byBkb25lOwogCi0JXygiaW5vZGUgJWxsdSAtIGJhZCBl eHRlbnQgb3ZlcmZsb3dzIC0gc3RhcnQgJWxsdSwgZW5kICVsbHUsICIKLQkgICJv ZmZzZXQgJWxsdVxuIiksCisJCQljYXNlIFhSX0RGU0JOT1JBTkdFX09WRVJGTE9X OgorCQkJCWRvX3dhcm4oXygiaW5vZGUgJWxsdSAtIGJhZCBleHRlbnQgb3ZlcmZs b3dzIC0gIgorCQkJCQkic3RhcnQgJWxsdSwgZW5kICVsbHUsIG9mZnNldCAlbGx1 XG4iKSwKIAkJCQkJaW5vLCBzLCBzICsgYyAtIDEsIG8pOwotCQkJCVBST0NFU1Nf Qk1CVF9VTkxPQ0tfUkVUVVJOKDEpOworCQkJCWdvdG8gZG9uZTsKIAkJfQogCQlp ZiAobyA+PSBmc19tYXhfZmlsZV9vZmZzZXQpICB7Ci0JCQlkb193YXJuKAotCV8o Imlub2RlICVsbHUgLSBleHRlbnQgb2Zmc2V0IHRvbyBsYXJnZSAtIHN0YXJ0ICVs bHUsIGNvdW50ICVsbHUsICIKLQkgICJvZmZzZXQgJWxsdVxuIiksCisJCQlkb193 YXJuKF8oImlub2RlICVsbHUgLSBleHRlbnQgb2Zmc2V0IHRvbyBsYXJnZSAtICIK KwkJCQkic3RhcnQgJWxsdSwgY291bnQgJWxsdSwgb2Zmc2V0ICVsbHVcbiIpLAog CQkJCWlubywgcywgYywgbyk7Ci0JCQlQUk9DRVNTX0JNQlRfVU5MT0NLX1JFVFVS TigxKTsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCi0KLQkJLyoKLQkJICogcmVndWxh ciBmaWxlIGRhdGEgZm9yayBvciBhdHRyaWJ1dGUgZm9yawotCQkgKi8KIAkJaWYg KGJsa21hcHAgJiYgKmJsa21hcHApCiAJCQlibGttYXBfc2V0X2V4dChibGttYXBw LCBvLCBzLCBjKTsKIAkJLyoKQEAgLTc4NSwyNiArNzYwLDM2IEBACiAJCWFnbm8g PSBYRlNfRlNCX1RPX0FHTk8obXAsIHMpOwogCQlhZ2JubyA9IFhGU19GU0JfVE9f QUdCTk8obXAsIHMpOwogCQllID0gcyArIGM7Ci0JCVBST0NFU1NfQk1CVF9MT0NL KGFnbm8pOwotCQlmb3IgKGIgPSBzOyBiIDwgZTsgYisrLCBhZ2JubysrKSAgewot CQkJaWYgKGNoZWNrX2R1cHMgPT0gMSkgIHsKLQkJCQkvKgotCQkJCSAqIGlmIHdl J3JlIGp1c3QgY2hlY2tpbmcgdGhlIGJtYXAgZm9yIGR1cHMsCi0JCQkJICogcmV0 dXJuIGlmIHdlIGZpbmQgb25lLCBvdGhlcndpc2UsIGNvbnRpbnVlCi0JCQkJICog Y2hlY2tpbmcgZWFjaCBlbnRyeSB3aXRob3V0IHNldHRpbmcgdGhlCi0JCQkJICog YmxvY2sgYml0bWFwCi0JCQkJICovCisJCWlmIChhZ25vICE9IGxvY2tlZF9hZ25v KSB7CisJCQlpZiAobG9ja2VkX2Fnbm8gIT0gLTEpCisJCQkJcHRocmVhZF9tdXRl eF91bmxvY2soJmFnX2xvY2tzW2xvY2tlZF9hZ25vXSk7CisJCQlwdGhyZWFkX211 dGV4X2xvY2soJmFnX2xvY2tzW2Fnbm9dKTsKKwkJCWxvY2tlZF9hZ25vID0gYWdu bzsKKwkJfQorCisJCWlmIChjaGVja19kdXBzKSB7CisJCQkvKgorCQkJICogaWYg d2UncmUganVzdCBjaGVja2luZyB0aGUgYm1hcCBmb3IgZHVwcywKKwkJCSAqIHJl dHVybiBpZiB3ZSBmaW5kIG9uZSwgb3RoZXJ3aXNlLCBjb250aW51ZQorCQkJICog Y2hlY2tpbmcgZWFjaCBlbnRyeSB3aXRob3V0IHNldHRpbmcgdGhlCisJCQkgKiBi bG9jayBiaXRtYXAKKwkJCSAqLworCQkJZm9yIChiID0gczsgYiA8IGU7IGIrKywg YWdibm8rKykgIHsKIAkJCQlpZiAoc2VhcmNoX2R1cF9leHRlbnQobXAsIGFnbm8s IGFnYm5vKSkgewotCQkJCQlkb193YXJuKAotCV8oIiVzIGZvcmsgaW4gaW5vICVs bHUgY2xhaW1zIGR1cCBleHRlbnQsIG9mZiAtICVsbHUsICIKLQkgICJzdGFydCAt ICVsbHUsIGNudCAlbGx1XG4iKSwKKwkJCQkJZG9fd2FybihfKCIlcyBmb3JrIGlu IGlubyAlbGx1IGNsYWltcyAiCisJCQkJCQkiZHVwIGV4dGVudCwgb2ZmIC0gJWxs dSwgIgorCQkJCQkJInN0YXJ0IC0gJWxsdSwgY250ICVsbHVcbiIpLAogCQkJCQkJ Zm9ya25hbWUsIGlubywgbywgcywgYyk7Ci0JCQkJCVBST0NFU1NfQk1CVF9VTkxP Q0tfUkVUVVJOKDEpOworCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQotCQkJCWNvbnRp bnVlOwogCQkJfQorCQkJKnRvdCArPSBjOworCQkJY29udGludWU7CisJCX0KIAot CQkJLyogUHJvY2VzcyBpbiBjaHVua3Mgb2YgMTYgKFhSX0JCX1VOSVQvWFJfQkIp CisJCWZvciAoYiA9IHM7IGIgPCBlOyBiKyssIGFnYm5vKyspICB7CisJCQkvKgor CQkJICogUHJvY2VzcyBpbiBjaHVua3Mgb2YgMTYgKFhSX0JCX1VOSVQvWFJfQkIp CiAJCQkgKiBmb3IgY29tbW9uIFhSX0VfVU5LTk9XTiB0byBYUl9FX0lOVVNFIHRy YW5zaXRpb24KIAkJCSAqLwogCQkJaWYgKCgoYWdibm8gJiBYUl9CQl9NQVNLKSA9 PSAwKSAmJiAoKHMgKyBjIC0gYikgPj0gKFhSX0JCX1VOSVQvWFJfQkIpKSkgewpA QCAtODE4LDQ1ICs4MDMsNDkgQEAKIAkJCX0KIAogCQkJc3RhdGUgPSBnZXRfYWdi bm9fc3RhdGUobXAsIGFnbm8sIGFnYm5vKTsKKwogCQkJc3dpdGNoIChzdGF0ZSkg IHsKIAkJCWNhc2UgWFJfRV9GUkVFOgogCQkJY2FzZSBYUl9FX0ZSRUUxOgotCQkJ CWRvX3dhcm4oCi0JCQlfKCIlcyBmb3JrIGluIGlubyAlbGx1IGNsYWltcyBmcmVl IGJsb2NrICVsbHVcbiIpLAorCQkJCWRvX3dhcm4oXygiJXMgZm9yayBpbiBpbm8g JWxsdSBjbGFpbXMgZnJlZSAiCisJCQkJCSJibG9jayAlbGx1XG4iKSwKIAkJCQkJ Zm9ya25hbWUsIGlubywgKF9fdWludDY0X3QpIGIpOwogCQkJCS8qIGZhbGwgdGhy b3VnaCAuLi4gKi8KIAkJCWNhc2UgWFJfRV9VTktOT1dOOgogCQkJCXNldF9hZ2Ju b19zdGF0ZShtcCwgYWdubywgYWdibm8sIFhSX0VfSU5VU0UpOwogCQkJCWJyZWFr OworCiAJCQljYXNlIFhSX0VfQkFEX1NUQVRFOgogCQkJCWRvX2Vycm9yKF8oImJh ZCBzdGF0ZSBpbiBibG9jayBtYXAgJWxsdVxuIiksIGIpOwotCQkJCWFib3J0KCk7 Ci0JCQkJYnJlYWs7CisKIAkJCWNhc2UgWFJfRV9GU19NQVA6CiAJCQljYXNlIFhS X0VfSU5POgogCQkJY2FzZSBYUl9FX0lOVVNFX0ZTOgotCQkJCWRvX3dhcm4oCi0J CQlfKCIlcyBmb3JrIGluIGlub2RlICVsbHUgY2xhaW1zIG1ldGFkYXRhIGJsb2Nr ICVsbHVcbiIpLAorCQkJCWRvX3dhcm4oXygiJXMgZm9yayBpbiBpbm9kZSAlbGx1 IGNsYWltcyAiCisJCQkJCSJtZXRhZGF0YSBibG9jayAlbGx1XG4iKSwKIAkJCQkJ Zm9ya25hbWUsIGlubywgKF9fdWludDY0X3QpIGIpOwotCQkJCVBST0NFU1NfQk1C VF9VTkxPQ0tfUkVUVVJOKDEpOworCQkJCWdvdG8gZG9uZTsKKwogCQkJY2FzZSBY Ul9FX0lOVVNFOgogCQkJY2FzZSBYUl9FX01VTFQ6CiAJCQkJc2V0X2FnYm5vX3N0 YXRlKG1wLCBhZ25vLCBhZ2JubywgWFJfRV9NVUxUKTsKLQkJCQlkb193YXJuKAot CQkJXygiJXMgZm9yayBpbiAlcyBpbm9kZSAlbGx1IGNsYWltcyB1c2VkIGJsb2Nr ICVsbHVcbiIpLAorCQkJCWRvX3dhcm4oXygiJXMgZm9yayBpbiAlcyBpbm9kZSAl bGx1IGNsYWltcyAiCisJCQkJCSJ1c2VkIGJsb2NrICVsbHVcbiIpLAogCQkJCQlm b3JrbmFtZSwgZnR5cGUsIGlubywgKF9fdWludDY0X3QpIGIpOwotCQkJCVBST0NF U1NfQk1CVF9VTkxPQ0tfUkVUVVJOKDEpOworCQkJCWdvdG8gZG9uZTsKKwogCQkJ ZGVmYXVsdDoKLQkJCQlkb19lcnJvcigKLQkJCV8oImlsbGVnYWwgc3RhdGUgJWQg aW4gYmxvY2sgbWFwICVsbHVcbiIpLAorCQkJCWRvX2Vycm9yKF8oImlsbGVnYWwg c3RhdGUgJWQgaW4gYmxvY2sgbWFwICVsbHVcbiIpLAogCQkJCQlzdGF0ZSwgYik7 Ci0JCQkJYWJvcnQoKTsKIAkJCX0KIAkJfQogCQkqdG90ICs9IGM7CiAJfQotCi0J UFJPQ0VTU19CTUJUX1VOTE9DS19SRVRVUk4oMCk7CisJZXJyb3IgPSAwOworZG9u ZToKKwlpZiAobG9ja2VkX2Fnbm8gIT0gLTEpCisJCXB0aHJlYWRfbXV0ZXhfdW5s b2NrKCZhZ19sb2Nrc1tsb2NrZWRfYWdub10pOworCXJldHVybiBlcnJvcjsKIH0K IAogLyoKSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGlub2RlLmgKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWly L2Rpbm9kZS5oCTIwMDctMDQtMjcgMTM6MTM6MzUuMDAwMDAwMDAwICsxMDAwCisr KyByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL2Rpbm9kZS5oCTIwMDctMDQtMjcgMTQ6 MTI6MzQuMzExNTQ3ODM4ICsxMDAwCkBAIC0xOCw2ICsxOCw4IEBACiAjaWZuZGVm IF9YUl9ESU5PREVfSAogI2RlZmluZSBfWFJfRElOT0RFX0gKIAorI2luY2x1ZGUg InByZWZldGNoLmgiCisKIHN0cnVjdCBibGttYXA7CiAKIGludApAQCAtMTE2LDYg KzExOCw3IEBACiAJCQkJeGZzX2FnbnVtYmVyX3QJYWdubyk7CiB2b2lkCiBwcm9j ZXNzX2FnaW5vZGVzKHhmc19tb3VudF90CSptcCwKKwkJcHJlZmV0Y2hfYXJnc190 CSpwZl9hcmdzLAogCQl4ZnNfYWdudW1iZXJfdAlhZ25vLAogCQlpbnQJCWNoZWNr X2RpcnMsCiAJCWludAkJY2hlY2tfZHVwcywKSW5kZXg6IHJlcGFpci94ZnNwcm9n cy9saWJ4ZnMvdHJhbnMuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIu b3JpZy94ZnNwcm9ncy9saWJ4ZnMvdHJhbnMuYwkyMDA3LTA0LTI3IDEzOjEzOjM1 LjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL2xpYnhmcy90cmFu cy5jCTIwMDctMDQtMjcgMTQ6MTI6MzQuMzExNTQ3ODM4ICsxMDAwCkBAIC02NDQs MTggKzY0NCwxNyBAQAogCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsIE5VTEwp OwkvKiByZW1vdmUgeGFjdCBwdHIgKi8KIAogCWhvbGQgPSAoYmlwLT5ibGlfZmxh Z3MgJiBYRlNfQkxJX0hPTEQpOwotCWlmIChiaXAtPmJsaV9mbGFncyAmIChYRlNf QkxJX0RJUlRZfFhGU19CTElfU1RBTEUpKSB7CisJaWYgKGJpcC0+YmxpX2ZsYWdz ICYgWEZTX0JMSV9ESVJUWSkgewogI2lmZGVmIFhBQ1RfREVCVUcKIAkJZnByaW50 ZihzdGRlcnIsICJmbHVzaGluZy9zdGFsaW5nIGJ1ZmZlciAlcCAoaG9sZD0lZClc biIsCiAJCQlicCwgaG9sZCk7CiAjZW5kaWYKLQkJaWYgKGJpcC0+YmxpX2ZsYWdz ICYgWEZTX0JMSV9ESVJUWSkKLQkJCWxpYnhmc193cml0ZWJ1Zl9pbnQoYnAsIDAp OwotCQlpZiAoaG9sZCkKLQkJCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0hP TEQ7Ci0JCWVsc2UKLQkJCWxpYnhmc19wdXRidWYoYnApOworCQlsaWJ4ZnNfd3Jp dGVidWZfaW50KGJwLCAwKTsKIAl9CisJaWYgKGhvbGQpCisJCWJpcC0+YmxpX2Zs YWdzICY9IH5YRlNfQkxJX0hPTEQ7CisJZWxzZQorCQlsaWJ4ZnNfcHV0YnVmKGJw KTsKIAkvKiByZWxlYXNlIHRoZSBidWYgaXRlbSAqLwogCWttZW1fem9uZV9mcmVl KHhmc19idWZfaXRlbV96b25lLCBiaXApOwogfQpJbmRleDogcmVwYWlyL3hmc3By b2dzL2xpYnhmcy9NYWtlZmlsZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBh aXIub3JpZy94ZnNwcm9ncy9saWJ4ZnMvTWFrZWZpbGUJMjAwNy0wNC0xMiAxNDo1 NTo1My4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9saWJ4ZnMv TWFrZWZpbGUJMjAwNy0wNS0yOSAxMDo1NzozOC44NzA1MTk5ODggKzEwMDAKQEAg LTExLDcgKzExLDcgQEAKIExUX0FHRSA9IDAKIAogSEZJTEVTID0geGZzLmggaW5p dC5oCi1DRklMRVMgPSBiaXQuYyBjYWNoZS5jIGluaXQuYyBsaW8uYyBsb2dpdGVt LmMgcmR3ci5jIHRyYW5zLmMgdXRpbC5jIFwKK0NGSUxFUyA9IGJpdC5jIGNhY2hl LmMgaW5pdC5jIGxvZ2l0ZW0uYyByZHdyLmMgdHJhbnMuYyB1dGlsLmMgXAogCXhm c19hbGxvYy5jIHhmc19pYWxsb2MuYyB4ZnNfcnRhbGxvYy5jIFwKIAl4ZnNfaW5v ZGUuYyB4ZnNfYnRyZWUuYyB4ZnNfYWxsb2NfYnRyZWUuYyB4ZnNfaWFsbG9jX2J0 cmVlLmMgXAogCXhmc19ibWFwX2J0cmVlLmMgeGZzX2RhX2J0cmVlLmMgeGZzX2Rp ci5jIHhmc19kaXJfbGVhZi5jIFwKSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9pbmNs dWRlL2xpbnV4LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcv eGZzcHJvZ3MvaW5jbHVkZS9saW51eC5oCTIwMDctMDQtMTIgMTQ6NTU6NTIuMDAw MDAwMDAwICsxMDAwCisrKyByZXBhaXIveGZzcHJvZ3MvaW5jbHVkZS9saW51eC5o CTIwMDctMDUtMjkgMTE6MDY6MDEuMDI5NTI5Njk2ICsxMDAwCkBAIC0xMTksOSAr MTE5LDQgQEAKICNkZWZpbmUgX0JPT0xFQU5fVF9ERUZJTkVECTEKICNlbmRpZgog Ci0jaWZkZWYgX19VU0VfR05VCi10eXBlZGVmIHN0cnVjdCBhaW9jYjY0IGFpb2Ni NjRfdDsKLSNkZWZpbmUJX0FJT0NCNjRfVF9ERUZJTkVECTEKLSNlbmRpZgotCiAj ZW5kaWYJLyogX19YRlNfTElOVVhfSF9fICovCkluZGV4OiByZXBhaXIveGZzcHJv Z3MvbGlieGZzL2Rhcndpbi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlcGFp ci5vcmlnL3hmc3Byb2dzL2xpYnhmcy9kYXJ3aW4uYwkyMDA3LTA0LTEyIDE0OjU1 OjUzLjAwMDAwMDAwMCArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL2xpYnhmcy9k YXJ3aW4uYwkyMDA3LTA1LTMwIDEzOjQ4OjI1Ljk4OTY2NDE1NCArMTAwMApAQCAt MjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUg PHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHhmcy9saWJ4ZnMuaD4KKyNpbmNsdWRl IDxzeXMvc3lzY3RsLmg+CiAKIGludCBwbGF0Zm9ybV9oYXNfdXVpZCA9IDE7CiBl eHRlcm4gY2hhciAqcHJvZ25hbWU7CkBAIC05MCwxMyArOTEsNiBAQAogCSpic3og PSBCQlNJWkU7CiB9CiAKLS8qIEFSR1NVU0VEICovCi1pbnQKLXBsYXRmb3JtX2Fp b19pbml0KGludCBhaW9fY291bnQpCi17Ci0JcmV0dXJuIDA7CQkvKiBhaW8vbGlv X2xpc3RpbyBub3QgYXZhaWxhYmxlICovCi19Ci0KIGNoYXIgKgogcGxhdGZvcm1f ZmluZHJhd3BhdGgoY2hhciAqcGF0aCkKIHsKQEAgLTEyNCw1ICsxMTgsMjggQEAK IGludAogcGxhdGZvcm1fbnByb2Modm9pZCkKIHsKLQlyZXR1cm4gMTsKKwlpbnQJ CW5jcHU7CisJc2l6ZV90CQlsZW4gPSBzaXplb2YobmNwdSk7CisJc3RhdGljIGlu dAltaWJbMl0gPSB7Q1RMX0hXLCBIV19OQ1BVfTsKKworCWlmIChzeXNjdGwobWli LCAyLCAmbmNwdSwgJmxlbiwgTlVMTCwgMCkgPCAwKQorCQluY3B1ID0gMTsKKwor CXJldHVybiBuY3B1OwogfQorCit1bnNpZ25lZCBsb25nCitwbGF0Zm9ybV9waHlz bWVtKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZwlwaHlzbWVtOworCXNpemVfdAkJ bGVuID0gc2l6ZW9mKHBoeXNtZW0pOworCXN0YXRpYyBpbnQJbWliWzJdID0ge0NU TF9IVywgSFdfUEhZU01FTX07CisKKwlpZiAoc3lzY3RsKG1pYiwgMiwgJnBoeXNt ZW0sICZsZW4sIE5VTEwsIDApIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgXygi JXM6IGNhbid0IGRldGVybWluZSBtZW1vcnkgc2l6ZVxuIiksCisJCQlwcm9nbmFt ZSk7CisJCWV4aXQoMSk7CisJfQorCXJldHVybiBwaHlzbWVtID4+IDEwOworfQor CkluZGV4OiByZXBhaXIveGZzcHJvZ3MvbGlieGZzL2ZyZWVic2QuYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9saWJ4ZnMvZnJl ZWJzZC5jCTIwMDctMDQtMTIgMTQ6NTU6NTMuMDAwMDAwMDAwICsxMDAwCisrKyBy ZXBhaXIveGZzcHJvZ3MvbGlieGZzL2ZyZWVic2QuYwkyMDA3LTA1LTMwIDEzOjQ4 OjE3LjU4Njc1Mjk1NSArMTAwMApAQCAtMTQ5LDEzICsxNDksNiBAQAogCSpic3og PSAoaW50KXNzaXplOwogfQogCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1wbGF0Zm9y bV9haW9faW5pdChpbnQgYWlvX2NvdW50KQotewotCXJldHVybiAwOwkJLyogYWlv L2xpb19saXN0aW8gbm90IGF2YWlsYWJsZSAqLwotfQotCiBjaGFyICoKIHBsYXRm b3JtX2ZpbmRyYXdwYXRoKGNoYXIgKnBhdGgpCiB7CkBAIC0xODMsNSArMTc2LDI3 IEBACiBpbnQKIHBsYXRmb3JtX25wcm9jKHZvaWQpCiB7Ci0JcmV0dXJuIDE7CisJ aW50CQluY3B1OworCXNpemVfdAkJbGVuID0gc2l6ZW9mKG5jcHUpOworCXN0YXRp YyBpbnQJbWliWzJdID0ge0NUTF9IVywgSFdfTkNQVX07CisKKwlpZiAoc3lzY3Rs KG1pYiwgMiwgJm5jcHUsICZsZW4sIE5VTEwsIDApIDwgMCkKKwkJbmNwdSA9IDE7 CisKKwlyZXR1cm4gbmNwdTsKK30KKwordW5zaWduZWQgbG9uZworcGxhdGZvcm1f cGh5c21lbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcJcGh5c21lbTsKKwlzaXpl X3QJCWxlbiA9IHNpemVvZihwaHlzbWVtKTsKKwlzdGF0aWMgaW50CW1pYlsyXSA9 IHtDVExfSFcsIEhXX1BIWVNNRU19OworCisJaWYgKHN5c2N0bChtaWIsIDIsICZw aHlzbWVtLCAmbGVuLCBOVUxMLCAwKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIs IF8oIiVzOiBjYW4ndCBkZXRlcm1pbmUgbWVtb3J5IHNpemVcbiIpLAorCQkJcHJv Z25hbWUpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gcGh5c21lbSA+PiAxMDsK IH0KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9saWJ4ZnMvaW5pdC5oCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL2xpYnhmcy9pbml0 LmgJMjAwNy0wNC0xMiAxNDo1NTo1My4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFp ci94ZnNwcm9ncy9saWJ4ZnMvaW5pdC5oCTIwMDctMDUtMzAgMTI6NTE6MTkuNDE5 MTY2NDg2ICsxMDAwCkBAIC0zMiw4ICszMiw4IEBACiBleHRlcm4gY2hhciAqcGxh dGZvcm1fZmluZGJsb2NrcGF0aCAoY2hhciAqcGF0aCk7CiBleHRlcm4gaW50IHBs YXRmb3JtX2RpcmVjdF9ibG9ja2RldiAodm9pZCk7CiBleHRlcm4gaW50IHBsYXRm b3JtX2FsaWduX2Jsb2NrZGV2ICh2b2lkKTsKLWV4dGVybiBpbnQgcGxhdGZvcm1f YWlvX2luaXQgKGludCBhaW9fY291bnQpOwogZXh0ZXJuIGludCBwbGF0Zm9ybV9u cHJvYyh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBsYXRmb3JtX3BoeXNt ZW0odm9pZCk7CS8qIGluIGtpbG9ieXRlcyAqLwogZXh0ZXJuIGludCBwbGF0Zm9y bV9oYXNfdXVpZDsKIAogI2VuZGlmCS8qIExJQlhGU19JTklUX0ggKi8KSW5kZXg6 IHJlcGFpci94ZnNwcm9ncy9saWJ4ZnMvaXJpeC5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL2xpYnhmcy9pcml4LmMJMjAwNy0w NC0xMiAxNDo1NTo1My4wMDAwMDAwMDAgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9n cy9saWJ4ZnMvaXJpeC5jCTIwMDctMDUtMzAgMTM6NDg6MzQuMTQwNjA3OTk2ICsx MDAwCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHhmcy9saWJ4 ZnMuaD4KLSNpbmNsdWRlIDxhaW8uaD4KICNpbmNsdWRlIDxkaXNraW5mby5oPgog I2luY2x1ZGUgPHN5cy9zeXNtcC5oPgogCkBAIC02OCwxOSArNjcsNiBAQAogCSpi c3ogPSBCQlNJWkU7CiB9CiAKLWludAotcGxhdGZvcm1fYWlvX2luaXQoaW50IGFp b19jb3VudCkKLXsKLQlzdHJ1Y3QgYWlvaW5pdCBhaW9faW5pdDsKLQotCW1lbXNl dCgmYWlvX2luaXQsIDAsIHNpemVvZihhaW9faW5pdCkpOwotCWFpb19pbml0LmFp b190aHJlYWRzID0gYWlvX2NvdW50OwotCWFpb19pbml0LmFpb19udW11c2VycyA9 IGFpb19jb3VudDsKLQotCWFpb19zZ2lfaW5pdDY0KCZhaW9faW5pdCk7Ci0JcmV0 dXJuICgxKTsJCS8qIGFpby9saW9fbGlzdGlvIGF2YWlsYWJsZSAqLwotfQotCiBj aGFyICoKIHBsYXRmb3JtX2ZpbmRyYXdwYXRoKGNoYXIgKnBhdGgpCiB7CkBAIC0x MTEsMyArOTcsMTUgQEAKIAlyZXR1cm4gc3lzbXAoTVBfTlBST0NTKTsKIH0KIAor dW5zaWduZWQgbG9uZworcGxhdGZvcm1fcGh5c21lbSh2b2lkKQoreworCXN0cnVj dCBybWluZm8gcmk7CisKKwlpZiAoc3lzbXAoTVBfU0FHRVQsIE1QU0FfUk1JTkZP LCAmcmksIHNpemVvZihyaSkpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsIF8oIiVz OiBjYW4ndCBkZXRlcm1pbmUgbWVtb3J5IHNpemVcbiIpLAorCQkJcHJvZ25hbWUp OworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gKHJpLnBoeXNtZW0gPj4gMTApICog Z2V0cGFnZXNpemUoKTsJLyoga2lsb2J5dGVzICovCit9ClwgTm8gbmV3bGluZSBh dCBlbmQgb2YgZmlsZQpJbmRleDogcmVwYWlyL3hmc3Byb2dzL2xpYnhmcy9saW51 eC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dz L2xpYnhmcy9saW51eC5jCTIwMDctMDQtMTIgMTQ6NTU6NTMuMDAwMDAwMDAwICsx MDAwCisrKyByZXBhaXIveGZzcHJvZ3MvbGlieGZzL2xpbnV4LmMJMjAwNy0wNS0z MCAxMzo0NzozNC41ODQzMjQ4OTQgKzEwMDAKQEAgLTIwLDExICsyMCwxMSBAQAog I2luY2x1ZGUgPHhmcy9saWJ4ZnMuaD4KICNpbmNsdWRlIDxtbnRlbnQuaD4KICNp bmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGFpby5oPgogI3VuZGVmIHVz dGF0CiAjaW5jbHVkZSA8c3lzL3VzdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL21vdW50 Lmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N5c2lu Zm8uaD4KIAogaW50IHBsYXRmb3JtX2hhc191dWlkID0gMTsKIGV4dGVybiBjaGFy ICpwcm9nbmFtZTsKQEAgLTE3NCwxOSArMTc0LDYgQEAKIAkJbWF4X2Jsb2NrX2Fs aWdubWVudCA9ICpic3o7CiB9CiAKLWludAotcGxhdGZvcm1fYWlvX2luaXQoaW50 IGFpb19jb3VudCkKLXsKLQlzdHJ1Y3QgYWlvaW5pdCBsY2xfYWlvX2luaXQ7Ci0K LQltZW1zZXQoJmxjbF9haW9faW5pdCwgMCwgc2l6ZW9mKGxjbF9haW9faW5pdCkp OwotCWxjbF9haW9faW5pdC5haW9fdGhyZWFkcyA9IGFpb19jb3VudDsKLQlsY2xf YWlvX2luaXQuYWlvX251bXVzZXJzID0gYWlvX2NvdW50OwotCi0JYWlvX2luaXQo JmxjbF9haW9faW5pdCk7Ci0JcmV0dXJuICgxKTsJCS8qIGFpby9saW9fbGlzdGlv IGF2YWlsYWJsZSAqLwotfQotCiBjaGFyICoKIHBsYXRmb3JtX2ZpbmRyYXdwYXRo KGNoYXIgKnBhdGgpCiB7CkBAIC0yMTgsMyArMjA1LDE2IEBACiB7CiAJcmV0dXJu IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOwogfQorCit1bnNpZ25lZCBs b25nCitwbGF0Zm9ybV9waHlzbWVtKHZvaWQpCit7CisJc3RydWN0IHN5c2luZm8g IHNpOworCisJaWYgKHN5c2luZm8oJnNpKSA8IDApIHsKKwkJZnByaW50ZihzdGRl cnIsIF8oIiVzOiBjYW4ndCBkZXRlcm1pbmUgbWVtb3J5IHNpemVcbiIpLAorCQkJ cHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gKHNpLnRvdGFscmFt ID4+IDEwKSAqIHNpLm1lbV91bml0OwkvKiBraWxvYnl0ZXMgKi8KK30KSW5kZXg6 IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGlyX3N0YWNrLmgKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3MvcmVwYWlyL2Rpcl9zdGFj ay5oCTIwMDctMDQtMTIgMTQ6NTU6NTcuMDAwMDAwMDAwICsxMDAwCisrKyAvZGV2 L251bGwJMTk3MC0wMS0wMSAwMDowMDowMC4wMDAwMDAwMDAgKzAwMDAKQEAgLTEs MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxLDIwMDUg U2lsaWNvbiBHcmFwaGljcywgSW5jLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4K LSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICog VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d291bGQgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGgg dGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sCi0gKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi10eXBlZGVmIHN0 cnVjdCBkaXJfc3RhY2tfZWxlbSAgewotCXhmc19pbm9fdAkJaW5vOwotCXN0cnVj dCBkaXJfc3RhY2tfZWxlbQkqbmV4dDsKLX0gZGlyX3N0YWNrX2VsZW1fdDsKLQot dHlwZWRlZiBzdHJ1Y3QgZGlyX3N0YWNrICB7Ci0JaW50CQkJY250OwotCWRpcl9z dGFja19lbGVtX3QJKmhlYWQ7Ci19IGRpcl9zdGFja190OwotCi0KLXZvaWQJCWRp cl9zdGFja19pbml0KGRpcl9zdGFja190ICpzdGFjayk7Ci0KLXZvaWQJCXB1c2hf ZGlyKGRpcl9zdGFja190ICpzdGFjaywgeGZzX2lub190IGlubyk7Ci14ZnNfaW5v X3QJcG9wX2RpcihkaXJfc3RhY2tfdCAqc3RhY2spOwo= ------------IrJlgiTfBCmIeXv1iG6QRc--