From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jon Smirl" Subject: Re: Digging through old vendor code Date: Sun, 13 Jan 2008 12:31:35 -0500 Message-ID: <9e4733910801130931y39a29ea2lf6bb3ebd216ed0ba@mail.gmail.com> References: <20080113162806.13991.qmail@science.horizon.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_4902_2806369.1200245495398" Cc: git@vger.kernel.org, torvalds@linux-foundation.org To: "linux@horizon.com" X-From: git-owner@vger.kernel.org Sun Jan 13 18:32:14 2008 Return-path: Envelope-to: gcvg-git-2@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by lo.gmane.org with esmtp (Exim 4.50) id 1JE6gt-0004Ip-M1 for gcvg-git-2@gmane.org; Sun, 13 Jan 2008 18:32:12 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753022AbYAMRbj (ORCPT ); Sun, 13 Jan 2008 12:31:39 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752767AbYAMRbj (ORCPT ); Sun, 13 Jan 2008 12:31:39 -0500 Received: from rv-out-0910.google.com ([209.85.198.185]:38816 "EHLO rv-out-0910.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752568AbYAMRbh (ORCPT ); Sun, 13 Jan 2008 12:31:37 -0500 Received: by rv-out-0910.google.com with SMTP id k20so1514388rvb.1 for ; Sun, 13 Jan 2008 09:31:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; bh=hZ+aaudafAwDVBG68S1+jaickrElOD05A1NdjTSaYEY=; b=vdvmfjmkx2gDzNL48CebQjqnNh3NgaEVLCE4P4hoDPtDAU9BDXHPsIc8dFb7tMBv4FDl/wnAtRfJYhvYAcq3yKZvY3FCmzXZwB121Hup1WlC+aBiKOYHxKE9H6HsG5fDp/WMXtSLCeyDyyBpXLBH5tGoPIyFhv5Oqx2bW/eILew= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=x9FHIXGbJenFuwkSh41fIKYZoD6CGQYcLopjuK03izJU0IYER7RVPA5Y5gFwSrCgYXFwfUhcAbigKdxLLL3/jcWpcJXiA1xWahJo4q7eBQNlpoqFOK3X81kl382eppESYkh3vpn6G9gyxi/9QUZfmLVAVzUmC0s+iYcry5aUTiM= Received: by 10.141.99.4 with SMTP id b4mr3260253rvm.217.1200245495400; Sun, 13 Jan 2008 09:31:35 -0800 (PST) Received: by 10.140.166.14 with HTTP; Sun, 13 Jan 2008 09:31:35 -0800 (PST) In-Reply-To: <20080113162806.13991.qmail@science.horizon.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_4902_2806369.1200245495398 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On 13 Jan 2008 11:28:06 -0500, linux@horizon.com wrote: > > Heh. Maybe you could just use the rename logic? > > > > [How-to snipped] > > Clever idea, but I think the real problem was to figure out what VERSION > of the file was the base; i.e. to look through history. > > Still, it should be possible to adapt the technique... > > #!/bin/sh > > # List of files we are looking to copy from > SRC="drivers/serial/" > # Temporary work directory > DST=/tmp/work > git-clone -l -n -s . $DST > { cd $DST; git-symbolic-ref HEAD refs/heads/DELETEME; } > for i in `git-rev-list v2.6.20..v2.6.24-rc6 -- $SRC`; do > j=`git-describe $i` > git-archive --prefix="$j/" $i -- $SRC | tar xf - -C $DST > # This is abusing the index, but it saves space... > { cd $DST; git add $j; rm -rf $j; } > done > > # And now proceed as per Linus's idea... > # Except we have it all in the index; no need > # to actually make a commit... > > cd $DST > cp $target_file $DST > { cd $DST; git-diff-files -M...; } I tried this using -M1%, it returned 53,575 files. Same thing for 10%. The files don't seem to be in order by similarity, the first match returned is not a good one. I attached the file if anyone wants to play with it. I'm 90% certain it was copied from amba-pl010.c in 2.6.15. > > > Maybe a real git wizard will show me how to insert the index entries > directly without ever doing anything as pedestrian as extracting, hashing, > and then deleting the files, but it's still not that bad. > > And it's kind of a neat example of using the index as a staging area > for a commit. > > (Exercise for the reader: the above gets a complete copy of every file in > the directory for every commit in qhich ANY file in the directory changed. > Better would be to do the git-rev-list per-file, so you only add unique > file versions. This requires an outer loop over file names and a more > careful pathname specification to git add in the inner loop.) > -- Jon Smirl jonsmirl@gmail.com ------=_Part_4902_2806369.1200245495398 Content-Type: text/x-csrc; name=ep93xx_uart.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_fbdv3zyf Content-Disposition: attachment; filename=ep93xx_uart.c LyoKICogIGxpbnV4L2RyaXZlcnMvc2VyaWFsL2NzOTN4eC5jCiAqCiAqICBEcml2ZXIgZm9yIEVQ OTN4eCBzZXJpYWwgcG9ydHMKICoKICogIEJhc2VkIG9uIGRyaXZlcnMvY2hhci9zZXJpYWwuYywg YnkgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFRzJ28sCiAqICBEZWVwIEJsdWUgU29sdXRpb25z IEx0ZC4KICoKICogIENvcHlyaWdodCAxOTk5IEFSTSBMaW1pdGVkCiAqICBDb3B5cmlnaHQgKEMp IDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCiAqICBDb3B5cmlnaHQgKGMpIDIwMDMgQ2ly cnVzIExvZ2ljLCBJbmMuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us IG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAog KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3Qs IHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBs ZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogICRJ ZDogbGludXgtMi42LjIxLjUtZXA5eC5wYXRjaCx2IDEuOCAyMDA4LzAxLzA0IDEzOjI4OjA3IGJh dXN0aW4gRXhwICQKICoKICogVGhlIEVQOTN4eCBzZXJpYWwgcG9ydHMgYXJlIEFNQkEsIGJ1dCBh dCBkaWZmZXJlbnQgYWRkcmVzc2VzIGZyb20gdGhlCiAqIGludGVncmF0b3IuCiAqIFRoaXMgaXMg YSBnZW5lcmljIGRyaXZlciBmb3IgQVJNIEFNQkEtdHlwZSBzZXJpYWwgcG9ydHMuICBUaGV5CiAq IGhhdmUgYSBsb3Qgb2YgMTY1NTAtbGlrZSBmZWF0dXJlcywgYnV0IGFyZSBub3QgcmVnaXN0ZXIg Y29tcGF0YWJsZS4KICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoZXkgZG8gaGF2ZSBDVFMsIERDRCBh bmQgRFNSIGlucHV0cywgdGhleSBkbwogKiBub3QgaGF2ZSBhbiBSSSBpbnB1dCwgbm9yIGRvIHRo ZXkgaGF2ZSBEVFIgb3IgUlRTIG91dHB1dHMuICBJZgogKiByZXF1aXJlZCwgdGhlc2UgaGF2ZSB0 byBiZSBzdXBwbGllZCB2aWEgc29tZSBvdGhlciBtZWFucyAoZWcsIEdQSU8pCiAqIGFuZCBob29r ZWQgaW50byB0aGlzIGRyaXZlci4KICovCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1 ZGUgPGxpbnV4L3R0eS5oPgojaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KI2luY2x1ZGUgPGxp bnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2Vy aWFsLmg+CiNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiNpbmNsdWRlIDxsaW51eC9zeXNycS5o PgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLy8jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+ CiNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KCiNpbmNsdWRlIDxhc20vaGFyZHdh cmUuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgovLyNpbmNsdWRlIDxhc20vaXJxcy5oPgoKI2lmIGRl ZmluZWQoQ09ORklHX1NFUklBTF9FUDkzWFhfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFH SUNfU1lTUlEpCiNkZWZpbmUgU1VQUE9SVF9TWVNSUQojZW5kaWYKCgojaW5jbHVkZSA8bGludXgv c2VyaWFsX2NvcmUuaD4KI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiNpbmNsdWRlIDxsaW51 eC9hbWJhL3NlcmlhbC5oPgoKCgojaWYgZGVmaW5lZChDT05GSUdfQVJDSF9FUDkzMDEpIHx8IGRl ZmluZWQoQ09ORklHX0FSQ0hfRVA5MzAyKQojaWZkZWYgQ09ORklHX0VQOTNYWF9JUkRBCiNkZWZp bmUgVUFSVF9OUgkJMQojZWxzZQojZGVmaW5lIFVBUlRfTlIJCTIKI2VuZGlmCiNlbHNlCiNpZmRl ZiBDT05GSUdfRVA5M1hYX0lSREEKI2RlZmluZSBVQVJUX05SCQkyCiNlbHNlCiNkZWZpbmUgVUFS VF9OUgkJMwojZW5kaWYKI2VuZGlmCgojZGVmaW5lIFNFUklBTF9FUDkzWFhfTUFKT1IJMjA0CiNk ZWZpbmUgU0VSSUFMX0VQOTNYWF9NSU5PUgkxNgojZGVmaW5lIFNFUklBTF9FUDkzWFhfTlIJVUFS VF9OUgoKI2RlZmluZSBFUDkzWFhfSVNSX1BBU1NfTElNSVQJMjU2CgovKgogKiBBY2Nlc3MgbWFj cm9zIGZvciB0aGUgQU1CQSBVQVJUcwogKi8KI2RlZmluZSBVQVJUX0dFVF9JTlRfU1RBVFVTKHAp CSgocmVhZGwoKHApLT5tZW1iYXNlICsgVUFSVElJUikpICYgMHhmZikKI2RlZmluZSBVQVJUX1BV VF9JQ1IocCwgYykJd3JpdGVsKChjKSwgKHApLT5tZW1iYXNlICsgVUFSVElDUikKI2RlZmluZSBV QVJUX0dFVF9GUihwKQkJKChyZWFkbCgocCktPm1lbWJhc2UgKyBVQVJURlIpKSAmIDB4ZmYpCiNk ZWZpbmUgVUFSVF9HRVRfQ0hBUihwKQkoKHJlYWRsKChwKS0+bWVtYmFzZSArIFVBUlREUikpICYg MHhmZikKI2RlZmluZSBVQVJUX1BVVF9DSEFSKHAsIGMpCXdyaXRlbCgoYyksIChwKS0+bWVtYmFz ZSArIFVBUlREUikKI2RlZmluZSBVQVJUX0dFVF9SU1IocCkJCSgocmVhZGwoKHApLT5tZW1iYXNl ICsgVUFSVFJTUikpICYgMHhmZikKI2RlZmluZSBVQVJUX1BVVF9SU1IocCwgYykJd3JpdGVsKChj KSwgKHApLT5tZW1iYXNlICsgVUFSVFJTUikKI2RlZmluZSBVQVJUX0dFVF9DUihwKQkJKChyZWFk bCgocCktPm1lbWJhc2UgKyBVQVJUQ1IpKSAmIDB4ZmYpCiNkZWZpbmUgVUFSVF9QVVRfQ1IocCxj KQl3cml0ZWwoKGMpLCAocCktPm1lbWJhc2UgKyBVQVJUQ1IpCiNkZWZpbmUgVUFSVF9HRVRfTENS TChwKQkoKHJlYWRsKChwKS0+bWVtYmFzZSArIFVBUlRDUl9MKSkgJiAweGZmKQojZGVmaW5lIFVB UlRfUFVUX0xDUkwocCxjKQl3cml0ZWwoKGMpLCAocCktPm1lbWJhc2UgKyBVQVJUQ1JfTCkKI2Rl ZmluZSBVQVJUX0dFVF9MQ1JNKHApCSgocmVhZGwoKHApLT5tZW1iYXNlICsgVUFSVENSX00pKSAm IDB4ZmYpCiNkZWZpbmUgVUFSVF9QVVRfTENSTShwLGMpCXdyaXRlbCgoYyksIChwKS0+bWVtYmFz ZSArIFVBUlRDUl9NKQojZGVmaW5lIFVBUlRfR0VUX0xDUkgocCkJKChyZWFkbCgocCktPm1lbWJh c2UgKyBVQVJUQ1JfSCkpICYgMHhmZikKI2RlZmluZSBVQVJUX1BVVF9MQ1JIKHAsYykJd3JpdGVs KChjKSwgKHApLT5tZW1iYXNlICsgVUFSVENSX0gpCiNkZWZpbmUgVUFSVF9SWF9EQVRBKHMpCQko KChzKSAmIFVBUlRGUl9SWEZFKSA9PSAwKQojZGVmaW5lIFVBUlRfVFhfUkVBRFkocykJKCgocykg JiBVQVJURlJfVFhGRikgPT0gMCkKI2RlZmluZSBVQVJUX1RYX0VNUFRZKHApCSgoVUFSVF9HRVRf RlIocCkgJiBVQVJURlJfVE1TSykgPT0gMCkKCiNkZWZpbmUgVUFSVF9HRVRfTUNSKHApCQlyZWFk bCgocCktPm1lbWJhc2UgKyBVQVJUTUNSKQojZGVmaW5lIFVBUlRfUFVUX01DUihjLCBwKQl3cml0 ZWwoKGMpLCAocCktPm1lbWJhc2UgKyBVQVJUTUNSKQojZGVmaW5lIFVBUlRfQ0xFQVJfRUNSKHAp CXdyaXRlbCggMCwgKHApLT5tZW1iYXNlICsgVUFSVEVDUikKCiNkZWZpbmUgVUFSVF9EVU1NWV9S U1JfUlgJMjU2CiNkZWZpbmUgVUFSVF9QT1JUX1NJWkUJCTY1NTM2CgovKgogKiBXZSB3cmFwIG91 ciBwb3J0IHN0cnVjdHVyZSBhcm91bmQgdGhlIGdlbmVyaWMgdWFydF9wb3J0LgogKi8Kc3RydWN0 IHVhcnRfZXA5M3h4X3BvcnQgewoJc3RydWN0IHVhcnRfcG9ydAlwb3J0OwoJdW5zaWduZWQgaW50 CQlvbGRfc3RhdHVzOwp9OwoKCnN0YXRpYyB2b2lkCmVwOTN4eHVhcnRfZW5hYmxlX2Nsb2Nrcyhz dHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgl1bnNpZ25lZCBpbnQgdWlTeXNEZXZDZmc7CgoJLyoK CSAqIEVuYWJsZSB0aGUgY2xvY2tzIHRvIHRoaXMgVUFSVCBpbiBDU0Nfc3lzY29uCgkgKiAtIFJl YWQgREVWQ0ZHCgkgKiAtIE9SIGluIHRoZSBjb3JyZWN0IHVhcnQgZW5hYmxlIGJpdAoJICogLSBT ZXQgdGhlIGxvY2sgcmVnaXN0ZXIKCSAqIC0gV3JpdGUgYmFjayB0byBERVZDRkcKCSAqLwoJdWlT eXNEZXZDZmcgPSBpbmwoU1lTQ09OX0RFVkNGRyk7CgoJc3dpdGNoICgodW5zaWduZWQgbG9uZylw b3J0LT5tZW1iYXNlKSB7CgljYXNlIFVBUlQxX0JBU0U6CgkJdWlTeXNEZXZDZmcgfD0gU1lTQ09O X0RFVkNGR19VMUVOOwoJCWJyZWFrOwoKCWNhc2UgVUFSVDJfQkFTRToKCQl1aVN5c0RldkNmZyB8 PSBTWVNDT05fREVWQ0ZHX1UyRU47CgkJYnJlYWs7CgoJY2FzZSBVQVJUM19CQVNFOgoJCXVpU3lz RGV2Q2ZnIHw9IFNZU0NPTl9ERVZDRkdfVTNFTjsKCQlicmVhazsKCX0KCglTeXNjb25TZXRMb2Nr ZWQoIFNZU0NPTl9ERVZDRkcsIHVpU3lzRGV2Q2ZnICk7Cn0KCnN0YXRpYyB2b2lkCmVwOTN4eHVh cnRfZGlzYWJsZV9jbG9ja3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJdW5zaWduZWQgaW50 IHVpU3lzRGV2Q2ZnOwoKCS8qCgkgKiBEaXNhYmxlIHRoZSBjbG9ja3MgdG8gdGhpcyBVQVJUIGlu IENTQ19zeXNjb24KCSAqIC0gUmVhZCBERVZDRkcKCSAqIC0gQU5EIHRvIGNsZWFyIHRoZSBjb3Jy ZWN0IHVhcnQgZW5hYmxlIGJpdAoJICogLSBTZXQgdGhlIGxvY2sgcmVnaXN0ZXIKCSAqIC0gV3Jp dGUgYmFjayB0byBERVZDRkcKCSAqLwoJdWlTeXNEZXZDZmcgPSBpbmwoU1lTQ09OX0RFVkNGRyk7 CgoJc3dpdGNoICgodW5zaWduZWQgbG9uZylwb3J0LT5tZW1iYXNlKSB7CgljYXNlIFVBUlQxX0JB U0U6CgkJdWlTeXNEZXZDZmcgJj0gfigodW5zaWduZWQgaW50KVNZU0NPTl9ERVZDRkdfVTFFTik7 CgkJYnJlYWs7CgoJY2FzZSBVQVJUMl9CQVNFOgoJCXVpU3lzRGV2Q2ZnICY9IH4oKHVuc2lnbmVk IGludClTWVNDT05fREVWQ0ZHX1UyRU4pOwoJCWJyZWFrOwoKCWNhc2UgVUFSVDNfQkFTRToKCQl1 aVN5c0RldkNmZyAmPSB+KCh1bnNpZ25lZCBpbnQpU1lTQ09OX0RFVkNGR19VM0VOKTsKCQlicmVh azsKCX0KCglTeXNjb25TZXRMb2NrZWQoIFNZU0NPTl9ERVZDRkcsIHVpU3lzRGV2Q2ZnICk7Cn0K CiNpZiAxCnN0YXRpYyBpbnQKZXA5M3h4dWFydF9pc19wb3J0X2VuYWJsZWQoc3RydWN0IHVhcnRf cG9ydCAqcG9ydCkKewoJdW5zaWduZWQgaW50IHVpU3lzRGV2Q2ZnOwoKCXVpU3lzRGV2Q2ZnID0g aW5sKFNZU0NPTl9ERVZDRkcpOwoKCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpcG9ydC0+bWVtYmFz ZSkgewoJY2FzZSBVQVJUMV9CQVNFOgoJCXVpU3lzRGV2Q2ZnICY9ICh1bnNpZ25lZCBpbnQpU1lT Q09OX0RFVkNGR19VMUVOOwoJCWJyZWFrOwoKCWNhc2UgVUFSVDJfQkFTRToKCQl1aVN5c0RldkNm ZyAmPSAodW5zaWduZWQgaW50KVNZU0NPTl9ERVZDRkdfVTJFTjsKCQlicmVhazsKCgljYXNlIFVB UlQzX0JBU0U6CgkJdWlTeXNEZXZDZmcgJj0gKHVuc2lnbmVkIGludClTWVNDT05fREVWQ0ZHX1Uz RU47CgkJYnJlYWs7Cgl9CgoJcmV0dXJuKCB1aVN5c0RldkNmZyAhPSAwICk7Cn0KI2VuZGlmCgpz dGF0aWMgdm9pZAplcDkzeHh1YXJ0X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJ dW5zaWduZWQgaW50IGNyOwoKCWNyID0gVUFSVF9HRVRfQ1IocG9ydCk7CgljciAmPSB+VUFSVENS X1RJRTsKCVVBUlRfUFVUX0NSKHBvcnQsIGNyKTsKfQoKc3RhdGljIHZvaWQKZXA5M3h4dWFydF9z dGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgl1bnNpZ25lZCBpbnQgY3I7CgoJY3Ig PSBVQVJUX0dFVF9DUihwb3J0KTsKCWNyIHw9IFVBUlRDUl9USUU7CglVQVJUX1BVVF9DUihwb3J0 LCBjcik7Cn0KCnN0YXRpYyB2b2lkCmVwOTN4eHVhcnRfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0 ICpwb3J0KQp7Cgl1bnNpZ25lZCBpbnQgY3I7CgoJY3IgPSBVQVJUX0dFVF9DUihwb3J0KTsKCWNy ICY9IH4oVUFSVENSX1JJRSB8IFVBUlRDUl9SVElFKTsKCVVBUlRfUFVUX0NSKHBvcnQsIGNyKTsK fQoKc3RhdGljIHZvaWQKZXA5M3h4dWFydF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9y dCkKewoJdW5zaWduZWQgaW50IGNyOwoKCWNyID0gVUFSVF9HRVRfQ1IocG9ydCk7CgljciB8PSBV QVJUQ1JfTVNJRTsKCVVBUlRfUFVUX0NSKHBvcnQsIGNyKTsKfQoKc3RhdGljIHZvaWQKI2lmZGVm IFNVUFBPUlRfU1lTUlEKZXA5M3h4dWFydF9yeF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0 LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKI2Vsc2UKZXA5M3h4dWFydF9yeF9jaGFycyhzdHJ1Y3Qg dWFydF9wb3J0ICpwb3J0KQojZW5kaWYKewoJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQt PmluZm8tPnR0eTsKCXVuc2lnbmVkIGludCBzdGF0dXMsIGNoLCBmbGFnLCByc3IsIG1heF9jb3Vu dCA9IDI1NjsKCmlmKCgodW5zaWduZWQgbG9uZylwb3J0LT5tZW1iYXNlKT09VUFSVDJfQkFTRSkK ewpwcmludGsoImVwOTMgVUFSVDIgZXA5M3h4dWFydF9yeF9jaGFyc1xuIik7Cn0KCglmbGFnID0g MDsKCXN0YXR1cyA9IFVBUlRfR0VUX0ZSKHBvcnQpOwoJd2hpbGUgKFVBUlRfUlhfREFUQShzdGF0 dXMpICYmIG1heF9jb3VudC0tKSB7CgkJLy9pZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQ QlVGX1NJWkUpIHsKCQkvLwl0dHktPmZsaXAud29yay5mdW5jKCh2b2lkICopdHR5KTsKCQkvLwlp ZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkvLwkJcHJpbnRrKEtF Uk5fV0FSTklORyAiVFRZX0RPTlRfRkxJUCBzZXRcbiIpOwoJCS8vCQlyZXR1cm47CgkJLy8JfQoJ CS8vfQoJCQoJCWNoID0gVUFSVF9HRVRfQ0hBUihwb3J0KTsKCgkJLy8qdHR5LT5mbGlwLmNoYXJf YnVmX3B0ciA9IGNoOwoJCS8vKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfTk9STUFMOwoJ CXBvcnQtPmljb3VudC5yeCsrOwoKCQkvKgoJCSAqIE5vdGUgdGhhdCB0aGUgZXJyb3IgaGFuZGxp bmcgY29kZSBpcwoJCSAqIG91dCBvZiB0aGUgbWFpbiBleGVjdXRpb24gcGF0aAoJCSAqLwoJCXJz ciA9IFVBUlRfR0VUX1JTUihwb3J0KSB8IFVBUlRfRFVNTVlfUlNSX1JYOwoJCVVBUlRfUFVUX1JT Uihwb3J0LCAwKTsKCQlpZiAocnNyICYgVUFSVFJTUl9BTlkpIHsKCQkJaWYgKHJzciAmIFVBUlRS U1JfQkUpIHsKCQkJCXJzciAmPSB+KFVBUlRSU1JfRkUgfCBVQVJUUlNSX1BFKTsKCQkJCXBvcnQt Pmljb3VudC5icmsrKzsKCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayhwb3J0KSkKCQkJCQlnb3Rv IGlnbm9yZV9jaGFyOwoJCQl9IGVsc2UgaWYgKHJzciAmIFVBUlRSU1JfUEUpCgkJCQlwb3J0LT5p Y291bnQucGFyaXR5Kys7CgkJCWVsc2UgaWYgKHJzciAmIFVBUlRSU1JfRkUpCgkJCQlwb3J0LT5p Y291bnQuZnJhbWUrKzsKCQkJaWYgKHJzciAmIFVBUlRSU1JfT0UpCgkJCQlwb3J0LT5pY291bnQu b3ZlcnJ1bisrOwoKCQkJcnNyICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CgoJCQlpZiAocnNy ICYgVUFSVFJTUl9CRSkKCQkJCS8vKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSBUVFlfQlJFQUs7 CgkJCQlmbGFnID0gVFRZX0JSRUFLOwoJCQllbHNlIGlmIChyc3IgJiBVQVJUUlNSX1BFKQoJCQkJ Ly8qdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IFRUWV9QQVJJVFk7CgkJCQlmbGFnID0gVFRZX1BB UklUWTsKCQkJZWxzZSBpZiAocnNyICYgVUFSVFJTUl9GRSkKCQkJCS8vKnR0eS0+ZmxpcC5mbGFn X2J1Zl9wdHIgPSBUVFlfRlJBTUU7CgkJCQlmbGFnID0gVFRZX0ZSQU1FOwoJCX0KCgkJaWYgKHVh cnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gpKQoJCQlnb3RvIGlnbm9yZV9jaGFyOwoKCQkv L2lmICgocnNyICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrKSA9PSAwKSB7CgkJLy8JdHR5LT5m bGlwLmZsYWdfYnVmX3B0cisrOwoJCS8vCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrKzsKCQkvLwl0 dHktPmZsaXAuY291bnQrKzsKCQkvL30KCQkvL2lmICgocnNyICYgVUFSVFJTUl9PRSkgJiYKCQkv LyAgIHR0eS0+ZmxpcC5jb3VudCA8IFRUWV9GTElQQlVGX1NJWkUpIHsKCQkJLyoKCQkJICogT3Zl cnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkCgkJCSAqIGltbWVkaWF0ZWx5LCBh bmQgZG9lc24ndCBhZmZlY3QgdGhlIGN1cnJlbnQKCQkJICogY2hhcmFjdGVyCgkJCSAqLwoJCS8v CSp0dHktPmZsaXAuY2hhcl9idWZfcHRyKysgPSAwOwoJCS8vCSp0dHktPmZsaXAuZmxhZ19idWZf cHRyKysgPSBUVFlfT1ZFUlJVTjsKCQkvLwl0dHktPmZsaXAuY291bnQrKzsKCQkvL30KCgkJdWFy dF9pbnNlcnRfY2hhcihwb3J0LCByc3IsIFVBUlQwMXhfUlNSX09FLCBjaCwgZmxhZyk7CgoJaWdu b3JlX2NoYXI6CgkJc3RhdHVzID0gVUFSVF9HRVRfRlIocG9ydCk7Cgl9Cgl0dHlfZmxpcF9idWZm ZXJfcHVzaCh0dHkpOwoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAplcDkzeHh1YXJ0X3R4X2NoYXJz KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCnsKCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0 LT5pbmZvLT54bWl0OwoJaW50IGNvdW50OwoKCWlmIChwb3J0LT54X2NoYXIpIHsKCQlVQVJUX1BV VF9DSEFSKHBvcnQsIHBvcnQtPnhfY2hhcik7CgkJcG9ydC0+aWNvdW50LnR4Kys7CgkJcG9ydC0+ eF9jaGFyID0gMDsKCQlyZXR1cm47Cgl9CglpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVh cnRfdHhfc3RvcHBlZChwb3J0KSkgewoJCWVwOTN4eHVhcnRfc3RvcF90eChwb3J0KTsKCQlyZXR1 cm47Cgl9CgoJY291bnQgPSBwb3J0LT5maWZvc2l6ZSA+PiAxOwoJZG8gewoJCVVBUlRfUFVUX0NI QVIocG9ydCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKCQl4bWl0LT50YWlsID0gKHhtaXQtPnRh aWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwoJCXBvcnQtPmljb3VudC50eCsrOwoJCWlm ICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCgkJCWJyZWFrOwoJfSB3aGlsZSAoLS1jb3VudCA+IDAp OwoKCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKCQl1 YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKCglpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQoJCWVw OTN4eHVhcnRfc3RvcF90eChwb3J0KTsKfQoKc3RhdGljIHZvaWQKZXA5M3h4dWFydF9tb2RlbV9z dGF0dXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJc3RydWN0IHVhcnRfZXA5M3h4X3BvcnQg KnVhcCA9IChzdHJ1Y3QgdWFydF9lcDkzeHhfcG9ydCAqKXBvcnQ7Cgl1bnNpZ25lZCBpbnQgc3Rh dHVzLCBkZWx0YTsKCglVQVJUX1BVVF9JQ1IocG9ydCwgMCk7CgoJc3RhdHVzID0gVUFSVF9HRVRf RlIocG9ydCkgJiBVQVJURlJfTU9ERU1fQU5ZOwoKCWRlbHRhID0gc3RhdHVzIF4gdWFwLT5vbGRf c3RhdHVzOwoJdWFwLT5vbGRfc3RhdHVzID0gc3RhdHVzOwoKCWlmICghZGVsdGEpCgkJcmV0dXJu OwoKCWlmIChkZWx0YSAmIFVBUlRGUl9EQ0QpCgkJdWFydF9oYW5kbGVfZGNkX2NoYW5nZShwb3J0 LCBzdGF0dXMgJiBVQVJURlJfRENEKTsKCglpZiAoZGVsdGEgJiBVQVJURlJfRFNSKQoJCXBvcnQt Pmljb3VudC5kc3IrKzsKCglpZiAoZGVsdGEgJiBVQVJURlJfQ1RTKQoJCXVhcnRfaGFuZGxlX2N0 c19jaGFuZ2UocG9ydCwgc3RhdHVzICYgVUFSVEZSX0NUUyk7CgoJd2FrZV91cF9pbnRlcnJ1cHRp YmxlKCZwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdApl cDkzeHh1YXJ0X2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCXN0cnVjdCB1YXJ0X3BvcnQg KnBvcnQgPSBkZXZfaWQ7Cgl1bnNpZ25lZCBpbnQgc3RhdHVzLCBwYXNzX2NvdW50ZXIgPSBFUDkz WFhfSVNSX1BBU1NfTElNSVQ7CgoKaWYoKCh1bnNpZ25lZCBsb25nKXBvcnQtPm1lbWJhc2UpPT1V QVJUMl9CQVNFKQp7CnByaW50aygiZXA5MyBVQVJUMiBlcDkzeHh1YXJ0X2ludFxuIik7Cn0KCgoJ c3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKCglzdGF0dXMgPSBVQVJUX0dFVF9JTlRfU1RBVFVTKHBv cnQpOwppZigoKHVuc2lnbmVkIGxvbmcpcG9ydC0+bWVtYmFzZSk9PVVBUlQyX0JBU0UpCnsKcHJp bnRrKCJzdGF0dXM9JXhcbiIsc3RhdHVzKTsKfQoJZG8gewoJCWlmIChzdGF0dXMgJiAoVUFSVElJ Ul9SVElTIHwgVUFSVElJUl9SSVMpKQojaWZkZWYgU1VQUE9SVF9TWVNSUQoJCQllcDkzeHh1YXJ0 X3J4X2NoYXJzKHBvcnQsIHJlZ3MpOwojZWxzZQoJCQllcDkzeHh1YXJ0X3J4X2NoYXJzKHBvcnQp OwojZW5kaWYKCQlpZiAoc3RhdHVzICYgVUFSVElJUl9USVMpCgkJCWVwOTN4eHVhcnRfdHhfY2hh cnMocG9ydCk7CgkJaWYgKHN0YXR1cyAmIFVBUlRJSVJfTUlTKQoJCQllcDkzeHh1YXJ0X21vZGVt X3N0YXR1cyhwb3J0KTsKCgkJaWYgKHBhc3NfY291bnRlci0tID09IDApCgkJCWJyZWFrOwoKCQlz dGF0dXMgPSBVQVJUX0dFVF9JTlRfU1RBVFVTKHBvcnQpOwoJfSB3aGlsZSAoc3RhdHVzICYgKFVB UlRJSVJfUlRJUyB8IFVBUlRJSVJfUklTIHwgVUFSVElJUl9USVMpKTsKCglzcGluX3VubG9jaygm cG9ydC0+bG9jayk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50 CmVwOTN4eHVhcnRfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKewoJcmV0dXJuIFVB UlRfR0VUX0ZSKHBvcnQpICYgVUFSVEZSX0JVU1kgPyAwIDogVElPQ1NFUl9URU1UOwp9CgpzdGF0 aWMgdW5zaWduZWQgaW50CmVwOTN4eHVhcnRfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBv cnQpCnsKCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOwoJdW5zaWduZWQgaW50IHN0YXR1czsKCglz dGF0dXMgPSBVQVJUX0dFVF9GUihwb3J0KTsKCWlmIChzdGF0dXMgJiBVQVJURlJfRENEKQoJCXJl c3VsdCB8PSBUSU9DTV9DQVI7CglpZiAoc3RhdHVzICYgVUFSVEZSX0RTUikKCQlyZXN1bHQgfD0g VElPQ01fRFNSOwoJaWYgKHN0YXR1cyAmIFVBUlRGUl9DVFMpCgkJcmVzdWx0IHw9IFRJT0NNX0NU UzsKCglyZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgdm9pZAplcDkzeHh1YXJ0X3NldF9tY3RybChz dHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCnsKCXVuc2lnbmVkIGlu dCBjdHJsID0gMDsKCgljdHJsID0gVUFSVF9HRVRfTUNSKHBvcnQpOwoKI2RlZmluZSBCSVQ5Myh0 aW9jbWJpdCwgdWFydGJpdCkJCVwKCWlmIChtY3RybCAmIHRpb2NtYml0KQkJXAoJCWN0cmwgfD0g dWFydGJpdDsJXAoJZWxzZQkJCQlcCgkJY3RybCAmPSB+dWFydGJpdAoKCUJJVDkzKFRJT0NNX1JU UywgVUFSVE1DUl9SVFMpOwoJQklUOTMoVElPQ01fRFRSLCBVQVJUTUNSX0RUUik7CglCSVQ5MyhU SU9DTV9PVVQxLCBVQVJUTUNSX09VVDEpOwoJQklUOTMoVElPQ01fT1VUMiwgVUFSVE1DUl9PVVQy KTsKCUJJVDkzKFRJT0NNX0xPT1AsIFVBUlRNQ1JfTE9PUCk7CiN1bmRlZiBCSVQ5MwoKCVVBUlRf UFVUX01DUihjdHJsLCBwb3J0KTsKfQoKc3RhdGljIHZvaWQKZXA5M3h4dWFydF9icmVha19jdGwo c3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQp7Cgl1bnNpZ25lZCBsb25n IGZsYWdzOwoJdW5zaWduZWQgaW50IGxjcl9oOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5s b2NrLCBmbGFncyk7CglsY3JfaCA9IFVBUlRfR0VUX0xDUkgocG9ydCk7CglpZiAoYnJlYWtfc3Rh dGUgPT0gLTEpCgkJbGNyX2ggfD0gVUFSVExDUl9IX0JSSzsKCWVsc2UKCQlsY3JfaCAmPSB+VUFS VExDUl9IX0JSSzsKCVVBUlRfUFVUX0xDUkgocG9ydCwgbGNyX2gpOwoJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgaW50CmVwOTN4eHVhcnRfc3Rh cnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7CglzdHJ1Y3QgdWFydF9lcDkzeHhfcG9ydCAq dWFwID0gKHN0cnVjdCB1YXJ0X2VwOTN4eF9wb3J0ICopcG9ydDsKCWludCByZXR2YWwgPSAtRUlO VkFMOwoJY2hhciAqbmFtZSA9IDA7CgoJLyoKCSAqIEVuYWJsZSB0aGUgY2xvY2tzIGZvciB0aGlz IHBvcnQuCgkgKi8KCWVwOTN4eHVhcnRfZW5hYmxlX2Nsb2Nrcyhwb3J0KTsKCgkvKgoJICogR2V0 IHRoZSBuYW1lIG9mIHRoaXMgcG9ydCAodXNlZCBvbmx5IGZvciByZXNvdXJjZSBhbGxvY2F0aW9u cykuCgkgKi8KCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpcG9ydC0+bWVtYmFzZSkgewoJY2FzZSBV QVJUMV9CQVNFOgoJCW5hbWUgPSAidHR5QU0wIjsKCQlicmVhazsKCWNhc2UgVUFSVDJfQkFTRToK CQluYW1lID0gInR0eUFNMSI7CgkJYnJlYWs7CgljYXNlIFVBUlQzX0JBU0U6CgkJbmFtZSA9ICJ0 dHlBTTIiOwoJCWJyZWFrOwoJfQpwcmludGsoIkVQOTNYWCBVQVJULS0lcyBpcnE9JWRcbiIsbmFt ZSxwb3J0LT5pcnEpOwoJLyoKCSAqIEFsbG9jYXRlIHRoZSBJUlEKCSAqLwoJcmV0dmFsID0gcmVx dWVzdF9pcnEocG9ydC0+aXJxLCBlcDkzeHh1YXJ0X2ludCwgMCAsIG5hbWUsIHBvcnQpOwpwcmlu dGsoImlycSBpcyBvayAlZFxuIixyZXR2YWwpOwoJaWYgKHJldHZhbCkgewoJCWVwOTN4eHVhcnRf ZGlzYWJsZV9jbG9ja3MocG9ydCk7CgkJcmV0dXJuIHJldHZhbDsKCX0KCgkvKgoJICogQWxsb2Nh dGUgdGhlIG1lbW9yeSByZWdpb24uCgkgKi8KCWlmKHJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5t YXBiYXNlLCBVQVJUX1BPUlRfU0laRSwgbmFtZSkgPT0gTlVMTCkgewoJCXByaW50aygibWVtIHJl Z2lvbiBmYWlsXG4iKTsKCQlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwoJCWVwOTN4eHVhcnRf ZGlzYWJsZV9jbG9ja3MocG9ydCk7CgkJcmV0dXJuIDE7Cgl9CgoJLyoKCSAqIGluaXRpYWxpc2Ug dGhlIG9sZCBzdGF0dXMgb2YgdGhlIG1vZGVtIHNpZ25hbHMKCSAqLwoJdWFwLT5vbGRfc3RhdHVz ID0gVUFSVF9HRVRfRlIocG9ydCkgJiBVQVJURlJfTU9ERU1fQU5ZOwoKcHJpbnRrKCJvbGQgc3Rh dHVzICV4XG4iLHVhcC0+b2xkX3N0YXR1cyk7CgkvKgoJICogRmluYWxseSwgZW5hYmxlIGludGVy cnVwdHMKCSAqLwoJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CglVQVJUX1BVVF9DUihwb3J0 LCBVQVJUQ1JfVUFSVEVOIHwgVUFSVENSX1JJRSB8IFVBUlRDUl9SVElFfDB4Mik7CglzcGluX3Vu bG9ja19pcnEoJnBvcnQtPmxvY2spOwoJCgl7Cgl1bnNpZ25lZCBpbnQgY3I7CgoJY3IgPSBVQVJU X0dFVF9DUihwb3J0KTsKCXByaW50aygiY3I9JXhcbiIsY3IpOwoJfQoJLyoKCSAqIFN1Y2Nlc3Mu CgkgKi8KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAplcDkzeHh1YXJ0X3NodXRkb3duKHN0cnVj dCB1YXJ0X3BvcnQgKnBvcnQpCnsKCS8qCgkgKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBkaXNh YmxlIHRoZSBwb3J0CgkgKi8KCVVBUlRfUFVUX0NSKHBvcnQsIDApOwoKCS8qCgkgKiBkaXNhYmxl IGJyZWFrIGNvbmRpdGlvbiBhbmQgZmlmb3MKCSAqLwoJVUFSVF9QVVRfTENSSChwb3J0LCBVQVJU X0dFVF9MQ1JIKHBvcnQpICYKCQkgICAgICB+KFVBUlRMQ1JfSF9CUksgfCBVQVJUTENSX0hfRkVO KSk7CgoJLyoKCSAqIEZyZWUgdGhlIGludGVycnVwdAoJICovCglmcmVlX2lycShwb3J0LT5pcnEs IHBvcnQpOwoKCS8qCgkgKiBSZWxlYXNlIHRoZSBtZW1vcnkgcmVnaW9uLgoJICovCglyZWxlYXNl X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUFSVF9QT1JUX1NJWkUpOwoKCS8qCgkgKiBEaXNh YmxlIHRoZSBjbG9jay4KCSAqLwoJZXA5M3h4dWFydF9kaXNhYmxlX2Nsb2NrcyggcG9ydCApOwp9 CgpzdGF0aWMgdm9pZAplcDkzeHh1YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBv cnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKCQkgICAgICAgc3RydWN0IGt0ZXJtaW9zICpv bGQpCnsKCXVuc2lnbmVkIGludCBsY3JfaCwgYmF1ZCwgcXVvdDsKCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CgoJLyoKCSAqIEFzayB0aGUgY29yZSB0byBjYWxjdWxhdGUgdGhlIGRpdmlzb3IgZm9yIHVz LgoJICovCgliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwg cG9ydC0+dWFydGNsay8xNik7CglxdW90ID0gdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKSAt IDE7CgkKCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCglzd2l0Y2ggKHRlcm1pb3MtPmNfY2Zs YWcgJiBDU0laRSkgewoJY2FzZSBDUzU6CgkJbGNyX2ggPSBVQVJUTENSX0hfV0xFTl81OwoJCWJy ZWFrOwoJY2FzZSBDUzY6CgkJbGNyX2ggPSBVQVJUTENSX0hfV0xFTl82OwoJCWJyZWFrOwoJY2Fz ZSBDUzc6CgkJbGNyX2ggPSBVQVJUTENSX0hfV0xFTl83OwoJCWJyZWFrOwoJZGVmYXVsdDogLy8g Q1M4CgkJbGNyX2ggPSBVQVJUTENSX0hfV0xFTl84OwoJCWJyZWFrOwoJfQoJaWYgKHRlcm1pb3Mt PmNfY2ZsYWcgJiBDU1RPUEIpCgkJbGNyX2ggfD0gVUFSVExDUl9IX1NUUDI7CglpZiAodGVybWlv cy0+Y19jZmxhZyAmIFBBUkVOQikgewoJCWxjcl9oIHw9IFVBUlRMQ1JfSF9QRU47CgkJaWYgKCEo dGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCgkJCWxjcl9oIHw9IFVBUlRMQ1JfSF9FUFM7Cgl9 CglpZiAocG9ydC0+Zmlmb3NpemUgPiAxKQoJCWxjcl9oIHw9IFVBUlRMQ1JfSF9GRU47CgoJc3Bp bl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKCgkvKgoJICogVXBkYXRlIHRoZSBw ZXItcG9ydCB0aW1lb3V0LgoJICovCgl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3Mt PmNfY2ZsYWcsIGJhdWQpOwoKCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUUlNSX09FOwoJ aWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9 IFVBUlRSU1JfRkUgfCBVQVJUUlNSX1BFOwoJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5U IHwgUEFSTVJLKSkKCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRSU1JfQkU7CgoJLyoK CSAqIENoYXJhY3RlcnMgdG8gaWdub3JlCgkgKi8KCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayA9 IDA7CglpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKCQlwb3J0LT5pZ25vcmVfc3RhdHVz X21hc2sgfD0gVUFSVFJTUl9GRSB8IFVBUlRSU1JfUEU7CglpZiAodGVybWlvcy0+Y19pZmxhZyAm IElHTkJSSykgewoJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUUlNSX0JFOwoJCS8q CgkJICogSWYgd2UncmUgaWdub3JpbmcgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLAoJCSAq IGlnbm9yZSBvdmVycnVucyB0b28gKGZvciByZWFsIHJhdyBzdXBwb3J0KS4KCQkgKi8KCQlpZiAo dGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKCQkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9 IFVBUlRSU1JfT0U7Cgl9CgoJLyoKCSAqIElnbm9yZSBhbGwgY2hhcmFjdGVycyBpZiBDUkVBRCBp cyBub3Qgc2V0LgoJICovCglpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgPT0gMCkKCQlw b3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9EVU1NWV9SU1JfUlg7CgoJaWYgKFVBUlRf RU5BQkxFX01TKHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcpKQoJCWVwOTN4eHVhcnRfZW5hYmxlX21z KHBvcnQpOwoKCVVBUlRfUFVUX0xDUkwocG9ydCwgcXVvdCAmIDB4ZmYpOwoJVUFSVF9QVVRfTENS TShwb3J0LCAocXVvdCA+PiA4KSAmIDB4ZmYpOwoJVUFSVF9QVVRfTENSSChwb3J0LCBsY3JfaCk7 CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMg Y29uc3QgY2hhciAqCmVwOTN4eHVhcnRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQp7Cgly ZXR1cm4gcG9ydC0+dHlwZSA9PSBQT1JUX0FNQkEgPyAiRVA5M1hYIiA6IE5VTEw7Cn0KCi8qCiAq IFJlbGVhc2UgdGhlIG1lbW9yeSByZWdpb24ocykgYmVpbmcgdXNlZCBieSAncG9ydCcKICovCnN0 YXRpYyB2b2lkCmVwOTN4eHVhcnRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQp CnsKfQoKLyoKICogUmVxdWVzdCB0aGUgbWVtb3J5IHJlZ2lvbihzKSBiZWluZyB1c2VkIGJ5ICdw b3J0JwogKi8Kc3RhdGljIGludAplcDkzeHh1YXJ0X3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9w b3J0ICpwb3J0KQp7CglyZXR1cm4gMDsKfQoKLyoKICogQ29uZmlndXJlL2F1dG9jb25maWd1cmUg dGhlIHBvcnQuCiAqLwpzdGF0aWMgdm9pZAplcDkzeHh1YXJ0X2NvbmZpZ19wb3J0KHN0cnVjdCB1 YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKewoJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQ RSkKCQlwb3J0LT50eXBlID0gUE9SVF9BTUJBOwp9CgovKgogKiB2ZXJpZnkgdGhlIG5ldyBzZXJp YWxfc3RydWN0IChmb3IgVElPQ1NTRVJJQUwpLgogKi8Kc3RhdGljIGludAplcDkzeHh1YXJ0X3Zl cmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpz ZXIpCnsKCWludCByZXQgPSAwOwoJaWYgKHNlci0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgc2Vy LT50eXBlICE9IFBPUlRfQU1CQSkKCQlyZXQgPSAtRUlOVkFMOwoJaWYgKHNlci0+aXJxIDwgMCB8 fCBzZXItPmlycSA+PSBOUl9JUlFTKQoJCXJldCA9IC1FSU5WQUw7CglpZiAoc2VyLT5iYXVkX2Jh c2UgPCA5NjAwKQoJCXJldCA9IC1FSU5WQUw7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0 IHVhcnRfb3BzIGVwOTN4eF9wb3BzID0gewoJLnR4X2VtcHR5CT0gZXA5M3h4dWFydF90eF9lbXB0 eSwKCS5zZXRfbWN0cmwJPSBlcDkzeHh1YXJ0X3NldF9tY3RybCwKCS5nZXRfbWN0cmwJPSBlcDkz eHh1YXJ0X2dldF9tY3RybCwKCS5zdG9wX3R4CT0gZXA5M3h4dWFydF9zdG9wX3R4LAoJLnN0YXJ0 X3R4CT0gZXA5M3h4dWFydF9zdGFydF90eCwKCS5zdG9wX3J4CT0gZXA5M3h4dWFydF9zdG9wX3J4 LAoJLmVuYWJsZV9tcwk9IGVwOTN4eHVhcnRfZW5hYmxlX21zLAoJLmJyZWFrX2N0bAk9IGVwOTN4 eHVhcnRfYnJlYWtfY3RsLAoJLnN0YXJ0dXAJPSBlcDkzeHh1YXJ0X3N0YXJ0dXAsCgkuc2h1dGRv d24JPSBlcDkzeHh1YXJ0X3NodXRkb3duLAoJLnNldF90ZXJtaW9zCT0gZXA5M3h4dWFydF9zZXRf dGVybWlvcywKCS50eXBlCQk9IGVwOTN4eHVhcnRfdHlwZSwKCS5yZWxlYXNlX3BvcnQJPSBlcDkz eHh1YXJ0X3JlbGVhc2VfcG9ydCwKCS5yZXF1ZXN0X3BvcnQJPSBlcDkzeHh1YXJ0X3JlcXVlc3Rf cG9ydCwKCS5jb25maWdfcG9ydAk9IGVwOTN4eHVhcnRfY29uZmlnX3BvcnQsCgkudmVyaWZ5X3Bv cnQJPSBlcDkzeHh1YXJ0X3ZlcmlmeV9wb3J0LAp9OwoKc3RhdGljIHN0cnVjdCB1YXJ0X2VwOTN4 eF9wb3J0IGVwOTN4eF9wb3J0c1tVQVJUX05SXSA9IHsKCXsKCQkucG9ydAk9IHsKCQkJLm1lbWJh c2UJPSAodm9pZCAqKVVBUlQxX0JBU0UsCgkJCS5tYXBiYXNlCT0gLypId1JlZ1RvUGh5cyhVQVJU MV9CQVNFKSovVUFSVDFfQkFTRV9WSVJULAoJCQkuaW90eXBlCQk9IFVQSU9fTUVNLAoJCQkuaXJx CQk9IElSUV9FUDkzWFhfVUFSVDEsCgkJCS51YXJ0Y2xrCT0gMTQ3NDU2MDAsCgkJCS5maWZvc2l6 ZQk9IDE2LAoJCQkub3BzCQk9ICZlcDkzeHhfcG9wcywKCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FV VE9DT05GLAoJCQkubGluZQkJPSAwLAoJCX0sCgl9LAojaWYgIWRlZmluZWQoQ09ORklHX0VQOTNY WF9JUkRBKQoJewoJCS5wb3J0CT0gewoJCQkubWVtYmFzZQk9ICh2b2lkICopVUFSVDJfQkFTRSwK CQkJLm1hcGJhc2UJPSAvKkh3UmVnVG9QaHlzKFVBUlQyX0JBU0UpKi9VQVJUMl9CQVNFX1ZJUlQs CgkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCgkJCS5pcnEJCT0gSVJRX0VQOTNYWF9VQVJUMiwKCQkJ LnVhcnRjbGsJPSAxNDc0NTYwMCwKCQkJLmZpZm9zaXplCT0gMTYsCgkJCS5vcHMJCT0gJmVwOTN4 eF9wb3BzLAoJCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCgkJCS5saW5lCQk9IDEsCgkJ fSwKCX0sCiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfRVA5MzAxKSAmJiAhZGVmaW5l ZChDT05GSUdfQVJDSF9FUDkzMDIpCgl7CgkJLnBvcnQJPSB7CgkJCS5tZW1iYXNlCT0gKHZvaWQg KilVQVJUM19CQVNFLAoJCQkubWFwYmFzZQk9IC8qSHdSZWdUb1BoeXMoVUFSVDNfQkFTRSkqL1VB UlQzX0JBU0VfVklSVCwKCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKCQkJLmlycQkJPSBJUlFfRVA5 M1hYX1VBUlQzLAoJCQkudWFydGNsawk9IDE0NzQ1NjAwLAoJCQkuZmlmb3NpemUJPSAxNiwKCQkJ Lm9wcwkJPSAmZXA5M3h4X3BvcHMsCgkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKI2lm ICFkZWZpbmVkKENPTkZJR19FUDkzWFhfSVJEQSkKCQkJLmxpbmUJCT0gMiwKI2Vsc2UKCQkJLmxp bmUJCT0gMSwKI2VuZGlmCgkJfSwKCX0KI2VuZGlmCn07CgojaWZkZWYgQ09ORklHX1NFUklBTF9F UDkzWFhfQ09OU09MRQoKc3RhdGljIHZvaWQKZXA5M3h4dWFydF9jb25zb2xlX3dyaXRlX2NoYXIo c3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjaCkKewoJdW5zaWduZWQgaW50IHN0YXR1czsK CglkbyB7CgkJc3RhdHVzID0gVUFSVF9HRVRfRlIocG9ydCk7Cgl9IHdoaWxlICghVUFSVF9UWF9S RUFEWShzdGF0dXMpKTsKCVVBUlRfUFVUX0NIQVIocG9ydCwgY2gpOwp9CgpzdGF0aWMgdm9pZApl cDkzeHh1YXJ0X2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpz LCB1bnNpZ25lZCBpbnQgY291bnQpCnsKCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZXA5M3h4 X3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKCXVuc2lnbmVkIGludCBzdGF0dXMsIG9sZF9jciwgb2xk X3Bvd2VyOwoJaW50IGk7CgoJb2xkX3Bvd2VyID0gZXA5M3h4dWFydF9pc19wb3J0X2VuYWJsZWQo cG9ydCk7CglpZiAoIW9sZF9wb3dlcikKCQllcDkzeHh1YXJ0X2VuYWJsZV9jbG9ja3MocG9ydCk7 CgoJLyoKCSAqIEZpcnN0IHNhdmUgdGhlIENSIHRoZW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cwoJ ICovCglvbGRfY3IgPSBVQVJUX0dFVF9DUihwb3J0KTsKCVVBUlRfUFVUX0NSKHBvcnQsIFVBUlRD Ul9VQVJURU4pOwoKCS8qCgkgKiBOb3csIGRvIGVhY2ggY2hhcmFjdGVyCgkgKi8KCWZvciAoaSA9 IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJZXA5M3h4dWFydF9jb25zb2xlX3dyaXRlX2NoYXIocG9y dCwgc1tpXSk7CgkJaWYgKHNbaV0gPT0gJ1xuJykKCQkJZXA5M3h4dWFydF9jb25zb2xlX3dyaXRl X2NoYXIocG9ydCwgJ1xyJyk7Cgl9CgoJLyoKCSAqIEZpbmFsbHksIHdhaXQgZm9yIHRyYW5zbWl0 dGVyIHRvIGJlY29tZSBlbXB0eQoJICogYW5kIHJlc3RvcmUgdGhlIFRDUgoJICovCglkbyB7CgkJ c3RhdHVzID0gVUFSVF9HRVRfRlIocG9ydCk7Cgl9IHdoaWxlIChzdGF0dXMgJiBVQVJURlJfQlVT WSk7CglVQVJUX1BVVF9DUihwb3J0LCBvbGRfY3IpOwoKCWlmICghb2xkX3Bvd2VyKQoJCWVwOTN4 eHVhcnRfZGlzYWJsZV9jbG9ja3MocG9ydCk7Cn0KCnN0YXRpYyB2b2lkIF9faW5pdAplcDkzeHh1 YXJ0X2NvbnNvbGVfZ2V0X29wdGlvbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50ICpiYXVk LCBpbnQgKnBhcml0eSwKCQkJICAgICAgIGludCAqYml0cykKewoJaWYgKFVBUlRfR0VUX0NSKHBv cnQpICYgVUFSVENSX1VBUlRFTikgewoJCXVuc2lnbmVkIGludCBsY3JfaCwgbGNyX20sIGxjcl9s OwoKCQlsY3JfaCA9IFVBUlRfR0VUX0xDUkgocG9ydCk7CgoJCSpwYXJpdHkgPSAnbic7CgkJaWYg KGxjcl9oICYgVUFSVExDUl9IX1BFTikgewoJCQlpZiAobGNyX2ggJiBVQVJUTENSX0hfRVBTKQoJ CQkJKnBhcml0eSA9ICdlJzsKCQkJZWxzZQoJCQkJKnBhcml0eSA9ICdvJzsKCQl9CgoJCWlmICgo bGNyX2ggJiAweDYwKSA9PSBVQVJUTENSX0hfV0xFTl83KQoJCQkqYml0cyA9IDc7CgkJZWxzZQoJ CQkqYml0cyA9IDg7CgoJCWxjcl9tID0gVUFSVF9HRVRfTENSTShwb3J0KTsKCQlsY3JfbCA9IFVB UlRfR0VUX0xDUkwocG9ydCk7CgoJCSpiYXVkID0gcG9ydC0+dWFydGNsayAvICgxNiAqICgobGNy X20gKiAyNTYpICsgbGNyX2wgKyAxKSk7Cgl9Cn0KCnN0YXRpYyBpbnQgX19pbml0CmVwOTN4eHVh cnRfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCnsKCXN0 cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CglpbnQgYmF1ZCA9IDU3NjAwOwoJaW50IGJpdHMgPSA4OwoJ aW50IHBhcml0eSA9ICduJzsKCWludCBmbG93ID0gJ24nOwoKCS8qCgkgKiBDaGVjayB3aGV0aGVy IGFuIGludmFsaWQgdWFydCBudW1iZXIgaGFzIGJlZW4gc3BlY2lmaWVkLCBhbmQKCSAqIGlmIHNv LCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQoJICog Y29uc29sZSBzdXBwb3J0LgoJICovCglpZiAoY28tPmluZGV4ID49IFVBUlRfTlIpCgkJY28tPmlu ZGV4ID0gMDsKCXBvcnQgPSAmZXA5M3h4X3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKCglpZiAob3B0 aW9ucykKCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRz LCAmZmxvdyk7CgllbHNlCgkJZXA5M3h4dWFydF9jb25zb2xlX2dldF9vcHRpb25zKHBvcnQsICZi YXVkLCAmcGFyaXR5LCAmYml0cyk7CgoJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28s IGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Cn0KCnN0YXRpYyBzdHJ1Y3QgY29uc29sZSBlcDkz eHhfY29uc29sZTsKI2RlZmluZSBFUDkzWFhfQ09OU09MRQkmZXA5M3h4X2NvbnNvbGUKI2Vsc2UK I2RlZmluZSBFUDkzWFhfQ09OU09MRQlOVUxMCiNlbmRpZgoKc3RhdGljIHN0cnVjdCB1YXJ0X2Ry aXZlciBlcDkzeHhfcmVnID0gewoJLmRyaXZlcl9uYW1lCQk9ICJ0dHlBTSIsCgkuZGV2X25hbWUJ CT0gInR0eUFNIiwKCS5tYWpvcgkJCT0gU0VSSUFMX0VQOTNYWF9NQUpPUiwKCS5taW5vcgkJCT0g U0VSSUFMX0VQOTNYWF9NSU5PUiwKCS5ucgkJCT0gVUFSVF9OUiwKCS5jb25zCQkJPSBFUDkzWFhf Q09OU09MRSwKfTsKCgovKgogKiBUaGUgJ2luZGV4JyBlbGVtZW50IG9mIHRoaXMgZmllbGQgc2Vs ZWN0cyB3aGljaCBVQVJUIHRvIHVzZSBmb3IKICogY29uc29sZS4gIEZvciBlcDkzeHgsIHZhbGlk IHZhbHVlcyBhcmUgMCwgMSwgYW5kIDIuICBJZiB5b3Ugc2V0CiAqIGl0IHRvIC0xLCB0aGVuIHVh cnRfZ2V0X2NvbnNvbGUgd2lsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBVQVJUCiAqIHdoaWNoIGlz IHRoZSBzYW1lIGFzIHNldHRpbmcgaXQgdG8gMC4KICovCnN0YXRpYyBzdHJ1Y3QgY29uc29sZSBl cDkzeHhfY29uc29sZSA9IHsKCS5uYW1lCQk9ICJ0dHlBTSIsCgkud3JpdGUJCT0gZXA5M3h4dWFy dF9jb25zb2xlX3dyaXRlLAoJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAoJLnNldHVw CQk9IGVwOTN4eHVhcnRfY29uc29sZV9zZXR1cCwKCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIs CgkuaW5kZXgJCT0gLTEsCgkuZGF0YQkJPSAmZXA5M3h4X3JlZywKfTsKCnN0YXRpYyBpbnQgX19p bml0CmVwOTN4eHVhcnRfY29uc29sZV9pbml0KHZvaWQpCnsKCXJlZ2lzdGVyX2NvbnNvbGUoJmVw OTN4eF9jb25zb2xlKTsKCXJldHVybiAwOwp9CmNvbnNvbGVfaW5pdGNhbGwoZXA5M3h4dWFydF9j b25zb2xlX2luaXQpOwoKc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0c1tVQVJUX05SXSA9IHsK CVswXSA9IHsKCQkubmFtZQkJPSAidWFydDEiLAoJCS5zdGFydAkJPSAvKkh3UmVnVG9QaHlzKFVB UlQxX0JBU0UpKi9VQVJUMV9CQVNFX1ZJUlQsCgkJLmVuZAkJPSAvKkh3UmVnVG9QaHlzKFVBUlQx X0JBU0UpKi9VQVJUMV9CQVNFX1ZJUlQgKyAweDAwMDBmZmZmLAoJfSwKI2lmICFkZWZpbmVkKENP TkZJR19FUDkzWFhfSVJEQSkKCVsxXSA9IHsKCQkubmFtZQkJPSAidWFydDIiLAoJCS5zdGFydAkJ PSAvKkh3UmVnVG9QaHlzKFVBUlQyX0JBU0UpKi9VQVJUMl9CQVNFX1ZJUlQsCgkJLmVuZAkJPSAv Kkh3UmVnVG9QaHlzKFVBUlQyX0JBU0UpKi9VQVJUMl9CQVNFX1ZJUlQgKyAweDAwMDBmZmZmLAoJ fSwKI2VuZGlmCiNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9FUDkzMDEpICYmICFkZWZpbmVkKENP TkZJR19BUkNIX0VQOTMwMikKCVsyXSA9IHsKCQkubmFtZQkJPSAidWFydDMiLAoJCS5zdGFydAkJ PSAvKkh3UmVnVG9QaHlzKFVBUlQzX0JBU0UpKi9VQVJUM19CQVNFX1ZJUlQsCgkJLmVuZAkJPSAv Kkh3UmVnVG9QaHlzKFVBUlQzX0JBU0UpKi9VQVJUM19CQVNFX1ZJUlQgKyAweDAwMDBmZmZmLAoJ fSwKI2VuZGlmCn07CgpzdGF0aWMgaW50IF9faW5pdAplcDkzeHh1YXJ0X2luaXQodm9pZCkKewoJ aW50IHJldCwgaTsKCglyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmZXA5M3h4X3JlZyk7Cglp ZiAocmV0ID09IDApIHsKCQlmb3IgKGkgPSAwOyBpIDwgVUFSVF9OUjsgaSsrKSB7CgkJCXJlcXVl c3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmdWFydHNbaV0pOwoJCQl1YXJ0X2FkZF9vbmVf cG9ydCgmZXA5M3h4X3JlZywgJmVwOTN4eF9wb3J0c1tpXS5wb3J0KTsKCQl9Cgl9CglyZXR1cm4g cmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZXA5M3h4dWFydF9leGl0KHZvaWQpCnsKCWludCBp OwoKCWZvciAoaSA9IDA7IGkgPCBVQVJUX05SOyBpKyspCgkJdWFydF9yZW1vdmVfb25lX3BvcnQo JmVwOTN4eF9yZWcsICZlcDkzeHhfcG9ydHNbaV0ucG9ydCk7Cgl1YXJ0X3VucmVnaXN0ZXJfZHJp dmVyKCZlcDkzeHhfcmVnKTsKfQoKbW9kdWxlX2luaXQoZXA5M3h4dWFydF9pbml0KTsKbW9kdWxl X2V4aXQoZXA5M3h4dWFydF9leGl0KTsKCk1PRFVMRV9BVVRIT1IoIkFSTSBMdGQvRGVlcCBCbHVl IFNvbHV0aW9ucyBMdGQvQ2lycnVzIExvZ2ljLCBJbmMuIik7Ck1PRFVMRV9ERVNDUklQVElPTigi RVA5M3h4IEFSTSBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpN T0RVTEVfQUxJQVNfQ0hBUkRFVihTRVJJQUxfRVA5M1hYX01BSk9SLCBTRVJJQUxfRVA5M1hYX01J Tk9SKTsK ------=_Part_4902_2806369.1200245495398--