From owner-freebsd-mips@freebsd.org Sun Sep 11 17:21:10 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 668A8BD676F for ; Sun, 11 Sep 2016 17:21:10 +0000 (UTC) (envelope-from sbruno@freebsd.org) Received: from mail.ignoranthack.me (ignoranthack.me [199.102.79.106]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 494E79EA for ; Sun, 11 Sep 2016 17:21:09 +0000 (UTC) (envelope-from sbruno@freebsd.org) Received: from [192.168.0.6] (67-0-45-125.albq.qwest.net [67.0.45.125]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: sbruno@ignoranthack.me) by mail.ignoranthack.me (Postfix) with ESMTPSA id 5575A1928CE for ; Sun, 11 Sep 2016 17:21:03 +0000 (UTC) Subject: Re: Clang/LLVM enabled builds for mips/mips64 To: freebsd-mips@freebsd.org References: <88751282-c9d2-a673-18bc-184edc02efd0@freebsd.org> From: Sean Bruno Message-ID: <476e4c7a-1274-b202-bf9b-5c0eac62c751@freebsd.org> Date: Sun, 11 Sep 2016 11:20:59 -0600 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <88751282-c9d2-a673-18bc-184edc02efd0@freebsd.org> Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="qufkchwHJE8WOSXDmSntPap7iPPL4sODB" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Sep 2016 17:21:10 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --qufkchwHJE8WOSXDmSntPap7iPPL4sODB Content-Type: multipart/mixed; boundary="oaWM86XpdCBBdmJ5M6kjxA9POOQ2CtU0D" From: Sean Bruno To: freebsd-mips@freebsd.org Message-ID: <476e4c7a-1274-b202-bf9b-5c0eac62c751@freebsd.org> Subject: Re: Clang/LLVM enabled builds for mips/mips64 References: <88751282-c9d2-a673-18bc-184edc02efd0@freebsd.org> In-Reply-To: <88751282-c9d2-a673-18bc-184edc02efd0@freebsd.org> --oaWM86XpdCBBdmJ5M6kjxA9POOQ2CtU0D Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 08/29/16 09:09, Sean Bruno wrote: > MIPS32 buildkernel failure: > http://people.freebsd.org/~sbruno/malta32_buildkernel.txt I've updated the mips64 clang tree in projects with a small Makefile change to not build support.S with -integrated-as. I can now build/boot mips32 MALTA under qemu, but I get a pretty bad pagefault/kaboom that needs some science. https://people.freebsd.org/~sbruno/malta32_clang.txt sean --oaWM86XpdCBBdmJ5M6kjxA9POOQ2CtU0D-- --qufkchwHJE8WOSXDmSntPap7iPPL4sODB Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQF8BAEBCgBmBQJX1ZJ7XxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXRCQUFENDYzMkU3MTIxREU4RDIwOTk3REQx MjAxRUZDQTFFNzI3RTY0AAoJEBIB78oecn5kEJwIAJC75v1nZDygTBOc8vQVUZ0D P6iCBHU0LlThyh3yjogbtoantCMB/W60H0UflIBrmFKwF56Vzvotyufm1e7SSkNo glw9RulovEDHGQfrZgBIdEj8wmqRBMMO15Ao6en7i5wi4it9x+h2KKGqefQZ6VzJ zWkezw2Vn4KfVxI2VPRAi4jXRHCe4MSPvasDw7gl/8GpR41A5gvQoK++7ZrOdwXy lGzjIYJ9aGF9Xc+PwbtxI7eWvHNbH10qYMmqetP44AcOfWriWLs1nGhrEhJMfE4b Ddl8ArkSSIKA2E7n/D9KFKfqSN4EuzWfKg/V11FEtQLHZdTqAemVvzabxLeWado= =5+Og -----END PGP SIGNATURE----- --qufkchwHJE8WOSXDmSntPap7iPPL4sODB-- From owner-freebsd-mips@freebsd.org Fri Sep 16 16:48:20 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D8B9BBDD6CF for ; Fri, 16 Sep 2016 16:48:20 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id B42E2DF3 for ; Fri, 16 Sep 2016 16:48:20 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 716BFABD3; Fri, 16 Sep 2016 16:48:20 +0000 (UTC) Date: Fri, 16 Sep 2016 16:48:20 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcIlQ= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 16:48:20 -0000 c2JydW5vIGNvbW1hbmRlZXJlZCB0aGlzIHJldmlzaW9uLgpzYnJ1bm8gYWRkZWQgYSByZXZpZXdl cjogc3Nvbi4Kc2JydW5vIGFkZGVkIGEgY29tbWVudC4KCgogIEdvaW5nIHRvIHVwZGF0ZSB0aGlz IHRvIGJlIGFwcGxpY2FibGUgdG8gSEVBRCBhZnRlciBzb21lIGJ1aWxkIHRlc3QuICBTb21lIG9m IHRoaXMgcmV2aWV3IGhhcyBiZWVuIGNvbW1pdHRlZCBieSB2YXJpb3VzIGZvbGtzLgoKUkVQT1NJ VE9SWQogIHJTIEZyZWVCU0Qgc3JjIHJlcG9zaXRvcnkKClJFVklTSU9OIERFVEFJTAogIGh0dHBz Oi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNQoKRU1BSUwgUFJFRkVSRU5DRVMKICBodHRwczov L3Jldmlld3MuZnJlZWJzZC5vcmcvc2V0dGluZ3MvcGFuZWwvZW1haWxwcmVmZXJlbmNlcy8KClRv OiBzYnJ1bm8sIHNzb24KQ2M6IHNicnVubywgcndhdHNvbiwgZW1hc3RlLCBpbXAsIGZyZWVic2Qt bWlwcy1saXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2FfZ21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 16:51:34 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 55FD2BDD7CD for ; Fri, 16 Sep 2016 16:51:34 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 31A8D116 for ; Fri, 16 Sep 2016 16:51:34 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id E268AAE14; Fri, 16 Sep 2016 16:51:33 +0000 (UTC) Date: Fri, 16 Sep 2016 16:51:33 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <676c324a69e93c37c7504019260a0faf@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcIxU= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 16:51:34 -0000 c2JydW5vIGFkZGVkIGEgZGVwZW5kZW50IHJldmlzaW9uOiBENTYyMzogRml4IE1JUFMgcG1hcF9h bGlnbl9zdXBlcnBhZ2UoKSBmdW5jdGlvbiB0byB1c2Ugc3VwZXJwYWdlIHJhdGhlciB0aGFuIHNl Z21lbnQgYWxpZ25tZW50LgoKUkVQT1NJVE9SWQogIHJTIEZyZWVCU0Qgc3JjIHJlcG9zaXRvcnkK ClJFVklTSU9OIERFVEFJTAogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNQoKRU1B SUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvc2V0dGluZ3MvcGFu ZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBzYnJ1bm8sIHNzb24KQ2M6IHNicnVubywgcndhdHNv biwgZW1hc3RlLCBpbXAsIGZyZWVic2QtbWlwcy1saXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29t LCBtaXpoa2FfZ21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 18:02:17 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8CF50BDD7A9 for ; Fri, 16 Sep 2016 18:02:17 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 6A43B7A7 for ; Fri, 16 Sep 2016 18:02:17 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 2EC36B495; Fri, 16 Sep 2016 18:02:17 +0000 (UTC) Date: Fri, 16 Sep 2016 18:02:17 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <0f1a4bfb62ea286f18e7c470b7585737@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcM6k= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 18:02:17 -0000 c2JydW5vIGFkZGVkIGEgY29tbWVudC4KCgogIEN1cnJlbnRseSBmYWlscyB0byBidWlsZHdvcmxk IGR1ZSB0byBjaGFuZ2VzIHRvIHB0ZS5oOgogIAogICAgPT09PiBsaWIvbGlia3ZtIChvYmosYWxs LGluc3RhbGwpCiAgICBjYyAtaXN5c3RlbSAvdmFyL3RtcC9taXBzLm1pcHM2NC9ob21lL3NicnVu by9mYnNkX2hlYWQvdG1wL3Vzci9pbmNsdWRlIC1ML3Zhci90bXAvbWlwcy5taXBzNjQvaG9tZS9z YnJ1bm8vZmJzZF9oZWFkL3RtcC91c3IvbGliIC1CL3Zhci90bXAvbWlwcy5taXBzNjQvaG9tZS9z YnJ1bm8vZmJzZF9oZWFkL3RtcC91c3IvbGliIC0tc3lzcm9vdD0vdmFyL3RtcC9taXBzLm1pcHM2 NC9ob21lL3NicnVuby9mYnNkX2hlYWQvdG1wIC1CL3Zhci90bXAvbWlwcy5taXBzNjQvaG9tZS9z YnJ1bm8vZmJzZF9oZWFkL3RtcC91c3IvYmluICAtTyAtcGlwZSAtRExJQkNfU0NDUyAtSS9ob21l L3NicnVuby9mYnNkX2hlYWQvbGliL2xpYmt2bSAtRzAgICAtTUQgIC1NRi5kZXBlbmQua3ZtX21p bmlkdW1wX21pcHMubyAtTVRrdm1fbWluaWR1bXBfbWlwcy5vIC1zdGQ9Z251OTkgLVdzeXN0ZW0t aGVhZGVycyAtV2Vycm9yIC1XYWxsIC1Xbm8tZm9ybWF0LXkyayAtVyAtV25vLXVudXNlZC1wYXJh bWV0ZXIgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV3BvaW50ZXIt YXJpdGggLVduby11bmluaXRpYWxpemVkIC1Xbm8tcG9pbnRlci1zaWduICAgICAtYyAvaG9tZS9z YnJ1bm8vZmJzZF9oZWFkL2xpYi9saWJrdm0va3ZtX21pbmlkdW1wX21pcHMuYyAtbyBrdm1fbWlu aWR1bXBfbWlwcy5vCiAgICBJbiBmaWxlIGluY2x1ZGVkIGZyb20gL2hvbWUvc2JydW5vL2Zic2Rf aGVhZC9saWIvbGlia3ZtL2t2bV9taW5pZHVtcF9taXBzLmM6NDk6CiAgICAvaG9tZS9zYnJ1bm8v ZmJzZF9oZWFkL2xpYi9saWJrdm0va3ZtX21pcHMuaDo4NTogZXJyb3I6IHNpemUgb2YgYXJyYXkg J19fYXNzZXJ0XzcnIGlzIG5lZ2F0aXZlCiAgICAqKiogRXJyb3IgY29kZSAxCgpSRVBPU0lUT1JZ CiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6Ly9y ZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2 aWV3cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNi cnVubywgc3NvbgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBz LWxpc3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K From owner-freebsd-mips@freebsd.org Fri Sep 16 18:15:07 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 83F23BDDC43 for ; Fri, 16 Sep 2016 18:15:07 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 6245FDCA for ; Fri, 16 Sep 2016 18:15:07 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 26C93BB29; Fri, 16 Sep 2016 18:15:07 +0000 (UTC) Date: Fri, 16 Sep 2016 18:15:07 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <1788b0483ddb32ab857f95b347306f8f@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcNqs= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 18:15:07 -0000 c2JydW5vIGFkZGVkIGEgY29tbWVudC4KCgogIEFoLCBJIG5lZWQgdG8gc3RlYWwgZnJvbSBhIEJy b29rcyBjb21taXQgb3ZlciBpbiBDSEVSSToKICAKICBodHRwczovL2dpdGh1Yi5jb20vQ1RTUkQt Q0hFUkkvY2hlcmlic2QvY29tbWl0L2NhODkyNDU0NmZhZmY0MTFkMjUzOWM0Y2QzMGJkMTVhYWEy MzI4MjQjZGlmZi0xZjM3YTZmOGI2OTY3OGI3NzAwYWJjY2YwZDUxZmFjYgoKUkVQT1NJVE9SWQog IHJTIEZyZWVCU0Qgc3JjIHJlcG9zaXRvcnkKClJFVklTSU9OIERFVEFJTAogIGh0dHBzOi8vcmV2 aWV3cy5mcmVlYnNkLm9yZy9EMjUzNQoKRU1BSUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmll d3MuZnJlZWJzZC5vcmcvc2V0dGluZ3MvcGFuZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBzYnJ1 bm8sIHNzb24KQ2M6IHNicnVubywgcndhdHNvbiwgZW1hc3RlLCBpbXAsIGZyZWVic2QtbWlwcy1s aXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2FfZ21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 18:01:29 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8F35EBDD680 for ; Fri, 16 Sep 2016 18:01:29 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 6E2116AF for ; Fri, 16 Sep 2016 18:01:28 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 2FE3EB42F; Fri, 16 Sep 2016 18:01:28 +0000 (UTC) Date: Fri, 16 Sep 2016 18:01:28 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <8a01977bc2405e827dd78c8dca1d7216@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcM3g= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_8a01977bc2405e827dd78c8dca1d7216" X-Mailman-Approved-At: Fri, 16 Sep 2016 18:20:55 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 18:01:29 -0000 --b1_8a01977bc2405e827dd78c8dca1d7216 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzg3LgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgVXBkYXRlIHJldmlldyB0byBoZWFkLgogIAogIEJ1aWxkIG9mIGxpYmt2 bSBmYWlscyBob3dldmVyIGFzIHB0ZS5oIGNoYW5nZXMgYXJlIGNhdXNpbmcgYXNzZXJ0cyB0bwog IGZpcmUuICBJIHN1c3BlY3QgdGhhdCBhIHNpbXBsZSBjaGFuZ2UgaXMgcmVxdWlyZWQuCgpSRVBP U0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQ REFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz01MzYwJmlkPTIwMzg3 CgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFG RkVDVEVEIEZJTEVTCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25mL29wdGlvbnMubWlw cwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1ZGUvcG1hcC5oCiAg c3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCiAgc3lz L21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKICBzeXMvbWlwcy9t aXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5cy9taXBzL21pcHMv bWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBzeXMvbWlwcy9taXBz L3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMvbWlwcy9taXBzL3Rs Yi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMK ICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVlLmMKCkVNQUlMIFBS RUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRpbmdzL3BhbmVsL2Vt YWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8sIHJ3YXRzb24sIGVt YXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lhaG9vLmNvbSwgbWl6 aGthX2dtYWlsLmNvbQo= --b1_8a01977bc2405e827dd78c8dca1d7216 Content-Type: text/x-patch; charset=utf-8; name="D2535.20387.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20387.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NzMsOSArNzA5LDkgQEAKIAlw YWdlcyA9IHRkLT50ZF9rc3RhY2tfcGFnZXM7CiAJa3NvYmogPSB0ZC0+dGRfa3N0YWNrX29iajsK IAlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7IGkr KykKLQkJbWFbaV0gPSB2bV9wYWdlX2dyYWIoa3NvYmosIGksIFZNX0FMTE9DX05PUk1BTCB8Ci0J CSAgICBWTV9BTExPQ19XSVJFRCk7CisJcnYgPSB2bV9rc3RhY2tfcGFsbG9jKGtzb2JqLCB0ZC0+ dGRfa3N0YWNrLCAoVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfV0lSRUQpLCBwYWdl cywgbWEpOworCUtBU1NFUlQocnYgIT0gMCwgKCJ2bV90aHJlYWRfc3dhcGluOiB2bV9rc3RhY2tf cGFsbG9jKCkgZmFpbGVkIikpOwogCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXM7KSB7CiAJCWlu dCBqLCBhLCBjb3VudCwgcnY7CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdm1fbWFjaGRl cC5jIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy92bV9t YWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKQEAgLTI1MSwxOCArMjUx LDI4IEBACiBjcHVfdGhyZWFkX3N3YXBpbihzdHJ1Y3QgdGhyZWFkICp0ZCkKIHsKIAlwdF9lbnRy eV90ICpwdGU7Ci0JaW50IGk7CiAKIAkvKgogCSAqIFRoZSBrc3RhY2sgbWF5IGJlIGF0IGEgZGlm ZmVyZW50IHBoeXNpY2FsIGFkZHJlc3Mgbm93LgogCSAqIENhY2hlIHRoZSBQVEVzIGZvciB0aGUg S2VybmVsIHN0YWNrIGluIHRoZSBtYWNoaW5lIGRlcGVuZGVudAogCSAqIHBhcnQgb2YgdGhlIHRo cmVhZCBzdHJ1Y3Qgc28gY3B1X3N3aXRjaCgpIGNhbiBxdWlja2x5IG1hcCBpbgogCSAqIHRoZSBw Y2Igc3RydWN0IGFuZCBrZXJuZWwgc3RhY2suCiAJICovCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BB R0UKKwkvKiBKdXN0IG9uZSBlbnRyeSBmb3Igb25lIGxhcmdlIGtlcm5lbCBwYWdlLiAqLworCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrKTsKKwl0ZC0+dGRfbWQubWRf dXB0ZVswXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJdGQtPnRkX21kLm1kX3VwdGVb MV0gPSAxOworCisjZWxzZQorCisJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BB R0VTOyBpKyspIHsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sg KyBpICogUEFHRV9TSVpFKTsKIAkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxP X1NXQklUU19NQVNLOwogCX0KKyNlbmRpZiAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCiB9CiAK IHZvaWQKQEAgLTI3NCwxNyArMjg0LDMxIEBACiBjcHVfdGhyZWFkX2FsbG9jKHN0cnVjdCB0aHJl YWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAotCUtBU1NFUlQoKHRkLT50 ZF9rc3RhY2sgJiAoMSA8PCBQQUdFX1NISUZUKSkgPT0gMCwgKCJrZXJuZWwgc3RhY2sgbXVzdCBi ZSBhbGlnbmVkLiIpKTsKKwlLQVNTRVJUKCh0ZC0+dGRfa3N0YWNrICYgKChLU1RBQ0tfUEFHRV9T SVpFICogMikgLSAxKSApID09IDAsCisJICAgICgia2VybmVsIHN0YWNrIG11c3QgYmUgYWxpZ25l ZC4iKSk7CiAJdGQtPnRkX3BjYiA9IChzdHJ1Y3QgcGNiICopKHRkLT50ZF9rc3RhY2sgKwogCSAg ICB0ZC0+dGRfa3N0YWNrX3BhZ2VzICogUEFHRV9TSVpFKSAtIDE7CiAJdGQtPnRkX2ZyYW1lID0g JnRkLT50ZF9wY2ItPnBjYl9yZWdzOwogCi0JZm9yIChpID0gMDsgaSA8IEtTVEFDS19QQUdFUzsg aSsrKSB7Ci0JCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB0ZC0+dGRfa3N0YWNrICsgaSAq IFBBR0VfU0laRSk7Ci0JCXRkLT50ZF9tZC5tZF91cHRlW2ldID0gKnB0ZSAmIH5UTEJMT19TV0JJ VFNfTUFTSzsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5IGZv ciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJMT19T V0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwl7CisJ CWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgeworCQkJcHRl ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICoKKwkJCSAgICBQQUdF X1NJWkUpOworCQkJdGQtPnRkX21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19N QVNLOworCQl9CiAJfQorI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9p ZApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlw cy91bWFfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvdW1hX21hY2hkZXAuYworKysgYi9z eXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKQEAgLTUyLDcgKzUyLDExIEBACiAJcGZsYWdzID0g bWFsbG9jMnZtX2ZsYWdzKHdhaXQpIHwgVk1fQUxMT0NfV0lSRUQ7CiAKIAlmb3IgKDs7KSB7Cisj aWZkZWYgTUlQUzY0X05FV19QTUFQCisJCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEwsIDAsIHBmbGFn cyB8IFZNX0FMTE9DX05PT0JKKTsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAJCW0g PSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNUX0RJUkVDVCwgcGZsYWdzKTsKKyNl bmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogI2lmbmRlZiBfX21pcHNfbjY0CiAJCWlmICht ID09IE5VTEwgJiYgdm1fcGFnZV9yZWNsYWltX2NvbnRpZyhwZmxhZ3MsIDEsCiAJCSAgICAwLCBN SVBTX0tTRUcwX0xBUkdFU1RfUEhZUywgUEFHRV9TSVpFLCAwKSkKQEAgLTYyLDEyICs2NiwxOCBA QAogCQkJaWYgKHdhaXQgJiBNX05PV0FJVCkKIAkJCQlyZXR1cm4gKE5VTEwpOwogCQkJZWxzZQor I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAogCQkJCVZNX1dBSVQ7CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCQkJCXBtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworI2VuZGlmIC8q ICEgTUlQUzY0X05FV19QTUFQICovCiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQogCiAJcGEgPSBW TV9QQUdFX1RPX1BIWVMobSk7CisJaWYgKCh3YWl0ICYgTV9OT0RVTVApID09IDApCisJCWR1bXBf YWRkX3BhZ2UocGEpOwogCXZhID0gKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKIAlp ZiAoKHdhaXQgJiBNX1pFUk8pICYmIChtLT5mbGFncyAmIFBHX1pFUk8pID09IDApCiAJCWJ6ZXJv KHZhLCBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90cmFwLmMgYi9zeXMv bWlwcy9taXBzL3RyYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RyYXAuYworKysgYi9zeXMvbWlw cy9taXBzL3RyYXAuYwpAQCAtODEsNiArODEsNyBAQAogI2luY2x1ZGUgPG1hY2hpbmUvbWlwc19v cGNvZGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL2ZyYW1lLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9y ZWdudW0uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgogI2luY2x1ZGUgPG1hY2hpbmUvdGxz Lmg+CiAKICNpZmRlZiBEREIKQEAgLTI2NCw3ICsyNjUsNyBAQAogCSJyZXNlcnZlZCAyMSIsCiAJ InJlc2VydmVkIDIyIiwKIAkid2F0Y2giLAotCSJyZXNlcnZlZCAyNCIsCisJIm1hY2hpbmUgY2hl Y2siLAogCSJyZXNlcnZlZCAyNSIsCiAJInJlc2VydmVkIDI2IiwKIAkicmVzZXJ2ZWQgMjciLApA QCAtNjMyLDYgKzYzMywzMyBAQAogI2VuZGlmCiAJCXBhbmljKCJNQ0hFQ0tcbiIpOwogCQlicmVh azsKKwljYXNlIFRfTUNIRUNLICsgVF9VU0VSOgorCQl7CisJCQl1aW50MzJfdCBzdGF0dXMgPSBt aXBzX3JkX3N0YXR1cygpOworCisJCQlpZiAoc3RhdHVzICYgTUlQU19TUl9UUykgeworCQkJCS8q CisJCQkJICogTWFjaGluZSBDaGVjayBleGNlcHRpb24gY2F1c2VkIGJ5IFRMQgorCQkJCSAqIGRl dGVjdGluZyBhIG1hdGNoIGZvciBtdWx0aXBsZSBlbnRyaWVzLgorCQkJCSAqCisJCQkJICogQXR0 ZW1wdCB0byByZWNvdmVyIGJ5IGZsdXNoaW5nIHRoZSB1c2VyIFRMQgorCQkJCSAqIGFuZCByZXNl dHRpbmcgdGhlIHN0YXR1cyBiaXQuCisJCQkJICovCisJCQkJcHJpbnRmKCJNYWNoaW5lIENoZWNr IGluIFVzZXIgLSBEdXAgVExCIGVudHJ5LiAiCisJCQkJICAgICJSZWNvdmVyaW5nLi4uXG4iKTsK KwkJCQlwbWFwID0gJnAtPnBfdm1zcGFjZS0+dm1fcG1hcDsKKwkJCQl0bGJfaW52YWxpZGF0ZV9h bGxfdXNlcihwbWFwKTsKKwkJCQltaXBzX3dyX3N0YXR1cyhzdGF0dXMgJiB+TUlQU19TUl9UUyk7 CisKKwkJCQlyZXR1cm4gKHRyYXBmcmFtZS0+cGMpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBEREIK KwkJCQlrZGJfdHJhcCh0eXBlLCAwLCB0cmFwZnJhbWUpOworI2VuZGlmCisJCQkJcGFuaWMoIk1D SEVDS1xuIik7CisJCQl9CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBUX1RMQl9NT0Q6CiAJCS8qIGNo ZWNrIGZvciBrZXJuZWwgYWRkcmVzcyAqLwogCQlpZiAoS0VSTkxBTkQodHJhcGZyYW1lLT5iYWR2 YWRkcikpIHsKQEAgLTY5NCwxMCArNzIyLDIzIEBACiAKIAljYXNlIFRfVExCX0xEX01JU1MgKyBU X1VTRVI6CiAJCWZ0eXBlID0gVk1fUFJPVF9SRUFEOwotCQlnb3RvIGRvZmF1bHQ7CisJCWdvdG8g Y2hlY2tyZWZiaXQ7CiAKIAljYXNlIFRfVExCX1NUX01JU1MgKyBUX1VTRVI6CiAJCWZ0eXBlID0g Vk1fUFJPVF9XUklURTsKKworY2hlY2tyZWZiaXQ6CisJCS8qCisJCSAqIFdhcyB0aGlzIHRyYXAg Y2F1c2VkIGJ5IHRoZSBQVEVfVlIgYml0IG5vdCBiZWluZyBzZXQ/CisJCSAqLworCQlpZiAocG1h cF9lbXVsYXRlX3JlZmVyZW5jZWQoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwKKwkJICAgIHRyYXBm cmFtZS0+YmFkdmFkZHIpID09IDApIHsKKwkJCWlmICghdXNlcm1vZGUpIHsKKwkJCQlyZXR1cm4g KHRyYXBmcmFtZS0+cGMpOworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKwogZG9mYXVsdDoKIAkJ ewogCQkJdm1fb2Zmc2V0X3QgdmE7CkBAIC0xNDExLDkgKzE0NTIsMTYgQEAKIAlzdHJ1Y3QgcHJv YyAqcCA9IGN1cnByb2M7CiAKIAlwZGVwID0gKCYocC0+cF92bXNwYWNlLT52bV9wbWFwLnBtX3Nl Z3RhYlsodmEgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpXSkpOwotCWlmICgqcGRlcCkKLQkJ cHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKLQllbHNlCisJaWYg KCpwZGVwKSB7CisjaWYgVk1fTlJFU0VSVkxFVkVMID4gMAorCQlwZF9lbnRyeV90ICpwZGUgPSAm cGRlcFsodmEgPj4gUERSU0hJRlQpICYgKE5QREVQRyAtIDEpXTsKKworCQlpZiAocGRlX2lzX3N1 cGVycGFnZShwZGUpKQorCQkJcHRlcCA9IChwdF9lbnRyeV90ICopcGRlOworCQllbHNlCisjZW5k aWYgLyogVk1fTlJFU0VSVkxFVkVMID4gMCAqLworCQkJcHRlcCA9IHBtYXBfcHRlKCZwLT5wX3Zt c3BhY2UtPnZtX3BtYXAsIHZhKTsKKwl9IGVsc2UKIAkJcHRlcCA9IChwdF9lbnRyeV90ICopMDsK IAogCSpwZGVwcCA9IHBkZXA7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3RsYi5jIGIvc3lz L21pcHMvbWlwcy90bGIuYwotLS0gYS9zeXMvbWlwcy9taXBzL3RsYi5jCisrKyBiL3N5cy9taXBz L21pcHMvdGxiLmMKQEAgLTQwLDEwICs0MCwxNCBAQAogI2luY2x1ZGUgPG1hY2hpbmUvcHRlLmg+ CiAjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KIAorI2luY2x1ZGUgIm9wdF92bS5oIgorCiAjaWYg ZGVmaW5lZChDUFVfQ05NSVBTKQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxMjgKICNl bGlmIGRlZmluZWQoQ1BVX05MTSkKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJKDIwNDgg KyAxMjgpCisjZWxpZiBkZWZpbmVkKENQVV9DSEVSSSkKKyNkZWZpbmUJTUlQU19NQVhfVExCX0VO VFJJRVMJMTQ0CiAjZWxzZQogI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwk2NAogI2VuZGlm CkBAIC0xMDIsMjAgKzEwNiwzMSBAQAogewogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90 IHM7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOwogCi0J dmEgJj0gflBBR0VfTUFTSzsKKwlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZTApID09IFRM QkxPX1BURV9UT19JRFgocHRlMSkpLAorCSAgICAoIiVzOiBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6 ZXMgZG9uJ3QgbWF0Y2giLCBfX2Z1bmNfXykpOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlMCk7CisJbWFz ayA9ICh1bnNpZ25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxv d2VyIDEyIGJpdHMgKi8KKwlzaXplID0gbWFzayArIDE7CisKKwl2YSAmPSB+bWFzazsKIAogCXMg PSBpbnRyX2Rpc2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lE X01BU0s7CiAKIAltaXBzX3dyX2luZGV4KGkpOwotCW1pcHNfd3JfcGFnZW1hc2soMCk7CisJbWlw c193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VOVFJZKHZh LCAwKSk7CiAJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKIAltaXBzX3dyX2VudHJ5bG8xKHB0ZTEp OwogCXRsYl93cml0ZV9pbmRleGVkKCk7CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlw c193cl9wYWdlbWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKQEAgLTEzNyw3ICsxNTIs NiBAQAogCWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkKIAkJdGxiX2ludmFsaWRh dGVfb25lKGkpOwotCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOwogCWludHJfcmVzdG9yZShzKTsK IH0KQEAgLTI5OCwyOSArMzEyLDUzIEBACiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3Qg czsKIAlpbnQgaTsKKwl1aW50MzJfdCBwYWdlbWFzazsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNp emU7CisJcHRfZW50cnlfdCBwdGUwLCBwdGUxOworCisJLyogQ29tcHV0ZSB0aGUgcGFnZSBtYXNr IGFuZCBzaXplLiAqLworCXBhZ2VtYXNrID0gVExCTE9fUFRFX1RPX01BU0socHRlKTsKKwltYXNr ID0gKHVuc2lnbmVkIGxvbmcpcGFnZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93 ZXIgMTIgYml0cyAqLworCXNpemUgPSBtYXNrICsgMTsKIAotCXZhICY9IH5QQUdFX01BU0s7CisJ dmEgJj0gfm1hc2s7CiAJcHRlICY9IH5UTEJMT19TV0JJVFNfTUFTSzsKIAogCXMgPSBpbnRyX2Rp c2FibGUoKTsKIAlhc2lkID0gbWlwc19yZF9lbnRyeWhpKCkgJiBUTEJISV9BU0lEX01BU0s7CiAK LQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFnZW1hc2socGFnZW1hc2spOwogCW1p cHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgcG1hcF9hc2lkKHBtYXApKSk7CiAJdGxiX3By b2JlKCk7CiAJaSA9IG1pcHNfcmRfaW5kZXgoKTsKIAlpZiAoaSA+PSAwKSB7CiAJCXRsYl9yZWFk KCk7CisJCXB0ZTAgPSBtaXBzX3JkX2VudHJ5bG8wKCk7CisJCXB0ZTEgPSBtaXBzX3JkX2VudHJ5 bG8xKCk7CisJCUtBU1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9f SURYKHB0ZTApICYmCisJCSAgICBUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RP X0lEWChwdGUxKSksCisJCQkoIiVzOiBwdGUsIHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24n dCBtYXRjaCIsIF9fZnVuY19fKSk7CiAKLQkJaWYgKCh2YSAmIFBBR0VfU0laRSkgPT0gMCkgewor CQlpZiAoKHZhICYgc2l6ZSkgPT0gMCkgewogCQkJbWlwc193cl9lbnRyeWxvMChwdGUpOworCQkJ aWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJCS8qIFN1cGVycGFnZSAqLworCQkJCXB0 ZTEgPSAocHRlMSAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0Qp KTsKKwkJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZTEpOworCQkJfQogCQl9IGVsc2UgewogCQkJbWlw c193cl9lbnRyeWxvMShwdGUpOworCQkJaWYgKHBhZ2VtYXNrICYgflBBR0VfTUFTSykgeworCQkJ CS8qIFN1cGVycGFnZSAqLworCQkJCXB0ZTAgPSAocHRlMCAmIH4oUFRFX1ZSIHwgUFRFX0QpKSB8 IChwdGUgJiAoUFRFX1ZSIHwgUFRFX0QpKTsKKwkJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZTApOwor CQkJfQogCQl9CiAJCXRsYl93cml0ZV9pbmRleGVkKCk7CiAJfQogCiAJbWlwc193cl9lbnRyeWhp KGFzaWQpOworCW1pcHNfd3JfcGFnZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3N3dGNoLlMgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMK LS0tIGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TCisrKyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwpA QCAtMzE1LDM2ICszMTUsOTEgQEAKICAqIE5PVEU6IFRoaXMgaXMgaGFyZCBjb2RlZCB0byBVUEFH RVMgPT0gMi4KICAqIEFsc28sIHRoZXJlIHNob3VsZCBiZSBubyBUTEIgZmF1bHRzIGF0IHRoaXMg cG9pbnQuCiAgKi8KLQlNVEMwCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCU1U QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkjIFZQTiA9IHZhCiAJSEFaQVJEX0RFTEFZCiAJdGxi cAkJCQkJIyBwcm9iZSBWUE4KIAlIQVpBUkRfREVMQVkKLQltZmMwCXMwLCBNSVBTX0NPUF8wX1RM Ql9JTkRFWAorCW1mYzAJCXMwLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAogCUhBWkFSRF9ERUxBWQog Ci0JUFRSX0xJCXQxLCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5Ci0J Ymx0eglzMCwgZW50cnkwc2V0CisJIyBNSVBTX0tTRUcwX1NUQVJUICsgKDIgKiBpbmRleCAqIFBB R0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQxLCBNSVBTX0tTRUcwX1NU QVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwli bHR6CQlzMCwgaW52YWxfbnh0MQorI2Vsc2UKKwlibHR6CQlzMCwgZW50cnkwc2V0CisjZW5kaWYK IAlub3AKLQlzbGwJczAsIFBBR0VfU0hJRlQgKyAxCi0JYWRkdQl0MSwgczAKLQlNVEMwCXQxLCBN SVBTX0NPUF8wX1RMQl9ISQorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEs IHMwCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCiAJUFRFX01UQzAJemVybywgTUlQU19D T1BfMF9UTEJfTE8wCiAJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJ emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwogCUhBWkFSRF9ERUxBWQogCXRsYndpCiAJSEFa QVJEX0RFTEFZCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2Fpbgor CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKy8qCisgKiBXaXRoIGEgS1NUQUNLX1BBR0VfU0la RSBvZiAxNksgYW5kIFBBR0VfU0laRSBvZiA0SyBpdCBpcyBwb3NzaWJsZSB0aGF0CisgKiBhIHNl Y29uZCBUTEIgZW50cnkgaXMgY3VycmVudGx5IG1hcHBpbmcgdGhlIGtlcm5lbCB0aHJlYWQgc3Rh Y2sgYXMgYQorICogcmVndWxhciA0SyBzaXplZCBwYWdlKHMpLiBDaGVjayBmb3IgdGhpcyBjYXNl IGFuZCwgaWYgc28sIGludmFsaWRhdGUKKyAqIHRoYXQgVExCIGVudHJ5IGFzIHdlbGwuCisgKi8K KyNpZiAoUEFHRV9TSVpFICE9IDQwOTYpICYmIChLU1RBQ0tfUEFHRV9TSVpFICE9IDE2Mzg0KQor I2Vycm9yIFBBR0VfU0laRSBpcyBub3QgNEsgb3IgS1NUQUNLX1BBR0VfU0laRSBpcyBub3QgMTZL LgorI2VuZGlmCitpbnZhbF9ueHQxOgorCW1vdmUJCXYxLCB2MAorCVBUUl9BRERVCXYxLCBQQUdF X1NJWkUgKiAyCisJTVRDMAkJdjEsIE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJSEFa QVJEX0RFTEFZCisJdGxicAkJCQkJCSMgcHJvYmUgVlBOCisJSEFaQVJEX0RFTEFZCisJbWZjMAkJ czAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJSEFaQVJEX0RFTEFZCisKKwkjIE1JUFNfS1NFRzBf U1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8wX1RMQl9ISQorCVBU Ul9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKKwlibHR6 CQlzMCwgZW50cnkwc2V0CisJbm9wCisJc2xsCQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQURE VQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfSEkKKwlQVEVfTVRDMAl6ZXJvLCBN SVBTX0NPUF8wX1RMQl9MTzAKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlN VEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisJdGxid2kK KwlIQVpBUkRfREVMQVkKKyNlbmRpZgkvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogCiBlbnRyeTBz ZXQ6CisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKwlIQVpB UkRfREVMQVkKIC8qIFNNUCEhIC0gV29ya3Mgb25seSBmb3IgIHVuc2hhcmVkIFRMQiBjYXNlIC0g aS5lLiBubyB2LWNwdXMgKi8KLQltdGMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCQkjIFRM QiBlbnRyeSAjMAorCW10YzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX0lOREVYCSMgVExCIGVudHJ5 ICMwCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyB1 cHRlWzBdCiAJSEFaQVJEX0RFTEFZCiAJUFRFX01UQzAJYTIsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyB1cHRlWzFdCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlIQVpBUkRfREVMQVkKKwlsaQkJ dDEsIEtTVEFDS19UTEJNQVNLX01BU0sKKwlNVEMwCQl0MSwgTUlQU19DT1BfMF9UTEJfUEdfTUFT SwogCUhBWkFSRF9ERUxBWQorI2Vsc2UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N QVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIAl0bGJ3aQkJCQkJIyBzZXQgVExCIGVudHJ5ICMw CiAJSEFaQVJEX0RFTEFZCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCU1UQzAJCXplcm8s IE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNlbmRpZgogLyoKICAqIE5v dyBydW5uaW5nIG9uIG5ldyB1IHN0cnVjdC4KICAqLwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9wbWFwX21pcHM2NC5jIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5j CkBAIC0wLDAgKzEsNTUyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBSZWdlbnRzIG9m IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor ICogQ29weXJpZ2h0IChjKSAxOTk0IEpvaG4gUy4gRHlzb24KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgR3JlZW5tYW4KKyAqIEFsbCByaWdodHMg cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGV0ZXIgV2VtbQorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFsYW4gTC4gQ294IDxhbGNA Y3MucmljZS5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAy MDE1IFN0YWNleSBELiBTb24gPHNzb25ALi4uPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq CisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJl cmtlbGV5IGJ5CisgKiB0aGUgU3lzdGVtcyBQcm9ncmFtbWluZyBHcm91cCBvZiB0aGUgVW5pdmVy c2l0eSBvZiBVdGFoIENvbXB1dGVyCisgKiBTY2llbmNlIERlcGFydG1lbnQgYW5kIFdpbGxpYW0g Sm9saXR6IG9mIFVVTkVUIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5 cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVy IHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1 dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl cml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI RSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1Mg T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT SEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJ UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR VUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBD QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU LCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0gg REFNQUdFLgorICoKKyAqCWZyb206CUAoIylwbWFwLmMJNy43IChCZXJrZWxleSkJNS8xMi85MQor ICoJZnJvbTogc3JjL3N5cy9pMzg2L2kzODYvcG1hcC5jLHYgMS4yNTAuMi44IDIwMDAvMTEvMjEg MDA6MDk6MTQgcHMKKyAqCUpOUFI6IHBtYXAuYyx2IDEuMTEuMi4xIDIwMDcvMDgvMTYgMTE6NTE6 MDYgZ2lyaXNoCisgKi8KKworLyoKKyAqCU1hbmFnZXMgcGh5c2ljYWwgYWRkcmVzcyBtYXBzLgor ICoKKyAqCVNpbmNlIHRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlIGlzCisg KglhbHNvIHN0b3JlZCBieSB0aGUgbG9naWNhbCBhZGRyZXNzIG1hcHBpbmcgbW9kdWxlLAorICoJ dGhpcyBtb2R1bGUgbWF5IHRocm93IGF3YXkgdmFsaWQgdmlydHVhbC10by1waHlzaWNhbAorICoJ bWFwcGluZ3MgYXQgYWxtb3N0IGFueSB0aW1lLiAgSG93ZXZlciwgaW52YWxpZGF0aW9ucworICoJ b2YgdmlydHVhbC10by1waHlzaWNhbCBtYXBwaW5ncyBtdXN0IGJlIGRvbmUgYXMKKyAqCXJlcXVl c3RlZC4KKyAqCisgKglJbiBvcmRlciB0byBjb3BlIHdpdGggaGFyZHdhcmUgYXJjaGl0ZWN0dXJl cyB3aGljaAorICoJbWFrZSB2aXJ0dWFsLXRvLXBoeXNpY2FsIG1hcCBpbnZhbGlkYXRlcyBleHBl bnNpdmUsCisgKgl0aGlzIG1vZHVsZSBtYXkgZGVsYXkgaW52YWxpZGF0ZSBvciByZWR1Y2VkIHBy b3RlY3Rpb24KKyAqCW9wZXJhdGlvbnMgdW50aWwgc3VjaCB0aW1lIGFzIHRoZXkgYXJlIGFjdHVh bGx5CisgKgluZWNlc3NhcnkuICBUaGlzIG1vZHVsZSBpcyBnaXZlbiBmdWxsIGluZm9ybWF0aW9u IGFzCisgKgl0byB3aGljaCBwcm9jZXNzb3JzIGFyZSBjdXJyZW50bHkgdXNpbmcgd2hpY2ggbWFw cywKKyAqCWFuZCB0byB3aGVuIHBoeXNpY2FsIG1hcHMgbXVzdCBiZSBtYWRlIGNvcnJlY3QuCisg Ki8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisj aW5jbHVkZSAib3B0X2RkYi5oIgorI2luY2x1ZGUgIm9wdF9wbWFwLmgiCisjaW5jbHVkZSAib3B0 X3ZtLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4K KyNpbmNsdWRlIDxzeXMva3RyLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxz eXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tc2didWYuaD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXgu aD4KKyNpbmNsdWRlIDxzeXMvcGNwdS5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjaW5jbHVk ZSA8c3lzL3J3bG9jay5oPgorI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2lmZGVmIFNNUAorI2lu Y2x1ZGUgPHN5cy9zbXAuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2NwdXNldC5oPgorI2VuZGlm CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy92bW1ldGVyLmg+CisKKyNp ZmRlZiBEREIKKyNpbmNsdWRlIDxkZGIvZGRiLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZtL3Zt Lmg+CisjaW5jbHVkZSA8dm0vdm1fcGFyYW0uaD4KKyNpbmNsdWRlIDx2bS92bV9rZXJuLmg+Cisj aW5jbHVkZSA8dm0vdm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1ZGUg PHZtL3ZtX29iamVjdC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZt L3ZtX3BhZ2VvdXQuaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlci5oPgorI2luY2x1ZGUgPHZtL3Zt X3JhZGl4Lmg+CisjaW5jbHVkZSA8dm0vdm1fcmVzZXJ2Lmg+CisjaW5jbHVkZSA8dm0vdW1hLmg+ CisKKyNpbmNsdWRlIDxtYWNoaW5lL2NhY2hlLmg+CisjaW5jbHVkZSA8bWFjaGluZS9tZF92YXIu aD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgorCisjdW5kZWYgUE1BUF9ERUJVRworCisjaWYg IWRlZmluZWQoRElBR05PU1RJQykKKyNkZWZpbmUJUE1BUF9JTkxJTkUgX19pbmxpbmUKKyNlbHNl CisjZGVmaW5lCVBNQVBfSU5MSU5FCisjZW5kaWYKKworLy8gI2RlZmluZSBQVl9TVEFUUworI2lm ZGVmIFBWX1NUQVRTCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB4IDsgfSB3aGlsZSAoMCkKKyNl bHNlCisjZGVmaW5lIFBWX1NUQVQoeCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZp bmUJcGFfaW5kZXgocGEpCSgocGEpID4+IFBEUlNISUZUKQorI2RlZmluZQlwYV90b19wdmgocGEp CSgmcHZfdGFibGVbcGFfaW5kZXgocGEpXSkKKworI2RlZmluZQlOUFZfTElTVF9MT0NLUwlNQVhD UFUKKworI2RlZmluZQlQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSkJXAorCQkoJnB2X2xpc3RfbG9j a3NbcGFfaW5kZXgocGEpICUgTlBWX0xJU1RfTE9DS1NdKQorCisjZGVmaW5lCUNIQU5HRV9QVl9M SVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpCWRvIHsJXAorCXN0cnVjdCByd2xvY2sgKipfbG9j a3AgPSAobG9ja3ApOwkJXAorCXN0cnVjdCByd2xvY2sgKl9uZXdfbG9jazsJCQlcCisJCQkJCQkJ XAorCV9uZXdfbG9jayA9IFBIWVNfVE9fUFZfTElTVF9MT0NLKHBhKTsJCVwKKwlpZiAoX25ld19s b2NrICE9ICpfbG9ja3ApIHsJCQlcCisJCWlmICgqX2xvY2twICE9IE5VTEwpCQkJXAorCQkJcndf d3VubG9jaygqX2xvY2twKTsJCVwKKwkJKl9sb2NrcCA9IF9uZXdfbG9jazsJCQlcCisJCSByd193 bG9jaygqX2xvY2twKTsJCQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hB TkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKQlcCisJCUNIQU5HRV9QVl9MSVNU X0xPQ0tfVE9fUEhZUyhsb2NrcCwgVk1fUEFHRV9UT19QSFlTKG0pKQorCisjZGVmaW5lCVJFTEVB U0VfUFZfTElTVF9MT0NLKGxvY2twKQkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9 IChsb2NrcCk7CQlcCisJCQkJCQkJXAorCWlmICgqX2xvY2twICE9IE5VTEwpIHsJCQkJXAorCQly d193dW5sb2NrKCpfbG9ja3ApOwkJCVwKKwkJKl9sb2NrcCA9IE5VTEw7CQkJCVwKKwl9CQkJCQkJ XAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKQlcCisJ CVBIWVNfVE9fUFZfTElTVF9MT0NLKFZNX1BBR0VfVE9fUEhZUyhtKSkKKworLyoKKyAqIEdldCBQ REVzIGFuZCBQVEVzIGZvciB1c2VyL2tlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KKyNkZWZpbmUJ cG1hcF9zZWdfaW5kZXgodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEpKQorI2Rl ZmluZQlwbWFwX3BkZV9pbmRleCh2KQkoKCh2KSA+PiBQRFJTSElGVCkgJiAoTlBERVBHIC0gMSkp CisjZGVmaW5lCXBtYXBfcHRlX2luZGV4KHYpCSgoKHYpID4+IFBBR0VfU0hJRlQpICYgKE5QVEVQ RyAtIDEpKQorI2RlZmluZQlwbWFwX3BkZV9waW5kZXgodikJKCh2KSA+PiBQRFJTSElGVCkKKwor I2RlZmluZQlOVVBERQkJCShOUERFUEcgKiBOUERFUEcpCisjZGVmaW5lCU5VU0VSUEdUQkxTCQko TlVQREUgKyBOUERFUEcpCisKKyNkZWZpbmUJaXNfa2VybmVsX3BtYXAoeCkJKCh4KSA9PSBrZXJu ZWxfcG1hcCkKKworc3RydWN0IHBtYXAga2VybmVsX3BtYXBfc3RvcmU7CitwZF9lbnRyeV90ICpr ZXJuZWxfc2VnbWFwOworCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2F2YWlsOwkvKiBWQSBvZiBmaXJz dCBhdmFpbCBwYWdlIChhZnRlciBrZXJuZWwgYnNzKSAqLwordm1fb2Zmc2V0X3QgdmlydHVhbF9l bmQ7CS8qIFZBIG9mIGxhc3QgYXZhaWwgcGFnZSAoZW5kIG9mIGtlcm5lbCBBUykgKi8KKworc3Rh dGljIGludCBua3B0OwordW5zaWduZWQgcG1hcF9tYXhfYXNpZDsJCS8qIG1heCBBU0lEIHN1cHBv cnRlZCBieSB0aGUgc3lzdGVtICovCisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm0sIE9JRF9BVVRP LCBwbWFwLCBDVExGTEFHX1JELCAwLCAiVk0vcG1hcCBwYXJhbWV0ZXJzIik7CitzdGF0aWMgaW50 IHBnX3NwX2VuYWJsZWQgPSAwOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBnX3Bz X2VuYWJsZWQsIENUTEZMQUdfUkRUVU4gfCBDVExGTEFHX05PRkVUQ0gsCisgICAgJnBnX3NwX2Vu YWJsZWQsIDAsICJBcmUgbGFyZ2UgcGFnZSBtYXBwaW5ncyBlbmFibGVkPyIpOworCisjZGVmaW5l CVBNQVBfQVNJRF9SRVNFUlZFRAkwCisKK3ZtX29mZnNldF90IGtlcm5lbF92bV9lbmQgPSBWTV9N SU5fS0VSTkVMX0FERFJFU1M7CisKK3N0YXRpYyB2b2lkIHBtYXBfYXNpZF9hbGxvYyhwbWFwX3Qg cG1hcCk7CisKK3N0YXRpYyBzdHJ1Y3Qgcndsb2NrX3BhZGFsaWduIHB2aF9nbG9iYWxfbG9jazsK KworLyoKKyAqIERhdGEgZm9yIHRoZSBwdiBlbnRyeSBhbGxvY2F0aW9uIG1lY2hhbmlzbQorICov CitzdGF0aWMgVEFJTFFfSEVBRChwY2gsIHB2X2NodW5rKSBwdl9jaHVua3MgPSBUQUlMUV9IRUFE X0lOSVRJQUxJWkVSKHB2X2NodW5rcyk7CitzdGF0aWMgc3RydWN0IG10eCBwdl9jaHVua3NfbXV0 ZXg7CitzdGF0aWMgc3RydWN0IHJ3bG9jayBwdl9saXN0X2xvY2tzW05QVl9MSVNUX0xPQ0tTXTsK K3N0YXRpYyBzdHJ1Y3QgbWRfcGFnZSAqcHZfdGFibGU7CisKK3N0YXRpYyB2b2lkIGZyZWVfcHZf Y2h1bmsoc3RydWN0IHB2X2NodW5rICpwYyk7CitzdGF0aWMgdm9pZCBmcmVlX3B2X2VudHJ5KHBt YXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2KTsKK3N0YXRpYyBwdl9lbnRyeV90IGdldF9wdl9lbnRy eShwbWFwX3QgcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3Qg cmVjbGFpbV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2Nr cCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgcHZfZW50cnlfdCBwbWFwX3B2aF9yZW1v dmUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsCisgICAgdm1fb2Zmc2V0X3QgdmEp Oworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBp bmRleCwgaW50IHJlcSk7CitzdGF0aWMgdm1fcGFnZV90IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2Vk KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICB2bV9wYWdlX3QgbSwgdm1fcHJvdF90 IHByb3QsIHZtX3BhZ2VfdCBtcHRlLCAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2 b2lkIHJlc2VydmVfcHZfZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwKKyAgICBzdHJ1 Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX2RlbW90ZV9wZGUocG1h cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpOworc3RhdGljIGJvb2xl YW5fdCBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs CisgICAgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm1f cGFnZV90IHBtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZW50ZXJfcGRlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgdm1fcHJvdF90IHBy b3QsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3B2X2RlbW90ZV9w ZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVj dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfcHZfaW5zZXJ0X3BkZShw bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3 bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfcHJvbW90ZV9wZGUocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKips b2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBw dF9lbnRyeV90IG5ld3B0ZSk7CitzdGF0aWMgX19pbmxpbmUgaW50IHBtYXBfaW5zZXJ0X3B0X3Bh Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKTsKK3N0YXRpYyBfX2lubGluZSB2bV9wYWdl X3QgcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworc3Rh dGljIHZvaWQgcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2 bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBw bWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zmc2V0X3Qg c3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor c3RhdGljIGludCBwbWFwX3JlbW92ZV9wdGUoc3RydWN0IHBtYXAgKnBtYXAsIHB0X2VudHJ5X3Qg KnB0cSwgdm1fb2Zmc2V0X3QgdmEsCisgICAgcGRfZW50cnlfdCBwdGVwZGUsIHN0cnVjdCBzcGds aXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF9yZW1v dmVfcGFnZShzdHJ1Y3QgcG1hcCAqcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHNw Z2xpc3QgKmZyZWUpOworc3RhdGljIGJvb2xlYW5fdCBwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnko cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgcnds b2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcF90IHBtYXApOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2Uo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKK3N0YXRpYyB2b2lkIF9wbWFwX3Vud2lyZV9w dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICBzdHJ1Y3Qg c3BnbGlzdCAqZnJlZSk7CisKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3B0ZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRp YyB2bV9wYWdlX3QgX3BtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHVuc2lnbmVkIHB0ZXBpbmRl eCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIGludCBwbWFwX3VudXNlX3B0 KHBtYXBfdCwgdm1fb2Zmc2V0X3QsIHBkX2VudHJ5X3QsIHN0cnVjdCBzcGdsaXN0ICopOworc3Rh dGljIHB0X2VudHJ5X3QgaW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vz cywgdm1fcHJvdF90IHByb3QpOworCitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZV9h Y3Rpb24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hY3Rp b24odm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHBtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQg KmFyZyk7CisKKy8qCisgKiBQYWdlIHRhYmxlIGVudHJ5IGxvb2t1cCByb3V0aW5lcy4KKyAqLwor CisvKiBSZXR1cm4gYSBzZWdtZW50IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9zZWdtYXAocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCisJcmV0dXJuICgmcG1hcC0+cG1fc2VndGFiW3Bt YXBfc2VnX2luZGV4KHZhKV0pOworfQorCisvKiBSZXR1cm4gYSBwYWdlIGRpcmVjdG9yeSBlbnRy eSBmb3IgZ2l2ZW4gc2VnbWVudCB0YWJsZSAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyBf X2lubGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRwZV90b19wZGUocGRfZW50cnlfdCAqcGRwZSwg dm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gKHBkX2VudHJ5 X3QgKikqcGRwZTsKKwlyZXR1cm4gKCZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXSk7Cit9CisKKy8q IFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh ZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgorcG1hcF9wZGUocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkcGU7CisKKwlwZHBlID0g cG1hcF9zZWdtYXAocG1hcCwgdmEpOworCWlmICgqcGRwZSA9PSBOVUxMKQorCQlyZXR1cm4gKE5V TEwpOworCisJcmV0dXJuIChwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHZhKSk7Cit9CisKKy8qIFJl dHVybiBhIHBhZ2UgdGFibGUgZW50cnkgZm9yIGdpdmVuIHBhZ2UgZGlyZWN0b3J5ICYgdmlydHVh bCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QgKgorcG1hcF9wZGVfdG9f cHRlKHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRl OworCisJcHRlID0gKHB0X2VudHJ5X3QgKikqcGRlOworCXJldHVybiAoJnB0ZVtwbWFwX3B0ZV9p bmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRyeSBmb3IgZ2l2ZW4g cG1hcCAmIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3B0X2VudHJ5X3QgKgorcG1hcF9wdGUocG1hcF90 IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IHBt YXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKQorCQly ZXR1cm4gKE5VTEwpOworCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpIHsKKwkJcmV0dXJuICgo cHRfZW50cnlfdCAqKXBkZSk7CisJfSBlbHNlCisJCXJldHVybiAocG1hcF9wZGVfdG9fcHRlKHBk ZSwgdmEpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRf aW5jKHBtYXBfdCBwbWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCArPSBjb3VudDsKK30K Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXBfdCBw bWFwLCBpbnQgY291bnQpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwlLQVNTRVJUKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ID49IGNvdW50LAorCSAgICAo InBtYXAgJXAgcmVzaWRlbnQgY291bnQgdW5kZXJmbG93ICVsZCAlZCIsIHBtYXAsCisJICAgIHBt YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50LCBjb3VudCkpOworCXBtYXAtPnBtX3N0YXRzLnJl c2lkZW50X2NvdW50IC09IGNvdW50OworfQorCisvKgorICogQWxsb2NhdGUgc29tZSB3aXJlZCBt ZW1vcnkgYmVmb3JlIHRoZSB2aXJ0dWFsIG1lbW9yeSBzeXN0ZW0gaXMKKyAqIGJvb3RzdHJhcHBl ZC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKQor eworCXZtX3BhZGRyX3QgYmFua19zaXplLCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCXNpemUg PSByb3VuZF9wYWdlKHNpemUpOworCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2 YWlsWzBdOworCXdoaWxlIChzaXplID4gYmFua19zaXplKSB7CisJCWludCBpOworCisJCWZvciAo aSA9IDA7IHBoeXNfYXZhaWxbaSArIDJdOyBpICs9IDIpIHsKKwkJCXBoeXNfYXZhaWxbaV0gPSBw aHlzX2F2YWlsW2kgKyAyXTsKKwkJCXBoeXNfYXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpICsg M107CisJCX0KKwkJcGh5c19hdmFpbFtpXSA9IDA7CisJCXBoeXNfYXZhaWxbaSArIDFdID0gMDsK KwkJaWYgKCFwaHlzX2F2YWlsWzBdKQorCQkJcGFuaWMoInBtYXBfc3RlYWxfbWVtb3J5OiBvdXQg b2YgbWVtb3J5Iik7CisJCWJhbmtfc2l6ZSA9IHBoeXNfYXZhaWxbMV0gLSBwaHlzX2F2YWlsWzBd OworCX0KKworCXBhID0gcGh5c19hdmFpbFswXTsKKwlwaHlzX2F2YWlsWzBdICs9IHNpemU7CisJ dmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBhKTsKKwliemVybygoY2FkZHJfdCl2YSwgc2l6ZSk7 CisJcmV0dXJuICh2YSk7Cit9CisKKy8qCisgKiBCb290c3RyYXAgdGhlIHN5c3RlbSBlbm91Z2gg dG8gcnVuIHdpdGggdmlydHVhbCBtZW1vcnkuICBUaGlzCisgKiBhc3N1bWVzIHRoYXQgdGhlIHBo eXNfYXZhaWwgYXJyYXkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitw bWFwX2NyZWF0ZV9rZXJuZWxfcGFnZXRhYmxlKHZvaWQpCit7CisJaW50IGksIGo7CisJdm1fb2Zm c2V0X3QgcHRhZGRyOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1f b2Zmc2V0X3QgcGRhZGRyOworCWludCBucHQsIG5wZGU7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNl Z21lbnQgdGFibGUgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlrZXJuZWxfc2VnbWFwID0gKHBkX2Vu dHJ5X3QgKilwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUpOworCisJLyoKKwkgKiBBbGxvY2F0 ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwKKwkgKi8KKwlucGRlID0g aG93bWFueShOS1BULCBOUERFUEcpOworCXBkYWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5KFBBR0Vf U0laRSAqIG5wZGUpOworCW5rcHQgPSBOS1BUOworCXB0YWRkciA9IHBtYXBfc3RlYWxfbWVtb3J5 KFBBR0VfU0laRSAqIG5rcHQpOworCisJLyoKKwkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5 IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwgYml0IGluIHRoZQorCSAqIHRyYW5zbGF0aW9uIGxvb2th c2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LiBUaHVzIGludmFsaWQKKwkgKiBlbnRy eXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuIEVudHJ5IExPIGFuZCBFbnRy eSBISQorCSAqIEcgYml0cyBhcmUgYW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsIHByb2R1Y2UgYSBn bG9iYWwgYml0IHRvIHN0b3JlCisJICogaW4gdGhlIHRsYi4KKwkgKi8KKwlmb3IgKGkgPSAwLCBw dGUgPSAocHRfZW50cnlfdCAqKXB0YWRkcjsgaSA8IChua3B0ICogTlBURVBHKTsgaSsrLCBwdGUr KykKKwkJKnB0ZSA9IFBURV9HOworCisJZm9yIChpID0gMCwgIG5wdCA9IG5rcHQ7IG5wdCA+IDA7 IGkrKykgeworCQlrZXJuZWxfc2VnbWFwW2ldID0gKHBkX2VudHJ5X3QpKHBkYWRkciArIGkgKiBQ QUdFX1NJWkUpOworCQlwZGUgPSAocGRfZW50cnlfdCAqKWtlcm5lbF9zZWdtYXBbaV07CisKKwkJ Zm9yIChqID0gMDsgaiA8IE5QREVQRyAmJiBucHQgPiAwOyBqKyssIG5wdC0tKQorCQkJcGRlW2pd ID0gKHBkX2VudHJ5X3QpKHB0YWRkciArIChpICogTlBERVBHICsgaikgKgorCQkJICAgIFBBR0Vf U0laRSk7CisJfQorCisJUE1BUF9MT0NLX0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5lbF9wbWFw LT5wbV9zZWd0YWIgPSBrZXJuZWxfc2VnbWFwOworCUNQVV9GSUxMKCZrZXJuZWxfcG1hcC0+cG1f YWN0aXZlKTsKKwlUQUlMUV9JTklUKCZrZXJuZWxfcG1hcC0+cG1fcHZjaHVuayk7CisJa2VybmVs X3BtYXAtPnBtX2FzaWRbMF0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwlrZXJuZWxfcG1h cC0+cG1fYXNpZFswXS5nZW4gPSAwOworCWtlcm5lbF92bV9lbmQgKz0gbmtwdCAqIE5QVEVQRyAq IFBBR0VfU0laRTsKK30KKwordm9pZAorcG1hcF9ib290c3RyYXAodm9pZCkKK3sKKwlpbnQgaTsK KworCS8qIFNvcnQuICovCithZ2FpbjoKKwlmb3IgKGkgPSAwOyBwaHlzX2F2YWlsW2kgKyAxXSAh PSAwOyBpICs9IDIpIHsKKwkJLyoKKwkJICogS2VlcCB0aGUgbWVtb3J5IGFsaWduZWQgb24gcGFn ZSBib3VuZGFyeS4KKwkJICovCisJCXBoeXNfYXZhaWxbaV0gPSByb3VuZF9wYWdlKHBoeXNfYXZh aWxbaV0pOworCQlwaHlzX2F2YWlsW2kgKyAxXSA9IHRydW5jX3BhZ2UocGh5c19hdmFpbFtpICsg MV0pOworCisJCWlmIChpIDwgMikKKwkJCWNvbnRpbnVlOworCQlpZiAocGh5c19hdmFpbFtpIC0g Ml0gPiBwaHlzX2F2YWlsW2ldKSB7CisJCQl2bV9wYWRkcl90IHB0ZW1wWzJdOworCisJCQlwdGVt cFswXSA9IHBoeXNfYXZhaWxbaSArIDBdOworCQkJcHRlbXBbMV0gPSBwaHlzX2F2YWlsW2kgKyAx XTsKKworCQkJcGh5c19hdmFpbFtpICsgMF0gPSBwaHlzX2F2YWlsW2kgLSAyXTsKKwkJCXBoeXNf YXZhaWxbaSArIDFdID0gcGh5c19hdmFpbFtpIC0gMV07CisKKwkJCXBoeXNfYXZhaWxbaSAtIDJd ID0gcHRlbXBbMF07CisJCQlwaHlzX2F2YWlsW2kgLSAxXSA9IHB0ZW1wWzFdOworCQkJZ290byBh Z2FpbjsKKwkJfQorCX0KKworCS8qCisJICogQ29weSB0aGUgcGh5c19hdmFpbFtdIGFycmF5IGJl Zm9yZSB3ZSBzdGFydCBzdGVhbGluZyBtZW1vcnkgZnJvbSBpdC4KKwkgKi8KKwlmb3IgKGkgPSAw OyBwaHlzX2F2YWlsW2kgKyAxXSAhPSAwOyBpICs9IDIpIHsKKwkJcGh5c21lbV9kZXNjW2ldID0g cGh5c19hdmFpbFtpXTsKKwkJcGh5c21lbV9kZXNjW2kgKyAxXSA9IHBoeXNfYXZhaWxbaSArIDFd OworCX0KKworCU1heG1lbSA9IGF0b3AocGh5c19hdmFpbFtpIC0gMV0pOworCisJaWYgKGJvb3R2 ZXJib3NlKSB7CisJCXByaW50ZigiUGh5c2ljYWwgbWVtb3J5IGNodW5rKHMpOlxuIik7CisJCWZv ciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkJdm1fcGFkZHJf dCBzaXplOworCisJCQlzaXplID0gcGh5c19hdmFpbFtpICsgMV0gLSBwaHlzX2F2YWlsW2ldOwor CQkJcHJpbnRmKCIlIzA4anggLSAlIzA4angsICVqdSBieXRlcyAoJWp1IHBhZ2VzKVxuIiwKKwkJ CSAgICAodWludG1heF90KSBwaHlzX2F2YWlsW2ldLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf YXZhaWxbaSArIDFdIC0gMSwKKwkJCSAgICAodWludG1heF90KSBzaXplLCAodWludG1heF90KSBz aXplIC8gUEFHRV9TSVpFKTsKKwkJfQorCQlwcmludGYoIk1heG1lbSBpcyAweCUwanhcbiIsIHB0 b2EoKHVpbnRtYXhfdClNYXhtZW0pKTsKKwl9CisJLyoKKwkgKiBTdGVhbCB0aGUgbWVzc2FnZSBi dWZmZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeS4KKwkgKi8KKwltc2didWZwID0gKHN0 cnVjdCBtc2didWYgKilwbWFwX3N0ZWFsX21lbW9yeShtc2didWZzaXplKTsKKwltc2didWZpbml0 KG1zZ2J1ZnAsIG1zZ2J1ZnNpemUpOworCisJLyoKKwkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4g VGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0VfU0laRSAqIDIpIHNvIGl0 IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJICovCisJa3N0YWNrMCA9 IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgICsgS1NUQUNLX0dVQVJEX1BBR0VTKSA8 PAorCSAgICBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNrMCwgKEtTVEFD S19QQUdFX1NJWkUgKiAyKSk7CisKKwl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tFUk5FTF9BRERS RVNTOworCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOworCisjaWZkZWYgU01Q CisJLyoKKwkgKiBTdGVhbCBzb21lIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byBtYXAgdGhlIHBj cHUgYXJlYS4KKwkgKi8KKwl2aXJ0dWFsX2F2YWlsID0gcm91bmR1cDIodmlydHVhbF9hdmFpbCwg UEFHRV9TSVpFICogMik7CisJcGNwdXAgPSAoc3RydWN0IHBjcHUgKil2aXJ0dWFsX2F2YWlsOwor CXZpcnR1YWxfYXZhaWwgKz0gUEFHRV9TSVpFICogMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0 aGUgd2lyZWQgVExCIGVudHJ5IG1hcHBpbmcgdGhlIHBjcHUgcmVnaW9uIGZvcgorCSAqIHRoZSBC U1AgYXQgJ3BjcHVwJy4gVXAgdW50aWwgdGhpcyBwb2ludCB3ZSB3ZXJlIG9wZXJhdGluZworCSAq IHdpdGggdGhlICdwY3B1cCcgZm9yIHRoZSBCU1AgcG9pbnRpbmcgdG8gYSB2aXJ0dWFsIGFkZHJl c3MKKwkgKiBpbiBLU0VHMCBzbyB0aGVyZSB3YXMgbm8gbmVlZCBmb3IgYSBUTEIgbWFwcGluZy4K KwkgKi8KKwltaXBzX3BjcHVfdGxiX2luaXQoUENQVV9BRERSKDApKTsKKworCWlmIChib290dmVy Ym9zZSkKKwkJcHJpbnRmKCJwY3B1IGlzIGF2YWlsYWJsZSBhdCB2aXJ0dWFsIGFkZHJlc3MgJXAu XG4iLCBwY3B1cCk7CisjZW5kaWYKKworCXBtYXBfY3JlYXRlX2tlcm5lbF9wYWdldGFibGUoKTsK KwlwbWFwX21heF9hc2lkID0gVk1OVU1fUElEUzsKKwltaXBzX3dyX2VudHJ5aGkoMCk7CisJbWlw c193cl9wYWdlbWFzaygwKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHB2IGxp c3QgbG9jay4KKwkgKi8KKwlyd19pbml0KCZwdmhfZ2xvYmFsX2xvY2ssICJwbWFwIHB2IGdsb2Jh bCIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHZtX3BhZ2UncyBtYWNoaW5lLWRlcGVuZGVu dCBmaWVsZHMuCisgKi8KK3ZvaWQKK3BtYXBfcGFnZV9pbml0KHZtX3BhZ2VfdCBtKQoreworCisJ VEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFU VFJfREVGQVVMVDsKK30KKworLyoKKyAqCUluaXRpYWxpemUgdGhlIHBtYXAgbW9kdWxlLgorICoJ Q2FsbGVkIGJ5IHZtX2luaXQsIHRvIGluaXRpYWxpemUgYW55IHN0cnVjdHVyZXMgdGhhdCB0aGUg cG1hcAorICoJc3lzdGVtIG5lZWRzIHRvIG1hcCB2aXJ0dWFsIG1lbW9yeS4KKyAqLwordm9pZAor cG1hcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJdm1fc2l6ZV90IHM7CisJaW50IHB2X25wZzsK KworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcHYgY2h1bmsgbGlzdCBtdXRleC4KKwkgKi8KKwlt dHhfaW5pdCgmcHZfY2h1bmtzX211dGV4LCAicG1hcCBwdiBjaHVuayBsaXN0IiwgTlVMTCwgTVRY X0RFRik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHBvb2wgb2YgcHYgbGlzdCBsb2Nrcy4K KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlBWX0xJU1RfTE9DS1M7IGkrKykKKwkJcndfaW5pdCgm cHZfbGlzdF9sb2Nrc1tpXSwgInB2IGxpc3QiKTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBz aXplIG9mIHRoZSBwdiBoZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCWZvciAoaSA9 IDA7IHBoeXNfYXZhaWxbaSArIDFdOyBpICs9IDIpOworCXB2X25wZyA9IHJvdW5kXzJtcGFnZShw aHlzX2F2YWlsWyhpIC0gMikgKyAxXSkgLyBOQlBEUjsKKworCS8qCisJICogQWxsb2NhdGUgbWVt b3J5IGZvciB0aGUgcHYgaGVhZCB0YWJsZSBmb3Igc3VwZXJwYWdlcy4KKwkgKi8KKwlzID0gKHZt X3NpemVfdCkocHZfbnBnICogc2l6ZW9mKHN0cnVjdCBtZF9wYWdlKSk7CisJcyA9IHJvdW5kX3Bh Z2Uocyk7CisJcHZfdGFibGUgPSAoc3RydWN0IG1kX3BhZ2UgKilrbWVtX21hbGxvYyhrZXJuZWxf YXJlbmEsIHMsCisJICAgIE1fV0FJVE9LIHwgTV9aRVJPKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHZf bnBnOyBpKyspCisJCVRBSUxRX0lOSVQoJnB2X3RhYmxlW2ldLnB2X2xpc3QpOworfQorCitzdGF0 aWMgU1lTQ1RMX05PREUoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwZGUsIENUTEZMQUdfUkQsIDAsCisg ICAgIjJNQiBwYWdlIG1hcHBpbmcgY291bnRlcnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3Bk ZV9kZW1vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgZGVtb3Rp b25zLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9kZW1vdGlvbnMsIDAsICIyTUIgcGFnZSBk ZW1vdGlvbnMiKTsKKworc3RhdGljIHVfbG9uZyBwbWFwX3BkZV9tYXBwaW5nczsKK1NZU0NUTF9V TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBtYXBwaW5ncywgQ1RMRkxBR19SRCwKKyAgICAm cG1hcF9wZGVfbWFwcGluZ3MsIDAsICIyTUIgcGFnZSBtYXBwaW5ncyIpOworCitzdGF0aWMgdV9s b25nIHBtYXBfcGRlX3BfZmFpbHVyZXM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURf QVVUTywgcF9mYWlsdXJlcywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcF9mYWlsdXJlcywg MCwgIjJNQiBwYWdlIHByb21vdGlvbiBmYWlsdXJlcyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBf cGRlX3Byb21vdGlvbnM7CitTWVNDVExfVUxPTkcoX3ZtX3BtYXBfcGRlLCBPSURfQVVUTywgcHJv bW90aW9ucywgQ1RMRkxBR19SRCwKKyAgICAmcG1hcF9wZGVfcHJvbW90aW9ucywgMCwgIjJNQiBw YWdlIHByb21vdGlvbnMiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgorICogTG93IGxldmVsIGhlbHBlciByb3V0aW5lcy4uLi4uCisgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZk ZWYJU01QCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBt YXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlpbnQJY3B1aWQs IGNwdSwgc2VsZjsKKwljcHVzZXRfdCBhY3RpdmVfY3B1czsKKworCXNjaGVkX3BpbigpOworCWlm IChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQlzbXBfcmVuZGV6dm91cyhOVUxMLCBmbiwgTlVM TCwgYXJnKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEZvcmNlIEFTSUQgdXBkYXRlIG9uIGluYWN0 aXZlIENQVXMgKi8KKwlDUFVfRk9SRUFDSChjcHUpIHsKKwkJaWYgKCFDUFVfSVNTRVQoY3B1LCAm cG1hcC0+cG1fYWN0aXZlKSkKKwkJCXBtYXAtPnBtX2FzaWRbY3B1XS5nZW4gPSAwOworCX0KKwlj cHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwkvKgorCSAqIFhYWDogYmFycmllci9sb2NraW5nIGZv ciBhY3RpdmU/CisJICoKKwkgKiBUYWtlIGEgc25hcHNob3Qgb2YgYWN0aXZlIGhlcmUsIGFueSBm dXJ0aGVyIGNoYW5nZXMgYXJlIGlnbm9yZWQuCisJICogdGxiIHVwZGF0ZS9pbnZhbGlkYXRlIHNo b3VsZCBiZSBoYXJtbGVzcyBvbiBpbmFjdGl2ZSBDUFVzCisJICovCisJYWN0aXZlX2NwdXMgPSBw bWFwLT5wbV9hY3RpdmU7CisJc2VsZiA9IENQVV9JU1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsK KwlDUFVfQ0xSKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCS8qIE9wdGltaXplIGZvciB0aGUgY2Fz ZSB3aGVyZSB0aGlzIGNwdSBpcyB0aGUgb25seSBhY3RpdmUgb25lICovCisJaWYgKENQVV9FTVBU WSgmYWN0aXZlX2NwdXMpKSB7CisJCWlmIChzZWxmKQorCQkJZm4oYXJnKTsKKwl9IGVsc2Ugewor CQlpZiAoc2VsZikKKwkJCUNQVV9TRVQoY3B1aWQsICZhY3RpdmVfY3B1cyk7CisJCXNtcF9yZW5k ZXp2b3VzX2NwdXMoYWN0aXZlX2NwdXMsIE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCX0KK291dDoK KwlzY2hlZF91bnBpbigpOworfQorI2Vsc2UgLyogIVNNUCAqLworc3RhdGljIF9faW5saW5lIHZv aWQKK3BtYXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwX3QgcG1hcCwgdm9pZCAoKmZuKSh2b2lk ICopLCB2b2lkICphcmcpCit7CisJaW50CWNwdWlkOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt YXApKSB7CisJCWZuKGFyZyk7CisJCXJldHVybjsKKwl9CisJY3B1aWQgPSBQQ1BVX0dFVChjcHVp ZCk7CisJaWYgKCFDUFVfSVNTRVQoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpKQorCQlwbWFwLT5w bV9hc2lkW2NwdWlkXS5nZW4gPSAwOworCWVsc2UKKwkJZm4oYXJnKTsKK30KKyNlbmRpZiAvKiBT TVAgKi8KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9hbGwocG1hcF90IHBtYXApCit7 CisKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwKKwkgICAgKHZvaWQgKCopKHZvaWQg KikpdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIsIHBtYXApOworfQorCitzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3BhZ2VfYXJnIHsKKwlwbWFwX3QgcG1hcDsKKwl2bV9vZmZzZXRfdCB2YTsKK307CisK K3N0YXRpYyB2b2lkCitwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQorewor CXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfaW52YWxp ZGF0ZV9hZGRyZXNzKHAtPnBtYXAsIHAtPnZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3QgcG1h cF9pbnZhbGlkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEg PSB2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3Bh Z2VfYWN0aW9uLCAmYXJnKTsKK30KKworc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcg eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHN2YTsKKwl2bV9vZmZzZXRfdCBldmE7Cit9 OworCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcp Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJf aW52YWxpZGF0ZV9yYW5nZShwLT5wbWFwLCBwLT5zdmEsIHAtPmV2YSk7Cit9CisKK3N0YXRpYyB2 b2lkCitwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg dm1fb2Zmc2V0X3QgZXZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYXJnIGFy ZzsKKworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcuc3ZhID0gc3ZhOworCWFyZy5ldmEgPSBldmE7 CisJcG1hcF9jYWxsX29uX2FjdGl2ZV9jcHVzKHBtYXAsIHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9h Y3Rpb24sICZhcmcpOworfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgeworCXBtYXBf dCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgcHRlOworfTsKKworc3RhdGlj IHZvaWQKK3BtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h cF91cGRhdGVfcGFnZV9hcmcgKnAgPSBhcmc7CisKKwl0bGJfdXBkYXRlKHAtPnBtYXAsIHAtPnZh LCBwLT5wdGUpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgcHRlKQoreworCXN0cnVjdCBwbWFwX3VwZGF0 ZV9wYWdlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJn LnB0ZSA9IHB0ZTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRhdGVf cGFnZV9hY3Rpb24sICZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlX2lu dmFsaWRhdGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBwdF9lbnRyeV90IG5ld3BkZSkK K3sKKworCWlmICghcHRlX2lzXzFtX3N1cGVycGFnZSgmbmV3cGRlKSkgeworCQkvKiBEZW1vdGlv bjogZmx1c2ggYSBzcGVjaWZpYyAybWIgcGFnZSBtYXBwaW5nLiAqLworCQl0bGJfaW52YWxpZGF0 ZV9yYW5nZShwbWFwLCAodmEgJiB+UERSTUFTSyksCisJCSAgICAodmEgJiB+UERSTUFTSykgKyBO QlBEUik7CisJfSBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX0cpKSB7CisJCS8qCisJ CSAqIFByb21vdGlvbjogZmx1c2ggZXZlcnkgNEtCIHBhZ2UgbWFwcGluZyBmcm9tIHRoZSBUTEIK KwkJICogYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZmx1c2ggaW5kaXZpZHVhbGx5Lgor CQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIocG1hcCk7CisJfSBlbHNlIHsKKwkJLyoK KwkJICogUHJvbW90aW9uOiBmbHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRM QiwKKwkJICogaW5jbHVkaW5nIGFueSBnbG9iYWwgKFBURV9HKSBtYXBwaW5ncy4KKwkJICovCisJ CXRsYl9pbnZhbGlkYXRlX2FsbCgpOworCX0KK30KKworc3RydWN0IHBtYXBfdXBkYXRlX3BkZV9h cmcgeworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXBkX2VudHJ5X3QgKnBkZTsK KwlwdF9lbnRyeV90IG5ld3BkZTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVf YWN0aW9uKHZvaWQgKmFjdCkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyAqYXJnID0g YWN0OworCisJcG1hcF91cGRhdGVfcGRlX2ludmFsaWRhdGUoYXJnLT5wbWFwLCBhcmctPnZhLCBh cmctPm5ld3BkZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfc3RvcmUocG1h cF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisKKwlwZGVf c3RvcmUocGRlLCBuZXdwZGUpOworfQorCisKKy8qCisgKiBDaGFuZ2UgdGhlIHBhZ2Ugc2l6ZSBm b3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gYSB3YXkgdGhhdAorICogcHJldmVu dHMgYW55IHBvc3NpYmlsaXR5IG9mIHRoZSBUTEIgZXZlciBoYXZpbmcgdHdvIGVudHJpZXMgdGhh dCBtYXAgdGhlCisgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB1c2luZyBkaWZmZXJlbnQgcGFnZSBz aXplcy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEsIHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBuZXdwZGUpCit7CisJc3Ry dWN0IHBtYXBfdXBkYXRlX3BkZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52 YSA9IHZhOworCWFyZy5wZGUgPSBwZGU7CisJYXJnLm5ld3BkZSA9IG5ld3BkZTsKKworCXBtYXBf dXBkYXRlX3BkZV9zdG9yZShwbWFwLCBwZGUsIG5ld3BkZSk7CisJcG1hcF9jYWxsX29uX2FjdGl2 ZV9jcHVzKHBtYXAsIHBtYXBfdXBkYXRlX3BkZV9hY3Rpb24sICZhcmcpOworfQorCisvKiAtLS0g Ki8KKworLyoKKyAqCVJvdXRpbmU6CXBtYXBfZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0 cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBn aXZlbiBtYXAvdmlydHVhbF9hZGRyZXNzIHBhaXIuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfZXh0 cmFjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOwor CXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCXBhID0gMDsKKwlQTUFQX0xP Q0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkZSkpIHsKKwkJcGEgPSBUTEJMT19QREVfVE9fUEEoKnBkZSkgfCAodmEgJiBQRFJN QVNLKTsKKwl9IGVsc2UgeworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCWlm IChwdGUpCisJCQlwYSA9IFRMQkxPX1BURV9UT19QQSgqcHRlKSB8ICh2YSAmIFBBR0VfTUFTSyk7 CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAocGEpOworfQorCisvKgorICoJUm91 dGluZToJcG1hcF9leHRyYWN0X2FuZF9ob2xkCisgKglGdW5jdGlvbjoKKyAqCQlBdG9taWNhbGx5 IGV4dHJhY3QgYW5kIGhvbGQgdGhlIHBoeXNpY2FsIHBhZ2UKKyAqCQl3aXRoIHRoZSBnaXZlbiBw bWFwIGFuZCB2aXJ0dWFsIGFkZHJlc3MgcGFpcgorICoJCWlmIHRoYXQgbWFwcGluZyBwZXJtaXRz IHRoZSBnaXZlbiBwcm90ZWN0aW9uLgorICovCit2bV9wYWdlX3QKK3BtYXBfZXh0cmFjdF9hbmRf aG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3Byb3RfdCBwcm90KQoreworCXBk X2VudHJ5X3QgKnBkZXA7CisJcHRfZW50cnlfdCBwdGUsICpwdGVwOworCXZtX3BhZGRyX3QgcGEs IHB0ZV9wYTsKKwl2bV9wYWdlX3QgbTsKKwl2bV9wYWRkcl90IHBkZV9wYTsKKworCXBhID0gMDsK KwltID0gTlVMTDsKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1hcF9wZGUo cG1hcCwgdmEpOworCWlmIChwZGVwICE9IE5VTEwgJiYgKnBkZXAgIT0gTlVMTCkgeworCQlpZiAo cGRlX2lzXzFtX3N1cGVycGFnZShwZGVwKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGVwLCBQVEVf Uk8pIHx8CisJCQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSB7CisJCQkJcGRlX3Bh ID0gVExCTE9fUERFX1RPX1BBKCpwZGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spOworCQkJ CWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwZGVfcGEsICZwYSkpCisJCQkJCWdvdG8g cmV0cnk7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwZGVfcGEpOworCQkJCXZtX3BhZ2VfaG9s ZChtKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwg dmEpOworCQkJaWYgKHB0ZXAgIT0gTlVMTCkgeworCQkJCXB0ZSA9ICpwdGVwOworCQkJCWlmIChw dGVfaXNfdmFsaWQoJnB0ZSkgJiYKKwkJCQkgICAgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8 CisJCQkJICAgIChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkpIHsKKwkJCQkJcHRlX3BhID0g VExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFw LCBwdGVfcGEsCisJCQkJCSAgICAmcGEpKQorCQkJCQkJZ290byByZXRyeTsKKwkJCQkJbSA9IFBI WVNfVE9fVk1fUEFHRShwdGVfcGEpOworCQkJCQl2bV9wYWdlX2hvbGQobSk7CisJCQkJfQorCQkJ fQorCQl9CisJfQorCVBBX1VOTE9DS19DT05EKHBhKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwly ZXR1cm4gKG0pOworfQorCisvKi0KKyAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKKyAqCUZ1bmN0 aW9uOgorICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCisg KgkJdmlydHVhbCBhZGRyZXNzLgorICovCit2bV9wYWRkcl90CitwbWFwX2tleHRyYWN0KHZtX29m ZnNldF90IHZhKQoreworCWludCBtYXBwZWQ7CisKKwkvKgorCSAqIEZpcnN0LCB0aGUgZGlyZWN0 LW1hcHBlZCByZWdpb25zLgorCSAqLworCWlmICh2YSA+PSBNSVBTX1hLUEhZU19TVEFSVCAmJiB2 YSA8IE1JUFNfWEtQSFlTX0VORCkKKwkJcmV0dXJuIChNSVBTX1hLUEhZU19UT19QSFlTKHZhKSk7 CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQor CQlyZXR1cm4gKE1JUFNfS1NFRzBfVE9fUEhZUyh2YSkpOworCisJaWYgKHZhID49IE1JUFNfS1NF RzFfU1RBUlQgJiYgdmEgPCBNSVBTX0tTRUcxX0VORCkKKwkJcmV0dXJuIChNSVBTX0tTRUcxX1RP X1BIWVModmEpKTsKKworCS8qCisJICogVXNlciB2aXJ0dWFsIGFkZHJlc3Nlcy4KKwkgKi8KKwlp ZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRf ZW50cnlfdCAqcHRlcDsKKworCQlpZiAoY3VycHJvYyAmJiBjdXJwcm9jLT5wX3Ztc3BhY2UpIHsK KwkJCXBkZXAgPSBwbWFwX3BkZSgmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7CisJ CQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJuICgwKTsKKwkJ CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChwdF9lbnRyeV90 ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAo dmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBkZXAsIHZh KTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEoKnB0ZXApIHwK KwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9CisJ fQorCisJLyoKKwkgKiBTaG91bGQgYmUga2VybmVsIHZpcnR1YWwgaGVyZSwgb3RoZXJ3aXNlIGZh aWwKKwkgKi8KKwltYXBwZWQgPSAodmEgPj0gTUlQU19LU0VHMl9TVEFSVCB8fCB2YSA8IE1JUFNf S1NFRzJfRU5EKTsKKwltYXBwZWQgPSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQg fHwgdmEgPCBNSVBTX1hLU0VHX0VORCk7CisJLyoKKwkgKiBLZXJuZWwgdmlydHVhbC4KKwkgKi8K KworCWlmIChtYXBwZWQpIHsKKwkJcGRfZW50cnlfdCAqcGRlcDsKKwkJcHRfZW50cnlfdCAqcHRl cDsKKworCQkvKiBJcyB0aGUga2VybmVsIHBtYXAgaW5pdGlhbGl6ZWQ/ICovCisJCWlmICghQ1BV X0VNUFRZKCZrZXJuZWxfcG1hcC0+cG1fYWN0aXZlKSkgeworCQkJLyogSXQncyBpbnNpZGUgdGhl IHZpcnR1YWwgYWRkcmVzcyByYW5nZSAqLworCQkJcGRlcCA9IHBtYXBfcGRlKGtlcm5lbF9wbWFw LCB2YSk7CisJCQlpZiAocGRlcCA9PSBOVUxMIHx8ICpwZGVwID09IE5VTEwpCisJCQkJcmV0dXJu ICgwKTsKKwkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJCQkJcHRlcCA9IChw dF9lbnRyeV90ICopcGRlcDsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAor CQkJCSAgICAodmEgJiBQRFJNQVNLKSk7CisJCQl9CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRl KHBkZXAsIHZhKTsKKwkJCWlmIChwdGVwKSB7CisJCQkJcmV0dXJuIChUTEJMT19QVEVfVE9fUEEo KnB0ZXApIHwKKwkJCQkgICAgKHZhICYgUEFHRV9NQVNLKSk7CisJCQl9CisJCX0KKwkJcmV0dXJu ICgwKTsKKwl9CisKKwlwYW5pYygiJXMgZm9yIHVua25vd24gYWRkcmVzcyBzcGFjZSAlcC4iLCBf X2Z1bmNfXywgKHZvaWQgKil2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBsZXZlbCBtYXBwaW5nIHJvdXRpbmVzLi4u Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisKKy8qLQorICogYWRkIGEgd2lyZWQgcGFnZSB0byB0aGUga3ZhCisgKi8KK3ZvaWQKK3BtYXBf a2VudGVyX2F0dHIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsIGludCBhdHRyKQorewor CXB0X2VudHJ5X3QgKnB0ZTsKKwlwdF9lbnRyeV90IG9wdGUsIG5wdGU7CisKKyNpZmRlZiBQTUFQ X0RFQlVHCisJcHJpbnRmKCJwbWFwX2tlbnRlcjogIHZhOiAlcCAtPiBwYTogJXBcbiIsICh2b2lk ICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisKKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdmEpOworCW9wdGUgPSAqcHRlOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0 ciB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9WQUxJRCB8IFBURV9HOworCXB0ZV9zdG9yZShwdGUs IG5wdGUpOworCWlmIChwdGVfaXNfdmFsaWQoJm9wdGUpICYmIG9wdGUgIT0gbnB0ZSkKKwkJcG1h cF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOworfQorCit2b2lkCitwbWFwX2tl bnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSkKK3sKKworCUtBU1NFUlQoaXNfY2Fj aGVhYmxlX21lbShwYSksCisJCSgicG1hcF9rZW50ZXI6IG1lbW9yeSBhdCAweCVseCBpcyBub3Qg Y2FjaGVhYmxlIiwgKHVfbG9uZylwYSkpOworCisJcG1hcF9rZW50ZXJfYXR0cih2YSwgcGEsIFBU RV9DX0NBQ0hFKTsKK30KKworLyotCisgKiByZW1vdmUgYSBwYWdlIGZyb20gdGhlIGtlcm5lbCBw YWdldGFibGVzCisgKi8KKyAvKiBQTUFQX0lOTElORSAqLyB2b2lkCitwbWFwX2tyZW1vdmUodm1f b2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCisJLyoKKwkgKiBXcml0ZSBiYWNr IGFsbCBjYWNoZXMgZnJvbSB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKKwkgKi8KKwltaXBzX2Rj YWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFKTsKKworCXB0ZSA9IHBtYXBfcHRl KGtlcm5lbF9wbWFwLCB2YSk7CisJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCXBtYXBfaW52YWxp ZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSk7Cit9CisKKy8qCisgKglVc2VkIHRvIG1hcCBhIHJh bmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyBpbnRvIGtlcm5lbAorICoJdmlydHVhbCBhZGRyZXNz IHNwYWNlLgorICoKKyAqCVRoZSB2YWx1ZSBwYXNzZWQgaW4gJyp2aXJ0JyBpcyBhIHN1Z2dlc3Rl ZCB2aXJ0dWFsIGFkZHJlc3MgZm9yCisgKgl0aGUgbWFwcGluZy4gQXJjaGl0ZWN0dXJlcyB3aGlj aCBjYW4gc3VwcG9ydCBhIGRpcmVjdC1tYXBwZWQKKyAqCXBoeXNpY2FsIHRvIHZpcnR1YWwgcmVn aW9uIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MKKyAqCXdpdGhpbiB0aGF0IHJl Z2lvbiwgbGVhdmluZyAnKnZpcnQnIHVuY2hhbmdlZC4gT3RoZXIKKyAqCWFyY2hpdGVjdHVyZXMg c2hvdWxkIG1hcCB0aGUgcGFnZXMgc3RhcnRpbmcgYXQgJyp2aXJ0JyBhbmQKKyAqCXVwZGF0ZSAn KnZpcnQnIHdpdGggdGhlIGZpcnN0IHVzYWJsZSBhZGRyZXNzIGFmdGVyIHRoZSBtYXBwZWQKKyAq CXJlZ2lvbi4KKyAqCisgKglVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZtX29mZnNldF90 CitwbWFwX21hcCh2bV9vZmZzZXRfdCAqdmlydCwgdm1fcGFkZHJfdCBzdGFydCwgdm1fcGFkZHJf dCBlbmQsIGludCBwcm90KQoreworCisJcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUKHN0YXJ0 KSk7Cit9CisKKy8qLQorICogQWRkIGEgbGlzdCBvZiB3aXJlZCBwYWdlcyB0byB0aGUga3ZhCisg KiB0aGlzIHJvdXRpbmUgaXMgb25seSB1c2VkIGZvciB0ZW1wb3JhcnkKKyAqIGtlcm5lbCBtYXBw aW5ncyB0aGF0IGRvIG5vdCBuZWVkIHRvIGhhdmUKKyAqIHBhZ2UgbW9kaWZpY2F0aW9uIG9yIHJl ZmVyZW5jZXMgcmVjb3JkZWQuCisgKiBOb3RlIHRoYXQgb2xkIG1hcHBpbmdzIGFyZSBzaW1wbHkg d3JpdHRlbgorICogb3Zlci4gIFRoZSBwYWdlICptdXN0KiBiZSB3aXJlZC4KKyAqLwordm9pZAor cG1hcF9xZW50ZXIodm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCAqbSwgaW50IGNvdW50KQorewor CWludCBpOworCXZtX29mZnNldF90IG9yaWd2YSA9IHZhOworCisJZm9yIChpID0gMDsgaSA8IGNv dW50OyBpKyspIHsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKG1baV0pOworCQlwbWFwX2tlbnRlcih2 YSwgVk1fUEFHRV9UT19QSFlTKG1baV0pKTsKKwkJdmEgKz0gUEFHRV9TSVpFOworCX0KKworCW1p cHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KG9yaWd2YSwgUEFHRV9TSVpFKmNvdW50KTsKK30K KworLyotCisgKiBUaGlzIHJvdXRpbmUgamVya3MgcGFnZSBtYXBwaW5ncyBmcm9tIHRoZQorICog a2VybmVsIC0tIGl0IGlzIG1lYW50IG9ubHkgZm9yIHRlbXBvcmFyeSBtYXBwaW5ncy4KKyAqLwor dm9pZAorcG1hcF9xcmVtb3ZlKHZtX29mZnNldF90IHZhLCBpbnQgY291bnQpCit7CisJcHRfZW50 cnlfdCAqcHRlOworCXZtX29mZnNldF90IG9yaWd2YTsKKworCWlmIChjb3VudCA8IDEpCisJCXJl dHVybjsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFHRV9TSVpFICogY291 bnQpOworCW9yaWd2YSA9IHZhOworCWRvIHsKKwkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhKTsKKwkJcHRlX3N0b3JlKHB0ZSwgUFRFX0cpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfSB3 aGlsZSAoLS1jb3VudCA+IDApOworCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShrZXJuZWxfcG1hcCwg b3JpZ3ZhLCB2YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqIFBhZ2UgdGFibGUgcGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLi4u Li4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9mcmVlX3plcm9fcGFnZXMoc3RydWN0IHNwZ2xp c3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG07CisKKwl3aGlsZSAoKG0gPSBTTElTVF9GSVJTVChm cmVlKSkgIT0gTlVMTCkgeworCQlTTElTVF9SRU1PVkVfSEVBRChmcmVlLCBwbGlua3Mucy5zcyk7 CisJCS8qIFByZXNlcnZlIHRoZSBwYWdlJ3MgUEdfWkVSTyBzZXR0aW5nLiAqLworCQl2bV9wYWdl X2ZyZWVfdG9xKG0pOworCX0KK30KKworLyotCisgKiBTY2hlZHVsZSB0aGUgc3BlY2lmaWVkIHVu dXNlZCBwYWdlIHRhYmxlIHBhZ2UgdG8gYmUgZnJlZWQuICBTcGVjaWZpY2FsbHkKKyAqIGFkZCB0 aGUgcGFnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgcGFnZXMgdGhhdCB3aWxsIGJlIHJlbGVh c2VkIHRvIHRoZQorICogcGh5c2ljYWwgbWVtb3J5IG1hbmFnZXIgYWZ0ZXIgdGhlIFRMQiBoYXMg YmVlbiB1cGRhdGVkLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9hZGRfZGVsYXll ZF9mcmVlX2xpc3Qodm1fcGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlLAorICAgIGJvb2xl YW5fdCBzZXRfUEdfWkVSTykKK3sKKworCWlmIChzZXRfUEdfWkVSTykKKwkJbS0+ZmxhZ3MgfD0g UEdfWkVSTzsKKwllbHNlCisJCW0tPmZsYWdzICY9IH5QR19aRVJPOworCVNMSVNUX0lOU0VSVF9I RUFEKGZyZWUsIG0sIHBsaW5rcy5zLnNzKTsKK30KKworLyoKKyAqIEluc2VydHMgdGhlIHNwZWNp ZmllZCBwYWdlIHRhYmxlIHBhZ2UgaW50byB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9u CisgKiBvZiBpZGxlIHBhZ2UgdGFibGUgcGFnZXMuICBFYWNoIG9mIGEgcG1hcCdzIHBhZ2UgdGFi bGUgcGFnZXMgaXMgcmVzcG9uc2libGUKKyAqIGZvciBtYXBwaW5nIGEgZGlzdGluY3QgcmFuZ2Ug b2YgdmlydHVhbCBhZGRyZXNzZXMuICBUaGUgcG1hcCdzIGNvbGxlY3Rpb24gaXMKKyAqIG9yZGVy ZWQgYnkgdGhpcyB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuCisgKi8KK3N0YXRpYyBfX2lubGluZSBp bnQKK3BtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQorewor CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0dXJuICh2bV9yYWRpeF9p bnNlcnQoJnBtYXAtPnBtX3Jvb3QsIG1wdGUpKTsKK30KKworLyoKKyAqIExvb2tzIGZvciBhIHBh Z2UgdGFibGUgcGFnZSBtYXBwaW5nIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGluIHRo ZQorICogc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdl cy4gIFJldHVybnMgTlVMTCBpZiB0aGVyZQorICogaXMgbm8gcGFnZSB0YWJsZSBwYWdlIGNvcnJl c3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBf X2lubGluZSB2bV9wYWdlX3QKK3BtYXBfbG9va3VwX3B0X3BhZ2UocG1hcF90IHBtYXAsIHZtX29m ZnNldF90IHZhKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJcmV0 dXJuICh2bV9yYWRpeF9sb29rdXAoJnBtYXAtPnBtX3Jvb3QsIHBtYXBfcGRlX3BpbmRleCh2YSkp KTsKK30KKworLyoKKyAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBwYWdlIHRhYmxlIHBhZ2UgZnJv bSB0aGUgc3BlY2lmaWVkIHBtYXAncyBjb2xsZWN0aW9uCisgKiBvZiBpZGxlIHBhZ2UgdGFibGUg cGFnZXMuICBUaGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBtdXN0IGJlIGEgbWVtYmVyIG9m CisgKiB0aGUgcG1hcCdzIGNvbGxlY3Rpb24uCisgKi8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitw bWFwX3JlbW92ZV9wdF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9wYWdlX3QgbXB0ZSkKK3sKKworCVBN QVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXZtX3JhZGl4X3JlbW92ZSgmcG1hcC0+ cG1fcm9vdCwgbXB0ZS0+cGluZGV4KTsKK30KKworLyoKKyAqIERlY3JlbWVudHMgYSBwYWdlIHRh YmxlIHBhZ2UncyB3aXJlIGNvdW50LCB3aGljaCBpcyB1c2VkIHRvIHJlY29yZCB0aGUKKyAqIG51 bWJlciBvZiB2YWxpZCBwYWdlIHRhYmxlIGVudHJpZXMgd2l0aGluIHRoZSBwYWdlLiAgSWYgdGhl IHdpcmUgY291bnQKKyAqIGRyb3BzIHRvIHplcm8sIHRoZW4gdGhlIHBhZ2UgdGFibGUgcGFnZSBp cyB1bm1hcHBlZC4gIFJldHVybnMgVFJVRSBpZiB0aGUKKyAqIHBhZ2UgdGFibGUgcGFnZSB3YXMg dW5tYXBwZWQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIFBNQVBfSU5MSU5FIGJv b2xlYW5fdAorcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1f cGFnZV90IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCisJLS1tLT53aXJlX2NvdW50Owor CWlmIChtLT53aXJlX2NvdW50ID09IDApIHsKKwkJX3BtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg bSwgZnJlZSk7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor fQorCitzdGF0aWMgdm9pZAorX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlwZF9lbnRyeV90 ICpwZGUsICpwZHA7CisJdm1fcGFnZV90IHBkcGc7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwkvKgorCSAqIHVubWFwIHRoZSBwYWdlIHRhYmxlIHBhZ2UKKwkgKi8KKwlp ZiAobS0+cGluZGV4IDwgTlVQREUpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkq cGRlID0gMDsKKwkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisKKwkJLyoKKwkJ ICogUmVjdXJzaXZlbHkgZGVjcmVtZW50IG5leHQgbGV2ZWwgcGFnZXRhYmxlIHJlZmNvdW50CisJ CSAqLworCQlwZHAgPSAocGRfZW50cnlfdCAqKSpwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJCXBk cGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwZHApKTsKKwkJcG1hcF91 bndpcmVfcHRwKHBtYXAsIHZhLCBwZHBnLCBmcmVlKTsKKwl9IGVsc2UgeworCQlwZGUgPSBwbWFw X3NlZ21hcChwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2Rl YyhwbWFwLCAxKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIGZpbmFsbHkgdW53aXJl ZCwgc2ltcGx5IGZyZWUgaXQuCisJICogVGhpcyBpcyBhIHJlbGVhc2Ugc3RvcmUgc28gdGhhdCB0 aGUgb3JkaW5hcnkgc3RvcmUgdW5tYXBwaW5nCisJICogdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBn bG9iYWxseSBwZXJmb3JtZWQgYmVmb3JlIFRMQiBzaG9vdC0KKwkgKiBkb3duIGlzIGJlZ3VuLgor CSAqLworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCisJ LyoKKwkgKiBQdXQgcGFnZSBvbiBhIGxpc3Qgc28gdGhhdCBpdCBpcyByZWxlYXNlZCBhZnRlcgor CSAqICpBTEwqIFRMQiBzaG9vdGRvd24gaXMgZG9uZS4KKwkgKi8KKwlwbWFwX2FkZF9kZWxheWVk X2ZyZWVfbGlzdChtLCBmcmVlLCBUUlVFKTsKK30KKworLyoKKyAqIEFmdGVyIHJlbW92aW5nIGEg cGFnZSB0YWJsZSBlbnRyeSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgdG8KKyAqIGNvbmRpdGlvbmFs bHkgZnJlZSB0aGUgcGFnZSwgYW5kIG1hbmFnZSB0aGUgaG9sZC93aXJlIGNvdW50cy4KKyAqLwor c3RhdGljIGludAorcG1hcF91bnVzZV9wdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHBk X2VudHJ5X3QgcHRlcGRlLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXZtX3BhZ2Vf dCBtcHRlOworCisJaWYgKHZhID49IFZNX01BWFVTRVJfQUREUkVTUykKKwkJcmV0dXJuICgwKTsK KwlLQVNTRVJUKHB0ZXBkZSAhPSAwLCAoInBtYXBfdW51c2VfcHQ6IHB0ZXBkZSAhPSAwIikpOwor CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUyhwdGVwZGUpKTsKKwly ZXR1cm4gKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwgbXB0ZSwgZnJlZSkpOworfQorCit2b2lk CitwbWFwX3Bpbml0MChwbWFwX3QgcG1hcCkKK3sKKwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklU KHBtYXApOworCXBtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9zZWdtYXA7CisJQ1BVX1pFUk8oJnBt YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp XS5nZW4gPSAwOworCX0KKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwlUQUlMUV9JTklUKCZw bWFwLT5wbV9wdmNodW5rKTsKKwliemVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5w bV9zdGF0cyk7Cit9CisKK3ZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpCit7CisK Kwl2bV9wYWdlb3V0X2dyb3dfY2FjaGUoMywgMCwgTUlQU19YS1BIWVNfTEFSR0VTVF9QSFlTKTsK K30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY19kaXJlY3RfcGFnZSh1bnNpZ25lZCBp bnQgaW5kZXgsIGludCByZXEpCit7CisJdm1fcGFnZV90IG07CisKKwltID0gdm1fcGFnZV9hbGxv Y19mcmVlbGlzdChWTV9GUkVFTElTVF9ESVJFQ1QsIHJlcSB8IFZNX0FMTE9DX1dJUkVEIHwKKwkg ICAgVk1fQUxMT0NfWkVSTyk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwor CWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlwbWFwX3plcm9fcGFnZShtKTsKKwor CW0tPnBpbmRleCA9IGluZGV4OworCXJldHVybiAobSk7Cit9CisKKy8qLQorICogSW5pdGlhbGl6 ZSBhIHByZWFsbG9jYXRlZCBhbmQgemVyb2VkIHBtYXAgc3RydWN0dXJlLAorICogc3VjaCBhcyBv bmUgaW4gYSB2bXNwYWNlIHN0cnVjdHVyZS4KKyAqLworaW50CitwbWFwX3Bpbml0KHBtYXBfdCBw bWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBwdGRwZzsKKwlpbnQgaTsK KworCS8qCisJICogYWxsb2NhdGUgdGhlIHBhZ2UgZGlyZWN0b3J5IHBhZ2UKKwkgKi8KKwl3aGls ZSAoKHB0ZHBnID0gcG1hcF9hbGxvY19kaXJlY3RfcGFnZShOVVNFUlBHVEJMUywgVk1fQUxMT0Nf Tk9PQkogfAorCSAgICBWTV9BTExPQ19OT1JNQUwpKSA9PSBOVUxMKSB7CisJICAgICAgIHBtYXBf Z3Jvd19kaXJlY3RfcGFnZV9jYWNoZSgpOworCX0KKworCXB0ZHZhID0gTUlQU19QSFlTX1RPX0RJ UkVDVChWTV9QQUdFX1RPX1BIWVMocHRkcGcpKTsKKwlwbWFwLT5wbV9zZWd0YWIgPSAocGRfZW50 cnlfdCAqKXB0ZHZhOworCUNQVV9aRVJPKCZwbWFwLT5wbV9hY3RpdmUpOworCWZvciAoaSA9IDA7 IGkgPCBNQVhDUFU7IGkrKykgeworCQlwbWFwLT5wbV9hc2lkW2ldLmFzaWQgPSBQTUFQX0FTSURf UkVTRVJWRUQ7CisJCXBtYXAtPnBtX2FzaWRbaV0uZ2VuID0gMDsKKwl9CisJVEFJTFFfSU5JVCgm cG1hcC0+cG1fcHZjaHVuayk7CisJYnplcm8oJnBtYXAtPnBtX3N0YXRzLCBzaXplb2YgcG1hcC0+ cG1fc3RhdHMpOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBj YWxsZWQgaWYgdGhlIGRlc2lyZWQgcGFnZSB0YWJsZSBwYWdlIGRvZXMgbm90IGV4aXN0LgorICov CitzdGF0aWMgdm1fcGFnZV90CitfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQg cHRlcGluZGV4LCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJdm1fb2Zmc2V0X3QgcGFnZXZh OworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK KwkvKgorCSAqIEZpbmQgb3IgZmFicmljYXRlIGEgbmV3IHBhZ2V0YWJsZSBwYWdlCisJICovCisJ aWYgKChtID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBwdGVwaW5kZXgsIFZNX0FMTE9DX05PUk1BTCB8 CisJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQgfCBWTV9BTExPQ19aRVJPKSkg PT0gTlVMTCkgeworCQlpZiAobG9ja3AgIT0gTlVMTCkgeworCQkJUkVMRUFTRV9QVl9MSVNUX0xP Q0sobG9ja3ApOworCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQlyd19ydW5sb2NrKCZwdmhfZ2xv YmFsX2xvY2spOworCQkJVk1fV0FJVDsKKwkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor CQkJUE1BUF9MT0NLKHBtYXApOworCQl9CisKKwkJLyoKKwkJICogSW5kaWNhdGUgdGhlIG5lZWQg dG8gcmV0cnkuCVdoaWxlIHdhaXRpbmcsIHRoZSBwYWdlCisJCSAqIHRhYmxlIHBhZ2UgbWF5IGhh dmUgYmVlbiBhbGxvY2F0ZWQuCisJCSAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlpZiAoKG0t PmZsYWdzICYgUEdfWkVSTykgPT0gMCkKKwkJcG1hcF96ZXJvX3BhZ2UobSk7CisKKwkvKgorCSAq IE1hcCB0aGUgcGFnZXRhYmxlIHBhZ2UgaW50byB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLCBp ZiBpdAorCSAqIGlzbid0IGFscmVhZHkgdGhlcmUuCisJICovCisJcGFnZXZhID0gTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCisJaWYgKHB0ZXBpbmRleCA+PSBOVVBE RSkgeworCQlwbWFwLT5wbV9zZWd0YWJbcHRlcGluZGV4IC0gTlVQREVdID0gKHBkX2VudHJ5X3Qp cGFnZXZhOworCX0gZWxzZSB7CisJCXBkX2VudHJ5X3QgKnBkZXAsICpwZGU7CisJCWludCBzZWdp bmRleCA9IHB0ZXBpbmRleCA+PiAoU0VHU0hJRlQgLSBQRFJTSElGVCk7CisJCWludCBwZGVpbmRl eCA9IHB0ZXBpbmRleCAmIChOUERFUEcgLSAxKTsKKwkJdm1fcGFnZV90IHBnOworCisJCXBkZXAg PSAmcG1hcC0+cG1fc2VndGFiW3NlZ2luZGV4XTsKKwkJaWYgKCpwZGVwID09IE5VTEwpIHsKKwkJ CS8qIEhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgcGQsIHJlY3Vyc2UgKi8KKwkJCWlmIChfcG1hcF9h bGxvY3B0ZShwbWFwLCBOVVBERSArIHNlZ2luZGV4LAorCQkJICAgIGxvY2twKSA9PSBOVUxMKSB7 CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1cnJlbnQgKi8KKwkJCQktLW0tPndpcmVf Y291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7 CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCX0KKwkJ fSBlbHNlIHsKKwkJCS8qIEFkZCByZWZlcmVuY2UgdG8gdGhlIHBkIHBhZ2UgKi8KKwkJCXBnID0g UEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZXApKTsKKwkJCXBnLT53aXJl X2NvdW50Kys7CisJCX0KKwkJLyogTmV4dCBsZXZlbCBlbnRyeSAqLworCQlwZGUgPSAocGRfZW50 cnlfdCAqKSpwZGVwOworCQlwZGVbcGRlaW5kZXhdID0gKHBkX2VudHJ5X3QpcGFnZXZhOworCX0K KworCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAsIDEpOworCisJcmV0dXJuIChtKTsKK30K Kworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl1bnNpZ25lZCBwdGVwaW5kZXg7CisJ cGRfZW50cnlfdCAqcGQ7CisJdm1fcGFnZV90IG07CisKKwkvKgorCSAqIENhbGN1bGF0ZSBwYWdl dGFibGUgcGFnZSBpbmRleAorCSAqLworCXB0ZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7 CityZXRyeToKKwkvKgorCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkgKi8KKwlw ZCA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCS8qCisJICogVGhpcyBzdXBwb3J0cyBzd2l0Y2hp bmcgZnJvbSBhIDJNQiBwYWdlIHRvIGEKKwkgKiBub3JtYWwgNEsgcGFnZS4KKwkgKi8KKwlpZiAo cGQgIT0gTlVMTCAmJiAocGRlX2lzXzFtX3N1cGVycGFnZShwZCkgJiYKKwkgICAgcHRlX2lzX3Zh bGlkKChwdF9lbnRyeV90ICopcGQpKSkgeworCQkgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2Vk KHBtYXAsIHBkLCB2YSwgbG9ja3ApKSB7CisJCQkgLyoKKwkJCSAgKiBJbnZhbGlkYXRpb24gb2Yg dGhlIDJNQiBwYWdlIG1hcHBpbmcgbWF5IGhhdmUgY2F1c2VkCisJCQkgICogdGhlIGRlYWxsb2Nh dGlvbiBvZiB0aGUgdW5kZXJseWluZyBQRCBwYWdlLgorCQkJICAqLworCQkJIHBkID0gTlVMTDsK KwkJIH0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3 ZSBqdXN0IGluY3JlbWVudCB0aGUgaG9sZAorCSAqIGNvdW50LCBhbmQgYWN0aXZhdGUgaXQuCisJ ICovCisJaWYgKHBkICE9IE5VTEwgJiYgKnBkICE9IE5VTEwpIHsKKwkJbSA9IFBIWVNfVE9fVk1f UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKChwdF9lbnRyeV90KSpwZCkpOworCQltLT53aXJlX2Nv dW50Kys7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGVyZSBpZiB0aGUgcHRlIHBhZ2UgaXNuJ3Qg bWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorCQkgKiBkZWFsbG9jYXRlZC4KKwkJICovCisJCW0g PSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBwdGVwaW5kZXgsIGxvY2twKTsKKwkJaWYgKG0gPT0gTlVM TCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIChtKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogUG1hcCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLQorICogUmVsZWFz ZSBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIGdpdmVuIHBoeXNpY2FsIG1hcC4KKyAqIENhbGxl ZCB3aGVuIGEgcG1hcCBpbml0aWFsaXplZCBieSBwbWFwX3Bpbml0IGlzIGJlaW5nIHJlbGVhc2Vk LgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gdmFsaWQg bWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVsZWFzZShwbWFwX3QgcG1hcCkKK3sKKwl2bV9v ZmZzZXRfdCBwdGR2YTsKKwl2bV9wYWdlX3QgcHRkcGc7CisKKwlLQVNTRVJUKHBtYXAtPnBtX3N0 YXRzLnJlc2lkZW50X2NvdW50ID09IDAsCisJICAgICgicG1hcF9yZWxlYXNlOiBwbWFwIHJlc2lk ZW50IGNvdW50ICVsZCAhPSAwIiwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQp KTsKKworCS8qCisJICogSW52YWxpZGF0ZSBhbnkgbGVmdCBUTEIgZW50cmllcywgdG8gYWxsb3cg dGhlIHJldXNlCisJICogb2YgdGhlIGFzaWQuCisJICovCisJcG1hcF9pbnZhbGlkYXRlX2FsbChw bWFwKTsKKworCXB0ZHZhID0gKHZtX29mZnNldF90KXBtYXAtPnBtX3NlZ3RhYjsKKwlwdGRwZyA9 IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZHZhKSk7CisKKwlwdGRwZy0+ d2lyZV9jb3VudC0tOworCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQs IDEpOworCXZtX3BhZ2VfZnJlZV96ZXJvKHB0ZHBnKTsKK30KKworLyotCisgKiBncm93IHRoZSBu dW1iZXIgb2Yga2VybmVsIHBhZ2UgdGFibGUgZW50cmllcywgaWYgbmVlZGVkCisgKi8KK3ZvaWQK K3BtYXBfZ3Jvd2tlcm5lbCh2bV9vZmZzZXRfdCBhZGRyKQoreworCXZtX3BhZ2VfdCBua3BnOwor CXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCWludCBpOworCisJ bXR4X2Fzc2VydCgma2VybmVsX21hcC0+c3lzdGVtX210eCwgTUFfT1dORUQpOworCWFkZHIgPSBy b3VuZHVwMihhZGRyLCBOQlNFRyk7CisJaWYgKGFkZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v ZmZzZXQpCisJCWFkZHIgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCXdoaWxlIChrZXJuZWxf dm1fZW5kIDwgYWRkcikgeworCQlwZHBlID0gcG1hcF9zZWdtYXAoa2VybmVsX3BtYXAsIGtlcm5l bF92bV9lbmQpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJLyogbmV3IGludGVybWVkaWF0ZSBw YWdlIHRhYmxlIGVudHJ5ICovCisJCQlua3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBW TV9BTExPQ19JTlRFUlJVUFQgfAorCQkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lS RUQgfCBWTV9BTExPQ19aRVJPKTsKKwkJCWlmIChua3BnID09IE5VTEwpCisJCQkJcGFuaWMoIiVz OiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwiLCBfX2Z1bmNfXyk7CisJCQkqcGRwZSA9IChwZF9l bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9UT19QSFlTKG5rcGcp KTsKKwkJCWNvbnRpbnVlOyAvKiB0cnkgYWdhaW4gKi8KKwkJfQorCQlwZGUgPSBwbWFwX3BkcGVf dG9fcGRlKHBkcGUsIGtlcm5lbF92bV9lbmQpOworCQlpZiAoKnBkZSAhPSAwKSB7CisJCQlrZXJu ZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJCWlmIChr ZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQkJa2VybmVs X3ZtX2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlj b250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaW5kZXggaXMgYm9ndXMsIGJ1dCBvdXQg b2YgdGhlIHdheQorCQkgKi8KKwkJbmtwZyA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgbmtwdCwgVk1f QUxMT0NfSU5URVJSVVBUIHwKKwkJICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxMT0NfV0lSRUQg fCBWTV9BTExPQ19aRVJPKTsKKwkJaWYgKCFua3BnKQorCQkJcGFuaWMoInBtYXBfZ3Jvd2tlcm5l bDogbm8gbWVtb3J5IHRvIGdyb3cga2VybmVsIik7CisJCW5rcHQrKzsKKwkJKnBkZSA9IChwZF9l bnRyeV90KU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG5rcGcpKTsKKworCQkv KgorCQkgKiBUaGUgUls0LTddPzAwIHN0b3JlcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBHbG9iYWwg Yml0IGluCisJCSAqIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyIGZvciBlYWNoIDIg cGFnZSBlbnRyeS4KKwkJICogVGh1cyBpbnZhbGlkIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh bCBiaXQgc2V0IHNvIHdoZW4KKwkJICogRW50cnkgTE8gYW5kIEVudHJ5IEhJIEcgYml0cyBhcmUg YW5kZWQgdG9nZXRoZXIgdGhleSB3aWxsCisJCSAqIHByb2R1Y2UgYSBnbG9iYWwgYml0IHRvIHN0 b3JlIGluIHRoZSB0bGIuCisJCSAqLworCQlwdGUgPSAocHRfZW50cnlfdCAqKSpwZGU7CisJCWZv ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJCXB0ZVtpXSA9IFBURV9HOworCisJCWtlcm5l bF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAoa2Vy bmVsX3ZtX2VuZCAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkgeworCQkJa2VybmVsX3Zt X2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog cGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworQ1RBU1NFUlQoc2l6ZW9mKHN0cnVjdCBwdl9jaHVu aykgPT0gUEFHRV9TSVpFKTsKK0NUQVNTRVJUKF9OUENNID09IDMpOworQ1RBU1NFUlQoX05QQ1BW ID09IDE2OCk7CisKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgcHZfY2h1bmsgKgorcHZfdG9fY2h1 bmsocHZfZW50cnlfdCBwdikKK3sKKworCXJldHVybiAoKHN0cnVjdCBwdl9jaHVuayAqKSgodWlu dHB0cl90KXB2ICYgfih1aW50cHRyX3QpUEFHRV9NQVNLKSk7Cit9CisKKyNkZWZpbmUgUFZfUE1B UChwdikgKHB2X3RvX2NodW5rKHB2KS0+cGNfcG1hcCkKKworI2RlZmluZQlQQ19GUkVFMAkweGZm ZmZmZmZmZmZmZmZmZmZ1bAorI2RlZmluZQlQQ19GUkVFMQkweGZmZmZmZmZmZmZmZmZmZmZ1bAor I2RlZmluZQlQQ19GUkVFMgkweDAwMDAwMGZmZmZmZmZmZmZ1bAorCitzdGF0aWMgY29uc3QgdV9s b25nIHBjX2ZyZWVtYXNrW19OUENNXSA9IHsgUENfRlJFRTAsIFBDX0ZSRUUxLCBQQ19GUkVFMiB9 OworCisjaWZkZWYgUFZfU1RBVFMKK3N0YXRpYyBpbnQgcGNfY2h1bmtfY291bnQsIHBjX2NodW5r X2FsbG9jcywgcGNfY2h1bmtfZnJlZXMsIHBjX2NodW5rX3RyeWZhaWw7CisKK1NZU0NUTF9JTlQo X3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19jb3VudCwgQ1RMRkxBR19SRCwgJnBjX2NodW5r X2NvdW50LCAwLAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBjaHVua3MiKTsKK1NZ U0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVua19hbGxvY3MsIENUTEZMQUdfUkQs ICZwY19jaHVua19hbGxvY3MsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNo dW5rcyBhbGxvY2F0ZWQiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwY19jaHVu a19mcmVlcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2ZyZWVzLCAwLAorICAgICJDdXJyZW50IG51 bWJlciBvZiBwdiBlbnRyeSBjaHVua3MgZnJlZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9J RF9BVVRPLCBwY19jaHVua190cnlmYWlsLCBDVExGTEFHX1JELCAmcGNfY2h1bmtfdHJ5ZmFpbCwg MCwKKyAgICAiTnVtYmVyIG9mIHRpbWVzIHRyaWVkIHRvIGdldCBhIGNodW5rIHBhZ2UgYnV0IGZh aWxlZC4iKTsKKworc3RhdGljIGxvbmcgcHZfZW50cnlfY291bnQsIHB2X2VudHJ5X2ZyZWVzLCBw dl9lbnRyeV9hbGxvY3M7CitzdGF0aWMgaW50IHB2X2VudHJ5X3NwYXJlOworCitTWVNDVExfTE9O Ryhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2ZyZWVzLCBDVExGTEFHX1JELCAmcHZfZW50 cnlfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGZyZWVzIik7CitT WVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2FsbG9jcywgQ1RMRkxBR19S RCwgJnB2X2VudHJ5X2FsbG9jcywgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkg YWxsb2NzIik7CitTWVNDVExfTE9ORyhfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X2NvdW50 LCBDVExGTEFHX1JELCAmcHZfZW50cnlfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9m IHB2IGVudHJpZXMiKTsKK1NZU0NUTF9JTlQoX3ZtX3BtYXAsIE9JRF9BVVRPLCBwdl9lbnRyeV9z cGFyZSwgQ1RMRkxBR19SRCwgJnB2X2VudHJ5X3NwYXJlLCAwLAorICAgICJDdXJyZW50IG51bWJl ciBvZiBzcGFyZSBwdiBlbnRyaWVzIik7CisjZW5kaWYKKworLyoKKyAqIFdlIGFyZSBpbiBhIHNl cmlvdXMgbG93IG1lbW9yeSBjb25kaXRpb24uICBSZXNvcnQgdG8KKyAqIGRyYXN0aWMgbWVhc3Vy ZXMgdG8gZnJlZSBzb21lIHBhZ2VzIHNvIHdlIGNhbiBhbGxvY2F0ZQorICogYW5vdGhlciBwdiBl bnRyeSBjaHVuay4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgUFYgZW50cmllcyB3ZXJlIHJlY2xh aW1lZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcC4KKyAqCisgKiBXZSBkbyBub3QsIGhvd2V2ZXIs IHVubWFwIDJtcGFnZXMgYmVjYXVzZSBzdWJzZXF1ZW50IGFjY2VzcyB3aWxsCisgKiBhbGxvY2F0 ZSBwZXItcGFnZSBwdiBlbnRyaWVzIHVudGlsIHJlcHJvbW90aW9uIG9jY3VycywgdGhlcmVieQor ICogZXhhY2VyYmF0aW5nIHRoZSBzaG9ydGFnZSBvZiBmcmVlIHB2IGVudHJpZXMuCisgKi8KK3N0 YXRpYyB2bV9wYWdlX3QKK3JlY2xhaW1fcHZfY2h1bmsocG1hcF90IGxvY2tlZF9wbWFwLCBzdHJ1 Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IHBjaCBuZXdfdGFpbDsKKwlzdHJ1Y3QgcHZf Y2h1bmsgKnBjOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90 ICpwdGUsIG9sZHB0ZTsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhOworCXZtX3Bh Z2VfdCBtLCBtX3BjOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJdWludDY0X3QgaW51c2U7CisJ aW50IGJpdCwgZmllbGQsIGZyZWVkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKGxvY2tlZF9wbWFwLCBNQV9PV05FRCk7 CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoInJlY2xhaW1fcHZfY2h1bms6IGxvY2twIGlzIE5V TEwiKSk7CisJcG1hcCA9IE5VTEw7CisJbV9wYyA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7 CisJVEFJTFFfSU5JVCgmbmV3X3RhaWwpOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOwor CXdoaWxlICgocGMgPSBUQUlMUV9GSVJTVCgmcHZfY2h1bmtzKSkgIT0gTlVMTCAmJiBTTElTVF9F TVBUWSgmZnJlZSkpIHsKKwkJVEFJTFFfUkVNT1ZFKCZwdl9jaHVua3MsIHBjLCBwY19scnUpOwor CQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCQlpZiAocG1hcCAhPSBwYy0+cGNfcG1h cCkgeworCQkJaWYgKHBtYXAgIT0gTlVMTCkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1h cCk7CisJCQkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQkJCVBNQVBfVU5MT0NLKHBtYXAp OworCQkJfQorCQkJcG1hcCA9IHBjLT5wY19wbWFwOworCQkJLyogQXZvaWQgZGVhZGxvY2sgYW5k IGxvY2sgcmVjdXJzaW9uLiAqLworCQkJaWYgKHBtYXAgPiBsb2NrZWRfcG1hcCkgeworCQkJCVJF TEVBU0VfUFZfTElTVF9MT0NLKGxvY2twKTsKKwkJCQlQTUFQX0xPQ0socG1hcCk7CisJCQl9IGVs c2UgaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXAgJiYgIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ CXBtYXAgPSBOVUxMOworCQkJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xy dSk7CisJCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQkJY29udGludWU7CisJCQl9 CisJCX0KKworCQkvKgorCQkgKiBEZXN0cm95IGV2ZXJ5IG5vbi13aXJlZCwgNCBLQiBwYWdlIG1h cHBpbmcgaW4gdGhlIGNodW5rLgorCQkgKi8KKwkJZnJlZWQgPSAwOworCQlmb3IgKGZpZWxkID0g MDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJZm9yIChpbnVzZSA9IH5wYy0+cGNfbWFw W2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCSAgICBpbnVzZSAhPSAwOyBpbnVzZSAm PSB+KDFVTCA8PCBiaXQpKSB7CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWlkeCA9 IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAmcGMtPnBjX3B2 ZW50cnlbaWR4XTsKKwkJCQl2YSA9IHB2LT5wdl92YTsKKwkJCQlwZGUgPSBwbWFwX3BkZShwbWFw LCB2YSk7CisJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsCisJCQkJICAgICgi JXM6IHBkZSIsIF9fZnVuY19fKSk7CisJCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkK KwkJCQkJY29udGludWU7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJ CW9sZHB0ZSA9ICpwdGU7CisJCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9XKSkKKwkJCQkJ Y29udGludWU7CisJCQkJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkJCQkqcHRlID0gUFRF X0c7CisJCQkJZWxzZQorCQkJCQkqcHRlID0gMDsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwg UFRFX0cpKQorCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJbSA9IFBI WVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEob2xkcHRlKSk7CisJCQkJaWYgKHB0ZV90ZXN0 KCZvbGRwdGUsIFBURV9EKSkKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQlpZiAocHRlX2lz X3JlZigmb2xkcHRlKSkKKwkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQp OworCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCW0t Pm1kLnB2X2dlbisrOworCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ CQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQkJCQlzdHJ1Y3QgbWRf cGFnZSAqcHZoID0KKwkJCQkJICAgIHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJ CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCXZtX3BhZ2VfYWZsYWdf Y2xlYXIobSwKKwkJCQkJCSAgICBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlw Yy0+cGNfbWFwW2ZpZWxkXSB8PSAxVUwgPDwgYml0OworCQkJCXBtYXBfdW51c2VfcHQocG1hcCwg dmEsICpwZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCWlmIChmcmVlZCA9 PSAwKSB7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUpOworCQkJ bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBFdmVy eSBmcmVlZCBtYXBwaW5nIGlzIGZvciBhIDQgS0IgcGFnZS4gKi8KKwkJcG1hcF9yZXNpZGVudF9j b3VudF9kZWMocG1hcCwgZnJlZWQpOworCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50 cnlfZnJlZXMsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3Nw YXJlLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9j b3VudCwgZnJlZWQpKTsKKwkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNf bGlzdCk7CisJCWlmIChwYy0+cGNfbWFwWzBdID09IFBDX0ZSRUUwICYmIHBjLT5wY19tYXBbMV0g PT0gUENfRlJFRTEgJiYKKwkJICAgIHBjLT5wY19tYXBbMl0gPT0gUENfRlJFRTIpIHsKKwkJCVBW X1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCQkJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQkJUFZf U1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkJCS8qIEVudGlyZSBj aHVuayBpcyBmcmVlOyByZXR1cm4gaXQuICovCisJCQltX3BjID0gUEhZU19UT19WTV9QQUdFKE1J UFNfRElSRUNUX1RPX1BIWVMoCisJCQkgICAgKHZtX29mZnNldF90KXBjKSk7CisJCQlkdW1wX2Ry b3BfcGFnZShtX3BjLT5waHlzX2FkZHIpOworCQkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7 CisJCQlicmVhazsKKwkJfQorCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg cGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbmV3X3RhaWwsIHBjLCBwY19scnUp OworCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJLyogT25lIGZyZWVkIHB2IGVudHJ5 IGluIGxvY2tlZF9wbWFwIGlzIHN1ZmZpY2llbnQuICovCisJCWlmIChwbWFwID09IGxvY2tlZF9w bWFwKQorCQkJYnJlYWs7CisJfQorCVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWws IHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlpZiAocG1hcCAhPSBO VUxMKSB7CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJCWlmIChwbWFwICE9IGxvY2tl ZF9wbWFwKQorCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmIChtX3BjID09IE5VTEwgJiYg IVNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQltX3BjID0gU0xJU1RfRklSU1QoJmZyZWUpOworCQlT TElTVF9SRU1PVkVfSEVBRCgmZnJlZSwgcGxpbmtzLnMuc3MpOworCQkvKiBSZWN5Y2xlIGEgZnJl ZWQgcGFnZSB0YWJsZSBwYWdlLiAqLworCQltX3BjLT53aXJlX2NvdW50ID0gMTsKKwkJYXRvbWlj X2FkZF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCX0KKwlwbWFwX2ZyZWVfemVyb19w YWdlcygmZnJlZSk7CisJcmV0dXJuIChtX3BjKTsKK30KKworLyoKKyAqIGZyZWUgdGhlIHB2X2Vu dHJ5IGJhY2sgdG8gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgdm9pZAorZnJlZV9wdl9lbnRy eShwbWFwX3QgcG1hcCwgcHZfZW50cnlfdCBwdikKK3sKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOwor CWludCBiaXQsIGZpZWxkLCBpZHg7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf TE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFUKGF0 b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRf aW50KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xvbmco JnB2X2VudHJ5X2NvdW50LCAxKSk7CisJcGMgPSBwdl90b19jaHVuayhwdik7CisJaWR4ID0gcHYg LSAmcGMtPnBjX3B2ZW50cnlbMF07CisJZmllbGQgPSBpZHggLyAoc2l6ZW9mKHVfbG9uZykgKiBO QkJZKTsKKwliaXQgPSBpZHggJSAoc2l6ZW9mKHVfbG9uZykgKiBOQkJZKTsKKwlwYy0+cGNfbWFw W2ZpZWxkXSB8PSAxdWwgPDwgYml0OworCWlmIChwYy0+cGNfbWFwWzBdICE9IFBDX0ZSRUUwIHx8 IHBjLT5wY19tYXBbMV0gIT0gUENfRlJFRTEgfHwKKwkgICAgcGMtPnBjX21hcFsyXSAhPSBQQ19G UkVFMikgeworCQkvKiA5OCUgb2YgdGhlIHRpbWUsIHBjIGlzIGFscmVhZHkgYXQgdGhlIGhlYWQg b2YgdGhlIGxpc3QuICovCisJCWlmIChfX3ByZWRpY3RfZmFsc2UocGMgIT0gVEFJTFFfRklSU1Qo JnBtYXAtPnBtX3B2Y2h1bmspKSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5r LCBwYywgcGNfbGlzdCk7CisJCQlUQUlMUV9JTlNFUlRfSEVBRCgmcG1hcC0+cG1fcHZjaHVuaywg cGMsIHBjX2xpc3QpOworCQl9CisJCXJldHVybjsKKwl9CisJVEFJTFFfUkVNT1ZFKCZwbWFwLT5w bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJZnJlZV9wdl9jaHVuayhwYyk7Cit9CisKK3N0YXRp YyB2b2lkCitmcmVlX3B2X2NodW5rKHN0cnVjdCBwdl9jaHVuayAqcGMpCit7CisJdm1fcGFnZV90 IG07CisKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlUQUlMUV9SRU1PVkUoJnB2X2No dW5rcywgcGMsIHBjX2xydSk7CisJbXR4X3VubG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBfTlBDUFYpKTsKKwlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChh dG9taWNfYWRkX2ludCgmcGNfY2h1bmtfZnJlZXMsIDEpKTsKKwkvKiBlbnRpcmUgY2h1bmsgaXMg ZnJlZSwgcmV0dXJuIGl0ICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShNSVBTX0RJUkVDVF9UT19Q SFlTKCh2bV9vZmZzZXRfdClwYykpOworCWR1bXBfZHJvcF9wYWdlKG0tPnBoeXNfYWRkcik7CisJ dm1fcGFnZV91bndpcmUobSwgUFFfSU5BQ1RJVkUpOworCXZtX3BhZ2VfZnJlZShtKTsKK30KKwor LyoKKyAqIFJldHVybnMgYSBuZXcgUFYgZW50cnksIGFsbG9jYXRpbmcgYSBuZXcgUFYgY2h1bmsg ZnJvbSB0aGUgc3lzdGVtIHdoZW4KKyAqIG5lZWRlZC4gIElmIHRoaXMgUFYgY2h1bmsgYWxsb2Nh dGlvbiBmYWlscyBhbmQgYSBQViBsaXN0IGxvY2sgcG9pbnRlciB3YXMKKyAqIGdpdmVuLCBhIFBW IGNodW5rIGlzIHJlY2xhaW1lZCBmcm9tIGFuIGFyYml0cmFyeSBwbWFwLiAgT3RoZXJ3aXNlLCBO VUxMIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBsb2NrIG1heSBi ZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHB2X2VudHJ5X3QKK2dldF9wdl9lbnRyeShwbWFwX3Qg cG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCWludCBiaXQsIGZpZWxkLCBpZHg7CisJ cHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXZtX3BhZ2VfdCBtOworCisJ cndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VS VChwbWFwLCBNQV9PV05FRCk7CisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2Fs bG9jcywgMSkpOworcmV0cnk6CisJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7 CisJaWYgKHBjICE9IE5VTEwpIHsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZp ZWxkKyspIHsKKwkJCWlmIChwYy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMt PnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZmllbGQg PCBfTlBDTSkgeworCQkJaWR4ID0gZmllbGQgKiBzaXplb2YocGMtPnBjX21hcFtmaWVsZF0pICog TkJCWSArIGJpdDsKKwkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQlwYy0+cGNfbWFw W2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJLyogSWYgdGhpcyB3YXMgdGhlIGxhc3QgaXRl bSwgbW92ZSBpdCB0byB0YWlsICovCisJCQlpZiAocGMtPnBjX21hcFswXSA9PSAwICYmIHBjLT5w Y19tYXBbMV0gPT0gMCAmJgorCQkJICAgIHBjLT5wY19tYXBbMl0gPT0gMCkgeworCQkJCVRBSUxR X1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQkJCVRBSUxRX0lOU0VS VF9UQUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywKKwkJCQkgICAgcGNfbGlzdCk7CisJCQl9CisJ CQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwkJCVBWX1NU QVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZfZW50cnlfc3BhcmUsIDEpKTsKKwkJCXJldHVybiAo cHYpOworCQl9CisJfQorCS8qIE5vIGZyZWUgaXRlbXMsIGFsbG9jYXRlIGFub3RoZXIgY2h1bmsg Ki8KKwltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19OT1JNQUwgfCBWTV9BTExP Q19OT09CSiB8CisJICAgIFZNX0FMTE9DX1dJUkVEKTsKKwlpZiAobSA9PSBOVUxMKSB7CisJCWlm IChsb2NrcCA9PSBOVUxMKSB7CisJCQlQVl9TVEFUKHBjX2NodW5rX3RyeWZhaWwrKyk7CisJCQly ZXR1cm4gKE5VTEwpOworCQl9CisJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK KwkJaWYgKG0gPT0gTlVMTCkKKwkJCWdvdG8gcmV0cnk7CisJfQorCVBWX1NUQVQoYXRvbWljX2Fk ZF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNf Y2h1bmtfYWxsb2NzLCAxKSk7CisJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCXBjID0g KHN0cnVjdCBwdl9jaHVuayAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1fUEFHRV9UT19QSFlTKG0p KTsKKwlwYy0+cGNfcG1hcCA9IHBtYXA7CisJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwICYgfjF1 bDsJLyogcHJlYWxsb2NhdGVkIGJpdCAwICovCisJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor CXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsKKwltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK KwlUQUlMUV9JTlNFUlRfVEFJTCgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCXB2ID0gJnBjLT5wY19wdmVudHJ5WzBdOworCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJUFZfU1RBVChhdG9t aWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCAxKSk7CisJUFZfU1RBVChhdG9taWNfYWRkX2lu dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQViAtIDEpKTsKKwlyZXR1cm4gKHB2KTsKK30KKworLyoK KyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvbmUgYml0cyB3aXRoaW4gdGhlIGdpdmVuIFBWIGNo dW5rIG1hcCBlbGVtZW50LgorICovCitzdGF0aWMgaW5saW5lIGludAorcG9wY291bnRfcGNfbWFw X2VsZW0odWludDY0X3QgZWxlbSkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIFRoaXMgc2lt cGxlIG1ldGhvZCBvZiBjb3VudGluZyB0aGUgb25lIGJpdHMgcGVyZm9ybXMgd2VsbCBiZWNhdXNl CisJICogdGhlIGdpdmVuIGVsZW1lbnQgdHlwaWNhbGx5IGNvbnRhaW5zIG1vcmUgemVybyBiaXRz IHRoYW4gb25lIGJpdHMuCisJICovCisJY291bnQgPSAwOworCWZvciAoOyBlbGVtICE9IDA7IGVs ZW0gJj0gZWxlbSAtIDEpCisJCWNvdW50Kys7CisJcmV0dXJuIChjb3VudCk7Cit9CisKKy8qCisg KiBFbnN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIHNwYXJlIFBWIGVudHJpZXMgaW4gdGhlIHNwZWNp ZmllZCBwbWFwIG1lZXRzIG9yCisgKiBleGNlZWRzIHRoZSBnaXZlbiBjb3VudCwgIm5lZWRlZCIu CisgKgorICogVGhlIGdpdmVuIFBWIGxpc3QgbG9jayBtYXkgYmUgcmVsZWFzZWQuCisgKi8KK3N0 YXRpYyB2b2lkCityZXNlcnZlX3B2X2VudHJpZXMocG1hcF90IHBtYXAsIGludCBuZWVkZWQsIHN0 cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBw dl9jaHVuayAqcGM7CisJaW50IGF2YWlsLCBmcmVlOworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFw LCBNQV9PV05FRCk7CisJS0FTU0VSVChsb2NrcCAhPSBOVUxMLCAoIiVzOiBsb2NrcCBpcyBOVUxM IiwgX19mdW5jX18pKTsKKworCS8qCisJICogTmV3bHkgYWxsb2NhdGVkIFBWIGNodW5rcyBtdXN0 IGJlIHN0b3JlZCBpbiBhIHByaXZhdGUgbGlzdCB1bnRpbAorCSAqIHRoZSByZXF1aXJlZCBudW1i ZXIgb2YgUFYgY2h1bmtzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuICBPdGhlcndpc2UsCisJICogcmVj bGFpbV9wdl9jaHVuaygpIGNvdWxkIHJlY3ljbGUgb25lIG9mIHRoZXNlIGNodW5rcy4gIEluCisJ ICogY29udHJhc3QsIHRoZXNlIGNodW5rcyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbWFwIHVwb24g YWxsb2NhdGlvbi4KKwkgKi8KKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CityZXRyeToKKwlhdmFp bCA9IDA7CisJVEFJTFFfRk9SRUFDSChwYywgJnBtYXAtPnBtX3B2Y2h1bmssIHBjX2xpc3QpIHsK KwkJZnJlZSA9IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMF0pOworCQlmcmVlICs9 IHBvcGNvdW50X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMV0pOworCQlmcmVlICs9IHBvcGNvdW50 X3BjX21hcF9lbGVtKHBjLT5wY19tYXBbMl0pOworCQlpZiAoZnJlZSA9PSAwKQorCQkJYnJlYWs7 CisJCWF2YWlsICs9IGZyZWU7CisJCWlmIChhdmFpbCA+PSBuZWVkZWQpCisJCQlicmVhazsKKwl9 CisJZm9yICg7IGF2YWlsIDwgbmVlZGVkOyBhdmFpbCArPSBfTlBDUFYpIHsKKwkJbSA9IHZtX3Bh Z2VfYWxsb2MoTlVMTCwgMCwgVk1fQUxMT0NfTk9STUFMIHwgVk1fQUxMT0NfTk9PQkogfAorCQkg ICAgVk1fQUxMT0NfV0lSRUQpOworCQlpZiAobSA9PSBOVUxMKSB7CisJCQltID0gcmVjbGFpbV9w dl9jaHVuayhwbWFwLCBsb2NrcCk7CisJCQlpZiAobSA9PSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7 CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwkJ UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfYWxsb2NzLCAxKSk7CisJCWR1bXBfYWRk X3BhZ2UobS0+cGh5c19hZGRyKTsKKwkJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlwYy0+cGNfcG1hcCA9IHBtYXA7CisJ CXBjLT5wY19tYXBbMF0gPSBQQ19GUkVFMDsKKwkJcGMtPnBjX21hcFsxXSA9IFBDX0ZSRUUxOwor CQlwYy0+cGNfbWFwWzJdID0gUENfRlJFRTI7CisJCVRBSUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5w bV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwg cGMsIHBjX2xydSk7CisJCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBf TlBDUFYpKTsKKwl9CisJaWYgKCFUQUlMUV9FTVBUWSgmbmV3X3RhaWwpKSB7CisJCW10eF9sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCQlUQUlMUV9DT05DQVQoJnB2X2NodW5rcywgJm5ld190YWls LCBwY19scnUpOworCQltdHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCX0KK30KKworLyoK KyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gcmVtb3ZlIHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNp ZmllZCBwbWFwIGFuZCB2aXJ0dWFsCisgKiBhZGRyZXNzIGZyb20gdGhlIHNwZWNpZmllZCBwdiBs aXN0LiAgUmV0dXJucyB0aGUgcHYgZW50cnkgaWYgZm91bmQgYW5kIE5VTEwKKyAqIG90aGVyd2lz ZS4gIFRoaXMgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhl ciA0S0Igb3IKKyAqIDJNQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgcHZfZW50cnlfdAor cG1hcF9wdmhfcmVtb3ZlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZz ZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xv Y2ssIFJBX0xPQ0tFRCk7CisJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4 dCkgeworCQlpZiAocG1hcCA9PSBQVl9QTUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKKwkJ CVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQlwdmgtPnB2X2dl bisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChwdik7Cit9CisKKy8qCisgKiBBZnRl ciBkZW1vdGlvbiBmcm9tIGEgMk1CIHBhZ2UgbWFwcGluZyB0byA1MTIgNEtCIHBhZ2UgbWFwcGlu Z3MsCisgKiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5k IHJlaW5zdGFudGlhdGUgdGhlIHB2CisgKiBlbnRyaWVzIGZvciBlYWNoIG9mIHRoZSA0S0IgcGFn ZSBtYXBwaW5ncy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpwYzsK Kwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisJ aW50IGJpdCwgZmllbGQ7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VE KTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKChwYSAmIFBE Uk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVu Y19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgor CSAqIFRyYW5zZmVyIHRoZSAybXBhZ2UncyBwdiBlbnRyeSBmb3IgdGhpcyBtYXBwaW5nIHRvIHRo ZSBmaXJzdAorCSAqIHBhZ2UncyBwdiBsaXN0LiAgT25jZSB0aGlzIHRyYW5zZmVyIGJlZ2lucywg dGhlIHB2IGxpc3QgbG9jaworCSAqIG11c3Qgbm90IGJlIHJlbGVhc2VkIHVudGlsIHRoZSBsYXN0 IHB2IGVudHJ5IGlzIHJlaW5zdGFudGlhdGVkLgorCSAqLworCXB2aCA9IHBhX3RvX3B2aChwYSk7 CisJdmEgPSB0cnVuY18ybXBhZ2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1h cCwgdmEpOworCUtBU1NFUlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5j X18pKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+ bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCW0tPm1kLnB2X2dlbisrOworCS8qIEluc3RhbnRp YXRlIHRoZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCVBWX1NUQVQoYXRv bWljX2FkZF9sb25nKCZwdl9lbnRyeV9hbGxvY3MsIE5QVEVQRyAtIDEpKTsKKwl2YV9sYXN0ID0g dmEgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKDs7KSB7CisJCXBjID0gVEFJTFFfRklSU1Qo JnBtYXAtPnBtX3B2Y2h1bmspOworCQlLQVNTRVJUKHBjLT5wY19tYXBbMF0gIT0gMCB8fCBwYy0+ cGNfbWFwWzFdICE9IDAgfHwKKwkJICAgIHBjLT5wY19tYXBbMl0gIT0gMCwgKCIlczogbWlzc2lu ZyBzcGFyZSIsIF9fZnVuY19fKSk7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBm aWVsZCsrKSB7CisJCQl3aGlsZSAocGMtPnBjX21hcFtmaWVsZF0pIHsKKwkJCQliaXQgPSBmZnNs KHBjLT5wY19tYXBbZmllbGRdKSAtIDE7CisJCQkJcGMtPnBjX21hcFtmaWVsZF0gJj0gfigxdWwg PDwgYml0KTsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtmaWVsZCAqIDY0ICsgYml0XTsKKwkJ CQl2YSArPSBQQUdFX1NJWkU7CisJCQkJcHYtPnB2X3ZhID0gdmE7CisJCQkJbSsrOworCQkJCUtB U1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJCQkJICAgKCIlczogcGFn ZSAlcCBpcyBub3QgbWFuYWdlZCIsIF9fZnVuY19fLCBtKSk7CisJCQkJVEFJTFFfSU5TRVJUX1RB SUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCQltLT5tZC5wdl9nZW4rKzsKKwkJ CQlpZiAodmEgPT0gdmFfbGFzdCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJVEFJTFFf UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9U QUlMKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJfQorb3V0OgorCWlmIChwYy0+ cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmIHBjLT5wY19tYXBbMl0gPT0g MCkgeworCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwl9CisJ UFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2NvdW50LCBOUFRFUEcgLSAxKSk7CisJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9lbnRyeV9zcGFyZSwgTlBURVBHIC0gMSkp OworfQorCisvKgorICogQWZ0ZXIgcHJvbW90aW9uIGZyb20gNTEyIDRLQiBwYWdlIG1hcHBpbmdz IHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBpbmcsCisgKiByZXBsYWNlIHRoZSBtYW55IHB2IGVu dHJpZXMgZm9yIHRoZSA0S0IgcGFnZSBtYXBwaW5ncyBieSBhIHNpbmdsZSBwdiBlbnRyeQorICog Zm9yIHRoZSAyTUIgcGFnZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdl9wcm9t b3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAg c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50 cnlfdCBwdjsKKwl2bV9vZmZzZXRfdCB2YV9sYXN0OworCXZtX3BhZ2VfdCBtOworCisJcndfYXNz ZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJS0FTU0VSVCgocGEgJiBQRFJNQVNL KSA9PSAwLAorCSAgICAoIiVzOiBwYSBpcyBub3QgMm1wYWdlIGFsaWduZWQiLCBfX2Z1bmNfXykp OworCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCisJLyoKKwkgKiBU cmFuc2ZlciB0aGUgZmlyc3QgcGFnZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhl IDJtcGFnZSdzCisJICogcHYgbGlzdC4gIEFzaWRlIGZyb20gYXZvaWRpbmcgdGhlIGNvc3Qgb2Yg YSBjYWxsIHRvIGdldF9wdl9lbnRyeSgpLAorCSAqIGEgdHJhbnNmZXIgYXZvaWRzIHRoZSBwb3Nz aWJpbGl0eSB0aGF0IGdldF9wdl9lbnRyeSgpIGNhbGxzCisJICogcmVjbGFpbV9wdl9jaHVuaygp IGFuZCB0aGF0IHJlY2xhaW1fcHZfY2h1bmsoKSByZW1vdmVzIG9uZSBvZiB0aGUKKwkgKiBtYXBw aW5ncyB0aGF0IGlzIGJlaW5nIHByb21vdGVkLgorCSAqLworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo cGEpOworCXZhID0gdHJ1bmNfMm1wYWdlKHZhKTsKKwlwdiA9IHBtYXBfcHZoX3JlbW92ZSgmbS0+ bWQsIHBtYXAsIHZhKTsKKwlLQVNTRVJUKHB2ICE9IE5VTEwsICgiJXM6IHB2IG5vdCBmb3VuZCIs IF9fZnVuY19fKSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwlUQUlMUV9JTlNFUlRfVEFJTCgm cHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJcHZoLT5wdl9nZW4rKzsKKwkvKiBGcmVlIHRo ZSByZW1haW5pbmcgTlBURVBHIC0gMSBwdiBlbnRyaWVzLiAqLworCXZhX2xhc3QgPSB2YSArIE5C UERSIC0gUEFHRV9TSVpFOworCWRvIHsKKwkJbSsrOworCQl2YSArPSBQQUdFX1NJWkU7CisJCXBt YXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJfSB3aGlsZSAodmEgPCB2YV9sYXN0KTsK K30KKworLyoKKyAqIEZpcnN0IGZpbmQgYW5kIHRoZW4gZGVzdHJveSB0aGUgcHYgZW50cnkgZm9y IHRoZSBzcGVjaWZpZWQgcG1hcCBhbmQgdmlydHVhbAorICogYWRkcmVzcy4gIFRoaXMgb3BlcmF0 aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gcHYgbGlzdHMgZm9yIGVpdGhlciA0S0Igb3IgMk1CCisg KiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wdmhfZnJlZShzdHJ1Y3Qg bWRfcGFnZSAqcHZoLCBwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHZfZW50cnlf dCBwdjsKKworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKHB2aCwgcG1hcCwgdmEpOworCUtBU1NFUlQo cHYgIT0gTlVMTCwgKCJwbWFwX3B2aF9mcmVlOiBwdiBub3QgZm91bmQsIHBhICVseCB2YSAlbHgi LAorCSAgICAgKHVfbG9uZylWTV9QQUdFX1RPX1BIWVMoX19jb250YWluZXJvZihwdmgsIHN0cnVj dCB2bV9wYWdlLCBtZCkpLAorCSAgICAgKHVfbG9uZyl2YSkpOworCWZyZWVfcHZfZW50cnkocG1h cCwgcHYpOworfQorCisvKgorICogQ29uZGl0aW9uYWxseSBjcmVhdGUgdGhlIHB2IGVudHJ5IGZv ciBhIDRLQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJlcXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFs bG9jYXRlZCB3aXRob3V0IHJlc3RvcnRpbmcgdG8gcmVjbGFtYXRpb24uCisgKi8KK3N0YXRpYyBi b29sZWFuX3QKK3BtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdl9l bnRyeV90IHB2OworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJ UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJaWYgKChwdiA9IGdldF9wdl9lbnRy eShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19WTV9QQUdFKGxvY2twLCBtKTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2VuKys7CisJCXJldHVybiAo VFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOworfQorCisvKgorICogQ29uZGl0aW9u YWxseSBjcmVhdGUgdGhlIFBWIGVudHJ5IGZvciBhIDJNQiBwYWdlIG1hcHBpbmcgaWYgdGhlIHJl cXVpcmVkCisgKiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlc29ydGluZyB0byBy ZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9wdl9pbnNlcnRfcGRlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcnds b2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2Owor CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FT U0VSVChwbWFwLCBNQV9PV05FRCk7CisJLyogUGFzcyBOVUxMIGluc3RlYWQgb2YgdGhlIGxvY2sg cG9pbnRlciB0byBkaXNhYmxlIHJlY2xhbWF0aW9uLiAqLworCWlmICgocHYgPSBnZXRfcHZfZW50 cnkocG1hcCwgTlVMTCkpICE9IE5VTEwpIHsKKwkJcHYtPnB2X3ZhID0gdmE7CisJCUNIQU5HRV9Q Vl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgcGEpOworCQlwdmggPSBwYV90b19wdmgocGEpOwor CQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCXB2aC0+ cHZfZ2VuKys7CisJCXJldHVybiAoVFJVRSk7CisJfSBlbHNlCisJCXJldHVybiAoRkFMU0UpOwor fQorCisKKy8qCisgKiBGaWxscyBhIHBhZ2UgdGFibGUgcGFnZSB3aXRoIG1hcHBpbmdzIHRvIGNv bnNlY3V0aXZlIHBoeXNpY2FsIHBhZ2VzLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9maWxsX3B0 cChwdF9lbnRyeV90ICpmaXJzdHB0ZSwgcHRfZW50cnlfdCBuZXdwdGUpCit7CisJcHRfZW50cnlf dCAqcHRlOworCisJZm9yIChwdGUgPSBmaXJzdHB0ZTsgcHRlIDwgZmlyc3RwdGUgKyBOUFRFUEc7 IHB0ZSsrKSB7CisJCSpwdGUgPSBuZXdwdGU7CisJCW5ld3B0ZSArPSAoUEFHRV9TSVpFID4+IFRM QkxPX1BGTl9TSElGVCk7CisJfQorfQorCisvKgorICogVHJpZXMgdG8gZGVtb3RlIGEgMk1CIHBh Z2UgbWFwcGluZy4gIElmIGRlbW90aW9uIGZhaWxzLCB0aGUgMk1CIHBhZ2UKKyAqIG1hcHBpbmcg aXMgaW52YWxpZGF0ZWQuCisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfZGVtb3RlX3BkZShw bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlzdHJ1Y3Qg cndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWxvY2sgPSBOVUxMOworCXJ2ID0gcG1h cF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisJaWYgKGxvY2sgIT0g TlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIGJv b2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJIHBk X2VudHJ5X3QgbmV3cGRlLCBvbGRwZGU7CisJIHB0X2VudHJ5X3Qgb2xkcHRlLCAqZmlyc3RwdGUs IG5ld3B0ZTsKKwkgdm1fcGFkZHJfdCBtcHRlcGE7CisJIHZtX3BhZ2VfdCBtcHRlOworCSBzdHJ1 Y3Qgc3BnbGlzdCBmcmVlOworCisJIFBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwor CSBvbGRwZGUgPSAqcGRlOworCSBvbGRwdGUgPSAocHRfZW50cnlfdClvbGRwZGU7CisJIEtBU1NF UlQocHRlX2lzXzFtX3N1cGVycGFnZSgmb2xkcHRlKSAmJiBwdGVfaXNfdmFsaWQoJm9sZHB0ZSks CisJICAgICAoIiVzOiBvbGRwZGUgaXMgbm90IHN1cGVycGFnZSBhbmQvb3IgdmFsaWQuIiwgX19m dW5jX18pKTsKKwkgaWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkgJiYgKG1wdGUgPSBwbWFwX2xvb2t1 cF9wdF9wYWdlKHBtYXAsIHZhKSkgIT0KKwkgICAgIE5VTEwpCisJCSBwbWFwX3JlbW92ZV9wdF9w YWdlKHBtYXAsIG1wdGUpOworCSBlbHNlIHsKKwkJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUs IFBURV9XKSwKKwkJICAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgZm9yIGEgd2lyZWQgbWFwcGlu ZyBpcyBtaXNzaW5nIiwKKwkJICAgICBfX2Z1bmNfXykpOworCQkgLyoKKwkJICAqIEludmFsaWRh dGUgdGhlIDJNQiBwYWdlIG1hcHBpbmcgYW5kIHJldHVybiAiZmFpbHVyZSIgaWYgdGhlCisJCSAg KiBtYXBwaW5nIHdhcyBuZXZlciBhY2Nlc3NlZCBvciB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3 CisJCSAgKiBwYWdlIHRhYmxlIHBhZ2UgZmFpbHMuICBJZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBi ZWxvbmdzIHRvCisJCSAgKiB0aGUgZGlyZWN0IG1hcCByZWdpb24gb2YgdGhlIGtlcm5lbCdzIGFk ZHJlc3Mgc3BhY2UsIHRoZW4KKwkJICAqIHRoZSBwYWdlIGFsbG9jYXRpb24gcmVxdWVzdCBzcGVj aWZpZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUKKwkJICAqIHByaW9yaXR5IChWTV9BTExPQ19JTlRF UlJVUFQpLiAgT3RoZXJ3aXNlLCB0aGUgcHJpb3JpdHkgaXMKKwkJICAqIG5vcm1hbC4gIFBhZ2Ug dGFibGUgcGFnZXMgYXJlIHByZWFsbG9jYXRlZCBmb3IgZXZlcnkgb3RoZXIKKwkJICAqIHBhcnQg b2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLCBzbyB0aGUgZGlyZWN0IG1hcCByZWdpb24KKwkJ ICAqIGlzIHRoZSBvbmx5IHBhcnQgb2YgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlIHRoYXQgbXVz dCBiZQorCQkgICogaGFuZGxlZCBoZXJlLgorCQkgICovCisJCSBpZiAoIXB0ZV9pc19yZWYoJm9s ZHB0ZSkgfHwgKG1wdGUgPSB2bV9wYWdlX2FsbG9jKE5VTEwsCisJCSAgICAgcG1hcF9wZGVfcGlu ZGV4KHZhKSwgKHZhID49IFZNX01JTl9LRVJORUxfQUREUkVTUyAmJiB2YSA8CisJCSAgICAgVk1f TUFYX0FERFJFU1MgPyBWTV9BTExPQ19JTlRFUlJVUFQgOiBWTV9BTExPQ19OT1JNQUwpIHwKKwkJ ICAgICBWTV9BTExPQ19OT09CSiB8IFZNX0FMTE9DX1dJUkVEKSkgPT0gTlVMTCkgeworCQkJIFNM SVNUX0lOSVQoJmZyZWUpOworCQkJIHBtYXBfcmVtb3ZlX3BkZShwbWFwLCBwZGUsIHRydW5jXzJt cGFnZSh2YSksICZmcmVlLAorCQkJICAgICBsb2NrcCk7CisJCQkgcG1hcF9pbnZhbGlkYXRlX3Jh bmdlKHBtYXAsCisJCQkgICAgICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSyksCisJCQkgICAg ICh2bV9vZmZzZXRfdCkodmEgJiB+UERSTUFTSykgKyBOQlBEUik7CisJCQkgcG1hcF9mcmVlX3pl cm9fcGFnZXMoJmZyZWUpOworCQkJIENUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEg JSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCSByZXR1 cm4gKEZBTFNFKTsKKwkJIH0KKwkJIGlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVTUykKKwkJCSBw bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKwkgfQorCSBtcHRlcGEgPSBWTV9QQUdF X1RPX1BIWVMobXB0ZSk7CisJIG5ld3BkZSA9IChwZF9lbnRyeV90KU1JUFNfUEhZU19UT19ESVJF Q1QobXB0ZXBhKTsKKwkgZmlyc3RwdGUgPSBuZXdwZGU7CisJIEtBU1NFUlQocHRlX2lzX3JlZigm b2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHB0ZSBpcyBub3QgcmVmZXJlbmNlZCIsIF9fZnVuY19f KSk7CisJIEtBU1NFUlQoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9STykgJiYgcHRlX3Rlc3QoJm9s ZHB0ZSwgUFRFX0QpLAorCSAgICAgKCIlczogb2xkcHRlIGlzIG1pc3NpbmcgUFRFX0QiLCBfX2Z1 bmNfXykpOworCSBuZXdwdGUgPSBvbGRwdGUgJiB+UFRFX1BTX0lEWF9NQVNLOworCisJIC8qCisJ ICAqIElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbmV3LCBpbml0aWFsaXplIGl0LgorCSAgKi8K KwkgaWYgKG1wdGUtPndpcmVfY291bnQgPT0gMSkgeworCQkgbXB0ZS0+d2lyZV9jb3VudCA9IE5Q VEVQRzsKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0ZSk7CisJIH0KKwkgS0FTU0VS VChUTEJMT19QVEVfVE9fUEEoKmZpcnN0cHRlKSA9PSBUTEJMT19QVEVfVE9fUEEobmV3cHRlKSwK KwkgICAgICgiJXM6IGZpcnN0cHRlIGFuZCBuZXdwdGUgbWFwIGRpZmZlcmVudCBwaHlzaWNhbCBh ZGRyZXNzZXMiLAorCSAgICAgX19mdW5jX18pKTsKKworCSAvKgorCSAgKiBJZiB0aGUgbWFwcGlu ZyBoYXMgY2hhbmdlZCBhdHRyaWJ1dGVzLCB1cGRhdGUgdGhlIHBhZ2UgdGFibGUKKwkgICogZW50 cmllcy4KKwkgICovCisJIGlmICgoKmZpcnN0cHRlICYgUEdfUFJPTU9URV9NQVNLKSAhPSAobmV3 cHRlICYgUEdfUFJPTU9URV9NQVNLKSkKKwkJIHBtYXBfZmlsbF9wdHAoZmlyc3RwdGUsIG5ld3B0 ZSk7CisKKworCSAvKgorCSAgKiBUaGUgc3BhcmUgUFYgZW50cmllcyBtdXN0IGJlIHJlc2VydmVk IHByaW9yIHRvIGRlbW90aW5nIHRoZQorCSAgKiBtYXBwaW5nLCB0aGF0IGlzLCBwcmlvciB0byBj aGFuZ2luZyB0aGUgUERFLiAgT3RoZXJ3aXNlLCB0aGUgc3RhdGUKKwkgICogb2YgdGhlIFBERSBh bmQgdGhlIFBWIGxpc3RzIHdpbGwgYmUgaW5jb25zaXN0ZW50LCB3aGljaCBjYW4gcmVzdWx0CisJ ICAqIGluIHJlY2xhaW1fcHZfY2h1bmsoKSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhIFBWIGVudHJ5 IGZyb20gdGhlCisJICAqIHdyb25nIFBWIGxpc3QgYW5kIHBtYXBfcHZfZGVtb3RlX3BkZSgpIGZh aWxpbmcgdG8gZmluZCB0aGUgZXhwZWN0ZWQKKwkgICogUFYgZW50cnkgZm9yIHRoZSAyTUIgcGFn ZSBtYXBwaW5nIHRoYXQgaXMgYmVpbmcgZGVtb3RlZC4KKwkgICovCisJIGlmIChwZGVfdGVzdCgm b2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCSByZXNlcnZlX3B2X2VudHJpZXMocG1hcCwgTlBURVBH IC0gMSwgbG9ja3ApOworCisJIC8qCisJICAqIERlbW90ZSB0aGUgbWFwcGluZy4gIFRoaXMgcG1h cCBpcyBsb2NrZWQuICBUaGUgb2xkIFBERSBoYXMKKwkgICogUFRFX1JFRiBzZXQuICBJZiB0aGUg b2xkIFBERSBoYXMgUFRFX1JPIGNsZWFyLCBpdCBhbHNvIGhhcworCSAgKiBQVEVfRCBzZXQuICBU aHVzLCB0aGVyZSBpcyBubyBkYW5nZXIgb2YgYSByYWNlIHdpdGggYW5vdGhlcgorCSAgKiBwcm9j ZXNzb3IgY2hhbmdpbmcgdGhlIHNldHRpbmcgb2YgUFRFX1JFRiBhbmQvb3IgUFRFX0QgYmV0d2Vl bgorCSAgKiB0aGUgcmVhZCBhYm92ZSBhbmQgdGhlIHN0b3JlIGJlbG93LgorCSAgKi8KKwkgcG1h cF91cGRhdGVfcGRlKHBtYXAsIHZhLCBwZGUsIChwdF9lbnRyeV90KW5ld3BkZSk7CisKKwkgLyoK KwkgICogSW52YWxpZGF0ZSBhIHN0YWxlIHJlY3Vyc2l2ZSBtYXBwaW5nIG9mIHRoZSBwYWdlIHRh YmxlIHBhZ2UuCisJICAqLworCSBpZiAodmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkgcG1h cF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgKHZtX29mZnNldF90KXBtYXBfcHRlKHBtYXAsIHZhKSk7 CisKKwkgLyoKKwkgICogRGVtb3RlIHRoZSBQViBlbnRyeS4KKwkgICovCisJIGlmIChwZGVfdGVz dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwLCB2 YSwgVExCTE9fUERFX1RPX1BBKG9sZHBkZSksIGxvY2twKTsKKwkgfQorCSBhdG9taWNfYWRkX2xv bmcoJnBtYXBfcGRlX2RlbW90aW9ucywgMSk7CisJIENUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICAgcG1hcCk7CisK KwkgcmV0dXJuIChUUlVFKTsKK30KKworLyoKKyAqIHBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IFJl bW92ZSBhIGtlcm5lbCBzdXBlcnBhZ2UgbWFwcGluZy4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBf cmVtb3ZlX2tlcm5lbF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJLyogWFhYIE5vdCBkb2luZyBrZXJuZWwgc3VwZXJwYWdlcyB5ZXQuICovCisJ cGFuaWMoInBtYXBfcmVtb3ZlX2tlcm5lbF9wZGU6IGtlcm5lbCBzdXBlcnBhZ2UiKTsKK30KKwor LyoKKyAqIHBtYXBfcmVtb3ZlX3BkZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHN1cGVycGFn ZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1vdmVfcGRlKHBtYXBfdCBw bWFwLCBwZF9lbnRyeV90ICpwZHEsIHZtX29mZnNldF90IHN2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlz dCAqZnJlZSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7 CisJcGRfZW50cnlfdCBvbGRwZGU7CisJdm1fb2Zmc2V0X3QgZXZhLCB2YTsKKwl2bV9wYWdlX3Qg bSwgbXB0ZTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUg c3VwZXJwYWdlIGJlaW5nIHVubWFwcGVkLgorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl X2luZGV4KChzdmEgJiB+UERSTUFTSyksIE5CUERSKTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1h cCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHN2YSAmIFBEUk1BU0spID09IDAsCisJICAgICgicG1h cF9yZW1vdmVfcGRlOiBzdmEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIikpOworCisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKQorCQlvbGRwZGUgPSBwZGVfbG9hZF9zdG9yZShwZHEsIFBURV9HKTsK KwllbHNlCisJCW9sZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgMCk7CisJaWYgKHBkZV90ZXN0 KCZvbGRwZGUsIFBURV9XKSkKKwkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQgLT0gTkJQRFIg LyBQQUdFX1NJWkU7CisKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX0cpKQorCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShrZXJuZWxfcG1hcCwgc3ZhKTsKKworCXBtYXBfcmVzaWRlbnRfY291bnRf ZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRF X01BTkFHRUQpKSB7CisJICAgIENIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fUEhZUyhsb2NrcCwgVExC TE9fUERFX1RPX1BBKG9sZHBkZSkpOworCSAgICBwdmggPSBwYV90b19wdmgoVExCTE9fUERFX1RP X1BBKG9sZHBkZSkpOworCSAgICBwbWFwX3B2aF9mcmVlKHB2aCwgcG1hcCwgc3ZhKTsKKwkgICAg ZXZhID0gc3ZhICsgTkJQRFI7CisJICAgIGZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RPX1ZNX1BB R0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQl2YSA8IGV2YTsgdmEgKz0gUEFHRV9TSVpF LCBtKyspIHsKKwkJICAgIGlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYgIXBkZV90ZXN0 KCZvbGRwZGUsIFBURV9STykpCisJCQkgICAgdm1fcGFnZV9kaXJ0eShtKTsKKwkJICAgIGlmIChw ZGVfdGVzdCgmb2xkcGRlLCBQVEVfUkVGKSkKKwkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9S RUZFUkVOQ0VEKTsKKwkJICAgIGlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJ CVRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIo bSwgUEdBX1dSSVRFQUJMRSk7CisJICAgIH0KKwl9CisJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXAp IHsKKwkJcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwLCBwZHEsIHN2YSk7CisJfSBlbHNlIHsK KwkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgc3ZhKTsKKwkJaWYgKG1wdGUgIT0g TlVMTCkgeworCQkJcG1hcF9yZW1vdmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCXBtYXBfcmVz aWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09 IE5QVEVQRywKKwkJCSAgICAoInBtYXBfcmVtb3ZlX3BkZTogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl cnJvciIpKTsKKwkJCW1wdGUtPndpcmVfY291bnQgPSAwOworCQkJcG1hcF9hZGRfZGVsYXllZF9m cmVlX2xpc3QobXB0ZSwgZnJlZSwgRkFMU0UpOworCQkJYXRvbWljX3N1YnRyYWN0X2ludCgmdm1f Y250LnZfd2lyZV9jb3VudCwgMSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBt YXAsIHN2YSwgKnBtYXBfc2VnbWFwKHBtYXAsIHN2YSksIGZyZWUpKTsKK30KKworLyoKKyAqIHBt YXBfcmVtb3ZlX3B0ZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHBhZ2UgaW4gYSBwcm9jZXNz CisgKi8KK3N0YXRpYyBpbnQKK3BtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRf ZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3Ry dWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf cGFnZSAqcHZoOworCXB0X2VudHJ5X3Qgb2xkcHRlOworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9M T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNh Y2hlIGxpbmVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJICovCisJbWlwc19kY2Fj aGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7CisKKwlvbGRwdGUgPSAqcHRxOwor CWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJKnB0cSA9IFBURV9HOworCWVsc2UKKwkJKnB0 cSA9IDA7CisKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQlwbWFwLT5wbV9zdGF0 cy53aXJlZF9jb3VudCAtPSAxOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7 CisJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9NQU5BR0VEKSkgeworCQltID0gUEhZU19UT19W TV9QQUdFKFRMQkxPX1BURV9UT19QQShvbGRwdGUpKTsKKwkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUs IFBURV9EKSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSwKKwkJCSAg ICgiJXM6IG1vZGlmaWVkIHBhZ2Ugbm90IHdyaXRhYmxlOiB2YTogJXAsIHB0ZTogJSNqeCIsCisJ CQkgICAgX19mdW5jX18sICh2b2lkICopdmEsICh1aW50bWF4X3Qpb2xkcHRlKSk7CisJCQl2bV9w YWdlX2RpcnR5KG0pOworCQl9CisJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJdm1fcGFn ZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RP X1ZNX1BBR0UobG9ja3AsIG0pOworCQlwbWFwX3B2aF9mcmVlKCZtLT5tZCwgcG1hcCwgdmEpOwor CQlpZiAoVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJCSAgICAobS0+ZmxhZ3MgJiBQ R19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlT KG0pKTsKKwkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9saXN0KSkKKwkJCQl2bV9wYWdlX2Fm bGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCQl9CisJfQorCXJldHVybiAocG1hcF91bnVz ZV9wdChwbWFwLCB2YSwgcHRlcGRlLCBmcmVlKSk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBzaW5n bGUgcGFnZSBmcm9tIGEgcHJvY2VzcyBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyB2b2lkCitw bWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0 IHNwZ2xpc3QgKmZyZWUpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05F RCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRl ID09IDApCisJCXJldHVybjsKKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisKKwkv KgorCSAqIElmIHRoZXJlIGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQh CisJICovCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkKKwkJcmV0dXJuOworCisJbG9jayA9IE5V TEw7CisJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0ZSwgdmEsICpwZGUsIGZyZWUsICZs b2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKK30KKworLyoKKyAqCVJlbW92ZSB0aGUgZ2l2ZW4gcmFu Z2Ugb2YgYWRkcmVzc2VzIGZyb20gdGhlIHNwZWNpZmllZCBtYXAuCisgKgorICoJSXQgaXMgYXNz dW1lZCB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGFyZSBwcm9wZXJseQorICoJcm91bmRlZCB0byB0 aGUgcGFnZSBzaXplLgorICovCit2b2lkCitwbWFwX3JlbW92ZShwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2 bV9vZmZzZXRfdCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90IHB0cGFkZHIsICpwZGUsICpwZHBl OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCWludCBhbnl2YWxp ZDsKKworCS8qCisJICogUGVyZm9ybSBhbiB1bnN5bmNocm9uaXplZCByZWFkLiAgVGhpcyBpcywg aG93ZXZlciwgc2FmZS4KKwkgKi8KKwlpZiAocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQg PT0gMCkKKwkJcmV0dXJuOworCisJYW55dmFsaWQgPSAwOworCVNMSVNUX0lOSVQoJmZyZWUpOwor CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCisJLyoK KwkgKiBzcGVjaWFsIGhhbmRsaW5nIG9mIHJlbW92aW5nIG9uZSBwYWdlLiAgYSB2ZXJ5IGNvbW1v biBvcGVyYXRpb24KKwkgKiBhbmQgZWFzeSB0byBzaG9ydCBjaXJjdWl0IHNvbWUgY29kZS4KKwkg Ki8KKwlpZiAoKHN2YSArIFBBR0VfU0laRSkgPT0gZXZhKSB7CisJCXBkZSA9IHBtYXBfcGRlKHBt YXAsIHN2YSk7CisJCWlmICghcGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlwbWFwX3Jl bW92ZV9wYWdlKHBtYXAsIHN2YSwgJmZyZWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwls b2NrID0gTlVMTDsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCWlmIChw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJcGRwZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0 ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIENhbGN1bGF0ZSBp bmRleCBmb3IgbmV4dCBwYWdlIHRhYmxlLgorCQkgKi8KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBE UikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOwor CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJcHRwYWRkciA9ICpwZGU7 CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmIChw dHBhZGRyID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogQ2hlY2sgZm9yIHN1cGVy cGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKCZwdHBhZGRyKSkgeworCQkJ LyoKKwkJCSAqIEFyZSB3ZSByZW1vdmluZyB0aGUgZW50aXJlIHN1cGVycGFnZT8gIElmIG5vdCwK KwkJCSAqIGRlbW90ZSB0aGUgbWFwcGluZyBhbmQgZmFsbCB0aHJvdWdoLgorCQkJICovCisJCQlp ZiAoc3ZhICsgTkJQRFIgPT0gdmFfbmV4dCAmJiBldmEgPj0gdmFfbmV4dCkgeworCQkJCS8qCisJ CQkJICogVGhlIFRMQiBlbnRyeSBmb3IgYSBQVEVfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxp ZGF0ZWQgYnkgcG1hcF9yZW1vdmVfcGRlKCkuCisJCQkJICovCisJCQkJaWYgKCFwZGVfdGVzdCgm cHRwYWRkciwgUFRFX0cpKQorCQkJCQlhbnl2YWxpZCA9IFRSVUU7CisJCQkJcG1hcF9yZW1vdmVf cGRlKHBtYXAsIHBkZSwgc3ZhLCAmZnJlZSwgJmxvY2spOworCQkJCWNvbnRpbnVlOworCQkJfSBl bHNlIGlmICghcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwKKwkJCSAgICAm bG9jaykpIHsKKwkJCQkvKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRlc3Ryb3llZC4gKi8K KwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcHRwYWRkciA9ICpwZGU7CisJCQl9CisJ CX0KKworCQkvKgorCQkgKiBMaW1pdCBvdXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUg dmEgcmVwcmVzZW50ZWQKKwkJICogYnkgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0 byB0aGUgZW5kIG9mIHRoZQorCQkgKiByYW5nZSBiZWluZyByZW1vdmVkLgorCQkgKi8KKwkJaWYg KHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJ Zm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRl KyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUp KSB7CisJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKKwkJCQkJcG1hcF9pbnZhbGlkYXRlX3Jhbmdl KHBtYXAsIHZhLCBzdmEpOworCQkJCQl2YSA9IHZhX25leHQ7CisJCQkJfQorCQkJCWNvbnRpbnVl OworCQkJfQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlhbnl2YWxpZCA9IFRS VUU7CisJCQlpZiAodmEgPT0gdmFfbmV4dCkKKwkJCQl2YSA9IHN2YTsKKwkJCWlmIChwbWFwX3Jl bW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsIHB0cGFkZHIsICZmcmVlLAorCQkJICAgICZsb2NrKSkg eworCQkJCXN2YSArPSBQQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHZh ICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJ fQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CitvdXQ6CisJaWYgKGFu eXZhbGlkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworfQorCisvKgorICoJUm91dGluZToJcG1hcF9yZW1vdmVfYWxsCisgKglGdW5jdGlv bjoKKyAqCQlSZW1vdmVzIHRoaXMgcGh5c2ljYWwgcGFnZSBmcm9tCisgKgkJYWxsIHBoeXNpY2Fs IG1hcHMgaW4gd2hpY2ggaXQgcmVzaWRlcy4KKyAqCQlSZWZsZWN0cyBiYWNrIG1vZGlmeSBiaXRz IHRvIHRoZSBwYWdlci4KKyAqCisgKglOb3RlczoKKyAqCQlPcmlnaW5hbCB2ZXJzaW9ucyBvZiB0 aGlzIHJvdXRpbmUgd2VyZSB2ZXJ5CisgKgkJaW5lZmZpY2llbnQgYmVjYXVzZSB0aGV5IGl0ZXJh dGl2ZWx5IGNhbGxlZAorICoJCXBtYXBfcmVtb3ZlIChzbG93Li4uKQorICovCit2b2lkCitwbWFw X3JlbW92ZV9hbGwodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9l bnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgdHB0ZTsKKwlwZF9l bnRyeV90ICpwZGU7CisJdm1fb2Zmc2V0X3QgdmE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwor CUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9y ZW1vdmVfYWxsOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCVNMSVNUX0lOSVQoJmZy ZWUpOworCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQR19G SUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2aCA9IHBhX3RvX3B2 aChWTV9QQUdFX1RPX1BIWVMobSkpOworCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmcHZoLT5w dl9saXN0KSkgIT0gTlVMTCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCVBNQVBfTE9DSyhw bWFwKTsKKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJ KHZvaWQpcG1hcF9kZW1vdGVfcGRlKHBtYXAsIHBkZSwgdmEpOworCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwl3aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1k LnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NL KHBtYXApOworCisJCS8qCisJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg Y2FjaGVzIGZyb20KKwkJICogdGhlIHBhZ2UgYmVpbmcgZGVzdHJveWVkCisJCSAqLworCQlpZiAo VEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgPT0gTlVMTCkKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh bmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsKKworCQlwbWFwX3Jlc2lkZW50X2NvdW50 X2RlYyhwbWFwLCAxKTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT U0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAsICgicG1hcF9yZW1vdmVfYWxsOiBwZGUiKSk7 CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFwX3JlbW92ZV9hbGw6IGZv dW5kIgorCQkgICAgIiBhIHN1cGVycGFnZSBpbiBwYWdlICVwICdzIHB2IGxpc3QiLCBtKSk7CisJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisKKwkJdHB0ZSA9ICpwdGU7 CisJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9wbWFwKHBtYXApID8gUFRFX0cgOiAwKTsKKwor CQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv dW50LS07CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgZGlydHkgYW5kIHJlZmVy ZW5jZSBiaXRzLgorCQkgKi8KKwkJaWYgKHB0ZV9pc19yZWYoJnRwdGUpKQorCQkJdm1fcGFnZV9h ZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9E KSkgeworCQkJS0FTU0VSVCghcHRlX3Rlc3QoJnRwdGUsIFBURV9STyksCisJCQkgICAgKCIlczog bW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IgorCQkJICAgICwg X19mdW5jX18sICh2b2lkICopcHYtPnB2X3ZhLCAodWludG1heF90KXRwdGUpKTsKKwkJCXZtX3Bh Z2VfZGlydHkobSk7CisJCX0KKwkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUs ICZmcmVlKTsKKwkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKworCQlU QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJbS0+bWQucHZfZ2Vu Kys7CisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9 CisKKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxvY2so JnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworfQorCisv KgorICogcG1hcF9wcm90ZWN0X3BkZTogZG8gdGhlIHRoaW5ncyB0byBwcm90ZWN0IGEgc3VwZXJw YWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3Byb3RlY3RfcGRl KHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHN2YSwgdm1fcHJvdF90 IHByb3QpCit7CisJcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwl2bV9vZmZzZXRfdCBldmEs IHZhOworCXZtX3BhZ2VfdCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkOworCisJUE1BUF9MT0NL X0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3ZhICYgUERSTUFTSykgPT0gMCwK KwkgICAgKCIlczogc3ZhIGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJYW55 Y2hhbmdlZCA9IEZBTFNFOworcmV0cnk6CisJb2xkcGRlID0gbmV3cGRlID0gKnBkZTsKKwlpZiAo cGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKSB7CisJCWV2YSA9IHN2YSArIE5CUERSOwor CQlmb3IgKHZhID0gc3ZhLCBtID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BERV9UT19QQShvbGRw ZGUpKTsKKwkJICAgIHZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykKKwkJCWlmIChwZGVf dGVzdCgmb2xkcGRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JP KSkKKwkJCQl2bV9wYWdlX2RpcnR5KG0pOworCX0KKwlpZiAoKHByb3QgJiBWTV9QUk9UX1dSSVRF KSA9PSAwKSB7CisJCXBkZV9zZXQoJm5ld3BkZSwgUFRFX1JPKTsKKwkJcGRlX2NsZWFyKCZuZXdw ZGUsIFBURV9EKTsKKwl9CisJaWYgKG5ld3BkZSAhPSBvbGRwZGUpIHsKKwkJaWYgKCFhdG9taWNf Y21wc2V0X2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIChwdF9lbnRyeV90KW9sZHBkZSwKKwkJICAg IChwdF9lbnRyeV90KW5ld3BkZSkpCisJCQlnb3RvIHJldHJ5OworCQlpZiAocGRlX3Rlc3QoJm9s ZHBkZSwgUFRFX0cpKQorCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJZWxz ZQorCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJfQorCXJldHVybiAoYW55Y2hhbmdlZCk7Cit9CisK Ky8qLQorICoJU2V0IHRoZSBwaHlzaWNhbCBwcm90ZWN0aW9uIG9uIHRoZQorICoJc3BlY2lmaWVk IHJhbmdlIG9mIHRoaXMgbWFwIGFzIHJlcXVlc3RlZC4KKyAqLwordm9pZAorcG1hcF9wcm90ZWN0 KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSwgdm1fcHJvdF90 IHByb3QpCit7CisJdm1fb2Zmc2V0X3QgdmEsIHZhX25leHQ7CisJcGRfZW50cnlfdCAqcGRlLCAq cGRwZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3Rz X2xvY2tlZDsKKworCWlmICgocHJvdCAmIFZNX1BST1RfUkVBRCkgPT0gVk1fUFJPVF9OT05FKSB7 CisJCXBtYXBfcmVtb3ZlKHBtYXAsIHN2YSwgZXZhKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocHJv dCAmIFZNX1BST1RfV1JJVEUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNF OworcmVzdW1lOgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlm b3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3NlZ21hcChw bWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgeworCQkJdmFfbmV4dCA9IChzdmEgKyBOQlNF RykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25leHQgPSBldmE7 CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNL OworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1h cF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCisJCS8qCisJCSAqIFdlZWQgb3V0IGludmFsaWQg bWFwcGluZ3MuCisJCSAqLworCQlpZiAoKnBkZSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJ LyoKKwkJICogQ2hlY2sgZm9yIHN1cGVycGFnZS4KKwkJICovCisJCWlmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkZSkpIHsKKwkJCS8qCisJCQkgKiBBcmUgd2UgcHJvdGVjdGluZyB0aGUgZW50aXJl IHN1cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRo cm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2 YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBHX0cgbWFwcGlu ZyBpcworCQkJCSAqIGludmFsaWRhdGVkIGJ5IHBtYXBfcHJvdGVjdF9wZGUoKS4KKwkJCQkgKi8K KwkJCQlpZiAocG1hcF9wcm90ZWN0X3BkZShwbWFwLCBwZGUsIHN2YSwgcHJvdCkpCisJCQkJCWFu eWNoYW5nZWQgPSBUUlVFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXB2 X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOworCQkJCQlpZiAo IXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJaWYgKGFueWNoYW5nZWQp CisJCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbCgKKwkJCQkJCQkgICAgcG1hcCk7CisJCQkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJ CQkJZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUo cG1hcCwgcGRlLCBzdmEpKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGlu ZyB3YXMgZGVzdHJveWVkLgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQor CQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2 YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRv IHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5nIHdyaXRlIHByb3RlY3RlZC4KKwkJICov CisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQl2YSA9IHZhX25l eHQ7CisJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25l eHQ7IHB0ZSsrLAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJcHRfZW50cnlfdCBwYml0 czsKKwkJCXZtX3BhZ2VfdCBtOworCQkJdm1fcGFkZHJfdCBwYTsKKworCQkJcGJpdHMgPSAqcHRl OworCQkJaWYgKCFwdGVfaXNfdmFsaWQoJnBiaXRzKSB8fCBwdGVfdGVzdCgmcGJpdHMsIFBURV9S TykpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu Z2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGlu dWU7CisJCQl9CisJCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKwkJCWlmIChwdGVfdGVzdCgm cGJpdHMsIFBURV9EKSkgeworCQkJCXB0ZV9jbGVhcigmcGJpdHMsIFBURV9EKTsKKwkJCQlpZiAo cHRlX3Rlc3QoJnBiaXRzLCBQVEVfTUFOQUdFRCkpIHsKKwkJCQkJcGEgPSBUTEJMT19QVEVfVE9f UEEocGJpdHMpOworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQkJdm1fcGFnZV9k aXJ0eShtKTsKKwkJCQl9CisJCQkJaWYgKHZhID09IHZhX25leHQpCisJCQkJCXZhID0gc3ZhOwor CQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFVubGVzcyBQVEVfRCBpcyBzZXQsIGFueSBUTEIg ZW50cmllcworCQkJCSAqIG1hcHBpbmcgInN2YSIgZG9uJ3QgYWxsb3cgd3JpdGUgYWNjZXNzLCBz bworCQkJCSAqIHRoZXkgbmVlZG4ndCBiZSBpbnZhbGlkYXRlZC4KKwkJCQkgKi8KKwkJCQlpZiAo dmEgIT0gdmFfbmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2 YSk7CisJCQkJCXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQl9CisJCQkqcHRlID0gcGJpdHM7CisJ CX0KKwkJaWYgKHZhICE9IHZhX25leHQpCisJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwg dmEsIHN2YSk7CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBt YXApOworCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s b2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qLQorICogVHJpZXMgdG8gcHJv bW90ZSB0aGUgNTEyLCBjb250aWd1b3VzIDRLQiBwYWdlIG1hcHBpbmdzIHRoYXQgYXJlIHdpdGhp biBhCisgKiBzaW5nbGUgcGFnZSB0YWJsZSBwYWdlIHRvIGEgc2luZ2xlIDJNQiBwYWdlIG1hcHBp bmcuICBGb3IgcHJvbW90aW9uIHRvCisgKiBvY2N1ciwgdHdvIGNvbmRpdGlvbnMgbXVzdCBiZSBt ZXQ6ICgxKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBtYXAKKyAqIGFsaWduZWQsIGNvbnRp Z3VvdXMgcGh5c2ljYWwgbWVtb3J5IGFuZCAoMikgdGhlIDRLQiBwYWdlIG1hcHBpbmdzIG11c3Qg aGF2ZQorICogaWRlbnRpY2FsIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBPbiBNSVBTNjQgcHJv bW90aW9ucyBhcmUgYWN0dWFsbHkgZG9uZSBpbiBwYWlycyBvZiB0d28gMU1CIHN1cGVycGFnZXMK KyAqIGJlY2F1c2Ugb2YgdGhlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZSAodHdvIHBoeXNpY2FsIHBh Z2VzIGFyZSBpbiBhIHNpbmdsZQorICogVExCIGVudHJ5KSBldmVuIHRob3VnaCBWTSBsYXllciBp cyB1bmRlciB0aGUgaW1wcmVzc2lvbiB0aGF0IHRoZSBzdXBlcnBhZ2UKKyAqIHNpemUgaXMgYWN0 dWFsbHkgMk1CLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9wcm9tb3RlX3BkZShwbWFwX3QgcG1h cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoq bG9ja3ApCit7CisJcHRfZW50cnlfdCBuZXdwZGU7CisJcHRfZW50cnlfdCAqZmlyc3RwdGUsIG9s ZHB0ZSwgcGEsICpwdGU7CisJdm1fb2Zmc2V0X3Qgb2xkcHRldmE7CisJdm1fcGFnZV90IG1wdGU7 CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKgorCSAqIEV4YW1pbmUg dGhlIGZpcnN0IFBURSBpbiB0aGUgc3BlY2lmaWVkIFBUUC4gIEFib3J0IGlmIHRoaXMgUFRFIGlz CisJICogZWl0aGVyIGludmFsaWQsIHVudXNlZCwgb3IgZG9lcyBub3QgbWFwIHRoZSBmaXJzdCA0 S0IgcGh5c2ljYWwgcGFnZQorCSAqIHdpdGhpbiBhIDJNQiBwYWdlLgorCSAqLworCWZpcnN0cHRl ID0gcG1hcF9wdGUocG1hcCwgdHJ1bmNfMm1wYWdlKHZhKSk7CitzZXRwZGU6CisJbmV3cGRlID0g KmZpcnN0cHRlOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQkvKiBYWFggbm90IGRv aW5nIGtlcm5lbCBwbWFwIHlldCAqLworCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFp bHVyZXMsIDEpOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g cG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm47CisJfQorCWlm ICghcHRlX2lzX3ZhbGlkKCZuZXdwZGUpIHx8ICFwdGVfaXNfcmVmKCZuZXdwZGUpKSB7CisJCWF0 b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRCkg JiYgIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9STykpIHsKKwkJLyoKKwkJICogV2hlbiBQVEVfRCBp cyBhbHJlYWR5IGNsZWFyLCBQVEVfUk8gY2FuIGJlIHNldCB3aXRob3V0CisJCSAqIGEgVExCIGlu dmFsaWRhdGlvbi4KKwkJICovCisJCWlmICghYXRvbWljX2NtcHNldF9sb25nKCh1X2xvbmcgKilm aXJzdHB0ZSwgbmV3cGRlLCBuZXdwZGUgfAorCQkgICAgUFRFX1JPKSkKKwkJCWdvdG8gc2V0cGRl OworCQluZXdwZGUgfD0gUFRFX1JPOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIG9mIHRo ZSBvdGhlciBQVEVzIGluIHRoZSBzcGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcworCSAqIFBU RSBtYXBzIGFuIHVuZXhwZWN0ZWQgNEtCIHBoeXNpY2FsIHBhZ2Ugb3IgZG9lcyBub3QgaGF2ZSBp ZGVudGljYWwKKwkgKiBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIGZpcnN0IFBURS4KKwkgKi8KKwlw YSA9IFRMQkxPX1BURV9UT19QQShuZXdwZGUpICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZm9yIChw dGUgPSBmaXJzdHB0ZSArIE5QVEVQRyAtIDE7IHB0ZSA+IGZpcnN0cHRlOyBwdGUtLSkgeworc2V0 cHRlOgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoVExCTE9fUFRFX1RPX1BBKG9sZHB0ZSkgIT0g cGEpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCQlD VFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkg ICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXB0ZV90ZXN0 KCZvbGRwdGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJaWYg KCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsIG9sZHB0ZSB8IFBURV9STykpCisJCQkJ Z290byBzZXRwdGU7CisJCQlvbGRwdGUgfD0gUFRFX1JPOworCQkJb2xkcHRldmEgPSAodmEgJiB+ UERSTUFTSykgfAorCQkJICAgIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAmIFBEUk1BU0spOwor CQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBwcm90ZWN0IGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAor CQkJICAgIF9fZnVuY19fLCBvbGRwdGV2YSwgcG1hcCk7CisJCX0KKwkJaWYgKChvbGRwdGUgJiBQ R19QUk9NT1RFX01BU0spICE9IChuZXdwZGUgJiBQR19QUk9NT1RFX01BU0spKSB7CisJCQlhdG9t aWNfYWRkX2xvbmcoJnBtYXBfcGRlX3BfZmFpbHVyZXMsIDEpOworCQkJQ1RSMyhLVFJfUE1BUCwg IiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCQlyZXR1cm47CisJCX0KKwkJcGEgLT0gUEFHRV9TSVpFOworCX0KKworCS8q CisJICogU2F2ZSB0aGUgcGFnZSB0YWJsZSBwYWdlIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGls IHRoZSBQREUKKwkgKiBtYXBwaW5nIHRoZSBzdXBlcnBhZ2UgaXMgZGVtb3RlZCBieSBwbWFwX2Rl bW90ZV9wZGUoKSBvcgorCSAqIGRlc3Ryb3llZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4KKwkgKi8K KwltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKnBkZSkpOworCUtB U1NFUlQobXB0ZSA+PSB2bV9wYWdlX2FycmF5ICYmCisJICAgIG1wdGUgPCAmdm1fcGFnZV9hcnJh eVt2bV9wYWdlX2FycmF5X3NpemVdLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UgaXMgb3V0 IG9mIHJhbmdlIiwgX19mdW5jX18pKTsKKwlLQVNTRVJUKG1wdGUtPnBpbmRleCA9PSBwbWFwX3Bk ZV9waW5kZXgodmEpLAorCSAgICAoIiVzOiBwYWdlIHRhYmxlIHBhZ2UncyBwaW5kZXggaXMgd3Jv bmciLCBfX2Z1bmNfXykpOworCWlmIChwbWFwX2luc2VydF9wdF9wYWdlKHBtYXAsIG1wdGUpKSB7 CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFByb21vdGUgdGhlIHB2 IGVudHJpZXMuCisJICovCisJaWYgKHB0ZV90ZXN0KCZuZXdwZGUsIFBURV9NQU5BR0VEKSkKKwkJ cG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwLCB2YSwgVExCTE9fUFRFX1RPX1BBKG5ld3BkZSksIGxv Y2twKTsKKworCS8qCisJICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICovCisJcG1hcF91cGRhdGVf cGRlKHBtYXAsIHZhLCBwZGUsIG5ld3BkZSB8IFBURV9QU18xTSk7CisKKwlhdG9taWNfYWRkX2xv bmcoJnBtYXBfcGRlX3Byb21vdGlvbnMsIDEpOworCUNUUjMoS1RSX1BNQVAsICIlczogc3VjY2Vz cyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZhLAorCSAgICBwbWFwKTsKK30K KworLyoKKyAqCUluc2VydCB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFnZSAocCkgYXQKKyAqCXRoZSBz cGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzICh2KSBpbiB0aGUKKyAqCXRhcmdldCBwaHlzaWNhbCBt YXAgd2l0aCB0aGUgcHJvdGVjdGlvbiByZXF1ZXN0ZWQuCisgKgorICoJSWYgc3BlY2lmaWVkLCB0 aGUgcGFnZSB3aWxsIGJlIHdpcmVkIGRvd24sIG1lYW5pbmcKKyAqCXRoYXQgdGhlIHJlbGF0ZWQg cHRlIGNhbiBub3QgYmUgcmVjbGFpbWVkLgorICoKKyAqCU5COiAgVGhpcyBpcyB0aGUgb25seSBy b3V0aW5lIHdoaWNoIE1BWSBOT1QgbGF6eS1ldmFsdWF0ZQorICoJb3IgbG9zZSBpbmZvcm1hdGlv bi4gIFRoYXQgaXMsIHRoaXMgcm91dGluZSBtdXN0IGFjdHVhbGx5CisgKglpbnNlcnQgdGhpcyBw YWdlIGludG8gdGhlIGdpdmVuIG1hcCBOT1cuCisgKi8KK2ludAorcG1hcF9lbnRlcihwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwKKyAgICB1 X2ludCBmbGFncywgaW50OF90IHBzaW5kIF9fdW51c2VkKQoreworICAgICAgICBzdHJ1Y3Qgcnds b2NrICpsb2NrOworICAgICAgICB2bV9wYWRkcl90IHBhLCBvcGE7CisgICAgICAgIHBkX2VudHJ5 X3QgKnBkZTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworICAgICAgICBwdF9lbnRyeV90IG9y aWdwdGUsIG5ld3B0ZTsKKyAgICAgICAgcHZfZW50cnlfdCBwdjsKKyAgICAgICAgdm1fcGFnZV90 IG1wdGUsIG9tOworICAgICAgICBib29sZWFuX3Qgbm9zbGVlcDsKKworICAgICAgICB2YSA9IHRy dW5jX3BhZ2UodmEpOworICAgICAgICBLQVNTRVJUKHZhIDw9IFZNX01BWF9LRVJORUxfQUREUkVT UywgKCJwbWFwX2VudGVyOiB0b29iaWciKSk7CisgICAgICAgIEtBU1NFUlQoKG0tPm9mbGFncyAm IFZQT19VTk1BTkFHRUQpICE9IDAgfHwgdmEgPCBrbWkuY2xlYW5fc3ZhIHx8CisgICAgICAgICAg ICB2YSA+PSBrbWkuY2xlYW5fZXZhLAorICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtYW5hZ2Vk IG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiKSk7CisgICAgICAgIGlmICgobS0+b2Zs YWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAmJiAhdm1fcGFnZV94YnVzaWVkKG0pKQorICAgICAg ICAgICAgICAgIFZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG0tPm9iamVjdCk7CisKKyAgICAgICAg bXB0ZSA9IE5VTEw7CisKKyAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIHJ3X3Jsb2NrKCZw dmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX0xPQ0socG1hcCk7CisKKyAgICAgICAgLyoK KyAgICAgICAgICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFibGUgcGFnZSBpcyBub3QgcmVz aWRlbnQsIHdlIGFyZQorICAgICAgICAgKiBjcmVhdGluZyBpdCBoZXJlLgorICAgICAgICAgKi8K KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKyAgICAgICAgICAgICAgICAvKgorICAg ICAgICAgICAgICAgICAqIEhlcmUgaWYgdGhlIHB0ZSBwYWdlIGlzbid0IG1hcHBlZCwgb3IgaWYg aXQgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgKiBkZWFsbG9jYXRlZC4KKyAgICAgICAgICAg ICAgICAgKi8KKyAgICAgICAgICAgICAgICBub3NsZWVwID0gKGZsYWdzICYgUE1BUF9FTlRFUl9O T1NMRUVQKSAhPSAwOworICAgICAgICAgICAgICAgIG1wdGUgPSBwbWFwX2FsbG9jcHRlKHBtYXAs IHZhLCBub3NsZWVwID8gTlVMTCA6ICZsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobXB0ZSA9 PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG5vc2xlZXAgIT0gMCwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBtYXBfYWxsb2NwdGUgZmFpbGVkIHdpdGgg c2xlZXAgYWxsb3dlZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrICE9IE5V TEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7Cisg ICAgICAgICAgICAgICAgICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAg ICAgICAgICAgICAgICAgICAgICAgUE1BUF9VTkxPQ0socG1hcCk7CisgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gKEtFUk5fUkVTT1VSQ0VfU0hPUlRBR0UpOworICAgICAgICAgICAgICAg IH0KKyAgICAgICAgfQorCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKSB7CisJCXBhbmljKCIlczogYXR0ZW1wdGVkIHBtYXBfZW50ZXIgb24g c3VwZXJwYWdlIiwgX19mdW5jX18pOworCX0KKwlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2 YSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFBhZ2UgRGlyZWN0b3J5IHRhYmxlIGVudHJ5 IG5vdCB2YWxpZCwgd2UgbmVlZCBhIG5ldyBQVCBwYWdlCisgICAgICAgICAqLworICAgICAgICBp ZiAocHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygicG1hcF9lbnRlcjogaW52 YWxpZCBwYWdlIGRpcmVjdG9yeSwgcGRpcj0lcCwgdmE9JXAiLAorICAgICAgICAgICAgICAgICAg ICAodm9pZCAqKXBtYXAtPnBtX3NlZ3RhYiwgKHZvaWQgKil2YSk7CisgICAgICAgIH0KKworICAg ICAgICBwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKyAgICAgICAgb20gPSBOVUxMOworICAgICAg ICBvcmlncHRlID0gKnB0ZTsKKwlvcGEgPSBUTEJMT19QVEVfVE9fUEEob3JpZ3B0ZSk7CisKKyAg ICAgICAgbmV3cHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGluaXRfcHRlX3Byb3QobSwgZmxh Z3MsIHByb3QpOworICAgICAgICAvKgorICAgICAgICAgKiBwbWFwX2VudGVyKCkgaXMgY2FsbGVk IGR1cmluZyBhIGZhdWx0IG9yIHNpbXVsYXRlZCBmYXVsdCBzbworICAgICAgICAgKiBzZXQgdGhl IHJlZmVyZW5jZSBiaXQgbm93IHRvIGF2b2lkIGEgZmF1bHQuCisgICAgICAgICAqLworICAgICAg ICBwdGVfcmVmX3NldCgmbmV3cHRlKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf V0lSRUQpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9XOworICAgICAgICBp ZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9H OworICAgICAgICBpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKyAgICAgICAgICAgICAgICBp ZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAg ICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworICAgICAgICAgICAgICAg IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKyAg ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor I2lmZGVmIENQVV9DSEVSSQorICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9OT0xPQURU QUdTKSAhPSAwKQorICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfTEM7CisgICAgICAgIGlm ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU1RPUkVUQUdTKSAhPSAwKQorICAgICAgICAgICAgICAg IG5ld3B0ZSB8PSBQVEVfU0M7CisjZW5kaWYKKworCS8qCisJICogU2V0IG1vZGlmaWVkIGJpdCBn cmF0dWl0b3VzbHkgZm9yIHdyaXRlYWJsZSBtYXBwaW5ncyBpZgorCSAqIHRoZSBwYWdlIGlzIHVu bWFuYWdlZC4gV2UgZG8gbm90IHdhbnQgdG8gdGFrZSBhIGZhdWx0CisJICogdG8gZG8gdGhlIGRp cnR5IGJpdCBlbXVsYXRpb24gZm9yIHRoZXNlIG1hcHBpbmdzLgorCSAqLworCWlmICgobS0+b2Zs YWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkgeworCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBU RV9STykpCisJCQluZXdwdGUgfD0gUFRFX0Q7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAq IE1hcHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNo YW5nZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGVfaXNfdmFsaWQoJm9yaWdwdGUpICYm IG9wYSA9PSBwYSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2ly aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CisgICAg ICAgICAgICAgICAgICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lkZW50IGFz IGxvbmcgYXMgdGhlcmUKKyAgICAgICAgICAgICAgICAgKiBhcmUgdmFsaWQgbWFwcGluZ3MgaW4g dGhlbS4gSGVuY2UsIGlmIGEgdXNlciBwYWdlIGlzCisgICAgICAgICAgICAgICAgICogd2lyZWQs IHRoZSBQVCBwYWdlIHdpbGwgYmUgYWxzby4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgICAgICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpICYmICFwdGVfdGVzdCgmb3JpZ3B0 ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRf Y291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRF X1cpICYmIHB0ZV90ZXN0KCZvcmlncHRlLAorICAgICAgICAgICAgICAgICAgICBQVEVfVykpCisg ICAgICAgICAgICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudC0tOworCisg ICAgICAgICAgICAgICAgS0FTU0VSVCghcHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EIHwgUFRFX1JP KSwKKyAgICAgICAgICAgICAgICAgICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3JpdGFibGU6 IHZhOiAlcCwgcHRlOiAlI2p4IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICh2b2lk ICopdmEsICh1aW50bWF4X3Qpb3JpZ3B0ZSkpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAg ICAgICAgICAgICAgKiBSZW1vdmUgdGhlIGV4dHJhIFBUIHBhZ2UgcmVmZXJlbmNlCisgICAgICAg ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG1wdGUgIT0gTlVMTCkgeworICAgICAg ICAgICAgICAgICAgICAgICAgbXB0ZS0+d2lyZV9jb3VudC0tOworICAgICAgICAgICAgICAgICAg ICAgICAgS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID4gMCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoInBtYXBfZW50ZXI6IG1pc3NpbmcgcmVmZXJlbmNlIHRvIHBhZ2UgdGFibGUgcGFn ZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmE6IDB4JWx4IiwgdmEpKTsKKyAg ICAgICAgICAgICAgICB9CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7 CisJCQlvbSA9IG07CisJCQluZXdwdGUgfD0gUFRFX01BTkFHRUQ7CisJCQlpZiAoIXB0ZV90ZXN0 KCZuZXdwdGUsIFBURV9STykpCisJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1dSSVRFQUJM RSk7CisJCX0KKwkJZ290byB2YWxpZGF0ZTsKKwl9CisKKwlwdiA9IE5VTEw7CisKKyAgICAgICAg LyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgY2hhbmdlZCwgaW52YWxpZGF0ZSBvbGQgcmFuZ2Ug YW5kIGZhbGwgdGhyb3VnaCB0bworICAgICAgICAgKiBoYW5kbGUgdmFsaWRhdGluZyBuZXcgbWFw cGluZy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChvcGEpIHsKKyAgICAgICAgICAgICAgICBp ZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBt YXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBpZiAocHRlX3Rl c3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb20g PSBQSFlTX1RPX1ZNX1BBR0Uob3BhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HRV9Q Vl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgb20pOworICAgICAgICAgICAgICAgICAgICAg ICAgcHYgPSBwbWFwX3B2aF9yZW1vdmUoJm9tLT5tZCwgcG1hcCwgdmEpOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAg ICAgICAgICAgICBtcHRlLT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBL QVNTRVJUKG1wdGUtPndpcmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgicG1hcF9lbnRlcjogbWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZhOiAlcCIsICh2b2lkICopdmEpKTsKKyAgICAg ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHBtYXBfcmVzaWRl bnRfY291bnRfaW5jKHBtYXAsIDEpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEVudGVyIG9u IHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFnZWQgbWVtb3J5LgorICAgICAgICAgKi8K KyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisgICAgICAg ICAgICAgICAgbmV3cHRlIHw9IFBURV9NQU5BR0VEOworCQkvKiBJbnNlcnQgRW50cnkgKi8KKwkJ aWYgKHB2ID09IE5VTEwpCisJCQlwdiA9IGdldF9wdl9lbnRyeShwbWFwLCAmbG9jayk7CisgICAg ICAgICAgICAgICAgcHYtPnB2X3ZhID0gdmE7CisgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJ U1RfTE9DS19UT19QSFlTKCZsb2NrLCBwYSk7CisgICAgICAgICAgICAgICAgVEFJTFFfSU5TRVJU X1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKyAgICAgICAgICAgICAgICBtLT5t ZC5wdl9nZW4rKzsKKyAgICAgICAgICAgICAgICBpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9S TykpCisgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJ VEVBQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwdiAhPSBOVUxMKQorCQlmcmVlX3B2X2VudHJ5 KHBtYXAsIHB2KTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEluY3JlbWVudCBjb3VudGVy cworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHB0ZV90ZXN0KCZuZXdwdGUsIFBURV9XKSkKKyAg ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworCit2YWxpZGF0ZToK KyNpZmRlZiBQTUFQX0RFQlVHCisgICAgICAgIHByaW50ZigicG1hcF9lbnRlcjogIHZhOiAlcCAt PiBwYTogJXBcbiIsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisgICAgICAgIC8q CisgICAgICAgICAqIGlmIHRoZSBtYXBwaW5nIG9yIHBlcm1pc3Npb24gYml0cyBhcmUgZGlmZmVy ZW50LCB3ZSBuZWVkIHRvCisgICAgICAgICAqIHVwZGF0ZSB0aGUgcHRlLgorICAgICAgICAgKi8K KyAgICAgICAgaWYgKChvcmlncHRlICYgfiAoUFRFX0R8UFRFX1JFRikpICE9IG5ld3B0ZSkgewor ICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfVlI7CisgICAgICAgICAgICAgICAgaWYgKChm bGFncyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdw dGUgfD0gUFRFX0Q7CisgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkp IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBpbnZsdmEgPSBGQUxTRTsKKwor CQkJb3JpZ3B0ZSA9IHB0ZV9sb2FkX3N0b3JlKHB0ZSwgbmV3cHRlKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIGlmIChwdGVfaXNfcmVmKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bV9wYWdlX2FmbGFnX3NldChvbSwg UEdBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bh ICE9IHBhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmx2YSA9 IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAg ICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdCgmb3Jp Z3B0ZSwgUFRFX1JPKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRl X3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2bV9wYWdlX2RpcnR5KG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKChwcm90ICYgVk1fUFJPVF9XUklURSkgPT0gMCkKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZsdmEgPSBUUlVFOworICAgICAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV90ZXN0KCZvcmlncHRl LCBQVEVfTUFOQUdFRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUlMUV9FTVBU WSgmb20tPm1kLnB2X2xpc3QpICYmCisJCQkgICAgKChvbS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSAhPSAwIHx8CisJCQkgICAgVEFJTFFfRU1QVFkoJnBhX3RvX3B2aChvcGEpLT5wdl9saXN0KSkp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfY2xlYXIob20s IFBHQV9XUklURUFCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludmx2YSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwg dmEpOworICAgICAgICAgICAgICAgIH0gZWxzZQorCQkJcHRlX3N0b3JlKHB0ZSwgbmV3cHRlKTsK KyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBJZiBib3RoIHRoZSBwYWdlIHRh YmxlIHBhZ2UgYW5kIHRoZSByZXNlcnZhdGlvbiBhcmUgZnVsbHkKKyAgICAgICAgICogIHBvcHVs YXRlZCwgdGhlbiBhdHRlbXB0IHByb21vdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmICgo bXB0ZSA9PSBOVUxMIHx8IG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHKSAmJgorICAgICAgICAg ICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorICAgICAgICAgICAgcGdfc3Bf ZW5hYmxlZCAmJiB2bV9yZXNlcnZfbGV2ZWxfaWZmdWxscG9wKG0pID09IDApCisgICAgICAgICAg ICAgICAgcG1hcF9wcm9tb3RlX3BkZShwbWFwLCBwZGUsIHZhLCAmbG9jayk7CisKKyAgICAgICAg LyoKKyAgICAgICAgICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUgcGFnZXMuICBE byB0aGlzIG9ubHkgaWYgdGhlCisgICAgICAgICAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhl IGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKyAgICAgICAgICogdW5yZXNvbHZhYmxl IFRMQiBtaXNzIG1heSBvY2N1ci4KKyAgICAgICAgICovCisgICAgICAgIGlmICghaXNfa2VybmVs X3BtYXAocG1hcCkgJiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYK KyAgICAgICAgICAgIChwcm90ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworICAgICAgICAgICAgICAg IG1pcHNfaWNhY2hlX3N5bmNfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgICAgICAgICAg bWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisgICAgICAgIH0KKyAgICAg ICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByd193dW5sb2NrKGxvY2spOwor ICAgICAgICByd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworICAgICAgICBQTUFQX1VOTE9D SyhwbWFwKTsKKyAgICAgICAgcmV0dXJuIChLRVJOX1NVQ0NFU1MpOworfQorCisvKgorICogdGhp cyBjb2RlIG1ha2VzIHNvbWUgKk1BSk9SKiBhc3N1bXB0aW9uczoKKyAqIDEuIEN1cnJlbnQgcG1h cCAmIHBtYXAgZXhpc3RzLgorICogMi4gTm90IHdpcmVkLgorICogMy4gUmVhZCBhY2Nlc3MuCisg KiA0LiBObyBwYWdlIHRhYmxlIHBhZ2VzLgorICogYnV0IGlzICpNVUNIKiBmYXN0ZXIgdGhhbiBw bWFwX2VudGVyLi4uCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfcXVpY2socG1hcF90IHBtYXAsIHZt X29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3 bG9jayAqbG9jazsKKworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp OworCVBNQVBfTE9DSyhwbWFwKTsKKwkodm9pZClwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw LCB2YSwgbSwgcHJvdCwgTlVMTCwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1 bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9D SyhwbWFwKTsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9lbnRlcl9xdWlja19sb2NrZWQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3Qg cHJvdCwgdm1fcGFnZV90IG1wdGUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRy eV90ICpwdGUsIG5ld3B0ZTsKKwl2bV9wYWRkcl90IHBhOworCXN0cnVjdCBzcGdsaXN0IGZyZWU7 CisKKwlLQVNTRVJUKHZhIDwga21pLmNsZWFuX3N2YSB8fCB2YSA+PSBrbWkuY2xlYW5fZXZhIHx8 CisJICAgIChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwLAorCSAgICAoIiVzOiBtYW5h Z2VkIG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiLCBfX2Z1bmNfXykpOworCXJ3X2Fz c2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1h cCwgTUFfT1dORUQpOworCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IGEgcGFnZSB0YWJsZSBw YWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisJICogY3JlYXRpbmcgaXQgaGVyZS4KKwkgKi8K KwlpZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcGRfZW50cnlfdCAqcGRlOworCQl1 bnNpZ25lZCBwdGVwaW5kZXg7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdl IGluZGV4CisJCSAqLworCQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQlpZiAo bXB0ZSAmJiAobXB0ZS0+cGluZGV4ID09IHB0ZXBpbmRleCkpIHsKKwkJCW1wdGUtPndpcmVfY291 bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHBhZ2UgZGlyZWN0b3J5IGVu dHJ5CisJCQkgKi8KKwkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCQkJLyoKKwkJCSAq IElmIHRoZSBwYWdlIHRhYmxlIHBhZ2UgaXMgbWFwcGVkLCB3ZSBqdXN0CisJCQkgKiBpbmNyZW1l bnQgdGhlIGhvbGQgY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkJCSAqLworCQkJaWYgKHBkZSAm JiAqcGRlICE9IDApIHsKKwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQly ZXR1cm4gKE5VTEwpOworCQkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJICAgIE1JUFNf RElSRUNUX1RPX1BIWVMoKnBkZSkpOworCQkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJCX0gZWxz ZSB7CisJCQkJLyoKKwkJCQkgKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgUFYgbGlzdCBsb2Nr CisJCQkJICogcG9pbnRlciwgYmVjYXVzZSB3ZSBkb24ndCBpbnRlbmQgdG8gc2xlZXAuCisJCQkJ ICovCisJCQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRleCwgTlVMTCk7CisJ CQkJaWYgKG1wdGUgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIChtcHRlKTsKKwkJCX0KKwkJfQorCX0g ZWxzZSB7CisJCW1wdGUgPSBOVUxMOworCX0KKworCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsK KwlpZiAocHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJbXB0 ZS0+d2lyZV9jb3VudC0tOworCQkJbXB0ZSA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIChtcHRlKTsK Kwl9CisKKwkvKgorCSAqIEVudGVyIG9uIHRoZSBQViBsaXN0IGlmIHBhcnQgb2Ygb3VyIG1hbmFn ZWQgbWVtb3J5LgorCSAqLworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCAm JgorCSAgICAhcG1hcF90cnlfaW5zZXJ0X3B2X2VudHJ5KHBtYXAsIHZhLCBtLCBsb2NrcCkpIHsK KwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlpZiAocG1h cF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcHRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2ludmFsaWRh dGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUpOworCQkJ fQorCisJCQltcHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJ ICogSW5jcmVtZW50IGNvdW50ZXJzCisJICovCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1h cCwgMSk7CisKKwlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCS8qCisJICogTm93IHZhbGlk YXRlIG1hcHBpbmcgd2l0aCBSTyBwcm90ZWN0aW9uCisJICovCisJbmV3cHRlID0gUFRFX1JPIHwg VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJRDsKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19V Tk1BTkFHRUQpID09IDApCisJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKKworCWlmIChpc19jYWNo ZWFibGVfbWVtKHBhKSkgeworCQlpZiAobS0+bWQucHZfbWVtYXR0ciA9PSBWTV9NRU1BVFRSX1VO Q0FDSEVBQkxFKQorCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCQllbHNlCisJCQluZXdw dGUgfD0gUFRFX0NfQ0FDSEU7CisJfSBlbHNlCisJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsK KworCXNjaGVkX3BpbigpOworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgeworCQluZXdwdGUg fD0gUFRFX0c7CisJCXB0ZV9yZWZfc2V0KCZuZXdwdGUpOworCQlwdGVfc3RvcmUocHRlLCBuZXdw dGUpOworCX0gZWxzZSB7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJCS8qCisJCSAqIFN5 bmMgSSAmIEQgY2FjaGVzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBi ZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVz b2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJCSAqLworCQlpZiAocG1hcCA9PSAmY3VycHJv Yy0+cF92bXNwYWNlLT52bV9wbWFwKSB7CisJCQl2YSAmPSB+UEFHRV9NQVNLOworCQkJbWlwc19p Y2FjaGVfc3luY19yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jh bmdlKHZhLCBQQUdFX1NJWkUpOworCQl9CisJfQorCXNjaGVkX3VucGluKCk7CisKKwlyZXR1cm4g KG1wdGUpOworfQorCisvKgorICogTWFrZSBhIHRlbXBvcmFyeSBtYXBwaW5nIGZvciBhIHBoeXNp Y2FsIGFkZHJlc3MuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKKyAqIHRvIGJlIHVzZWQgZm9yIHBh bmljIGR1bXBzLgorICoKKyAqIFVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitw bWFwX2tlbnRlcl90ZW1wb3Jhcnkodm1fcGFkZHJfdCBwYSwgaW50IGkpCit7CisKKwlpZiAoaSAh PSAwKQorCQlwcmludGYoIiVzOiBFUlJPUiEhISBNb3JlIHRoYW4gb25lIHBhZ2Ugb2YgdmlydHVh bCBhZGRyZXNzICIKKwkJICAgICJtYXBwaW5nIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsK KworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNUKHBhKSk7Cit9CisKK3ZvaWQK K3BtYXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7CisKKwkvKiBub3Ro aW5nIHRvIGRvIGZvciBtaXBzNjQgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2bV9wYWdlX3QK K3BtYXBfYWxsb2NwZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgcndsb2Nr ICoqbG9ja3ApCit7CisJdm1fcGluZGV4X3QgcGRwaW5kZXgsIHB0ZXBpbmRleDsKKwlwZF9lbnRy eV90ICpwZHBlOworCXZtX3BhZ2VfdCBtcHRlID0gTlVMTDsKKworCWlmICh2YSA8IFZNX01BWFVT RVJfQUREUkVTUykgeworcmV0cnk6CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJ CWlmIChwZHBlICE9IE5VTEwgJiYgKCpwZHBlICE9IE5VTEwpKSB7CisJCQkvKiBBZGQgYSByZWZl cmVuY2UgdG8gdGhlIHBkIHBhZ2UuICovCisJCQltcHRlID0gUEhZU19UT19WTV9QQUdFKE1JUFNf RElSRUNUX1RPX1BIWVMoKnBkcGUpKTsKKwkJCW1wdGUtPndpcmVfY291bnQrKzsKKwkJfSBlbHNl IHsKKwkJCS8qIEFsbG9jYXRlIGEgcGQgcGFnZS4gKi8KKworCQkJLyogQ2FsY3VsYXRlIHBhZ2V0 YWJsZSBwYWdlIGluZGV4LiAqLworCQkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsK KwkJCXBkcGluZGV4ID0gcHRlcGluZGV4ID4+IE5QREVQR1NISUZUOyAgLyogWFhYICovCisJCQlt cHRlID0gX3BtYXBfYWxsb2NwdGUocG1hcCwgTlVQREUgKyBwZHBpbmRleCwgbG9ja3ApOworCQkJ aWYgKG1wdGUgPT0gTlVMTCAmJiBsb2NrcCAhPSBOVUxMKQorCQkJCWdvdG8gcmV0cnk7CisJCX0K Kwl9CisJcmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIFRyaWVzIHRvIGNyZWF0ZSBhIDJNQiBw YWdlIG1hcHBpbmcuICBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCBhbmQgRkFMU0UKKyAqIG90 aGVyd2lzZS4gIEZhaWxzIGlmICgxKSBhIHBhZ2UgdGFibGUgcGFnZSBjYW5ub3QgYmUgYWxsb2Nh dGVkIHdpdGhvdXQKKyAqIGJsb2NraW5nLCAoMikgYSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzIGF0 IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzLCBvcgorICogKDMpIGEgcHYgZW50cnkgY2Fu bm90IGJlIGFsbG9jYXRlZCB3aXRob3V0IHJlY2xhaW1pbmcgYW5vdGhlciBwdiBlbnRyeS4KKyAq Lworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhLCB2bV9wYWdlX3QgbSwgdm1fcHJvdF90IHByb3QsCisgICAgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG5ld3BkZTsKKwl2bV9w YWdlX3QgbXBkZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZGRyX3QgcGE7CisKKwor CXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NF UlQocG1hcCwgTUFfT1dORUQpOworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8q IE5vdCBkb2luZyB0aGUga2VybmVsIHBtYXAgZm9yIG5vdyAqLworCQlDVFIzKEtUUl9QTUFQLCAi JXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4gcG1hcCAlcDoga2VybmVsIG1hcCIsCisJCSAgICBf X2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJaWYgKChtcGRlID0g cG1hcF9hbGxvY3BkZShwbWFwLCB2YSwgTlVMTCkpID09IE5VTEwpIHsKKwkJQ1RSMyhLVFJfUE1B UCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18s IHZhLCBwbWFwKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCS8qIHBkZSA9IHBtYXBfcGRlKHBt YXAsIHZhKTsgKi8KKwlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoVk1f UEFHRV9UT19QSFlTKG1wZGUpKTsKKwlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KHZhKV07CisJ aWYgKHBkZSA9PSBOVUxMKSB7CisJCUtBU1NFUlQobXBkZS0+d2lyZV9jb3VudCA+IDEsCisJCSAg ICAoIiVzOiBtcGRlJ3Mgd2lyZSBjb3VudCBpcyB0b28gbG93IiwgX19mdW5jX18pKTsKKwkJbXBk ZS0+d2lyZV9jb3VudC0tOworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj bHggaW4gcG1hcCAlcCIsIF9fZnVuY19fLAorCQkgICAgdmEsIHBtYXApOworCQlyZXR1cm4gKEZB TFNFKTsKKwl9CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisgICAgICAgIG5ld3BkZSA9IFBU RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQgfCBQVEVfUFNfMU07CisJaWYg KGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F TUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UK KwkJCW5ld3BkZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UKKwkJbmV3cGRlIHw9IFBURV9DX1VO Q0FDSEVEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkgeworCQluZXdw ZGUgfD0gUFRFX01BTkFHRUQ7CisKKwkJLyoKKwkJICogQWJvcnQgdGhpcyBtYXBwaW5nIGlmIGl0 cyBQViBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KKwkJICovCisJCWlmICghcG1hcF9wdl9p bnNlcnRfcGRlKHBtYXAsIHZhLCBWTV9QQUdFX1RPX1BIWVMobSksCisJCSAgICBsb2NrcCkpIHsK KwkJCVNMSVNUX0lOSVQoJmZyZWUpOworCQkJaWYgKHBtYXBfdW53aXJlX3B0cChwbWFwLCB2YSwg bXBkZSwgJmZyZWUpKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworCQkJ CXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwkJCX0KKwkJCUNUUjMoS1RSX1BNQVAsICIl czogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEs IHBtYXApOworCQkJcmV0dXJuIChGQUxTRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEluY3JlbWVu dCBjb3VudGVycy4KKwkgKi8KKwkgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIg LyBQQUdFX1NJWkUpOworCisJIC8qCisJICAqIE1hcCB0aGUgc3VwZXJwYWdlLgorCSAgKi8KKwkg c2NoZWRfcGluKCk7CisJIHBkZV9zdG9yZShwZGUsIG5ld3BkZSk7CisKKwkvKgorCSAqIFN5bmMg SSAmIEQgY2FjaGVzIGZvciBleGVjdXRhYmxlIHBhZ2VzLiAgRG8gdGhpcyBvbmx5IGlmIHRoZQor CSAqIHRhcmdldCBwbWFwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIE90aGVyd2lz ZSwgYW4KKwkgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorCSAqLworCSBpZiAo IWlzX2tlcm5lbF9wbWFwKHBtYXApICYmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZt X3BtYXApICYmCisJICAgICAocHJvdCAmIFZNX1BST1RfRVhFQ1VURSkpIHsKKwkJCSB2YSAmPSB+ UERSTUFTSzsKKwkJCSBtaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBOQlBEUik7CisJCQkgbWlw c19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIE5CUERSKTsKKworCSB9CisJIHNjaGVkX3VucGluKCk7 CisKKwkgYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9tYXBwaW5ncywgMSk7CisJIENUUjMoS1RS X1BNQVAsICIlczogc3VjY2VzcyBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sIHZh LAorCSAgICAgcG1hcCk7CisJIHJldHVybiAoVFJVRSk7Cit9CisKKy8qCisgKiBNYXBzIGEgc2Vx dWVuY2Ugb2YgcmVzaWRlbnQgcGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAq IFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0YXJ0LiAgVGhpcyBw YWdlIGlzCisgKiBtYXBwZWQgYXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcyBzdGFydC4gIEVh Y2ggc3Vic2VxdWVudCBwYWdlIGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhh dCBpcyBvZmZzZXQgZnJvbSBzdGFydCBieSB0aGUgc2FtZQorICogYW1vdW50IGFzIHRoZSBwYWdl IGlzIG9mZnNldCBmcm9tIG1fc3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBUaGUKKyAqIGxhc3Qg cGFnZSBpbiB0aGUgc2VxdWVuY2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFyZ2VzdCBvZmZzZXQg ZnJvbQorICogbV9zdGFydCB0aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0dWFsIGFkZHJlc3Mg bGVzcyB0aGFuIHRoZSBnaXZlbgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4gIE5vdCBldmVyeSB2 aXJ0dWFsIHBhZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBwZWQ7IG9ubHkgdGhv c2UgZm9yIHdoaWNoIGEgcmVzaWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUKKyAqIGNvcnJlc3Bv bmRpbmcgb2Zmc2V0IGZyb20gbV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2b2lkCitwbWFwX2Vu dGVyX29iamVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZtX29mZnNldF90IGVu ZCwKKyAgICB2bV9wYWdlX3QgbV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7CisJc3RydWN0IHJ3 bG9jayAqbG9jazsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWdlX3QgbSwgbXB0ZTsKKwl2bV9w aW5kZXhfdCBkaWZmLCBwc2l6ZTsKKworCVZNX09CSkVDVF9BU1NFUlRfTE9DS0VEKG1fc3RhcnQt Pm9iamVjdCk7CisKKwlwc2l6ZSA9IGF0b3AoZW5kIC0gc3RhcnQpOworCW1wdGUgPSBOVUxMOwor CW0gPSBtX3N0YXJ0OworCWxvY2sgPSBOVUxMOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2sp OworCVBNQVBfTE9DSyhwbWFwKTsKKwl3aGlsZSAobSAhPSBOVUxMICYmIChkaWZmID0gbS0+cGlu ZGV4IC0gbV9zdGFydC0+cGluZGV4KSA8IHBzaXplKSB7CisJCXZhID0gc3RhcnQgKyBwdG9hKGRp ZmYpOworCQlpZiAoKHZhICYgUERSTUFTSykgPT0gMCAmJiB2YSArIE5CUERSIDw9IGVuZCAmJgor CQkgICAgbS0+cHNpbmQgPT0gMSAmJiBwZ19zcF9lbmFibGVkICYmCisJCSAgICBwbWFwX2VudGVy X3BkZShwbWFwLCB2YSwgbSwgcHJvdCwgJmxvY2spKQorCQkJbSA9ICZtW05CUERSIC8gUEFHRV9T SVpFIC0gMV07CisJCWVsc2UKKwkJCW1wdGUgPSBwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFw LCB2YSwgbSwgcHJvdCwKKwkJCSAgICBtcHRlLCAmbG9jayk7CisJCW0gPSBUQUlMUV9ORVhUKG0s IGxpc3RxKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwly d19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisv KgorICogcG1hcF9vYmplY3RfaW5pdF9wdCBwcmVsb2FkcyB0aGUgcHRlcyBmb3IgYSBnaXZlbiBv YmplY3QKKyAqIGludG8gdGhlIHNwZWNpZmllZCBwbWFwLiAgVGhpcyBlbGltaW5hdGVzIHRoZSBi bGFzdCBvZiBzb2Z0CisgKiBmYXVsdHMgb24gcHJvY2VzcyBzdGFydHVwIGFuZCBpbW1lZGlhdGVs eSBhZnRlciBhIG1tYXAoKS4KKyAqCisgKiBUaGlzIGNvZGUgbWFwcyBsYXJnZSBwaHlzaWNhbCBt bWFwIHJlZ2lvbnMgaW50byB0aGUKKyAqIHByb2Nlc3NvciBhZGRyZXNzIHNwYWNlLiBOb3RlIHRo YXQgc29tZSBzaG9ydGN1dHMKKyAqIGFyZSB0YWtlbiwgYnV0IHRoZSBjb2RlIHdvcmtzLgorICov Cit2b2lkCitwbWFwX29iamVjdF9pbml0X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRy LCB2bV9vYmplY3RfdCBvYmplY3QsCisgICAgdm1fcGluZGV4X3QgcGluZGV4LCB2bV9zaXplX3Qg c2l6ZSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1fcGFkZHJfdCBwYSwgcHRlcGE7CisJdm1f cGFnZV90IHAsIHBkcGc7CisJdm1fbWVtYXR0cl90IG1lbWF0dHI7CisKKwlWTV9PQkpFQ1RfQVNT RVJUX1dMT0NLRUQob2JqZWN0KTsKKwlLQVNTRVJUKG9iamVjdC0+dHlwZSA9PSBPQkpUX0RFVklD RSB8fCBvYmplY3QtPnR5cGUgPT0gT0JKVF9TRywKKwkgICAgKCJwbWFwX29iamVjdF9pbml0X3B0 OiBub24tZGV2aWNlIG9iamVjdCIpKTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkgewor CQkvKiBOb3QgZG9pbmcgdGhlIGtlcm5lbCBwbWFwIGZvciBub3cuICovCisJCXJldHVybjsKKwl9 CisKKwlpZiAoKGFkZHIgJiAoTkJQRFIgLSAxKSkgPT0gMCAmJiAoc2l6ZSAmIChOQlBEUiAtIDEp KSA9PSAwKSB7CisJCWlmICghcGdfc3BfZW5hYmxlZCkKKwkJCXJldHVybjsKKwkJaWYgKCF2bV9v YmplY3RfcG9wdWxhdGUob2JqZWN0LCBwaW5kZXgsIHBpbmRleCArIGF0b3Aoc2l6ZSkpKQorCQkJ cmV0dXJuOworCQlwID0gdm1fcGFnZV9sb29rdXAob2JqZWN0LCBwaW5kZXgpOworCQlLQVNTRVJU KHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2Ug JXAiLCBfX2Z1bmNfXywgcCkpOworCQltZW1hdHRyID0gcC0+bWQucHZfbWVtYXR0cjsKKworCQkv KgorCQkgKiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgZmlyc3QgcGFnZSBpcyBub3QgcGh5c2lj YWxseQorCQkgKiBhbGlnbmVkIHRvIGEgMk1CIHBhZ2UgYm91bmRhcnkuCisJCSAqLworCQlwdGVw YSA9IFZNX1BBR0VfVE9fUEhZUyhwKTsKKwkJaWYgKHB0ZXBhICYgKE5CUERSIC0gMSkpCisJCQly ZXR1cm47CisKKwkJLyoKKwkJICogU2tpcCB0aGUgZmlyc3QgcGFnZS4gQWJvcnQgdGhlIG1hcHBp bmcgaWYgdGhlIHJlc3Qgb2YKKwkJICogdGhlIHBhZ2VzIGFyZSBub3QgcGh5c2ljYWxseSBjb250 aWd1b3VzIG9yIGhhdmUgZGlmZmVyaW5nCisJCSAqIG1lbW9yeSBhdHRyaWJ1dGVzLgorCQkgKi8K KwkJcCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQlmb3IgKHBhID0gcHRlcGEgKyBQQUdFX1NJ WkU7IHBhIDwgcHRlcGEgKyBzaXplOworCQkgICAgcGEgKz0gUEFHRV9TSVpFKSB7CisJCQlLQVNT RVJUKHAtPnZhbGlkID09IFZNX1BBR0VfQklUU19BTEwsCisJCQkgICAgKCIlczogaW52YWxpZCBw YWdlICVwIiwgX19mdW5jX18sIHApKTsKKwkJCWlmIChwYSAhPSBWTV9QQUdFX1RPX1BIWVMocCkg fHwKKwkJCSAgICBtZW1hdHRyICE9IHAtPm1kLnB2X21lbWF0dHIpCisJCQkJcmV0dXJuOworCQkJ cCA9IFRBSUxRX05FWFQocCwgbGlzdHEpOworCQl9CisKKwkJLyoKKwkJICogTWFwIHVzaW5nIDJN QiBwYWdlcy4gICJwdGVwYSIgaXMgMk0gYWxpZ25lZCBhbmQgInNpemUiCisJCSAqIGlzIGEgbXVs dGlwbGUgb2YgMk0uCisJCSAqLworCQlQTUFQX0xPQ0socG1hcCk7CisJCWZvciAocGEgPSBwdGVw YTsgcGEgPCBwdGVwYSArIHNpemU7IHBhICs9IE5CUERSKSB7CisJCQlwZHBnID0gcG1hcF9hbGxv Y3BkZShwbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChwZHBnID09IE5VTEwpIHsKKwkJCQkvKgor CQkJCSAqIFRoZSBjcmVhdGlvbiBvZiBtYXBwaW5ncyBiZWxvdyBpcyBvbmx5IGFuCisJCQkJICog b3B0aW1pemF0aW9uLiAgSWYgYSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJCQkJICogY2Fubm90IGJl IGFsbG9jYXRlZCB3aXRob3V0IGJsb2NraW5nLAorCQkJCSAqIGNvbnRpbnVlIG9uIHRvIHRoZSBu ZXh0IG1hcHBpbmcgcmF0aGVyIHRoYW4KKwkJCQkgKiBibG9ja2luZy4KKwkJCQkgKi8KKwkJCQlh ZGRyICs9IE5CUERSOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGRlID0gKHBkX2VudHJ5X3Qg KilNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhwZHBnKSk7CisJ CQlwZGUgPSAmcGRlW3BtYXBfcGRlX2luZGV4KGFkZHIpXTsKKwkJCWlmICghcHRlX2lzX3ZhbGlk KChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJCXB0X2VudHJ5X3QgbmV3cHRlID0gVExCTE9fUEFf VE9fUEZOKHBhKSB8CisJCQkJICAgIFBURV9QU18xTSB8IFBURV9EIHwgUFRFX1JFRiB8IFBURV9W QUxJRDsKKworCQkJCWlmIChpc19jYWNoZWFibGVfbWVtKHBhKSkgeworCQkJCQlpZiAocGRwZy0+ bWQucHZfbWVtYXR0ciA9PQorCQkJCQkgICAgVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCQkJ CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJCQkJZWxzZQorCQkJCQkJbmV3cHRlIHw9IFBU RV9DX0NBQ0hFOworCQkJCX0gZWxzZQorCQkJCQluZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisK KwkJCQlwZGVfc3RvcmUocGRlLCBuZXdwdGUpOworCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5j KHBtYXAsIE5CUERSL1BBR0VfU0laRSk7CisJCQkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9t YXBwaW5ncywgMSk7CisJCQl9IGVsc2UgeworCQkJCS8qIENvbnRpbnVlIG9uIGlmIHRoZSBQREUg aXMgYWxyZWFkeSB2YWxpZC4gKi8KKwkJCQlwZHBnLT53aXJlX2NvdW50LS07CisJCQkJS0FTU0VS VChwZHBnLT53aXJlX2NvdW50ID4gMCwKKwkJCQkgICAgKCIlczogbWlzc2luZyByZWZlcmVuY2Ug dG8gcGFnZSBkaXJlY3RvcnkgIgorCQkJCSAgICAicGFnZSwgdmE6IDB4JWx4IiwgX19mdW5jX18s IGFkZHIpKTsKKwkJCX0KKwkJCWFkZHIgKz0gTkJQRFI7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1h cCk7CisJfQorfQorCisvKgorICoJQ2xlYXIgdGhlIHdpcmVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBt YXBwaW5ncyBmb3IgdGhlIHNwZWNpZmllZCByYW5nZSBvZgorICoJYWRkcmVzc2VzIGluIHRoZSBn aXZlbiBwbWFwLiAgRXZlcnkgdmFsaWQgbWFwcGluZyB3aXRoaW4gdGhhdCByYW5nZQorICoJbXVz dCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LiAgSW4gY29udHJhc3QsIGludmFsaWQgbWFw cGluZ3MKKyAqCWNhbm5vdCBoYXZlIHRoZSB3aXJlZCBhdHRyaWJ1dGUgc2V0LCBzbyB0aGV5IGFy ZSBpZ25vcmVkLgorICoKKyAqCVRoZSB3aXJlZCBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgdGFibGUg ZW50cnkgaXMgbm90IGEgaGFyZHdhcmUgZmVhdHVyZSwKKyAqCXNvIHRoZXJlIGlzIG5vIG5lZWQg dG8gaW52YWxpZGF0ZSBhbnkgVExCIGVudHJpZXMuCisgKi8KK3ZvaWQKK3BtYXBfdW53aXJlKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkKK3sKKwlwZF9lbnRy eV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0 OworCWJvb2xlYW5fdCBwdl9saXN0c19sb2NrZWQ7CisKKwlwdl9saXN0c19sb2NrZWQgPSBGQUxT RTsKK3Jlc3VtZToKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8IGV2YTsgc3ZhID0g dmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBl ID09IE5VTEwpIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlp ZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7CisJCX0K KwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBz dmEpCisJCQl2YV9uZXh0ID0gZXZhOworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2 YSk7CisJCWlmICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHBkZV9pc18xbV9z dXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9XKSkKKwkJCQlwYW5p YygicG1hcF91bndpcmU6IHBkZSAlI2p4IGlzIG1pc3NpbmcgUFRFX1ciLAorCQkJCSAgICAodWlu dG1heF90KSpwZGUpOworCQkJLyoKKwkJCSAqIEFyZSB3ZSB1bndpcmluZyB0aGUgZW50aXJlIHN1 cGVycGFnZT8gSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFuZCBmYWxsIHRocm91 Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYmIGV2YSA+PSB2YV9u ZXh0KSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKTsK KwkJCQlwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKwkJ CQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJ CQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQkJaWYgKCFyd190cnlfcmxvY2soJnB2aF9n bG9iYWxfbG9jaykpIHsKKwkJCQkJCSBQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJCSByd19ybG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJCSAvKiBSZXBlYXQgc3ZhLiAqLworCQkJCQkJIGdv dG8gcmVzdW1lOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghcG1hcF9kZW1vdGVfcGRlKHBtYXAs IHBkZSwgc3ZhKSkKKwkJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBkZW1vdGlvbiBmYWlsZWQiKTsK KwkJCX0KKwkJfQorCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCWZv ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr LAorCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSkK KwkJCQljb250aW51ZTsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQkJcGFuaWMo InBtYXBfdW53aXJlOiBwdGUgJSNqeCBpcyBtaXNzaW5nIFBHX1ciLAorCQkJCSAgICAodWludG1h eF90KSpwdGUpOworCQkJLyoKKwkJCSAqIFBURV9XIG11c3QgYmUgY2xlYXJlZCBhdG9taWNhbGx5 LiAgQWx0aG91Z2ggdGhlIHBtYXAKKwkJCSAqIGxvY2sgc3luY2hyb25pemVzIGFjY2VzcyB0byBQ VEVfVywgYW5vdGhlciBwcm9jZXNzb3IKKwkJCSAqIGNvdWxkIGJlIHNldHRpbmcgUFRFX0QgYW5k L29yIFBURV9SRUYgY29uY3VycmVudGx5LgorCQkJICovCisJCQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgUFRFX1cpOworCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKwkJfQorCX0KKwlp ZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJ fQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ29weSB0aGUgcmFuZ2Ugc3BlY2lm aWVkIGJ5IHNyY19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291cmNlIG1hcCB0byB0aGUgcmFuZ2Ug ZHN0X2FkZHIvbGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24gbWFwLgorICoKKyAqCVRoaXMgcm91 dGluZSBpcyBvbmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBkbyBhbnl0aGluZy4KKyAqLworCit2 b2lkCitwbWFwX2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFwX3Qgc3JjX3BtYXAsIHZtX29mZnNl dF90IGRzdF9hZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZtX29mZnNldF90IHNyY19hZGRyKQor eworI2lmIDAKKy8qCisgKiBYWFggVGhpcyBkb2Vzbid0IGhlbHAgd2l0aCBmb3JrKCkgcGVyZm9y bWFuY2UgYW5kCisgKiBhZGRzIG1vcmUgb3ZlcmhlYWQuICBNYXliZSB0aGUgcmVmZXJlbmNlIGJp dCBlbXVsYXRpb24KKyAqIGlzIGNhdXNpbmcgZmF1bHQtbGlrZSBvdmVyaGVhZCBhbnl3YXk/Cisg Ki8KKworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9v ZmZzZXRfdCBhZGRyLCBlbmRfYWRkciwgdmFfbmV4dDsKKworCWlmIChkc3RfYWRkciAhPSBzcmNf YWRkcikKKwkJcmV0dXJuOworCisJaWYgKFBDUFVfR0VUKGN1cnBtYXApICE9IHNyY19wbWFwKQor CQlyZXR1cm47CisKKwllbmRfYWRkciA9IHNyY19hZGRyICsgbGVuOworCisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJLyogTG9jayB0aGUgcG1hcHMgaW4gdGhl IHNhbWUgb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2suICovCisJaWYgKGRzdF9wbWFwIDwgc3JjX3Bt YXApIHsKKwkJUE1BUF9MT0NLKGRzdF9wbWFwKTsKKwkJUE1BUF9MT0NLKHNyY19wbWFwKTsKKwl9 IGVsc2UgeworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCQlQTUFQX0xPQ0soZHN0X3BtYXApOwor CX0KKworCWZvciAoYWRkciA9IHNyY19hZGRyOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIgPSB2YV9u ZXh0KSB7CisJCXB0X2VudHJ5X3QgKnNyY19wdGUsICpkc3RfcHRlOworCQl2bV9wYWdlX3QgZHN0 bXBkZSwgZHN0bXB0ZSwgc3JjbXB0ZTsKKwkJcGRfZW50cnlfdCAqc3JjX3BkcGUsICpzcmNfcGRl LCAqZHN0X3BkZTsKKwkJcHRfZW50cnlfdCBzcmNwdGU7CisJCXZtX3BhZGRyX3Qgc3JjcGFkZHI7 CisJCXZtX3BhZ2VfdCBtOworCisKKwkJc3JjX3BkcGUgPSBwbWFwX3NlZ21hcChzcmNfcG1hcCwg YWRkcik7CisJCWlmIChzcmNfcGRwZSA9PSBOVUxMIHx8ICpzcmNfcGRwZSA9PSAwKSB7CisJCQl2 YV9uZXh0ID0gKGFkZHIgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCS8qCisJCQkgKiBJZiB0aGUg bmV4dCB2YSBpcyBvdXQgb2YgdGhlIGNvcHkgcmFuZ2UgdGhlbiBzZXQKKwkJCSAqIGl0IHRvIGVu ZF9hZGRyIGluIG9yZGVyIHRvIGNvcHkgYWxsIG1hcHBpbmdzIHVudGlsCisJCQkgKiBnaXZlbiBs aW1pdC4KKwkJCSAqLworCQkJaWYgKHZhX25leHQgPCBhZGRyKQorCQkJCXZhX25leHQgPSBlbmRf YWRkcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFfbmV4dCA9IChhZGRyICsgTkJQRFIpICYg flBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsK KworCQlzcmNfcGRlID0gcG1hcF9wZHBlX3RvX3BkZShzcmNfcGRwZSwgYWRkcik7CisJCWlmIChz cmNfcGRlID09IE5VTEwgfHwgKnNyY19wZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzcmNwdGUg PSAocHRfZW50cnlfdCkqc3JjX3BkZTsKKworCQlpZiAocHRlX2lzXzFtX3N1cGVycGFnZSgmc3Jj cHRlKSkgeworCQkJLyogQ29weSBzdXBlcnBhZ2UgcGRlLiAqLworCQkJaWYgKChhZGRyICYgUERS TUFTSykgIT0gMCB8fCBhZGRyICsgTkJQRFIgPiBlbmRfYWRkcikKKwkJCQljb250aW51ZTsKKwkJ CWRzdG1wZGUgPSBwbWFwX2FsbG9jcGRlKGRzdF9wbWFwLCBhZGRyLCBOVUxMKTsKKwkJCWlmIChk c3RtcGRlID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCS8qIGRzdF9wZGUgPSBwbWFwX3BkZShk c3RfcG1hcCwgYWRkcik7ICovCisJCQlkc3RfcGRlID0gKHBkX2VudHJ5X3QgKilNSVBTX1BIWVNf VE9fRElSRUNUKAorCQkJICAgIFZNX1BBR0VfVE9fUEhZUyhkc3RtcGRlKSk7CisJCQlkc3RfcGRl ID0gJmRzdF9wZGVbcG1hcF9wZGVfaW5kZXgoYWRkcildOworCisJCQlpZiAoKmRzdF9wZGUgPT0g MCAmJgorCQkJICAgICghcHRlX3Rlc3QoJnNyY3B0ZSwgUFRFX01BTkFHRUQpIHx8CisJCQkgICAg cG1hcF9wdl9pbnNlcnRfcGRlKGRzdF9wbWFwLCBhZGRyLAorCQkJICAgIFRMQkxPX1BURV9UT19Q QShzcmNwdGUpLCAmbG9jaykpKSB7CisJCQkJKmRzdF9wZGUgPSAocGRfZW50cnlfdCkoc3JjcHRl ICYgflBURV9XKTsKKwkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgTkJQRFIg LworCQkJCSAgICBQQUdFX1NJWkUpOworCQkJfSBlbHNlCisJCQkJZHN0bXBkZS0+d2lyZV9jb3Vu dC0tOworCQkJY29udGludWU7CisJCX0KKworCQlzcmNwYWRkciA9IE1JUFNfRElSRUNUX1RPX1BI WVMoKnNyY19wZGUpOworCQlzcmNtcHRlID0gUEhZU19UT19WTV9QQUdFKHNyY3BhZGRyKTsKKwkJ S0FTU0VSVChzcmNtcHRlLT53aXJlX2NvdW50ID4gMCwKKwkJICAgICgicG1hcF9jb3B5OiBzb3Vy Y2UgcGFnZSB0YWJsZSBwYWdlIGlzIHVudXNlZCIpKTsKKworCQkvKgorCQkgKiBMaW1pdCBvdXIg c2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmFkZHIgcmVwcmVzZW50ZWQKKwkJICogYnkg dGhlIHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlCisJ CSAqIGJlaW5nIGNvcGllZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZW5kX2FkZHIpCisJCQl2 YV9uZXh0ID0gZW5kX2FkZHI7CisKKwkJLyoKKwkJICogV2FsayB0aGUgc291cmNlIHBhZ2UgdGFi bGUgZW50cmllcyBhbmQgY29weSB0aGUgbWFuYWdlZAorCQkgKiBlbnRyaWVzLgorCQkgKi8KKwor CQkvKiBzcmNfcHRlID0gcG1hcF9wZGVfdG9fcHRlKHNyY19wZGUsIGFkZHIpOyAqLworCQlzcmNf cHRlID0gKHB0X2VudHJ5X3QgKilNSVBTX1BIWVNfVE9fRElSRUNUKHNyY3BhZGRyKTsKKwkJc3Jj X3B0ZSA9ICZzcmNfcHRlW3BtYXBfcHRlX2luZGV4KGFkZHIpXTsKKworCQlpZiAoc3JjX3B0ZSA9 PSBOVUxMIHx8ICpzcmNfcHRlID09IDApCisJCQljb250aW51ZTsKKworCQlkc3RtcHRlID0gTlVM TDsKKwkJd2hpbGUgKGFkZHIgPCB2YV9uZXh0KSB7CisJCQl1bnNpZ25lZCBwZGVwaW5kZXg7CisJ CQlwdF9lbnRyeV90IHB0ZXRlbXA7CisKKworCQkJcHRldGVtcCA9ICpzcmNfcHRlOworCisJCQkv KgorCQkJICogd2Ugb25seSB2aXJ0dWFsIGNvcHkgbWFuYWdlZCBwYWdlcworCQkJICovCisJCQlp ZiAocHRlX3Rlc3QoJnB0ZXRlbXAsIFBURV9NQU5BR0VEKSkgeworCQkJCS8qIENhbGN1bGF0ZSBw YWdldGFibGUgcGFnZSBpbmRleCAqLworCQkJCXBkZXBpbmRleCA9IHBtYXBfcGRlX3BpbmRleChh ZGRyKTsKKworCQkJCS8qIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkuICovCisJCQkJZHN0 X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsKKworCQkJCWlmIChkc3RfcGRlICE9IE5V TEwgJiYgKmRzdF9wZGUgIT0gMCkgeworCQkJCQlkc3RtcHRlID0gUEhZU19UT19WTV9QQUdFKAor CQkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqZHN0X3BkZSkpOworCQkJCX0gZWxzZQorCQkJ CQlkc3RtcHRlID0gTlVMTDsKKworCQkJCWlmIChkc3RtcHRlICE9IE5VTEwgJiYKKwkJCQkgICAg ZHN0bXB0ZS0+cGluZGV4ID09IHBkZXBpbmRleCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFn ZSB0YWJsZSBpcyBtYXBwZWQgc28ganVzdAorCQkJCQkgKiBpbmNyZW1lbnQgdGhlIGhvbGQgY291 bnQuCisJCQkJCSAqLworCQkJCQlkc3RtcHRlLT53aXJlX2NvdW50Kys7CisJCQkJfSBlbHNlIHsK KwkJCQkJLyoKKwkJCQkJICogVGhlIHBhZ2UgdGFibGUgaXNuJ3QgbWFwcGVkLCBvciBpdAorCQkJ CQkgKiBoYXMgYmVlbiBkZWFsbG9jYXRlZC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUgPSBwbWFw X2FsbG9jcHRlKGRzdF9wbWFwLAorCQkJCQkgICAgYWRkciwgTlVMTCk7CisKKwkJCQkJLyoKKwkJ CQkJICogSWYgd2UgYXJlIGhhdmluZyBtZW1vcnkgYWxsb2MgaXNzdWVzCisJCQkJCSAqIHRoZW4g YWJhbmRvbiB0cnlpbmcgdG8gY29weSB0aGUgcGFnZQorCQkJCQkgKiB0YWJsZXMuCisJCQkJCSAq LworCQkJCQlpZiAoZHN0bXB0ZSA9PSBOVUxMKQorCQkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJ CS8qCisJCQkJICogTm93IHRoYXQgd2UgaGF2ZSBhIHBhZ2UgZGlyZWN0b3J5LCBnZXQgdGhlCisJ CQkJICogcHRlLgorCQkJCSAqLworCisJCQkJLyogZHN0X3B0ZSA9IHBtYXBfcHRlKGRzdF9wbWFw LCBhZGRyKTsgKi8KKwkJCQlkc3RfcHRlID0gKHB0X2VudHJ5X3QgKikKKwkJCQkgICAgTUlQU19Q SFlTX1RPX0RJUkVDVCgKKwkJCQkJVk1fUEFHRV9UT19QSFlTKGRzdG1wdGUpKTsKKwkJCQlkc3Rf cHRlID0gJmRzdF9wdGVbcG1hcF9wdGVfaW5kZXgoYWRkcildOworCisJCQkJLyogVHJ5IGFuZCBp bnNlcnQgdGhlIHB2X2VudHJ5LiAqLworCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRF X1RPX1BBKHB0ZXRlbXApKTsKKwkJCQlpZiAoKmRzdF9wdGUgPT0gMCAmJgorCQkJCSAgICBwbWFw X3RyeV9pbnNlcnRfcHZfZW50cnkoZHN0X3BtYXAsIGFkZHIsIG0sCisJCQkJICAgICZsb2NrKSkg eworCQkJCQkvKgorCQkJCQkgKiBQb3B1bGF0ZSB0aGUgZW50cnkuCisJCQkJCSAqCisJCQkJCSAq IENsZWFyIHRoZSB3aXJlZCwgbW9kaWZpZWQsIGFuZAorCQkJCQkgKiBhY2Nlc3NlZCAocmVmZXJl bmNlZCkgYml0cworCQkJCQkgKiBkdXJpbmcgdGhlIGNvcHkuCisJCQkJCSAqLworCQkJCQlwdGVf Y2xlYXIoJnB0ZXRlbXAsIFBURV9XIHwgUFRFX0QgfAorCQkJCQkgICAgUFRFX1JFRik7CisJCQkJ CSpkc3RfcHRlID0gcHRldGVtcDsKKwkJCQkJLyogVXBkYXRlIHN0YXRzLiAqLworCQkJCQlwbWFw X3Jlc2lkZW50X2NvdW50X2luYyhkc3RfcG1hcCwgMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU0xJ U1RfSU5JVCgmZnJlZSk7CisJCQkJCWlmIChwbWFwX3Vud2lyZV9wdHAoZHN0X3BtYXAsIGFkZHIs CisJCQkJCSAgICBkc3RtcHRlLCAmZnJlZSkpIHsKKwkJCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl KGRzdF9wbWFwLAorCQkJCQkJICAgIGFkZHIpOworCQkJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworCQkJCQl9CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBDaGVjayB0aGUg d2lyZV9jb3VudCB0byBzZWUgaWYgd2UncmUgZG9uZS4gKi8KKwkJCQlpZiAoZHN0bXB0ZS0+d2ly ZV9jb3VudCA+PSBzcmNtcHRlLT53aXJlX2NvdW50KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWFk ZHIgKz0gUEFHRV9TSVpFOworCQkJc3JjX3B0ZSsrOworCQl9CisJfQorb3V0OgorCWlmIChsb2Nr ICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9s b2NrKTsKKwlQTUFQX1VOTE9DSyhzcmNfcG1hcCk7CisJUE1BUF9VTkxPQ0soZHN0X3BtYXApOwor I2VuZGlmIC8qICNpZiAwICovCit9CisKKy8qCisgKglwbWFwX3plcm9fcGFnZSB6ZXJvcyB0aGUg c3BlY2lmaWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0g YW5kIHVzaW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKiAJVXNlIFhLUEhZ UyBmb3IgNjQgYml0LgorICovCit2b2lkCitwbWFwX3plcm9fcGFnZSh2bV9wYWdlX3QgbSkKK3sK Kwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7 CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnpl cm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEs IFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqCXBtYXBfemVyb19wYWdl X2FyZWEgemVyb3MgdGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKKyAqCXRo ZSBwYWdlIGludG8gS1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCisg KgorICoJb2ZmIGFuZCBzaXplIG1heSBub3QgY292ZXIgYW4gYXJlYSBiZXlvbmQgYSBzaW5nbGUg aGFyZHdhcmUgcGFnZS4KKyAqLwordm9pZAorcG1hcF96ZXJvX3BhZ2VfYXJlYSh2bV9wYWdlX3Qg bSwgaW50IG9mZiwgaW50IHNpemUpCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBw aHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBo eXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjaGFyICopKGNhZGRyX3QpdmEgKyBvZmYsIHNp emUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhICsgb2ZmLCBzaXplKTsKKwlzY2hlZF91 bnBpbigpOworfQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxlKHZtX3BhZ2VfdCBtKQorewor CXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsK KworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVy bygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigpOworfQorCisvKgorICoJcG1hcF9jb3B5X3BhZ2Ug Y29waWVzIHRoZSBzcGVjaWZpZWQgKG1hY2hpbmUgaW5kZXBlbmRlbnQpCisgKglwYWdlIGJ5IG1h cHBpbmcgdGhlIHBhZ2UgaW50byB2aXJ0dWFsIG1lbW9yeSBhbmQgdXNpbmcKKyAqCWJjb3B5IHRv IGNvcHkgdGhlIHBhZ2UsIG9uZSBtYWNoaW5lIGRlcGVuZGVudCBwYWdlIGF0IGEKKyAqCXRpbWUu CisgKgorICogCVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLworI2RlZmluZQlQTUFQX0NPUFlf VEFHUwkweDAwMDAwMDAxCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwodm1f cGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90IHZh X3NyYywgdmFfZHN0OworCXZtX3BhZGRyX3QgcGh5c19zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3Jj KTsKKwl2bV9wYWRkcl90IHBoeXNfZHN0ID0gVk1fUEFHRV9UT19QSFlTKGRzdCk7CisKKwkvKiBl YXN5IGNhc2UsIGFsbCBjYW4gYmUgYWNjZXNzZWQgdmlhIEtTRUcwICovCisJLyoKKwkgKiBGbHVz aCBhbGwgY2FjaGVzIGZvciBWQSB0aGF0IGFyZSBtYXBwZWQgdG8gdGhpcyBwYWdlCisJICogdG8g bWFrZSBzdXJlIHRoYXQgZGF0YSBpbiBTRFJBTSBpcyB1cCB0byBkYXRlCisJICovCisJc2NoZWRf cGluKCk7CisJcG1hcF9mbHVzaF9wdmNhY2hlKHNyYyk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu Z2VfaW5kZXgoTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX2RzdCksIFBBR0VfU0laRSk7CisJdmFf c3JjID0gTUlQU19QSFlTX1RPX0RJUkVDVChwaHlzX3NyYyk7CisJdmFfZHN0ID0gTUlQU19QSFlT X1RPX0RJUkVDVChwaHlzX2RzdCk7CisjaWZkZWYgQ1BVX0NIRVJJCisJaWYgKGZsYWdzICYgUE1B UF9DT1BZX1RBR1MpCisJCWNoZXJpX2Jjb3B5KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3QpdmFf ZHN0LCBQQUdFX1NJWkUpOworCWVsc2UKKyNlbHNlCisJCWJjb3B5KChjYWRkcl90KXZhX3NyYywg KGNhZGRyX3QpdmFfZHN0LCBQQUdFX1NJWkUpOworI2VuZGlmCisJbWlwc19kY2FjaGVfd2JpbnZf cmFuZ2UodmFfZHN0LCBQQUdFX1NJWkUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKiBX aXRoIENIRVJJLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlIHRvIGV4cGxpY2l0bHkgcHJvcGFn YXRlIHRhZ3MgYmV0d2VlbgorICogcGFnZXMgKGUuZy4sIGR1cmluZyBjb3B5LW9uLXdyaXRlKSwg YnV0IG5vdCBvdGhlciB0aW1lcyAoZS5nLiwgY29weWluZyBkYXRhCisgKiBmcm9tIFZNIHRvIGJ1 ZmZlciBjYWNoZSkuICBUaGVyZSBpcyBtb3JlIHBsYXlpbmcgb3V0IGhlcmUgeWV0IHRvIGRvIChl LmcuLAorICogaWYgYW55IGZpbGVzeXN0ZW1zIGxlYXJuIHRvIHByZXNlcnZlIHRhZ3MpIGJ1dCB0 aGVzZSBLUElzIGFsbG93IHVzIHRvCisgKiBjYXB0dXJlIHRoYXQgZGlmZmVyZW5jZSBpbiB0aGUg bWVhbiB0aW1lLgorICovCit2b2lkCitwbWFwX2NvcHlfcGFnZSh2bV9wYWdlX3Qgc3JjLCB2bV9w YWdlX3QgZHN0KQoreworCisJcG1hcF9jb3B5X3BhZ2VfaW50ZXJuYWwoc3JjLCBkc3QsIDApOwor fQorCisjaWZkZWYgQ1BVX0NIRVJJCit2b2lkCitwbWFwX2NvcHlfcGFnZV90YWdzKHZtX3BhZ2Vf dCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMs IGRzdCwgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKK2ludCB1bm1hcHBlZF9idWZfYWxs b3dlZDsKKworc3RhdGljIHZvaWQKK3BtYXBfY29weV9wYWdlc19pbnRlcm5hbCh2bV9wYWdlX3Qg bWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNl dF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUsIGludCBmbGFncykKK3sKKwljaGFyICphX2NwLCAq Yl9jcDsKKwl2bV9wYWdlX3QgYV9tLCBiX207CisJdm1fb2Zmc2V0X3QgYV9wZ19vZmZzZXQsIGJf cGdfb2Zmc2V0OworCXZtX3BhZGRyX3QgYV9waHlzLCBiX3BoeXM7CisJaW50IGNudDsKKworCXNj aGVkX3BpbigpOworCXdoaWxlICh4ZmVyc2l6ZSA+IDApIHsKKwkJYV9wZ19vZmZzZXQgPSBhX29m ZnNldCAmIFBBR0VfTUFTSzsKKwkJY250ID0gbWluKHhmZXJzaXplLCBQQUdFX1NJWkUgLSBhX3Bn X29mZnNldCk7CisJCWFfbSA9IG1hW2Ffb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQlhX3BoeXMg PSBWTV9QQUdFX1RPX1BIWVMoYV9tKTsKKwkJYl9wZ19vZmZzZXQgPSBiX29mZnNldCAmIFBBR0Vf TUFTSzsKKwkJY250ID0gbWluKGNudCwgUEFHRV9TSVpFIC0gYl9wZ19vZmZzZXQpOworCQliX20g PSBtYltiX29mZnNldCA+PiBQQUdFX1NISUZUXTsKKwkJYl9waHlzID0gVk1fUEFHRV9UT19QSFlT KGJfbSk7CisJCXBtYXBfZmx1c2hfcHZjYWNoZShhX20pOworCQltaXBzX2RjYWNoZV93Ymludl9y YW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cyksCisJCSAgICBQQUdFX1NJWkUp OworCQlhX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGFfcGh5cykgKyBhX3BnX29m ZnNldDsKKwkJYl9jcCA9IChjaGFyICopTUlQU19QSFlTX1RPX0RJUkVDVChiX3BoeXMpICsgYl9w Z19vZmZzZXQ7CisjaWZkZWYgQ1BVX0NIRVJJCisJCWlmIChmbGFncyAmIFBNQVBfQ09QWV9UQUdT KQorCQkJY2hlcmlfYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKwkJZWxzZQorI2Vsc2UKKwkJCWJj b3B5KGFfY3AsIGJfY3AsIGNudCk7CisjZW5kaWYKKwkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Uo KHZtX29mZnNldF90KWJfY3AsIGNudCk7CisJCWFfb2Zmc2V0ICs9IGNudDsKKwkJYl9vZmZzZXQg Kz0gY250OworCQl4ZmVyc2l6ZSAtPSBjbnQ7CisJfQorCXNjaGVkX3VucGluKCk7Cit9CisKKy8q CisgKiBBcyB3aXRoIHBtYXBfY29weV9wYWdlKCksIENIRVJJIHJlcXVpcmVzIHRhZ2dlZCBhbmQg bm9uLXRhZ2dlZCB2ZXJzaW9ucworICogZGVwZW5kaW5nIG9uIHRoZSBjaXJjdW1zdGFuY2VzLgor ICovCit2b2lkCitwbWFwX2NvcHlfcGFnZXModm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3Bt YXBfY29weV9wYWdlc190YWdzKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwg dm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSkK K3sKKworCXBtYXBfY29weV9wYWdlc19pbnRlcm5hbChtYSwgYV9vZmZzZXQsIG1iLCBiX29mZnNl dCwgeGZlcnNpemUsCisJICAgIFBNQVBfQ09QWV9UQUdTKTsKK30KKyNlbmRpZgorCisvKgorICog UmV0dXJucyB0cnVlIGlmIHRoZSBwbWFwJ3MgcHYgaXMgb25lIG9mIHRoZSBmaXJzdAorICogMTYg cHZzIGxpbmtlZCB0byBmcm9tIHRoaXMgcGFnZS4gIFRoaXMgY291bnQgbWF5CisgKiBiZSBjaGFu Z2VkIHVwd2FyZHMgb3IgZG93bndhcmRzIGluIHRoZSBmdXR1cmU7IGl0CisgKiBpcyBvbmx5IG5l Y2Vzc2FyeSB0aGF0IHRydWUgYmUgcmV0dXJuZWQgZm9yIGEgc21hbGwKKyAqIHN1YnNldCBvZiBw bWFwcyBmb3IgcHJvcGVyIHBhZ2UgYWdpbmcuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2V4 aXN0c19xdWljayhwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2Ug KnB2aDsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxvb3Bz ID0gMDsKKwlib29sZWFuX3QgcnY7CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5B R0VEKSA9PSAwLAorCSAgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5jX18s IG0pKTsKKwlydiA9IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlpZiAoUFZfUE1BUChwdikg PT0gcG1hcCkgeworCQkJcnYgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcHMrKzsKKwkJ aWYgKGxvb3BzID49IDE2KQorCQkJYnJlYWs7CisJfQorCWlmICghcnYgJiYgbG9vcHMgPCAxNiAm JiAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBw dl9uZXh0KSB7CisJCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgeworCQkJCXJ2ID0gVFJVRTsK KwkJCQlicmVhazsKKwkJCX0KKwkJCWxvb3BzKys7CisJCQlpZiAobG9vcHMgPj0gMTYpCisJCQkJ YnJlYWs7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xv YmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9wYWdlX3dpcmVkX21h cHBpbmdzOgorICoKKyAqCVJldHVybiB0aGUgbnVtYmVyIG9mIG1hbmFnZWQgbWFwcGluZ3MgdG8g dGhlIGdpdmVuIHBoeXNpY2FsIHBhZ2UKKyAqCXRoYXQgYXJlIHdpcmVkLgorICovCitpbnQKK3Bt YXBfcGFnZV93aXJlZF9tYXBwaW5ncyh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICps b2NrOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJcHRfZW50cnlfdCAqcHRlOwor CWludCBjb3VudCwgbWRfZ2VuOworCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh PSAwKQorCQlyZXR1cm4gKDApOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6 CisJY291bnQgPSAwOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0 KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsK KwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQlQTUFQ X0xPQ0socG1hcCk7CisJCQlyd19ybG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQu cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJ fQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVz dChwdGUsIFBURV9XKSkKKwkJCWNvdW50Kys7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKwlp ZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlzdHJ1Y3QgbWRfcGFnZSAq cHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYs ICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlm ICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJaW50IHB2aF9nZW4gPSBwdmgtPnB2X2dlbjsK KwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQ TUFQX0xPQ0socG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBt LT5tZC5wdl9nZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXBk X2VudHJ5X3QgKnBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAocHRlX3Rl c3QoKHB0X2VudHJ5X3QgKilwZGUsIFBURV9XKSkKKwkJCQljb3VudCsrOworCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCX0KKwl9CisJcndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhf Z2xvYmFsX2xvY2spOworCXJldHVybiAoY291bnQpOworfQorCisvKgorICogIFJldHVybnMgVFJV RSBpZiB0aGUgZ2l2ZW4gcGFnZSBpcyBtYXBwZWQgaW5kaXZpZHVhbGx5IG9yIGFzIHBhcnQgb2YK KyAqICBhIDJtcGFnZS4gT3RoZXJ3aXNlLCByZXR1cm5zIEZBTFNFLgorICovCitib29sZWFuX3QK K3BtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90IG0pCit7CisJc3RydWN0IHJ3bG9jayAqbG9j azsKKwlib29sZWFuX3QgcnY7CisKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9 IDApCisJCXJldHVybiAoRkFMU0UpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxv Y2sgPSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKKwlydiA9 ICFUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgfHwKKwkgICAgKChtLT5mbGFncyAmIFBHX0ZJ Q1RJVElPVVMpID09IDAgJiYKKwkJIVRBSUxRX0VNUFRZKCZwYV90b19wdmgoVk1fUEFHRV9UT19Q SFlTKG0pKS0+cHZfbGlzdCkpOworCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqIERlc3Ryb3kgYWxsIG1h bmFnZWQsIG5vbi13aXJlZCBtYXBwaW5ncyBpbiB0aGUgZ2l2ZW4gdXNlci1zcGFjZQorICogcG1h cC4gIFRoaXMgcG1hcCBjYW5ub3QgYmUgYWN0aXZlIG9uIGFueSBwcm9jZXNzb3IgYmVzaWRlcyB0 aGUKKyAqIGNhbGxlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBhcHBsaWVkIHRv IHRoZSBrZXJuZWwgcG1hcC4gIE1vcmVvdmVyLCBpdAorICogaXMgbm90IGludGVuZGVkIGZvciBn ZW5lcmFsIHVzZS4gIEl0IGlzIG9ubHkgdG8gYmUgdXNlZCBkdXJpbmcKKyAqIHByb2Nlc3MgdGVy bWluYXRpb24uICBDb25zZXF1ZW50bHksIGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB3YXlzCisg KiB0aGF0IG1ha2UgaXQgZmFzdGVyIHRoYW4gcG1hcF9yZW1vdmUoKS4gIEZpcnN0LCBpdCBjYW4g bW9yZSBxdWlja2x5CisgKiBkZXN0cm95IG1hcHBpbmdzIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBw bWFwJ3MgY29sbGVjdGlvbiBvZiBQVgorICogZW50cmllcywgcmF0aGVyIHRoYW4gc2VhcmNoaW5n IHRoZSBwYWdlIHRhYmxlLiAgU2Vjb25kLCBpdCBkb2Vzbid0CisgKiBoYXZlIHRvIHRlc3QgYW5k IGNsZWFyIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgYXRvbWljYWxseSwgYmVjYXVzZQorICogbm8g cHJvY2Vzc29yIGlzIGN1cnJlbnRseSBhY2Nlc3NpbmcgdGhlIHVzZXIgYWRkcmVzcyBzcGFjZS4g IEluCisgKiBwYXJ0aWN1bGFyLCBhIHBhZ2UgdGFibGUgZW50cnkncyBkaXJ0eSBiaXQgd29uJ3Qg Y2hhbmdlIHN0YXRlIG9uY2UKKyAqIHRoaXMgZnVuY3Rpb24gc3RhcnRzLgorICovCit2b2lkCitw bWFwX3JlbW92ZV9wYWdlcyhwbWFwX3QgcG1hcCkKK3sKKwlwZF9lbnRyeV90IHB0ZXBkZSwgKnBk ZTsKKwlwdF9lbnRyeV90ICpwdGUsIHRwdGU7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKwl2bV9w YWdlX3QgbSwgbXB0ZSwgbXQ7CisJcHZfZW50cnlfdCBwdjsKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZo OworCXN0cnVjdCBwdl9jaHVuayAqcGMsICpucGM7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlp bnQgYml0OworCXVpbnQ2NF90IGludXNlLCBiaXRtYXNrOworCWludCBhbGxmcmVlLCBmaWVsZCwg ZnJlZWQsIGlkeDsKKwlib29sZWFuX3Qgc3VwZXJwYWdlOworCXZtX3BhZGRyX3QgcGE7CisKKwkv KgorCSAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBwbWFwIGlzIG9ubHkgYWN0aXZlIG9uIHRoZSBj dXJyZW50CisJICogQ1BVLiAgVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IGJsb2NrIGFub3RoZXIg Q1BVIGZyb20KKwkgKiBhY3RpdmF0aW5nIHRoZSBwbWFwIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMg ZXhlY3V0aW5nLgorCSAqLworCUtBU1NFUlQocG1hcCA9PSB2bXNwYWNlX3BtYXAoY3VydGhyZWFk LT50ZF9wcm9jLT5wX3Ztc3BhY2UpLAorCSAgICAoIiVzOiBub24tY3VycmVudCBwbWFwICVwIiwg X19mdW5jX18sIHBtYXApKTsKKworCWxvY2sgPSBOVUxMOworCVNMSVNUX0lOSVQoJmZyZWUpOwor CXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfTE9DSyhwbWFwKTsKKwlUQUlMUV9G T1JFQUNIX1NBRkUocGMsICZwbWFwLT5wbV9wdmNodW5rLCBwY19saXN0LCBucGMpIHsKKwkJYWxs ZnJlZSA9IDE7CisJCWZyZWVkID0gMDsKKwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007 IGZpZWxkKyspIHsKKwkJCWludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb ZmllbGRdOworCQkJd2hpbGUgKGludXNlICE9IDApIHsKKwkJCQliaXQgPSBmZnNsKGludXNlKSAt IDE7CisJCQkJYml0bWFzayA9IDFVTCA8PCBiaXQ7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2Yo aW51c2UpICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJ CWludXNlICY9IH5iaXRtYXNrOworCisJCQkJcGRlID0gcG1hcF9zZWdtYXAocG1hcCwgcHYtPnB2 X3ZhKTsKKwkJCQlwdGVwZGUgPSAqcGRlOworCQkJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRl LCBwdi0+cHZfdmEpOworCQkJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCQkJ c3VwZXJwYWdlID0gVFJVRTsKKwkJCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCQkJfSBl bHNlIHsKKwkJCQkJc3VwZXJwYWdlID0gRkFMU0U7CisJCQkJCXB0ZXBkZSA9ICpwZGU7CisJCQkJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCQkJfQorCQkJCXRwdGUg PSAqcHRlOworCQkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpICB7CisJCQkJCXBhbmljKCIlczog YmFkICVzIHB0ZSB2YSAlbHggcHRlICVseCIsCisJCQkJCSAgICBfX2Z1bmNfXywgc3VwZXJwYWdl ID8gInN1cGVycGFnZSIgOgorCQkJCQkgICAgIiIsIHB2LT5wdl92YSwgdHB0ZSk7CisJCQkJfQor CisvKgorICogV2UgY2Fubm90IHJlbW92ZSB3aXJlZCBwYWdlcyBmcm9tIGEgcHJvY2VzcycgbWFw cGluZyBhdCB0aGlzIHRpbWUKKyAqLworCQkJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKSB7 CisJCQkJCWFsbGZyZWUgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlwYSA9IFRM QkxPX1BURV9UT19QQSh0cHRlKTsKKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwYSAmPSB+UERS TUFTSzsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJCQlLQVNTRVJUKG0tPnBoeXNf YWRkciA9PSBwYSwKKwkJCQkgICAgKCIlczogdm1fcGFnZV90ICVwIHBoeXNfYWRkciBtaXNtYXRj aCAiCisJCQkJICAgICIlMDE2anggJTAxNmp4IiwgX19mdW5jX18sIG0sCisJCQkJICAgICh1aW50 bWF4X3QpbS0+cGh5c19hZGRyLCAodWludG1heF90KXRwdGUpKTsKKworCQkJCUtBU1NFUlQoKG0t PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAorCQkJCSAgICBtIDwgJnZtX3BhZ2VfYXJy YXlbdm1fcGFnZV9hcnJheV9zaXplXSwKKwkJCQkgICAgKCIlczogYmFkIHRwdGUgJSNqeCIsIF9f ZnVuY19fLAorCQkJCSAgICAodWludG1heF90KXRwdGUpKTsKKworCQkJCS8qIENsZWFyIFBURSAq LworCQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXB0ZV9zdG9yZShwdGUsIDApOworCQkJCWVsc2UK KwkJCQkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVsX3BtYXAocG1hcCkgPworCQkJCQkgICAgUFRF X0cgOiAwKTsKKworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSB2bV9wYWdlX3QgY2xlYW4gYW5k IHJlZmVyZW5jZSBiaXRzCisJCQkJICovCisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfRCkg JiYKKwkJCQkgICAgIXB0ZV90ZXN0KCZ0cHRlLCBQVEVfUk8pKSB7CisJCQkJCWlmIChzdXBlcnBh Z2UpIHsKKwkJCQkJCXZtX3BhZ2VfdCBtdDsKKworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1b TkJQRFIgLyBQQUdFX1NJWkVdOyBtdCsrKQorCQkJCQkJCXZtX3BhZ2VfZGlydHkobXQpOworCQkJ CQl9IGVsc2UKKwkJCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJfQorCisJCQkJQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2NrLCBtKTsKKworCQkJCS8qIE1hcmsgZnJlZSAqLwor CQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CisJCQkJaWYgKHN1cGVycGFnZSkgewor CQkJCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisJ CQkJCXB2aCA9IHBhX3RvX3B2aChUTEJMT19QVEVfVE9fUEEodHB0ZSkpOworCQkJCQlUQUlMUV9S RU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlwdmgtPnB2X2dlbisrOwor CQkJCQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpIHsKKwkJCQkJCWZvciAobXQgPSBt OyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJCQlpZiAoVEFJTFFfRU1Q VFkoJm10LT5tZC5wdl9saXN0KSkKKwkJCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtdCwgUEdB X1dSSVRFQUJMRSk7CisJCQkJCX0KKwkJCQkJbXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1h cCwgcHYtPnB2X3ZhKTsKKwkJCQkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJCQkJcG1hcF9yZW1v dmVfcHRfcGFnZShwbWFwLCBtcHRlKTsKKwkJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBt YXAsIDEpOworCQkJCQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID09IE5QVEVQRywKKwkJCQkJ CSAgICAoIiVzOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIiwKKwkJCQkJCSAgICBfX2Z1bmNf XykpOworCQkJCQkJbXB0ZS0+d2lyZV9jb3VudCA9IDA7CisJCQkJCQlwbWFwX2FkZF9kZWxheWVk X2ZyZWVfbGlzdChtcHRlLCAmZnJlZSwgRkFMU0UpOworCQkJCQkJYXRvbWljX3N1YnRyYWN0X2lu dCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlw bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCQlpZiAo KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpICE9IDAgJiYKKwkJCQkJICAgIFRBSUxRX0VNUFRZ KCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCQkgICAgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykg PT0gMCkgeworCQkJCQkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJ CQlpZiAoVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkpCisJCQkJCQkJdm1fcGFnZV9hZmxhZ19j bGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlwbWFwX3VudXNlX3B0 KHBtYXAsIHB2LT5wdl92YSwgcHRlcGRlLCAmZnJlZSk7CisJCQkJZnJlZWQrKzsKKwkJCX0KKwkJ fQorCQlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfZnJlZXMsIGZyZWVkKSk7CisJ CVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBmcmVlZCkpOworCQlQVl9T VEFUKGF0b21pY19zdWJ0cmFjdF9sb25nKCZwdl9lbnRyeV9jb3VudCwgZnJlZWQpKTsKKwkJaWYg KGFsbGZyZWUpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xp c3QpOworCQkJZnJlZV9wdl9jaHVuayhwYyk7CisJCX0KKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK KwkJcndfd3VubG9jayhsb2NrKTsKKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCVBNQVBf VU5MT0NLKHBtYXApOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcG1hcF9mcmVl X3plcm9fcGFnZXMoJmZyZWUpOworfQorCisvKgorICogQ2xlYXIgdGhlIHdyaXRlIGFuZCBtb2Rp ZmllZCBiaXRzIGluIGVhY2ggb2YgdGhlIGdpdmVuIHBhZ2UncyBtYXBwaW5ncy4KKyAqLwordm9p ZAorcG1hcF9yZW1vdmVfd3JpdGUodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2 aDsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdl9lbnRyeV90IG5leHRfcHY7CisJaW50IHB2aF9nZW47 CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGU7 CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbWRfZ2Vu OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJw bWFwX3JlbW92ZV93cml0ZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJ ICogSWYgdGhlIHBhZ2UgaXMgbm90IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJM RSBjYW5ub3QgYmUKKwkgKiBzZXQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIG9iamVjdCBp cyBsb2NrZWQuICBUaHVzLAorCSAqIGlmIFBHQV9XUklURUFCTEUgaXMgY2xlYXIsIG5vIHBhZ2Ug dGFibGUgZW50cmllcyBuZWVkIHVwZGF0aW5nLgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xP Q0tFRChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3Mg JiBQR0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcndfcmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXB2aCA9IHBhX3Rv X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworcmV0cnlfcHZfbG9vcDoKKwlyd193bG9jayhsb2Nr KTsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9t YXBwaW5nczsKKwlUQUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQs IG5leHRfcHYpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2Nr KGxvY2spOworCQkJCWdvdG8gcmV0cnlfcHZfbG9vcDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5w dl92YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlpZiAocGRlX2lzXzFtX3N1cGVy cGFnZShwZGUpICYmICFwZGVfdGVzdChwZGUsIFBURV9STykpCisJCQkodm9pZClwbWFwX2RlbW90 ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKwkJS0FTU0VSVChsb2NrID09IFZN X1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLAorCQkgICAgKCJpbmNvbnNpc3RlbnQgcHYgbG9jayAl cCAlcCBmb3IgcGFnZSAlcCIsCisJCSAgICBsb2NrLCBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyht KSwgbSkpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlM UV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1B UChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5w dl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOwor CQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAh PSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQ TUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlyd193dW5sb2NrKGxvY2spOworCQkJCWdvdG8gcmV0cnlf cHZfbG9vcDsKKwkJCX0KKwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOwor CQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAgICAoIiVzOiBmb3VuZCBhIHN1 cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBfX2Z1bmNfXywgbSkpOworCQlw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHB0ZSAhPSBO VUxMICYmIHB0ZV9pc192YWxpZChwdGUpLAorCQkgICAgKCIlczpwYWdlIG9uIHB2X2xpc3QgaGFz IG5vIHB0ZSIsIF9fZnVuY19fKSk7CityZXRyeToKKwkJb2xkcHRlID0gKnB0ZTsKKwkJaWYgKCFw dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsIG9sZHB0ZSwKKwkJCSAgICAoKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKSkKKwkJCQln b3RvIHJldHJ5OworCQkJaWYgKHB0ZV90ZXN0KCZvbGRwdGUsIFBURV9EKSkKKwkJCQl2bV9wYWdl X2RpcnR5KG0pOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0Ff V1JJVEVBQkxFKTsKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf bG9jayk7Cit9CisKKyNkZWZpbmUJUE1BUF9UU19SRUZFUkVOQ0VEX01BWAk1CisKKy8qLQorICoJ cG1hcF90c19yZWZlcmVuY2VkOgorICoKKyAqICBSZXR1cm4gYSBjb3VudCBvZiBwYWdlcyB0aGF0 IGhhdmUgYmVlbiByZWZlcmVuY2VkLCBhbmQgcmVzZXQgdGhlCisgKiAgcmVmZXJlbmNlIGJpdC4g IEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIGV2ZXJ5IHJlZmVyZW5jZSBiaXQgdG8gYmUKKyAqICBy ZXNldCwgYnV0IGl0IGlzIG5lY2Vzc2FyeSB0aGF0IDAgb25seSBiZSByZXR1cm5lZCB3aGVuIHRo ZXJlIGFyZQorICogIHRydWx5IGhhdmUgYmVlbiBwYWdlcyByZWZlcmVuY2VkLgorICoKKyAqICBY WFg6IFRoZSBleGFjdCBudW1iZXIgb2YgZmxhZ3MgdG8gY2hlY2sgYW5kIHJlc2V0IGlzIGEgbWF0 dGVyIHRoYXQKKyAqICBzaG91bGQgYmUgdGVzdGVkIGFuZCBzdGFuZGFyZGl6ZWQgYXQgc29tZSBw b2ludCBpbiB0aGUgZnV0dXJlIGZvcgorICogIG9wdGltYWwgYWdpbmcgb2Ygc2hhcmVkIHBhZ2Vz LgorICovCitpbnQKK3BtYXBfdHNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qg bWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHYsIHB2ZjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1 Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJ dm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgY2xlYXJlZCwgbWRfZ2VuLCBu b3RfY2xlYXJlZCwgcHZoX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH RUQpID09IDAsCisJICAgICgicG1hcF90c19yZWZlcmVuY2VkOiBwYWdlICVwIGlzIG5vdCBtYW5h Z2VkIiwgbSkpOworCWNsZWFyZWQgPSAwOworCXBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCWxv Y2sgPSBQSFlTX1RPX1BWX0xJU1RfTE9DSyhwYSk7CisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwly d19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyd193bG9jayhsb2NrKTsKK3JldHJ5OgorCW5v dF9jbGVhcmVkID0gMDsKKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCB8fAor CSAgICAocHZmID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpID09IE5VTEwpCisJCWdvdG8g c21hbGxfbWFwcGluZ3M7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsK KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4g IT0gcHZoLT5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5 OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBw di0+cHZfdmEpOworCQlpZiAocHRlX2lzX3JlZigocHRfZW50cnlfdCAqKXBkZSkpIHsKKwkJCS8q CisJCQkgKiBTaW5jZSB0aGlzIHJlZmVyZW5jZSBiaXQgaXMgc2hhcmVkIGJ5IDUxMiA0S0IKKwkJ CSAqIHBhZ2VzLCBpdCBzaG91bGQgbm90IGJlIGNsZWFyZWQgZXZlcnkgdGltZSBpdCBpcworCQkJ ICogdGVzdGVkLiAgQXBwbHkgYSBzaW1wbGUgImhhc2giIGZ1bmN0aW9uIG9uIHRoZQorCQkJICog cGh5c2ljYWwgcGFnZSBudW1iZXIsIHRoZSB2aXJ0dWFsIHN1cGVycGFnZSBudW1iZXIsCisJCQkg KiBhbmQgdGhlIHBtYXAgYWRkcmVzcyB0byBzZWxlY3Qgb25lIDRLQiBwYWdlIG91dCBvZgorCQkJ ICogdGhlIDUxMiBvbiB3aGljaCB0ZXN0aW5nIHRoZSByZWZlcmVuY2UgYml0IHdpbGwKKwkJCSAq IHJlc3VsdCBpbiBjbGVhcmluZyB0aGF0IHJlZmVyZW5jZSBiaXQuICBUaGlzCisJCQkgKiBmdW5j dGlvbiBpcyBkZXNpZ25lZCB0byBhdm9pZCB0aGUgc2VsZWN0aW9uIG9mIHRoZQorCQkJICogc2Ft ZSA0S0IgcGFnZSBmb3IgZXZlcnkgMk1CIHBhZ2UgbWFwcGluZy4KKwkJCSAqCisJCQkgKiBPbiBk ZW1vdGlvbiwgYSBtYXBwaW5nIHRoYXQgaGFzbid0IGJlZW4gcmVmZXJlbmNlZAorCQkJICogaXMg c2ltcGx5IGRlc3Ryb3llZC4gIFRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBhCisJCQkgKiBz dWJzZXF1ZW50IHBhZ2UgZmF1bHQgb24gYSBkZW1vdGVkIHdpcmVkIG1hcHBpbmcsCisJCQkgKiBh bHdheXMgbGVhdmUgaXRzIHJlZmVyZW5jZSBiaXQgc2V0LiAgTW9yZW92ZXIsCisJCQkgKiBzaW5j ZSB0aGUgc3VwZXJwYWdlIGlzIHdpcmVkLCB0aGUgY3VycmVudCBzdGF0ZSBvZgorCQkJICogaXRz IHJlZmVyZW5jZSBiaXQgd29uJ3QgYWZmZWN0IHBhZ2UgcmVwbGFjZW1lbnQuCisJCQkgKi8KKwkJ CWlmICgoKChwYSA+PiBQQUdFX1NISUZUKSBeIChwdi0+cHZfdmEgPj4gUERSU0hJRlQpIF4KKwkJ CSAgICAodWludHB0cl90KXBtYXApICYgKE5QVEVQRyAtIDEpKSA9PSAwICYmCisJCQkgICAgIXBk ZV90ZXN0KHBkZSwgUFRFX1cpKSB7CisJCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2VudHJ5X3Qg KilwZGUsIFBURV9SRUYpOworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92 YSk7CisJCQkJY2xlYXJlZCsrOworCQkJfSBlbHNlCisJCQkJbm90X2NsZWFyZWQrKzsKKworCQl9 CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhlIFBWIGxpc3QgaWYgaXQgaGFz IG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBOVUxMICYmIFRBSUxRX05FWFQo cHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw diwgcHZfbmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmcHZoLT5wdl9saXN0LCBwdiwgcHZf bmV4dCk7CisJCX0KKwkJaWYgKChjbGVhcmVkICsgbm90X2NsZWFyZWQpID49IFBNQVBfVFNfUkVG RVJFTkNFRF9NQVgpCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm cHZoLT5wdl9saXN0KSkgIT0gcHZmKTsKK3NtYWxsX21hcHBpbmdzOgorCWlmICgocHZmID0gVEFJ TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlwdiA9IHB2 ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0gUFZf UE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZo LT5wdl9nZW47CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2sp OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAoCisJCQkg ICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbiB8fAorCQkJICAgIG1kX2dlbiAhPSBtLT5tZC5wdl9n ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQl9 CisKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lz X3N1cGVycGFnZShwZGUpLAorCQkgICAgKCJwbWFwX3RzX3JlZmVyZW5jZWQ6IGZvdW5kIHN1cGVy cGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsCisJCSAgICBtKSk7CisJCXB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfaXNfcmVmKHB0ZSkpIHsKKwkJCWF0 b21pY19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQljbGVhcmVkKys7CisJCX0KKwkJUE1B UF9VTkxPQ0socG1hcCk7CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0 aGFuIG9uZSBlbnRyeS4gKi8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZf bmV4dCkgIT0gTlVMTCkgeworCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZf bmV4dCk7CisJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQp OworCQkJbS0+bWQucHZfZ2VuKys7CisJCX0KKwl9IHdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgm bS0+bWQucHZfbGlzdCkpICE9IHB2ZiAmJiBjbGVhcmVkICsKKwkgICAgbm90X2NsZWFyZWQgPCBQ TUFQX1RTX1JFRkVSRU5DRURfTUFYKTsKK291dDoKKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChjbGVhcmVkICsgbm90X2NsZWFyZWQp OworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyh2bV9wYWdl X3QgbSwgYm9vbGVhbl90IGFjY2Vzc2VkLCBib29sZWFuX3QgbW9kaWZpZWQpCit7CisJc3RydWN0 IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJ cHRfZW50cnlfdCAqcHRlOworCXBtYXBfdCBwbWFwOworCWludCBtZF9nZW4sIHB2aF9nZW47CisJ Ym9vbGVhbl90IHJ2OworCisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CityZXN0YXJ0OgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7 CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJ CSBtZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQkgcndfcnVubG9jayhsb2NrKTsKKwkJCSBQTUFQ X0xPQ0socG1hcCk7CisJCQkgcndfcmxvY2sobG9jayk7CisJCQkgaWYgKG1kX2dlbiAhPSBtLT5t ZC5wdl9nZW4pIHsKKwkJCQkgUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJIGdvdG8gcmVzdGFydDsK KwkJCSB9CisJCX0KKwkJcHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKG1v ZGlmaWVkKSB7CisJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFwdGVfdGVzdChwdGUs IFBURV9STyk7CisJCQlpZiAoYWNjZXNzZWQpCisJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQo cHRlKSAmJiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0gZWxzZSBpZiAoYWNjZXNzZWQpIHsKKwkJCXJ2 ID0gcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9CisJCVBNQVBfVU5M T0NLKHBtYXApOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKChtLT5mbGFncyAm IFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZ UyhtKSk7CisJCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJ bWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCQly d19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQlyd19ybG9jayhsb2Nr KTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAgICBwdmhfZ2VuICE9 IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlnb3RvIHJlc3Rh cnQ7CisJCQkJfQorCQkJfQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwbWFwX3BkZShwbWFwLCBw di0+cHZfdmEpOworCQkJaWYgKG1vZGlmaWVkKSB7CisJCQkJcnYgPSBwdGVfdGVzdChwdGUsIFBU RV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJCWlmIChhY2Nlc3Nl ZCkKKwkJCQkJcnYgPSBydiAmJiBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCQkgICAgcHRlX2lz X3JlZihwdGUpOworCQkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJCXJ2ID0gcHRlX2lzX3Zh bGlkKHB0ZSkgJiYKKwkJCQkgICAgcHRlX2lzX3JlZihwdGUpOworCQkJfQorCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQlpZiAocnYpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcndf cnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAo cnYpOworfQorCisKKy8qCisgKglwbWFwX2lzX21vZGlmaWVkOgorICoKKyAqCVJldHVybiB3aGV0 aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2Ugd2FzIG1vZGlmaWVkCisgKglp biBhbnkgcGh5c2ljYWwgbWFwcy4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX21vZGlmaWVkKHZt X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g MCwKKwkgICAgKCJwbWFwX2lzX21vZGlmaWVkOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkp OworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQ R0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIGNvbmN1cnJlbnRseSBzZXQgd2hpbGUgdGhlIG9i amVjdCBpcyBsb2NrZWQuICBUaHVzLCBpZiBQR0FfV1JJVEVBQkxFCisJICogaXMgY2xlYXIsIG5v IFBURXMgY2FuIGhhdmUgUFRFX0Qgc2V0LgorCSAqLworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tF RChtLT5vYmplY3QpOworCWlmICghdm1fcGFnZV94YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQ R0FfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKwlyZXR1cm4gKHBtYXBfcGFn ZV90ZXN0X21hcHBpbmdzKG0sIEZBTFNFLCBUUlVFKSk7Cit9CisKKy8qCisgKglwbWFwX2lzX3By ZWZhdWx0YWJsZToKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCB2 aXJ0dWFsIGFkZHJlc3MgaXMgZWxnaWJsZQorICoJZm9yIHByZWZhdWx0LgorICovCitib29sZWFu X3QKK3BtYXBfaXNfcHJlZmF1bHRhYmxlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyKQor eworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJYm9vbGVhbl90IHJ2Owor CisJcnYgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwg YWRkcik7CisJaWYgKHBkZSAhPSBOVUxMICYmICpwZGUgIT0gMCkgeworCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKQorCQkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKwkJ CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIGFkZHIpOworCQlydiA9ICgqcHRlID09IDApIHx8 ICgqcHRlID09IFBURV9HKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIChydik7 Cit9CisKKy8qCisgKglwbWFwX2lzX3JlZmVyZW5jZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIg b3Igbm90IHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3YXMgcmVmZXJlbmNlZAorICoJaW4g YW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19yZWZlcmVuY2VkKHZt X3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0g MCwKKwkgICAgKCJwbWFwX2lzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBt KSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBUUlVFLCBGQUxTRSkpOwor fQorCisvKgorICoJQXBwbHkgdGhlIGdpdmVuIGFkdmljZSB0byB0aGUgc3BlY2lmaWVkIHJhbmdl IG9mIGFkZHJlc3NlcyB3aXRoaW4gdGhlCisgKglnaXZlbiBwbWFwLiAgRGVwZW5kaW5nIG9uIHRo ZSBhZHZpY2UsIGNsZWFyIHRoZSByZWZlcmVuY2VkIGFuZC9vcgorICoJbW9kaWZpZWQgZmxhZ3Mg aW4gZWFjaCBtYXBwaW5nIGFuZCBzZXQgdGhlIG1hcHBlZCBwYWdlJ3MgZGlydHkgZmllbGQuCisg Ki8KK3ZvaWQKK3BtYXBfYWR2aXNlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29m ZnNldF90IGV2YSwgaW50IGFkdmljZSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2Vu dHJ5X3QgKnBkZSwgKnBkcGUsIG9sZHBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0 X3QgdmFfbmV4dDsKKwl2bV9wYWdlX3QgbTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlz dHNfbG9ja2VkOworCisJaWYgKGFkdmljZSAhPSBNQURWX0RPTlRORUVEICYmIGFkdmljZSAhPSBN QURWX0ZSRUUpCisJCXJldHVybjsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1l OgorCWFueWNoYW5nZWQgPSBGQUxTRTsKKwlQTUFQX0xPQ0socG1hcCk7CisJZm9yICg7IHN2YSA8 IGV2YTsgc3ZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsK KwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01B U0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGlu dWU7CisJCX0KKwkJdmFfbmV4dCA9IChzdmEgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZh X25leHQgPCBzdmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCXBkZSA9IHBtYXBfcGRwZV90b19w ZGUocGRwZSwgc3ZhKTsKKwkJb2xkcGRlID0gKnBkZTsKKwkJaWYgKHBkZSA9PSBOVUxMIHx8ICpw ZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk ZSkpIHsKKwkJCWlmICghcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp bnVlOworCQkJaWYgKCFwdl9saXN0c19sb2NrZWQpIHsKKwkJCQlwdl9saXN0c19sb2NrZWQgPSBU UlVFOworCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spKSB7CisJCQkJCWlm IChhbnljaGFuZ2VkKQorCQkJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQkJUE1B UF9VTkxPQ0socG1hcCk7CisJCQkJCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQln b3RvIHJlc3VtZTsKKwkJCQl9CisJCQl9CisJCQlsb2NrID0gTlVMTDsKKwkJCWlmICghcG1hcF9k ZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHN2YSwgJmxvY2spKSB7CisJCQkJaWYgKGxvY2sg IT0gTlVMTCkKKwkJCQkJcndfd3VubG9jayhsb2NrKTsKKworCQkJCS8qCisJCQkJICogVGhlIHN1 cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJICovCisJCQkJY29udGludWU7CisJ CQl9CisKKwkJCS8qCisJCQkgKiBVbmxlc3MgdGhlIHBhZ2UgbWFwcGluZ3MgYXJlIHdpcmVkLCBy ZW1vdmUgdGhlCisJCQkgKiBtYXBwaW5nIHRvIGEgc2luZ2xlIHBhZ2Ugc28gdGhhdCBhIHN1YnNl cXVlbnQKKwkJCSAqIGFjY2VzcyBtYXkgcmVwcm9tb3RlLiAgU2luY2UgdGhlIHVuZGVybHlpbmcg cGFnZQorCQkJICogdGFibGUgcGFnZSBpcyBmdWxseSBwb3B1bGF0ZWQsIHRoaXMgcmVtb3ZhbCBu ZXZlcgorCQkJICogZnJlZXMgYSBwYWdlIHRhYmxlIHBhZ2UuCisJCQkgKi8KKwkJCWlmICghcGRl X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg c3ZhKTsKKwkJCQlLQVNTRVJUKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKKwkJCQkgICAgKCJw bWFwX2FkdmlzZTogaW52YWxpZCBQVEUiKSk7CisJCQkJcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0 ZSwgc3ZhLCAqcGRlLCBOVUxMLAorCQkJCSAgICAmbG9jayk7CisJCQkJYW55Y2hhbmdlZCA9IFRS VUU7CisJCQl9CisJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJ CX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZh IHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8g dGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8K KwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2YV9uZXh0ID0gZXZhOworCisJCWZvciAocHRlID0g cG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAorCQkgICAg c3ZhICs9IFBBR0VfU0laRSkgeworCQkJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCAhcHRlX3Rl c3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQllbHNlIGlmIChwdGVfdGVz dChwdGUsIFBURV9EKSAmJgorCQkJICAgICFwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCQlp ZiAoYWR2aWNlID09IE1BRFZfRE9OVE5FRUQpIHsKKwkJCQkJLyoKKwkJCQkJICogRnV0dXJlIGNh bGxzIHRvIHBtYXBfaXNfbW9kaWZpZWQoKQorCQkJCQkgKiBjYW4gYmUgYXZvaWRlZCBieSBtYWtp bmcgdGhlIHBhZ2UKKwkJCQkJICogZGlydHkgbm93LgorCQkJCQkgKi8KKwkJCQkJbSA9IFBIWVNf VE9fVk1fUEFHRSgKKwkJCQkJICAgIFRMQkxPX1BURV9UT19QQSgqcHRlKSk7CisJCQkJCXZtX3Bh Z2VfZGlydHkobSk7CisJCQkJfQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCB8IFBU RV9SRUYpOworCQkJfSBlbHNlIGlmIChwdGVfaXNfcmVmKHB0ZSkpCisJCQkJcHRlX2F0b21pY19j bGVhcihwdGUsIFBURV9SRUYpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHB0ZV90 ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHN2YSk7CisJ CQllbHNlCisJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCX0KKwl9CisJaWYgKGFueWNoYW5nZWQp CisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkgewor CQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFwKTsK K30KKworLyoKKyAqCUNsZWFyIHRoZSBtb2RpZnkgYml0cyBvbiB0aGUgc3BlY2lmaWVkIHBoeXNp Y2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfY2xlYXJfbW9kaWZ5KHZtX3BhZ2VfdCBtKQorewor CXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcG1hcF90IHBtYXA7CisJcHZfZW50cnlfdCBuZXh0X3B2 LCBwdjsKKwlwZF9lbnRyeV90IG9sZHBkZSwgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwgKnB0 ZTsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhOworCWludCBtZF9nZW4s IHB2aF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAor CSAgICAoInBtYXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChtLT5vYmplY3QpOworCUtBU1NFUlQoIXZtX3BhZ2Vf eGJ1c2llZChtKSwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAlcCBpcyBleGNsdXNp dmUgYnVzaWVkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgUEdBX1dSSVRF QUJMRSwgdGhlbiBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKiBJZiB0aGUgb2JqZWN0 IGNvbnRhaW5pbmcgdGhlIHBhZ2UgaXMgbG9ja2VkIGFuZCB0aGUgcGFnZSBpcyBub3QKKwkgKiB3 cml0ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUgY29uY3VycmVudGx5IHNl dC4KKwkgKi8KKwlpZiAoKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJCXJldHVy bjsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwlyd19ybG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndf d2xvY2sobG9jayk7CityZXN0YXJ0OgorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAh PSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwdiwgJnB2 aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJ CWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJ CQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9j ayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBt YXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsKKwkJ cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQlvbGRwZGUgPSAqcGRlOworCQlpZiAoIXBkZV90 ZXN0KHBkZSwgUFRFX1JPKSkgeworCQkJaWYgKHBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwg cGRlLCB2YSwgJmxvY2spKSB7CisJCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykpIHsK KwkJCQkJLyoKKwkJCQkJICogV3JpdGUgcHJvdGVjdCB0aGUgbWFwcGluZyB0byBhCisJCQkJCSAq IHNpbmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkJCSAqIHdyaXRlIGFjY2VzcyBt YXkgcmVwcm9tb3RlLgorCQkJCQkgKi8KKwkJCQkJdmEgKz0gVk1fUEFHRV9UT19QSFlTKG0pIC0K KwkJCQkJICAgVExCTE9fUERFX1RPX1BBKG9sZHBkZSk7CisJCQkJCXB0ZSA9IHBtYXBfcGRlX3Rv X3B0ZShwZGUsIHZhKTsKKwkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQkJaWYgKCFwdGVfdGVzdCgm b2xkcHRlLCBQVEVfVkFMSUQpKSB7CisJCQkJCQl3aGlsZSAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsCisJCQkJCQkgICAgb2xkcHRlLAorCQkJCQkJICAgIChvbGRwdGUgJiB+UFRFX0QpIHwgUFRF X1JPKSkKKwkJCQkJCQlvbGRwdGUgPSAqcHRlOworCQkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJ CQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0K KwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CitzbWFsbF9tYXBwaW5nczoKKwlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChw dik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9n ZW47CisJCQlwdmhfZ2VuID0gcHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJ UE1BUF9MT0NLKHBtYXApOworCQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAobWRfZ2VuICE9IG0t Pm1kLnB2X2dlbiB8fCBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0so cG1hcCk7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQl9CisJCXBkZSA9IHBtYXBfcGRlKHBt YXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwgKCJwbWFw X2NsZWFyX21vZGlmeTogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw diBsaXN0IiwgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwor CQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewor CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl KHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXJ3X3d1 bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworLyoKKyAq IE1pc2NlbGxhbmVvdXMgc3VwcG9ydCByb3V0aW5lcyBmb2xsb3cKKyAqLworCisvKgorICogTWFw IGEgc2V0IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAor ICogYWRkcmVzcyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBtYXBwZWQu IFRoaXMKKyAqIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGluZyBkZXZp Y2UgbWVtb3J5LAorICogTk9UIHJlYWwgbWVtb3J5LgorICoKKyAqIFVzZSBYS1BIWVMgdW5jYWNo ZWQgZm9yIDY0IGJpdC4KKyAqLwordm9pZCAqCitwbWFwX21hcGRldih2bV9wYWRkcl90IHBhLCB2 bV9zaXplX3Qgc2l6ZSkKK3sKKworCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fRElSRUNU X1VOQ0FDSEVEKHBhKSk7Cit9CisKK3ZvaWQKK3BtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QgdmEs IHZtX3NpemVfdCBzaXplKQoreworCisJLyogTm90aGluZyB0byBkbyBmb3IgbWlwczY0LiAqLwor fQorCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw YWdlLgorICovCit2b2lkCitwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l bWF0dHJfdCBtYSkKK3sKKwkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBw cm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBwaW5ncyBhcmUgY3Jl YXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgorCSAqIEl0IGlzIGFz c3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGJlZm9yZSBhbnkgbWFwcGlu Z3MKKwkgKiBhcmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRo aXMgZnVuY3Rpb24gd2lsbAorCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZfbGlzdCBhbmQgbWFrZSBl YWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncworCSAqIHVuY2FjaGVhYmxlLCBzeW5jIHRoZSBj YWNoZSAod2l0aCBtaXBzX2ljYWNoZV9zeW5jX2FsbCgpIGFuZAorCSAqIG1pcHNfZGNhY2hlX3di aW52X2FsbCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkg KiBhbnkgb2YgdGhlIGN1cnJlbnQgbWFwcGluZ3MgaXQgbW9kaWZpZXMuCisJICovCisJaWYgKFRB SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQlwYW5pYygiQ2FuJ3QgY2hhbmdl IG1lbWF0dHIgb24gcGFnZSB3aXRoIGV4aXN0aW5nIG1hcHBpbmdzIik7Cit9CisKKy8qCisgKiBw ZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKKyAqLworaW50CitwbWFwX21pbmNvcmUo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3BhZGRyX3QgKmxvY2tlZF9wYSkKK3sK KwlwZF9lbnRyeV90ICpwZGVwOworCXB0X2VudHJ5X3QgKnB0ZXAsIHB0ZTsKKwl2bV9wYWRkcl90 IHBhOworCWludCB2YWw7CisKKwlQTUFQX0xPQ0socG1hcCk7CityZXRyeToKKwlwZGVwID0gcG1h cF9wZGUocG1hcCwgYWRkcik7CisJaWYgKHBkZXAgIT0gTlVMTCkgeworCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGVwKSkgeworCQkJcHRlID0gKHB0X2VudHJ5X3QpKnBkZXA7CisJCQlwYSA9 IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gTUlOQ09SRV9TVVBFUjsKKwkJfSBlbHNl IHsKKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgYWRkcik7CisJCQlwdGUgPSAocHRl cCAhPSBOVUxMKSA/ICpwdGVwIDogMDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJ CQl2YWwgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJcHRlID0gMDsKKwkJcGEgPSAwOworCQl2YWwg PSAwOworCX0KKwlpZiAocHRlX2lzX3ZhbGlkKCZwdGUpKSB7CisJCXZhbCB8PSBNSU5DT1JFX0lO Q09SRTsKKwkJaWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSkKKwkJCXZhbCB8PSBNSU5DT1JFX01P RElGSUVEIHwgTUlOQ09SRV9NT0RJRklFRF9PVEhFUjsKKwkJaWYgKHB0ZV9pc19yZWYoJnB0ZSkp CisJCQl2YWwgfD0gTUlOQ09SRV9SRUZFUkVOQ0VEIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVS OworCX0KKwlpZiAoKHZhbCAmIChNSU5DT1JFX01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZF UkVOQ0VEX09USEVSKSkgIT0KKwkgICAgKE1JTkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JF X1JFRkVSRU5DRURfT1RIRVIpICYmCisJICAgIHB0ZV90ZXN0KCZwdGUsIFBURV9NQU5BR0VEKSkg eworCQkvKiBFbnN1cmUgdGhhdCAiUEhZU19UT19WTV9QQUdFKHBhKS0+b2JqZWN0IiBkb2Vzbid0 IGNoYW5nZS4gKi8KKwkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHBhLCBsb2NrZWRf cGEpKQorCQkJZ290byByZXRyeTsKKwl9IGVsc2UKKwkJUEFfVU5MT0NLX0NPTkQoKmxvY2tlZF9w YSk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICh2YWwpOworfQorCit2b2lkCitwbWFw X2FjdGl2YXRlKHN0cnVjdCB0aHJlYWQgKnRkKQoreworCXBtYXBfdCBwbWFwLCBvbGRwbWFwOwor CXN0cnVjdCBwcm9jICpwID0gdGQtPnRkX3Byb2M7CisJdV9pbnQgY3B1aWQ7CisKKwljcml0aWNh bF9lbnRlcigpOworCisJcG1hcCA9IHZtc3BhY2VfcG1hcChwLT5wX3Ztc3BhY2UpOworCW9sZHBt YXAgPSBQQ1BVX0dFVChjdXJwbWFwKTsKKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKworCWlm IChvbGRwbWFwKQorCQlDUFVfQ0xSX0FUT01JQyhjcHVpZCwgJm9sZHBtYXAtPnBtX2FjdGl2ZSk7 CisJQ1BVX1NFVF9BVE9NSUMoY3B1aWQsICZwbWFwLT5wbV9hY3RpdmUpOworCXBtYXBfYXNpZF9h bGxvYyhwbWFwKTsKKwlpZiAodGQgPT0gY3VydGhyZWFkKSB7CisJCVBDUFVfU0VUKHNlZ2Jhc2Us IHBtYXAtPnBtX3NlZ3RhYik7CisJCW1pcHNfd3JfZW50cnloaShwbWFwLT5wbV9hc2lkW2NwdWlk XS5hc2lkKTsKKwl9CisKKwlQQ1BVX1NFVChjdXJwbWFwLCBwbWFwKTsKKwljcml0aWNhbF9leGl0 KCk7Cit9CisKK3ZvaWQKK3BtYXBfc3luY19pY2FjaGUocG1hcF90IHBtLCB2bV9vZmZzZXRfdCB2 YSwgdm1fc2l6ZV90IHN6KQoreworfQorCisvKgorICoJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZp cnR1YWwgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gbWFwcGluZyBpZiBhCisgKglkaWZmZXJlbnQgYWxp Z25tZW50IG1pZ2h0IHJlc3VsdCBpbiBtb3JlIHN1cGVycGFnZSBtYXBwaW5ncy4KKyAqLwordm9p ZAorcG1hcF9hbGlnbl9zdXBlcnBhZ2Uodm1fb2JqZWN0X3Qgb2JqZWN0LCB2bV9vb2Zmc2V0X3Qg b2Zmc2V0LAorICAgIHZtX29mZnNldF90ICphZGRyLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKwl2bV9v ZmZzZXRfdCBzdXBlcnBhZ2Vfb2Zmc2V0OworCisJaWYgKHNpemUgPCBOQlNFRykKKwkJcmV0dXJu OworCWlmIChvYmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAmIE9CSl9DT0xPUkVEKSAh PSAwKQorCQlvZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsKKwlzdXBlcnBhZ2Vfb2Zm c2V0ID0gb2Zmc2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vf b2Zmc2V0KSAmIFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0g c3VwZXJwYWdlX29mZnNldCkKKwkJcmV0dXJuOworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1 cGVycGFnZV9vZmZzZXQpCisJCSphZGRyID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdl X29mZnNldDsKKwllbHNlCisJCSphZGRyID0gKCgqYWRkciArIFNFR01BU0spICYgflNFR01BU0sp ICsgc3VwZXJwYWdlX29mZnNldDsKK30KKworI2lmZGVmIEREQgorREJfU0hPV19DT01NQU5EKHB0 YWJsZSwgZGRiX3BpZF9kdW1wKQoreworCXBtYXBfdCBwbWFwOworCXN0cnVjdCB0aHJlYWQgKnRk ID0gTlVMTDsKKwlzdHJ1Y3QgcHJvYyAqcDsKKwlpbnQgaSwgaiwgazsKKwl2bV9wYWRkcl90IHBh OworCXZtX29mZnNldF90IHZhOworCisJaWYgKGhhdmVfYWRkcikgeworCQl0ZCA9IGRiX2xvb2t1 cF90aHJlYWQoYWRkciwgVFJVRSk7CisJCWlmICh0ZCA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYo IkludmFsaWQgcGlkIG9yIHRpZCIpOworCQkJcmV0dXJuOworCQl9CisJCXAgPSB0ZC0+dGRfcHJv YzsKKwkJaWYgKHAtPnBfdm1zcGFjZSA9PSBOVUxMKSB7CisJCQlkYl9wcmludGYoIk5vIHZtc3Bh Y2UgZm9yIHByb2Nlc3MiKTsKKwkJCXJldHVybjsKKwkJfQorCQkJcG1hcCA9IHZtc3BhY2VfcG1h cChwLT5wX3Ztc3BhY2UpOworCX0gZWxzZQorCQlwbWFwID0ga2VybmVsX3BtYXA7CisKKwlkYl9w cmludGYoInBtYXA6JXAgc2VndGFiOiVwIGFzaWQ6JXggZ2VuZXJhdGlvbjoleFxuIiwKKwkgICAg cG1hcCwgcG1hcC0+cG1fc2VndGFiLCBwbWFwLT5wbV9hc2lkWzBdLmFzaWQsCisJICAgIHBtYXAt PnBtX2FzaWRbMF0uZ2VuKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRf ZW50cnlfdCAqcGRwZTsKKwkJcHRfZW50cnlfdCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKKwor CQlwZHBlID0gKHBkX2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09 IE5VTEwpCisJCQljb250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7 CisJCWZvciAoaiA9IDA7IGogPCBOUERFUEc7IGorKykgeworCQkJcGRlID0gKHB0X2VudHJ5X3Qg KilwZHBlW2pdOworCQkJaWYgKHBkZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGJfcHJp bnRmKCJcdFslNGRdICVwXG4iLCBqLCBwZGUpOworCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsg aysrKSB7CisJCQkJcHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX2lzX3Zh bGlkKCZwdGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUp OworCQkJCXZhID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAo ayA8PCBQQUdFX1NISUZUKTsKKwkJCQlkYl9wcmludGYoIlx0XHRbJTA0ZF0gdmE6ICVwIHB0ZTog JThqeCBwYTolanhcbiIsCisJCQkJICAgICAgIGssICh2b2lkICopdmEsICh1aW50bWF4X3QpcHRl LCAodWludG1heF90KXBhKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZgorCisjaWYgZGVmaW5l ZChERUJVRykKKworc3RhdGljIHZvaWQgcGFkcyhwbWFwX3QgcG0pOwordm9pZCBwbWFwX3B2ZHVt cCh2bV9vZmZzZXRfdCBwYSk7CisKKy8qIHByaW50IGFkZHJlc3Mgc3BhY2Ugb2YgcG1hcCovCitz dGF0aWMgdm9pZAorcGFkcyhwbWFwX3QgcG0pCit7CisJdW5zaWduZWQgdmEsIGksIGo7CisJcHRf ZW50cnlfdCAqcHRlcDsKKworCWlmIChwbSA9PSBrZXJuZWxfcG1hcCkKKwkJcmV0dXJuOworCWZv ciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJaWYgKHBtLT5wbV9zZWd0YWJbaV0pCisJCQlm b3IgKGogPSAwOyBqIDwgTlBURVBHOyBqKyspIHsKKwkJCQl2YSA9IChpIDw8IFNFR1NISUZUKSAr IChqIDw8IFBBR0VfU0hJRlQpOworCQkJCWlmIChwbSA9PSBrZXJuZWxfcG1hcCAmJiB2YSA8IEtF Uk5CQVNFKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG0gIT0ga2VybmVsX3BtYXAgJiYKKwkJ CQkgICAgdmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGVw ID0gcG1hcF9wdGUocG0sIHZhKTsKKwkJCQlpZiAocHRlX2lzX3ZhbGlkKHB0ZXApKQorCQkJCQlw cmludGYoIiV4OiV4ICIsIHZhLCAqKGludCAqKXB0ZXApOworCQkJfQorCit9CisKK3ZvaWQKK3Bt YXBfcHZkdW1wKHZtX29mZnNldF90IHBhKQoreworCXJlZ2lzdGVyIHB2X2VudHJ5X3QgcHY7CisJ dm1fcGFnZV90IG07CisKKwlwcmludGYoInBhICV4IiwgcGEpOworCW0gPSBQSFlTX1RPX1ZNX1BB R0UocGEpOworCWZvciAocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OworCSAg ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCXByaW50ZigiIC0+IHBtYXAgJXAs IHZhICV4IiwgKHZvaWQgKilwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsKKwkJcGFkcyhwdi0+cHZf cG1hcCk7CisJfQorCXByaW50ZigiICIpOworfQorCisvKiBOL0MgKi8KKyNlbmRpZgorCisKKy8q CisgKiBBbGxvY2F0ZSBUTEIgYWRkcmVzcyBzcGFjZSB0YWcgKGNhbGxlZCBBU0lEIG9yIFRMQlBJ RCkgYW5kIHJldHVybiBpdC4KKyAqIEl0IHRha2VzIGFsbW9zdCBhcyBtdWNoIG9yIG1vcmUgdGlt ZSB0byBzZWFyY2ggdGhlIFRMQiBmb3IgYQorICogc3BlY2lmaWMgQVNJRCBhbmQgZmx1c2ggdGhv c2UgZW50cmllcyBhcyBpdCBkb2VzIHRvIGZsdXNoIHRoZSBlbnRpcmUgVExCLgorICogVGhlcmVm b3JlLCB3aGVuIHdlIGFsbG9jYXRlIGEgbmV3IEFTSUQsIHdlIGp1c3QgdGFrZSB0aGUgbmV4dCBu dW1iZXIuIFdoZW4KKyAqIHdlIHJ1biBvdXQgb2YgbnVtYmVycywgd2UgZmx1c2ggdGhlIFRMQiwg aW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGNvdW50CisgKiBhbmQgc3RhcnQgb3Zlci4gQVNJRCB6 ZXJvIGlzIHJlc2VydmVkIGZvciBrZXJuZWwgdXNlLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9h c2lkX2FsbG9jKHBtYXApCisJcG1hcF90IHBtYXA7Cit7CisJaWYgKHBtYXAtPnBtX2FzaWRbUENQ VV9HRVQoY3B1aWQpXS5hc2lkICE9IFBNQVBfQVNJRF9SRVNFUlZFRCAmJgorCSAgICBwbWFwLT5w bV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID09IFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikp OworCWVsc2UgeworCQlpZiAoUENQVV9HRVQobmV4dF9hc2lkKSA9PSBwbWFwX21heF9hc2lkKSB7 CisJCQl0bGJfaW52YWxpZGF0ZV9hbGxfdXNlcihOVUxMKTsKKwkJCVBDUFVfU0VUKGFzaWRfZ2Vu ZXJhdGlvbiwKKwkJCSAgICAoUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSArIDEpICYgQVNJREdF Tl9NQVNLKTsKKwkJCWlmIChQQ1BVX0dFVChhc2lkX2dlbmVyYXRpb24pID09IDApIHsKKwkJCQlQ Q1BVX1NFVChhc2lkX2dlbmVyYXRpb24sIDEpOworCQkJfQorCQkJUENQVV9TRVQobmV4dF9hc2lk LCAxKTsJLyogMCBtZWFucyBpbnZhbGlkICovCisJCX0KKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dF VChjcHVpZCldLmFzaWQgPSBQQ1BVX0dFVChuZXh0X2FzaWQpOworCQlwbWFwLT5wbV9hc2lkW1BD UFVfR0VUKGNwdWlkKV0uZ2VuID0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKTsKKwkJUENQVV9T RVQobmV4dF9hc2lkLCBQQ1BVX0dFVChuZXh0X2FzaWQpICsgMSk7CisJfQorfQorCitzdGF0aWMg cHRfZW50cnlfdAoraW5pdF9wdGVfcHJvdCh2bV9wYWdlX3QgbSwgdm1fcHJvdF90IGFjY2Vzcywg dm1fcHJvdF90IHByb3QpCit7CisJcHRfZW50cnlfdCBydzsKKworCWlmICghKHByb3QgJiBWTV9Q Uk9UX1dSSVRFKSkKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CisJZWxzZSBpZiAoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKwkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dS SVRFKSAhPSAwKQorCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJZWxzZQorCQkJcncgPSBQ VEVfVkFMSUQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTmVlZG4ndCBlbXVsYXRlIGEgcmVmZXJl bmNlL21vZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkCisJCSAqIHBhZ2VzLgorCQkgKi8KKwkJcncg PSBQVEVfVkFMSUQgfCBQVEVfRDsKKwkJcHRlX3JlZl9zZXQoJnJ3KTsKKwl9CisKKwlyZXR1cm4g KHJ3KTsKK30KKworLyoKKyAqIHBtYXBfZW11bGF0ZV9tb2RpZmllZCA6IGRvIGRpcnR5IGJpdCBl bXVsYXRpb24KKyAqCisgKiBPbiBTTVAsIHVwZGF0ZSBqdXN0IHRoZSBsb2NhbCBUTEIsIG90aGVy IENQVXMgd2lsbCB1cGRhdGUgdGhlaXIKKyAqIFRMQnMgZnJvbSBQVEUgbGF6aWx5LCBpZiB0aGV5 IGdldCB0aGUgZXhjZXB0aW9uLgorICogUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjZXNzLCAxIGlm IHRoZSBwYWdlIGlzIHJlYWQgb25seSBhbmQgd2UKKyAqIG5lZWQgdG8gZmF1bHQuCisgKi8KK2lu dAorcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sK KwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJUE1BUF9MT0NLKHBtYXAp OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShw ZGUpKQorCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwllbHNlCisJCXB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRlID09IE5VTEwpCisJCXBhbmljKCJwbWFwX2VtdWxh dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CisjaWZkZWYgU01QCisJLyogSXQgaXMgcG9z c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCisJaWYgKCFwdGVfaXNf dmFsaWQocHRlKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAs IHZhLCAqcHRlKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2Vs c2UKKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CisJ CXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0 dXJuICgwKTsKKwl9CisjZW5kaWYKKwlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCVBN QVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDEpOworCX0KKwlwdGVfYXRvbWljX3NldChwdGUs IFBURV9EKTsgLyogbWFyayBpdCByZWZlcmVuY2VkIGFuZCBtb2RpZmllZCAqLworCXB0ZV9yZWZf YXRvbWljX3NldChwdGUpOworCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCWlmICghcHRl X3Rlc3QocHRlLCBQVEVfTUFOQUdFRCkpCisJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6 IHVubWFuYWdlZCBwYWdlIik7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgwKTsKK30K KworLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkOiBkbyByZWZlcmVuY2UgYml0IGVtdWxh dGlvbgorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuICBSZXR1cm5zIDEgaWYg d2UgbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFw X3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5 X3QgKnB0ZTsKKworCWlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKwkJcmV0dXJuICgxKTsKKwlQ TUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGUgPT0g TlVMTCB8fCAqcGRlID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIGRpcmVjdG9yeS4gKi8K KwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJ CXB0ZSA9IChwdF9lbnRyeV90ICopcGRlOworCX0gZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19w dGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBOVUxMKSB7CisJCS8qIEludmFsaWQgcGFnZSB0YWJs ZS4gKi8KKwkJZ290byBkb2ZhdWx0OworCX0KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpKSB7CisJ CS8qIEludmFsaWQgUFRFLiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQorCS8qIENoZWNrIHRvIHNl ZSBpZiBhbHJlYWR5IG1hcmtlZCBieSBvdGhlciBDUFUuICAqLworCWlmICghcHRlX2lzX3JlZihw dGUpKQorCQlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKworCXRsYl91cGRhdGUocG1hcCwgdmEs ICpwdGUpOworCVBNQVBfVU5MT0NLKHBtYXApOworCisJcmV0dXJuICgwKTsKKworZG9mYXVsdDoK KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitwbWFwX2ZsdXNo X3B2Y2FjaGUodm1fcGFnZV90IG0pCit7CisJcHZfZW50cnlfdCBwdjsKKworCWlmIChtICE9IE5V TEwpIHsKKwkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJCSAg ICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25leHQpKSB7CisJCQltaXBzX2RjYWNoZV93Ymludl9y YW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQg YS9zeXMvbWlwcy9taXBzL3BtYXAuYyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCi0tLSBhL3N5cy9t aXBzL21pcHMvcG1hcC5jCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcC5jCkBAIC0yMzIsNyArMjMy LDcgQEAKIAlzeXNtID0gJnN5c21hcF9sbWVtW2NwdV07CiAJc3lzbS0+c2F2ZWRfaW50ciA9IGlu dHI7CiAJdmEgPSBzeXNtLT5iYXNlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQ VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f UEZOKHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJKnB0ZSA9IG5wdGU7CiAJc3lzbS0+dmFs aWQxID0gMTsKQEAgLTI1NCwxMCArMjU0LDEwIEBACiAJc3lzbS0+c2F2ZWRfaW50ciA9IGludHI7 CiAJdmExID0gc3lzbS0+YmFzZTsKIAl2YTIgPSBzeXNtLT5iYXNlICsgUEFHRV9TSVpFOwotCW5w dGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9W IHwgUFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19DQUNIRSB8 IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhMSk7CiAJKnB0ZSA9IG5wdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMikgfCBQ VEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9f UEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlw dGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEyKTsKIAkqcHRlID0gbnB0ZTsKIAlzeXNtLT52 YWxpZDEgPSAxOwpAQCAtNTU2LDkgKzU1NiwxNSBAQAogCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNn YnVmc2l6ZSk7CiAKIAkvKgotCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLgorCSAqIFN0ZWFsIHRo cmVhZDAga3N0YWNrLiAgVGhpcyBtdXN0IGJlIGFsaWduZWQgdG8KKwkgKiAoS1NUQUNLX1BBR0Vf U0laRSAqIDIpIHNvIGl0IGNhbiBtYXBwZWQgdG8gYSBzaW5nbGUgVExCIGVudHJ5LgorCSAqCisJ ICogWFhYIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgb2YgZ2V0dGluZyBhbGlnbmVkIG1l bW9yeQorCSAqIHdpdGggcG1hcF9zdGVhbF9tZW1vcnkoKS4KIAkgKi8KLQlrc3RhY2swID0gcG1h cF9zdGVhbF9tZW1vcnkoS1NUQUNLX1BBR0VTIDw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSBw bWFwX3N0ZWFsX21lbW9yeSgoS1NUQUNLX1BBR0VTICsgS1NUQUNLX0dVQVJEX1BBR0VTKSBcCisJ CQkJCTw8IFBBR0VfU0hJRlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNL X1BBR0VfU0laRSAqIDIpKTsKIAogCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJF U1M7CiAJdmlydHVhbF9lbmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CkBAIC02MDUsNiArNjEx LDcgQEAKIAogCVRBSUxRX0lOSVQoJm0tPm1kLnB2X2xpc3QpOwogCW0tPm1kLnB2X2ZsYWdzID0g MDsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOwogfQogCiAvKgpAQCAt ODAxLDcgKzgwOCw3IEBACiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKIAlpZiAocHRlcCAh PSBOVUxMKSB7CiAJCXB0ZSA9ICpwdGVwOwotCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1YpICYm ICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAorCQlpZiAocHRlX3Rlc3QoJnB0ZSwgUFRFX1ZB TElEKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKIAkJICAgIChwcm90ICYgVk1fUFJP VF9XUklURSkgPT0gMCkpIHsKIAkJCXB0ZV9wYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJ aWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwgJnBhKSkKQEAgLTgzNCw5ICs4 NDEsOSBAQAogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAlvcHRlID0gKnB0 ZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IGF0dHIgfCBQVEVfRCB8IFBURV9WIHwg UFRFX0c7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf VkFMSUQgfCBQVEVfRzsKIAkqcHRlID0gbnB0ZTsKLQlpZiAocHRlX3Rlc3QoJm9wdGUsIFBURV9W KSAmJiBvcHRlICE9IG5wdGUpCisJaWYgKHB0ZV90ZXN0KCZvcHRlLCBQVEVfVkFMSUQpICYmIG9w dGUgIT0gbnB0ZSkKIAkJcG1hcF91cGRhdGVfcGFnZShrZXJuZWxfcG1hcCwgdmEsIG5wdGUpOwog fQogCkBAIC0xNDQ5LDcgKzE0NTYsNyBAQAogCQkJCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RB QkxFX1JFRikKIAkJCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOwogCQkJ CW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9SRUY7Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5t ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0 LCBwdiwgcHZfbmV4dCk7CiAJCQkJaWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJ CQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwYy0+cGNfbWFw W2ZpZWxkXSB8PSAxVUwgPDwgYml0OwpAQCAtMTYyNyw5ICsxNjM0LDkgQEAKIAlwdl9lbnRyeV90 IHB2OwogCiAJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxR X0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2 LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCWlmIChwbWFwID09IFBWX1BNQVAocHYpICYm IHZhID09IHB2LT5wdl92YSkgewotCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBw dl9saXN0KTsKKwkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJ CQlicmVhazsKIAkJfQogCX0KQEAgLTE2NzEsNyArMTY3OCw3IEBACiAJUE1BUF9MT0NLX0FTU0VS VChwbWFwLCBNQV9PV05FRCk7CiAJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBUUlVFKSkg IT0gTlVMTCkgewogCQlwdi0+cHZfdmEgPSB2YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1k LnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xp c3QsIHB2LCBwdl9uZXh0KTsKIAkJcmV0dXJuIChUUlVFKTsKIAl9IGVsc2UKIAkJcmV0dXJuIChG QUxTRSk7CkBAIC0xNzQ0LDcgKzE3NTEsNyBAQAogCS8qCiAJICogSWYgdGhlcmUgaXMgbm8gcHRl IGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKIAkgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0 cSwgUFRFX1YpKQorCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVkFMSUQpKQogCQlyZXR1cm47CiAK IAkodm9pZClwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRxLCB2YSwgKnBkZSk7CkBAIC0xODEwLDcg KzE4MTcsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0la RSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkgeworCQkJaWYgKCFwdGVfdGVzdChw dGUsIFBURV9WQUxJRCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2lu dmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTE4 NjgsNyArMTg3NSw3IEBACiAJCSAqIElmIGl0J3MgbGFzdCBtYXBwaW5nIHdyaXRlYmFjayBhbGwg Y2FjaGVzIGZyb20gCiAJCSAqIHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAogCSAJICovCi0JCWlm IChUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSA9PSBOVUxMKQorCQlpZiAoVEFJTFFfTkVYVChwdiwg cHZfbmV4dCkgPT0gTlVMTCkKIAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5w dl92YSwgUEFHRV9TSVpFKTsKIAogCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwpA QCAtMTg5Nyw3ICsxOTA0LDcgQEAKIAkJfQogCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBw di0+cHZfdmEpOwogCi0JCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3Qp OworCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJcG1hcF91 bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwogCQlmcmVlX3B2X2VudHJ5KHBtYXAsIHB2 KTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CkBAIC0xOTU5LDcgKzE5NjYsNyBAQAogCQlmb3IgKHB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKIAkJCXBiaXRzID0gKnB0ZTsKLQkJCWlmICghcHRlX3Rl c3QoJnBiaXRzLCBQVEVfVikgfHwgcHRlX3Rlc3QoJnBiaXRzLAorCQkJaWYgKCFwdGVfdGVzdCgm cGJpdHMsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QoJnBiaXRzLAogCQkJICAgIFBURV9STykpIHsK IAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1h cCwgdmEsIHN2YSk7CkBAIC0yMDcxLDcgKzIwNzgsNyBAQAogCS8qCiAJICogTWFwcGluZyBoYXMg bm90IGNoYW5nZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgogCSAqLwot CWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpICYmIG9wYSA9PSBwYSkgeworCWlmIChwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX1ZBTElEKSAmJiBvcGEgPT0gcGEpIHsKIAkJLyoKIAkJICogV2ly aW5nIGNoYW5nZSwganVzdCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CiAJCSAq IHdpcmluZyBQVCBwYWdlcyBhcyB0aGV5IHJlbWFpbiByZXNpZGVudCBhcyBsb25nIGFzIHRoZXJl CkBAIC0yMTM1LDcgKzIxNDIsNyBAQAogCQlpZiAocHYgPT0gTlVMTCkKIAkJCXB2ID0gZ2V0X3B2 X2VudHJ5KHBtYXAsIEZBTFNFKTsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCW5ld3B0ZSB8PSBQVEVfTUFOQUdFRDsKIAkJ aWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfUk8pKQogCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwg UEdBX1dSSVRFQUJMRSk7CkBAIC0yMTYwLDcgKzIxNjcsNyBAQAogCSAqLwogCWlmIChvcmlncHRl ICE9IG5ld3B0ZSkgewogCQkqcHRlID0gbmV3cHRlOwotCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUs IFBURV9WKSkgeworCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkpIHsKIAkJCWlm IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpICYmIG9wYSAhPSBwYSkgewogCQkJCWlm IChvbS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0 KG9tLCBQR0FfUkVGRVJFTkNFRCk7CkBAIC0yMjY4LDcgKzIyNzUsNyBAQAogCX0KIAogCXB0ZSA9 IHBtYXBfcHRlKHBtYXAsIHZhKTsKLQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwlpZiAo cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCWlmIChtcHRlICE9IE5VTEwpIHsKIAkJCW1w dGUtPndpcmVfY291bnQtLTsKIAkJCW1wdGUgPSBOVUxMOwpAQCAtMjI5OCw3ICsyMzA1LDcgQEAK IAkvKgogCSAqIE5vdyB2YWxpZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlvbgogCSAqLwot CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1Y7CisJKnB0ZSA9IFBU RV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBQVEVfVkFMSUQ7CiAJaWYgKChtLT5vZmxhZ3Mg JiBWUE9fVU5NQU5BR0VEKSA9PSAwKQogCQkqcHRlIHw9IFBURV9NQU5BR0VEOwogCkBAIC0yMzU2 LDcgKzIzNjMsNyBAQAogCQljcHUgPSBQQ1BVX0dFVChjcHVpZCk7CiAJCXN5c20gPSAmc3lzbWFw X2xtZW1bY3B1XTsKIAkJLyogU2luY2UgdGhpcyBpcyBmb3IgdGhlIGRlYnVnZ2VyLCBubyBsb2Nr cyBvciBhbnkgb3RoZXIgZnVuICovCi0JCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRF X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwKKwkJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkg fCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwKIAkJICAgIFBURV9HOwogCQlwdGUg PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CiAJCSpwdGUgPSBucHRlOwpAQCAt MjQ4NCw3ICsyNDkxLDcgQEAKIAkJCXZhX25leHQgPSBldmE7CiAJCWZvciAocHRlID0gcG1hcF9w ZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9 IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCWlmICghcHRl X3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFwdGVfdGVzdChw dGUsIFBURV9XKSkKIAkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1pc3Npbmcg UEdfVyIsCkBAIC0yNzE5LDcgKzI3MjYsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNfcXVp Y2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193bG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg cHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7 CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVhazsK QEAgLTI3MzMsNiArMjc0MCwxNiBAQAogfQogCiAvKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBn aXZlbiBwYWdlIGlzIG1hcHBlZC4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfaXNfbWFwcGVk KHZtX3BhZ2VfdCBtKQoreworCisJCXJldHVybiAoIVRBSUxRX0VNUFRZKCYobSktPm1kLnB2X2xp c3QpKTsKK30KKworLyoKICAqIFJlbW92ZSBhbGwgcGFnZXMgZnJvbSBzcGVjaWZpZWQgYWRkcmVz cyBzcGFjZQogICogdGhpcyBhaWRzIHByb2Nlc3MgZXhpdCBzcGVlZHMuICBBbHNvLCB0aGlzIGNv ZGUKICAqIGlzIHNwZWNpYWwgY2FzZWQgZm9yIGN1cnJlbnQgcHJvY2VzcyBvbmx5LCBidXQKQEAg LTI3NzIsNyArMjc4OSw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRlICE9IDAs CiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBwbWFwX3Bk ZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikp CisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJwbWFwX3Jl bW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAyLDcgKzI4 MTksNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVsZF0gfD0g Yml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJCVRBSUxR X1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgm bS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQu cHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJ CQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3ICsyODUw LDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFf V0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsK KwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlwbWFwID0g UFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUocG1hcCwg cHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg4MCw3IEBACiAJaWYgKChtLT5vZmxhZ3MgJiBWUE9f VU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgewor CVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQ Vl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBw di0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkxNCwxMSBAQAogCWlmICghdm1fcGFnZV94YnVzaWVk KG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJcndf d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4 dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVf dGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVzdChwdGUs IFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikpOwogCQlw Yml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAtMzA0MCw3 ICszMDU3LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0 ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQQUdFX1NJ WkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkgeworCQkJ aWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2 YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3Zh KTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTIzLDcgQEAKIAlpZiAoKG0tPmFm bGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2ds b2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkg eworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAg PSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFw LCBwdi0+cHZfdmEpOwpAQCAtMzE5NCw2ICszMjExLDMxIEBACiB9CiAKIC8qCisgKiBTZXRzIHRo ZSBtZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3Bt YXBfcGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCisJ CS8qCisJCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVsZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBh cmUgc2V0IGluIHRoZQorCQkgKiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJCSAqLwor CQltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0 IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCQkgKiBh cmUgZXN0YWJsaXNoZWQuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuIHRoaXMgZnVuY3Rp b24gd2lsbAorCQkgKiBuZWVkIHRvIHdhbGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0 aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3 aXRoIG1pcHNfaWNhY2hlX3N5bmNfYWxsKCkgYW5kCisJCSAqIG1pcHNfZGNhY2hlX3diaW52X2Fs bCgpKSBhbmQgbW9zdCBsaWtlbHkgaW52YWxpZGF0ZSBUTEIgZW50cmllcyBmb3IKKwkJICogYW55 IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0IG1vZGlmaWVzLgorCQkgKi8KKwkJaWYgKFRBSUxR X0ZJUlNUKCZtLT5tZC5wdl9saXN0KSAhPSBOVUxMKQorCQkJCXBhbmljKCJDYW4ndCBjaGFuZ2Ug bWVtYXR0ciBvbiBwYWdlIHdpdGggZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKICAqIHBl cmZvcm0gdGhlIHBtYXAgd29yayBmb3IgbWluY29yZQogICovCiBpbnQKQEAgLTMyMDgsNyArMzI1 MCw3IEBACiByZXRyeToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0 ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsK KwlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBv dXQ7CiAJfQpAQCAtMzM0NSw3ICszMzg3LDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8 IE5QVEVQRzsgaysrKSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAh cHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0 ZSwgUFRFX1ZBTElEKSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKIAkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQp IHwgKGsgPDwgUEFHRV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDM1LDE1IEBACiAJcHRfZW50cnlf dCBydzsKIAogCWlmICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBU RV9STzsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAm IFZQT19VTk1BTkFHRUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAh PSAwKQotCQkJcncgPSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsK IAkJZWxzZQotCQkJcncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkv KiBOZWVkbid0IGVtdWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8K LQkJcncgPSBQVEVfViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVy biAocncpOwogfQogCkBAIC0zNDI0LDEzICszNDY2LDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxh dGVfbW9kaWZpZWQ6IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9z c2libGUgdGhhdCBzb21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVz dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3Qo cHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUo cG1hcCwgdmEsICpwdGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9 CiAjZWxzZQotCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpCisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpCiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5k aWYKIAlpZiAocHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0ODgsMTggQEAK IH0KIAogLyoKKyAqIHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJp dCBlbXVsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24u CisgKi8KK2ludAorcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhKQoreworCisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tl eHRyYWN0CiAgKglGdW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJl c3MgYXNzb2NpYXRlZApAQCAtMzUyMiw3ICszNTc2LDcgQEAKIAogCWlmIChtICE9IE5VTEwpIHsK IAkJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9 IFRBSUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2 X25leHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBB R0VfU0laRSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21h Y2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBz L21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFj aGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAs IHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVqeCBpcyBOVUxMIiwgKHVp bnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspIHsKLQkJCWlmIChw dGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNfdmFsaWQoJnB0ZVtpXSkp IHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJCWlmIChpc19kdW1wYWJs ZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBz L21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpAQCAtMjgzLDkgKzI4Myw5 IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFkMCk7CiAKLQlLQVNTRVJU KChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQg b24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3RhY2swKSk7CisJS0FTU0VS VCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkpID09IDAsCisJCSgia3N0 YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91bmRhcnk6IDB4JTBseCIs CisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtzdGFjazApKTsKIAl0aHJl YWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3RhY2tfcGFnZXMgPSBLU1RB Q0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBXZSB1c2UgYSB3aXJlZCB0 bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAqLwogCXBhID0gdnRvcGh5 cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKKwlw dGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOwog CXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZzZXRfdClwY3B1cCwKIAkJ CSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSArIFBB R0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jIGIv c3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwor KysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsxMDIsOSBAQAogQVNTWU0o VERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1BWENPTUxFTiwgTUFYQ09N TEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQpOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBLU1RBQ0tfVExCTUFTS19N QVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBNSVBTX0tTRUcwX1NUQVJU KTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RBUlQpOwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK LS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMvbWlwcy9taXBzL2V4Y2Vw dGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlOVFJDTlRfQ09VTlQJMjU2 CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNlcHRpb25zOgorICoKKyAq IEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCBm YXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gd2FzIGluIGEgYnJhbmNo IGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBvaW50IHRvIHRoZSBicmFu Y2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbi4KKyAqCisgKiBUaGUg Y2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gYW5k IHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgorICogVGhlIHN0YXR1cyBy ZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBDUFUg c3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1cHQgZW5hYmxlIGJpdC4K KyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhlIHZpcnR1YWwgYWRkcmVz cyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgorICogVGhlIENvbnRleHQg cmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhlIFZQTiAoc3RhcnRpbmcg YXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlvbiBleGNlcHQgYml0MCBh bmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRzIDIzIHRvIDMxIGZvciBN SVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAqIGtlcm5lbCBjb250cm9s IChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRleHQvWENvbnRleHQKKyAq IHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVCU0QuCisgKi8KIAogLyoK ICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcgQEAKIC8qCiAgKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisgKiBNaXBzRG9UTEJNaXNz IC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwgVExCIE1pc3MgSGFuZGxl ciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuICBBIG1p c3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRvIGt1c2VnIGFuZCB0aGVy ZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhlIFRMQi4KICAqICdzZWdi YXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFibGUgZm9yIHVzZXIgcHJv Y2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5nIGZvciBhbiBVVExCIG1p c3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgQ2F1c2UgcmVn aXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hpZnRzIEsvVSBhbmQgSUUg Yml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50IEtlcm5lbC9Vc2VyIGFu ZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IKKyAqICAgaXMgaW4ga2Vy bmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisgKiAtIFNldHMgQmFkVmFk ZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRleHQgcmVnaXN0ZXIocyku CisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNvbnRhaW4gVlBOIG9mIHRo ZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZvciBpbnZhbGlkIHB0ZSdz IGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRoZSBwcm9jZXNzb3IgdHJh cCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2UuCisgKgorICogWFhYIFRo aXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIgcGFnZSB0YWJsZSBhbmQg dXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJzLiAgVGhhdCBpcyByZWFs bHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8K ICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVmIF9fbWlwc19uNjQKIAlQ VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAs IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5Ci0J TUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQor CVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsx LCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywgMmYJCQkjID09MCAtLSBu byBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZv ciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5k ZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdlCQkjID09MCAtLSBub3Qg c3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5IChkZWxheSBzbG90 KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF VF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJw YWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRT KGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAor CUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVy IGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsx KQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBi aXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hX X1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJ CQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEg cmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVh cgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNP UDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJ azAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWsw LCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5D CisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJ emVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNP UDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlvbgorCitub3Rfc3VwZXJw YWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCisJTUZDMAkJazAsIE1J UFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWsw LCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2YT4+MTApCiAJYW5kaQkJ azAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwg azEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwgMChrMSkJCQkjMGU6IGsw PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBrMT1sbzAgcHRlCisKKwlQ VEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNlZCBi aXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJlbmNl ZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBzYWZl IHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0aGUg cmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDIpCisKIAlD TEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMx MjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRF X01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCisKKwlQVEVf TAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0 aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwgazEsIDAsIDMpCisK KwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEJ CSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJCQkJIzFhOiB3cml0ZSB0 byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRVcm4gZnJvbSBleGNlcHRp b24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2VybmVsIGV4Y2VwdGlvbgog CW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNsb3dGYXVsdAkJCSMyMjog bm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAKICNlbmRpZgogCiAvKgot ICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNhdmUgQ1BVIGFuZCBDUDAg cmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlLgog ICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Igc2F2aW5nIHRoZSBleGNl cHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJhY2UgY29kZSBsb29rcyBm b3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcgQEAKIAlTQVZFX1JFRyhh MSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0aGUgcmV0dXJuIGFkZHJl c3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2VybkdlbkV4Y2VwdGlvbikK QEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ CSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhj ZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMg azA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy ZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGsw LCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1w ZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVyLiAgKi8KIAliZXF6CQlr MSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVy cGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9t IFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQ VFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkvKiBWYWxp ZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRFX1ZSCisJYmVxegkJazEs IDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3Rv cmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01U QzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisK KwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRF IGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQg UEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJ CWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGsw KQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBG TiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkj IENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMw CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJ IyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tf MU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8w X1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwliCQl0bGJf aW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQ ICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk cmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQ TgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FE RFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJazAsIDAoazEpCQkJIyBr MD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCi0JYW5kaQkJ azAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAzZgogCW5vcAogCkBAIC05 MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChrMSkKLQlQVEVfTAkJazEs IFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBT X0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9N VEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkKKwor CUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQog CUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAogCiBvZGRfcGFnZToKIAlQ VEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkKKwogCUNMRUFSX1BURV9T V0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lOQwot CUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQor CisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlr MCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9pbnNlcnRfZW50cnk6CkBA IC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2VydF9yYW5kb20KIAlub3AK IAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlDT1AwX1NZ TkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJdGxid3IKKwlQVEVfTVRD MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9w CiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJ azAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJN QVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50 cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBlbnRyeQorCVBUUl9BRERV CWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJ CSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwkjIENoZWNrIGZvciBz dXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1zdXBlcnBhZ2UgaW5kZXgg ZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFn ZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMg WFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBz dXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9T V0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9h ZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVn aXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VW RU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBm bGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlH RVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsx LCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExC IExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJIyBObyBTVyBCaXRzIHRv IGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVk CisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJ ZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01U QzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1Aw X1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVf TVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVn CisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9r c3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZDMAkJazAsIE1JUFNfQ09Q XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJYmVxCQlrMSwgemVybywg TWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQogI2VuZGlmCiAJUFRS X1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwg UFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMg azE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxvMCBwdGUKLQlQVEVf TAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0 IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19D T1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRl ZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0ZQorCisJQ0xFQVJfUFRF X1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBs b2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVM QVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMvbWlwcy9taXBzL2NwdS5j Ci0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMvbWlwcy9jcHUuYwpAQCAt MzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBjcHVpbmZvLT5sMi5kY19s aW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1aW5mby0+bDIuZGNfbndh eXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVnaXN0ZXIgdG8gc2VlIHdo YXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdyaXRpbmcgYWxsIG9uZSdz IGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dyX3BhZ2VtYXNrKH4wKTsK KwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygpOworCW1pcHNfd3JfcGFn ZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJaWYg KChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykgPT0gMCkKKwkJcGFuaWMo IiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJ ICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFHRSAqLworI2lmZGVmIE1J UFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18x TSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBi eSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1B UCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlwcmludGYoIkZpeGVkIG1h cHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBjcHVpbmZvLnRsYl9uZW50 cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXByaW50ZigiKCIpOworCQkJ aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNLWCkKKwkJCQlwcmludGYo IjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBN SVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJaWYgKGNwdWluZm8udGxi X3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2NEsgIik7CisJCQlpZiAo Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJCQkJcHJpbnRmKCIyNTZL ICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xTSkKKwkJCQlw cmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS180 TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMz X1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdt YXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAiKTsKKwkJCWlmIChjcHVp bmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlwcmludGYoIjI1Nk0gIik7 CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50ZigiXG4iKTsKIAl9CiAKIAlp ZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3Zt cGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBhL3N5cy9taXBzL2luY2x1 ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCkBAIC0xMDAsMTUg KzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgodm1fb2Zmc2V0X3QpMHg4 MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAog LyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5vdCBzdXJlIGlmIHRoaXMg aXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5hYmxlIHN1cGVycGFnZSBy ZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxFVkVMIHNwZWNpZmllcyBh IG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBDdXJyZW50bHkgbWlwczY0 IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVMXzBfT1JERVIpIG9mCisg KiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VSVkxFVkVMCisjZGVmaW5l CVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2ZWwgMCByZXNlcnZhdGlv bnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8KKyNpZm5kZWYJVk1fTEVW RUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5CisjZW5kaWYKKworLyoKKyAq IFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZS RUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCisgKiBE aXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5kZWYJVk1fTlJFU0VSVkxF VkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAKIC8qCisgKiBUaGUgbGFy Z2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJ CTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8qCiAgKiBIb3cgbWFueSBw aHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2UuCiAgKi8KICNpZm5kZWYg Vk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAjZGVmaW5lCVZNX0xPV01F TV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRpZgogCi0vKgotICogVGhl IGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2RlZmluZQlWTV9ORlJFRU9S REVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAxMDI0KQkvKiA2NEtCICov CiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wdGUu aCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wdGUuaAor KysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwxMCBAQAogI2lmbmRlZglf TUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAKKyNpZiAhZGVmaW5lZChf S0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRpZgorCiAjaWZuZGVmIF9M T0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog IFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9lbnRyeV90OwpAQCAtNzIs MjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9yIDMyLWJpdCB1c2Ugb2Yg Q1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0IG9mIFBGTiB0byBhIG5v bi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRoaXMgcGh5c2ljYWwKICAq IG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5IGVuZm9yY2VkIGVsc2V3 aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5kIDYyIGFyZSB1c2VkIGZv ciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQgbG9hZGluZyBhbmQgc3Rv cmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0aGUgNTUtYml0CisgKiBz aGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVk KF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZpbmUJVExCTE9fU1dCSVRT X1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSg5KQotI2RlZmlu ZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCTE9fU1dCSVRTX1NI SUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRMQkxPX1JFRl9CSVRfU0hJ RlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJKDExKQkvKiBYWFhTUzog V2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZGRkMwVUxMCisjZGVmaW5l CVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmluZQlUTEJMT19TV0JJVFNf TUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZWxzZQogI2Rl ZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJf U0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKKyNkZWZpbmUJ VExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQp CiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNkZWZpbmUJVExCTE9fU1dC SVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCi0jZGVmaW5l CVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9TSElGVCkgPDwgVExCTE9f UEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QRk5fVE9fUEEocGZu KQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJ RlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkgJiBUTEJMT19QRk5fTUFT SykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BGTl9UT19QQShUTEJMT19Q VEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21tZW50IGlzIG5vdCBjb3Jy ZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAgLTEyMSwyNSArMTI4LDgz IEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAvKgorICogUFRFIEhhcmR3 YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoKKyAqIExvd2VyIGJpdHMg b2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBQRk4gICAgICAg IHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogTG93ZXIgYml0 cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0tLS0tLS0tLS0tIDM0ICAz MyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAorICogIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAgICAgIFBGTiAgICAgICAg ICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCiAgKiBUTEIgZmxh Z3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBGcmFtZSBOdW1iZXIuCiAg KiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4gIFRoaXMgbWVhbnMgYSBw YWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBmaXJzdCwgYW5kIGEgd3Jp dGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMgc2V0LiAgU2VlIGFsc28g UFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0IGl0PworICogCVZSOglW YWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJRzoJR2xvYmFsIGJpdC4g IFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAogICogCQlpbiBFVkVSWSBh ZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4KICAqIAkJaXQgaXMgbWF0 Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYgMHgwNykgPDwgMykKICNk ZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNBQ0hFRCkpCiAjZGVmaW5l CVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0QJCQkw eDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJCQkweDAyCiAjZGVmaW5l CVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICogQ0hFUkkgRW50cnlMbyBl eHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBzdG9yaW5nIHRhZ2dlZAor ICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwgPDwgNjMpCisjZGVmaW5l CVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAqIFBURSBTb2Z0d2FyZSBC aXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICogICAgIDMxICAg MzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8IFcgIHwgUk8gfAorICog ICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAq CisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUgICA1NCAgIDUzCisgKiAg IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHwgIFJH ICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8CisgKiAgIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFZNIGZsYWdzIG1h bmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2VydmVkLiBDdXJyZW50bHkg bm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcgU1ogSURYOiBQYWdlIFNp emUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5hcnkpCUhXIFBhZ2UgU2l6 ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tCisgKgkJMAkwMDAw IDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAwIDAwMTEJIDE2SworICoJ CTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAwMDAgMDAxMSAxMTExCTI1 NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJMDAwMCAwMDExIDExMTEg MTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0KKyAqIChNSVBTIDM6KQor ICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTExIDExMTEgMTExMSAxMTEx CTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlSTzoJUmVhZCBvbmx5LiAg TmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAgKiAJCWxpc3RlbiB0byBy ZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/PwpAQCAtMTUxLDEzICsy MTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkweDAxIDw8IFRMQkxPX1NX QklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3QpMHgwMiA8PCBUTEJMT19T V0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2VudHJ5X3QpMHgwNCA8PCBU TEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f bWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJUFRFX1BTXzE2SwkJKChw dF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRL CQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9Q U18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5l CVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl ZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxPX1NXQklUU19TSElGVCkK KyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwgVExCTE9fU1dCSVRTX1NI SUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJ VFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9lbnRyeV90KTB4MzggPDwg VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVAkJNQor I2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZpbmUJUFRFX1BGTl9OQklU U19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJR0hUCQk2CisjZGVmaW5l CVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1dfVkFMSUQJCTB4NDAKKyNk ZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRMQkxPX1NXQklUU19TSElG VCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2RlZmluZQlQVEVfU1YJCQkw CisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERFKSBwYWdlIG1hcHBpbmcg cmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQVEUpIHBhZ2UgbWFwcGlu Z3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICov CisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFMSUQgfCBQVEVfRCB8IFBU RV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8gfCBQVEVfVyB8IFBURV9N QU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2RlZmlu ZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19JRFhfTUFTSykgPj4gNTYp CisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8ICgoaWR4KSA8PCAxKSkg LSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCVRM Qk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQorI2RlZmluZQlUTEJNQVNL XzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJVExCTUFTS18xNktfUEFH RQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tfNjRLX1BBR0UJVExCTUFT S19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFHRQlUTEJNQVNLX0lEWF9U T19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFTS19JRFhfVE9fTUFTSyg0 KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soNSkKKyNkZWZp bmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYpCisjZGVmaW5lCVRMQk1B U0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2UgLyogISBNSVBTNjRfTkVX X1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkwCisjZGVmaW5lCVRMQkxP X1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiAKIC8q CiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVmaW5lZCBhYm92ZS4KICAq LwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0gfihiaXQpKQotI2RlZmlu ZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2RlZmluZQlwdGVfdGVzdChw dGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZuZGVmIF9MT0NPUkUKK3N0 YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90 IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAor cHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSB8PSBi aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0X2VudHJ5X3QgKnB0ZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0KSA9PSBiaXQpOworfQor CitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50 cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5iaXQpOworfQorCitzdGF0 aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0 KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l IGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl dHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9f aW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRkcl90IHBhKQoreworCisJ cmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExC TE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUEZO X1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJfdCkocGZuID4+ IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQorCitzdGF0aWMgX19pbmxp bmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl dHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9WQUxJRCAJUFRFX1NWCisK KyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSksIFBURV9SRUYpCisjZGVm aW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQVEVfUkVGKQorI2RlZmlu ZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVf cmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChwdGUpLCBQVEVfUkVGKQor I2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3NldF9sb25nKChwdGUpLCBQ VEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCVBURV9S RUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRl KQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0 ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0 b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisj ZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwgUFRFX1ZBTElEKQorCisj aWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQURE Ul82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNf Y2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0 b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRl KQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3Jl KHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfNjQoXAorCQkJCQkJKHB0 X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBw dGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRl cCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9sb25nKShwdGUpOwlcCit9 IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAs IHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0ZV9h dG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRlKSwgYml0KQorI2RlZmlu ZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigocHRlKSwgYml0KQorI2Rl ZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzMyKHB0ZXAs IHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClhdG9t aWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKworI2Rl ZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF8zMihwdGVw LCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfaW50ICop KHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUo cGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlmIC8qICEgUEhZU0FERFJf NjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lmIGRlZmluZWQoX19taXBz X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNp Zm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBERSBpcyBhY3R1YWxseSBh IHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9uIF9fbWlwc19uNjQgdGhl IGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJhbmdlIGZyb20KKyAqIFZN X01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0byBWTV9NQVhfS0VSTkVM X0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZvcmUsIGEgdmFsaWQgdmly dHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8gYSBwYWdlIHRhYmxlKSB3 aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICogc3VwZXJwYWdlIHdpbGwg aGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMgNTggdG8gNTYpCisgKiBz ZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0 YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhfTUFTSykgIT0gMCk7Cit9 CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19p bmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVy biAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUERFIGFu IDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfMW1fc3VwZXJw YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ VEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQVEUgYW4gMU1CIHN1cGVy cGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9zdXBlcnBhZ2UocHRfZW50 cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFN KTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUg TnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1NQRk4o dm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfMU1fU1VQRVJQQUdFX1NI SUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZOX01BU0spOworfQorCisv KiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNpY2FsIEFkZHJlc3MuICov CitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9UT19QQShwdF9lbnRyeV90 IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+IFRMQkxPX1BGTl9TSElG VCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisKKy8qIFN1cGVycGFnZSBQ YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg dm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKwlyZXR1cm4g KFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQorewor CXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk ZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9l bnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fUERFX1RP X1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19QRk5fVE9fUEEoVExCTE9f UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYgLyogISBfTE9DT1JFICov CisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2lzX3JlZmVy ZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0KHB0ZSkKKyNkZWZpbmUJ cHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1cGVycGFnZShwZGUpCQkw CisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZSBwZGVfaXNfMW1fc3Vw ZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorCisjaWZu ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QVEVfVE9fUEEo cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVf VE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKyNlbmRpZiAvKiAhIFBI WVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZvciBQVEUgYWNjZXNzKi8K ICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2RlZmluZQlQVEVNQVNLCQkJ MHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJCQlsZAorI2RlZmluZQlQ VEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmluZQlDTEVBUl9QVEVfU1dC SVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhyKQorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNlZCBiaXQgZW11bGF0aW9u IEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lEWChyKQorICoKKyAqIEdl dCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlmdGluZyBpdCBsZWZ0IGJ5 CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhlIHVwcGVyIHNvZnRiaXRz KSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9QU0lEWF9OQklUU19UT19S SUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcKKyAqIGFsbCB0aGUgbG93 ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRfU1VQRVJQQUdFX0lEWChy KQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwzMgly LCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgLSAz MikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBHZXQgdGhlIGxvd2VyIGhh cmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJpZ2h0LgorICovCisjZGVm aW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAoUFRFX0hXRkxBR1NfTkJJ VFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG VCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCisgKgorICogR2V0 IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFNIFBURS4gIEZpcnN0LCBt YXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhlbiBhZGQgMU0gd29ydGgg b2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0CisgKiBiYWNrIHRvIGl0cyBw b3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERfMU1fUEZOX0ZST01fRVZF TihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQpOwkJXAorCWRzcmwJciwg KFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9fUklHSFQpOyBcCisJZGFk ZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlkc2xsCXIsIChQVEVfUEZO X05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9m ZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRoZW4gc2V0IHRoZSByZWZl cmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisgKiBkb2VzIGl0IGF0b21p Y2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUKKyNpZmRlZiBBVE9NSUNf UkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZz ZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMgly MCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQ7 CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAorCVBURV9MCXIwLCBvZmZz ZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs IHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJYmVxegly MCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJ CQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyogISBBVE9NSUNfUkVGQklU X1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQs IHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJXAorCWRzcmwzMglyMCwg KFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEIDsJ CQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNl dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJUFRFX1MJcjAsIG9m ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKyNlbmRpZiAvKiAh IEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICov CisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFH UyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUp CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxzZSAvKiAhIExPQ09SRSAq LwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJMHhmZjgJLyogZm9yIHRo ZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhmZmMKICNkZWZpbmUJUFRF U0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVfUwkJCXN3CiAjZGVmaW5l CVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocikJTE9OR19TTEwgciwg VExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJf U0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BURV9WQUxJRChyMCwgcjEs IG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCByMSwgb2Zmc2V0KQorCiAj ZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpICovCiAK ICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3IEBACiAjZGVmaW5lCU1J UFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19QR01BU0tfMjU2TQkweDFm ZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdpc3RlciA1LCBTZWxlY3Qg MCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkweDAwMDAxODAwCisjZGVm aW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZL CTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAwMDFlMDAwCisjZGVmaW5l CU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzFNCQkw eDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdmZTAwMAorI2RlZmluZQlN SVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3 ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKKwogI2VuZGlmIC8q ICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5o IGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgK KysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTYyLDE1ICs2MiwyNCBAQAogI2luY2x1 ZGUgPHN5cy9fbG9jay5oPgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2 NF9ORVdfUE1BUAorI2luY2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9O RVdfUE1BUCAqLworCiAvKgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBz dHJ1Y3QgcHZfY2h1bms7CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJ TFFfSEVBRCgsIHB2X2VudHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOwor I2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCWludCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAq LwogfTsKIAogI2RlZmluZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAt ODEsMTUgKzkwLDE4IEBACiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklU UykgLSAxKQogCiBzdHJ1Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlf dCAqcG1fc2VndGFiOwkvKiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBw dl9jaHVuaykJcG1fcHZjaHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1 c2V0X3QJcG1fYWN0aXZlOwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2lu dDMyX3QgYXNpZDpBU0lEX0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2lu dDMyX3QgZ2VuOkFTSURHRU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAg ICAgIHBtX2FzaWRbTUFYU01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRz OwkvKiBwbWFwIHN0YXRpc3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBT NjRfTkVXX1BNQVAKKwlzdHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFi bGUgcGFnZXMgKi8KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYg c3RydWN0IHBtYXAgKnBtYXBfdDsKQEAgLTEyMSw3ICsxMzMsNyBAQAogICovCiB0eXBlZGVmIHN0 cnVjdCBwdl9lbnRyeSB7CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBm b3IgbWFwcGluZyAqLwotCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VO VFJZKHB2X2VudHJ5KSBwdl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2 OSw2ICsxODEsOCBAQAogCiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9t YXBkZXYodm1fcGFkZHJfdCwgdm1fc2l6ZV90KTsKK2Jvb2xlYW5fdCBwbWFwX3BhZ2VfaXNfbWFw cGVkKHZtX3BhZ2VfdCBtKTsKK3ZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCBt LCB2bV9tZW1hdHRyX3QgbWEpOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9z aXplX3QpOwogdm1fb2Zmc2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwog dm9pZCBwbWFwX2tlbnRlcih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgs NiArMTkyLDcgQEAKIHZvaWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBw YSk7CiB2b2lkIHBtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVs YXRlX21vZGlmaWVkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVs YXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9w YWdlX3NldF9tZW1hdHRyKHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8q IF9LRVJORUwgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9t aXBzL2luY2x1ZGUvcGFyYW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIv c3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5l CU1BWERVTVBQR1MJCTEJCS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRl ZiBLU1RBQ0tfTEFSR0VfUEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdl IHRoZSBLU1RBQ0tfU0laRSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5 IHRoZSBoYXJkd2FyZSAoZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8 PCAxNCkJLyogU2luZ2xlIDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NU QUNLX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEp CisjZGVmaW5lCUtTVEFDS19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmlu ZQlLU1RBQ0tfVExCTUFTS19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElG VCAtIDEpKSBcCisJCQkJCTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9Q QUdFUwkoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBL U1RBQ0tfTEFSR0VfUEFHRSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBi ZSBhbGlnbmVkIG9uIGEgKFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtT VEFDS19QQUdFUwkJMgkvKiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShL U1RBQ0tfUEFHRVMgKiBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9T SVpFCisjZGVmaW5lCUtTVEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtT VEFDS19HVUFSRF9QQUdFUwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAq LworI2VuZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZl ZCBjb252ZXJzaW9uIG1hY3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsg UEFHRV9NQVNLKSAmIH5QQUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+ UEFHRV9NQVNLKQorI2RlZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+ UERSTUFTSykKKyNkZWZpbmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNk ZWZpbmUJYXRvcCh4KQkJCSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgo eCkgPDwgUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5 cy9jb25mL29wdGlvbnMubWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lz L2NvbmYvb3B0aW9ucy5taXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJ b3B0X2dsb2JhbC5oCiAKICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5j bHVkZXMgcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0Lgor IworTUlQUzY0X05FV19QTUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNv bnRyb2wgdGhlIE5ldEZQR0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYx MEJNQUNfNjRCSVQJCQlvcHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUg d2l0aCBQYWdlTWFzayByZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdl IChjdXJyZW50bHkgMTZLKSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJH RV9QQUdFICAgCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUg QXRoZXJvcyBTb0MgcGVyaXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYg LS1naXQgYS9zeXMvY29uZi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9z eXMvY29uZi9maWxlcy5taXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMx LDggQEAKIG1pcHMvbWlwcy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRl cC5jCQkJb3B0aW9uYWwJZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1p cHMvbWlwcy9wbWFwLmMJCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFt aXBzNjRfbmV3X3BtYXAKK21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0 X25ld19wbWFwCiBtaXBzL21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlw cy9zY19tYWNoZGVwLmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0 aW9uYWwJZGRiIHwgc3RhY2sKCg== --b1_8a01977bc2405e827dd78c8dca1d7216-- From owner-freebsd-mips@freebsd.org Fri Sep 16 19:03:02 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2D314BDD8B6 for ; Fri, 16 Sep 2016 19:03:02 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 00279C5D for ; Fri, 16 Sep 2016 19:03:01 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id B5AFBB0EB; Fri, 16 Sep 2016 19:03:00 +0000 (UTC) Date: Fri, 16 Sep 2016 19:03:00 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <17227ff5cee59ab31c13030b2aea797d@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcQeQ= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_17227ff5cee59ab31c13030b2aea797d" X-Mailman-Approved-At: Fri, 16 Sep 2016 19:25:37 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 19:03:02 -0000 --b1_17227ff5cee59ab31c13030b2aea797d Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkwLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgUHVsbCBpbiBDSEVSSSBjaGFuZ2UgdG8gZml4IGNvbXBpbGUgdGltZSBl cnJvcnMuICBVcGRhdGUgYW5kIGNvbXBpbGUKICB0ZXN0ZWQgd29ybGQva2VybmVsIHZpYSBtaXBz NjQgdGFyZ2V0IGFuZCBNQUxUQTY0IHVuZGVyIHFlbXUuCiAgCiAgcmVmOgogIGh0dHBzOi8vZ2l0 aHViLmNvbS9DVFNSRC1DSEVSSS9jaGVyaWJzZC9jb21taXQvY2E4OTI0NTQ2ZmFmZjQxMWQyNTM5 YzRjZDMwYmQxNWFhYTIzMjgyNCNkaWZmLTFmMzdhNmY4YjY5Njc4Yjc3MDBhYmNjZjBkNTFmYWNi CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBM QVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz0yMDM4NyZp ZD0yMDM5MAoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Qy NTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJrdm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2Zp bGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1pcHMKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFt LmgKICBzeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBz eXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlw cy9taXBzL2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMv bWlwcy9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9t aXBzL21pcHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMv bWlwcy9zd3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5j CiAgc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVw LmMKICBzeXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3 cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVu bywgc3NvbgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxp c3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K --b1_17227ff5cee59ab31c13030b2aea797d Content-Type: text/x-patch; charset=utf-8; name="D2535.20390.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20390.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5 IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0 ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7 CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT LCBQQUdFX1NJWkUsIDApKQpAQCAtNjIsMTIgKzY2LDE4IEBACiAJCQlpZiAod2FpdCAmIE1fTk9X QUlUKQogCQkJCXJldHVybiAoTlVMTCk7CiAJCQllbHNlCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisJCQkJcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCk7CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLwogCQkJCVZNX1dBSVQ7CisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8K IAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKIAlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlp ZiAoKHdhaXQgJiBNX05PRFVNUCkgPT0gMCkKKwkJZHVtcF9hZGRfcGFnZShwYSk7CiAJdmEgPSAo dm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1QocGEpOwogCWlmICgod2FpdCAmIE1fWkVSTykgJiYg KG0tPmZsYWdzICYgUEdfWkVSTykgPT0gMCkKIAkJYnplcm8odmEsIFBBR0VfU0laRSk7CmRpZmYg LS1naXQgYS9zeXMvbWlwcy9taXBzL3RyYXAuYyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCi0tLSBh L3N5cy9taXBzL21pcHMvdHJhcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCkBAIC04MSw2 ICs4MSw3IEBACiAjaW5jbHVkZSA8bWFjaGluZS9taXBzX29wY29kZS5oPgogI2luY2x1ZGUgPG1h Y2hpbmUvZnJhbWUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3JlZ251bS5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvdGxiLmg+CiAjaW5jbHVkZSA8bWFjaGluZS90bHMuaD4KIAogI2lmZGVmIEREQgpAQCAt MjY0LDcgKzI2NSw3IEBACiAJInJlc2VydmVkIDIxIiwKIAkicmVzZXJ2ZWQgMjIiLAogCSJ3YXRj aCIsCi0JInJlc2VydmVkIDI0IiwKKwkibWFjaGluZSBjaGVjayIsCiAJInJlc2VydmVkIDI1IiwK IAkicmVzZXJ2ZWQgMjYiLAogCSJyZXNlcnZlZCAyNyIsCkBAIC02MzIsNiArNjMzLDMzIEBACiAj ZW5kaWYKIAkJcGFuaWMoIk1DSEVDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgVF9NQ0hFQ0sgKyBU X1VTRVI6CisJCXsKKwkJCXVpbnQzMl90IHN0YXR1cyA9IG1pcHNfcmRfc3RhdHVzKCk7CisKKwkJ CWlmIChzdGF0dXMgJiBNSVBTX1NSX1RTKSB7CisJCQkJLyoKKwkJCQkgKiBNYWNoaW5lIENoZWNr IGV4Y2VwdGlvbiBjYXVzZWQgYnkgVExCCisJCQkJICogZGV0ZWN0aW5nIGEgbWF0Y2ggZm9yIG11 bHRpcGxlIGVudHJpZXMuCisJCQkJICoKKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1 c2hpbmcgdGhlIHVzZXIgVExCCisJCQkJICogYW5kIHJlc2V0dGluZyB0aGUgc3RhdHVzIGJpdC4K KwkJCQkgKi8KKwkJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgaW4gVXNlciAtIER1cCBUTEIgZW50 cnkuICIKKwkJCQkgICAgIlJlY292ZXJpbmcuLi5cbiIpOworCQkJCXBtYXAgPSAmcC0+cF92bXNw YWNlLT52bV9wbWFwOworCQkJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCQkJCW1p cHNfd3Jfc3RhdHVzKHN0YXR1cyAmIH5NSVBTX1NSX1RTKTsKKworCQkJCXJldHVybiAodHJhcGZy YW1lLT5wYyk7CisJCQl9IGVsc2UgeworI2lmZGVmIEREQgorCQkJCWtkYl90cmFwKHR5cGUsIDAs IHRyYXBmcmFtZSk7CisjZW5kaWYKKwkJCQlwYW5pYygiTUNIRUNLXG4iKTsKKwkJCX0KKwkJfQor CQlicmVhazsKIAljYXNlIFRfVExCX01PRDoKIAkJLyogY2hlY2sgZm9yIGtlcm5lbCBhZGRyZXNz ICovCiAJCWlmIChLRVJOTEFORCh0cmFwZnJhbWUtPmJhZHZhZGRyKSkgewpAQCAtNjk0LDEwICs3 MjIsMjMgQEAKIAogCWNhc2UgVF9UTEJfTERfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9Q Uk9UX1JFQUQ7Ci0JCWdvdG8gZG9mYXVsdDsKKwkJZ290byBjaGVja3JlZmJpdDsKIAogCWNhc2Ug VF9UTEJfU1RfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9QUk9UX1dSSVRFOworCitjaGVj a3JlZmJpdDoKKwkJLyoKKwkJICogV2FzIHRoaXMgdHJhcCBjYXVzZWQgYnkgdGhlIFBURV9WUiBi aXQgbm90IGJlaW5nIHNldD8KKwkJICovCisJCWlmIChwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZCgm cC0+cF92bXNwYWNlLT52bV9wbWFwLAorCQkgICAgdHJhcGZyYW1lLT5iYWR2YWRkcikgPT0gMCkg eworCQkJaWYgKCF1c2VybW9kZSkgeworCQkJCXJldHVybiAodHJhcGZyYW1lLT5wYyk7CisJCQl9 CisJCQlnb3RvIG91dDsKKwkJfQorCiBkb2ZhdWx0OgogCQl7CiAJCQl2bV9vZmZzZXRfdCB2YTsK QEAgLTE0MTEsOSArMTQ1MiwxNiBAQAogCXN0cnVjdCBwcm9jICpwID0gY3VycHJvYzsKIAogCXBk ZXAgPSAoJihwLT5wX3Ztc3BhY2UtPnZtX3BtYXAucG1fc2VndGFiWyh2YSA+PiBTRUdTSElGVCkg JiAoTlBERVBHIC0gMSldKSk7Ci0JaWYgKCpwZGVwKQotCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBf dm1zcGFjZS0+dm1fcG1hcCwgdmEpOwotCWVsc2UKKwlpZiAoKnBkZXApIHsKKyNpZiBWTV9OUkVT RVJWTEVWRUwgPiAwCisJCXBkX2VudHJ5X3QgKnBkZSA9ICZwZGVwWyh2YSA+PiBQRFJTSElGVCkg JiAoTlBERVBHIC0gMSldOworCisJCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpCisJCQlwdGVw ID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKyNlbmRpZiAvKiBWTV9OUkVTRVJWTEVWRUwg PiAwICovCisJCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwgdmEpOwor CX0gZWxzZQogCQlwdGVwID0gKHB0X2VudHJ5X3QgKikwOwogCiAJKnBkZXBwID0gcGRlcDsKZGlm ZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdGxiLmMgYi9zeXMvbWlwcy9taXBzL3RsYi5jCi0tLSBh L3N5cy9taXBzL21pcHMvdGxiLmMKKysrIGIvc3lzL21pcHMvbWlwcy90bGIuYwpAQCAtNDAsMTAg KzQwLDE0IEBACiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rs Yi5oPgogCisjaW5jbHVkZSAib3B0X3ZtLmgiCisKICNpZiBkZWZpbmVkKENQVV9DTk1JUFMpCiAj ZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTEyOAogI2VsaWYgZGVmaW5lZChDUFVfTkxNKQog I2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkoMjA0OCArIDEyOCkKKyNlbGlmIGRlZmluZWQo Q1BVX0NIRVJJKQorI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxNDQKICNlbHNlCiAjZGVm aW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTY0CiAjZW5kaWYKQEAgLTEwMiwyMCArMTA2LDMxIEBA CiB7CiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3QgczsKKwl1aW50MzJfdCBwYWdlbWFz azsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNpemU7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCUtB U1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlMCkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUxKSks CisJICAgICgiJXM6IHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24ndCBtYXRjaCIsIF9fZnVu Y19fKSk7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUwKTsKKwltYXNrID0gKHVuc2lnbmVkIGxvbmcpcGFn ZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93ZXIgMTIgYml0cyAqLworCXNpemUg PSBtYXNrICsgMTsKKworCXZhICY9IH5tYXNrOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFz aWQgPSBtaXBzX3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAogCW1pcHNfd3JfaW5k ZXgoaSk7Ci0JbWlwc193cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNr KTsKIAltaXBzX3dyX2VudHJ5aGkoVExCSElfRU5UUlkodmEsIDApKTsKIAltaXBzX3dyX2VudHJ5 bG8wKHB0ZTApOwogCW1pcHNfd3JfZW50cnlsbzEocHRlMSk7CiAJdGxiX3dyaXRlX2luZGV4ZWQo KTsKIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWlu dHJfcmVzdG9yZShzKTsKIH0KIApAQCAtMTM3LDcgKzE1Miw2IEBACiAJaSA9IG1pcHNfcmRfaW5k ZXgoKTsKIAlpZiAoaSA+PSAwKQogCQl0bGJfaW52YWxpZGF0ZV9vbmUoaSk7Ci0KIAltaXBzX3dy X2VudHJ5aGkoYXNpZCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQpAQCAtMjk4LDI5ICszMTIsNTMg QEAKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOwogCWludCBpOworCXVpbnQzMl90 IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKKwlwdF9lbnRyeV90IHB0ZTAs IHB0ZTE7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUpOworCW1hc2sgPSAodW5zaWduZWQgbG9uZylwYWdl bWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBiaXRzICovCisJc2l6ZSA9 IG1hc2sgKyAxOwogCi0JdmEgJj0gflBBR0VfTUFTSzsKKwl2YSAmPSB+bWFzazsKIAlwdGUgJj0g flRMQkxPX1NXQklUU19NQVNLOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFzaWQgPSBtaXBz X3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAotCW1pcHNfd3JfcGFnZW1hc2soMCk7 CisJbWlwc193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VO VFJZKHZhLCBwbWFwX2FzaWQocG1hcCkpKTsKIAl0bGJfcHJvYmUoKTsKIAlpID0gbWlwc19yZF9p bmRleCgpOwogCWlmIChpID49IDApIHsKIAkJdGxiX3JlYWQoKTsKKwkJcHRlMCA9IG1pcHNfcmRf ZW50cnlsbzAoKTsKKwkJcHRlMSA9IG1pcHNfcmRfZW50cnlsbzEoKTsKKwkJS0FTU0VSVCgoVExC TE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRlMCkgJiYKKwkJICAgIFRM QkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9fSURYKHB0ZTEpKSwKKwkJCSgiJXM6 IHB0ZSwgcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0IG1hdGNoIiwgX19mdW5jX18pKTsK IAotCQlpZiAoKHZhICYgUEFHRV9TSVpFKSA9PSAwKSB7CisJCWlmICgodmEgJiBzaXplKSA9PSAw KSB7CiAJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZSk7CisJCQlpZiAocGFnZW1hc2sgJiB+UEFHRV9N QVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJcHRlMSA9IChwdGUxICYgfihQVEVfVlIg fCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVfRCkpOworCQkJCW1pcHNfd3JfZW50cnls bzEocHRlMSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZSk7CisJ CQlpZiAocGFnZW1hc2sgJiB+UEFHRV9NQVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJ cHRlMCA9IChwdGUwICYgfihQVEVfVlIgfCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVf RCkpOworCQkJCW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CisJCQl9CiAJCX0KIAkJdGxiX3dyaXRl X2luZGV4ZWQoKTsKIAl9CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlwc193cl9wYWdl bWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21p cHMvc3d0Y2guUyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwotLS0gYS9zeXMvbWlwcy9taXBzL3N3 dGNoLlMKKysrIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCkBAIC0zMTUsMzYgKzMxNSw5MSBAQAog ICogTk9URTogVGhpcyBpcyBoYXJkIGNvZGVkIHRvIFVQQUdFUyA9PSAyLgogICogQWxzbywgdGhl cmUgc2hvdWxkIGJlIG5vIFRMQiBmYXVsdHMgYXQgdGhpcyBwb2ludC4KICAqLwotCU1UQzAJdjAs IE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExC X0hJCSMgVlBOID0gdmEKIAlIQVpBUkRfREVMQVkKIAl0bGJwCQkJCQkjIHByb2JlIFZQTgogCUhB WkFSRF9ERUxBWQotCW1mYzAJczAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJbWZjMAkJczAsIE1J UFNfQ09QXzBfVExCX0lOREVYCiAJSEFaQVJEX0RFTEFZCiAKLQlQVFJfTEkJdDEsIE1JUFNfS1NF RzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKLQlibHR6CXMwLCBlbnRyeTBzZXQKKwkj IE1JUFNfS1NFRzBfU1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8w X1RMQl9ISQorCVBUUl9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIg ZW50cnkKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWJsdHoJCXMwLCBpbnZhbF9ueHQxCisj ZWxzZQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKyNlbmRpZgogCW5vcAotCXNsbAlzMCwgUEFHRV9T SElGVCArIDEKLQlhZGR1CXQxLCBzMAotCU1UQzAJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJc2xs CQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQUREVQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19D T1BfMF9UTEJfSEkKIAlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlQVEVfTVRD MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9Q R19NQVNLCiAJSEFaQVJEX0RFTEFZCiAJdGxid2kKIAlIQVpBUkRfREVMQVkKLQlNVEMwCXYwLCBN SVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf UEFHRQorLyoKKyAqIFdpdGggYSBLU1RBQ0tfUEFHRV9TSVpFIG9mIDE2SyBhbmQgUEFHRV9TSVpF IG9mIDRLIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAqIGEgc2Vjb25kIFRMQiBlbnRyeSBpcyBjdXJy ZW50bHkgbWFwcGluZyB0aGUga2VybmVsIHRocmVhZCBzdGFjayBhcyBhCisgKiByZWd1bGFyIDRL IHNpemVkIHBhZ2UocykuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kLCBpZiBzbywgaW52YWxpZGF0 ZQorICogdGhhdCBUTEIgZW50cnkgYXMgd2VsbC4KKyAqLworI2lmIChQQUdFX1NJWkUgIT0gNDA5 NikgJiYgKEtTVEFDS19QQUdFX1NJWkUgIT0gMTYzODQpCisjZXJyb3IgUEFHRV9TSVpFIGlzIG5v dCA0SyBvciBLU1RBQ0tfUEFHRV9TSVpFIGlzIG5vdCAxNksuCisjZW5kaWYKK2ludmFsX254dDE6 CisJbW92ZQkJdjEsIHYwCisJUFRSX0FERFUJdjEsIFBBR0VfU0laRSAqIDIKKwlNVEMwCQl2MSwg TUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlIQVpBUkRfREVMQVkKKwl0bGJwCQkJCQkJ IyBwcm9iZSBWUE4KKwlIQVpBUkRfREVMQVkKKwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5E RVgKKwlIQVpBUkRfREVMQVkKKworCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQ QUdFX1NJWkUpIC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9T VEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKwlub3AK KwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1UQzAJCXQxLCBN SVBTX0NPUF8wX1RMQl9ISQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMAorCVBU RV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBf VExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKwl0bGJ3aQorCUhBWkFSRF9ERUxBWQorI2VuZGlm CS8qIEtTVEFDS19MQVJHRV9QQUdFICovCiAKIGVudHJ5MHNldDoKKwlNVEMwCQl2MCwgTUlQU19D T1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2FpbgorCUhBWkFSRF9ERUxBWQogLyogU01QISEgLSBX b3JrcyBvbmx5IGZvciAgdW5zaGFyZWQgVExCIGNhc2UgLSBpLmUuIG5vIHYtY3B1cyAqLwotCW10 YzAJemVybywgTUlQU19DT1BfMF9UTEJfSU5ERVgJCSMgVExCIGVudHJ5ICMwCisJbXRjMAkJemVy bywgTUlQU19DT1BfMF9UTEJfSU5ERVgJIyBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKIAlQ VEVfTVRDMAlhMSwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIHVwdGVbMF0KIAlIQVpBUkRfREVMQVkK IAlQVEVfTVRDMAlhMiwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIHVwdGVbMV0KKyNpZmRlZiBLU1RB Q0tfTEFSR0VfUEFHRQorCUhBWkFSRF9ERUxBWQorCWxpCQl0MSwgS1NUQUNLX1RMQk1BU0tfTUFT SworCU1UQzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCiAJSEFaQVJEX0RFTEFZCisjZWxz ZQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNl bmRpZgogCXRsYndpCQkJCQkjIHNldCBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKKworI2lm ZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT SworCUhBWkFSRF9ERUxBWQorI2VuZGlmCiAvKgogICogTm93IHJ1bm5pbmcgb24gbmV3IHUgc3Ry dWN0LgogICovCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMgYi9zeXMv bWlwcy9taXBzL3BtYXBfbWlwczY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVs bAorKysgYi9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKQEAgLTAsMCArMSw1NTI0IEBACisv KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo dCAoYykgMjAwMyBQZXRlciBXZW1tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp Z2h0IChjKSAyMDA1LTIwMTAgQWxhbiBMLiBDb3ggPGFsY0Bjcy5yaWNlLmVkdT4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RhY2V5IEQuIFNvbiA8c3Nv bkAuLi4+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJp dmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIHRoZSBTeXN0 ZW1zIFByb2dyYW1taW5nIEdyb3VwIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggQ29tcHV0ZXIK KyAqIFNjaWVuY2UgRGVwYXJ0bWVudCBhbmQgV2lsbGlhbSBKb2xpdHogb2YgVVVORVQgVGVjaG5v bG9naWVzIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5 IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0 aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZl cnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNl ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdh cmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJV VE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENP TlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJ TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZ LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbToJ QCgjKXBtYXAuYwk3LjcgKEJlcmtlbGV5KQk1LzEyLzkxCisgKglmcm9tOiBzcmMvc3lzL2kzODYv aTM4Ni9wbWFwLmMsdiAxLjI1MC4yLjggMjAwMC8xMS8yMSAwMDowOToxNCBwcworICoJSk5QUjog cG1hcC5jLHYgMS4xMS4yLjEgMjAwNy8wOC8xNiAxMTo1MTowNiBnaXJpc2gKKyAqLworCisvKgor ICoJTWFuYWdlcyBwaHlzaWNhbCBhZGRyZXNzIG1hcHMuCisgKgorICoJU2luY2UgdGhlIGluZm9y bWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUgaXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBs b2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUsCisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cg YXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55 IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25zCisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2Fs IG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJcmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVy IHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRlY3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1 YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVzIGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxl IG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVjZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9u cyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUgYWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRo aXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3JtYXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nl c3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGljaCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5 c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVjdC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlICJvcHRfZGRiLmgiCisj aW5jbHVkZSAib3B0X3BtYXAuaCIKKyNpbmNsdWRlICJvcHRfdm0uaCIKKworI2luY2x1ZGUgPHN5 cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rdHIuaD4K KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8 c3lzL21zZ2J1Zi5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9wY3B1 Lmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5j bHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5oPgorI2Vs c2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3lzY3Rs Lmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1ZGUgPGRk Yi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9w YXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+ CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5j bHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1 ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNsdWRlIDx2 bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUv Y2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1hY2hpbmUv dGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9TVElDKQor I2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9JTkxJTkUK KyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNkZWZpbmUg UFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZfU1RBVCh4 KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJKChwYSkg Pj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9pbmRleChw YSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBIWVNfVE9f UFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkgJSBOUFZf TElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2tw LCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlcCisJc3Ry dWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0gUEhZU19U T19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkgewkJCVwK KwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3ApOwkJXAor CQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJCVwKKwl9 CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZN X1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBW TV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3Ap CQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJCQkJCQlc CisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2NrcCk7CQkJ XAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm aW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNUX0xPQ0so Vk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIv a2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2KQkoKCh2 KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2luZGV4KHYp CSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wdGVfaW5k ZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5lCXBtYXBf cGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJKE5QREVQ RyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykKKworI2Rl ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K Kworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdfUkQsIDAs ICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9IDA7CitT WVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxBR19SRFRV TiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBsYXJnZSBw YWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VSVkVECTAK Kwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVTUzsKKwor c3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGljIHN0cnVj dCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBmb3IgdGhl IHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9IRUFEKHBj aCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZfY2h1bmtz KTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1Y3Qgcnds b2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBtZF9wYWdl ICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZfY2h1bmsg KnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2VudHJ5X3Qg cHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qg cndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5rKHBtYXBf dCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBf cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFnZV90IHBt YXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRp YyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90IG1wdGUs ICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9lbnRyaWVz KHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz dGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZV9s b2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3BkZShw bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsK K3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9jayAqKmxv Y2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0 YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGlj IHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt X3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBt YXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRlKTsKK3N0 YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFn ZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9wdF9wYWdl KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3Byb21vdGVf cGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShwbWFwX3Qg cG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0IHNwZ2xp c3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3Zl X3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpw bWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7CitzdGF0aWMg Ym9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMg dm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRfZW50 cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCk7 CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsKKworc3Rh dGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxv Y3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCByd2xvY2sg Kipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwg cGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBpbml0X3B0 ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCk7CisK K3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworc3Rh dGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOworc3RhdGlj IHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAqIFBhZ2Ug dGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNlZ21lbnQg ZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19pbmxp bmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9 CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdtZW50IHRh YmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgor cG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlw ZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAo JnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBkaXJlY3Rv cnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19p bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7 CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBf cGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRy eSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg X19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAqcGRlLCB2 bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRfZW50cnlf dCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQorCisvKiBS ZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRyZXNz LiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKHBk ZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRlKTsKKwl9 IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitzdGF0aWMg X19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAsIGludCBj b3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBtYXAtPnBt X3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9p ZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkKK3sKKwor CVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+cG1fc3Rh dHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVudCBjb3Vu dCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf Y291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gY291bnQ7 Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhlIHZpcnR1 YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZzZXRfdAor cG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBiYW5rX3Np emUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CisJ YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUgKHNpemUg PiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsg Ml07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJdOworCQkJ cGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlzX2F2YWls W2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZhaWxbMF0p CisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJYmFua19z aXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBwaHlzX2F2 YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJF Q1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsKK30KKwor LyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1l bW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVl biBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5lbF9wYWdl dGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJcHRfZW50 cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7CisJaW50 IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtl cm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVt b3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBwYWdlIHRh YmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5QREVQRyk7 CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJbmtwdCA9 IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CisK KwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2Jh bCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAy IHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh bCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBh bmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkg KiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRh ZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisK Kwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdt YXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChw ZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBH ICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRy ICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQTUFQX0xP Q0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9z ZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxRX0lOSVQo Jmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lk ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7 CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCit2b2lk CitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8KK2FnYWlu OgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkvKgor CQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJ cGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNfYXZhaWxb aSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkgPCAyKQor CQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsK KwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFpbFtpICsg MF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2YWlsW2kg KyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2 YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJCXBoeXNf YXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyoK KwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5n IG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9 IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOworCQlwaHlz bWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVtID0gYXRv cChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQ aHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp ICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNpemUgPSBw aHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhqeCAtICUj MDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf YXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAxLAorCQkJ ICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUpOworCQl9 CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1heG1lbSkp OworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5p bmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBtYXBfc3Rl YWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVmc2l6ZSk7 CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtT VEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJRlQpOwor CWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIpKTsKKwor CXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9lbmQgPSBW TV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFsIHNvbWUg dmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLworCXZpcnR1 YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsKKwlwY3B1 cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCArPSBQQUdF X1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50cnkgbWFw cGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBVcCB1bnRp bCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVwJyBmb3Ig dGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcwIHNvIHRo ZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNwdV90bGJf aW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoInBjcHUg aXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNlbmRpZgor CisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBWTU5V TV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOworCisJ LyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLworCXJ3X2lu aXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisgKiBJbml0 aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwordm9pZAor cG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5tZC5wdl9s aXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQorCisvKgor ICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5pdCwgdG8g aW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMg dG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkKK3sKKwlp bnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0aWFsaXpl IHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVua3NfbXV0 ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJICogSW5p dGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkg PCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ldLCAicHYg bGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhlYWQgdGFi bGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV07 IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAyKSArIDFd KSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBoZWFkIHRh YmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcgKiBzaXpl b2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJsZSA9IChz dHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAgTV9XQUlU T0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJTFFfSU5J VCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm1fcG1h cCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFwcGluZyBj b3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZU0NUTF9V TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQsCisgICAg JnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitzdGF0aWMg dV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3BkZSwgT0lE X0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5ncywgMCwg IjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9mYWlsdXJl czsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVzLCBDVExG TEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9u IGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsKK1NZU0NU TF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFHX1JELAor ICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIpOworCisv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBM b3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBfX2lubGlu ZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQgKCpmbiko dm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNwdXNldF90 IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXAp KSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3RvIG91dDsK Kwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQVV9GT1JF QUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUpKQorCQkJ cG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQoY3B1aWQp OworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgorCSAqIFRh a2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBhcmUgaWdu b3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNzIG9uIGlu YWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsKKwlzZWxm ID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQsICZhY3Rp dmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1IGlzIHRo ZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykpIHsKKwkJ aWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJQ1BVX1NF VChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3RpdmVfY3B1 cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7Cit9Cisj ZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2 ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlp bnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJnKTsKKwkJ cmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9JU1NFVChj cHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdlbiA9IDA7 CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMgdm9pZAor cG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9vbl9hY3Rp dmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0ZV9hbGxf dXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBt YXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfaW52 YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0 ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+cG1hcCwg cC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg YXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2FsbF9vbl9h Y3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcpOworfQor CitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1f b2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFw X2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHAtPnBt YXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9y YW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJ c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFw OworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZl X2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9CisKK3N0 cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zmc2V0X3Qg dmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFn ZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAqcCA9 IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisKK3N0YXRp YyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRf ZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFy Zy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBtYXBfY2Fs bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFyZyk7Cit9 CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVfaXNfMW1f c3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNpZmljIDJt YiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2YSAmIH5Q RFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2UgaWYgKCFw dGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBmbHVzaCBl dmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRoZXJlIGFy ZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52YWxpZGF0 ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246IGZsdXNo IGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRpbmcgYW55 IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsKCk7 CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJ dm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOwor fTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0KQorewor CXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3VwZGF0ZV9w ZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30KKworc3Rh dGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3BkZSk7Cit9 CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1 YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxpdHkgb2Yg dGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNhbWUgdmly dHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0aWMgdm9p ZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlf dCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2Fy ZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBkZSA9IHBk ZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3JlKHBtYXAs IHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRh dGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91dGluZToJ cG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdl IGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2FkZHJl c3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZt X29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFw X3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwYSA9 IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7CisJCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0gVExCTE9f UFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1h cCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5k X2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUg cGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVz cyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24u CisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9l bnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3BhZ2VfdCBt OworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBNQVBfTE9D SyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZXAg IT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk ZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAocHJvdCAm IFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9fUEEoKnBk ZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVs b2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0gUEhZU19U T19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9IGVsc2Ug eworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRlcCAhPSBO VUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlKSAmJgor CQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3QgJiBWTV9Q Uk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsK KwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJICAgICZw YSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0ZV9wYSk7 CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFfVU5MT0NL X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qLQor ICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUg cGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJlc3MuCisg Ki8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1h cHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICov CisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQor CQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tT RUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9U T19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNf S1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkg KiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQURE UkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCWlm IChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBfcGRlKCZj dXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5VTEwgfHwg KnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBh Z2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJldHVybiAo VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsKKwkJCX0K KwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXApIHsKKwkJ CQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQQUdFX01B U0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNob3VsZCBi ZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBlZCA9ICh2 YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1hcHBlZCA9 IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtTRUdfRU5E KTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkgeworCQlw ZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRoZSBrZXJu ZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9wbWFwLT5w bV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdl ICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09 IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18x bV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJ CXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0sp KTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0 ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEg JiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBhbmljKCIl cyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAqKXZhKTsK K30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQgYSB3aXJl ZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0 X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj ZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7 CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVfUkVGIHwg UFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0ZV9pc192 YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90IHZhLCB2 bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwKKwkJKCJw bWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9sb25nKXBh KSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQorCisvKi0K KyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLworIC8qIFBN QVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9l bnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9tIHRoZSBw YWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4 KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKKwlw dGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVsX3BtYXAs IHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVz c2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJVGhlIHZh bHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IK KyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEgZGlyZWN0 LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0aGUgYXBw cm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcqdmlydCcg dW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBwYWdlcyBz dGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUgZmlyc3Qg dXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAqCVVzZSBY S1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29mZnNldF90 ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3QpCit7CisK KwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisgKiBBZGQg YSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBpcyBvbmx5 IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90IG5lZWQg dG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRlZC4KKyAq IE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVyLiAgVGhl IHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9vZmZzZXRf dCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zmc2V0X3Qg b3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwbWFwX2Zs dXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BIWVMobVtp XSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Vf aW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMgcm91dGlu ZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMgbWVhbnQg b25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1vdmUodm1f b2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0 X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNhY2hlX3di aW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0gdmE7CisJ ZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3RvcmUocHRl LCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJ cG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30KKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFn ZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lk CitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2bV9wYWdl X3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7CisJCVNM SVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUgdGhlIHBh Z2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJfQorfQor CisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUgcGFnZSB0 byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBzcGVjaWZp ZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBwaHlzaWNh bCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisgKi8KK3N0 YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9wYWdlX3Qg bSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJPKQorewor CisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UKKwkJbS0+ ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxpbmtzLnMu c3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBp bnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJs ZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNwb25zaWJs ZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4g IFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1YWwgYWRk cmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRfcHRfcGFn ZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBt YXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1fcm9vdCwg bXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1hcHBpbmcg dGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxMIGlmIHRo ZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lm aWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdAorcG1h cF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwlQTUFQ X0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xvb2t1cCgm cG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICogUmVtb3Zl cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVjaWZpZWQg cGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3MgY29sbGVj dGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3BhZ2UocG1h cF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBN QV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5waW5kZXgp OworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUgY291bnQs IHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBhZ2UgdGFi bGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICogZHJvcHMg dG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0dXJucyBU UlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFMU0Ugb3Ro ZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vud2lyZV9w dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0IHNwZ2xp c3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0g MCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfcG1h cF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHN0 cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdl X3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8qCisJICog dW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBOVVBERSkg eworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lk ZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1l bnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChwZF9lbnRy eV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1fUEFHRShN SVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIHBk cGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJ KnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0KKworCS8q CisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBpdC4KKwkg KiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9yZSB1bm1h cHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1lZCBiZWZv cmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1YnRyYWN0 X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdlIG9uIGEg bGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNob290ZG93 biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZyZWUsIFRS VUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlz IHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQg bWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNl X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUsCisgICAg c3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAodmEgPj0g Vk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRlICE9IDAs ICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9fVk1fUEFH RShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndpcmVfcHRw KHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBtYXBfdCBw bWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+cG1fc2Vn dGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsKKwlmb3Ig KGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lkID0gUE1B UF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQorCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmspOworCWJ6 ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwordm9pZAor cG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCkKK3sKKworCXZtX3BhZ2VvdXRfZ3Jvd19jYWNo ZSgzLCAwLCBNSVBTX1hLUEhZU19MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90 CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sK Kwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNU X0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJPKTsKKwlp ZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAmIFBHX1pF Uk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5kZXg7CisJ cmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVkIGFuZCB6 ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ugc3RydWN0 dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3Qg cHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0 aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9j X2RpcmVjdF9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIFZNX0FMTE9D X05PUk1BTCkpID09IE5VTEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hl KCk7CisJfQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhw dGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pF Uk8oJnBtYXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJ CXBtYXAtPnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1f YXNpZFtpXS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwli emVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4g KDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBw YWdlIHRhYmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19w bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQ TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJy aWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkog fCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2Nr cCAhPSBOVUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlU OworCQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CX0KKworCQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGlu ZywgdGhlIHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJ ICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAw KQorCQlwbWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFn ZSBpbnRvIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFk eSB0aGVyZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3Rh YltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJ cGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChT RUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQ RyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2Vn aW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBh IG5ldyBwZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsg c2VnaW5kZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQs IHJlbGVhc2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3Vi dHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVy byhtKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJl ZmVyZW5jZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19E SVJFQ1RfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBO ZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtw ZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3Vu dF9pbmMocG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90Citw bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9w YWdlX3QgbTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICov CisJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0 IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEp OworCisJLyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8g YQorCSAqIG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNf MW1fc3VwZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkp KSB7CisJCSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkp IHsKKwkJCSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBt YXkgaGF2ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5n IFBEIHBhZ2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICog SWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBo b2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAm JiAqcGQgIT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BI WVMoKHB0X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkv KgorCQkgKiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBi ZWVuCisJCSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAs IHB0ZXBpbmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJ CQlnb3RvIHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVh bGxvY2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBi eSB0aGUgZ2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxp emVkIGJ5IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBj YWxsZWQgaWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAor cG1hcF9yZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3Bh Z2VfdCBwdGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0g MCwKKwkgICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAor CSAgICBwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlk YXRlIGFueSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUg YXNpZC4KKwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1f b2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNf RElSRUNUX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWlj X3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3pl cm8ocHRkcGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0 YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29m ZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRw ZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFw LT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsK KwlpZiAoYWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5l bF9tYXAtPm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBk cGUgPSBwbWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJ CW5rcGcgPSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJ CQkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOwor CQkJaWYgKG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtl cm5lbCIsIF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVCgKKwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRy eSBhZ2FpbiAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3Zt X2VuZCk7CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3Zt X2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtl cm5lbF9tYXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+ bWF4X29mZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK KwkJICogVGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlu a3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkg ICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlp ZiAoIW5rcGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBr ZXJuZWwiKTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVChWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAg c3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5z bGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVz IGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkg KiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp bGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICov CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1f ZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJu ZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4 X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGlu ZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworCitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RB U1NFUlQoX05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9f aW5saW5lIHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQorewor CisJcmV0dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJf dClQQUdFX01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYp LT5wY19wbWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVm aW5lCVBDX0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAw MDAwZmZmZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01d ID0geyBQQ19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUwor c3RhdGljIGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVl cywgcGNfY2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBj X2NodW5rX2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJl bnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lE X0FVVE8sIHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwK KyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lT Q1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAm cGNfY2h1bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5r cyBmcmVlcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZh aWwsIENUTEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGlt ZXMgdHJpZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9u ZyBwdl9lbnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRp YyBpbnQgcHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywg cHZfZW50cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3Vy cmVudCBudW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBP SURfQVVUTywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAw LAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05H KF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRy eV9jb3VudCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RM X0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZf ZW50cnlfc3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMi KTsKKyNlbmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRp dGlvbi4gIFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMg c28gd2UgY2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJl dHVybnMgTlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmll ZCBwbWFwLgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNl IHN1YnNlcXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMg dW50aWwgcmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNo b3J0YWdlIG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFp bV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sK KwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlf dCAqcGRlOworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2Vu dHJ5X3QgcHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0 IHNwZ2xpc3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQs IGlkeDsKKworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBf TE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5V TEwsICgicmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsK KwltX3BjID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFp bCk7CisJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJ UlNUKCZwdl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlM UV9SRU1PVkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5r c19tdXRleCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBO VUxMKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBs b2NrZWRfcG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMt PnBjX3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9j a3ApOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRf cG1hcCAmJiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJ TFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZf Y2h1bmtzX211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERl c3Ryb3kgZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJ CSAqLworCQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVs ZCsrKSB7CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb ZmllbGRdOworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJ CQliaXQgPSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2Up ICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0g cHYtPnB2X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBk ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsK KwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlp ZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNf a2VybmVsX3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpw dGUgPSAwOworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BU RV9UT19QQShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJ CQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19G SUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAg cGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBH QV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFV TCA8PCBiaXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJ CWZyZWVkKys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211 dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9y IGEgNCBLQiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7 CisJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJ UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NU QVQoYXRvbWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlM UV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19t YXBbMF0gPT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAg cGMtPnBjX21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3Rf aW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZw Y19jaHVua19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBp dC4gKi8KKwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJ CSAgICAodm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRk cik7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxR X0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVu a3NfbXV0ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3Vm ZmljaWVudC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJ VEFJTFFfQ09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlk YXRlX2FsbChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9D SyhwbWFwKTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7 CisJCW1fcGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVl LCBwbGlua3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICov CisJCW1fcGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2ly ZV9jb3VudCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4g KG1fcGMpOworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBs aXN0CisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRy eV90IHB2KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsK KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B U1NFUlQocG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRy eV9mcmVlcywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAx KSk7CisJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsK KwlwYyA9IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsK KwlmaWVsZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChz aXplb2YodV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7 CisJaWYgKHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19G UkVFMSB8fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0 aGUgdGltZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYg KF9fcHJlZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7 CisJCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJ cmV0dXJuOworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwlmcmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmso c3RydWN0IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9j aHVua3NfbXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwlt dHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu a19mcmVlcywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwlt ID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7 CisJZHVtcF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9J TkFDVElWRSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQ ViBlbnRyeSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgor ICogbmVlZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxp c3QgbG9jayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZy b20gYW4gYXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgor ICoKKyAqIFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0 aWMgcHZfZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoq bG9ja3ApCit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVj dCBwdl9jaHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxf bG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQ Vl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlw YyA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgewor CQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5w Y19tYXBbZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBm aWVsZCAqIHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAm cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJp dCk7CisJCQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8K KwkJCWlmIChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkg ICAgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNo dW5rLCBwYywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9s b25nKCZwdl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50 KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8g ZnJlZSBpdGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxM T0NfV0lSRUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJ CVBWX1NUQVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJ bSA9IHJlY2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJ Z290byByZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQs IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlk dW1wX2FkZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQ U19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1h cDsKKwlwYy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0 IDAgKi8KKwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZS RUUyOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZw dl9jaHVua3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJ cHYgPSAmcGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2 Y2h1bmssIHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlf Y291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05Q Q1BWIC0gMSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVy IG9mIG9uZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQor eworCWludCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5n IHRoZSBvbmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVu dCB0eXBpY2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8K Kwljb3VudCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291 bnQrKzsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1i ZXIgb2Ygc3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAq IGV4Y2VlZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYg bGlzdCBsb2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZf ZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQor eworCXN0cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZh aWwsIGZyZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJU KGxvY2twICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoK KwkgKiBOZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0 ZSBsaXN0IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBi ZWVuIGFsbG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQg cmVjeWNsZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1 bmtzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRB SUxRX0lOSVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNI KHBjLCAmcG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNf bWFwX2VsZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0o cGMtPnBjX21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21h cFsyXSk7CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJ aWYgKGF2YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVk ZWQ7IGF2YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9B TExPQ19OT1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJ CWlmIChtID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK KwkJCWlmIChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21p Y19hZGRfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50 KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOwor CQlwYyA9IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZS RUUwOworCQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19G UkVFMjsKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RB VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRB SUxRX0VNUFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJ CVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxv Y2soJnB2X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhl biByZW1vdmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwK KyAqIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBl bnRyeSBpZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2Fu IGJlIHBlcmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2Ug bWFwcGluZ3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0 IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5 X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlM UV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBW X1BNQVAocHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2 X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQor CX0KKwlyZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIg cGFnZSBtYXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2 IGVudHJ5IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYK KyAqIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0 aWMgdm9pZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1k X3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1f b2Zmc2V0X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3 X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIl czogcGEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElT VF9MT0NLX1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFn ZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2 IGxpc3QuICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICog bXVzdCBub3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50 aWF0ZWQuCisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2 YSk7CisJcHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAh PSBOVUxMLCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZN X1BBR0UocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4 dCk7CisJbS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRF UEcgLSAxIHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5 X2FsbG9jcywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpF OworCWZvciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJ CUtBU1NFUlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkg ICAgcGMtPnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsK KwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChw Yy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0g MTsKKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBj LT5wY19wdmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJ CQlwdi0+cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBP X1VOTUFOQUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg X19mdW5jX18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQor CQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmss IHBjLCBwY19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+ cGNfbWFwWzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgm cG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1h cC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9u ZygmcHZfZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBw cm9tb3Rpb24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2Ug bWFwcGluZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdl IG1hcHBpbmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBp bmcuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap Cit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90 IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBh IGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9D S19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdl J3MgcHYgZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0 LiAgQXNpZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5 KCksCisJICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2Vu dHJ5KCkgY2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9j aHVuaygpIHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJv bW90ZWQuCisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBh Z2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NF UlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBw YV90b19wdmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9u ZXh0KTsKKwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx IHB2IGVudHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8g eworCQltKys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBt YXAsIHZhKTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmlu ZCBhbmQgdGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFu ZCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBv biBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8K K3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBw bWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2 aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZo X2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BB R0VfVE9fUEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAg ICAodV9sb25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBD b25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBp ZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9y dGluZyB0byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5z ZXJ0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisg ICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3Nl cnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxM KSB7CisJCXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo bG9ja3AsIG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l eHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0 dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50 cnkgZm9yIGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4g YmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0 aWMgYm9vbGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1 Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9i YWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwkvKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVj bGFtYXRpb24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVM TCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv Y2twLCBwYSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZw dmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEg cGFnZSB0YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFn ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRl LCBwdF9lbnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9 IGZpcnN0cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5l d3B0ZTsKKwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9 CisKKy8qCisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rp b24gZmFpbHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLwor c3RhdGljIGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90 ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVh bl90IHJ2OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBt YXAsIHBkZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxv Y2spOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBk ZTsKKwkgcHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90 IG1wdGVwYTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkg UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9s ZHB0ZSA9IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdl KCZvbGRwdGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBp cyBub3Qgc3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lz X3JlZigmb2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAh PQorCSAgICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVs c2UgeworCQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6 IHBhZ2UgdGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAg IF9fZnVuY19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGlu ZyBhbmQgcmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFj Y2Vzc2VkIG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFn ZSBmYWlscy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBk aXJlY3QgbWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkg ICogdGhlIHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3Nz aWJsZQorCQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRo ZSBwcmlvcml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxs b2NhdGVkIGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mg c3BhY2UsIHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBv ZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhl cmUuCisJCSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3Bh Z2VfYWxsb2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlO X0tFUk5FTF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9D X0lOVEVSUlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwg Vk1fQUxMT0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkg cG1hcF9yZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkg ICAgIGxvY2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZt X29mZnNldF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5Q RFJNQVNLKSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkg Q1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJ ICAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkg aWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5j KHBtYXAsIDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3 cGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0 ZSA9IG5ld3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczog b2xkcHRlIGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rl c3QoJm9sZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAo IiVzOiBvbGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9s ZHB0ZSAmIH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUg cGFnZSBpcyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3Vu dCA9PSAxKSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0 cChmaXJzdHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmly c3RwdGUpID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUg YW5kIG5ld3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1 bmNfXykpOworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0 ZXMsIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgq Zmlyc3RwdGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0sp KQorCQkgcG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRo ZSBzcGFyZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhl CisJICAqIG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhl cndpc2UsIHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBi ZSBpbmNvbnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVu aygpIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3Jvbmcg UFYgbGlzdCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBl Y3RlZAorCSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWlu ZyBkZW1vdGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkK KwkJIHJlc2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoK KwkgICogRGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQg UERFIGhhcworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xl YXIsIGl0IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdl ciBvZiBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0 dGluZyBvZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3Zl IGFuZCB0aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEs IHBkZSwgKHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3Rh bGUgcmVjdXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlm ICh2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFw LCAodm1fb2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUg dGhlIFBWIGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VE KSkgeworCQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xk cGRlKSwgbG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25z LCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQor CisvKgorICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFn ZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFw X3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90 IGRvaW5nIGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2Vy bmVsX3BkZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitz dGF0aWMgaW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwg dm1fb2Zmc2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2Nr ICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsK Kwl2bV9vZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBX cml0ZSBiYWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBw ZWQuCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNL KSwgTkJQRFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VS VCgoc3ZhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBu b3QgMm1wYWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9s ZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRl X2xvYWRfc3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlw bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChw ZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCBzdmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdF X1NJWkUpOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hB TkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7 CisJICAgIHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBt YXBfcHZoX2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkg ICAgZm9yICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xk cGRlKSk7CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBk ZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJ CSAgICB2bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9S RUYpKQorCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZf bGlzdCkpCisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkg ICAgfQorCX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJu ZWxfcGRlKHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBf cHRfcGFnZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92 ZV9wdF9wYWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwg MSk7CisJCQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1h cF9yZW1vdmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2ly ZV9jb3VudCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBG QUxTRSk7CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsK KwkJfQorCX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAo cG1hcCwgc3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUg dGhpbmdzIHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1h cF9yZW1vdmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNl dF90IHZhLAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3Ry dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlf dCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X TkVEKTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFn ZSBiZWluZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2 YSwgUEFHRV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt YXApKQorCQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVz dCgmb2xkcHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisK KwlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0 ZSwgUFRFX01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BB KG9sZHB0ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJU KCFwdGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBu b3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQg Kil2YSwgKHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJ aWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVG RVJFTkNFRCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJ CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+ bWQucHZfbGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsK KwkJCXB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VN UFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRF QUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUs IGZyZWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNz IGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0 IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlz dHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7 CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShw bWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8g cHRlIGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192 YWxpZChwdGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92 ZV9wdGUocG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5V TEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEp OworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0 aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFu ZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3Zv aWQKK3BtYXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90 IGV2YSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0 OworCXBkX2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOwor CXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3Jt IGFuIHVuc3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLwor CWlmIChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlh bnl2YWxpZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcg b2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBl YXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9T SVpFKSA9PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVf aXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAm ZnJlZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBz dmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50 X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh KTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29u dGludWU7CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFi bGUuCisJCSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAo dmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3Rv X3BkZShwZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91 dCBpbnZhbGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNv bnRpbnVlOworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBk ZV9pc18xbV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92 aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBw aW5nIGFuZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9u ZXh0ICYmIGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZv ciBhIFBURV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9w ZGUoKS4KKwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJ CWFueXZhbGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZm cmVlLCAmbG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBz dXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBl bHNlIHsKKwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0 IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBi eSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAq IHJhbmdlIGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZh X25leHQgPSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3Rv X3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdF X1NJWkUpIHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFf bmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJ CXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90 ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9u ZXh0KQorCQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2 YSwgcHRwYWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0la RTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK KwkJcndfd3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VO TE9DSyhwbWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglS b3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBw aHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNp ZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAq CU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkK KyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1h cF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3Qg bSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBt YXA7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZz ZXRfdCB2YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMg bm90IG1hbmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdv dG8gc21hbGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7 CisJd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92 YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUo cG1hcCwgcGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdz OgorCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsK KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICog SWYgaXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUg cGFnZSBiZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0 KSA9PSBOVUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQ QUdFX1NJWkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUg PSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpw ZGUgIT0gMCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1 cGVycGFnZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJw YWdlIGluIHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNf a2VybmVsX3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwg UFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBV cGRhdGUgdGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlp ZiAocHRlX2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJF TkNFRCk7CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf dGVzdCgmdHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0 YWJsZTogdmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+ cHZfdmEsICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlw bWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZf bGlzdCwgcHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShw bWFwLCBwdik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xl YXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlw bWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8K K3N0YXRpYyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5 X3QgKnBkZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90 IG5ld3BkZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJ Ym9vbGVhbl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVE KTsKKwlLQVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90 IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRy eToKKwlvbGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVf TUFOQUdFRCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQ SFlTX1RPX1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7 IHZhICs9IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAm JgorCQkJICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHko bSk7CisJfQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgm bmV3cGRlLCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAo bmV3cGRlICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlf dCAqKXBkZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkK KwkJCWdvdG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFw X2ludmFsaWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJV RTsKKwl9CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNp Y2FsIHByb3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMg cmVxdWVzdGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRf dCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0 ZTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90 ICYgVk1fUFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwg c3ZhLCBldmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJ cmV0dXJuOworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdl ZCA9IEZBTFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9 IHZhX25leHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYg KHZhX25leHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJ CXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3Zh KQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2 YSk7CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlm ICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3Vw ZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoK KwkJCSAqIEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJ CQkgKiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYg KHN2YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJ CSAqIFRoZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0 ZWQgYnkgcG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3Rf cGRlKHBtYXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJ Y29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJ CXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xv YmFsX2xvY2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRh dGVfYWxsKAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJ fQorCQkJCX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJ CQkJLyoKKwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJ CSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQg b3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5 IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICog cmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEp CisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFw X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEg Kz0gUEFHRV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJ CQl2bV9wYWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxp ZCgmcGJpdHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2 YV9uZXh0KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJ CQkJdmEgPSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQo JnBiaXRzLCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJ cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9N QU5BR0VEKSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQ SFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlp ZiAodmEgPT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJ CQkJICogVW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGlu ZyAic3ZhIiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0 IGJlIGludmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJ CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0 OworCQkJCX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4 dCkKKwkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFu eWNoYW5nZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xv Y2tlZCkgeworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9D SyhwbWFwKTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3Vv dXMgNEtCIHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRh YmxlIHBhZ2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8K KyAqIG9jY3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBt YXBwaW5ncyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkg YW5kICgyKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hh cmFjdGVyaXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBk b25lIGluIHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFy ZHdhcmUgYXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisg KiBUTEIgZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9u IHRoYXQgdGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRp YyB2b2lkCitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZt X29mZnNldF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90 IG5ld3BkZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9v ZmZzZXRfdCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBz cGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwg dW51c2VkLCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICog d2l0aGluIGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVu Y18ybXBhZ2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICov CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3Bk ZSkgfHwgIXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor CX0KKwlpZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwg UFRFX1JPKSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9S TyBjYW4gYmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJ aWYgKCFhdG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3Bk ZSB8CisJCSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87 CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNw ZWNpZmllZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0 S0IgcGh5c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3Rl cmlzdGljcyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5l d3BkZSkgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBH IC0gMTsgcHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7 CisJCWlmIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9s b25nKCZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFp bHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXAp OworCQkJcmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFw dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsIG9sZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0 ZSB8PSBQVEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRM QkxPX1BURV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6 IHByb3RlY3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0 ZXZhLCBwbWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5l d3BkZSAmIFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVf cF9mYWlsdXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj bHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsK KwkJfQorCQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRh YmxlIHBhZ2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcg dGhlIHN1cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVz dHJveWVkIGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BB R0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2Vf YXJyYXkgJiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0s CisJICAgICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykp OworCUtBU1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgi JXM6IHBhZ2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYg KHBtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZw bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0 dXJuOworCX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAo cHRlX3Rlc3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBt YXAsIHZhLCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAg dGhlIHN1cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3 cGRlIHwgUFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9u cywgMSk7CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBn aXZlbiBwaHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl c3MgKHYpIGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9u IHJlcXVlc3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQg ZG93biwgbWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWlt ZWQuCisgKgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBs YXp5LWV2YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0 aW5lIG11c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFw IE5PVy4KKyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNp bmQgX191bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZt X3BhZGRyX3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9l bnRyeV90ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAg ICBwdl9lbnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJv b2xlYW5fdCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAg IEtBU1NFUlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2Jp ZyIpKTsKKyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8 fCB2YSA8IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEs CisgICAgICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNs ZWFuIHN1Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9 PSAwICYmICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FT U0VSVF9MT0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAg ICBsb2NrID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAg ICAgIFBNQVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2Fz ZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAg ICAqIGNyZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBp ZiB0aGUgcHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAg ICAgICAgICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAg ICAgIG5vc2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAg ICAgICAgICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDog JmxvY2spOworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAg IHJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQ TUFQX1VOTE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9S RVNPVVJDRV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJ cGFuaWMoIiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7 CisJfQorCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAg ICAgICAgKiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEg bmV3IFBUIHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAg ICAgICAgICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBw ZGlyPSVwLCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2Vn dGFiLCAodm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19Q SFlTKG0pOworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9w YSA9IFRMQkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19Q QV9UT19QRk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8q CisgICAgICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2lt dWxhdGVkIGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8g YXZvaWQgYSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUp OworICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFw KSkKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNo ZWFibGVfbWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09 IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg ICAgICAgICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAg ICAgIGlmICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAg ICAgICAgbmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf Tk9TVE9SRVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNl bmRpZgorCisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVh YmxlIG1hcHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2Fu dCB0byB0YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3Ig dGhlc2UgbWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh PSAwKSB7CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQ VEVfRDsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5n ZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAg ICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0 ZSBzdGF0cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcg UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAg ICAgICAgICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2Vy IHBhZ2UgaXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBh bHNvLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm bmV3cHRlLCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAg ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAg ICAgIGVsc2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdw dGUsCisgICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IHBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJU KCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAg ICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAor ICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmln cHRlKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0 aGUgZXh0cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRl LT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndp cmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjog bWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYg KHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0 ZSB8PSBQVEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJ CQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlk YXRlOworCX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5n IGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisg ICAgICAgICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291 bnQtLTsKKworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFH RUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEp OworICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdF KCZsb2NrLCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92 ZSgmb20tPm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IGlmIChtcHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVf Y291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3Vu dCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5n IHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIgdmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg fSBlbHNlCisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7 CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBv ZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFn cyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF X01BTkFHRUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2 ID0gZ2V0X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEg PSB2YTsKKyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ss IHBhKTsKKyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwg cHYsIHB2X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAg ICAgICAgIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAg ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVs c2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAg ICAgLyoKKyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAg ICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBt X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAg ICAgICAgcHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2 YSwgKHZvaWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1h cHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAg ICAgICogdXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUg JiB+IChQVEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRl IHw9IFBURV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkg IT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAg ICAgICAgICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgYm9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRf c3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19y ZWYoJm9yaWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0 ZSwgUFRFX0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01B TkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2Vf ZGlydHkob20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBW TV9QUk9UX1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGludmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYK KwkJCSAgICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlM UV9FTVBUWSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAg fSBlbHNlCisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAg LyoKKyAgICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2Vy dmF0aW9uIGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJv bW90aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+ d2lyZV9jb3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9s ZXZlbF9pZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRl KHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkg JiBEIGNhY2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAg ICAgICAgICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3Ro ZXJ3aXNlLCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgor ICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9 PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBW TV9QUk9UX0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQor ICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2 aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1 cm4gKEtFUk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFK T1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAy LiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFn ZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9p ZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2Vf dCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CSh2b2lkKXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAm bG9jayk7CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMg dm1fcGFnZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZt X3BhZGRyX3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWku Y2xlYW5fc3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQ T19VTk1BTkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhl IGNsZWFuIHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgor CSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3 ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwor CQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBp bmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXgg PT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJ LyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFn ZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5k IGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlm IChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0 ZSA9IFBIWVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7 CisJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBh c3MgTlVMTCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNh dXNlIHdlIGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBf YWxsb2NwdGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQor CQkJCQlyZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7 CisJfQorCisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRl KSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQlt cHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIg b24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYg KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNl cnRfcHZfZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7 CisJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEs IG1wdGUsICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJ CQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOwor CQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMK KwkgKi8KKwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFH RV9UT19QSFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHBy b3RlY3Rpb24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwg UFRFX1ZBTElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3 cHRlIHw9IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlm IChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9 IGVsc2UKKwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYg KGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9z ZXQoJm5ld3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRl X3N0b3JlKHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0 aGlzIG9ubHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQg cHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBv Y2N1ci4KKwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAp IHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQ QUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJ CX0KKwl9CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBN YWtlIGEgdGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMg b25seSBpbnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNl IFhLUEhZUyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2 bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVS Uk9SISEhIE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1h cHBpbmcgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1J UFNfUEhZU19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5 X2ZyZWUodm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAq LworCXJldHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5k ZXhfdCBwZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90 IG1wdGUgPSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToK KwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAo KnBkcGUgIT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4g Ki8KKwkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkp OworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBw ZCBwYWdlLiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJ CQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5k ZXggPj4gTlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShw bWFwLCBOVVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxv Y2twICE9IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOwor fQorCisvKgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMg VFJVRSBpZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEp IGEgcGFnZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tp bmcsICgyKSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFs IGFkZHJlc3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhv dXQgcmVjbGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90Citw bWFwX2VudGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2 bV9wcm90X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlf dCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBz cGdsaXN0IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFs X2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK KwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwg cG1hcCBmb3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNs eCBpbiBwbWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJ CXJldHVybiAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZh LCBOVUxMKSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZh ICUjbHggaW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4g KEZBTFNFKTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChw ZF9lbnRyeV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOwor CXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJ S0FTU0VSVChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNv dW50IGlzIHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNU UjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5j X18sCisJCSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BB R0VfVE9fUEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZO KHBhKSB8IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkp IHsKKwkJaWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJ CW5ld3BkZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NB Q0hFOworCX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKwor CQkvKgorCQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBi ZSBjcmVhdGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZN X1BBR0VfVE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7 CisJCQlpZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlw bWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4 IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZB TFNFKTsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBw bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoK KwkgICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0 b3JlKHBkZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1 dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25n cyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJs ZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkg JiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90 ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNh Y2hlX3N5bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2 YSwgTkJQRFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmco JnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0 dXJuIChUUlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdl cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3 aXRoIHRoZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0 aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMK KyAqIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0 IGJ5IHRoZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFy dCB3aXRoaW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBp cyB0aGUgcGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQg Y2FuIGJlIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisg KiB2aXJ0dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0 YXJ0IGFuZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVu dCBwYWdlIGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0 YXJ0IGFyZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0 YXJ0LCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNl dF90IHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOwor CisJVk1fT0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0g YXRvcChlbmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgp IDwgcHNpemUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJN QVNLKSA9PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYm IHBnX3NwX2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90 LCAmbG9jaykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJ bXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAg IG1wdGUsICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9j ayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0 X3B0IHByZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3Bl Y2lmaWVkIHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0 cyBvbiBwcm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoK KyAqIFRoaXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQor ICogcHJvY2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICog YXJlIHRha2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2lu aXRfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwK KyAgICB2bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3Qg KnBkZTsKKwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9t ZW1hdHRyX3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOwor CUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBP QkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0Iikp OworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2Vy bmVsIHBtYXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBE UiAtIDEpKSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19z cF9lbmFibGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3Qs IHBpbmRleCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdl X2xvb2t1cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9C SVRTX0FMTCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJ CW1lbWF0dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBw aW5nIGlmIHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8g YSAyTUIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHAp OworCQlpZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBT a2lwIHRoZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkg KiB0aGUgcGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJp bmcKKwkJICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBs aXN0cSk7CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7 CisJCSAgICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFH RV9CSVRTX0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkp OworCQkJaWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0g cC0+bWQucHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0 cSk7CisJCX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAy TSBhbGlnbmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJ CVBNQVBfTE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsg cGEgKz0gTkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwp OworCQkJaWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9m IG1hcHBpbmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBh Z2UgZGlyZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxv Y2tpbmcsCisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhh bgorCQkJCSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29u dGludWU7CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1Qo CisJCQkgICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVf aW5kZXgoYWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7 CisJCQkJcHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAg UFRFX1BTXzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2Nh Y2hlYWJsZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJ CSAgICBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FD SEVEOworCQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNl CisJCQkJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5l d3B0ZSk7CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpF KTsKKwkJCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxz ZSB7CisJCQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLwor CQkJCXBkcGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAw LAorCQkJCSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJ CQkJICAgICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRk ciArPSBOQlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglD bGVhciB0aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lm aWVkIHJhbmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxp ZCBtYXBwaW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJp YnV0ZSBzZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUg dGhlIHdpcmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhl IHdpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2Fy ZSBmZWF0dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIg ZW50cmllcy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRf ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3Rz X2xvY2tlZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9D SyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBw bWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4 dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ CXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5C UERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7 CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVM TCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlp ZiAoIXBkZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUj anggaXMgbWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgor CQkJICogQXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkg KiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2 YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xl YXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndp cmVkX2NvdW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNl IHsKKwkJCQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBU UlVFOworCQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJ IFBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor CQkJCQkJIC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJ CQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5p YygicG1hcF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9u ZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19w dGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9T SVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYg KCFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4 IGlzIG1pc3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJ ICogUFRFX1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAor CQkJICogbG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3Nv cgorCQkJICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50 bHkuCisJCQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5w bV9zdGF0cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsK KwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7 Cit9CisKKy8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisg Kglmcm9tIHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRo ZSBkZXN0aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkg YW5kIG5lZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3Qg ZHN0X3BtYXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1f c2l6ZV90IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBU aGlzIGRvZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9y ZSBvdmVyaGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1 c2luZyBmYXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAq bG9jazsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRy LCB2YV9uZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlp ZiAoUENQVV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRy ID0gc3JjX2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBk ZWFkbG9jay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0 X3BtYXApOworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhz cmNfcG1hcCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3Jj X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAq c3JjX3B0ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRl OworCQlwZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRy eV90IHNyY3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKwor CQlzcmNfcGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBl ID09IE5VTEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VH KSAmIH5TRUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUg Y29weSByYW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29w eSBhbGwgbWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAo dmFfbmV4dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJ CX0KKworCQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25l eHQgPCBhZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3Bk cGVfdG9fcGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3Jj X3BkZSA9PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRl OworCisJCWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1 cGVycGFnZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBO QlBEUiA+IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2Nw ZGUoZHN0X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQli cmVhazsKKworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJ CWRzdF9wZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1f UEFHRV9UT19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9p bmRleChhZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVz dCgmc3JjcHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0 X3BtYXAsIGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsK KwkJCQkqZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBf cmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7 CisJCQl9IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJ fQorCisJCXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21w dGUgPSBQSFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVf Y291bnQgPiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMg dW51c2VkIikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5k IG9mIHRoZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUg cGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkg Ki8KKwkJaWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKwor CQkvKgorCQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRo ZSBtYW5hZ2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3Bk ZV90b19wdGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1J UFNfUEhZU19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9w dGVfaW5kZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0g MCkKKwkJCWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZh X25leHQpIHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsK KworCisJCQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1 YWwgY29weSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwg UFRFX01BTkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICov CisJCQkJcGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRo ZSBwYWdlIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3Bt YXAsIGFkZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7 CisJCQkJCWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9U T19QSFlTKCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJ CQkJaWYgKGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRl cGluZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBq dXN0CisJCQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRz dG1wdGUtPndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUg cGFnZSB0YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2Nh dGVkLgorCQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJ CQkJCSAgICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5n IG1lbW9yeSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5 IHRoZSBwYWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09 IE5VTEwpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3 ZSBoYXZlIGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisK KwkJCQkvKiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9w dGUgPSAocHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlW TV9QQUdFX1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0 ZV9pbmRleChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICov CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJ CWlmICgqZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShk c3RfcG1hcCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBv cHVsYXRlIHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2Rp ZmllZCwgYW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1 cmluZyB0aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cg fCBQVEVfRCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOwor CQkJCQkvKiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRz dF9wbWFwLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJ aWYgKHBtYXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZm cmVlKSkgeworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAg YWRkcik7CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJ Z290byBvdXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3 ZSdyZSBkb25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndp cmVfY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlz cmNfcHRlKys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9j ayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNy Y19wbWFwKTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30K KworLyoKKyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFn ZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xl YXIgaXRzIGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3Zv aWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZt X3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RP X0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9T SVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91 bnBpbigpOworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lm aWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVz aW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5 IG5vdCBjb3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2 b2lkCitwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkK K3sKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMo bSk7CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJ Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKK3ZvaWQKK3Bt YXBfemVyb19wYWdlX2lkbGUodm1fcGFnZV90IG0pCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1f cGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBQQUdFX1NJ WkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCXNjaGVkX3Vu cGluKCk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAo bWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZp cnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1h Y2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBm b3IgNjQgYml0LgorICovCisjZGVmaW5lCVBNQVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRp YyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3Qg ZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFk ZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9fUEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19k c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBh Y2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgorCSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRo YXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGlu IFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8KKwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2 Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpFKTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElS RUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsK KyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxhZ3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlf YmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxz ZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0Vf U0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0la RSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0 aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRseSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBw YWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24td3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChl LmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20gVk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlz IG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQgdG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5 c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFncykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8K KyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQK K3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFw X2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRzdCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkK K3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Modm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkK K3sKKworCXBtYXBfY29weV9wYWdlX2ludGVybmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7 Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVkX2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAor cG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29m ZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVy c2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIgKmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20s IGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29mZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJf dCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhm ZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNldCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlj bnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0laRSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFb YV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJCWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20p OworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250 LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0Vf U0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdFX1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9w dmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19U T19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBBR0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1J UFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSArIGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIg KilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVf Q0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9DT1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2Nw LCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxzZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsK KyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250 KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQliX29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09 IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5 X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFnZ2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisg KiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9w YWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltd LAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2Nv cHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zmc2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAw KTsKK30KKworI2lmZGVmIENQVV9DSEVSSQordm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1f cGFnZV90IG1hW10sIHZtX29mZnNldF90IGFfb2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2 bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhmZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2Vz X2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIsIGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1B UF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBt YXAncyBwdiBpcyBvbmUgb2YgdGhlIGZpcnN0CisgKiAxNiBwdnMgbGlua2VkIHRvIGZyb20gdGhp cyBwYWdlLiAgVGhpcyBjb3VudCBtYXkKKyAqIGJlIGNoYW5nZWQgdXB3YXJkcyBvciBkb3dud2Fy ZHMgaW4gdGhlIGZ1dHVyZTsgaXQKKyAqIGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdHJ1ZSBiZSBy ZXR1cm5lZCBmb3IgYSBzbWFsbAorICogc3Vic2V0IG9mIHBtYXBzIGZvciBwcm9wZXIgcGFnZSBh Z2luZy4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrKHBtYXBfdCBwbWFw LCB2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXN0cnVjdCByd2xvY2sg KmxvY2s7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbG9vcHMgPSAwOworCWJvb2xlYW5fdCBydjsK KworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgiJXM6 IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBfX2Z1bmNfXywgbSkpOworCXJ2ID0gRkFMU0U7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CisJCQlydiA9IFRS VUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQli cmVhazsKKwl9CisJaWYgKCFydiAmJiBsb29wcyA8IDE2ICYmIChtLT5mbGFncyAmIFBHX0ZJQ1RJ VElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJ CVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCWlmIChQVl9Q TUFQKHB2KSA9PSBwbWFwKSB7CisJCQkJcnYgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkJ bG9vcHMrKzsKKwkJCWlmIChsb29wcyA+PSAxNikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyd19y dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChy dik7Cit9CisKKy8qCisgKglwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3M6CisgKgorICoJUmV0dXJu IHRoZSBudW1iZXIgb2YgbWFuYWdlZCBtYXBwaW5ncyB0byB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFn ZQorICoJdGhhdCBhcmUgd2lyZWQuCisgKi8KK2ludAorcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdz KHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK KwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGNvdW50LCBtZF9nZW47CisK KwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCisJCXJldHVybiAoMCk7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwljb3VudCA9IDA7CisJVEFJTFFf Rk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAo cHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJbWRfZ2VuID0gbS0+bWQucHZf Z2VuOworCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3Js b2NrKGxvY2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJcHRlID0gcG1hcF9w dGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQorCQkJY291 bnQrKzsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwKSB7CisJCXN0cnVjdCBtZF9wYWdlICpwdmggPSBwYV90b19wdmgoVk1fUEFH RV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4 dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOworCQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkp IHsKKwkJCQlpbnQgcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCW1kX2dlbiA9IG0tPm1kLnB2 X2dlbjsKKwkJCQlyd19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQly d19ybG9jayhsb2NrKTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAg ICBwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJcGRfZW50cnlfdCAqcGRlID0gcG1hcF9w ZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChwdGVfdGVzdCgocHRfZW50cnlfdCAqKXBkZSwg UFRFX1cpKQorCQkJCWNvdW50Kys7CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJfQorCX0KKwly d19ydW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJu IChjb3VudCk7Cit9CisKKy8qCisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlz IG1hcHBlZCBpbmRpdmlkdWFsbHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndp c2UsIHJldHVybnMgRkFMU0UuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKwor CWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElT VF9MT0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5w dl9saXN0KSB8fAorCSAgICAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkh VEFJTFFfRU1QVFkoJnBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJ cndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy biAocnYpOworfQorCisvKgorICogRGVzdHJveSBhbGwgbWFuYWdlZCwgbm9uLXdpcmVkIG1hcHBp bmdzIGluIHRoZSBnaXZlbiB1c2VyLXNwYWNlCisgKiBwbWFwLiAgVGhpcyBwbWFwIGNhbm5vdCBi ZSBhY3RpdmUgb24gYW55IHByb2Nlc3NvciBiZXNpZGVzIHRoZQorICogY2FsbGVyLgorICoKKyAq IFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCBwbWFwLiAgTW9y ZW92ZXIsIGl0CisgKiBpcyBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgSXQgaXMgb25s eSB0byBiZSB1c2VkIGR1cmluZworICogcHJvY2VzcyB0ZXJtaW5hdGlvbi4gIENvbnNlcXVlbnRs eSwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHdheXMKKyAqIHRoYXQgbWFrZSBpdCBmYXN0ZXIg dGhhbiBwbWFwX3JlbW92ZSgpLiAgRmlyc3QsIGl0IGNhbiBtb3JlIHF1aWNrbHkKKyAqIGRlc3Ry b3kgbWFwcGluZ3MgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIHBtYXAncyBjb2xsZWN0aW9uIG9mIFBW CisgKiBlbnRyaWVzLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIHBhZ2UgdGFibGUuICBTZWNv bmQsIGl0IGRvZXNuJ3QKKyAqIGhhdmUgdG8gdGVzdCBhbmQgY2xlYXIgdGhlIHBhZ2UgdGFibGUg ZW50cmllcyBhdG9taWNhbGx5LCBiZWNhdXNlCisgKiBubyBwcm9jZXNzb3IgaXMgY3VycmVudGx5 IGFjY2Vzc2luZyB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGEg cGFnZSB0YWJsZSBlbnRyeSdzIGRpcnR5IGJpdCB3b24ndCBjaGFuZ2Ugc3RhdGUgb25jZQorICog dGhpcyBmdW5jdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBf dCBwbWFwKQoreworCXBkX2VudHJ5X3QgcHRlcGRlLCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZSwg dHB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZ2VfdCBtLCBtcHRlLCBtdDsKKwlw dl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpw YywgKm5wYzsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWludCBiaXQ7CisJdWludDY0X3QgaW51 c2UsIGJpdG1hc2s7CisJaW50IGFsbGZyZWUsIGZpZWxkLCBmcmVlZCwgaWR4OworCWJvb2xlYW5f dCBzdXBlcnBhZ2U7CisJdm1fcGFkZHJfdCBwYTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgdGhl IGdpdmVuIHBtYXAgaXMgb25seSBhY3RpdmUgb24gdGhlIGN1cnJlbnQKKwkgKiBDUFUuICBVbmZv cnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYmxvY2sgYW5vdGhlciBDUFUgZnJvbQorCSAqIGFjdGl2YXRp bmcgdGhlIHBtYXAgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisJICovCisJS0FT U0VSVChwbWFwID09IHZtc3BhY2VfcG1hcChjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfdm1zcGFjZSks CisJICAgICgiJXM6IG5vbi1jdXJyZW50IHBtYXAgJXAiLCBfX2Z1bmNfXywgcG1hcCkpOworCisJ bG9jayA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwYywgJnBtYXAt PnBtX3B2Y2h1bmssIHBjX2xpc3QsIG5wYykgeworCQlhbGxmcmVlID0gMTsKKwkJZnJlZWQgPSAw OworCQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaW51c2Ug PSB+cGMtPnBjX21hcFtmaWVsZF0gJiBwY19mcmVlbWFza1tmaWVsZF07CisJCQl3aGlsZSAoaW51 c2UgIT0gMCkgeworCQkJCWJpdCA9IGZmc2woaW51c2UpIC0gMTsKKwkJCQliaXRtYXNrID0gMVVM IDw8IGJpdDsKKwkJCQlpZHggPSBmaWVsZCAqIHNpemVvZihpbnVzZSkgKiBOQkJZICsgYml0Owor CQkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQkJaW51c2UgJj0gfmJpdG1hc2s7CisK KwkJCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCBwdi0+cHZfdmEpOworCQkJCXB0ZXBkZSA9ICpw ZGU7CisJCQkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZGUsIHB2LT5wdl92YSk7CisJCQkJaWYg KHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJCQlzdXBlcnBhZ2UgPSBUUlVFOworCQkJ CQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlcnBhZ2Ug PSBGQUxTRTsKKwkJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQl9CisJCQkJdHB0ZSA9ICpwdGU7CisJCQkJaWYgKCFwdGVf aXNfdmFsaWQocHRlKSkgIHsKKwkJCQkJcGFuaWMoIiVzOiBiYWQgJXMgcHRlIHZhICVseCBwdGUg JWx4IiwKKwkJCQkJICAgIF9fZnVuY19fLCBzdXBlcnBhZ2UgPyAic3VwZXJwYWdlIiA6CisJCQkJ CSAgICAiIiwgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCQl9CisKKy8qCisgKiBXZSBjYW5ub3QgcmVt b3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQorICov CisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfVykpIHsKKwkJCQkJYWxsZnJlZSA9IDA7CisJ CQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHRwdGUpOwor CQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXBhICY9IH5QRFJNQVNLOworCQkJCW0gPSBQSFlTX1RP X1ZNX1BBR0UocGEpOworCQkJCUtBU1NFUlQobS0+cGh5c19hZGRyID09IHBhLAorCQkJCSAgICAo IiVzOiB2bV9wYWdlX3QgJXAgcGh5c19hZGRyIG1pc21hdGNoICIKKwkJCQkgICAgIiUwMTZqeCAl MDE2angiLCBfX2Z1bmNfXywgbSwKKwkJCQkgICAgKHVpbnRtYXhfdCltLT5waHlzX2FkZHIsICh1 aW50bWF4X3QpdHB0ZSkpOworCisJCQkJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSAhPSAwIHx8CisJCQkJICAgIG0gPCAmdm1fcGFnZV9hcnJheVt2bV9wYWdlX2FycmF5X3NpemVd LAorCQkJCSAgICAoIiVzOiBiYWQgdHB0ZSAlI2p4IiwgX19mdW5jX18sCisJCQkJICAgICh1aW50 bWF4X3QpdHB0ZSkpOworCisJCQkJLyogQ2xlYXIgUFRFICovCisJCQkJaWYgKHN1cGVycGFnZSkK KwkJCQkJcHRlX3N0b3JlKHB0ZSwgMCk7CisJCQkJZWxzZQorCQkJCQlwdGVfc3RvcmUocHRlLCBp c19rZXJuZWxfcG1hcChwbWFwKSA/CisJCQkJCSAgICBQVEVfRyA6IDApOworCisJCQkJLyoKKwkJ CQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMKKwkJCQkg Ki8KKwkJCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3Qo JnRwdGUsIFBURV9STykpIHsKKwkJCQkJaWYgKHN1cGVycGFnZSkgeworCQkJCQkJdm1fcGFnZV90 IG10OworCisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10 KyspCisJCQkJCQkJdm1fcGFnZV9kaXJ0eShtdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJdm1fcGFn ZV9kaXJ0eShtKTsKKwkJCQl9CisKKwkJCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo JmxvY2ssIG0pOworCisJCQkJLyogTWFyayBmcmVlICovCisJCQkJcGMtPnBjX21hcFtmaWVsZF0g fD0gYml0bWFzazsKKwkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291 bnRfZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwkJCQkJcHZoID0gcGFfdG9fcHZoKFRM QkxPX1BURV9UT19QQSh0cHRlKSk7CisJCQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw diwgcHZfbmV4dCk7CisJCQkJCXB2aC0+cHZfZ2VuKys7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgm cHZoLT5wdl9saXN0KSkgeworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1bTkJQRFIgLyBQQUdF X1NJWkVdOyBtdCsrKQorCQkJCQkJCWlmIChUQUlMUV9FTVBUWSgmbXQtPm1kLnB2X2xpc3QpKQor CQkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG10LCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQor CQkJCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCQlp ZiAobXB0ZSAhPSBOVUxMKSB7CisJCQkJCQlwbWFwX3JlbW92ZV9wdF9wYWdlKHBtYXAsIG1wdGUp OworCQkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJCQkJCQlLQVNTRVJU KG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJCQkJICAgICgiJXM6IHB0ZSBwYWdlIHdp cmUgY291bnQgZXJyb3IiLAorCQkJCQkJICAgIF9fZnVuY19fKSk7CisJCQkJCQltcHRlLT53aXJl X2NvdW50ID0gMDsKKwkJCQkJCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG1wdGUsICZmcmVl LCBGQUxTRSk7CisJCQkJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50 LCAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVj KHBtYXAsIDEpOworCQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0 KTsKKwkJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRF QUJMRSkgIT0gMCAmJgorCQkJCQkgICAgVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJ CQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCQlwdmggPSBw YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkKKwkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUp OworCQkJCQl9CisJCQkJfQorCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCBwdGVw ZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCVBWX1NUQVQoYXRvbWljX2Fk ZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfYWRkX2lu dCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xv bmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlpZiAoYWxsZnJlZSkgeworCQkJVEFJTFFf UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCQlmcmVlX3B2X2NodW5r KHBjKTsKKwkJfQorCX0KKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor CXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcndfcnVu bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9 CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGUgYW5kIG1vZGlmaWVkIGJpdHMgaW4gZWFjaCBvZiB0 aGUgZ2l2ZW4gcGFnZSdzIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3JlbW92ZV93cml0ZSh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXZtX29mZnNldF90IHZhOwor CXB2X2VudHJ5X3QgbmV4dF9wdjsKKwlpbnQgcHZoX2dlbjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1 Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwg KnB0ZTsKKwlwdl9lbnRyeV90IHB2OworCWludCBtZF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdl ICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3Qg ZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQR0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIHNldCBi eSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMsCisJICog aWYgUEdBX1dSSVRFQUJMRSBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBlbnRyaWVzIG5lZWQgdXBk YXRpbmcuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYg KCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDAp CisJCXJldHVybjsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFH RV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyht KSk7CityZXRyeV9wdl9sb29wOgorCXJ3X3dsb2NrKGxvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQ R19GSUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVB Q0hfU0FGRShwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRy eV9wdl9sb29wOworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3Bk ZShwbWFwLCB2YSk7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkgJiYgIXBkZV90ZXN0 KHBkZSwgUFRFX1JPKSkKKwkJCSh2b2lkKXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRl LCB2YSwgJmxvY2spOworCQlLQVNTRVJUKGxvY2sgPT0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0so bSksCisJCSAgICAoImluY29uc2lzdGVudCBwdiBsb2NrICVwICVwIGZvciBwYWdlICVwIiwKKwkJ ICAgIGxvY2ssIFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLCBtKSk7CisJCVBNQVBfVU5MT0NL KHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5w dl9saXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RS WUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9IG0t Pm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuIHx8CisJCQkg ICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRyeV9wdl9sb29wOworCQkJfQorCQl9CisJ CXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBl cnBhZ2UocGRlKSwKKwkJICAgICgiJXM6IGZvdW5kIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw diBsaXN0IiwKKwkJICAgIF9fZnVuY19fLCBtKSk7CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw ZGUsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQocHRlICE9IE5VTEwgJiYgcHRlX2lzX3ZhbGlkKHB0 ZSksCisJCSAgICAoIiVzOnBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIiwgX19mdW5jX18pKTsK K3JldHJ5OgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9S TykpIHsKKwkJCWlmICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwgb2xkcHRlLAorCQkJICAgICgo b2xkcHRlICYgflBURV9EKSB8IFBURV9STykpKQorCQkJCWdvdG8gcmV0cnk7CisJCQlpZiAocHRl X3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXAp OworCX0KKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxv Y2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworI2RlZmluZQlQ TUFQX1RTX1JFRkVSRU5DRURfTUFYCTUKKworLyotCisgKglwbWFwX3RzX3JlZmVyZW5jZWQ6Cisg KgorICogIFJldHVybiBhIGNvdW50IG9mIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQs IGFuZCByZXNldCB0aGUKKyAqICByZWZlcmVuY2UgYml0LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBm b3IgZXZlcnkgcmVmZXJlbmNlIGJpdCB0byBiZQorICogIHJlc2V0LCBidXQgaXQgaXMgbmVjZXNz YXJ5IHRoYXQgMCBvbmx5IGJlIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlCisgKiAgdHJ1bHkgaGF2 ZSBiZWVuIHBhZ2VzIHJlZmVyZW5jZWQuCisgKgorICogIFhYWDogVGhlIGV4YWN0IG51bWJlciBv ZiBmbGFncyB0byBjaGVjayBhbmQgcmVzZXQgaXMgYSBtYXR0ZXIgdGhhdAorICogIHNob3VsZCBi ZSB0ZXN0ZWQgYW5kIHN0YW5kYXJkaXplZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgZm9y CisgKiAgb3B0aW1hbCBhZ2luZyBvZiBzaGFyZWQgcGFnZXMuCisgKi8KK2ludAorcG1hcF90c19y ZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50 cnlfdCBwdiwgcHZmOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRf ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9w YWRkcl90IHBhOworCWludCBjbGVhcmVkLCBtZF9nZW4sIG5vdF9jbGVhcmVkLCBwdmhfZ2VuOwor CisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFw X3RzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJY2xlYXJlZCA9 IDA7CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisJbG9jayA9IFBIWVNfVE9fUFZfTElTVF9M T0NLKHBhKTsKKwlwdmggPSBwYV90b19wdmgocGEpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv Y2spOworCXJ3X3dsb2NrKGxvY2spOworcmV0cnk6CisJbm90X2NsZWFyZWQgPSAwOworCWlmICgo bS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAhPSAwIHx8CisJICAgIChwdmYgPSBUQUlMUV9GSVJT VCgmcHZoLT5wdl9saXN0KSkgPT0gTlVMTCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlwdiA9 IHB2ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJdmEgPSBw di0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVf aXNfcmVmKChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIHRoaXMgcmVm ZXJlbmNlIGJpdCBpcyBzaGFyZWQgYnkgNTEyIDRLQgorCQkJICogcGFnZXMsIGl0IHNob3VsZCBu b3QgYmUgY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzCisJCQkgKiB0ZXN0ZWQuICBBcHBseSBhIHNp bXBsZSAiaGFzaCIgZnVuY3Rpb24gb24gdGhlCisJCQkgKiBwaHlzaWNhbCBwYWdlIG51bWJlciwg dGhlIHZpcnR1YWwgc3VwZXJwYWdlIG51bWJlciwKKwkJCSAqIGFuZCB0aGUgcG1hcCBhZGRyZXNz IHRvIHNlbGVjdCBvbmUgNEtCIHBhZ2Ugb3V0IG9mCisJCQkgKiB0aGUgNTEyIG9uIHdoaWNoIHRl c3RpbmcgdGhlIHJlZmVyZW5jZSBiaXQgd2lsbAorCQkJICogcmVzdWx0IGluIGNsZWFyaW5nIHRo YXQgcmVmZXJlbmNlIGJpdC4gIFRoaXMKKwkJCSAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGF2 b2lkIHRoZSBzZWxlY3Rpb24gb2YgdGhlCisJCQkgKiBzYW1lIDRLQiBwYWdlIGZvciBldmVyeSAy TUIgcGFnZSBtYXBwaW5nLgorCQkJICoKKwkJCSAqIE9uIGRlbW90aW9uLCBhIG1hcHBpbmcgdGhh dCBoYXNuJ3QgYmVlbiByZWZlcmVuY2VkCisJCQkgKiBpcyBzaW1wbHkgZGVzdHJveWVkLiAgVG8g YXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGEKKwkJCSAqIHN1YnNlcXVlbnQgcGFnZSBmYXVsdCBv biBhIGRlbW90ZWQgd2lyZWQgbWFwcGluZywKKwkJCSAqIGFsd2F5cyBsZWF2ZSBpdHMgcmVmZXJl bmNlIGJpdCBzZXQuICBNb3Jlb3ZlciwKKwkJCSAqIHNpbmNlIHRoZSBzdXBlcnBhZ2UgaXMgd2ly ZWQsIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJCQkgKiBpdHMgcmVmZXJlbmNlIGJpdCB3b24ndCBh ZmZlY3QgcGFnZSByZXBsYWNlbWVudC4KKwkJCSAqLworCQkJaWYgKCgoKHBhID4+IFBBR0VfU0hJ RlQpIF4gKHB2LT5wdl92YSA+PiBQRFJTSElGVCkgXgorCQkJICAgICh1aW50cHRyX3QpcG1hcCkg JiAoTlBURVBHIC0gMSkpID09IDAgJiYKKwkJCSAgICAhcGRlX3Rlc3QocGRlLCBQVEVfVykpIHsK KwkJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1JFRik7CisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCQljbGVhcmVkKys7CisJ CQl9IGVsc2UKKwkJCQlub3RfY2xlYXJlZCsrOworCisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7 CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeS4g Ki8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgIT0gTlVMTCkg eworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxR X0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJfQorCQlpZiAoKGNs ZWFyZWQgKyBub3RfY2xlYXJlZCkgPj0gUE1BUF9UU19SRUZFUkVOQ0VEX01BWCkKKwkJCWdvdG8g b3V0OworCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBwdmYp Oworc21hbGxfbWFwcGluZ3M6CisJaWYgKChwdmYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz dCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCXB2ID0gcHZmOworCWRvIHsKKwkJaWYgKHB2ZiA9 PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQ X1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9 IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7 CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmICgKKwkJCSAgICBwdmhfZ2VuICE9IHB2aC0+cHZf Z2VuIHx8CisJCQkgICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NL KHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKworCQlwZGUgPSBwbWFwX3BkZShw bWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAg ICAoInBtYXBfdHNfcmVmZXJlbmNlZDogZm91bmQgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBwdiBs aXN0IiwKKwkJICAgIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3Zh KTsKKwkJaWYgKHB0ZV9pc19yZWYocHRlKSkgeworCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2Vu dHJ5X3QgKilwZGUsIFBURV9SRUYpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYt PnB2X3ZhKTsKKwkJCWNsZWFyZWQrKzsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyog Um90YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlp ZiAocHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlU QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQltLT5tZC5wdl9nZW4rKzsK KwkJfQorCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgIT0gcHZm ICYmIGNsZWFyZWQgKworCSAgICBub3RfY2xlYXJlZCA8IFBNQVBfVFNfUkVGRVJFTkNFRF9NQVgp Oworb3V0OgorCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlyZXR1cm4gKGNsZWFyZWQgKyBub3RfY2xlYXJlZCk7Cit9CisKK3N0YXRpYyBib29sZWFu X3QKK3BtYXBfcGFnZV90ZXN0X21hcHBpbmdzKHZtX3BhZ2VfdCBtLCBib29sZWFuX3QgYWNjZXNz ZWQsIGJvb2xlYW5fdCBtb2RpZmllZCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2Vu dHJ5X3QgcHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdF9lbnRyeV90ICpwdGU7CisJcG1h cF90IHBtYXA7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9 IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RP X1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6CisJVEFJTFFfRk9S RUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYp OworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJIG1kX2dlbiA9IG0tPm1kLnB2X2dl bjsKKwkJCSByd19ydW5sb2NrKGxvY2spOworCQkJIFBNQVBfTE9DSyhwbWFwKTsKKwkJCSByd19y bG9jayhsb2NrKTsKKwkJCSBpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCSBQTUFQ X1VOTE9DSyhwbWFwKTsKKwkJCQkgZ290byByZXN0YXJ0OworCQkJIH0KKwkJfQorCQlwdGUgPSBw bWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlpZiAobW9kaWZpZWQpIHsKKwkJCXJ2ID0gcHRl X3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKTsKKwkJCWlmIChhY2Nl c3NlZCkKKwkJCQlydiA9IHJ2ICYmIHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19yZWYocHRl KTsKKwkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAm JiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCWlmIChydikK KwkJCWdvdG8gb3V0OworCX0KKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkg eworCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFD SChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOwor CQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47 CisJCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQkJ UE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmIChtZF9nZW4gIT0g bS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4pIHsKKwkJCQkJ UE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAobW9k aWZpZWQpIHsKKwkJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVf dGVzdChwdGUsIFBURV9STyk7CisJCQkJaWYgKGFjY2Vzc2VkKQorCQkJCQlydiA9IHJ2ICYmIHB0 ZV9pc192YWxpZChwdGUpICYmCisJCQkJCSAgICBwdGVfaXNfcmVmKHB0ZSk7CisJCQl9IGVsc2Ug aWYgKGFjY2Vzc2VkKSB7CisJCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCSAgICBw dGVfaXNfcmVmKHB0ZSk7CisJCQl9CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCWlmIChydikK KwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyd19ydW5sb2NrKGxvY2spOworCXJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChydik7Cit9CisKKworLyoKKyAqCXBt YXBfaXNfbW9kaWZpZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZp ZWQgcGh5c2ljYWwgcGFnZSB3YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor ICovCitib29sZWFuX3QKK3BtYXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfbW9k aWZpZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBw YWdlIGlzIG5vdCBleGNsdXNpdmUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJl CisJICogY29uY3VycmVudGx5IHNldCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMs IGlmIFBHQV9XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBz ZXQuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYgKCF2 bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJ CXJldHVybiAoRkFMU0UpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFwcGluZ3MobSwgRkFM U0UsIFRSVUUpKTsKK30KKworLyoKKyAqCXBtYXBfaXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJl dHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdp YmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFi bGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIpCit7CisJcGRfZW50cnlfdCAqcGRlOwor CXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9IEZBTFNFOworCVBNQVBf TE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlpZiAocGRlICE9IE5V TEwgJiYgKnBkZSAhPSAwKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgYWRkcik7CisJCXJ2ID0gKCpwdGUgPT0gMCkgfHwgKCpwdGUgPT0gUFRFX0cpOworCX0K KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfaXNf cmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBw aHlzaWNhbCBwYWdlIHdhcyByZWZlcmVuY2VkCisgKglpbiBhbnkgcGh5c2ljYWwgbWFwcy4KKyAq LworYm9vbGVhbl90CitwbWFwX2lzX3JlZmVyZW5jZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfcmVm ZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlyZXR1cm4gKHBtYXBfcGFn ZV90ZXN0X21hcHBpbmdzKG0sIFRSVUUsIEZBTFNFKSk7Cit9CisKKy8qCisgKglBcHBseSB0aGUg Z2l2ZW4gYWR2aWNlIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYWRkcmVzc2VzIHdpdGhpbiB0 aGUKKyAqCWdpdmVuIHBtYXAuICBEZXBlbmRpbmcgb24gdGhlIGFkdmljZSwgY2xlYXIgdGhlIHJl ZmVyZW5jZWQgYW5kL29yCisgKgltb2RpZmllZCBmbGFncyBpbiBlYWNoIG1hcHBpbmcgYW5kIHNl dCB0aGUgbWFwcGVkIHBhZ2UncyBkaXJ0eSBmaWVsZC4KKyAqLwordm9pZAorcG1hcF9hZHZpc2Uo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCBpbnQgYWR2aWNl KQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZSwgb2xk cGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXZtX3BhZ2Vf dCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkLCBwdl9saXN0c19sb2NrZWQ7CisKKwlpZiAoYWR2 aWNlICE9IE1BRFZfRE9OVE5FRUQgJiYgYWR2aWNlICE9IE1BRFZfRlJFRSkKKwkJcmV0dXJuOwor CisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZBTFNF OworCVBNQVBfTE9DSyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7 CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgewor CQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwg c3ZhKQorCQkJCXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0g KHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25l eHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCQlvbGRw ZGUgPSAqcGRlOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSAwKQorCQkJY29udGludWU7 CisJCWVsc2UgaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVz dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIXB2X2xpc3Rz X2xvY2tlZCkgeworCQkJCXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJaWYgKCFyd190cnlf cmxvY2soJnB2aF9nbG9iYWxfbG9jaykpIHsKKwkJCQkJaWYgKGFueWNoYW5nZWQpCisJCQkJCQlw bWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCQkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJ CX0KKwkJCWxvY2sgPSBOVUxMOworCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAs IHBkZSwgc3ZhLCAmbG9jaykpIHsKKwkJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCQlyd193dW5s b2NrKGxvY2spOworCisJCQkJLyoKKwkJCQkgKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRl c3Ryb3llZC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVu bGVzcyB0aGUgcGFnZSBtYXBwaW5ncyBhcmUgd2lyZWQsIHJlbW92ZSB0aGUKKwkJCSAqIG1hcHBp bmcgdG8gYSBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVudAorCQkJICogYWNjZXNzIG1h eSByZXByb21vdGUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBwYWdlCisJCQkgKiB0YWJsZSBwYWdl IGlzIGZ1bGx5IHBvcHVsYXRlZCwgdGhpcyByZW1vdmFsIG5ldmVyCisJCQkgKiBmcmVlcyBhIHBh Z2UgdGFibGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykp IHsKKwkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOworCQkJCUtBU1NFUlQocHRl X3Rlc3QocHRlLCBQVEVfVkFMSUQpLAorCQkJCSAgICAoInBtYXBfYWR2aXNlOiBpbnZhbGlkIFBU RSIpKTsKKwkJCQlwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsICpwZGUsIE5VTEwsCisJ CQkJICAgICZsb2NrKTsKKwkJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwkJCX0KKwkJCWlmIChsb2Nr ICE9IE5VTEwpCisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJfQorCQkvKgorCQkgKiBMaW1pdCBv dXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmEgcmVwcmVzZW50ZWQKKwkJICogYnkg dGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBy YW5nZSBiZWluZyB3cml0ZSBwcm90ZWN0ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkK KwkJCXZhX25leHQgPSBldmE7CisKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBz dmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJ CQlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8ICFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEKSkK KwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkg ICAgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQkJCWlmIChhZHZpY2UgPT0gTUFEVl9ET05U TkVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBGdXR1cmUgY2FsbHMgdG8gcG1hcF9pc19tb2RpZmll ZCgpCisJCQkJCSAqIGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyB0aGUgcGFnZQorCQkJCQkgKiBk aXJ0eSBub3cuCisJCQkJCSAqLworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkgICAg VExCTE9fUFRFX1RPX1BBKCpwdGUpKTsKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQl9CisJ CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EIHwgUFRFX1JFRik7CisJCQl9IGVsc2UgaWYg KHB0ZV9pc19yZWYocHRlKSkKKwkJCQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgUFRFX1JFRik7CisJ CQllbHNlCisJCQkJY29udGludWU7CisJCQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRykpCisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJCWVsc2UKKwkJCQlhbnljaGFuZ2Vk ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAoYW55Y2hhbmdlZCkKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs bChwbWFwKTsKKwlpZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9i YWxfbG9jayk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ2xlYXIgdGhl IG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor cG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsK KwlwbWFwX3QgcG1hcDsKKwlwdl9lbnRyeV90IG5leHRfcHYsIHB2OworCXBkX2VudHJ5X3Qgb2xk cGRlLCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXN0cnVjdCByd2xvY2sgKmxv Y2s7CisJdm1fb2Zmc2V0X3QgdmE7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKworCUtBU1NFUlQo KG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2Rp Znk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0FTU0VSVF9XTE9D S0VEKG0tPm9iamVjdCk7CisJS0FTU0VSVCghdm1fcGFnZV94YnVzaWVkKG0pLAorCSAgICAoInBt YXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGV4Y2x1c2l2ZSBidXNpZWQiLCBtKSk7CisKKwkv KgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR0FfV1JJVEVBQkxFLCB0aGVuIG5vIFBURXMgY2Fu IGhhdmUgUFRFX0Qgc2V0LgorCSAqIElmIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBp cyBsb2NrZWQgYW5kIHRoZSBwYWdlIGlzIG5vdAorCSAqIHdyaXRlIGJ1c2llZCwgdGhlbiBQR0Ff V1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgobS0+YWZs YWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd193bG9jayhsb2NrKTsKK3Jlc3RhcnQ6 CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFw cGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBu ZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1h cCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJ CQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9 IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0 OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2 YSk7CisJCW9sZHBkZSA9ICpwZGU7CisJCWlmICghcGRlX3Rlc3QocGRlLCBQVEVfUk8pKSB7CisJ CQlpZiAocG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jaykpIHsKKwkJ CQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCQkvKgorCQkJCQkgKiBXcml0 ZSBwcm90ZWN0IHRoZSBtYXBwaW5nIHRvIGEKKwkJCQkJICogc2luZ2xlIHBhZ2Ugc28gdGhhdCBh IHN1YnNlcXVlbnQKKwkJCQkJICogd3JpdGUgYWNjZXNzIG1heSByZXByb21vdGUuCisJCQkJCSAq LworCQkJCQl2YSArPSBWTV9QQUdFX1RPX1BIWVMobSkgLQorCQkJCQkgICBUTEJMT19QREVfVE9f UEEob2xkcGRlKTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJCQlv bGRwdGUgPSAqcHRlOworCQkJCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9WQUxJRCkpIHsK KwkJCQkJCXdoaWxlICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwKKwkJCQkJCSAgICBvbGRwdGUs CisJCQkJCQkgICAgKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKQorCQkJCQkJCW9sZHB0ZSA9 ICpwdGU7CisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcCwgdmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHBt YXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxP Q0socG1hcCkpIHsKKwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXB2aF9nZW4gPSBwdmgt PnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQly d193bG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8IG1kX2dlbiAh PSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3Rh cnQ7CisJCQl9CisJCX0KKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT U0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUpLCAoInBtYXBfY2xlYXJfbW9kaWZ5OiBmb3VuZCIK KwkJICAgICIgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLCBtKSk7CisJCXB0ZSA9 IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVzdChwdGUsIFBU RV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgUFRFX0QpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0 IHJvdXRpbmVzIGZvbGxvdworICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVt b3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1 cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBp bnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVh bCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hlZCBmb3IgNjQgYml0LgorICovCit2 b2lkICoKK3BtYXBfbWFwZGV2KHZtX3BhZGRyX3QgcGEsIHZtX3NpemVfdCBzaXplKQoreworCisJ cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1RfVU5DQUNIRUQocGEpKTsKK30KKwor dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7CisK KwkvKiBOb3RoaW5nIHRvIGRvIGZvciBtaXBzNjQuICovCit9CisKKy8qCisgKiBTZXRzIHRoZSBt ZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBf cGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCS8qCisJ ICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQg aW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBjcmVhdGVkLgorCSAqLworCW0tPm1kLnB2 X21lbWF0dHIgPSBtYTsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rp b24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCSAqIGFyZSBlc3RhYmxpc2hl ZC4gIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisJICog bmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBtYWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1h cHBpbmdzCisJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3aXRoIG1pcHNfaWNhY2hl X3N5bmNfYWxsKCkgYW5kCisJICogbWlwc19kY2FjaGVfd2JpbnZfYWxsKCkpIGFuZCBtb3N0IGxp a2VseSBpbnZhbGlkYXRlIFRMQiBlbnRyaWVzIGZvcgorCSAqIGFueSBvZiB0aGUgY3VycmVudCBt YXBwaW5ncyBpdCBtb2RpZmllcy4KKwkgKi8KKwlpZiAoVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xp c3QpICE9IE5VTEwpCisJCXBhbmljKCJDYW4ndCBjaGFuZ2UgbWVtYXR0ciBvbiBwYWdlIHdpdGgg ZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBm b3IgbWluY29yZQorICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgYWRkciwgdm1fcGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXBkX2VudHJ5X3QgKnBkZXA7CisJ cHRfZW50cnlfdCAqcHRlcCwgcHRlOworCXZtX3BhZGRyX3QgcGE7CisJaW50IHZhbDsKKworCVBN QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlp ZiAocGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJ CQlwdGUgPSAocHRfZW50cnlfdCkqcGRlcDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7 CisJCQl2YWwgPSBNSU5DT1JFX1NVUEVSOworCQl9IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRl X3RvX3B0ZShwZGVwLCBhZGRyKTsKKwkJCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAw OworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9IDA7CisJCX0KKwl9IGVs c2UgeworCQlwdGUgPSAwOworCQlwYSA9IDA7CisJCXZhbCA9IDA7CisJfQorCWlmIChwdGVfaXNf dmFsaWQoJnB0ZSkpIHsKKwkJdmFsIHw9IE1JTkNPUkVfSU5DT1JFOworCQlpZiAocHRlX3Rlc3Qo JnB0ZSwgUFRFX0QpKQorCQkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBNSU5DT1JFX01PRElG SUVEX09USEVSOworCQlpZiAocHRlX2lzX3JlZigmcHRlKSkKKwkJCXZhbCB8PSBNSU5DT1JFX1JF RkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1J TkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAg ICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYK KwkgICAgcHRlX3Rlc3QoJnB0ZSwgUFRFX01BTkFHRUQpKSB7CisJCS8qIEVuc3VyZSB0aGF0ICJQ SFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdlLiAqLworCQlpZiAodm1f cGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJCQlnb3RvIHJldHJ5Owor CX0gZWxzZQorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3BhKTsKKwlQTUFQX1VOTE9DSyhwbWFw KTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBfYWN0aXZhdGUoc3RydWN0IHRocmVh ZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJc3RydWN0IHByb2MgKnAgPSB0ZC0+ dGRfcHJvYzsKKwl1X2ludCBjcHVpZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlwbWFwID0g dm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1cnBtYXAp OworCWNwdWlkID0gUENQVV9HRVQoY3B1aWQpOworCisJaWYgKG9sZHBtYXApCisJCUNQVV9DTFJf QVRPTUlDKGNwdWlkLCAmb2xkcG1hcC0+cG1fYWN0aXZlKTsKKwlDUFVfU0VUX0FUT01JQyhjcHVp ZCwgJnBtYXAtPnBtX2FjdGl2ZSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0ZCA9 PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsKKwkJ bWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbY3B1aWRdLmFzaWQpOworCX0KKworCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKwordm9pZAorcG1hcF9z eW5jX2ljYWNoZShwbWFwX3QgcG0sIHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc3opCit7Cit9 CisKKy8qCisgKglJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBn aXZlbiBtYXBwaW5nIGlmIGEKKyAqCWRpZmZlcmVudCBhbGlnbm1lbnQgbWlnaHQgcmVzdWx0IGlu IG1vcmUgc3VwZXJwYWdlIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX2FsaWduX3N1cGVycGFn ZSh2bV9vYmplY3RfdCBvYmplY3QsIHZtX29vZmZzZXRfdCBvZmZzZXQsCisgICAgdm1fb2Zmc2V0 X3QgKmFkZHIsIHZtX3NpemVfdCBzaXplKQoreworCXZtX29mZnNldF90IHN1cGVycGFnZV9vZmZz ZXQ7CisKKwlpZiAoc2l6ZSA8IE5CU0VHKQorCQlyZXR1cm47CisJaWYgKG9iamVjdCAhPSBOVUxM ICYmIChvYmplY3QtPmZsYWdzICYgT0JKX0NPTE9SRUQpICE9IDApCisJCW9mZnNldCArPSBwdG9h KG9iamVjdC0+cGdfY29sb3IpOworCXN1cGVycGFnZV9vZmZzZXQgPSBvZmZzZXQgJiBTRUdNQVNL OworCWlmIChzaXplIC0gKChOQlNFRyAtIHN1cGVycGFnZV9vZmZzZXQpICYgU0VHTUFTSykgPCBO QlNFRyB8fAorCSAgICAoKmFkZHIgJiBTRUdNQVNLKSA9PSBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQly ZXR1cm47CisJaWYgKCgqYWRkciAmIFNFR01BU0spIDwgc3VwZXJwYWdlX29mZnNldCkKKwkJKmFk ZHIgPSAoKmFkZHIgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0OworCWVsc2UKKwkJKmFk ZHIgPSAoKCphZGRyICsgU0VHTUFTSykgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor fQorCisjaWZkZWYgRERCCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7 CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9j ICpwOworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisK KwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsK KwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7 CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNl ID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJ cmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBl bHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6 JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIs IHBtYXAtPnBtX2FzaWRbMF0uYXNpZCwKKwkgICAgcG1hcC0+cG1fYXNpZFswXS5nZW4pOworCWZv ciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9lbnRyeV90ICpwZHBlOworCQlwdF9l bnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJCXBkcGUgPSAocGRfZW50cnlfdCAq KXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwor CQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsKKwkJZm9yIChqID0gMDsgaiA8IE5Q REVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAqKXBkcGVbal07CisJCQlpZiAocGRl ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmludGYoIlx0WyU0ZF0gJXBcbiIsIGos IHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKKwkJCQlwdGUgPSBwZGVb a107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfaXNfdmFsaWQoJnB0ZSkpCisJCQkJCWNvbnRp bnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylp IDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChrIDw8IFBBR0VfU0hJRlQpOworCQkJ CWRiX3ByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAlOGp4IHBhOiVqeFxuIiwKKwkJCQkg ICAgICAgaywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClwdGUsICh1aW50bWF4X3QpcGEpOworCQkJ fQorCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9p ZCBwYWRzKHBtYXBfdCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKwor LyogcHJpbnQgYWRkcmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBf dCBwbSkKK3sKKwl1bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYg KHBtID09IGtlcm5lbF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQlpZiAocG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7 IGorKykgeworCQkJCXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJ CQkJaWYgKHBtID09IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVl OworCQkJCWlmIChwbSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VS X0FERFJFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOwor CQkJCWlmIChwdGVfaXNfdmFsaWQocHRlcCkpCisJCQkJCXByaW50ZigiJXg6JXggIiwgdmEsICoo aW50ICopcHRlcCk7CisJCQl9CisKK30KKwordm9pZAorcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3Qg cGEpCit7CisJcmVnaXN0ZXIgcHZfZW50cnlfdCBwdjsKKwl2bV9wYWdlX3QgbTsKKworCXByaW50 ZigicGEgJXgiLCBwYSk7CisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJZm9yIChwdiA9IFRB SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbGlzdCkpIHsKKwkJcHJpbnRmKCIgLT4gcG1hcCAlcCwgdmEgJXgiLCAodm9pZCAqKXB2LT5w dl9wbWFwLCBwdi0+cHZfdmEpOworCQlwYWRzKHB2LT5wdl9wbWFwKTsKKwl9CisJcHJpbnRmKCIg Iik7Cit9CisKKy8qIE4vQyAqLworI2VuZGlmCisKKworLyoKKyAqIEFsbG9jYXRlIFRMQiBhZGRy ZXNzIHNwYWNlIHRhZyAoY2FsbGVkIEFTSUQgb3IgVExCUElEKSBhbmQgcmV0dXJuIGl0LgorICog SXQgdGFrZXMgYWxtb3N0IGFzIG11Y2ggb3IgbW9yZSB0aW1lIHRvIHNlYXJjaCB0aGUgVExCIGZv ciBhCisgKiBzcGVjaWZpYyBBU0lEIGFuZCBmbHVzaCB0aG9zZSBlbnRyaWVzIGFzIGl0IGRvZXMg dG8gZmx1c2ggdGhlIGVudGlyZSBUTEIuCisgKiBUaGVyZWZvcmUsIHdoZW4gd2UgYWxsb2NhdGUg YSBuZXcgQVNJRCwgd2UganVzdCB0YWtlIHRoZSBuZXh0IG51bWJlci4gV2hlbgorICogd2UgcnVu IG91dCBvZiBudW1iZXJzLCB3ZSBmbHVzaCB0aGUgVExCLCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRp b24gY291bnQKKyAqIGFuZCBzdGFydCBvdmVyLiBBU0lEIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGtl cm5lbCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2FzaWRfYWxsb2MocG1hcCkKKwlwbWFw X3QgcG1hcDsKK3sKKwlpZiAocG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgIT0g UE1BUF9BU0lEX1JFU0VSVkVEICYmCisJICAgIHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQp XS5nZW4gPT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSk7CisJZWxzZSB7CisJCWlmIChQQ1BV X0dFVChuZXh0X2FzaWQpID09IHBtYXBfbWF4X2FzaWQpIHsKKwkJCXRsYl9pbnZhbGlkYXRlX2Fs bF91c2VyKE5VTEwpOworCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLAorCQkJICAgIChQQ1BV X0dFVChhc2lkX2dlbmVyYXRpb24pICsgMSkgJiBBU0lER0VOX01BU0spOworCQkJaWYgKFBDUFVf R0VUKGFzaWRfZ2VuZXJhdGlvbikgPT0gMCkgeworCQkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlv biwgMSk7CisJCQl9CisJCQlQQ1BVX1NFVChuZXh0X2FzaWQsIDEpOwkvKiAwIG1lYW5zIGludmFs aWQgKi8KKwkJfQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCA9IFBDUFVf R0VUKG5leHRfYXNpZCk7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSBQ Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pOworCQlQQ1BVX1NFVChuZXh0X2FzaWQsIFBDUFVfR0VU KG5leHRfYXNpZCkgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyBwdF9lbnRyeV90Citpbml0X3B0ZV9w cm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlw dF9lbnRyeV90IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BST1RfV1JJVEUpKQorCQlydyA9IFBU RV9WQUxJRCB8IFBURV9STzsKKwllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkg PT0gMCkgeworCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisJCQlydyA9IFBU RV9WQUxJRCB8IFBURV9EOworCQllbHNlCisJCQlydyA9IFBURV9WQUxJRDsKKwl9IGVsc2Ugewor CQkvKgorCQkgKiBOZWVkbid0IGVtdWxhdGUgYSByZWZlcmVuY2UvbW9kaWZpZWQgYml0IGZvciB1 bm1hbmFnZWQKKwkJICogcGFnZXMuCisJCSAqLworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwor CQlwdGVfcmVmX3NldCgmcncpOworCX0KKworCXJldHVybiAocncpOworfQorCisvKgorICogcG1h cF9lbXVsYXRlX21vZGlmaWVkIDogZG8gZGlydHkgYml0IGVtdWxhdGlvbgorICoKKyAqIE9uIFNN UCwgdXBkYXRlIGp1c3QgdGhlIGxvY2FsIFRMQiwgb3RoZXIgQ1BVcyB3aWxsIHVwZGF0ZSB0aGVp cgorICogVExCcyBmcm9tIFBURSBsYXppbHksIGlmIHRoZXkgZ2V0IHRoZSBleGNlcHRpb24uCisg KiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNlc3MsIDEgaWYgdGhlIHBhZ2UgaXMgcmVhZCBvbmx5 IGFuZCB3ZQorICogbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfbW9kaWZp ZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlw dF9lbnRyeV90ICpwdGU7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1h cCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCXB0ZSA9IChwdF9lbnRy eV90ICopcGRlOworCWVsc2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlm IChwdGUgPT0gTlVMTCkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu ZCBQVEUiKTsKKyNpZmRlZiBTTVAKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg Q1BVIGNoYW5nZWQgbS1iaXQgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0 KHB0ZSwgUFRFX0QpKSB7CisJCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZQorCWlmICghcHRlX2lzX3ZhbGlk KHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwg KnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgor CWlmIChwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJl dHVybiAoMSk7CisJfQorCXB0ZV9hdG9taWNfc2V0KHB0ZSwgUFRFX0QpOyAvKiBtYXJrIGl0IHJl ZmVyZW5jZWQgYW5kIG1vZGlmaWVkICovCisJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7CisJdGxi X3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VE KSkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogdW5tYW5hZ2VkIHBhZ2UiKTsKKwlQ TUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcG1hcF9lbXVsYXRl X3JlZmVyZW5jZWQ6IGRvIHJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisgKgorICogUmV0dXJucyAw IGluIGNhc2Ugb2Ygc3VjY2Vzcy4gIFJldHVybnMgMSBpZiB3ZSBuZWVkIHRvIGZhdWx0LgorICov CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKQorCQlyZXR1cm4gKDEpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gTlVMTCkg eworCQkvKiBJbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQor CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilw ZGU7CisJfSBlbHNlCisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRl ID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIHRhYmxlLiAqLworCQlnb3RvIGRvZmF1bHQ7 CisJfQorCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJLyogSW52YWxpZCBQVEUuICovCisJ CWdvdG8gZG9mYXVsdDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGFscmVhZHkgbWFya2VkIGJ5 IG90aGVyIENQVS4gICovCisJaWYgKCFwdGVfaXNfcmVmKHB0ZSkpCisJCXB0ZV9yZWZfYXRvbWlj X3NldChwdGUpOworCisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJUE1BUF9VTkxPQ0so cG1hcCk7CisKKwlyZXR1cm4gKDApOworCitkb2ZhdWx0OgorCVBNQVBfVU5MT0NLKHBtYXApOwor CXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSkK K3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3IgKHB2ID0gVEFJ TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbmV4dCkpIHsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwg UEFHRV9TSVpFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcC5j IGIvc3lzL21pcHMvbWlwcy9wbWFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9wbWFwLmMKKysrIGIv c3lzL21pcHMvbWlwcy9wbWFwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJv Yy5oPgogI2luY2x1ZGUgPHN5cy9yd2xvY2suaD4KICNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNp bmNsdWRlIDxzeXMvX3R5cGVzLmg+CiAjaWZkZWYgU01QCiAjaW5jbHVkZSA8c3lzL3NtcC5oPgog I2Vsc2UKQEAgLTIzMiw3ICsyMzMsNyBAQAogCXN5c20gPSAmc3lzbWFwX2xtZW1bY3B1XTsKIAlz eXNtLT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YSA9IHN5c20tPmJhc2U7Ci0JbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRF X1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAkqcHRl ID0gbnB0ZTsKIAlzeXNtLT52YWxpZDEgPSAxOwpAQCAtMjU0LDEwICsyNTUsMTAgQEAKIAlzeXNt LT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YTEgPSBzeXNtLT5iYXNlOwogCXZhMiA9IHN5c20tPmJh c2UgKyBQQUdFX1NJWkU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19D QUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBo eXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdmExKTsKIAkqcHRlID0gbnB0ZTsKLQlucHRlID0gVExCTE9f UEFfVE9fUEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBU RV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YTIpOwogCSpw dGUgPSBucHRlOwogCXN5c20tPnZhbGlkMSA9IDE7CkBAIC01NTYsOSArNTU3LDE1IEBACiAJbXNn YnVmaW5pdChtc2didWZwLCBtc2didWZzaXplKTsKIAogCS8qCi0JICogU3RlYWwgdGhyZWFkMCBr c3RhY2suCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2suICBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKiBYWFggVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSBv ZiBnZXR0aW5nIGFsaWduZWQgbWVtb3J5CisJICogd2l0aCBwbWFwX3N0ZWFsX21lbW9yeSgpLgog CSAqLwotCWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9T SElGVCk7CisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgKyBLU1RB Q0tfR1VBUkRfUEFHRVMpIFwKKwkJCQkJPDwgUEFHRV9TSElGVCk7CisJa3N0YWNrMCA9IHJvdW5k dXAyKGtzdGFjazAsIChLU1RBQ0tfUEFHRV9TSVpFICogMikpOwogCiAJdmlydHVhbF9hdmFpbCA9 IFZNX01JTl9LRVJORUxfQUREUkVTUzsKIAl2aXJ0dWFsX2VuZCA9IFZNX01BWF9LRVJORUxfQURE UkVTUzsKQEAgLTYwNSw2ICs2MTIsNyBAQAogCiAJVEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7 CiAJbS0+bWQucHZfZmxhZ3MgPSAwOworCW0tPm1kLnB2X21lbWF0dHIgPSBWTV9NRU1BVFRSX0RF RkFVTFQ7CiB9CiAKIC8qCkBAIC04MDEsNyArODA5LDcgQEAKIAlwdGVwID0gcG1hcF9wdGUocG1h cCwgdmEpOwogCWlmIChwdGVwICE9IE5VTEwpIHsKIAkJcHRlID0gKnB0ZXA7Ci0JCWlmIChwdGVf dGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CisJCWlmIChw dGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpICYmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAog CQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgewogCQkJcHRlX3BhID0gVExCTE9f UFRFX1RPX1BBKHB0ZSk7CiAJCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcHRlX3Bh LCAmcGEpKQpAQCAtODM0LDkgKzg0Miw5IEBACiAKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdmEpOwogCW9wdGUgPSAqcHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0 ciB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8 IGF0dHIgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCSpwdGUgPSBucHRlOwotCWlmIChw dGVfdGVzdCgmb3B0ZSwgUFRFX1YpICYmIG9wdGUgIT0gbnB0ZSkKKwlpZiAocHRlX3Rlc3QoJm9w dGUsIFBURV9WQUxJRCkgJiYgb3B0ZSAhPSBucHRlKQogCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5l bF9wbWFwLCB2YSwgbnB0ZSk7CiB9CiAKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCQkJaWYgKG0t Pm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQ R0FfUkVGRVJFTkNFRCk7CiAJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX1JFRjsKLQkJ CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJCQlUQUlMUV9S RU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJTFFfRU1QVFko Jm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFC TEUpOwogCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBiaXQ7CkBAIC0xNjI3LDkgKzE2 MzUsOSBAQAogCXB2X2VudHJ5X3QgcHY7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkg eworCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKHBt YXAgPT0gUFZfUE1BUChwdikgJiYgdmEgPT0gcHYtPnB2X3ZhKSB7Ci0JCQlUQUlMUV9SRU1PVkUo JnB2aC0+cHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xp c3QsIHB2LCBwdl9uZXh0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTY3MSw3ICsxNjc5LDcg QEAKIAlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAlpZiAoKHB2ID0gZ2V0X3B2 X2VudHJ5KHBtYXAsIFRSVUUpKSAhPSBOVUxMKSB7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQlyZXR1cm4gKFRSVUUpOwog CX0gZWxzZQogCQlyZXR1cm4gKEZBTFNFKTsKQEAgLTE3NDQsNyArMTc1Miw3IEBACiAJLyoKIAkg KiBJZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRoaXMgYWRkcmVzcywganVzdCBza2lwIGl0IQogCSAq LwotCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVikpCisJaWYgKCFwdGVfdGVzdChwdHEsIFBURV9W QUxJRCkpCiAJCXJldHVybjsKIAogCSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZh LCAqcGRlKTsKQEAgLTE4MTAsNyArMTgxOCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJ CSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7 CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2YSAhPSB2YV9u ZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKIAkJCQkJ dmEgPSB2YV9uZXh0OwpAQCAtMTg2OCw3ICsxODc2LDcgQEAKIAkJICogSWYgaXQncyBsYXN0IG1h cHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKIAkJICogdGhlIHBhZ2UgYmVpbmcgZGVz dHJveWVkCiAJIAkgKi8KLQkJaWYgKFRBSUxRX05FWFQocHYsIHB2X2xpc3QpID09IE5VTEwpCisJ CWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBOVUxMKQogCQkJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCiAJCXBtYXAtPnBtX3N0YXRz LnJlc2lkZW50X2NvdW50LS07CkBAIC0xODk3LDcgKzE5MDUsNyBAQAogCQl9CiAJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CiAKLQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOwogCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSk7CiAJCWZy ZWVfcHZfZW50cnkocG1hcCwgcHYpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKQEAgLTE5NTksNyAr MTk2Nyw3IEBACiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9 IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewogCQkJcGJpdHMgPSAq cHRlOwotCQkJaWYgKCFwdGVfdGVzdCgmcGJpdHMsIFBURV9WKSB8fCBwdGVfdGVzdCgmcGJpdHMs CisJCQlpZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdCgmcGJpdHMs CiAJCQkgICAgUFRFX1JPKSkgewogCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKQEAgLTIwNzEsNyArMjA3OSw3IEBACiAJ LyoKIAkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwgbXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdp cmluZyBjaGFuZ2UuCiAJICovCi0JaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikgJiYgb3Bh ID09IHBhKSB7CisJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQpICYmIG9wYSA9PSBw YSkgewogCQkvKgogCQkgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0cy4gV2UgZG9u J3Qgd29ycnkgYWJvdXQKIAkJICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lk ZW50IGFzIGxvbmcgYXMgdGhlcmUKQEAgLTIxMzUsNyArMjE0Myw3IEBACiAJCWlmIChwdiA9PSBO VUxMKQogCQkJcHYgPSBnZXRfcHZfZW50cnkocG1hcCwgRkFMU0UpOwogCQlwdi0+cHZfdmEgPSB2 YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJbmV3cHRl IHw9IFBURV9NQU5BR0VEOwogCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9STykpCiAJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKQEAgLTIxNjAsNyArMjE2OCw3IEBA CiAJICovCiAJaWYgKG9yaWdwdGUgIT0gbmV3cHRlKSB7CiAJCSpwdGUgPSBuZXdwdGU7Ci0JCWlm IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1ZBTElEKSkgewogCQkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkgJiYg b3BhICE9IHBhKSB7CiAJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKIAkJ CQkJdm1fcGFnZV9hZmxhZ19zZXQob20sIFBHQV9SRUZFUkVOQ0VEKTsKQEAgLTIyNjgsNyArMjI3 Niw3IEBACiAJfQogCiAJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOwotCWlmIChwdGVfdGVzdChw dGUsIFBURV9WKSkgeworCWlmIChwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpIHsKIAkJaWYgKG1w dGUgIT0gTlVMTCkgewogCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwogCQkJbXB0ZSA9IE5VTEw7CkBA IC0yMjk4LDcgKzIzMDYsNyBAQAogCS8qCiAJICogTm93IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBS TyBwcm90ZWN0aW9uCiAJICovCi0JKnB0ZSA9IFBURV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkg fCBQVEVfVjsKKwkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJ RDsKIAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApCiAJCSpwdGUgfD0gUFRF X01BTkFHRUQ7CiAKQEAgLTIzNTYsNyArMjM2NCw3IEBACiAJCWNwdSA9IFBDUFVfR0VUKGNwdWlk KTsKIAkJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCQkvKiBTaW5jZSB0aGlzIGlzIGZvciB0 aGUgZGVidWdnZXIsIG5vIGxvY2tzIG9yIGFueSBvdGhlciBmdW4gKi8KLQkJbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwYSkgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfAorCQlucHRlID0g VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfAog CQkgICAgUFRFX0c7CiAJCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCBzeXNtLT5iYXNlKTsK IAkJKnB0ZSA9IG5wdGU7CkBAIC0yNDg0LDcgKzI0OTIsNyBAQAogCQkJdmFfbmV4dCA9IGV2YTsK IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwg UFRFX1YpKQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJY29udGludWU7 CiAJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQogCQkJCXBhbmljKCJwbWFwX3Vud2lyZTog cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI3MTksNyArMjcyNyw3IEBACiAJICAgICgi cG1hcF9wYWdlX2V4aXN0c19xdWljazogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKIAly diA9IEZBTFNFOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKIAkJCXJ2 ID0gVFJVRTsKIAkJCWJyZWFrOwpAQCAtMjc3Miw3ICsyNzgwLDcgQEAKIAkJCQlLQVNTRVJUKHBk ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKIAkJCQkgICAgKCJwbWFwX3JlbW92ZV9wYWdlczogcGRl IikpOwogCQkJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7Ci0JCQkJaWYg KCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElE KSkKIAkJCQkJcGFuaWMoInBtYXBfcmVtb3ZlX3BhZ2VzOiBiYWQgcHRlIik7CiAJCQkJdHB0ZSA9 ICpwdGU7CiAKQEAgLTI4MDIsNyArMjgxMCw3IEBACiAJCQkJcHZfZW50cnlfY291bnQtLTsKIAkJ CQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNrOwogCQkJCXBtYXAtPnBtX3N0YXRzLnJlc2lk ZW50X2NvdW50LS07Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlz dCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCQkJ aWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJCQkJdm1fcGFnZV9hZmxhZ19jbGVh cihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwg KnBkZSk7CkBAIC0yODMzLDcgKzI4NDEsNyBAQAogCQlyZXR1cm4gKHJ2KTsKIAogCXJ3X2Fzc2Vy dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VEKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+ bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0 LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwog CQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg2Myw3ICsyODcxLDcgQEAK IAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCiAJCXJldHVybiAoY291bnQp OwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5t ZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3Qs IHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJ CXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODk3LDExICsyOTA1LDExIEBA CiAJaWYgKCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUp ID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9G T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYs ICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1B UF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwotCQlLQVNT RVJUKHB0ZSAhPSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1YpLAorCQlLQVNTRVJUKHB0ZSAh PSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKIAkJICAgICgicGFnZSBvbiBwdl9s aXN0IGhhcyBubyBwdGUiKSk7CiAJCXBiaXRzID0gKnB0ZTsKIAkJaWYgKHB0ZV90ZXN0KCZwYml0 cywgUFRFX0QpKSB7CkBAIC0zMDQwLDcgKzMwNDgsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZv ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr LAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9N QU5BR0VEIHwgUFRFX1YpKSB7CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQgfCBQ VEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlk YXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25leHQ7CkBAIC0zMTA2LDcg KzMxMTQsNyBAQAogCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKIAkJcmV0 dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZt LT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7 CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0zMjA4LDcgKzMyMTYsNyBA QAogcmV0cnk6CiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIGFkZHIpOwogCXB0ZSA9IChwdGVwICE9 IE5VTEwpID8gKnB0ZXAgOiAwOwotCWlmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKSB7CisJaWYg KCFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKSB7CiAJCXZhbCA9IDA7CiAJCWdvdG8gb3V0Owog CX0KQEAgLTMzNDUsNyArMzM1Myw3IEBACiAjZW5kaWYKIAkJCWZvciAoayA9IDA7IGsgPCBOUFRF UEc7IGsrKykgewogCQkJCXB0ZSA9IHBkZVtrXTsKLQkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90 ZXN0KCZwdGUsIFBURV9WKSkKKwkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90ZXN0KCZwdGUsIFBU RV9WQUxJRCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7 CiAJCQkJdmEgPSAoKHVfbG9uZylpIDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChr IDw8IFBBR0VfU0hJRlQpOwpAQCAtMzM5MywxNSArMzQwMSwxNSBAQAogCXB0X2VudHJ5X3Qgcnc7 CiAKIAlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCi0JCXJ3ID0gUFRFX1YgfCBQVEVfUk87 CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX1JPOwogCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9f VU5NQU5BR0VEKSA9PSAwKSB7CiAJCWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK LQkJCXJ3ID0gUFRFX1YgfCBQVEVfRDsKKwkJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJCWVs c2UKLQkJCXJ3ID0gUFRFX1Y7CisJCQlydyA9IFBURV9WQUxJRDsKIAl9IGVsc2UKIAkJLyogTmVl ZG4ndCBlbXVsYXRlIGEgbW9kaWZpZWQgYml0IGZvciB1bm1hbmFnZWQgcGFnZXMuICovCi0JCXJ3 ID0gUFRFX1YgfCBQVEVfRDsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAlyZXR1cm4gKHJ3 KTsKIH0KIApAQCAtMzQyNCwxMyArMzQzMiwxMyBAQAogCQlwYW5pYygicG1hcF9lbXVsYXRlX21v ZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwogI2lmZGVmIFNNUAogCS8qIEl0IGlzIHBvc3NpYmxl IHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdlZCBtLWJpdCAqLwotCWlmICghcHRlX3Rlc3QocHRl LCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwg UFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgewogCQl0bGJfdXBkYXRlKHBtYXAs IHZhLCAqcHRlKTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CiAJCXJldHVybiAoMCk7CiAJfQogI2Vs c2UKLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQor CWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQog CQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBpbnZhbGlkIHB0ZSIpOwogI2VuZGlmCiAJ aWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewpAQCAtMzQ0Niw2ICszNDU0LDE4IEBACiB9CiAK IC8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZAorICoKKyAqIFJlZmVyZW5jZSBiaXQgZW11 bGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbWFwIGltcGxlbWVudGF0aW9uLgorICov CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSkKK3sKKworCQlyZXR1cm4gKDEpOworfQorCisvKgogICoJUm91dGluZToJcG1hcF9rZXh0cmFj dAogICoJRnVuY3Rpb246CiAgKgkJRXh0cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFz c29jaWF0ZWQKQEAgLTM1MjIsMTcgKzM1NDIsMjYgQEAKIAogCWlmIChtICE9IE5VTEwpIHsKIAkJ Zm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9IFRB SUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25l eHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0Vf U0laRSk7CiAJCX0KIAl9CiB9CiAKKy8qCisgKiBTZXRzIHRoZSBtZW1vcnkgYXR0cmlidXRlIGZv ciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KIHZvaWQKIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2 bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQogewogCiAJLyoKKwkgKiBTZXQgdGhlIG1lbWF0 dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkgKiBQVEUg YXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9IG1hOwor CisJLyoKIAkgKiBJdCBhcHBlYXJzIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxs ZWQgYmVmb3JlIGFueSBtYXBwaW5ncwogCSAqIGZvciB0aGUgcGFnZSBhcmUgZXN0YWJsaXNoZWQu ICBJZiB0aGlzIGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKIAkgKiBuZWVkIHRvIHdhbGsg dGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKZGlmZiAt LWdpdCBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9t aW5pZHVtcF9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMK KysrIGIvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMKQEAgLTE3OSw3ICsxNzksNyBA QAogCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCQlLQVNTRVJUKHB0ZSAhPSBO VUxMLCAoInB0ZSBmb3IgJWp4IGlzIE5VTEwiLCAodWludG1heF90KXZhKSk7CiAJCWZvciAoaSA9 IDA7IGkgPCBOUFRFUEc7IGkrKykgewotCQkJaWYgKHB0ZV90ZXN0KCZwdGVbaV0sIFBURV9WKSkg eworCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlW2ldKSkgewogCQkJCXBhID0gVExCTE9fUFRFX1RP X1BBKHB0ZVtpXSk7CiAJCQkJaWYgKGlzX2R1bXBhYmxlKHBhKSkKIAkJCQkJZHVtcF9hZGRfcGFn ZShwYSk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYyBiL3N5cy9taXBzL21p cHMvbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jCisrKyBiL3N5cy9taXBz L21pcHMvbWFjaGRlcC5jCkBAIC0yODMsOSArMjgzLDkgQEAKICNlbmRpZgogCXByb2NfbGlua3Vw MCgmcHJvYzAsICZ0aHJlYWQwKTsKIAotCUtBU1NFUlQoKGtzdGFjazAgJiBQQUdFX01BU0spID09 IDAsCi0JCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnk6IDB4JTBs eCIsCi0JCShsb25nKWtzdGFjazApKTsKKwlLQVNTRVJUKChrc3RhY2swICYgKChLU1RBQ0tfUEFH RV9TSVpFICogMikgLSAxKSkgPT0gMCwKKwkJKCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEg cGFnZSAoMHglMGx4KSBib3VuZGFyeTogMHglMGx4IiwKKwkJKGxvbmcpKEtTVEFDS19QQUdFX1NJ WkUgKiAyKSwgKGxvbmcpa3N0YWNrMCkpOwogCXRocmVhZDAudGRfa3N0YWNrID0ga3N0YWNrMDsK IAl0aHJlYWQwLnRkX2tzdGFja19wYWdlcyA9IEtTVEFDS19QQUdFUzsKIAkvKiAKQEAgLTQ1OSw3 ICs0NTksNyBAQAogCSAqIFdlIHVzZSBhIHdpcmVkIHRsYiBpbmRleCB0byBkbyB0aGlzIG9uZS10 aW1lIG1hcHBpbmcuCiAJICovCiAJcGEgPSB2dG9waHlzKHBjcHUpOwotCXB0ZSA9IFBURV9EIHwg UFRFX1YgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOworCXB0ZSA9IFBURV9EIHwgUFRFX1ZBTElEIHwg UFRFX1JFRiB8IFBURV9HIHwgUFRFX0NfQ0FDSEU7CiAJdGxiX2luc2VydF93aXJlZChQQ1BVX1RM Ql9FTlRSWSwgKHZtX29mZnNldF90KXBjcHVwLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSkgfCBw dGUsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhICsgUEFHRV9TSVpFKSB8IHB0ZSk7CmRpZmYgLS1n aXQgYS9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMK LS0tIGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCisrKyBiL3N5cy9taXBzL21pcHMvZ2VuYXNz eW0uYwpAQCAtMTAyLDYgKzEwMiw5IEBACiBBU1NZTShUREZfQVNUUEVORElORywgVERGX0FTVFBF TkRJTkcpOwogQVNTWU0oTUFYQ09NTEVOLCBNQVhDT01MRU4pOwogQVNTWU0oTURURF9DT1AyVVNF RCwgTURURF9DT1AyVVNFRCk7CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKK0FTU1lNKEtTVEFD S19UTEJNQVNLX01BU0ssIEtTVEFDS19UTEJNQVNLX01BU0spOworI2VuZGlmCiAKIEFTU1lNKE1J UFNfS1NFRzBfU1RBUlQsIE1JUFNfS1NFRzBfU1RBUlQpOwogQVNTWU0oTUlQU19LU0VHMV9TVEFS VCwgTUlQU19LU0VHMV9TVEFSVCk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2V4Y2VwdGlv bi5TIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwotLS0gYS9zeXMvbWlwcy9taXBzL2V4Y2Vw dGlvbi5TCisrKyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKQEAgLTg1LDYgKzg1LDI4IEBA CiAgKi8KICNkZWZpbmUJSU5UUkNOVF9DT1VOVAkyNTYKIAorLyoKKyAqIEdlbmVyYWwgTUlQUyBD UFUgc3RhdGUgZm9yIGV4Y2VwdGlvbnM6CisgKgorICogRVBDIFJlZ2lzdGVyIHdpbGwgcG9pbnQg dG8gdGhlIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIGZhdWx0LCB1bmxlc3MgdGhlCisgKiBmYXVs dGluZyBpbnN0cnVjdGlvbiB3YXMgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4gIEluIHRoYXQgY2Fz ZSwgaXQgd2lsbAorICogcG9pbnQgdG8gdGhlIGJyYW5jaCBiZWZvcmUgdGhlIGJyYW5jaCBkZWxh eSBzbG90IGluc3RydWN0aW9uLgorICoKKyAqIFRoZSBjYXVzZSByZWdpc3RlciB3aWxsIGNvbnRh aW4gd2hhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiBhbmQgc29tZSBzdGF0ZQorICogYWJvdXQgdGhl IGludGVycnVwdC4KKyAqCisgKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNvbnRhaW5zIGluZm9ybWF0 aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIENQVSBzdWNoCisgKiBhczogS2VybmVsL1VzZXIg bW9kZSBiaXQsIGludGVycnVwdCBlbmFibGUgYml0LgorICoKKyAqIFRoZSBCYWRWYWRkciByZWdp c3RlciBjb250YWlucyB0aGUgdmlydHVhbCBhZGRyZXNzIHRoYXQgY2F1c2UgdGhlIGxhc3QKKyAq IGV4Y2VwdGlvbi4KKyAqCisgKiBUaGUgQ29udGV4dCByZWdpc3RlciBjb250YWlucyB0aGUgbG93 ZXIgMjIgYml0cyBvZiB0aGUgVlBOIChzdGFydGluZyBhdAorICogYml0IDQpIHRoYXQgY2F1c2Ug dGhlIGxhc3QgZXhjZXB0aW9uIGV4Y2VwdCBiaXQwIGFuZCBiaXQxIGFyZSB6ZXJvLiBUaGUKKyAq IHVwcGVyIGJpdHMgKGJpdHMgMjMgdG8gMzEgZm9yIE1JUFMzMiBhbmQgYml0cyAyMyB0byA2Mykg YXJlIHNldCB1bmRlcgorICoga2VybmVsIGNvbnRyb2wgKGkuZS4gcG9pbnQgdG8gdGhlIHBhZ2Ug dGFibGUpLiBUaGUgQ29udGV4dC9YQ29udGV4dAorICogcmVnaXN0ZXJzIGFyZSBub3QgY3VycmVu dGx5IHVzZWQgYnkgRnJlZUJTRC4KKyAqLwogCiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBA IC0xMTAsMTMgKzEzMiwyNyBAQAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIE1p cHNEb1RMQk1pc3MgLS0KKyAqIE1pcHNEb1RMQk1pc3MgLS0gIChVVExCIG1pc3MpCiAgKgotICog VGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuCisgKiBUaGlzIGlzIHRoZSBy ZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4gIEEgbWlzcyB3YXMgZ2VuZXJhdGVkIHdoZW4gdGhl CisgKiBhY2Nlc3MgaXMgdG8ga3VzZWcgYW5kIHRoZXJlIHdhcyBub3QgbWF0Y2hpbmcgbWFwcGlu ZyBsb2FkZWQgaW50byB0aGUgVExCLgogICogJ3NlZ2Jhc2UnIHBvaW50cyB0byB0aGUgYmFzZSBv ZiB0aGUgc2VnbWVudCB0YWJsZSBmb3IgdXNlciBwcm9jZXNzZXMuCiAgKgorICogVGhlIENQVSBk b2VzIHRoZSBmb2xsb3dpbmcgZm9yIGFuIFVUTEIgbWlzczoKKyAqIC0gU2V0cyB0aGUgRVBDIHJl Z2lzdGVyLgorICogLSBTZXRzIHRoZSBDYXVzZSByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgU3Rh dHVzIHJlZ2lzdGVyLiBTaGlmdHMgSy9VIGFuZCBJRSBiaXRzIG92ZXIgb25lIGFuZCBjbGVhcnMK KyAqICAgdGhlIGN1cnJlbnQgS2VybmVsL1VzZXIgYW5kIEludGVycnVwdCBFbmFibGUgYml0cy4g U28gdGhlIHByb2Nlc3NvcgorICogICBpcyBpbiBrZXJuZWwgbW9kZSB3aXRoIHRoZSBpbnRlcnVw dHMgdHVybmVkIG9mZi4KKyAqIC0gU2V0cyBCYWRWYWRkciByZWdpc3Rlci4KKyAqIC0gU2V0cyB0 aGUgQ29udGV4dC9YQ29udGV4dCByZWdpc3RlcihzKS4KKyAqIC0gU2V0cyB0aGUgVExCIEVudHJ5 SGkgcmVnaXN0ZXIgdG8gY29udGFpbiBWUE4gb2YgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCisgKgog ICogRG9uJ3QgY2hlY2sgZm9yIGludmFsaWQgcHRlJ3MgaGVyZS4gV2UgbG9hZCB0aGVtIGFzIHdl bGwgYW5kCiAgKiBsZXQgdGhlIHByb2Nlc3NvciB0cmFwIHRvIGxvYWQgdGhlIGNvcnJlY3QgdmFs dWUgYWZ0ZXIgc2VydmljZS4KKyAqCisgKiBYWFggVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgY2hh bmdlZCB0byBhIGxpbmVhciBwYWdlIHRhYmxlIGFuZCB1c2UgdGhlCisgKiBDb250ZXh0IGFuZCBY Q29udGV4dCByZWdpc3RlcnMuICBUaGF0IGlzIHJlYWxseSB3aGF0IGl0IHdhcyBkZXNpZ25lZCBm b3IuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogIAkuc2V0IHB1c2gKQEAgLTEzNywyNSAr MTczLDg5IEBACiAjaWZkZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBU UlNISUZUCQkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zm c2V0Ci0JUFRSX0FERFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJf TAkJazEsIDAoazEpCQkJIyBrMT1wZGUgZW50cnkKLQlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURf VkFERFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMg azE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkK IAliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKwlub3AKKworI2lm ZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBB R0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHpl cm8sIG5vdF9zdXBlcnBhZ2UJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAo azApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0 aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMSwgazAsIDAsIDEpCisK KwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhl IFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNf Q09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUg dGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8w KS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBw b3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJ CSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3 IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJp dHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NX QklUUyhrMSkJCQkJIyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09Q XzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRM QiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBh Z2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJ IyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0 byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N QVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0 dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9zdXBlcnBhZ2U6CisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCiAjZW5kaWYKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1i YWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkj MGI6IGswPVZQTiAoYWthIHZhPj4xMCkKIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjMGM6IGsw PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjMGQ6IGsxPXB0ZSBhZGRy ZXNzCi0JUFRFX0wJCWswLCAwKGsxKQkJCSMwZTogazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRF U0laRShrMSkJCQkjMGY6IGsxPWxvMCBwdGUKKworCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxv MCBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlkLgor CSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1bHQg bGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwganVz dCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9WQUxJ RF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMikKKwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRF X01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIzEyOiBsbzAgaXMgbG9hZGVkCiAJQ09QMF9T WU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf TE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkjIGsw PWxvMSBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlk LgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1 bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwg anVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9W QUxJRF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMykKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJ UFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCiAJQ09Q MF9TWU5DCiAJdGxid3IJCQkJCQkjMWE6IHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQogCWVy ZXQJCQkJCQkjMWY6IHJldFVybiBmcm9tIGV4Y2VwdGlvbgorCiAxOglqCQlNaXBzVExCTWlzc0V4 Y2VwdGlvbgkJIzIwOiBrZXJuZWwgZXhjZXB0aW9uCiAJbm9wCQkJCQkJIzIxOiBicmFuY2ggZGVs YXkgc2xvdAogMjoJagkJU2xvd0ZhdWx0CQkJIzIyOiBubyBwYWdlIHRhYmxlIHByZXNlbnQKQEAg LTI2NSw3ICszNjUsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lz dGVyIHN0YXRlLgorICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZSB3aGVuIHRha2lu ZyBhbiBleGNlcHRpb24gaW4ga2VybmVsIG1vZGUuCiAgKgogICogVGhpcyBpcyBzdHJhaWdodGZv cndhcmQgZXhjZXB0IGZvciBzYXZpbmcgdGhlIGV4Y2VwdGlvbiBwcm9ncmFtCiAgKiBjb3VudGVy LiBUaGUgZGRiIGJhY2t0cmFjZSBjb2RlIGxvb2tzIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24K QEAgLTQwNiw2ICs1MDYsNyBAQAogCVNBVkVfUkVHKGExLCBTUiwgc3ApCiAJUkVTVE9SRV9DUFUJ CQkjIHYwIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcy4KIAlzeW5jCisKIAllcmV0CiAJLnNl dAlhdAogRU5EKE1pcHNLZXJuR2VuRXhjZXB0aW9uKQpAQCAtODg0LDIxICs5ODUsNjAgQEAKIAlQ VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1wZGUgb2Zmc2V0IChhbG1vc3Qp CiAJYmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGRlIHRh YgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMD1wZGUgZW50cnkgYWRk cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCiAJLyogVmFsaWRhdGUg cGRlIHRhYmxlIHBvaW50ZXIuICAqLwogCWJlcXoJCWsxLCAzZgogCW5vcAorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90 X3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBk ZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCS8qIFZhbGlkYXRlIHBhZ2UgdGFibGUgZW50cnkuICAq LworCWFuZGkJCWsxLCBQVEVfVlIKKwliZXF6CQlrMSwgM2YKKwlub3AKKworCSMgVGhlIFBERSBp cyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxvMCByZWcu CisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8w CQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZOIGZvciB0 aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdFVF9PRERf MU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24KKworCSMg R2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1wZGUgZW50 cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZsYWcgYml0 cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMgTG9hZCBp dCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSMgQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ IyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCWIJCXRsYl9pbnNlcnRfZW50cnkKKwlub3AKKworbm90 X3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KICNlbmRpZgogCU1GQzAJCWswLCBN SVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlr MCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEVNQVNL CQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUg YWRkcmVzcwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPXRoaXMgUFRFCiAKIAkvKiBWYWxpZGF0 ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQlhbmRpCQlrMCwgUFRFX1YKKwlhbmRpCQlrMCwgUFRF X1ZSCiAJYmVxegkJazAsIDNmCiAJbm9wCiAKQEAgLTkwOCwyNSArMTA0OCwzMSBAQAogCW5vcAog CiAJUFRFX0wJCWswLCAwKGsxKQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkKKwogCUNMRUFSX1BU RV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lO QwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP MQorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQ VEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIAliCQl0bGJfaW5z ZXJ0X2VudHJ5CiAJbm9wCiAKIG9kZF9wYWdlOgogCVBURV9MCQlrMCwgLVBURVNJWkUoazEpCi0J UFRFX0wJCWsxLCAwKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwg TUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQ VEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQVEVfTAkJazAsIDAoazEpCisKKwlD TEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlD T1AwX1NZTkMKIAogdGxiX2luc2VydF9lbnRyeToKQEAgLTkzNiwxMSArMTA4MiwxNSBAQAogCWJs dHoJCWswLCB0bGJfaW5zZXJ0X3JhbmRvbQogCW5vcAogCXRsYndpCisJUFRFX01UQzAJemVybywg TUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCiB0bGJf aW5zZXJ0X3JhbmRvbToKIAl0bGJ3cgorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIApAQCAtMTA1NCwyMSArMTIwNCw2NyBA QAogI2lmZGVmIF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJ IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBU Ul9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAw KGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMgazE9cGRlIGVu dHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkKKworI2lmZGVm IE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0Vf SURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8s IG5vdF9rc3BnCQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMg azE9cGRlIGVudHJ5IChkZWxheSBzbG90KQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRp b24KKworCSMgVGhlIFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBp biB0aGUgVExCIGxvMCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwg TUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29t cHV0ZSB0aGUgUEZOIGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRM QiBsbzApLgorCUdFVF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4g UFRFIHBvc3Rpb24KKworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAo azApCQkJIyBrMD1wZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMg azA9aHcgVExCIGZsYWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdm bGcgYml0cworCSMgTG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9Q VEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNXIEJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQ U19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0 aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJ CSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdf TUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdy aXRlIHRvIHRsYgorCUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC X1BHX01BU0sJIyB6ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJ IyByZXR1cm4gZnJvbSBleGNlcHRpb24KKworbm90X2tzcGc6CisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCisKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk cmVzcyAoYWdhaW4pCiAgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09 MCAtLSBubyBwYWdlIHRhYmxlCiAjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBU RVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIyBrMD1wYWdlIHRhYiBv ZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUgYWRkcmVzcworCiAJUFRFX0wJ CWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkJCQkjIGsx PWxvMSBwdGUKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKIAlDTEVBUl9QVEVf U1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxv YWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1J UFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUo azEpCQkJIyBrMD1sbzEgcHRlCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWsw LCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndy CQkJCQkjIHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMv bWlwcy9jcHUuYyBiL3N5cy9taXBzL21pcHMvY3B1LmMKLS0tIGEvc3lzL21pcHMvbWlwcy9jcHUu YworKysgYi9zeXMvbWlwcy9taXBzL2NwdS5jCkBAIC0zMTMsNiArMzEzLDI1IEBACiAJY3B1aW5m by0+bDIuZGNfc2l6ZSA9IGNwdWluZm8tPmwyLmRjX2xpbmVzaXplCiAJICAgICogY3B1aW5mby0+ bDIuZGNfbnNldHMgKiBjcHVpbmZvLT5sMi5kY19ud2F5czsKICNlbmRpZgorCisJLyoKKwkgKiBQ cm9iZSBQYWdlTWFzayByZWdpc3RlciB0byBzZWUgd2hhdCBzaXplcyBvZiBwYWdlcyBhcmUgc3Vw cG9ydGVkCisJICogYnkgd3JpdGluZyBhbGwgb25lJ3MgYW5kIHRoZW4gcmVhZGluZyBpdCBiYWNr LgorCSAqLworCW1pcHNfd3JfcGFnZW1hc2sofjApOworCWNwdWluZm8tPnRsYl9wZ21hc2sgPSBt aXBzX3JkX3BhZ2VtYXNrKCk7CisJbWlwc193cl9wYWdlbWFzayhNSVBTM19QR01BU0tfNEspOwor CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlpZiAoKGNwdWluZm8tPnRsYl9wZ21hc2sgJiBN SVBTM19QR01BU0tfMTZLKSA9PSAwKQorCQlwYW5pYygiJXM6IDE2SyBzaXplZCBwYWdlcyBhcmUg bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q IEtTVEFDS19MQVJHRV9QQUdFICovCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJaWYgKChjcHVp bmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKSA9PSAwKQorCQlwYW5pYygiJXM6IDFN IHNpemVkIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1 bmNfXyk7CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCiB9CiAKIHZvaWQKQEAgLTM4OSw2 ICs0MDgsMzAgQEAKIAkJCXByaW50ZigiRml4ZWQgbWFwcGluZyIpOwogCQl9CiAJCXByaW50Zigi LCAlZCBlbnRyaWVzICIsIGNwdWluZm8udGxiX25lbnRyaWVzKTsKKwkJaWYgKGNwdWluZm8udGxi X3BnbWFzaykgeworCQkJcHJpbnRmKCIoIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYg TUlQUzNfUEdNQVNLX01BU0tYKQorCQkJCXByaW50ZigiMUsgIik7CisJCQlwcmludGYoIjRLICIp OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNkspCisJCQkJcHJp bnRmKCIxNksgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0 SykKKwkJCQlwcmludGYoIjY0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBT M19QR01BU0tfMjU2SykKKwkJCQlwcmludGYoIjI1NksgIik7CisJCQlpZiAoY3B1aW5mby50bGJf cGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKQorCQkJCXByaW50ZigiMU0gIik7CisJCQlpZiAoY3B1 aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzRNKQorCQkJCXByaW50ZigiNE0gIik7CisJ CQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2TSkKKwkJCQlwcmludGYo IjE2TSAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRNKQor CQkJCXByaW50ZigiNjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18yNTZNKQorCQkJCXByaW50ZigiMjU2TSAiKTsKKwkJCXByaW50ZigicGcgc2l6ZXMpIik7 CisJCX0KKwkJcHJpbnRmKCJcbiIpOwogCX0KIAogCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsK ZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVk ZS92bXBhcmFtLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmgKKysrIGIvc3lzL21p cHMvaW5jbHVkZS92bXBhcmFtLmgKQEAgLTEwMCwxNSArMTAwLDQ3IEBACiAjZGVmaW5lCUZSRUVC U0QzMl9VU1JTVEFDSwkoKCh2bV9vZmZzZXRfdCkweDgwMDAwMDAwKSAtIFBBR0VfU0laRSkKICNl bmRpZgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCiAvKgotICogRGlzYWJsZSBzdXBlcnBhZ2Ug cmVzZXJ2YXRpb25zLiAobm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAotICogSSBjb3BpZWQgaXQg ZnJvbSBBUk0pCisgKiBFbmFibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9uczogMSBsZXZlbC4KKyAq CisgKiBWTV9OUkVTRVJWTEVWRUwgc3BlY2lmaWVzIGEgbnVtYmVyIG9mIHByb21vdGlvbiBsZXZl bHMgZW5hYmxlZC4KKyAqIEN1cnJlbnRseSBtaXBzNjQgb25seSBzdXBwb3J0cyBvbmUgc2l6ZSBv ciBsZXZlbCAoVk1fTEVWRUxfMF9PUkRFUikgb2YKKyAqIHN1cGVycGFnZXMgKDJNQikKKyAqLwor I2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKKyNkZWZpbmUJVk1fTlJFU0VSVkxFVkVMCQkJMQorI2Vu ZGlmCisKKy8qCisgKiBMZXZlbCAwIHJlc2VydmF0aW9ucyBjb25zaXN0IG9mIDUxMiAoMl45KSBw YWdlcyAoMk1CKS4KKyAqLworI2lmbmRlZglWTV9MRVZFTF8wX09SREVSCisjZGVmaW5lCVZNX0xF VkVMXzBfT1JERVIJCTkKKyNlbmRpZgorCisvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBz aXplIGlzIDRNQi4KKyAqLworI2RlZmluZQlWTV9ORlJFRU9SREVSCQkJMTEKKworI2Vsc2UgLyog ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworLyoKKyAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0 aW9ucy4KICAqLwogI2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKICNkZWZpbmUJVk1fTlJFU0VSVkxF VkVMCQkwCiAjZW5kaWYKIAogLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAx TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQorCisjZW5kaWYgLyogISBNSVBTNjRf TkVXX1BNQVAgKi8KKworLyoKICAqIEhvdyBtYW55IHBoeXNpY2FsIHBhZ2VzIHBlciBrbWVtIGFy ZW5hIHZpcnR1YWwgcGFnZS4KICAqLwogI2lmbmRlZiBWTV9LTUVNX1NJWkVfU0NBTEUKQEAgLTE3 NywxMSArMjA5LDYgQEAKICNkZWZpbmUJVk1fTE9XTUVNX0JPVU5EQVJZCSgodm1fcGFkZHJfdCkw eDIwMDAwMDAwKQogI2VuZGlmCiAKLS8qCi0gKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUg aXMgMU1CLgotICovCi0jZGVmaW5lCVZNX05GUkVFT1JERVIJCTkKLQogI2RlZmluZQlaRVJPX1JF R0lPTl9TSVpFCSg2NCAqIDEwMjQpCS8qIDY0S0IgKi8KIAogI2lmbmRlZiBfX21pcHNfbjY0CmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUu aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcHRl LmgKQEAgLTI5LDYgKzI5LDEwIEBACiAjaWZuZGVmCV9NQUNISU5FX1BURV9IXwogI2RlZmluZQlf TUFDSElORV9QVEVfSF8KIAorI2lmICFkZWZpbmVkKF9LRVJORUwpCisjaW5jbHVkZSA8bWFjaGlu ZS9wYXJhbS5oPgorI2VuZGlmCisKICNpZm5kZWYgX0xPQ09SRQogI2lmIGRlZmluZWQoX19taXBz X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCiB0eXBl ZGVmCXVpbnQ2NF90IHB0X2VudHJ5X3Q7CkBAIC03MiwyMiArNzYsMjUgQEAKICAqIE5PVEU6IFRo aXMgbWVhbnMgdGhhdCBmb3IgMzItYml0IHVzZSBvZiBDUDAsIHdlIGFyZW4ndCBhYmxlIHRvIHNl dCB0aGUgdG9wCiAgKiBiaXQgb2YgUEZOIHRvIGEgbm9uLXplcm8gdmFsdWUsIGFzIHNvZnR3YXJl IGlzIHVzaW5nIGl0ISAgVGhpcyBwaHlzaWNhbAogICogbWVtb3J5IHNpemUgbGltaXQgbWF5IG5v dCBiZSBzdWZmaWNpZW50bHkgZW5mb3JjZWQgZWxzZXdoZXJlLgorICoKKyAqIFhYWFJXOiBPbiBD SEVSSSwgYml0cyA2MyBhbmQgNjIgYXJlIHVzZWQgZm9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMg dGhhdAorICogcHJldmVudCBsb2FkaW5nIGFuZCBzdG9yaW5nIG9mIGNhcGFiaWxpdGllcywgc28g d2UgaGF2ZSByZWR1Y2VkIHRoZSA1NS1iaXQKKyAqIHNoaWZ0IHRvIDUzIGJpdHMuCiAgKi8KICNp ZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERS XzY0X0JJVCAqLwotI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDU1KQotI2RlZmluZQlUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDkpCi0jZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweDNGRkZG RkZDMFVMTAorI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDUzKQkJLyogWFhYUlc6IFdhcyA1 NS4gKi8KKyNkZWZpbmUJVExCTE9fUkVGX0JJVF9TSElGVAkoNjEpCisjZGVmaW5lCVRMQkxPX1NX QklUU19DTEVBUl9TSElGVAkoMTEpCS8qIFhYWFNTOiBXYXMgOS4gKi8KKyNkZWZpbmUJVExCTE9f UEZOX01BU0sJCTB4RkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCXzFNX1NVUEVSUEFHRV9TSElGVAko UERSU0hJRlQpCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDdGIDw8 IFRMQkxPX1NXQklUU19TSElGVCkKICNlbHNlCiAjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAko MjkpCiAjZGVmaW5lCVRMQkxPX1NXQklUU19DTEVBUl9TSElGVAkoMykKICNkZWZpbmUJVExCTE9f UEZOX01BU0sJCSgweDFGRkZGRkMwKQorI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2Vu dHJ5X3QpMHg3IDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNlbmRpZgogI2RlZmluZQlUTEJMT19Q Rk5fU0hJRlQJCSg2KQotI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3 IDw8IFRMQkxPX1NXQklUU19TSElGVCkKLSNkZWZpbmUJVExCTE9fUEFfVE9fUEZOKHBhKQkoKCgo cGEpID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExCTE9fUEZOX01B U0spCi0jZGVmaW5lCVRMQkxPX1BGTl9UT19QQShwZm4pCSgodm1fcGFkZHJfdCkoKHBmbikgPj4g VExCTE9fUEZOX1NISUZUKSA8PCBUTEJfUEFHRV9TSElGVCkKLSNkZWZpbmUJVExCTE9fUFRFX1RP X1BGTihwdGUpCSgocHRlKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QVEVfVE9f UEEocHRlKQkoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0ZSkpKSkKIAogLyoK ICAqIFhYWCBUaGlzIGNvbW1lbnQgaXMgbm90IGNvcnJlY3QgZm9yIGFueXRoaW5nIG1vcmUgbW9k ZXJuIHRoYW4gUjRLLgpAQCAtMTIxLDI1ICsxMjgsODMgQEAKICNlbmRpZiAvKiBkZWZpbmVkKF9f bWlwc19uNjQpICovCiAKIC8qCisgKiBQVEUgSGFyZHdhcmUgQml0cyAoRW50cnlMbzAtMSByZWdp c3RlciBmaWVsZHMpCisgKgorICogTG93ZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLS0tLS0tLS0tLS0tLS0tIDYgNSAt IDMgIDIgICAxICAgMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICAgICAgIFBGTiAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAqCisg KiAgNTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gMzQgIDMzIC0tLS0tLS0tLS0tLS0tLS0tLS0gNiA1 IC0gMyAgMiAgIDEgICAwCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICBSZXNlcnZlZCAo WmVybykgICAgIHwgICAgICAgICAgUEZOICAgICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8Cisg KiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFRMQiBmbGFncyBtYW5hZ2VkIGluIGhhcmR3YXJlOgor ICogICAgUEZOOglQYWdlIEZyYW1lIE51bWJlci4KICAqIAlDOglDYWNoZSBhdHRyaWJ1dGUuCiAg KiAJRDoJRGlydHkgYml0LiAgVGhpcyBtZWFucyBhIHBhZ2UgaXMgd3JpdGFibGUuICBJdCBpcyBu b3QKICAqIAkJc2V0IGF0IGZpcnN0LCBhbmQgYSB3cml0ZSBpcyB0cmFwcGVkLCBhbmQgdGhlIGRp cnR5CiAgKiAJCWJpdCBpcyBzZXQuICBTZWUgYWxzbyBQVEVfUk8uCi0gKiAJVjoJVmFsaWQgYml0 LiAgT2J2aW91cywgaXNuJ3QgaXQ/CisgKiAJVlI6CVZhbGlkL1JlZmVyZW5jZSBiaXQuIFNlZSBh bHNvIFBURV9TVi4KICAqIAlHOglHbG9iYWwgYml0LiAgVGhpcyBtZWFucyB0aGF0IHRoaXMgbWFw cGluZyBpcyBwcmVzZW50CiAgKiAJCWluIEVWRVJZIGFkZHJlc3Mgc3BhY2UsIGFuZCB0byBpZ25v cmUgdGhlIEFTSUQgd2hlbgogICogCQlpdCBpcyBtYXRjaGVkLgogICovCiAjZGVmaW5lCVBURV9D KGF0dHIpCQkoKGF0dHIgJiAweDA3KSA8PCAzKQogI2RlZmluZQlQVEVfQ19VTkNBQ0hFRAkJKFBU RV9DKE1JUFNfQ0NBX1VOQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0NfQ0FDSEUJCShQVEVfQyhNSVBT X0NDQV9DQUNIRUQpKQogI2RlZmluZQlQVEVfRAkJCTB4MDQKLSNkZWZpbmUJUFRFX1YJCQkweDAy CisjZGVmaW5lCVBURV9WUgkJCTB4MDIKICNkZWZpbmUJUFRFX0cJCQkweDAxCiAKKyNpZmRlZiBD UFVfQ0hFUkkKKy8qCisgKiBDSEVSSSBFbnRyeUxvIGV4dGVuc2lvbnMgdGhhdCBsaW1pdCBzdG9y aW5nIGxvYWRpbmcgYW5kIHN0b3JpbmcgdGFnZ2VkCisgKiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJ UFRFX1NDCQkJKDB4MVVMTCA8PCA2MykKKyNkZWZpbmUJUFRFX0xDCQkJKDB4MVVMTCA8PCA2MikK KyNlbmRpZgorCiAvKgorICogUFRFIFNvZnR3YXJlIEJpdHMKKyAqCisgKiBVcHBlciBiaXRzIG9m IGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgMzEgICAzMCAgIDI5CisgKiAgICAtLS0tLS0tLS0t LS0tLQorICogICB8IE1OIHwgVyAgfCBSTyB8CisgKiAgICAtLS0tLS0tLS0tLS0tLQorICoKKyAq IFVwcGVyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICAgNjMtNjIgICA2MS02MCAgNTkg ICA1OCAtLSA1NiAgICA1NSAgIDU0ICAgNTMKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgfCAgUkcgIHwgICAgICB8IFNWIHwgUEcgU1ogSURY IHwgTU4gfCBXICB8IFJPIHwKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgKgogICogVk0gZmxhZ3MgbWFuYWdlZCBpbiBzb2Z0d2FyZToKKyAqCVJH OglSZWdpb24uCSAoUmVzZXJ2ZWQuIEN1cnJlbnRseSBub3QgdXNlZC4pCisgKglTVjoJU29mdCBW YWxpZCBiaXQuCisgKglQRyBTWiBJRFg6IFBhZ2UgU2l6ZSBJbmRleCAoMC03KS4KKyAqCQlJbmRl eAlQYWdlIE1hc2sgKEJpbmFyeSkJSFcgUGFnZSBTaXplCisgKgkJLS0tLS0JLS0tLS0tLS0tLS0t LS0tLS0tLQktLS0tLS0tLS0tLS0KKyAqCQkwCTAwMDAgMDAwMCAwMDAwIDAwMDAJICA0SworICoJ CTEJMDAwMCAwMDAwIDAwMDAgMDAxMQkgMTZLCisgKgkJMgkwMDAwIDAwMDAgMDAwMCAxMTExCSA2 NEsKKyAqCQkzCTAwMDAgMDAwMCAwMDExIDExMTEJMjU2SworICoJCTQJMDAwMCAwMDAwIDExMTEg MTExMQkgIDFNCisgKgkJNQkwMDAwIDAwMTEgMTExMSAxMTExCSAgNE0KKyAqCQk2CTAwMDAgMTEx MSAxMTExIDExMTEJIDE2TQorICogKE1JUFMgMzopCisgKgkJNwkwMDExIDExMTEgMTExMSAxMTEx CSA2NE0KKyAqCQk4CTExMTEgMTExMSAxMTExIDExMTEJMjU2TSAoTm90IGN1cnJlbnRseSBzdXBw b3J0ZWQpCisgKgogICogCVJPOglSZWFkIG9ubHkuICBOZXZlciBzZXQgUFRFX0Qgb24gdGhpcyBw YWdlLCBhbmQgZG9uJ3QKICAqIAkJbGlzdGVuIHRvIHJlcXVlc3RzIHRvIHdyaXRlIHRvIGl0Lgog ICogCVc6CVdpcmVkLiAgPz8/CkBAIC0xNTEsMTMgKzIxNiwyOTEgQEAKICNkZWZpbmUJUFRFX1JP CQkJKChwdF9lbnRyeV90KTB4MDEgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVf VwkJCSgocHRfZW50cnlfdCkweDAyIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRF X01BTkFHRUQJCSgocHRfZW50cnlfdCkweDA0IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNpZiBk ZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0 X0JJVCAqLworI2RlZmluZQlQVEVfUFNfMTZLCQkoKHB0X2VudHJ5X3QpMHgwOCA8PCBUTEJMT19T V0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NEsJCSgocHRfZW50cnlfdCkweDEwIDw8IFRM QkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzI1NksJCSgocHRfZW50cnlfdCkweDE4 IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzFNCQkoKHB0X2VudHJ5X3Qp MHgyMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU180TQkJKChwdF9lbnRy eV90KTB4MjggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMTZNCQkoKHB0 X2VudHJ5X3QpMHgzMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NE0J CSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BT X0lEWF9NQVNLCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVm aW5lCVBURV9QU0lEWF9OQklUU19UT19MRUZUCQk1CisjZGVmaW5lCVBURV9QU0lEWF9OQklUU19U T19SSUdIVAk1NgorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX0xFRlQJCTExCisjZGVmaW5lCVBU RV9QRk5fTkJJVFNfVE9fUklHSFQJCTYKKyNkZWZpbmUJUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG VAk1OAorI2RlZmluZQlTV19WQUxJRAkJMHg0MAorI2RlZmluZQlQVEVfU1YJCQkoKHB0X2VudHJ5 X3QpU1dfVkFMSUQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Vsc2UKKyNkZWZpbmUJUFRFX1BT X0lEWF9NQVNLCQkwCisjZGVmaW5lCVBURV9TVgkJCTAKKyNlbmRpZgorCisvKgorICogUHJvbW90 aW9uIHRvIGEgNE1CIChQREUpIHBhZ2UgbWFwcGluZyByZXF1aXJlcyB0aGF0IHRoZSBjb3JyZXNw b25kaW5nIDRLQgorICogKFBURSkgcGFnZSBtYXBwaW5ncyBoYXZlIGlkZW50aWNhbCBzZXR0aW5n cyBmb3IgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgKi8KKyNkZWZpbmUJUEdfUFJPTU9URV9NQVNL CShQVEVfRyB8IFBURV9WQUxJRCB8IFBURV9EIHwgUFRFX0NfVU5DQUNIRUQgfCBcCisJCQlQVEVf Q19DQUNIRSB8IFBURV9STyB8IFBURV9XIHwgUFRFX01BTkFHRUQgfCBcCisJCQlQVEVfUkVGKQor CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCVRMQkxPX1BURV9UT19JRFgocHRlKQko KChwdGUpICYgUFRFX1BTX0lEWF9NQVNLKSA+PiA1NikKKyNkZWZpbmUJVExCTUFTS19JRFhfVE9f TUFTSyhpZHgpICgoKDEgPDwgKChpZHgpIDw8IDEpKSAtIDEpIDw8IFRMQk1BU0tfU0hJRlQpCisj ZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJVExCTUFTS19JRFhfVE9fTUFTSyhUTEJMT19Q VEVfVE9fSURYKHB0ZSkpCisjZGVmaW5lCVRMQk1BU0tfNEtfUEFHRQkJVExCTUFTS19JRFhfVE9f TUFTSygwKQorI2RlZmluZQlUTEJNQVNLXzE2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMSkK KyNkZWZpbmUJVExCTUFTS182NEtfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDIpCisjZGVmaW5l CVRMQk1BU0tfMjU2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMykKKyNkZWZpbmUJVExCTUFT S18xTV9QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDQpCisjZGVmaW5lCVRMQk1BU0tfNE1fUEFH RQkJVExCTUFTS19JRFhfVE9fTUFTSyg1KQorI2RlZmluZQlUTEJNQVNLXzE2TV9QQUdFCVRMQk1B U0tfSURYX1RPX01BU0soNikKKyNkZWZpbmUJVExCTUFTS182NE1fUEFHRQlUTEJNQVNLX0lEWF9U T19NQVNLKDcpCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworI2RlZmluZQlUTEJMT19Q VEVfVE9fSURYKHB0ZSkgCTAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX01BU0socHRlKQkwCisjZW5k aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAogLyoKICAqIFBURSBtYW5hZ2VtZW50IGZ1bmN0 aW9ucyBmb3IgYml0cyBkZWZpbmVkIGFib3ZlLgogICovCi0jZGVmaW5lCXB0ZV9jbGVhcihwdGUs IGJpdCkJKCoocHRlKSAmPSB+KGJpdCkpCi0jZGVmaW5lCXB0ZV9zZXQocHRlLCBiaXQpCSgqKHB0 ZSkgfD0gKGJpdCkpCi0jZGVmaW5lCXB0ZV90ZXN0KHB0ZSwgYml0KQkoKCoocHRlKSAmIChiaXQp KSA9PSAoYml0KSkKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9j bGVhcihwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSAmPSAofmJp dCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfc2V0KHB0X2VudHJ5X3QgKnB0ZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l IGludAorcHRlX3Rlc3QocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl dHVybiAoKCpwdGUgJiBiaXQpID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitw ZGVfY2xlYXIocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50 cnlfdCAqKXBkZSAmPSAofmJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwZGVfc2V0 KHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilw ZGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfdGVzdChwZF9lbnRyeV90 ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgoKihwdF9lbnRyeV90ICopcGRl ICYgYml0KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9f UEFfVE9fUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgocGEgPj4gVExCX1BBR0Vf U0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSyk7Cit9CisKK3N0YXRp YyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QRk5fVE9fUEEocHRfZW50cnlfdCBwZm4pCit7 CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PCBUTEJf UEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QVEVf VE9fUEZOKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChwdGUgJiBUTEJMT19QRk5fTUFT Syk7Cit9CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworI2RlZmluZQlQVEVfUkVGCQlQVEVf VlIKKyNkZWZpbmUJUFRFX1ZBTElEIAlQVEVfU1YKKworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJ CQlwdGVfdGVzdCgocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCQlw dGVfY2xlYXIoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0ZSkJCXB0ZV9z ZXQoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFyKHB0ZSkJYXRv bWljX2NsZWFyX2xvbmcoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3Nl dChwdGUpCQlhdG9taWNfc2V0X2xvbmcoKHB0ZSksIFBURV9SRUYpCisKKyNlbHNlIC8qICEgTUlQ UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJUFRFX1JFRgkJMAorI2RlZmluZQlQVEVfVkFMSUQJ UFRFX1ZSCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJMAorI2RlZmluZQlwdGVfcmVmX2Ns ZWFyKHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0b21p Y19jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3NldChwdGUsIGJpdCkKKworI2Vu ZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJcHRlX2lzX3ZhbGlkKHB0ZSkJ CXB0ZV90ZXN0KChwdGUpLCBQVEVfVkFMSUQpCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8 IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0 ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl82NCgocHRlKSwgYml0KQorI2Rl ZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF82NCgocHRlKSwgYml0KQor I2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzY0KHB0 ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClh dG9taWNfcmVhZGFuZHNldF82NChcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKwor I2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF82NChw dGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfbG9u ZyAqKShwdGVwKSA9ICh1X2xvbmcpKHB0ZSk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9z dG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRlcCwgcGRlKQorCisKKyNlbHNlIC8qICEgUEhZ U0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21pY19jbGVhcihwdGUsIGJpdCkJYXRv bWljX2NsZWFyXzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9hdG9taWNfc2V0KHB0ZSwgYml0 KQlhdG9taWNfc2V0XzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9sb2FkX3N0b3JlKHB0ZXAs IHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfMzIocHRlcCwgcHRlKQorI2RlZmluZQlwZGVfbG9hZF9z dG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19yZWFkYW5kc2V0XzMyKFwKKwkJCQkJ CShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5lCXB0ZV9hdG9taWNfc3RvcmUocHRl cCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUgcHRlX3N0b3Jl KHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9pbnQgKikocHRlcCkgPSAodV9pbnQpKHB0ZSk7CVwK K30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9zdG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRl cCwgcGRlKQorCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KKworI2VuZGlmIC8qICEg X0xPQ09SRSAqLworCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2lmbmRlZiBfTE9DT1JFCisvKgorICogQ2hl Y2sgdG8gc2VlIGlmIGEgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIChQYWdlU2l6ZSA+IDRL KSBQVEUuCisgKgorICogT24gX19taXBzX242NCB0aGUga2VybmVsIHVzZXMgdGhlIHZpcnR1YWwg bWVtb3J5IGFkZHJlc3MgcmFuZ2UgZnJvbQorICogVk1fTUlOX0tFUk5FTF9BRERSRVNTICgweGMw MDAwMDAwMDAwMDAwMDApIHRvIFZNX01BWF9LRVJORUxfQUREUkVTUworICogKDB4YzAwMDAwODAw MDAwMDAwMCkuIFRoZXJlZm9yZSwgYSB2YWxpZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIFBERQor ICogKGEgcG9pbnRlciB0byBhIHBhZ2UgdGFibGUpIHdpbGwgaGF2ZSBiaXRzIDYxIHRvIDQwIHNl dCB0byB6ZXJvLiBBCisgKiBzdXBlcnBhZ2Ugd2lsbCBoYXZlIG9uZSBvZiB0aGUgc3VwZXJwYWdl IHNpemUgYml0cyAoYml0cyA1OCB0byA1NikKKyAqIHNldC4KKyAqLworCisvKiBJcyB0aGUgUERF IGEgc3VwZXJwYWdlIG9mIGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcGRlX2lz X3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1cm4gKCgocHRfZW50cnlfdCkq cGRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAwKTsKK30KKworLyogSXMgdGhlIFBURSBhIHN1cGVy cGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc19zdXBlcnBh Z2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU19JRFhfTUFT SykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQREUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRp YyBfX2lubGluZSBpbnQKK3BkZV9pc18xbV9zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFNKTsK K30KKworLyogSXMgdGhlIFBURSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5saW5l IGludAorcHRlX2lzXzFtX3N1cGVycGFnZShwdF9lbnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4g KCgqcHRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisvKiBQaHlzaWNhbCBBZGRy ZXNzIHRvIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFtZSBOdW1iZXIuICovCitzdGF0aWMgX19pbmxp bmUgcHRfZW50cnlfdAorVExCTE9fUEFfVE9fU1BGTih2bV9wYWRkcl90IHBhKQoreworCisJcmV0 dXJuICgoKHBhID4+IFRMQl8xTV9TVVBFUlBBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkg JgorCSAgICBUTEJMT19QRk5fTUFTSyk7Cit9CisKKy8qIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFt ZSBOdW1iZXIgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk cl90CitUTEJMT19TUEZOX1RPX1BBKHB0X2VudHJ5X3Qgc3BmbikKK3sKKworCXJldHVybiAoKHZt X3BhZGRyX3QpKHNwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PAorCSAgICBUTEJfMU1fU1VQRVJQ QUdFX1NISUZUKTsKK30KKworLyogU3VwZXJwYWdlIFBhZ2UgVGFibGUgRW50cnkgdG8gUGh5c2lj YWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUFRFX1RP X1BBKHB0X2VudHJ5X3QgcHRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19Q VEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP X1NQREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BB KFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOworfQorCisKKy8qIEFuIDRLQiBQ YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg dm1fcGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJu IChUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisK KwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2Vsc2UgLyogISBQSFlTQUREUl82 NF9CSVQgKi8KKworI2RlZmluZQlwdGVfaXNfcmVmZXJlbmNlZChwdGUpCQkwCisjZGVmaW5lCXB0 ZV9yZWZlcmVuY2VfcmVzZXQocHRlKQorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3BhZ2UocHRlKQor I2RlZmluZQlwZGVfaXNfc3VwZXJwYWdlKHBkZSkJCTAKKyNkZWZpbmUJcHRlX2lzX3N1cGVycGFn ZShwZGUpCQkwCisjZGVmaW5lIHBkZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisjZGVmaW5lIHB0 ZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5s aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl dHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorI2VuZGlm IC8qICEgX0xPQ09SRSAqLworI2VuZGlmIC8qICEgUEhZU0FERFJfNjRfQklUICovCiAKIC8qIEFz c2VtYmx5IHN1cHBvcnQgZm9yIFBURSBhY2Nlc3MqLwogI2lmZGVmIExPQ09SRQpAQCAtMTY3LDE2 ICs1MTAsMTA0IEBACiAjZGVmaW5lCVBURU1BU0sJCQkweGZmOAogI2RlZmluZQlQVEVTSVpFCQkJ OAogI2RlZmluZQlQVEVfTAkJCWxkCisjZGVmaW5lCVBURV9TCQkJc2QKICNkZWZpbmUJUFRFX01U QzAJCWRtdGMwCi0jZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocHIpCi0jZWxzZQorI2RlZmluZQlD TEVBUl9QVEVfU1dCSVRTKHIpCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworLyogU3VwZXJw YWdlIGFuZCByZWZlcmVuY2VkIGJpdCBlbXVsYXRpb24gQVNNIG1hY3Jvcy4gKi8KKworLyoKKyAq IEdFVF9TVVBFUlBBR0VfSURYKHIpCisgKgorICogR2V0IHRoZSBzdXBlcnBhZ2UgaW5kZXggZnJv bSB0aGUgUFRFIGJ5IHNoaWZ0aW5nIGl0IGxlZnQgYnkKKyAqIFBURV9QU0lEWF9OQklUU19UT19M RUZUIChjbGVhcmluZyB0aGUgdXBwZXIgc29mdGJpdHMpIGFuZCB0aGVuIGJhY2sgdG8gdGhlCisg KiByaWdodCBieSAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RP X1JJR0hUKSBjbGVhcmluZworICogYWxsIHRoZSBsb3dlciBiaXRzIGluIHRoZSBwcm9jZXNzLgor ICovCisjZGVmaW5lIEdFVF9TVVBFUlBBR0VfSURYKHIpCQkJCVwKKwlkc2xsCXIsIChQVEVfUFNJ RFhfTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybDMyCXIsIChQVEVfUFNJRFhfTkJJVFNfVE9fUklH SFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX0hXX1RMQl9G TEFHUyhyKQorICoKKyAqIEdldCB0aGUgbG93ZXIgaGFyZHdhcmUgVExCIGZsYWdzIGJ1dCBzaGlm dGluZyBsZWZ0IHRoZW4gcmlnaHQuCisgKi8KKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFHUyhyKQkJ CQlcCisJZHNsbDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpOwlcCisJZHNy bDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfT0RE XzFNX1BGTl9GUk9NX0VWRU4ocikKKyAqCisgKiBHZXQgdGhlIG9kZCAxTSBQRk4gKFRMQiBsbzEp IGZyb20gdGhlIGV2ZW4gMU0gUFRFLiAgRmlyc3QsIG1hc2sgb3V0IHRoZSBQRk4KKyAqIGZyb20g dGhlIGV2ZW4gUFRFLiBUaGVuIGFkZCAxTSB3b3J0aCBvZiBwYWdlcyB0byBpdCAoMjU2KS4gRmlu YWxseSwgc2hpZnQgaXQKKyAqIGJhY2sgdG8gaXRzIHBvc2l0aW9uIGluIHRoZSBQVEUuCisgKi8K KyNkZWZpbmUgR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCQkJXAorCWRzbGwJciwgKFBURV9Q Rk5fTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybAlyLCAoUFRFX1BGTl9OQklUU19UT19MRUZUICsg UFRFX1BGTl9OQklUU19UT19SSUdIVCk7IFwKKwlkYWRkaXUJciwgciwgKDEwMjQgKiAxMDI0IC8g UEFHRV9TSVpFKTsJXAorCWRzbGwJciwgKFBURV9QRk5fTkJJVFNfVE9fUklHSFQpCisKKy8qCisg KiBJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCisgKgorICogSWYg YSBQREUgaXMgdmFsaWQgdGhlbiBzZXQgdGhlIHJlZmVyZW5jZWQgYml0IChQVEVfVlIpLiAgVGhl IGZpcnN0IHZlcnNpb24KKyAqIGRvZXMgaXQgYXRvbWljYWxseS4KKyAqLworI2RlZmluZSBBVE9N SUNfUkVGQklUX1VQREFURQorI2lmZGVmIEFUT01JQ19SRUZCSVRfVVBEQVRFCisKKyNkZWZpbmUg SUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4g IyMgdW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0g MzIpOwkJXAorCWFuZGkJcjAsIHIwLCBTV19WQUxJRDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlk ICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJbGxkCXIw LCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBURV9WUiA7CQkJXAorCXNjZAly MCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwliZXF6CXIwLCB0cnlfYWdhaW4gIyMgdW5pcXVlIDsJ CVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92YWxpZCAjIyB1bmlxdWUg IyMgOgorCisjZWxzZSAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNkZWZpbmUgSUZf VkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4gIyMg dW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0gMzIp IDsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQgOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQg IyMgdW5pcXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs IHIwLCBQVEVfVlIgOwkJCVwKKwlQVEVfUwlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92 YWxpZCAjIyB1bmlxdWUgIyMgOgorI2VuZGlmIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8K KworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlHRVRfU1VQRVJQQUdF X0lEWChyKQorI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCisjZGVmaW5lCUlGX1ZBTElEX1NF VF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKworI2VuZGlmIC8qICEgTUlQUzY0X05F V19QTUFQICovCisKKyNlbHNlIC8qICEgTE9DT1JFICovCiAjZGVmaW5lCVBURVNISUZUCQkyCiAj ZGVmaW5lCVBURTJNQVNLCQkweGZmOAkvKiBmb3IgdGhlIDItcGFnZSBsbzAvbG8xICovCiAjZGVm aW5lCVBURU1BU0sJCQkweGZmYwogI2RlZmluZQlQVEVTSVpFCQkJNAogI2RlZmluZQlQVEVfTAkJ CWx3CisjZGVmaW5lCVBURV9TCQkJc3cKICNkZWZpbmUJUFRFX01UQzAJCW10YzAKICNkZWZpbmUJ Q0xFQVJfUFRFX1NXQklUUyhyKQlMT05HX1NMTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQ7 IExPTkdfU1JMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVCAvKiByZW1vdmUgc3diaXRzICov CisKKyNkZWZpbmUJSVNfUFRFX1ZBTElEKHIwLCByMSwgb2Zmc2V0LCBsYWJlbCkKKyNkZWZpbmUJ U0VUX1JFRl9CSVQocjAsIHIxLCBvZmZzZXQpCisKICNlbmRpZiAvKiBkZWZpbmVkKF9fbWlwc19u NjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgKi8KIAogI2lmIGRlZmluZWQoX19taXBzX242NCkK QEAgLTIwMSw0ICs2MzIsMTcgQEAKICNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3ZmZlMDAw CiAjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKIAorCisvKiBQYWdlTWFzayBS ZWdpc3RlciAoQ1AwIFJlZ2lzdGVyIDUsIFNlbGVjdCAwKSBWYWx1ZXMgKi8KKyNkZWZpbmUJTUlQ UzNfUEdNQVNLX01BU0tYCTB4MDAwMDE4MDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzRLCQkweDAw MDAwMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNksJMHgwMDAwNjAwMAorI2RlZmluZQlNSVBT M19QR01BU0tfNjRLCTB4MDAwMWUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzI1NksJMHgwMDA3 ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMU0JCTB4MDAxZmUwMDAKKyNkZWZpbmUJTUlQUzNf UEdNQVNLXzRNCQkweDAwN2ZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNk0JMHgwMWZmZTAw MAorI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdN QVNLXzI1Nk0JMHgxZmZmZTAwMAorCiAjZW5kaWYgLyogIV9NQUNISU5FX1BURV9IXyAqLwpkaWZm IC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BtYXAu aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3Bt YXAuaApAQCAtNDgsNiArNDgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CiAj aW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2lmIGRl ZmluZWQoX19taXBzX24zMikgfHwgZGVmaW5lZChfX21pcHNfbjY0KSAvKiBQSFlTQUREUl82NEJJ VCAqLwogI2RlZmluZQlOS1BUCQkyNTYJLyogbWVtID4gNEcsIHZtX3BhZ2Vfc3RhcnR1cCBuZWVk cyBtb3JlIEtQVHMgKi8KQEAgLTYyLDE1ICs2MywyNCBAQAogI2luY2x1ZGUgPHN5cy9fbG9jay5o PgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2lu Y2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAv KgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBzdHJ1Y3QgcHZfY2h1bms7 CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJTFFfSEVBRCgsIHB2X2Vu dHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOworI2lmZGVmIE1JUFM2NF9O RVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCWlu dCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogI2RlZmlu ZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAtODEsMTUgKzkxLDE4IEBA CiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklUUykgLSAxKQogCiBzdHJ1 Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlfdCAqcG1fc2VndGFiOwkv KiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBwdl9jaHVuaykJcG1fcHZj aHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1c2V0X3QJcG1fYWN0aXZl OwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2ludDMyX3QgYXNpZDpBU0lE X0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2ludDMyX3QgZ2VuOkFTSURH RU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAgICAgIHBtX2FzaWRbTUFY U01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRzOwkvKiBwbWFwIHN0YXRp c3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlz dHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFibGUgcGFnZXMgKi8KKyNl bmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IHBtYXAgKnBt YXBfdDsKQEAgLTEyMSw3ICsxMzQsNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBwdl9lbnRyeSB7 CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgbWFwcGluZyAqLwot CVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBw dl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2OSw2ICsxODIsNyBAQAog CiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9tYXBkZXYodm1fcGFkZHJf dCwgdm1fc2l6ZV90KTsKKy8vYm9vbGVhbl90IHBtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90 IG0pOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9zaXplX3QpOwogdm1fb2Zm c2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwogdm9pZCBwbWFwX2tlbnRl cih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgsNiArMTkyLDcgQEAKIHZv aWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBwYSk7CiB2b2lkIHBtYXBf Zmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBt YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRy KHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8qIF9LRVJORUwgKi8KZGlm ZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvcGFy YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIvc3lzL21pcHMvaW5jbHVk ZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5lCU1BWERVTVBQR1MJCTEJ CS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf UEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdlIHRoZSBLU1RBQ0tfU0la RSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAo ZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8PCAxNCkJLyogU2luZ2xl IDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NUQUNLX1NJWkUKKyNkZWZp bmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEpCisjZGVmaW5lCUtTVEFD S19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmluZQlLU1RBQ0tfVExCTUFT S19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElGVCAtIDEpKSBcCisJCQkJ CTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdFUwkoKEtTVEFDS19Q QUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBLU1RBQ0tfTEFSR0VfUEFH RSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBiZSBhbGlnbmVkIG9uIGEg KFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtTVEFDS19QQUdFUwkJMgkv KiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShLU1RBQ0tfUEFHRVMgKiBQ QUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lCUtT VEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdF UwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAqLworI2VuZGlmIC8qICEg S1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZlZCBjb252ZXJzaW9uIG1h Y3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsgUEFHRV9NQVNLKSAmIH5Q QUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+UEFHRV9NQVNLKQorI2Rl ZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+UERSTUFTSykKKyNkZWZp bmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNkZWZpbmUJYXRvcCh4KQkJ CSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgoeCkgPDwgUEFHRV9TSElG VCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5cy9jb25mL29wdGlvbnMu bWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lzL2NvbmYvb3B0aW9ucy5t aXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJb3B0X2dsb2JhbC5oCiAK ICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5jbHVkZXMgcmVmZXJlbmNl IGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0LgorIworTUlQUzY0X05FV19Q TUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIE5ldEZQ R0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYxMEJNQUNfNjRCSVQJCQlv cHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUgd2l0aCBQYWdlTWFzayBy ZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdlIChjdXJyZW50bHkgMTZL KSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJHRV9QQUdFICAgCQlvcHRf Z2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgQXRoZXJvcyBTb0MgcGVy aXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYgLS1naXQgYS9zeXMvY29u Zi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9zeXMvY29uZi9maWxlcy5t aXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMxLDggQEAKIG1pcHMvbWlw cy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRlcC5jCQkJb3B0aW9uYWwJ ZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1pcHMvbWlwcy9wbWFwLmMJ CQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFtaXBzNjRfbmV3X3BtYXAK K21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0X25ld19wbWFwCiBtaXBz L21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlwcy9zY19tYWNoZGVwLmMJ CQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0aW9uYWwJZGRiIHwgc3Rh Y2sKZGlmZiAtLWdpdCBhL2xpYi9saWJrdm0va3ZtX21pcHMuaCBiL2xpYi9saWJrdm0va3ZtX21p cHMuaAotLS0gYS9saWIvbGlia3ZtL2t2bV9taXBzLmgKKysrIGIvbGliL2xpYmt2bS9rdm1fbWlw cy5oCkBAIC00OSw3ICs0OSw3IEBACiAjZGVmaW5lCU1JUFM2NF9LU0VHMV9FTkQJMHhmZmZmZmZm ZmJmZmZmZmZmCiAKICNkZWZpbmUJTUlQUzMyX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKLSNkZWZp bmUJTUlQUzY0X1BGTl9NQVNLCQkweDNGRkZGRkZDMAorI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJ CTB4RkZGRkZGQzAKICNkZWZpbmUJTUlQU19QRk5fU0hJRlQJCSg2KQogCiAjZGVmaW5lCU1JUFNf UEZOX1RPX1BBKHBmbikJKCgocGZuKSA+PiBNSVBTX1BGTl9TSElGVCkgPDwgTUlQU19QQUdFX1NI SUZUKQoK --b1_17227ff5cee59ab31c13030b2aea797d-- From owner-freebsd-mips@freebsd.org Fri Sep 16 19:16:54 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7BFA2BDDD99 for ; Fri, 16 Sep 2016 19:16:54 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 68F21827 for ; Fri, 16 Sep 2016 19:16:53 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 2D01CB91F; Fri, 16 Sep 2016 19:16:53 +0000 (UTC) Date: Fri, 16 Sep 2016 19:16:53 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <8cfbda1353b73aeded57f1b1746022d2@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcRSU= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_8cfbda1353b73aeded57f1b1746022d2" X-Mailman-Approved-At: Fri, 16 Sep 2016 19:32:13 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 19:16:54 -0000 --b1_8cfbda1353b73aeded57f1b1746022d2 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkxLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgRml4IG1pcHMzMiBidWlsZC4KICAKICBCb290IHRlc3Qga2VybmVsL3dv cmxkIHZpYSBNQUxUQSB1bmRlciBRRU1VIGlzIHN1Y2Nlc3NmdWwKClJFUE9TSVRPUlkKICByUyBG cmVlQlNEIHNyYyByZXBvc2l0b3J5CgpDSEFOR0VTIFNJTkNFIExBU1QgVVBEQVRFCiAgaHR0cHM6 Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1P3ZzPTIwMzkwJmlkPTIwMzkxCgpSRVZJU0lPTiBE RVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFGRkVDVEVEIEZJTEVT CiAgbGliL2xpYmt2bS9rdm1fbWlwcy5oCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25m L29wdGlvbnMubWlwcwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1 ZGUvcG1hcC5oCiAgc3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1w YXJhbS5oCiAgc3lzL21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK ICBzeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5 cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBz eXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMv bWlwcy9taXBzL3RsYi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3Vt YV9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVl LmMKCkVNQUlMIFBSRUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRp bmdzL3BhbmVsL2VtYWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8s IHJ3YXRzb24sIGVtYXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lh aG9vLmNvbSwgbWl6aGthX2dtYWlsLmNvbQo= --b1_8cfbda1353b73aeded57f1b1746022d2 Content-Type: text/x-patch; charset=utf-8; name="D2535.20391.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20391.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5 IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0 ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7 CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT LCBQQUdFX1NJWkUsIDApKQpAQCAtNjIsMTIgKzY2LDE4IEBACiAJCQlpZiAod2FpdCAmIE1fTk9X QUlUKQogCQkJCXJldHVybiAoTlVMTCk7CiAJCQllbHNlCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisJCQkJcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCk7CisjZWxzZSAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLwogCQkJCVZNX1dBSVQ7CisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8K IAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKIAlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlp ZiAoKHdhaXQgJiBNX05PRFVNUCkgPT0gMCkKKwkJZHVtcF9hZGRfcGFnZShwYSk7CiAJdmEgPSAo dm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1QocGEpOwogCWlmICgod2FpdCAmIE1fWkVSTykgJiYg KG0tPmZsYWdzICYgUEdfWkVSTykgPT0gMCkKIAkJYnplcm8odmEsIFBBR0VfU0laRSk7CmRpZmYg LS1naXQgYS9zeXMvbWlwcy9taXBzL3RyYXAuYyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCi0tLSBh L3N5cy9taXBzL21pcHMvdHJhcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCkBAIC04MSw2 ICs4MSw3IEBACiAjaW5jbHVkZSA8bWFjaGluZS9taXBzX29wY29kZS5oPgogI2luY2x1ZGUgPG1h Y2hpbmUvZnJhbWUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3JlZ251bS5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvdGxiLmg+CiAjaW5jbHVkZSA8bWFjaGluZS90bHMuaD4KIAogI2lmZGVmIEREQgpAQCAt MjY0LDcgKzI2NSw3IEBACiAJInJlc2VydmVkIDIxIiwKIAkicmVzZXJ2ZWQgMjIiLAogCSJ3YXRj aCIsCi0JInJlc2VydmVkIDI0IiwKKwkibWFjaGluZSBjaGVjayIsCiAJInJlc2VydmVkIDI1IiwK IAkicmVzZXJ2ZWQgMjYiLAogCSJyZXNlcnZlZCAyNyIsCkBAIC02MzIsNiArNjMzLDMzIEBACiAj ZW5kaWYKIAkJcGFuaWMoIk1DSEVDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgVF9NQ0hFQ0sgKyBU X1VTRVI6CisJCXsKKwkJCXVpbnQzMl90IHN0YXR1cyA9IG1pcHNfcmRfc3RhdHVzKCk7CisKKwkJ CWlmIChzdGF0dXMgJiBNSVBTX1NSX1RTKSB7CisJCQkJLyoKKwkJCQkgKiBNYWNoaW5lIENoZWNr IGV4Y2VwdGlvbiBjYXVzZWQgYnkgVExCCisJCQkJICogZGV0ZWN0aW5nIGEgbWF0Y2ggZm9yIG11 bHRpcGxlIGVudHJpZXMuCisJCQkJICoKKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1 c2hpbmcgdGhlIHVzZXIgVExCCisJCQkJICogYW5kIHJlc2V0dGluZyB0aGUgc3RhdHVzIGJpdC4K KwkJCQkgKi8KKwkJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgaW4gVXNlciAtIER1cCBUTEIgZW50 cnkuICIKKwkJCQkgICAgIlJlY292ZXJpbmcuLi5cbiIpOworCQkJCXBtYXAgPSAmcC0+cF92bXNw YWNlLT52bV9wbWFwOworCQkJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCQkJCW1p cHNfd3Jfc3RhdHVzKHN0YXR1cyAmIH5NSVBTX1NSX1RTKTsKKworCQkJCXJldHVybiAodHJhcGZy YW1lLT5wYyk7CisJCQl9IGVsc2UgeworI2lmZGVmIEREQgorCQkJCWtkYl90cmFwKHR5cGUsIDAs IHRyYXBmcmFtZSk7CisjZW5kaWYKKwkJCQlwYW5pYygiTUNIRUNLXG4iKTsKKwkJCX0KKwkJfQor CQlicmVhazsKIAljYXNlIFRfVExCX01PRDoKIAkJLyogY2hlY2sgZm9yIGtlcm5lbCBhZGRyZXNz ICovCiAJCWlmIChLRVJOTEFORCh0cmFwZnJhbWUtPmJhZHZhZGRyKSkgewpAQCAtNjk0LDEwICs3 MjIsMjMgQEAKIAogCWNhc2UgVF9UTEJfTERfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9Q Uk9UX1JFQUQ7Ci0JCWdvdG8gZG9mYXVsdDsKKwkJZ290byBjaGVja3JlZmJpdDsKIAogCWNhc2Ug VF9UTEJfU1RfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9QUk9UX1dSSVRFOworCitjaGVj a3JlZmJpdDoKKwkJLyoKKwkJICogV2FzIHRoaXMgdHJhcCBjYXVzZWQgYnkgdGhlIFBURV9WUiBi aXQgbm90IGJlaW5nIHNldD8KKwkJICovCisJCWlmIChwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZCgm cC0+cF92bXNwYWNlLT52bV9wbWFwLAorCQkgICAgdHJhcGZyYW1lLT5iYWR2YWRkcikgPT0gMCkg eworCQkJaWYgKCF1c2VybW9kZSkgeworCQkJCXJldHVybiAodHJhcGZyYW1lLT5wYyk7CisJCQl9 CisJCQlnb3RvIG91dDsKKwkJfQorCiBkb2ZhdWx0OgogCQl7CiAJCQl2bV9vZmZzZXRfdCB2YTsK QEAgLTE0MTEsOSArMTQ1MiwxNiBAQAogCXN0cnVjdCBwcm9jICpwID0gY3VycHJvYzsKIAogCXBk ZXAgPSAoJihwLT5wX3Ztc3BhY2UtPnZtX3BtYXAucG1fc2VndGFiWyh2YSA+PiBTRUdTSElGVCkg JiAoTlBERVBHIC0gMSldKSk7Ci0JaWYgKCpwZGVwKQotCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBf dm1zcGFjZS0+dm1fcG1hcCwgdmEpOwotCWVsc2UKKwlpZiAoKnBkZXApIHsKKyNpZiBWTV9OUkVT RVJWTEVWRUwgPiAwCisJCXBkX2VudHJ5X3QgKnBkZSA9ICZwZGVwWyh2YSA+PiBQRFJTSElGVCkg JiAoTlBERVBHIC0gMSldOworCisJCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpCisJCQlwdGVw ID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKyNlbmRpZiAvKiBWTV9OUkVTRVJWTEVWRUwg PiAwICovCisJCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwgdmEpOwor CX0gZWxzZQogCQlwdGVwID0gKHB0X2VudHJ5X3QgKikwOwogCiAJKnBkZXBwID0gcGRlcDsKZGlm ZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdGxiLmMgYi9zeXMvbWlwcy9taXBzL3RsYi5jCi0tLSBh L3N5cy9taXBzL21pcHMvdGxiLmMKKysrIGIvc3lzL21pcHMvbWlwcy90bGIuYwpAQCAtNDAsMTAg KzQwLDE0IEBACiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rs Yi5oPgogCisjaW5jbHVkZSAib3B0X3ZtLmgiCisKICNpZiBkZWZpbmVkKENQVV9DTk1JUFMpCiAj ZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTEyOAogI2VsaWYgZGVmaW5lZChDUFVfTkxNKQog I2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkoMjA0OCArIDEyOCkKKyNlbGlmIGRlZmluZWQo Q1BVX0NIRVJJKQorI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxNDQKICNlbHNlCiAjZGVm aW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTY0CiAjZW5kaWYKQEAgLTEwMiwyMCArMTA2LDMxIEBA CiB7CiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3QgczsKKwl1aW50MzJfdCBwYWdlbWFz azsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNpemU7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCUtB U1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlMCkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUxKSks CisJICAgICgiJXM6IHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24ndCBtYXRjaCIsIF9fZnVu Y19fKSk7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUwKTsKKwltYXNrID0gKHVuc2lnbmVkIGxvbmcpcGFn ZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93ZXIgMTIgYml0cyAqLworCXNpemUg PSBtYXNrICsgMTsKKworCXZhICY9IH5tYXNrOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFz aWQgPSBtaXBzX3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAogCW1pcHNfd3JfaW5k ZXgoaSk7Ci0JbWlwc193cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNr KTsKIAltaXBzX3dyX2VudHJ5aGkoVExCSElfRU5UUlkodmEsIDApKTsKIAltaXBzX3dyX2VudHJ5 bG8wKHB0ZTApOwogCW1pcHNfd3JfZW50cnlsbzEocHRlMSk7CiAJdGxiX3dyaXRlX2luZGV4ZWQo KTsKIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWlu dHJfcmVzdG9yZShzKTsKIH0KIApAQCAtMTM3LDcgKzE1Miw2IEBACiAJaSA9IG1pcHNfcmRfaW5k ZXgoKTsKIAlpZiAoaSA+PSAwKQogCQl0bGJfaW52YWxpZGF0ZV9vbmUoaSk7Ci0KIAltaXBzX3dy X2VudHJ5aGkoYXNpZCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQpAQCAtMjk4LDI5ICszMTIsNTMg QEAKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOwogCWludCBpOworCXVpbnQzMl90 IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKKwlwdF9lbnRyeV90IHB0ZTAs IHB0ZTE7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUpOworCW1hc2sgPSAodW5zaWduZWQgbG9uZylwYWdl bWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBiaXRzICovCisJc2l6ZSA9 IG1hc2sgKyAxOwogCi0JdmEgJj0gflBBR0VfTUFTSzsKKwl2YSAmPSB+bWFzazsKIAlwdGUgJj0g flRMQkxPX1NXQklUU19NQVNLOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFzaWQgPSBtaXBz X3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAotCW1pcHNfd3JfcGFnZW1hc2soMCk7 CisJbWlwc193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VO VFJZKHZhLCBwbWFwX2FzaWQocG1hcCkpKTsKIAl0bGJfcHJvYmUoKTsKIAlpID0gbWlwc19yZF9p bmRleCgpOwogCWlmIChpID49IDApIHsKIAkJdGxiX3JlYWQoKTsKKwkJcHRlMCA9IG1pcHNfcmRf ZW50cnlsbzAoKTsKKwkJcHRlMSA9IG1pcHNfcmRfZW50cnlsbzEoKTsKKwkJS0FTU0VSVCgoVExC TE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRlMCkgJiYKKwkJICAgIFRM QkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9fSURYKHB0ZTEpKSwKKwkJCSgiJXM6 IHB0ZSwgcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0IG1hdGNoIiwgX19mdW5jX18pKTsK IAotCQlpZiAoKHZhICYgUEFHRV9TSVpFKSA9PSAwKSB7CisJCWlmICgodmEgJiBzaXplKSA9PSAw KSB7CiAJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZSk7CisJCQlpZiAocGFnZW1hc2sgJiB+UEFHRV9N QVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJcHRlMSA9IChwdGUxICYgfihQVEVfVlIg fCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVfRCkpOworCQkJCW1pcHNfd3JfZW50cnls bzEocHRlMSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZSk7CisJ CQlpZiAocGFnZW1hc2sgJiB+UEFHRV9NQVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJ cHRlMCA9IChwdGUwICYgfihQVEVfVlIgfCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVf RCkpOworCQkJCW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CisJCQl9CiAJCX0KIAkJdGxiX3dyaXRl X2luZGV4ZWQoKTsKIAl9CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlwc193cl9wYWdl bWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21p cHMvc3d0Y2guUyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwotLS0gYS9zeXMvbWlwcy9taXBzL3N3 dGNoLlMKKysrIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCkBAIC0zMTUsMzYgKzMxNSw5MSBAQAog ICogTk9URTogVGhpcyBpcyBoYXJkIGNvZGVkIHRvIFVQQUdFUyA9PSAyLgogICogQWxzbywgdGhl cmUgc2hvdWxkIGJlIG5vIFRMQiBmYXVsdHMgYXQgdGhpcyBwb2ludC4KICAqLwotCU1UQzAJdjAs IE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExC X0hJCSMgVlBOID0gdmEKIAlIQVpBUkRfREVMQVkKIAl0bGJwCQkJCQkjIHByb2JlIFZQTgogCUhB WkFSRF9ERUxBWQotCW1mYzAJczAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJbWZjMAkJczAsIE1J UFNfQ09QXzBfVExCX0lOREVYCiAJSEFaQVJEX0RFTEFZCiAKLQlQVFJfTEkJdDEsIE1JUFNfS1NF RzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKLQlibHR6CXMwLCBlbnRyeTBzZXQKKwkj IE1JUFNfS1NFRzBfU1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8w X1RMQl9ISQorCVBUUl9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIg ZW50cnkKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWJsdHoJCXMwLCBpbnZhbF9ueHQxCisj ZWxzZQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKyNlbmRpZgogCW5vcAotCXNsbAlzMCwgUEFHRV9T SElGVCArIDEKLQlhZGR1CXQxLCBzMAotCU1UQzAJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJc2xs CQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQUREVQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19D T1BfMF9UTEJfSEkKIAlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlQVEVfTVRD MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9Q R19NQVNLCiAJSEFaQVJEX0RFTEFZCiAJdGxid2kKIAlIQVpBUkRfREVMQVkKLQlNVEMwCXYwLCBN SVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf UEFHRQorLyoKKyAqIFdpdGggYSBLU1RBQ0tfUEFHRV9TSVpFIG9mIDE2SyBhbmQgUEFHRV9TSVpF IG9mIDRLIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAqIGEgc2Vjb25kIFRMQiBlbnRyeSBpcyBjdXJy ZW50bHkgbWFwcGluZyB0aGUga2VybmVsIHRocmVhZCBzdGFjayBhcyBhCisgKiByZWd1bGFyIDRL IHNpemVkIHBhZ2UocykuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kLCBpZiBzbywgaW52YWxpZGF0 ZQorICogdGhhdCBUTEIgZW50cnkgYXMgd2VsbC4KKyAqLworI2lmIChQQUdFX1NJWkUgIT0gNDA5 NikgJiYgKEtTVEFDS19QQUdFX1NJWkUgIT0gMTYzODQpCisjZXJyb3IgUEFHRV9TSVpFIGlzIG5v dCA0SyBvciBLU1RBQ0tfUEFHRV9TSVpFIGlzIG5vdCAxNksuCisjZW5kaWYKK2ludmFsX254dDE6 CisJbW92ZQkJdjEsIHYwCisJUFRSX0FERFUJdjEsIFBBR0VfU0laRSAqIDIKKwlNVEMwCQl2MSwg TUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlIQVpBUkRfREVMQVkKKwl0bGJwCQkJCQkJ IyBwcm9iZSBWUE4KKwlIQVpBUkRfREVMQVkKKwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5E RVgKKwlIQVpBUkRfREVMQVkKKworCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQ QUdFX1NJWkUpIC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9T VEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKwlub3AK KwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1UQzAJCXQxLCBN SVBTX0NPUF8wX1RMQl9ISQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMAorCVBU RV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBf VExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKwl0bGJ3aQorCUhBWkFSRF9ERUxBWQorI2VuZGlm CS8qIEtTVEFDS19MQVJHRV9QQUdFICovCiAKIGVudHJ5MHNldDoKKwlNVEMwCQl2MCwgTUlQU19D T1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2FpbgorCUhBWkFSRF9ERUxBWQogLyogU01QISEgLSBX b3JrcyBvbmx5IGZvciAgdW5zaGFyZWQgVExCIGNhc2UgLSBpLmUuIG5vIHYtY3B1cyAqLwotCW10 YzAJemVybywgTUlQU19DT1BfMF9UTEJfSU5ERVgJCSMgVExCIGVudHJ5ICMwCisJbXRjMAkJemVy bywgTUlQU19DT1BfMF9UTEJfSU5ERVgJIyBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKIAlQ VEVfTVRDMAlhMSwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIHVwdGVbMF0KIAlIQVpBUkRfREVMQVkK IAlQVEVfTVRDMAlhMiwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIHVwdGVbMV0KKyNpZmRlZiBLU1RB Q0tfTEFSR0VfUEFHRQorCUhBWkFSRF9ERUxBWQorCWxpCQl0MSwgS1NUQUNLX1RMQk1BU0tfTUFT SworCU1UQzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCiAJSEFaQVJEX0RFTEFZCisjZWxz ZQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNl bmRpZgogCXRsYndpCQkJCQkjIHNldCBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKKworI2lm ZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT SworCUhBWkFSRF9ERUxBWQorI2VuZGlmCiAvKgogICogTm93IHJ1bm5pbmcgb24gbmV3IHUgc3Ry dWN0LgogICovCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMgYi9zeXMv bWlwcy9taXBzL3BtYXBfbWlwczY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVs bAorKysgYi9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKQEAgLTAsMCArMSw1NTI0IEBACisv KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo dCAoYykgMjAwMyBQZXRlciBXZW1tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp Z2h0IChjKSAyMDA1LTIwMTAgQWxhbiBMLiBDb3ggPGFsY0Bjcy5yaWNlLmVkdT4KKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RhY2V5IEQuIFNvbiA8c3Nv bkAuLi4+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJp dmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIHRoZSBTeXN0 ZW1zIFByb2dyYW1taW5nIEdyb3VwIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggQ29tcHV0ZXIK KyAqIFNjaWVuY2UgRGVwYXJ0bWVudCBhbmQgV2lsbGlhbSBKb2xpdHogb2YgVVVORVQgVGVjaG5v bG9naWVzIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5 IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0 aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZl cnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNl ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdh cmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJV VE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENP TlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJ TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH T09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC VVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZ LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g QU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbToJ QCgjKXBtYXAuYwk3LjcgKEJlcmtlbGV5KQk1LzEyLzkxCisgKglmcm9tOiBzcmMvc3lzL2kzODYv aTM4Ni9wbWFwLmMsdiAxLjI1MC4yLjggMjAwMC8xMS8yMSAwMDowOToxNCBwcworICoJSk5QUjog cG1hcC5jLHYgMS4xMS4yLjEgMjAwNy8wOC8xNiAxMTo1MTowNiBnaXJpc2gKKyAqLworCisvKgor ICoJTWFuYWdlcyBwaHlzaWNhbCBhZGRyZXNzIG1hcHMuCisgKgorICoJU2luY2UgdGhlIGluZm9y bWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUgaXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBs b2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUsCisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cg YXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55 IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25zCisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2Fs IG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJcmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVy IHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRlY3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1 YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVzIGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxl IG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVjZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9u cyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUgYWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRo aXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3JtYXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nl c3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGljaCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5 c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVjdC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlICJvcHRfZGRiLmgiCisj aW5jbHVkZSAib3B0X3BtYXAuaCIKKyNpbmNsdWRlICJvcHRfdm0uaCIKKworI2luY2x1ZGUgPHN5 cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rdHIuaD4K KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8 c3lzL21zZ2J1Zi5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9wY3B1 Lmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5j bHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5oPgorI2Vs c2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3lzY3Rs Lmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1ZGUgPGRk Yi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9w YXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+ CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5j bHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1 ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNsdWRlIDx2 bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUv Y2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1hY2hpbmUv dGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9TVElDKQor I2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9JTkxJTkUK KyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNkZWZpbmUg UFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZfU1RBVCh4 KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJKChwYSkg Pj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9pbmRleChw YSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBIWVNfVE9f UFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkgJSBOUFZf TElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2tw LCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlcCisJc3Ry dWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0gUEhZU19U T19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkgewkJCVwK KwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3ApOwkJXAor CQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJCVwKKwl9 CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZN X1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBW TV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3Ap CQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJCQkJCQlc CisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2NrcCk7CQkJ XAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm aW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNUX0xPQ0so Vk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIv a2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2KQkoKCh2 KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2luZGV4KHYp CSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wdGVfaW5k ZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5lCXBtYXBf cGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJKE5QREVQ RyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykKKworI2Rl ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K Kworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdfUkQsIDAs ICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9IDA7CitT WVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxBR19SRFRV TiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBsYXJnZSBw YWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VSVkVECTAK Kwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVTUzsKKwor c3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGljIHN0cnVj dCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBmb3IgdGhl IHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9IRUFEKHBj aCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZfY2h1bmtz KTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1Y3Qgcnds b2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBtZF9wYWdl ICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZfY2h1bmsg KnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2VudHJ5X3Qg cHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qg cndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5rKHBtYXBf dCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBf cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFnZV90IHBt YXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRp YyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90IG1wdGUs ICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9lbnRyaWVz KHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz dGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZV9s b2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3BkZShw bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsK K3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9jayAqKmxv Y2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0 YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGlj IHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt X3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBt YXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRlKTsKK3N0 YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFn ZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9wdF9wYWdl KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3Byb21vdGVf cGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShwbWFwX3Qg cG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0IHNwZ2xp c3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3Zl X3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpw bWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7CitzdGF0aWMg Ym9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMg dm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRfZW50 cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCk7 CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zm c2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsKKworc3Rh dGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwK KyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxv Y3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCByd2xvY2sg Kipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwg cGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBpbml0X3B0 ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCk7CisK K3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworc3Rh dGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOworc3RhdGlj IHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAqIFBhZ2Ug dGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNlZ21lbnQg ZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19pbmxp bmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9 CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdtZW50IHRh YmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgor cG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlw ZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAo JnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBkaXJlY3Rv cnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19p bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7 CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBf cGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRy eSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg X19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAqcGRlLCB2 bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRfZW50cnlf dCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQorCisvKiBS ZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRyZXNz LiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp Cit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKHBk ZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRlKTsKKwl9 IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitzdGF0aWMg X19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAsIGludCBj b3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBtYXAtPnBt X3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9p ZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkKK3sKKwor CVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+cG1fc3Rh dHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVudCBjb3Vu dCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf Y291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gY291bnQ7 Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhlIHZpcnR1 YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZzZXRfdAor cG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBiYW5rX3Np emUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CisJ YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUgKHNpemUg PiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsg Ml07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJdOworCQkJ cGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlzX2F2YWls W2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZhaWxbMF0p CisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJYmFua19z aXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBwaHlzX2F2 YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJF Q1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsKK30KKwor LyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1l bW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVl biBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5lbF9wYWdl dGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJcHRfZW50 cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7CisJaW50 IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtl cm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVt b3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBwYWdlIHRh YmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5QREVQRyk7 CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJbmtwdCA9 IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CisK KwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2Jh bCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAy IHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh bCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBh bmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkg KiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRh ZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisK Kwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdt YXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChw ZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBH ICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRy ICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQTUFQX0xP Q0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9z ZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxRX0lOSVQo Jmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lk ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7 CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCit2b2lk CitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8KK2FnYWlu OgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkvKgor CQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJ cGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNfYXZhaWxb aSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkgPCAyKQor CQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsK KwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFpbFtpICsg MF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2YWlsW2kg KyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2 YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJCXBoeXNf YXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyoK KwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5n IG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9 IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOworCQlwaHlz bWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVtID0gYXRv cChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQ aHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp ICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNpemUgPSBw aHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhqeCAtICUj MDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf YXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAxLAorCQkJ ICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUpOworCQl9 CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1heG1lbSkp OworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5p bmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBtYXBfc3Rl YWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVmc2l6ZSk7 CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtT VEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJRlQpOwor CWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIpKTsKKwor CXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9lbmQgPSBW TV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFsIHNvbWUg dmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLworCXZpcnR1 YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsKKwlwY3B1 cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCArPSBQQUdF X1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50cnkgbWFw cGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBVcCB1bnRp bCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVwJyBmb3Ig dGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcwIHNvIHRo ZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNwdV90bGJf aW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoInBjcHUg aXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNlbmRpZgor CisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBWTU5V TV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOworCisJ LyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLworCXJ3X2lu aXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisgKiBJbml0 aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwordm9pZAor cG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5tZC5wdl9s aXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQorCisvKgor ICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5pdCwgdG8g aW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMg dG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkKK3sKKwlp bnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0aWFsaXpl IHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVua3NfbXV0 ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJICogSW5p dGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkg PCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ldLCAicHYg bGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhlYWQgdGFi bGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV07 IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAyKSArIDFd KSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBoZWFkIHRh YmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcgKiBzaXpl b2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJsZSA9IChz dHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAgTV9XQUlU T0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJTFFfSU5J VCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm1fcG1h cCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFwcGluZyBj b3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZU0NUTF9V TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQsCisgICAg JnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitzdGF0aWMg dV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3BkZSwgT0lE X0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5ncywgMCwg IjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9mYWlsdXJl czsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVzLCBDVExG TEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9u IGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsKK1NZU0NU TF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFHX1JELAor ICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIpOworCisv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBM b3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBfX2lubGlu ZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQgKCpmbiko dm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNwdXNldF90 IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXAp KSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3RvIG91dDsK Kwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQVV9GT1JF QUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUpKQorCQkJ cG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQoY3B1aWQp OworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgorCSAqIFRh a2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBhcmUgaWdu b3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNzIG9uIGlu YWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsKKwlzZWxm ID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQsICZhY3Rp dmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1IGlzIHRo ZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykpIHsKKwkJ aWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJQ1BVX1NF VChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3RpdmVfY3B1 cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7Cit9Cisj ZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2 ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlp bnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJnKTsKKwkJ cmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9JU1NFVChj cHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdlbiA9IDA7 CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMgdm9pZAor cG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9vbl9hY3Rp dmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0ZV9hbGxf dXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBt YXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfaW52 YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0 ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+cG1hcCwg cC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg YXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2FsbF9vbl9h Y3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcpOworfQor CitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1f b2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFw X2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1hcF9pbnZh bGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHAtPnBt YXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9y YW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJ c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFw OworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZl X2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9CisKK3N0 cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zmc2V0X3Qg dmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFn ZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAqcCA9 IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisKK3N0YXRp YyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRf ZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFy Zy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBtYXBfY2Fs bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFyZyk7Cit9 CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVfaXNfMW1f c3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNpZmljIDJt YiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2YSAmIH5Q RFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2UgaWYgKCFw dGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBmbHVzaCBl dmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRoZXJlIGFy ZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52YWxpZGF0 ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246IGZsdXNo IGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRpbmcgYW55 IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsKCk7 CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJ dm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOwor fTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0KQorewor CXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3VwZGF0ZV9w ZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30KKworc3Rh dGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq cGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3BkZSk7Cit9 CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1 YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxpdHkgb2Yg dGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNhbWUgdmly dHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0aWMgdm9p ZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlf dCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2Fy ZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBkZSA9IHBk ZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3JlKHBtYXAs IHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRh dGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91dGluZToJ cG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdl IGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2FkZHJl c3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZt X29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFw X3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwYSA9 IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7CisJCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0gVExCTE9f UFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1h cCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5k X2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUg cGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVz cyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24u CisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9l bnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3BhZ2VfdCBt OworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBNQVBfTE9D SyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZXAg IT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk ZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAocHJvdCAm IFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9fUEEoKnBk ZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVs b2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0gUEhZU19U T19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9IGVsc2Ug eworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRlcCAhPSBO VUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlKSAmJgor CQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3QgJiBWTV9Q Uk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsK KwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJICAgICZw YSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0ZV9wYSk7 CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFfVU5MT0NL X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qLQor ICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUg cGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJlc3MuCisg Ki8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1h cHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICov CisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQor CQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tT RUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9U T19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNf S1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkg KiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQURE UkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCWlm IChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBfcGRlKCZj dXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5VTEwgfHwg KnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBh Z2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJldHVybiAo VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsKKwkJCX0K KwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXApIHsKKwkJ CQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQQUdFX01B U0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNob3VsZCBi ZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBlZCA9ICh2 YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1hcHBlZCA9 IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtTRUdfRU5E KTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkgeworCQlw ZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRoZSBrZXJu ZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9wbWFwLT5w bV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdl ICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09 IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18x bV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJ CXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0sp KTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0 ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEg JiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBhbmljKCIl cyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAqKXZhKTsK K30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQgYSB3aXJl ZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9vZmZzZXRf dCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0 X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj ZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7 CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVfUkVGIHwg UFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0ZV9pc192 YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90IHZhLCB2 bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwKKwkJKCJw bWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9sb25nKXBh KSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQorCisvKi0K KyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLworIC8qIFBN QVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9l bnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9tIHRoZSBw YWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4 KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKKwlw dGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVsX3BtYXAs IHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVz c2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJVGhlIHZh bHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IK KyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEgZGlyZWN0 LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0aGUgYXBw cm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcqdmlydCcg dW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBwYWdlcyBz dGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUgZmlyc3Qg dXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAqCVVzZSBY S1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29mZnNldF90 ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3QpCit7CisK KwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisgKiBBZGQg YSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBpcyBvbmx5 IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90IG5lZWQg dG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRlZC4KKyAq IE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVyLiAgVGhl IHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9vZmZzZXRf dCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zmc2V0X3Qg b3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwbWFwX2Zs dXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BIWVMobVtp XSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Vf aW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMgcm91dGlu ZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMgbWVhbnQg b25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1vdmUodm1f b2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0 X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNhY2hlX3di aW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0gdmE7CisJ ZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3RvcmUocHRl LCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJ cG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30KKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFn ZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lk CitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2bV9wYWdl X3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7CisJCVNM SVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUgdGhlIHBh Z2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJfQorfQor CisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUgcGFnZSB0 byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBzcGVjaWZp ZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBwaHlzaWNh bCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisgKi8KK3N0 YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9wYWdlX3Qg bSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJPKQorewor CisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UKKwkJbS0+ ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxpbmtzLnMu c3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBp bnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJs ZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNwb25zaWJs ZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4g IFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1YWwgYWRk cmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRfcHRfcGFn ZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBt YXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1fcm9vdCwg bXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1hcHBpbmcg dGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxMIGlmIHRo ZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lm aWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdAorcG1h cF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwlQTUFQ X0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xvb2t1cCgm cG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICogUmVtb3Zl cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcCdz IGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVjaWZpZWQg cGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3MgY29sbGVj dGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3BhZ2UocG1h cF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBN QV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5waW5kZXgp OworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUgY291bnQs IHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBhZ2UgdGFi bGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICogZHJvcHMg dG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0dXJucyBU UlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFMU0Ugb3Ro ZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vud2lyZV9w dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0IHNwZ2xp c3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0g MCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfcG1h cF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHN0 cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdl X3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8qCisJICog dW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBOVVBERSkg eworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lk ZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1l bnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChwZF9lbnRy eV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1fUEFHRShN SVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIHBk cGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJ KnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0KKworCS8q CisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBpdC4KKwkg KiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9yZSB1bm1h cHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1lZCBiZWZv cmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1YnRyYWN0 X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdlIG9uIGEg bGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNob290ZG93 biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZyZWUsIFRS VUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlz IHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQg bWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNl X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUsCisgICAg c3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAodmEgPj0g Vk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRlICE9IDAs ICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9fVk1fUEFH RShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndpcmVfcHRw KHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBtYXBfdCBw bWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+cG1fc2Vn dGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsKKwlmb3Ig KGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lkID0gUE1B UF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQorCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmspOworCWJ6 ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwordm9pZAor cG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCkKK3sKKworCXZtX3BhZ2VvdXRfZ3Jvd19jYWNo ZSgzLCAwLCBNSVBTX1hLUEhZU19MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90 CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sK Kwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNU X0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJPKTsKKwlp ZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAmIFBHX1pF Uk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5kZXg7CisJ cmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVkIGFuZCB6 ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ugc3RydWN0 dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3Qg cHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0 aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9j X2RpcmVjdF9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIFZNX0FMTE9D X05PUk1BTCkpID09IE5VTEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hl KCk7CisJfQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhw dGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pF Uk8oJnBtYXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJ CXBtYXAtPnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1f YXNpZFtpXS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwli emVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4g KDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBw YWdlIHRhYmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19w bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xv Y2sgKipsb2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQ TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJy aWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkog fCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2Nr cCAhPSBOVUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlU OworCQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CX0KKworCQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGlu ZywgdGhlIHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJ ICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAw KQorCQlwbWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFn ZSBpbnRvIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFk eSB0aGVyZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3Rh YltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJ cGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChT RUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQ RyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2Vn aW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBh IG5ldyBwZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsg c2VnaW5kZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQs IHJlbGVhc2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3Vi dHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVy byhtKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJl ZmVyZW5jZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19E SVJFQ1RfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBO ZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtw ZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3Vu dF9pbmMocG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90Citw bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAq KmxvY2twKQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9w YWdlX3QgbTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICov CisJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0 IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEp OworCisJLyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8g YQorCSAqIG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNf MW1fc3VwZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkp KSB7CisJCSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkp IHsKKwkJCSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBt YXkgaGF2ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5n IFBEIHBhZ2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICog SWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBo b2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAm JiAqcGQgIT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BI WVMoKHB0X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkv KgorCQkgKiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBi ZWVuCisJCSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAs IHB0ZXBpbmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJ CQlnb3RvIHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVh bGxvY2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBi eSB0aGUgZ2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxp emVkIGJ5IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBj YWxsZWQgaWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAor cG1hcF9yZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3Bh Z2VfdCBwdGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0g MCwKKwkgICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAor CSAgICBwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlk YXRlIGFueSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUg YXNpZC4KKwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1f b2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNf RElSRUNUX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWlj X3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3pl cm8ocHRkcGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0 YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29m ZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRw ZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFw LT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsK KwlpZiAoYWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5l bF9tYXAtPm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBk cGUgPSBwbWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJ CW5rcGcgPSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJ CQkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOwor CQkJaWYgKG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtl cm5lbCIsIF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVCgKKwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRy eSBhZ2FpbiAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3Zt X2VuZCk7CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3Zt X2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtl cm5lbF9tYXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+ bWF4X29mZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK KwkJICogVGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlu a3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkg ICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlp ZiAoIW5rcGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBr ZXJuZWwiKTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ UkVDVChWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAg c3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5z bGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVz IGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkg KiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp bGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICov CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1f ZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJu ZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4 X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGlu ZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworCitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RB U1NFUlQoX05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9f aW5saW5lIHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQorewor CisJcmV0dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJf dClQQUdFX01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYp LT5wY19wbWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVm aW5lCVBDX0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAw MDAwZmZmZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01d ID0geyBQQ19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUwor c3RhdGljIGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVl cywgcGNfY2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBj X2NodW5rX2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJl bnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lE X0FVVE8sIHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwK KyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lT Q1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAm cGNfY2h1bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5r cyBmcmVlcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZh aWwsIENUTEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGlt ZXMgdHJpZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9u ZyBwdl9lbnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRp YyBpbnQgcHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywg cHZfZW50cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3Vy cmVudCBudW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBP SURfQVVUTywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAw LAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05H KF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRy eV9jb3VudCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RM X0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZf ZW50cnlfc3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMi KTsKKyNlbmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRp dGlvbi4gIFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMg c28gd2UgY2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJl dHVybnMgTlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmll ZCBwbWFwLgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNl IHN1YnNlcXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMg dW50aWwgcmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNo b3J0YWdlIG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFp bV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sK KwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlf dCAqcGRlOworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2Vu dHJ5X3QgcHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0 IHNwZ2xpc3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQs IGlkeDsKKworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBf TE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5V TEwsICgicmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsK KwltX3BjID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFp bCk7CisJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJ UlNUKCZwdl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlM UV9SRU1PVkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5r c19tdXRleCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBO VUxMKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBs b2NrZWRfcG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMt PnBjX3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9j a3ApOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRf cG1hcCAmJiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJ TFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZf Y2h1bmtzX211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERl c3Ryb3kgZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJ CSAqLworCQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVs ZCsrKSB7CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb ZmllbGRdOworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJ CQliaXQgPSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2Up ICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0g cHYtPnB2X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBk ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsK KwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlp ZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNf a2VybmVsX3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpw dGUgPSAwOworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BU RV9UT19QQShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJ CQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19G SUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAg cGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBH QV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFV TCA8PCBiaXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJ CWZyZWVkKys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211 dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9y IGEgNCBLQiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7 CisJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJ UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NU QVQoYXRvbWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlM UV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19t YXBbMF0gPT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAg cGMtPnBjX21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3Rf aW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZw Y19jaHVua19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBp dC4gKi8KKwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJ CSAgICAodm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRk cik7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxR X0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVu a3NfbXV0ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3Vm ZmljaWVudC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJ VEFJTFFfQ09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr KCZwdl9jaHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlk YXRlX2FsbChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9D SyhwbWFwKTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7 CisJCW1fcGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVl LCBwbGlua3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICov CisJCW1fcGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2ly ZV9jb3VudCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4g KG1fcGMpOworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBs aXN0CisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRy eV90IHB2KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsK KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B U1NFUlQocG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRy eV9mcmVlcywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAx KSk7CisJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsK KwlwYyA9IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsK KwlmaWVsZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChz aXplb2YodV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7 CisJaWYgKHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19G UkVFMSB8fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0 aGUgdGltZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYg KF9fcHJlZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7 CisJCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRB SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJ cmV0dXJuOworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwlmcmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmso c3RydWN0IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9j aHVua3NfbXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwlt dHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu dCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu a19mcmVlcywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwlt ID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7 CisJZHVtcF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9J TkFDVElWRSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQ ViBlbnRyeSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgor ICogbmVlZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxp c3QgbG9jayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZy b20gYW4gYXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgor ICoKKyAqIFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0 aWMgcHZfZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoq bG9ja3ApCit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVj dCBwdl9jaHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxf bG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQ Vl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlw YyA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgewor CQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5w Y19tYXBbZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBm aWVsZCAqIHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAm cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJp dCk7CisJCQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8K KwkJCWlmIChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkg ICAgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNo dW5rLCBwYywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9s b25nKCZwdl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50 KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8g ZnJlZSBpdGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9j KE5VTEwsIDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxM T0NfV0lSRUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJ CVBWX1NUQVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJ bSA9IHJlY2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJ Z290byByZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQs IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlk dW1wX2FkZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQ U19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1h cDsKKwlwYy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0 IDAgKi8KKwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZS RUUyOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZw dl9jaHVua3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJ cHYgPSAmcGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2 Y2h1bmssIHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlf Y291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05Q Q1BWIC0gMSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVy IG9mIG9uZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQor eworCWludCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5n IHRoZSBvbmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVu dCB0eXBpY2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8K Kwljb3VudCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291 bnQrKzsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1i ZXIgb2Ygc3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAq IGV4Y2VlZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYg bGlzdCBsb2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZf ZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQor eworCXN0cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZh aWwsIGZyZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJU KGxvY2twICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoK KwkgKiBOZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0 ZSBsaXN0IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBi ZWVuIGFsbG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQg cmVjeWNsZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1 bmtzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRB SUxRX0lOSVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNI KHBjLCAmcG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNf bWFwX2VsZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0o cGMtPnBjX21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21h cFsyXSk7CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJ aWYgKGF2YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVk ZWQ7IGF2YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9B TExPQ19OT1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJ CWlmIChtID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK KwkJCWlmIChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21p Y19hZGRfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50 KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOwor CQlwYyA9IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZS RUUwOworCQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19G UkVFMjsKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0 KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RB VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRB SUxRX0VNUFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJ CVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxv Y2soJnB2X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhl biByZW1vdmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwK KyAqIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBl bnRyeSBpZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2Fu IGJlIHBlcmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2Ug bWFwcGluZ3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0 IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5 X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlM UV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBW X1BNQVAocHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2 X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQor CX0KKwlyZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIg cGFnZSBtYXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2 IGVudHJ5IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYK KyAqIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0 aWMgdm9pZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1k X3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1f b2Zmc2V0X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3 X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIl czogcGEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElT VF9MT0NLX1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFn ZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2 IGxpc3QuICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICog bXVzdCBub3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50 aWF0ZWQuCisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2 YSk7CisJcHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAh PSBOVUxMLCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZN X1BBR0UocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4 dCk7CisJbS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRF UEcgLSAxIHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5 X2FsbG9jcywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpF OworCWZvciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJ CUtBU1NFUlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkg ICAgcGMtPnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsK KwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChw Yy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0g MTsKKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBj LT5wY19wdmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJ CQlwdi0+cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBP X1VOTUFOQUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg X19mdW5jX18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQor CQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1 bmssIHBjLCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmss IHBjLCBwY19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+ cGNfbWFwWzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgm cG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1h cC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9u ZygmcHZfZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFj dF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBw cm9tb3Rpb24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2Ug bWFwcGluZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdl IG1hcHBpbmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBp bmcuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap Cit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90 IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBh IGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9D S19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdl J3MgcHYgZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0 LiAgQXNpZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5 KCksCisJICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2Vu dHJ5KCkgY2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9j aHVuaygpIHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJv bW90ZWQuCisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBh Z2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NF UlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBw YV90b19wdmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9u ZXh0KTsKKwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx IHB2IGVudHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8g eworCQltKys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBt YXAsIHZhKTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmlu ZCBhbmQgdGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFu ZCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBv biBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8K K3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBw bWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2 aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZo X2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BB R0VfVE9fUEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAg ICAodV9sb25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBD b25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBp ZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9y dGluZyB0byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5z ZXJ0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisg ICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3Nl cnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs IE1BX09XTkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxM KSB7CisJCXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo bG9ja3AsIG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l eHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0 dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50 cnkgZm9yIGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4g YmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0 aWMgYm9vbGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1 Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9i YWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KwkvKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVj bGFtYXRpb24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVM TCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv Y2twLCBwYSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZw dmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChU UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEg cGFnZSB0YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFn ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRl LCBwdF9lbnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9 IGZpcnN0cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5l d3B0ZTsKKwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9 CisKKy8qCisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rp b24gZmFpbHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLwor c3RhdGljIGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90 ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVh bl90IHJ2OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBt YXAsIHBkZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxv Y2spOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBk ZTsKKwkgcHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90 IG1wdGVwYTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkg UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9s ZHB0ZSA9IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdl KCZvbGRwdGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBp cyBub3Qgc3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lz X3JlZigmb2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAh PQorCSAgICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVs c2UgeworCQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6 IHBhZ2UgdGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAg IF9fZnVuY19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGlu ZyBhbmQgcmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFj Y2Vzc2VkIG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFn ZSBmYWlscy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBk aXJlY3QgbWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkg ICogdGhlIHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3Nz aWJsZQorCQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRo ZSBwcmlvcml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxs b2NhdGVkIGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mg c3BhY2UsIHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBv ZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhl cmUuCisJCSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3Bh Z2VfYWxsb2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlO X0tFUk5FTF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9D X0lOVEVSUlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwg Vk1fQUxMT0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkg cG1hcF9yZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkg ICAgIGxvY2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZt X29mZnNldF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5Q RFJNQVNLKSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkg Q1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJ ICAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkg aWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5j KHBtYXAsIDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3 cGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0 ZSA9IG5ld3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczog b2xkcHRlIGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rl c3QoJm9sZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAo IiVzOiBvbGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9s ZHB0ZSAmIH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUg cGFnZSBpcyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3Vu dCA9PSAxKSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0 cChmaXJzdHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmly c3RwdGUpID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUg YW5kIG5ld3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1 bmNfXykpOworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0 ZXMsIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgq Zmlyc3RwdGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0sp KQorCQkgcG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRo ZSBzcGFyZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhl CisJICAqIG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhl cndpc2UsIHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBi ZSBpbmNvbnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVu aygpIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3Jvbmcg UFYgbGlzdCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBl Y3RlZAorCSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWlu ZyBkZW1vdGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkK KwkJIHJlc2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoK KwkgICogRGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQg UERFIGhhcworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xl YXIsIGl0IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdl ciBvZiBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0 dGluZyBvZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3Zl IGFuZCB0aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEs IHBkZSwgKHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3Rh bGUgcmVjdXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlm ICh2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFw LCAodm1fb2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUg dGhlIFBWIGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VE KSkgeworCQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xk cGRlKSwgbG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25z LCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQor CisvKgorICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFn ZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFw X3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90 IGRvaW5nIGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2Vy bmVsX3BkZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitz dGF0aWMgaW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwg dm1fb2Zmc2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2Nr ICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsK Kwl2bV9vZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBX cml0ZSBiYWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBw ZWQuCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNL KSwgTkJQRFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VS VCgoc3ZhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBu b3QgMm1wYWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9s ZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRl X2xvYWRfc3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlw bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChw ZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9w bWFwLCBzdmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdF X1NJWkUpOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hB TkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7 CisJICAgIHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBt YXBfcHZoX2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkg ICAgZm9yICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xk cGRlKSk7CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBk ZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJ CSAgICB2bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9S RUYpKQorCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYg KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZf bGlzdCkpCisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkg ICAgfQorCX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJu ZWxfcGRlKHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBf cHRfcGFnZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92 ZV9wdF9wYWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwg MSk7CisJCQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1h cF9yZW1vdmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2ly ZV9jb3VudCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBG QUxTRSk7CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsK KwkJfQorCX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAo cG1hcCwgc3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUg dGhpbmdzIHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1h cF9yZW1vdmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNl dF90IHZhLAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3Ry dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlf dCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X TkVEKTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFn ZSBiZWluZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2 YSwgUEFHRV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt YXApKQorCQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVz dCgmb2xkcHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisK KwlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0 ZSwgUFRFX01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BB KG9sZHB0ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJU KCFwdGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBu b3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQg Kil2YSwgKHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJ aWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVG RVJFTkNFRCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJ CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+ bWQucHZfbGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsK KwkJCXB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VN UFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRF QUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUs IGZyZWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNz IGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0 IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlz dHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7 CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShw bWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8g cHRlIGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192 YWxpZChwdGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92 ZV9wdGUocG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5V TEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEp OworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0 aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFu ZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3Zv aWQKK3BtYXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90 IGV2YSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0 OworCXBkX2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOwor CXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3Jt IGFuIHVuc3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLwor CWlmIChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlh bnl2YWxpZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcg b2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBl YXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9T SVpFKSA9PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVf aXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAm ZnJlZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBz dmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50 X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh KTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29u dGludWU7CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFi bGUuCisJCSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAo dmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3Rv X3BkZShwZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91 dCBpbnZhbGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNv bnRpbnVlOworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBk ZV9pc18xbV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92 aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBw aW5nIGFuZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9u ZXh0ICYmIGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZv ciBhIFBURV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9w ZGUoKS4KKwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJ CWFueXZhbGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZm cmVlLCAmbG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9w ZGVfbG9ja2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBz dXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBl bHNlIHsKKwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0 IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBi eSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAq IHJhbmdlIGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZh X25leHQgPSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3Rv X3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdF X1NJWkUpIHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFf bmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJ CXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90 ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9u ZXh0KQorCQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2 YSwgcHRwYWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0la RTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK KwkJcndfd3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VO TE9DSyhwbWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglS b3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBw aHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNp ZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAq CU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkK KyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1h cF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3Qg bSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBt YXA7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZz ZXRfdCB2YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMg bm90IG1hbmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdv dG8gc21hbGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7 CisJd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92 YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUo cG1hcCwgcGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdz OgorCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsK KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICog SWYgaXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUg cGFnZSBiZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0 KSA9PSBOVUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQ QUdFX1NJWkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUg PSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpw ZGUgIT0gMCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1 cGVycGFnZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJw YWdlIGluIHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNf a2VybmVsX3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwg UFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBV cGRhdGUgdGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlp ZiAocHRlX2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJF TkNFRCk7CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf dGVzdCgmdHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0 YWJsZTogdmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+ cHZfdmEsICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlw bWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZf bGlzdCwgcHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShw bWFwLCBwdik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xl YXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlw bWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRl OiBkbyB0aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8K K3N0YXRpYyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5 X3QgKnBkZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90 IG5ld3BkZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJ Ym9vbGVhbl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVE KTsKKwlLQVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90 IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRy eToKKwlvbGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVf TUFOQUdFRCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQ SFlTX1RPX1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7 IHZhICs9IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAm JgorCQkJICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHko bSk7CisJfQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgm bmV3cGRlLCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAo bmV3cGRlICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlf dCAqKXBkZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkK KwkJCWdvdG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFw X2ludmFsaWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJV RTsKKwl9CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNp Y2FsIHByb3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMg cmVxdWVzdGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRf dCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0 ZTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90 ICYgVk1fUFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwg c3ZhLCBldmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJ cmV0dXJuOworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdl ZCA9IEZBTFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9 IHZhX25leHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRw ZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYg KHZhX25leHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJ CXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3Zh KQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2 YSk7CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlm ICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3Vw ZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoK KwkJCSAqIEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJ CQkgKiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYg KHN2YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJ CSAqIFRoZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0 ZWQgYnkgcG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3Rf cGRlKHBtYXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJ Y29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJ CXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xv YmFsX2xvY2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRh dGVfYWxsKAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJ fQorCQkJCX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJ CQkJLyoKKwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJ CSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQg b3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5 IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICog cmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEp CisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFw X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEg Kz0gUEFHRV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJ CQl2bV9wYWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxp ZCgmcGJpdHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2 YV9uZXh0KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJ CQkJdmEgPSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQo JnBiaXRzLCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJ cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9N QU5BR0VEKSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQ SFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlp ZiAodmEgPT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJ CQkJICogVW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGlu ZyAic3ZhIiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0 IGJlIGludmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJ CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0 OworCQkJCX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4 dCkKKwkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFu eWNoYW5nZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xv Y2tlZCkgeworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9D SyhwbWFwKTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3Vv dXMgNEtCIHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRh YmxlIHBhZ2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8K KyAqIG9jY3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBt YXBwaW5ncyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkg YW5kICgyKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hh cmFjdGVyaXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBk b25lIGluIHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFy ZHdhcmUgYXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisg KiBUTEIgZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9u IHRoYXQgdGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRp YyB2b2lkCitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZt X29mZnNldF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90 IG5ld3BkZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9v ZmZzZXRfdCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBz cGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwg dW51c2VkLCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICog d2l0aGluIGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVu Y18ybXBhZ2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICov CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3Bk ZSkgfHwgIXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor CX0KKwlpZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwg UFRFX1JPKSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9S TyBjYW4gYmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJ aWYgKCFhdG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3Bk ZSB8CisJCSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87 CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNw ZWNpZmllZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0 S0IgcGh5c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3Rl cmlzdGljcyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5l d3BkZSkgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBH IC0gMTsgcHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7 CisJCWlmIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9s b25nKCZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFp bHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXAp OworCQkJcmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFw dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw dGUsIG9sZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0 ZSB8PSBQVEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRM QkxPX1BURV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6 IHByb3RlY3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0 ZXZhLCBwbWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5l d3BkZSAmIFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVf cF9mYWlsdXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj bHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsK KwkJfQorCQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRh YmxlIHBhZ2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcg dGhlIHN1cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVz dHJveWVkIGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BB R0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2Vf YXJyYXkgJiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0s CisJICAgICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykp OworCUtBU1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgi JXM6IHBhZ2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYg KHBtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZw bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0 dXJuOworCX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAo cHRlX3Rlc3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBt YXAsIHZhLCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAg dGhlIHN1cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3 cGRlIHwgUFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9u cywgMSk7CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBn aXZlbiBwaHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl c3MgKHYpIGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9u IHJlcXVlc3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQg ZG93biwgbWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWlt ZWQuCisgKgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBs YXp5LWV2YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0 aW5lIG11c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFw IE5PVy4KKyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg dm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNp bmQgX191bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZt X3BhZGRyX3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9l bnRyeV90ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAg ICBwdl9lbnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJv b2xlYW5fdCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAg IEtBU1NFUlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2Jp ZyIpKTsKKyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8 fCB2YSA8IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEs CisgICAgICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNs ZWFuIHN1Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9 PSAwICYmICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FT U0VSVF9MT0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAg ICBsb2NrID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAg ICAgIFBNQVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2Fz ZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAg ICAqIGNyZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBp ZiB0aGUgcHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAg ICAgICAgICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAg ICAgIG5vc2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAg ICAgICAgICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDog JmxvY2spOworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAg IHJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQ TUFQX1VOTE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9S RVNPVVJDRV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJ cGFuaWMoIiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7 CisJfQorCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAg ICAgICAgKiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEg bmV3IFBUIHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAg ICAgICAgICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBw ZGlyPSVwLCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2Vn dGFiLCAodm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19Q SFlTKG0pOworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9w YSA9IFRMQkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19Q QV9UT19QRk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8q CisgICAgICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2lt dWxhdGVkIGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8g YXZvaWQgYSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUp OworICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFw KSkKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNo ZWFibGVfbWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09 IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg ICAgICAgICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAg ICAgICAgICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAg ICAgIGlmICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAg ICAgICAgbmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf Tk9TVE9SRVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNl bmRpZgorCisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVh YmxlIG1hcHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2Fu dCB0byB0YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3Ig dGhlc2UgbWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh PSAwKSB7CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQ VEVfRDsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5n ZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAg ICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0 ZSBzdGF0cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcg UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAg ICAgICAgICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2Vy IHBhZ2UgaXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBh bHNvLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm bmV3cHRlLCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAg ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAg ICAgIGVsc2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdw dGUsCisgICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IHBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJU KCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAg ICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAor ICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmln cHRlKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0 aGUgZXh0cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg ICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRl LT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndp cmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjog bWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYg KHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0 ZSB8PSBQVEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJ CQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlk YXRlOworCX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5n IGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisg ICAgICAgICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAg ICAgICAgaWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291 bnQtLTsKKworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFH RUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEp OworICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdF KCZsb2NrLCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92 ZSgmb20tPm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IGlmIChtcHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVf Y291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3Vu dCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5n IHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIgdmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg fSBlbHNlCisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7 CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBv ZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFn cyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF X01BTkFHRUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2 ID0gZ2V0X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEg PSB2YTsKKyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ss IHBhKTsKKyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwg cHYsIHB2X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAg ICAgICAgIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAg ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVs c2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAg ICAgLyoKKyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAg ICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBt X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAg ICAgICAgcHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2 YSwgKHZvaWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1h cHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAg ICAgICogdXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUg JiB+IChQVEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRl IHw9IFBURV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkg IT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAg ICAgICAgICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg ICAgICAgYm9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRf c3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19y ZWYoJm9yaWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0 ZSwgUFRFX0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01B TkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2Vf ZGlydHkob20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBW TV9QUk9UX1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGludmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYK KwkJCSAgICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlM UV9FTVBUWSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAg fSBlbHNlCisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAg LyoKKyAgICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2Vy dmF0aW9uIGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJv bW90aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+ d2lyZV9jb3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9s ZXZlbF9pZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRl KHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkg JiBEIGNhY2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAg ICAgICAgICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3Ro ZXJ3aXNlLCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgor ICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9 PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBW TV9QUk9UX0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5n ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQor ICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2 aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1 cm4gKEtFUk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFK T1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAy LiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFn ZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9p ZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2Vf dCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CSh2b2lkKXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAm bG9jayk7CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMg dm1fcGFnZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwg c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZt X3BhZGRyX3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWku Y2xlYW5fc3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQ T19VTk1BTkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhl IGNsZWFuIHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgor CSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3 ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf QUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwor CQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBp bmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXgg PT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJ LyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0g cG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFn ZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5k IGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlm IChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0 ZSA9IFBIWVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7 CisJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBh c3MgTlVMTCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNh dXNlIHdlIGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBf YWxsb2NwdGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQor CQkJCQlyZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7 CisJfQorCisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRl KSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQlt cHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIg b24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYg KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNl cnRfcHZfZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7 CisJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEs IG1wdGUsICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJ CQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOwor CQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMK KwkgKi8KKwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFH RV9UT19QSFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHBy b3RlY3Rpb24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwg UFRFX1ZBTElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3 cHRlIHw9IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlm IChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUg fD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9 IGVsc2UKKwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYg KGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9z ZXQoJm5ld3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRl X3N0b3JlKHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0 aGlzIG9ubHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQg cHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBv Y2N1ci4KKwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAp IHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQ QUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJ CX0KKwl9CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBN YWtlIGEgdGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMg b25seSBpbnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNl IFhLUEhZUyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2 bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVS Uk9SISEhIE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1h cHBpbmcgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1J UFNfUEhZU19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5 X2ZyZWUodm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAq LworCXJldHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5k ZXhfdCBwZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90 IG1wdGUgPSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToK KwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAo KnBkcGUgIT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4g Ki8KKwkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkp OworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBw ZCBwYWdlLiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJ CQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5k ZXggPj4gTlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShw bWFwLCBOVVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxv Y2twICE9IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOwor fQorCisvKgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMg VFJVRSBpZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEp IGEgcGFnZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tp bmcsICgyKSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFs IGFkZHJlc3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhv dXQgcmVjbGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90Citw bWFwX2VudGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2 bV9wcm90X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlf dCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBz cGdsaXN0IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFs X2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK KwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwg cG1hcCBmb3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNs eCBpbiBwbWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJ CXJldHVybiAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZh LCBOVUxMKSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZh ICUjbHggaW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4g KEZBTFNFKTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChw ZF9lbnRyeV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOwor CXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJ S0FTU0VSVChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNv dW50IGlzIHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNU UjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5j X18sCisJCSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BB R0VfVE9fUEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZO KHBhKSB8IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkp IHsKKwkJaWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJ CW5ld3BkZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NB Q0hFOworCX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKwor CQkvKgorCQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBi ZSBjcmVhdGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZN X1BBR0VfVE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7 CisJCQlpZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlw bWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo JmZyZWUpOworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4 IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZB TFNFKTsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBw bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoK KwkgICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0 b3JlKHBkZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1 dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25n cyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJs ZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkg JiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90 ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNh Y2hlX3N5bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2 YSwgTkJQRFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmco JnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZv ciB2YSAlI2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0 dXJuIChUUlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdl cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3 aXRoIHRoZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0 aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMK KyAqIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0 IGJ5IHRoZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFy dCB3aXRoaW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBp cyB0aGUgcGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQg Y2FuIGJlIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisg KiB2aXJ0dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0 YXJ0IGFuZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVu dCBwYWdlIGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0 YXJ0IGFyZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0 YXJ0LCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNl dF90IHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOwor CisJVk1fT0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0g YXRvcChlbmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9 IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor CXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgp IDwgcHNpemUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJN QVNLKSA9PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYm IHBnX3NwX2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90 LCAmbG9jaykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJ bXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAg IG1wdGUsICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9j ayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0 X3B0IHByZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3Bl Y2lmaWVkIHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0 cyBvbiBwcm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoK KyAqIFRoaXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQor ICogcHJvY2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICog YXJlIHRha2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2lu aXRfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwK KyAgICB2bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3Qg KnBkZTsKKwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9t ZW1hdHRyX3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOwor CUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBP QkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0Iikp OworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2Vy bmVsIHBtYXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBE UiAtIDEpKSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19z cF9lbmFibGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3Qs IHBpbmRleCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdl X2xvb2t1cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9C SVRTX0FMTCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJ CW1lbWF0dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBw aW5nIGlmIHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8g YSAyTUIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHAp OworCQlpZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBT a2lwIHRoZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkg KiB0aGUgcGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJp bmcKKwkJICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBs aXN0cSk7CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7 CisJCSAgICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFH RV9CSVRTX0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkp OworCQkJaWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0g cC0+bWQucHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0 cSk7CisJCX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAy TSBhbGlnbmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJ CVBNQVBfTE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsg cGEgKz0gTkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwp OworCQkJaWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9m IG1hcHBpbmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBh Z2UgZGlyZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxv Y2tpbmcsCisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhh bgorCQkJCSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29u dGludWU7CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1Qo CisJCQkgICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVf aW5kZXgoYWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7 CisJCQkJcHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAg UFRFX1BTXzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2Nh Y2hlYWJsZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJ CSAgICBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FD SEVEOworCQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNl CisJCQkJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5l d3B0ZSk7CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpF KTsKKwkJCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxz ZSB7CisJCQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLwor CQkJCXBkcGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAw LAorCQkJCSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJ CQkJICAgICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRk ciArPSBOQlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglD bGVhciB0aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lm aWVkIHJhbmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxp ZCBtYXBwaW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJp YnV0ZSBzZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUg dGhlIHdpcmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhl IHdpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2Fy ZSBmZWF0dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIg ZW50cmllcy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90 IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRf ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3Rz X2xvY2tlZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9D SyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBw bWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4 dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ CXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5C UERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7 CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVM TCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlp ZiAoIXBkZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUj anggaXMgbWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgor CQkJICogQXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkg KiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2 YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xl YXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndp cmVkX2NvdW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNl IHsKKwkJCQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBU UlVFOworCQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJ IFBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor CQkJCQkJIC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJ CQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5p YygicG1hcF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9u ZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19w dGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9T SVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYg KCFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4 IGlzIG1pc3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJ ICogUFRFX1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAor CQkJICogbG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3Nv cgorCQkJICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50 bHkuCisJCQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5w bV9zdGF0cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsK KwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7 Cit9CisKKy8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisg Kglmcm9tIHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRo ZSBkZXN0aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkg YW5kIG5lZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3Qg ZHN0X3BtYXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1f c2l6ZV90IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBU aGlzIGRvZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9y ZSBvdmVyaGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1 c2luZyBmYXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAq bG9jazsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRy LCB2YV9uZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlp ZiAoUENQVV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRy ID0gc3JjX2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2Jh bF9sb2NrKTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBk ZWFkbG9jay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0 X3BtYXApOworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhz cmNfcG1hcCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3Jj X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAq c3JjX3B0ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRl OworCQlwZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRy eV90IHNyY3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKwor CQlzcmNfcGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBl ID09IE5VTEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VH KSAmIH5TRUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUg Y29weSByYW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29w eSBhbGwgbWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAo dmFfbmV4dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJ CX0KKworCQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25l eHQgPCBhZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3Bk cGVfdG9fcGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3Jj X3BkZSA9PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRl OworCisJCWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1 cGVycGFnZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBO QlBEUiA+IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2Nw ZGUoZHN0X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQli cmVhazsKKworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJ CWRzdF9wZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1f UEFHRV9UT19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9p bmRleChhZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVz dCgmc3JjcHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0 X3BtYXAsIGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsK KwkJCQkqZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBf cmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7 CisJCQl9IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJ fQorCisJCXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21w dGUgPSBQSFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVf Y291bnQgPiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMg dW51c2VkIikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5k IG9mIHRoZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUg cGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkg Ki8KKwkJaWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKwor CQkvKgorCQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRo ZSBtYW5hZ2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3Bk ZV90b19wdGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1J UFNfUEhZU19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9w dGVfaW5kZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0g MCkKKwkJCWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZh X25leHQpIHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsK KworCisJCQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1 YWwgY29weSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwg UFRFX01BTkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICov CisJCQkJcGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRo ZSBwYWdlIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3Bt YXAsIGFkZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7 CisJCQkJCWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9U T19QSFlTKCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJ CQkJaWYgKGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRl cGluZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBq dXN0CisJCQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRz dG1wdGUtPndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUg cGFnZSB0YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2Nh dGVkLgorCQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJ CQkJCSAgICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5n IG1lbW9yeSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5 IHRoZSBwYWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09 IE5VTEwpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3 ZSBoYXZlIGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisK KwkJCQkvKiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9w dGUgPSAocHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlW TV9QQUdFX1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0 ZV9pbmRleChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICov CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJ CWlmICgqZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShk c3RfcG1hcCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBv cHVsYXRlIHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2Rp ZmllZCwgYW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1 cmluZyB0aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cg fCBQVEVfRCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOwor CQkJCQkvKiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRz dF9wbWFwLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJ aWYgKHBtYXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZm cmVlKSkgeworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAg YWRkcik7CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJ Z290byBvdXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3 ZSdyZSBkb25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndp cmVfY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlz cmNfcHRlKys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9j ayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNy Y19wbWFwKTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30K KworLyoKKyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFn ZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xl YXIgaXRzIGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3Zv aWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZt X3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RP X0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9T SVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91 bnBpbigpOworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lm aWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVz aW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5 IG5vdCBjb3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2 b2lkCitwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkK K3sKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMo bSk7CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJ Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKK3ZvaWQKK3Bt YXBfemVyb19wYWdlX2lkbGUodm1fcGFnZV90IG0pCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1f cGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBQQUdFX1NJ WkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCXNjaGVkX3Vu cGluKCk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAo bWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZp cnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1h Y2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBm b3IgNjQgYml0LgorICovCisjZGVmaW5lCVBNQVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRp YyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3Qg ZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFk ZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9fUEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19k c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBh Y2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgorCSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRo YXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGlu IFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8KKwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2 Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9f RElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpFKTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElS RUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsK KyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxhZ3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlf YmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxz ZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0Vf U0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0la RSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0 aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRseSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBw YWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24td3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChl LmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20gVk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlz IG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQgdG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5 c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFncykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8K KyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQK K3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFw X2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRzdCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkK K3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Modm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkK K3sKKworCXBtYXBfY29weV9wYWdlX2ludGVybmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7 Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVkX2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAor cG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29m ZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVy c2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIgKmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20s IGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29mZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJf dCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhm ZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNldCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlj bnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0laRSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFb YV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJCWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20p OworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250 LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0Vf U0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdFX1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9w dmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19U T19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBBR0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1J UFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSArIGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIg KilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVf Q0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9DT1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2Nw LCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxzZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsK KyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250 KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQliX29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09 IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5 X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFnZ2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisg KiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9w YWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltd LAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2Nv cHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zmc2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAw KTsKK30KKworI2lmZGVmIENQVV9DSEVSSQordm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1f cGFnZV90IG1hW10sIHZtX29mZnNldF90IGFfb2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2 bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhmZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2Vz X2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIsIGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1B UF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBt YXAncyBwdiBpcyBvbmUgb2YgdGhlIGZpcnN0CisgKiAxNiBwdnMgbGlua2VkIHRvIGZyb20gdGhp cyBwYWdlLiAgVGhpcyBjb3VudCBtYXkKKyAqIGJlIGNoYW5nZWQgdXB3YXJkcyBvciBkb3dud2Fy ZHMgaW4gdGhlIGZ1dHVyZTsgaXQKKyAqIGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdHJ1ZSBiZSBy ZXR1cm5lZCBmb3IgYSBzbWFsbAorICogc3Vic2V0IG9mIHBtYXBzIGZvciBwcm9wZXIgcGFnZSBh Z2luZy4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrKHBtYXBfdCBwbWFw LCB2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXN0cnVjdCByd2xvY2sg KmxvY2s7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbG9vcHMgPSAwOworCWJvb2xlYW5fdCBydjsK KworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgiJXM6 IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBfX2Z1bmNfXywgbSkpOworCXJ2ID0gRkFMU0U7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CisJCQlydiA9IFRS VUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQli cmVhazsKKwl9CisJaWYgKCFydiAmJiBsb29wcyA8IDE2ICYmIChtLT5mbGFncyAmIFBHX0ZJQ1RJ VElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJ CVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCWlmIChQVl9Q TUFQKHB2KSA9PSBwbWFwKSB7CisJCQkJcnYgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkJ bG9vcHMrKzsKKwkJCWlmIChsb29wcyA+PSAxNikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyd19y dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChy dik7Cit9CisKKy8qCisgKglwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3M6CisgKgorICoJUmV0dXJu IHRoZSBudW1iZXIgb2YgbWFuYWdlZCBtYXBwaW5ncyB0byB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFn ZQorICoJdGhhdCBhcmUgd2lyZWQuCisgKi8KK2ludAorcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdz KHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK KwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGNvdW50LCBtZF9nZW47CisK KwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCisJCXJldHVybiAoMCk7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwljb3VudCA9IDA7CisJVEFJTFFf Rk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAo cHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJbWRfZ2VuID0gbS0+bWQucHZf Z2VuOworCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3Js b2NrKGxvY2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJcHRlID0gcG1hcF9w dGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQorCQkJY291 bnQrKzsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNU SVRJT1VTKSA9PSAwKSB7CisJCXN0cnVjdCBtZF9wYWdlICpwdmggPSBwYV90b19wdmgoVk1fUEFH RV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4 dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOworCQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkp IHsKKwkJCQlpbnQgcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCW1kX2dlbiA9IG0tPm1kLnB2 X2dlbjsKKwkJCQlyd19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQly d19ybG9jayhsb2NrKTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAg ICBwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJcGRfZW50cnlfdCAqcGRlID0gcG1hcF9w ZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChwdGVfdGVzdCgocHRfZW50cnlfdCAqKXBkZSwg UFRFX1cpKQorCQkJCWNvdW50Kys7CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJfQorCX0KKwly d19ydW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJu IChjb3VudCk7Cit9CisKKy8qCisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlz IG1hcHBlZCBpbmRpdmlkdWFsbHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndp c2UsIHJldHVybnMgRkFMU0UuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKwor CWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElT VF9MT0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5w dl9saXN0KSB8fAorCSAgICAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkh VEFJTFFfRU1QVFkoJnBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJ cndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy biAocnYpOworfQorCisvKgorICogRGVzdHJveSBhbGwgbWFuYWdlZCwgbm9uLXdpcmVkIG1hcHBp bmdzIGluIHRoZSBnaXZlbiB1c2VyLXNwYWNlCisgKiBwbWFwLiAgVGhpcyBwbWFwIGNhbm5vdCBi ZSBhY3RpdmUgb24gYW55IHByb2Nlc3NvciBiZXNpZGVzIHRoZQorICogY2FsbGVyLgorICoKKyAq IFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCBwbWFwLiAgTW9y ZW92ZXIsIGl0CisgKiBpcyBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgSXQgaXMgb25s eSB0byBiZSB1c2VkIGR1cmluZworICogcHJvY2VzcyB0ZXJtaW5hdGlvbi4gIENvbnNlcXVlbnRs eSwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHdheXMKKyAqIHRoYXQgbWFrZSBpdCBmYXN0ZXIg dGhhbiBwbWFwX3JlbW92ZSgpLiAgRmlyc3QsIGl0IGNhbiBtb3JlIHF1aWNrbHkKKyAqIGRlc3Ry b3kgbWFwcGluZ3MgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIHBtYXAncyBjb2xsZWN0aW9uIG9mIFBW CisgKiBlbnRyaWVzLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIHBhZ2UgdGFibGUuICBTZWNv bmQsIGl0IGRvZXNuJ3QKKyAqIGhhdmUgdG8gdGVzdCBhbmQgY2xlYXIgdGhlIHBhZ2UgdGFibGUg ZW50cmllcyBhdG9taWNhbGx5LCBiZWNhdXNlCisgKiBubyBwcm9jZXNzb3IgaXMgY3VycmVudGx5 IGFjY2Vzc2luZyB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGEg cGFnZSB0YWJsZSBlbnRyeSdzIGRpcnR5IGJpdCB3b24ndCBjaGFuZ2Ugc3RhdGUgb25jZQorICog dGhpcyBmdW5jdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBf dCBwbWFwKQoreworCXBkX2VudHJ5X3QgcHRlcGRlLCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZSwg dHB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZ2VfdCBtLCBtcHRlLCBtdDsKKwlw dl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpw YywgKm5wYzsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWludCBiaXQ7CisJdWludDY0X3QgaW51 c2UsIGJpdG1hc2s7CisJaW50IGFsbGZyZWUsIGZpZWxkLCBmcmVlZCwgaWR4OworCWJvb2xlYW5f dCBzdXBlcnBhZ2U7CisJdm1fcGFkZHJfdCBwYTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgdGhl IGdpdmVuIHBtYXAgaXMgb25seSBhY3RpdmUgb24gdGhlIGN1cnJlbnQKKwkgKiBDUFUuICBVbmZv cnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYmxvY2sgYW5vdGhlciBDUFUgZnJvbQorCSAqIGFjdGl2YXRp bmcgdGhlIHBtYXAgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisJICovCisJS0FT U0VSVChwbWFwID09IHZtc3BhY2VfcG1hcChjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfdm1zcGFjZSks CisJICAgICgiJXM6IG5vbi1jdXJyZW50IHBtYXAgJXAiLCBfX2Z1bmNfXywgcG1hcCkpOworCisJ bG9jayA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwYywgJnBtYXAt PnBtX3B2Y2h1bmssIHBjX2xpc3QsIG5wYykgeworCQlhbGxmcmVlID0gMTsKKwkJZnJlZWQgPSAw OworCQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaW51c2Ug PSB+cGMtPnBjX21hcFtmaWVsZF0gJiBwY19mcmVlbWFza1tmaWVsZF07CisJCQl3aGlsZSAoaW51 c2UgIT0gMCkgeworCQkJCWJpdCA9IGZmc2woaW51c2UpIC0gMTsKKwkJCQliaXRtYXNrID0gMVVM IDw8IGJpdDsKKwkJCQlpZHggPSBmaWVsZCAqIHNpemVvZihpbnVzZSkgKiBOQkJZICsgYml0Owor CQkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQkJaW51c2UgJj0gfmJpdG1hc2s7CisK KwkJCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCBwdi0+cHZfdmEpOworCQkJCXB0ZXBkZSA9ICpw ZGU7CisJCQkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZGUsIHB2LT5wdl92YSk7CisJCQkJaWYg KHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJCQlzdXBlcnBhZ2UgPSBUUlVFOworCQkJ CQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlcnBhZ2Ug PSBGQUxTRTsKKwkJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQl9CisJCQkJdHB0ZSA9ICpwdGU7CisJCQkJaWYgKCFwdGVf aXNfdmFsaWQocHRlKSkgIHsKKwkJCQkJcGFuaWMoIiVzOiBiYWQgJXMgcHRlIHZhICVseCBwdGUg JWx4IiwKKwkJCQkJICAgIF9fZnVuY19fLCBzdXBlcnBhZ2UgPyAic3VwZXJwYWdlIiA6CisJCQkJ CSAgICAiIiwgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCQl9CisKKy8qCisgKiBXZSBjYW5ub3QgcmVt b3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQorICov CisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfVykpIHsKKwkJCQkJYWxsZnJlZSA9IDA7CisJ CQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHRwdGUpOwor CQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXBhICY9IH5QRFJNQVNLOworCQkJCW0gPSBQSFlTX1RP X1ZNX1BBR0UocGEpOworCQkJCUtBU1NFUlQobS0+cGh5c19hZGRyID09IHBhLAorCQkJCSAgICAo IiVzOiB2bV9wYWdlX3QgJXAgcGh5c19hZGRyIG1pc21hdGNoICIKKwkJCQkgICAgIiUwMTZqeCAl MDE2angiLCBfX2Z1bmNfXywgbSwKKwkJCQkgICAgKHVpbnRtYXhfdCltLT5waHlzX2FkZHIsICh1 aW50bWF4X3QpdHB0ZSkpOworCisJCQkJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSAhPSAwIHx8CisJCQkJICAgIG0gPCAmdm1fcGFnZV9hcnJheVt2bV9wYWdlX2FycmF5X3NpemVd LAorCQkJCSAgICAoIiVzOiBiYWQgdHB0ZSAlI2p4IiwgX19mdW5jX18sCisJCQkJICAgICh1aW50 bWF4X3QpdHB0ZSkpOworCisJCQkJLyogQ2xlYXIgUFRFICovCisJCQkJaWYgKHN1cGVycGFnZSkK KwkJCQkJcHRlX3N0b3JlKHB0ZSwgMCk7CisJCQkJZWxzZQorCQkJCQlwdGVfc3RvcmUocHRlLCBp c19rZXJuZWxfcG1hcChwbWFwKSA/CisJCQkJCSAgICBQVEVfRyA6IDApOworCisJCQkJLyoKKwkJ CQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMKKwkJCQkg Ki8KKwkJCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3Qo JnRwdGUsIFBURV9STykpIHsKKwkJCQkJaWYgKHN1cGVycGFnZSkgeworCQkJCQkJdm1fcGFnZV90 IG10OworCisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10 KyspCisJCQkJCQkJdm1fcGFnZV9kaXJ0eShtdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJdm1fcGFn ZV9kaXJ0eShtKTsKKwkJCQl9CisKKwkJCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo JmxvY2ssIG0pOworCisJCQkJLyogTWFyayBmcmVlICovCisJCQkJcGMtPnBjX21hcFtmaWVsZF0g fD0gYml0bWFzazsKKwkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291 bnRfZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwkJCQkJcHZoID0gcGFfdG9fcHZoKFRM QkxPX1BURV9UT19QQSh0cHRlKSk7CisJCQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw diwgcHZfbmV4dCk7CisJCQkJCXB2aC0+cHZfZ2VuKys7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgm cHZoLT5wdl9saXN0KSkgeworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1bTkJQRFIgLyBQQUdF X1NJWkVdOyBtdCsrKQorCQkJCQkJCWlmIChUQUlMUV9FTVBUWSgmbXQtPm1kLnB2X2xpc3QpKQor CQkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG10LCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQor CQkJCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCQlp ZiAobXB0ZSAhPSBOVUxMKSB7CisJCQkJCQlwbWFwX3JlbW92ZV9wdF9wYWdlKHBtYXAsIG1wdGUp OworCQkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJCQkJCQlLQVNTRVJU KG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJCQkJICAgICgiJXM6IHB0ZSBwYWdlIHdp cmUgY291bnQgZXJyb3IiLAorCQkJCQkJICAgIF9fZnVuY19fKSk7CisJCQkJCQltcHRlLT53aXJl X2NvdW50ID0gMDsKKwkJCQkJCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG1wdGUsICZmcmVl LCBGQUxTRSk7CisJCQkJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50 LCAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVj KHBtYXAsIDEpOworCQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0 KTsKKwkJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRF QUJMRSkgIT0gMCAmJgorCQkJCQkgICAgVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJ CQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCQlwdmggPSBw YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo LT5wdl9saXN0KSkKKwkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUp OworCQkJCQl9CisJCQkJfQorCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCBwdGVw ZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCVBWX1NUQVQoYXRvbWljX2Fk ZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfYWRkX2lu dCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xv bmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlpZiAoYWxsZnJlZSkgeworCQkJVEFJTFFf UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCQlmcmVlX3B2X2NodW5r KHBjKTsKKwkJfQorCX0KKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor CXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcndfcnVu bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9 CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGUgYW5kIG1vZGlmaWVkIGJpdHMgaW4gZWFjaCBvZiB0 aGUgZ2l2ZW4gcGFnZSdzIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3JlbW92ZV93cml0ZSh2 bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXZtX29mZnNldF90IHZhOwor CXB2X2VudHJ5X3QgbmV4dF9wdjsKKwlpbnQgcHZoX2dlbjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1 Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwg KnB0ZTsKKwlwdl9lbnRyeV90IHB2OworCWludCBtZF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxh Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdl ICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3Qg ZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQR0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIHNldCBi eSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMsCisJICog aWYgUEdBX1dSSVRFQUJMRSBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBlbnRyaWVzIG5lZWQgdXBk YXRpbmcuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYg KCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDAp CisJCXJldHVybjsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFH RV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyht KSk7CityZXRyeV9wdl9sb29wOgorCXJ3X3dsb2NrKGxvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQ R19GSUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVB Q0hfU0FGRShwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRy eV9wdl9sb29wOworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3Bk ZShwbWFwLCB2YSk7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkgJiYgIXBkZV90ZXN0 KHBkZSwgUFRFX1JPKSkKKwkJCSh2b2lkKXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRl LCB2YSwgJmxvY2spOworCQlLQVNTRVJUKGxvY2sgPT0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0so bSksCisJCSAgICAoImluY29uc2lzdGVudCBwdiBsb2NrICVwICVwIGZvciBwYWdlICVwIiwKKwkJ ICAgIGxvY2ssIFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLCBtKSk7CisJCVBNQVBfVU5MT0NL KHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5w dl9saXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RS WUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9IG0t Pm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ CQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuIHx8CisJCQkg ICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ CXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRyeV9wdl9sb29wOworCQkJfQorCQl9CisJ CXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBl cnBhZ2UocGRlKSwKKwkJICAgICgiJXM6IGZvdW5kIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw diBsaXN0IiwKKwkJICAgIF9fZnVuY19fLCBtKSk7CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw ZGUsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQocHRlICE9IE5VTEwgJiYgcHRlX2lzX3ZhbGlkKHB0 ZSksCisJCSAgICAoIiVzOnBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIiwgX19mdW5jX18pKTsK K3JldHJ5OgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9S TykpIHsKKwkJCWlmICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwgb2xkcHRlLAorCQkJICAgICgo b2xkcHRlICYgflBURV9EKSB8IFBURV9STykpKQorCQkJCWdvdG8gcmV0cnk7CisJCQlpZiAocHRl X3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXAp OworCX0KKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxv Y2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworI2RlZmluZQlQ TUFQX1RTX1JFRkVSRU5DRURfTUFYCTUKKworLyotCisgKglwbWFwX3RzX3JlZmVyZW5jZWQ6Cisg KgorICogIFJldHVybiBhIGNvdW50IG9mIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQs IGFuZCByZXNldCB0aGUKKyAqICByZWZlcmVuY2UgYml0LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBm b3IgZXZlcnkgcmVmZXJlbmNlIGJpdCB0byBiZQorICogIHJlc2V0LCBidXQgaXQgaXMgbmVjZXNz YXJ5IHRoYXQgMCBvbmx5IGJlIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlCisgKiAgdHJ1bHkgaGF2 ZSBiZWVuIHBhZ2VzIHJlZmVyZW5jZWQuCisgKgorICogIFhYWDogVGhlIGV4YWN0IG51bWJlciBv ZiBmbGFncyB0byBjaGVjayBhbmQgcmVzZXQgaXMgYSBtYXR0ZXIgdGhhdAorICogIHNob3VsZCBi ZSB0ZXN0ZWQgYW5kIHN0YW5kYXJkaXplZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgZm9y CisgKiAgb3B0aW1hbCBhZ2luZyBvZiBzaGFyZWQgcGFnZXMuCisgKi8KK2ludAorcG1hcF90c19y ZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50 cnlfdCBwdiwgcHZmOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRf ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9w YWRkcl90IHBhOworCWludCBjbGVhcmVkLCBtZF9nZW4sIG5vdF9jbGVhcmVkLCBwdmhfZ2VuOwor CisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFw X3RzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJY2xlYXJlZCA9 IDA7CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisJbG9jayA9IFBIWVNfVE9fUFZfTElTVF9M T0NLKHBhKTsKKwlwdmggPSBwYV90b19wdmgocGEpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv Y2spOworCXJ3X3dsb2NrKGxvY2spOworcmV0cnk6CisJbm90X2NsZWFyZWQgPSAwOworCWlmICgo bS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAhPSAwIHx8CisJICAgIChwdmYgPSBUQUlMUV9GSVJT VCgmcHZoLT5wdl9saXN0KSkgPT0gTlVMTCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlwdiA9 IHB2ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0g UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJdmEgPSBw di0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVf aXNfcmVmKChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIHRoaXMgcmVm ZXJlbmNlIGJpdCBpcyBzaGFyZWQgYnkgNTEyIDRLQgorCQkJICogcGFnZXMsIGl0IHNob3VsZCBu b3QgYmUgY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzCisJCQkgKiB0ZXN0ZWQuICBBcHBseSBhIHNp bXBsZSAiaGFzaCIgZnVuY3Rpb24gb24gdGhlCisJCQkgKiBwaHlzaWNhbCBwYWdlIG51bWJlciwg dGhlIHZpcnR1YWwgc3VwZXJwYWdlIG51bWJlciwKKwkJCSAqIGFuZCB0aGUgcG1hcCBhZGRyZXNz IHRvIHNlbGVjdCBvbmUgNEtCIHBhZ2Ugb3V0IG9mCisJCQkgKiB0aGUgNTEyIG9uIHdoaWNoIHRl c3RpbmcgdGhlIHJlZmVyZW5jZSBiaXQgd2lsbAorCQkJICogcmVzdWx0IGluIGNsZWFyaW5nIHRo YXQgcmVmZXJlbmNlIGJpdC4gIFRoaXMKKwkJCSAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGF2 b2lkIHRoZSBzZWxlY3Rpb24gb2YgdGhlCisJCQkgKiBzYW1lIDRLQiBwYWdlIGZvciBldmVyeSAy TUIgcGFnZSBtYXBwaW5nLgorCQkJICoKKwkJCSAqIE9uIGRlbW90aW9uLCBhIG1hcHBpbmcgdGhh dCBoYXNuJ3QgYmVlbiByZWZlcmVuY2VkCisJCQkgKiBpcyBzaW1wbHkgZGVzdHJveWVkLiAgVG8g YXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGEKKwkJCSAqIHN1YnNlcXVlbnQgcGFnZSBmYXVsdCBv biBhIGRlbW90ZWQgd2lyZWQgbWFwcGluZywKKwkJCSAqIGFsd2F5cyBsZWF2ZSBpdHMgcmVmZXJl bmNlIGJpdCBzZXQuICBNb3Jlb3ZlciwKKwkJCSAqIHNpbmNlIHRoZSBzdXBlcnBhZ2UgaXMgd2ly ZWQsIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJCQkgKiBpdHMgcmVmZXJlbmNlIGJpdCB3b24ndCBh ZmZlY3QgcGFnZSByZXBsYWNlbWVudC4KKwkJCSAqLworCQkJaWYgKCgoKHBhID4+IFBBR0VfU0hJ RlQpIF4gKHB2LT5wdl92YSA+PiBQRFJTSElGVCkgXgorCQkJICAgICh1aW50cHRyX3QpcG1hcCkg JiAoTlBURVBHIC0gMSkpID09IDAgJiYKKwkJCSAgICAhcGRlX3Rlc3QocGRlLCBQVEVfVykpIHsK KwkJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1JFRik7CisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCQljbGVhcmVkKys7CisJ CQl9IGVsc2UKKwkJCQlub3RfY2xlYXJlZCsrOworCisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7 CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeS4g Ki8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgIT0gTlVMTCkg eworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxR X0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJfQorCQlpZiAoKGNs ZWFyZWQgKyBub3RfY2xlYXJlZCkgPj0gUE1BUF9UU19SRUZFUkVOQ0VEX01BWCkKKwkJCWdvdG8g b3V0OworCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBwdmYp Oworc21hbGxfbWFwcGluZ3M6CisJaWYgKChwdmYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz dCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCXB2ID0gcHZmOworCWRvIHsKKwkJaWYgKHB2ZiA9 PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQ X1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9 IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7 CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmICgKKwkJCSAgICBwdmhfZ2VuICE9IHB2aC0+cHZf Z2VuIHx8CisJCQkgICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NL KHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKworCQlwZGUgPSBwbWFwX3BkZShw bWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAg ICAoInBtYXBfdHNfcmVmZXJlbmNlZDogZm91bmQgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBwdiBs aXN0IiwKKwkJICAgIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3Zh KTsKKwkJaWYgKHB0ZV9pc19yZWYocHRlKSkgeworCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2Vu dHJ5X3QgKilwZGUsIFBURV9SRUYpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYt PnB2X3ZhKTsKKwkJCWNsZWFyZWQrKzsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyog Um90YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlp ZiAocHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlU QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxRX0lOU0VS VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQltLT5tZC5wdl9nZW4rKzsK KwkJfQorCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgIT0gcHZm ICYmIGNsZWFyZWQgKworCSAgICBub3RfY2xlYXJlZCA8IFBNQVBfVFNfUkVGRVJFTkNFRF9NQVgp Oworb3V0OgorCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlyZXR1cm4gKGNsZWFyZWQgKyBub3RfY2xlYXJlZCk7Cit9CisKK3N0YXRpYyBib29sZWFu X3QKK3BtYXBfcGFnZV90ZXN0X21hcHBpbmdzKHZtX3BhZ2VfdCBtLCBib29sZWFuX3QgYWNjZXNz ZWQsIGJvb2xlYW5fdCBtb2RpZmllZCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2Vu dHJ5X3QgcHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdF9lbnRyeV90ICpwdGU7CisJcG1h cF90IHBtYXA7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9 IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RP X1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6CisJVEFJTFFfRk9S RUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYp OworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJIG1kX2dlbiA9IG0tPm1kLnB2X2dl bjsKKwkJCSByd19ydW5sb2NrKGxvY2spOworCQkJIFBNQVBfTE9DSyhwbWFwKTsKKwkJCSByd19y bG9jayhsb2NrKTsKKwkJCSBpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCSBQTUFQ X1VOTE9DSyhwbWFwKTsKKwkJCQkgZ290byByZXN0YXJ0OworCQkJIH0KKwkJfQorCQlwdGUgPSBw bWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlpZiAobW9kaWZpZWQpIHsKKwkJCXJ2ID0gcHRl X3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKTsKKwkJCWlmIChhY2Nl c3NlZCkKKwkJCQlydiA9IHJ2ICYmIHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19yZWYocHRl KTsKKwkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAm JiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCWlmIChydikK KwkJCWdvdG8gb3V0OworCX0KKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkg eworCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFD SChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOwor CQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47 CisJCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQkJ UE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmIChtZF9nZW4gIT0g bS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4pIHsKKwkJCQkJ UE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAobW9k aWZpZWQpIHsKKwkJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVf dGVzdChwdGUsIFBURV9STyk7CisJCQkJaWYgKGFjY2Vzc2VkKQorCQkJCQlydiA9IHJ2ICYmIHB0 ZV9pc192YWxpZChwdGUpICYmCisJCQkJCSAgICBwdGVfaXNfcmVmKHB0ZSk7CisJCQl9IGVsc2Ug aWYgKGFjY2Vzc2VkKSB7CisJCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCSAgICBw dGVfaXNfcmVmKHB0ZSk7CisJCQl9CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCWlmIChydikK KwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyd19ydW5sb2NrKGxvY2spOworCXJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChydik7Cit9CisKKworLyoKKyAqCXBt YXBfaXNfbW9kaWZpZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZp ZWQgcGh5c2ljYWwgcGFnZSB3YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor ICovCitib29sZWFuX3QKK3BtYXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfbW9k aWZpZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBw YWdlIGlzIG5vdCBleGNsdXNpdmUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJl CisJICogY29uY3VycmVudGx5IHNldCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMs IGlmIFBHQV9XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBz ZXQuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYgKCF2 bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJ CXJldHVybiAoRkFMU0UpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFwcGluZ3MobSwgRkFM U0UsIFRSVUUpKTsKK30KKworLyoKKyAqCXBtYXBfaXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJl dHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdp YmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFi bGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIpCit7CisJcGRfZW50cnlfdCAqcGRlOwor CXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9IEZBTFNFOworCVBNQVBf TE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlpZiAocGRlICE9IE5V TEwgJiYgKnBkZSAhPSAwKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQlw dGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl KHBkZSwgYWRkcik7CisJCXJ2ID0gKCpwdGUgPT0gMCkgfHwgKCpwdGUgPT0gUFRFX0cpOworCX0K KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfaXNf cmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBw aHlzaWNhbCBwYWdlIHdhcyByZWZlcmVuY2VkCisgKglpbiBhbnkgcGh5c2ljYWwgbWFwcy4KKyAq LworYm9vbGVhbl90CitwbWFwX2lzX3JlZmVyZW5jZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfcmVm ZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlyZXR1cm4gKHBtYXBfcGFn ZV90ZXN0X21hcHBpbmdzKG0sIFRSVUUsIEZBTFNFKSk7Cit9CisKKy8qCisgKglBcHBseSB0aGUg Z2l2ZW4gYWR2aWNlIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYWRkcmVzc2VzIHdpdGhpbiB0 aGUKKyAqCWdpdmVuIHBtYXAuICBEZXBlbmRpbmcgb24gdGhlIGFkdmljZSwgY2xlYXIgdGhlIHJl ZmVyZW5jZWQgYW5kL29yCisgKgltb2RpZmllZCBmbGFncyBpbiBlYWNoIG1hcHBpbmcgYW5kIHNl dCB0aGUgbWFwcGVkIHBhZ2UncyBkaXJ0eSBmaWVsZC4KKyAqLwordm9pZAorcG1hcF9hZHZpc2Uo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCBpbnQgYWR2aWNl KQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZSwgb2xk cGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXZtX3BhZ2Vf dCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkLCBwdl9saXN0c19sb2NrZWQ7CisKKwlpZiAoYWR2 aWNlICE9IE1BRFZfRE9OVE5FRUQgJiYgYWR2aWNlICE9IE1BRFZfRlJFRSkKKwkJcmV0dXJuOwor CisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZBTFNF OworCVBNQVBfTE9DSyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7 CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgewor CQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwg c3ZhKQorCQkJCXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0g KHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25l eHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCQlvbGRw ZGUgPSAqcGRlOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSAwKQorCQkJY29udGludWU7 CisJCWVsc2UgaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVz dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIXB2X2xpc3Rz X2xvY2tlZCkgeworCQkJCXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJaWYgKCFyd190cnlf cmxvY2soJnB2aF9nbG9iYWxfbG9jaykpIHsKKwkJCQkJaWYgKGFueWNoYW5nZWQpCisJCQkJCQlw bWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCQkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJ CX0KKwkJCWxvY2sgPSBOVUxMOworCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAs IHBkZSwgc3ZhLCAmbG9jaykpIHsKKwkJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCQlyd193dW5s b2NrKGxvY2spOworCisJCQkJLyoKKwkJCQkgKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRl c3Ryb3llZC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVu bGVzcyB0aGUgcGFnZSBtYXBwaW5ncyBhcmUgd2lyZWQsIHJlbW92ZSB0aGUKKwkJCSAqIG1hcHBp bmcgdG8gYSBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVudAorCQkJICogYWNjZXNzIG1h eSByZXByb21vdGUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBwYWdlCisJCQkgKiB0YWJsZSBwYWdl IGlzIGZ1bGx5IHBvcHVsYXRlZCwgdGhpcyByZW1vdmFsIG5ldmVyCisJCQkgKiBmcmVlcyBhIHBh Z2UgdGFibGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykp IHsKKwkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOworCQkJCUtBU1NFUlQocHRl X3Rlc3QocHRlLCBQVEVfVkFMSUQpLAorCQkJCSAgICAoInBtYXBfYWR2aXNlOiBpbnZhbGlkIFBU RSIpKTsKKwkJCQlwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsICpwZGUsIE5VTEwsCisJ CQkJICAgICZsb2NrKTsKKwkJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwkJCX0KKwkJCWlmIChsb2Nr ICE9IE5VTEwpCisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJfQorCQkvKgorCQkgKiBMaW1pdCBv dXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmEgcmVwcmVzZW50ZWQKKwkJICogYnkg dGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBy YW5nZSBiZWluZyB3cml0ZSBwcm90ZWN0ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkK KwkJCXZhX25leHQgPSBldmE7CisKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBz dmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJ CQlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8ICFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEKSkK KwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkg ICAgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQkJCWlmIChhZHZpY2UgPT0gTUFEVl9ET05U TkVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBGdXR1cmUgY2FsbHMgdG8gcG1hcF9pc19tb2RpZmll ZCgpCisJCQkJCSAqIGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyB0aGUgcGFnZQorCQkJCQkgKiBk aXJ0eSBub3cuCisJCQkJCSAqLworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkgICAg VExCTE9fUFRFX1RPX1BBKCpwdGUpKTsKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQl9CisJ CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EIHwgUFRFX1JFRik7CisJCQl9IGVsc2UgaWYg KHB0ZV9pc19yZWYocHRlKSkKKwkJCQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgUFRFX1JFRik7CisJ CQllbHNlCisJCQkJY29udGludWU7CisJCQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRykpCisJCQkJ cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJCWVsc2UKKwkJCQlhbnljaGFuZ2Vk ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAoYW55Y2hhbmdlZCkKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs bChwbWFwKTsKKwlpZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9i YWxfbG9jayk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ2xlYXIgdGhl IG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor cG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsK KwlwbWFwX3QgcG1hcDsKKwlwdl9lbnRyeV90IG5leHRfcHYsIHB2OworCXBkX2VudHJ5X3Qgb2xk cGRlLCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXN0cnVjdCByd2xvY2sgKmxv Y2s7CisJdm1fb2Zmc2V0X3QgdmE7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKworCUtBU1NFUlQo KG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2Rp Znk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0FTU0VSVF9XTE9D S0VEKG0tPm9iamVjdCk7CisJS0FTU0VSVCghdm1fcGFnZV94YnVzaWVkKG0pLAorCSAgICAoInBt YXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGV4Y2x1c2l2ZSBidXNpZWQiLCBtKSk7CisKKwkv KgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR0FfV1JJVEVBQkxFLCB0aGVuIG5vIFBURXMgY2Fu IGhhdmUgUFRFX0Qgc2V0LgorCSAqIElmIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBp cyBsb2NrZWQgYW5kIHRoZSBwYWdlIGlzIG5vdAorCSAqIHdyaXRlIGJ1c2llZCwgdGhlbiBQR0Ff V1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgobS0+YWZs YWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd193bG9jayhsb2NrKTsKK3Jlc3RhcnQ6 CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFw cGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBu ZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1h cCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJ CQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9 IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0 OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2 YSk7CisJCW9sZHBkZSA9ICpwZGU7CisJCWlmICghcGRlX3Rlc3QocGRlLCBQVEVfUk8pKSB7CisJ CQlpZiAocG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jaykpIHsKKwkJ CQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCQkvKgorCQkJCQkgKiBXcml0 ZSBwcm90ZWN0IHRoZSBtYXBwaW5nIHRvIGEKKwkJCQkJICogc2luZ2xlIHBhZ2Ugc28gdGhhdCBh IHN1YnNlcXVlbnQKKwkJCQkJICogd3JpdGUgYWNjZXNzIG1heSByZXByb21vdGUuCisJCQkJCSAq LworCQkJCQl2YSArPSBWTV9QQUdFX1RPX1BIWVMobSkgLQorCQkJCQkgICBUTEJMT19QREVfVE9f UEEob2xkcGRlKTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJCQlv bGRwdGUgPSAqcHRlOworCQkJCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9WQUxJRCkpIHsK KwkJCQkJCXdoaWxlICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwKKwkJCQkJCSAgICBvbGRwdGUs CisJCQkJCQkgICAgKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKQorCQkJCQkJCW9sZHB0ZSA9 ICpwdGU7CisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcCwgdmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHBt YXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxP Q0socG1hcCkpIHsKKwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXB2aF9nZW4gPSBwdmgt PnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQly d193bG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8IG1kX2dlbiAh PSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3Rh cnQ7CisJCQl9CisJCX0KKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT U0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUpLCAoInBtYXBfY2xlYXJfbW9kaWZ5OiBmb3VuZCIK KwkJICAgICIgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLCBtKSk7CisJCXB0ZSA9 IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVzdChwdGUsIFBU RV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgUFRFX0QpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0 IHJvdXRpbmVzIGZvbGxvdworICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVt b3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1 cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBp bnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVh bCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hlZCBmb3IgNjQgYml0LgorICovCit2 b2lkICoKK3BtYXBfbWFwZGV2KHZtX3BhZGRyX3QgcGEsIHZtX3NpemVfdCBzaXplKQoreworCisJ cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1RfVU5DQUNIRUQocGEpKTsKK30KKwor dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7CisK KwkvKiBOb3RoaW5nIHRvIGRvIGZvciBtaXBzNjQuICovCit9CisKKy8qCisgKiBTZXRzIHRoZSBt ZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBf cGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCS8qCisJ ICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQg aW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBjcmVhdGVkLgorCSAqLworCW0tPm1kLnB2 X21lbWF0dHIgPSBtYTsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rp b24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCSAqIGFyZSBlc3RhYmxpc2hl ZC4gIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisJICog bmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBtYWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1h cHBpbmdzCisJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3aXRoIG1pcHNfaWNhY2hl X3N5bmNfYWxsKCkgYW5kCisJICogbWlwc19kY2FjaGVfd2JpbnZfYWxsKCkpIGFuZCBtb3N0IGxp a2VseSBpbnZhbGlkYXRlIFRMQiBlbnRyaWVzIGZvcgorCSAqIGFueSBvZiB0aGUgY3VycmVudCBt YXBwaW5ncyBpdCBtb2RpZmllcy4KKwkgKi8KKwlpZiAoVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xp c3QpICE9IE5VTEwpCisJCXBhbmljKCJDYW4ndCBjaGFuZ2UgbWVtYXR0ciBvbiBwYWdlIHdpdGgg ZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBm b3IgbWluY29yZQorICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgYWRkciwgdm1fcGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXBkX2VudHJ5X3QgKnBkZXA7CisJ cHRfZW50cnlfdCAqcHRlcCwgcHRlOworCXZtX3BhZGRyX3QgcGE7CisJaW50IHZhbDsKKworCVBN QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlp ZiAocGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJ CQlwdGUgPSAocHRfZW50cnlfdCkqcGRlcDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7 CisJCQl2YWwgPSBNSU5DT1JFX1NVUEVSOworCQl9IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRl X3RvX3B0ZShwZGVwLCBhZGRyKTsKKwkJCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAw OworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9IDA7CisJCX0KKwl9IGVs c2UgeworCQlwdGUgPSAwOworCQlwYSA9IDA7CisJCXZhbCA9IDA7CisJfQorCWlmIChwdGVfaXNf dmFsaWQoJnB0ZSkpIHsKKwkJdmFsIHw9IE1JTkNPUkVfSU5DT1JFOworCQlpZiAocHRlX3Rlc3Qo JnB0ZSwgUFRFX0QpKQorCQkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBNSU5DT1JFX01PRElG SUVEX09USEVSOworCQlpZiAocHRlX2lzX3JlZigmcHRlKSkKKwkJCXZhbCB8PSBNSU5DT1JFX1JF RkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1J TkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAg ICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYK KwkgICAgcHRlX3Rlc3QoJnB0ZSwgUFRFX01BTkFHRUQpKSB7CisJCS8qIEVuc3VyZSB0aGF0ICJQ SFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdlLiAqLworCQlpZiAodm1f cGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJCQlnb3RvIHJldHJ5Owor CX0gZWxzZQorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3BhKTsKKwlQTUFQX1VOTE9DSyhwbWFw KTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBfYWN0aXZhdGUoc3RydWN0IHRocmVh ZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJc3RydWN0IHByb2MgKnAgPSB0ZC0+ dGRfcHJvYzsKKwl1X2ludCBjcHVpZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlwbWFwID0g dm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1cnBtYXAp OworCWNwdWlkID0gUENQVV9HRVQoY3B1aWQpOworCisJaWYgKG9sZHBtYXApCisJCUNQVV9DTFJf QVRPTUlDKGNwdWlkLCAmb2xkcG1hcC0+cG1fYWN0aXZlKTsKKwlDUFVfU0VUX0FUT01JQyhjcHVp ZCwgJnBtYXAtPnBtX2FjdGl2ZSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0ZCA9 PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsKKwkJ bWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbY3B1aWRdLmFzaWQpOworCX0KKworCVBDUFVf U0VUKGN1cnBtYXAsIHBtYXApOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKwordm9pZAorcG1hcF9z eW5jX2ljYWNoZShwbWFwX3QgcG0sIHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc3opCit7Cit9 CisKKy8qCisgKglJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBn aXZlbiBtYXBwaW5nIGlmIGEKKyAqCWRpZmZlcmVudCBhbGlnbm1lbnQgbWlnaHQgcmVzdWx0IGlu IG1vcmUgc3VwZXJwYWdlIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX2FsaWduX3N1cGVycGFn ZSh2bV9vYmplY3RfdCBvYmplY3QsIHZtX29vZmZzZXRfdCBvZmZzZXQsCisgICAgdm1fb2Zmc2V0 X3QgKmFkZHIsIHZtX3NpemVfdCBzaXplKQoreworCXZtX29mZnNldF90IHN1cGVycGFnZV9vZmZz ZXQ7CisKKwlpZiAoc2l6ZSA8IE5CU0VHKQorCQlyZXR1cm47CisJaWYgKG9iamVjdCAhPSBOVUxM ICYmIChvYmplY3QtPmZsYWdzICYgT0JKX0NPTE9SRUQpICE9IDApCisJCW9mZnNldCArPSBwdG9h KG9iamVjdC0+cGdfY29sb3IpOworCXN1cGVycGFnZV9vZmZzZXQgPSBvZmZzZXQgJiBTRUdNQVNL OworCWlmIChzaXplIC0gKChOQlNFRyAtIHN1cGVycGFnZV9vZmZzZXQpICYgU0VHTUFTSykgPCBO QlNFRyB8fAorCSAgICAoKmFkZHIgJiBTRUdNQVNLKSA9PSBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQly ZXR1cm47CisJaWYgKCgqYWRkciAmIFNFR01BU0spIDwgc3VwZXJwYWdlX29mZnNldCkKKwkJKmFk ZHIgPSAoKmFkZHIgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0OworCWVsc2UKKwkJKmFk ZHIgPSAoKCphZGRyICsgU0VHTUFTSykgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor fQorCisjaWZkZWYgRERCCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7 CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9j ICpwOworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisK KwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsK KwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7 CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNl ID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJ cmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBl bHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6 JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIs IHBtYXAtPnBtX2FzaWRbMF0uYXNpZCwKKwkgICAgcG1hcC0+cG1fYXNpZFswXS5nZW4pOworCWZv ciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9lbnRyeV90ICpwZHBlOworCQlwdF9l bnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJCXBkcGUgPSAocGRfZW50cnlfdCAq KXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwor CQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsKKwkJZm9yIChqID0gMDsgaiA8IE5Q REVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAqKXBkcGVbal07CisJCQlpZiAocGRl ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmludGYoIlx0WyU0ZF0gJXBcbiIsIGos IHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKKwkJCQlwdGUgPSBwZGVb a107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfaXNfdmFsaWQoJnB0ZSkpCisJCQkJCWNvbnRp bnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylp IDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChrIDw8IFBBR0VfU0hJRlQpOworCQkJ CWRiX3ByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAlOGp4IHBhOiVqeFxuIiwKKwkJCQkg ICAgICAgaywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClwdGUsICh1aW50bWF4X3QpcGEpOworCQkJ fQorCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9p ZCBwYWRzKHBtYXBfdCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKwor LyogcHJpbnQgYWRkcmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBf dCBwbSkKK3sKKwl1bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYg KHBtID09IGtlcm5lbF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg aSsrKQorCQlpZiAocG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7 IGorKykgeworCQkJCXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJ CQkJaWYgKHBtID09IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVl OworCQkJCWlmIChwbSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VS X0FERFJFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOwor CQkJCWlmIChwdGVfaXNfdmFsaWQocHRlcCkpCisJCQkJCXByaW50ZigiJXg6JXggIiwgdmEsICoo aW50ICopcHRlcCk7CisJCQl9CisKK30KKwordm9pZAorcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3Qg cGEpCit7CisJcmVnaXN0ZXIgcHZfZW50cnlfdCBwdjsKKwl2bV9wYWdlX3QgbTsKKworCXByaW50 ZigicGEgJXgiLCBwYSk7CisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJZm9yIChwdiA9IFRB SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbGlzdCkpIHsKKwkJcHJpbnRmKCIgLT4gcG1hcCAlcCwgdmEgJXgiLCAodm9pZCAqKXB2LT5w dl9wbWFwLCBwdi0+cHZfdmEpOworCQlwYWRzKHB2LT5wdl9wbWFwKTsKKwl9CisJcHJpbnRmKCIg Iik7Cit9CisKKy8qIE4vQyAqLworI2VuZGlmCisKKworLyoKKyAqIEFsbG9jYXRlIFRMQiBhZGRy ZXNzIHNwYWNlIHRhZyAoY2FsbGVkIEFTSUQgb3IgVExCUElEKSBhbmQgcmV0dXJuIGl0LgorICog SXQgdGFrZXMgYWxtb3N0IGFzIG11Y2ggb3IgbW9yZSB0aW1lIHRvIHNlYXJjaCB0aGUgVExCIGZv ciBhCisgKiBzcGVjaWZpYyBBU0lEIGFuZCBmbHVzaCB0aG9zZSBlbnRyaWVzIGFzIGl0IGRvZXMg dG8gZmx1c2ggdGhlIGVudGlyZSBUTEIuCisgKiBUaGVyZWZvcmUsIHdoZW4gd2UgYWxsb2NhdGUg YSBuZXcgQVNJRCwgd2UganVzdCB0YWtlIHRoZSBuZXh0IG51bWJlci4gV2hlbgorICogd2UgcnVu IG91dCBvZiBudW1iZXJzLCB3ZSBmbHVzaCB0aGUgVExCLCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRp b24gY291bnQKKyAqIGFuZCBzdGFydCBvdmVyLiBBU0lEIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGtl cm5lbCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2FzaWRfYWxsb2MocG1hcCkKKwlwbWFw X3QgcG1hcDsKK3sKKwlpZiAocG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgIT0g UE1BUF9BU0lEX1JFU0VSVkVEICYmCisJICAgIHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQp XS5nZW4gPT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSk7CisJZWxzZSB7CisJCWlmIChQQ1BV X0dFVChuZXh0X2FzaWQpID09IHBtYXBfbWF4X2FzaWQpIHsKKwkJCXRsYl9pbnZhbGlkYXRlX2Fs bF91c2VyKE5VTEwpOworCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLAorCQkJICAgIChQQ1BV X0dFVChhc2lkX2dlbmVyYXRpb24pICsgMSkgJiBBU0lER0VOX01BU0spOworCQkJaWYgKFBDUFVf R0VUKGFzaWRfZ2VuZXJhdGlvbikgPT0gMCkgeworCQkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlv biwgMSk7CisJCQl9CisJCQlQQ1BVX1NFVChuZXh0X2FzaWQsIDEpOwkvKiAwIG1lYW5zIGludmFs aWQgKi8KKwkJfQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCA9IFBDUFVf R0VUKG5leHRfYXNpZCk7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSBQ Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pOworCQlQQ1BVX1NFVChuZXh0X2FzaWQsIFBDUFVfR0VU KG5leHRfYXNpZCkgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyBwdF9lbnRyeV90Citpbml0X3B0ZV9w cm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlw dF9lbnRyeV90IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BST1RfV1JJVEUpKQorCQlydyA9IFBU RV9WQUxJRCB8IFBURV9STzsKKwllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkg PT0gMCkgeworCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisJCQlydyA9IFBU RV9WQUxJRCB8IFBURV9EOworCQllbHNlCisJCQlydyA9IFBURV9WQUxJRDsKKwl9IGVsc2Ugewor CQkvKgorCQkgKiBOZWVkbid0IGVtdWxhdGUgYSByZWZlcmVuY2UvbW9kaWZpZWQgYml0IGZvciB1 bm1hbmFnZWQKKwkJICogcGFnZXMuCisJCSAqLworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwor CQlwdGVfcmVmX3NldCgmcncpOworCX0KKworCXJldHVybiAocncpOworfQorCisvKgorICogcG1h cF9lbXVsYXRlX21vZGlmaWVkIDogZG8gZGlydHkgYml0IGVtdWxhdGlvbgorICoKKyAqIE9uIFNN UCwgdXBkYXRlIGp1c3QgdGhlIGxvY2FsIFRMQiwgb3RoZXIgQ1BVcyB3aWxsIHVwZGF0ZSB0aGVp cgorICogVExCcyBmcm9tIFBURSBsYXppbHksIGlmIHRoZXkgZ2V0IHRoZSBleGNlcHRpb24uCisg KiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNlc3MsIDEgaWYgdGhlIHBhZ2UgaXMgcmVhZCBvbmx5 IGFuZCB3ZQorICogbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfbW9kaWZp ZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlw dF9lbnRyeV90ICpwdGU7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1h cCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCXB0ZSA9IChwdF9lbnRy eV90ICopcGRlOworCWVsc2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlm IChwdGUgPT0gTlVMTCkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu ZCBQVEUiKTsKKyNpZmRlZiBTTVAKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg Q1BVIGNoYW5nZWQgbS1iaXQgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0 KHB0ZSwgUFRFX0QpKSB7CisJCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VO TE9DSyhwbWFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZQorCWlmICghcHRlX2lzX3ZhbGlk KHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwg KnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgor CWlmIChwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJl dHVybiAoMSk7CisJfQorCXB0ZV9hdG9taWNfc2V0KHB0ZSwgUFRFX0QpOyAvKiBtYXJrIGl0IHJl ZmVyZW5jZWQgYW5kIG1vZGlmaWVkICovCisJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7CisJdGxi X3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VE KSkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogdW5tYW5hZ2VkIHBhZ2UiKTsKKwlQ TUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcG1hcF9lbXVsYXRl X3JlZmVyZW5jZWQ6IGRvIHJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisgKgorICogUmV0dXJucyAw IGluIGNhc2Ugb2Ygc3VjY2Vzcy4gIFJldHVybnMgMSBpZiB3ZSBuZWVkIHRvIGZhdWx0LgorICov CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKQorCQlyZXR1cm4gKDEpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gTlVMTCkg eworCQkvKiBJbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQor CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilw ZGU7CisJfSBlbHNlCisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRl ID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIHRhYmxlLiAqLworCQlnb3RvIGRvZmF1bHQ7 CisJfQorCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJLyogSW52YWxpZCBQVEUuICovCisJ CWdvdG8gZG9mYXVsdDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGFscmVhZHkgbWFya2VkIGJ5 IG90aGVyIENQVS4gICovCisJaWYgKCFwdGVfaXNfcmVmKHB0ZSkpCisJCXB0ZV9yZWZfYXRvbWlj X3NldChwdGUpOworCisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJUE1BUF9VTkxPQ0so cG1hcCk7CisKKwlyZXR1cm4gKDApOworCitkb2ZhdWx0OgorCVBNQVBfVU5MT0NLKHBtYXApOwor CXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSkK K3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3IgKHB2ID0gVEFJ TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg cHZfbmV4dCkpIHsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwg UEFHRV9TSVpFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcC5j IGIvc3lzL21pcHMvbWlwcy9wbWFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9wbWFwLmMKKysrIGIv c3lzL21pcHMvbWlwcy9wbWFwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJv Yy5oPgogI2luY2x1ZGUgPHN5cy9yd2xvY2suaD4KICNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNp bmNsdWRlIDxzeXMvX3R5cGVzLmg+CiAjaWZkZWYgU01QCiAjaW5jbHVkZSA8c3lzL3NtcC5oPgog I2Vsc2UKQEAgLTIzMiw3ICsyMzMsNyBAQAogCXN5c20gPSAmc3lzbWFwX2xtZW1bY3B1XTsKIAlz eXNtLT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YSA9IHN5c20tPmJhc2U7Ci0JbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRF X1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAkqcHRl ID0gbnB0ZTsKIAlzeXNtLT52YWxpZDEgPSAxOwpAQCAtMjU0LDEwICsyNTUsMTAgQEAKIAlzeXNt LT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YTEgPSBzeXNtLT5iYXNlOwogCXZhMiA9IHN5c20tPmJh c2UgKyBQQUdFX1NJWkU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19D QUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBo eXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdmExKTsKIAkqcHRlID0gbnB0ZTsKLQlucHRlID0gVExCTE9f UEFfVE9fUEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBU RV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YTIpOwogCSpw dGUgPSBucHRlOwogCXN5c20tPnZhbGlkMSA9IDE7CkBAIC01NTYsOSArNTU3LDE1IEBACiAJbXNn YnVmaW5pdChtc2didWZwLCBtc2didWZzaXplKTsKIAogCS8qCi0JICogU3RlYWwgdGhyZWFkMCBr c3RhY2suCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2suICBUaGlzIG11c3QgYmUgYWxpZ25lZCB0 bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds ZSBUTEIgZW50cnkuCisJICoKKwkgKiBYWFggVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSBv ZiBnZXR0aW5nIGFsaWduZWQgbWVtb3J5CisJICogd2l0aCBwbWFwX3N0ZWFsX21lbW9yeSgpLgog CSAqLwotCWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9T SElGVCk7CisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgKyBLU1RB Q0tfR1VBUkRfUEFHRVMpIFwKKwkJCQkJPDwgUEFHRV9TSElGVCk7CisJa3N0YWNrMCA9IHJvdW5k dXAyKGtzdGFjazAsIChLU1RBQ0tfUEFHRV9TSVpFICogMikpOwogCiAJdmlydHVhbF9hdmFpbCA9 IFZNX01JTl9LRVJORUxfQUREUkVTUzsKIAl2aXJ0dWFsX2VuZCA9IFZNX01BWF9LRVJORUxfQURE UkVTUzsKQEAgLTYwNSw2ICs2MTIsNyBAQAogCiAJVEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7 CiAJbS0+bWQucHZfZmxhZ3MgPSAwOworCW0tPm1kLnB2X21lbWF0dHIgPSBWTV9NRU1BVFRSX0RF RkFVTFQ7CiB9CiAKIC8qCkBAIC04MDEsNyArODA5LDcgQEAKIAlwdGVwID0gcG1hcF9wdGUocG1h cCwgdmEpOwogCWlmIChwdGVwICE9IE5VTEwpIHsKIAkJcHRlID0gKnB0ZXA7Ci0JCWlmIChwdGVf dGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CisJCWlmIChw dGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpICYmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAog CQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgewogCQkJcHRlX3BhID0gVExCTE9f UFRFX1RPX1BBKHB0ZSk7CiAJCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcHRlX3Bh LCAmcGEpKQpAQCAtODM0LDkgKzg0Miw5IEBACiAKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdmEpOwogCW9wdGUgPSAqcHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0 ciB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8 IGF0dHIgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCSpwdGUgPSBucHRlOwotCWlmIChw dGVfdGVzdCgmb3B0ZSwgUFRFX1YpICYmIG9wdGUgIT0gbnB0ZSkKKwlpZiAocHRlX3Rlc3QoJm9w dGUsIFBURV9WQUxJRCkgJiYgb3B0ZSAhPSBucHRlKQogCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5l bF9wbWFwLCB2YSwgbnB0ZSk7CiB9CiAKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCQkJaWYgKG0t Pm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQ R0FfUkVGRVJFTkNFRCk7CiAJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX1JFRjsKLQkJ CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJCQlUQUlMUV9S RU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJTFFfRU1QVFko Jm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFC TEUpOwogCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBiaXQ7CkBAIC0xNjI3LDkgKzE2 MzUsOSBAQAogCXB2X2VudHJ5X3QgcHY7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkg eworCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKHBt YXAgPT0gUFZfUE1BUChwdikgJiYgdmEgPT0gcHYtPnB2X3ZhKSB7Ci0JCQlUQUlMUV9SRU1PVkUo JnB2aC0+cHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xp c3QsIHB2LCBwdl9uZXh0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTY3MSw3ICsxNjc5LDcg QEAKIAlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAlpZiAoKHB2ID0gZ2V0X3B2 X2VudHJ5KHBtYXAsIFRSVUUpKSAhPSBOVUxMKSB7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQlyZXR1cm4gKFRSVUUpOwog CX0gZWxzZQogCQlyZXR1cm4gKEZBTFNFKTsKQEAgLTE3NDQsNyArMTc1Miw3IEBACiAJLyoKIAkg KiBJZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRoaXMgYWRkcmVzcywganVzdCBza2lwIGl0IQogCSAq LwotCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVikpCisJaWYgKCFwdGVfdGVzdChwdHEsIFBURV9W QUxJRCkpCiAJCXJldHVybjsKIAogCSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZh LCAqcGRlKTsKQEAgLTE4MTAsNyArMTgxOCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChw dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJ CSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7 CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2YSAhPSB2YV9u ZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKIAkJCQkJ dmEgPSB2YV9uZXh0OwpAQCAtMTg2OCw3ICsxODc2LDcgQEAKIAkJICogSWYgaXQncyBsYXN0IG1h cHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKIAkJICogdGhlIHBhZ2UgYmVpbmcgZGVz dHJveWVkCiAJIAkgKi8KLQkJaWYgKFRBSUxRX05FWFQocHYsIHB2X2xpc3QpID09IE5VTEwpCisJ CWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBOVUxMKQogCQkJbWlwc19kY2FjaGVfd2Jp bnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCiAJCXBtYXAtPnBtX3N0YXRz LnJlc2lkZW50X2NvdW50LS07CkBAIC0xODk3LDcgKzE5MDUsNyBAQAogCQl9CiAJCXBtYXBfaW52 YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CiAKLQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYs IHB2X25leHQpOwogCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSk7CiAJCWZy ZWVfcHZfZW50cnkocG1hcCwgcHYpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKQEAgLTE5NTksNyAr MTk2Nyw3IEBACiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9 IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewogCQkJcGJpdHMgPSAq cHRlOwotCQkJaWYgKCFwdGVfdGVzdCgmcGJpdHMsIFBURV9WKSB8fCBwdGVfdGVzdCgmcGJpdHMs CisJCQlpZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdCgmcGJpdHMs CiAJCQkgICAgUFRFX1JPKSkgewogCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKQEAgLTIwNzEsNyArMjA3OSw3IEBACiAJ LyoKIAkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwgbXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdp cmluZyBjaGFuZ2UuCiAJICovCi0JaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikgJiYgb3Bh ID09IHBhKSB7CisJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQpICYmIG9wYSA9PSBw YSkgewogCQkvKgogCQkgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0cy4gV2UgZG9u J3Qgd29ycnkgYWJvdXQKIAkJICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lk ZW50IGFzIGxvbmcgYXMgdGhlcmUKQEAgLTIxMzUsNyArMjE0Myw3IEBACiAJCWlmIChwdiA9PSBO VUxMKQogCQkJcHYgPSBnZXRfcHZfZW50cnkocG1hcCwgRkFMU0UpOwogCQlwdi0+cHZfdmEgPSB2 YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJbmV3cHRl IHw9IFBURV9NQU5BR0VEOwogCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9STykpCiAJCQl2 bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKQEAgLTIxNjAsNyArMjE2OCw3IEBA CiAJICovCiAJaWYgKG9yaWdwdGUgIT0gbmV3cHRlKSB7CiAJCSpwdGUgPSBuZXdwdGU7Ci0JCWlm IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg UFRFX1ZBTElEKSkgewogCQkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkgJiYg b3BhICE9IHBhKSB7CiAJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKIAkJ CQkJdm1fcGFnZV9hZmxhZ19zZXQob20sIFBHQV9SRUZFUkVOQ0VEKTsKQEAgLTIyNjgsNyArMjI3 Niw3IEBACiAJfQogCiAJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOwotCWlmIChwdGVfdGVzdChw dGUsIFBURV9WKSkgeworCWlmIChwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpIHsKIAkJaWYgKG1w dGUgIT0gTlVMTCkgewogCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwogCQkJbXB0ZSA9IE5VTEw7CkBA IC0yMjk4LDcgKzIzMDYsNyBAQAogCS8qCiAJICogTm93IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBS TyBwcm90ZWN0aW9uCiAJICovCi0JKnB0ZSA9IFBURV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkg fCBQVEVfVjsKKwkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJ RDsKIAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApCiAJCSpwdGUgfD0gUFRF X01BTkFHRUQ7CiAKQEAgLTIzNTYsNyArMjM2NCw3IEBACiAJCWNwdSA9IFBDUFVfR0VUKGNwdWlk KTsKIAkJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCQkvKiBTaW5jZSB0aGlzIGlzIGZvciB0 aGUgZGVidWdnZXIsIG5vIGxvY2tzIG9yIGFueSBvdGhlciBmdW4gKi8KLQkJbnB0ZSA9IFRMQkxP X1BBX1RPX1BGTihwYSkgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfAorCQlucHRlID0g VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfAog CQkgICAgUFRFX0c7CiAJCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCBzeXNtLT5iYXNlKTsK IAkJKnB0ZSA9IG5wdGU7CkBAIC0yNDg0LDcgKzI0OTIsNyBAQAogCQkJdmFfbmV4dCA9IGV2YTsK IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwg UFRFX1YpKQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJY29udGludWU7 CiAJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQogCQkJCXBhbmljKCJwbWFwX3Vud2lyZTog cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI2NjYsNyArMjY3NCw3IEBACiAJS0FTU0VS VChzeXNtLT52YWxpZDEgPT0gMCwgKCJwbWFwX3F1aWNrX2VudGVyX3BhZ2U6IFBURSBidXN5Iikp OwogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwotCSpwdGUgPSBU TEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HIHwKKwkqcHRlID0gVExC TE9fUEFfVE9fUEZOKHBhKSB8IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0cgfAogCSAgICAoaXNf Y2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQVEVfQ19VTkNBQ0hFRCk7CiAJ c3lzbS0+dmFsaWQxID0gMTsKIApAQCAtMjcxOSw3ICsyNzI3LDcgQEAKIAkgICAgKCJwbWFwX3Bh Z2VfZXhpc3RzX3F1aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwogCXJ2ID0gRkFM U0U7CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0t Pm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbmV4dCkgewogCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgewogCQkJcnYgPSBUUlVF OwogCQkJYnJlYWs7CkBAIC0yNzcyLDcgKzI3ODAsNyBAQAogCQkJCUtBU1NFUlQocGRlICE9IE5V TEwgJiYgKnBkZSAhPSAwLAogCQkJCSAgICAoInBtYXBfcmVtb3ZlX3BhZ2VzOiBwZGUiKSk7CiAJ CQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKLQkJCQlpZiAoIXB0ZV90 ZXN0KHB0ZSwgUFRFX1YpKQorCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJ CQlwYW5pYygicG1hcF9yZW1vdmVfcGFnZXM6IGJhZCBwdGUiKTsKIAkJCQl0cHRlID0gKnB0ZTsK IApAQCAtMjgwMiw3ICsyODEwLDcgQEAKIAkJCQlwdl9lbnRyeV9jb3VudC0tOwogCQkJCXBjLT5w Y19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CiAJCQkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291 bnQtLTsKLQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJ TFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBH QV9XUklURUFCTEUpOwogCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsK QEAgLTI4MzMsNyArMjg0MSw3IEBACiAJCXJldHVybiAocnYpOwogCiAJcndfYXNzZXJ0KCZwdmhf Z2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s aXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l eHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJCXB0ZSA9 IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODYzLDcgKzI4NzEsNyBAQAogCWlmICgo bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKIAkJcmV0dXJuIChjb3VudCk7CiAJcndf d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4 dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4OTcsMTEgKzI5MDUsMTEgQEAKIAlpZiAo IXZtX3BhZ2VfeGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkK IAkJcmV0dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0so cG1hcCk7CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7Ci0JCUtBU1NFUlQocHRl ICE9IE5VTEwgJiYgcHRlX3Rlc3QocHRlLCBQVEVfViksCisJCUtBU1NFUlQocHRlICE9IE5VTEwg JiYgcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpLAogCQkgICAgKCJwYWdlIG9uIHB2X2xpc3QgaGFz IG5vIHB0ZSIpKTsKIAkJcGJpdHMgPSAqcHRlOwogCQlpZiAocHRlX3Rlc3QoJnBiaXRzLCBQVEVf RCkpIHsKQEAgLTMwNDAsNyArMzA0OCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChwdGUg PSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJCSAg ICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQg fCBQVEVfVikpIHsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WQUxJ RCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu Z2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTMxMDYsNyArMzExNCw3 IEBACiAJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJ cndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2 X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf bmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRl ID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTMyMDgsNyArMzIxNiw3IEBACiByZXRy eToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0ZXAgIT0gTlVMTCkg PyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsKKwlpZiAoIXB0ZV90 ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAt MzM0NSw3ICszMzUzLDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsgaysr KSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0 ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1ZBTElE KSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKIAkJCQl2 YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFH RV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDAxLDE1IEBACiAJcHRfZW50cnlfdCBydzsKIAogCWlm ICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBURV9STzsKKwkJcncg PSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH RUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAhPSAwKQotCQkJcncg PSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAkJZWxzZQotCQkJ cncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkvKiBOZWVkbid0IGVt dWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8KLQkJcncgPSBQVEVf ViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVybiAocncpOwogfQog CkBAIC0zNDI0LDEzICszNDMyLDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6 IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9zc2libGUgdGhhdCBz b21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVzdChwdGUsIFBURV9W KSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFM SUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUocG1hcCwgdmEsICpw dGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAjZWxzZQotCWlm ICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCisJaWYgKCFw dGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCiAJCXBhbmlj KCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5kaWYKIAlpZiAocHRl X3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0NTQsMTggQEAKIH0KIAogLyoKKyAq IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24g aXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24uCisgKi8KK2ludAor cG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQorewor CisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tleHRyYWN0CiAgKglG dW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRl ZApAQCAtMzUyMiwxNyArMzU0MiwyNiBAQAogCiAJaWYgKG0gIT0gTlVMTCkgewogCQlmb3IgKHB2 ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKLQkJICAgIHB2ID0gVEFJTFFfTkVY VChwdiwgcHZfbGlzdCkpIHsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkpIHsK IAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsK IAkJfQogCX0KIH0KIAorLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRyaWJ1dGUgZm9yIHRoZSBz cGVjaWZpZWQgcGFnZS4KKyAqLwogdm9pZAogcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2Vf dCBtLCB2bV9tZW1hdHRyX3QgbWEpCiB7CiAKIAkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVs ZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBw aW5ncyBhcmUgY3JlYXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgog CSAqIEl0IGFwcGVhcnMgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZv cmUgYW55IG1hcHBpbmdzCiAJICogZm9yIHRoZSBwYWdlIGFyZSBlc3RhYmxpc2hlZC4gIElmIHRo aXMgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAogCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZf bGlzdCBhbmQgbWFrZSBlYWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncwpkaWZmIC0tZ2l0IGEv c3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21pbmlkdW1w X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYworKysgYi9z eXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJCXB0 ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJCUtBU1NFUlQocHRlICE9IE5VTEwsICgi cHRlIGZvciAlanggaXMgTlVMTCIsICh1aW50bWF4X3QpdmEpKTsKIAkJZm9yIChpID0gMDsgaSA8 IE5QVEVQRzsgaSsrKSB7Ci0JCQlpZiAocHRlX3Rlc3QoJnB0ZVtpXSwgUFRFX1YpKSB7CisJCQlp ZiAocHRlX2lzX3ZhbGlkKCZwdGVbaV0pKSB7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRl W2ldKTsKIAkJCQlpZiAoaXNfZHVtcGFibGUocGEpKQogCQkJCQlkdW1wX2FkZF9wYWdlKHBhKTsK ZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9tYWNo ZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy9t YWNoZGVwLmMKQEAgLTI4Myw5ICsyODMsOSBAQAogI2VuZGlmCiAJcHJvY19saW5rdXAwKCZwcm9j MCwgJnRocmVhZDApOwogCi0JS0FTU0VSVCgoa3N0YWNrMCAmIFBBR0VfTUFTSykgPT0gMCwKLQkJ KCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZGFyeTogMHglMGx4IiwKLQkJ KGxvbmcpa3N0YWNrMCkpOworCUtBU1NFUlQoKGtzdGFjazAgJiAoKEtTVEFDS19QQUdFX1NJWkUg KiAyKSAtIDEpKSA9PSAwLAorCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQgb24gYSBwYWdlICgw eCUwbHgpIGJvdW5kYXJ5OiAweCUwbHgiLAorCQkobG9uZykoS1NUQUNLX1BBR0VfU0laRSAqIDIp LCAobG9uZylrc3RhY2swKSk7CiAJdGhyZWFkMC50ZF9rc3RhY2sgPSBrc3RhY2swOwogCXRocmVh ZDAudGRfa3N0YWNrX3BhZ2VzID0gS1NUQUNLX1BBR0VTOwogCS8qIApAQCAtNDU5LDcgKzQ1OSw3 IEBACiAJICogV2UgdXNlIGEgd2lyZWQgdGxiIGluZGV4IHRvIGRvIHRoaXMgb25lLXRpbWUgbWFw cGluZy4KIAkgKi8KIAlwYSA9IHZ0b3BoeXMocGNwdSk7Ci0JcHRlID0gUFRFX0QgfCBQVEVfViB8 IFBURV9HIHwgUFRFX0NfQ0FDSEU7CisJcHRlID0gUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfUkVG IHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKIAl0bGJfaW5zZXJ0X3dpcmVkKFBDUFVfVExCX0VOVFJZ LCAodm1fb2Zmc2V0X3QpcGNwdXAsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhKSB8IHB0ZSwKIAkJ CSBUTEJMT19QQV9UT19QRk4ocGEgKyBQQUdFX1NJWkUpIHwgcHRlKTsKZGlmZiAtLWdpdCBhL3N5 cy9taXBzL21pcHMvZ2VuYXNzeW0uYyBiL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwotLS0gYS9z eXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKKysrIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCkBA IC0xMDIsNiArMTAyLDkgQEAKIEFTU1lNKFRERl9BU1RQRU5ESU5HLCBUREZfQVNUUEVORElORyk7 CiBBU1NZTShNQVhDT01MRU4sIE1BWENPTUxFTik7CiBBU1NZTShNRFREX0NPUDJVU0VELCBNRFRE X0NPUDJVU0VEKTsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorQVNTWU0oS1NUQUNLX1RMQk1B U0tfTUFTSywgS1NUQUNLX1RMQk1BU0tfTUFTSyk7CisjZW5kaWYKIAogQVNTWU0oTUlQU19LU0VH MF9TVEFSVCwgTUlQU19LU0VHMF9TVEFSVCk7CiBBU1NZTShNSVBTX0tTRUcxX1NUQVJULCBNSVBT X0tTRUcxX1NUQVJUKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMgYi9z eXMvbWlwcy9taXBzL2V4Y2VwdGlvbi5TCi0tLSBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK KysrIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwpAQCAtODUsNiArODUsMjggQEAKICAqLwog I2RlZmluZQlJTlRSQ05UX0NPVU5UCTI1NgogCisvKgorICogR2VuZXJhbCBNSVBTIENQVSBzdGF0 ZSBmb3IgZXhjZXB0aW9uczoKKyAqCisgKiBFUEMgUmVnaXN0ZXIgd2lsbCBwb2ludCB0byB0aGUg aW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgZmF1bHQsIHVubGVzcyB0aGUKKyAqIGZhdWx0aW5nIGlu c3RydWN0aW9uIHdhcyBpbiBhIGJyYW5jaCBkZWxheSBzbG90LiAgSW4gdGhhdCBjYXNlLCBpdCB3 aWxsCisgKiBwb2ludCB0byB0aGUgYnJhbmNoIGJlZm9yZSB0aGUgYnJhbmNoIGRlbGF5IHNsb3Qg aW5zdHJ1Y3Rpb24uCisgKgorICogVGhlIGNhdXNlIHJlZ2lzdGVyIHdpbGwgY29udGFpbiB3aGF0 IGNhdXNlZCB0aGUgZXhjZXB0aW9uIGFuZCBzb21lIHN0YXRlCisgKiBhYm91dCB0aGUgaW50ZXJy dXB0LgorICoKKyAqIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJv dXQgdGhlIHN0YXR1cyBvZiB0aGUgQ1BVIHN1Y2gKKyAqIGFzOiBLZXJuZWwvVXNlciBtb2RlIGJp dCwgaW50ZXJydXB0IGVuYWJsZSBiaXQuCisgKgorICogVGhlIEJhZFZhZGRyIHJlZ2lzdGVyIGNv bnRhaW5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBjYXVzZSB0aGUgbGFzdAorICogZXhjZXB0 aW9uLgorICoKKyAqIFRoZSBDb250ZXh0IHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBsb3dlciAyMiBi aXRzIG9mIHRoZSBWUE4gKHN0YXJ0aW5nIGF0CisgKiBiaXQgNCkgdGhhdCBjYXVzZSB0aGUgbGFz dCBleGNlcHRpb24gZXhjZXB0IGJpdDAgYW5kIGJpdDEgYXJlIHplcm8uIFRoZQorICogdXBwZXIg Yml0cyAoYml0cyAyMyB0byAzMSBmb3IgTUlQUzMyIGFuZCBiaXRzIDIzIHRvIDYzKSBhcmUgc2V0 IHVuZGVyCisgKiBrZXJuZWwgY29udHJvbCAoaS5lLiBwb2ludCB0byB0aGUgcGFnZSB0YWJsZSku IFRoZSBDb250ZXh0L1hDb250ZXh0CisgKiByZWdpc3RlcnMgYXJlIG5vdCBjdXJyZW50bHkgdXNl ZCBieSBGcmVlQlNELgorICovCiAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMCwx MyArMTMyLDI3IEBACiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgotICogTWlwc0RvVExC TWlzcyAtLQorICogTWlwc0RvVExCTWlzcyAtLSAgKFVUTEIgbWlzcykKICAqCi0gKiBUaGlzIGlz IHRoZSByZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4KKyAqIFRoaXMgaXMgdGhlIHJlYWwgVExC IE1pc3MgSGFuZGxlciBjb2RlLiAgQSBtaXNzIHdhcyBnZW5lcmF0ZWQgd2hlbiB0aGUKKyAqIGFj Y2VzcyBpcyB0byBrdXNlZyBhbmQgdGhlcmUgd2FzIG5vdCBtYXRjaGluZyBtYXBwaW5nIGxvYWRl ZCBpbnRvIHRoZSBUTEIuCiAgKiAnc2VnYmFzZScgcG9pbnRzIHRvIHRoZSBiYXNlIG9mIHRoZSBz ZWdtZW50IHRhYmxlIGZvciB1c2VyIHByb2Nlc3Nlcy4KICAqCisgKiBUaGUgQ1BVIGRvZXMgdGhl IGZvbGxvd2luZyBmb3IgYW4gVVRMQiBtaXNzOgorICogLSBTZXRzIHRoZSBFUEMgcmVnaXN0ZXIu CisgKiAtIFNldHMgdGhlIENhdXNlIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBTdGF0dXMgcmVn aXN0ZXIuIFNoaWZ0cyBLL1UgYW5kIElFIGJpdHMgb3ZlciBvbmUgYW5kIGNsZWFycworICogICB0 aGUgY3VycmVudCBLZXJuZWwvVXNlciBhbmQgSW50ZXJydXB0IEVuYWJsZSBiaXRzLiBTbyB0aGUg cHJvY2Vzc29yCisgKiAgIGlzIGluIGtlcm5lbCBtb2RlIHdpdGggdGhlIGludGVydXB0cyB0dXJu ZWQgb2ZmLgorICogLSBTZXRzIEJhZFZhZGRyIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBDb250 ZXh0L1hDb250ZXh0IHJlZ2lzdGVyKHMpLgorICogLSBTZXRzIHRoZSBUTEIgRW50cnlIaSByZWdp c3RlciB0byBjb250YWluIFZQTiBvZiB0aGUgZmF1bHRpbmcgYWRkcmVzcy4KKyAqCiAgKiBEb24n dCBjaGVjayBmb3IgaW52YWxpZCBwdGUncyBoZXJlLiBXZSBsb2FkIHRoZW0gYXMgd2VsbCBhbmQK ICAqIGxldCB0aGUgcHJvY2Vzc29yIHRyYXAgdG8gbG9hZCB0aGUgY29ycmVjdCB2YWx1ZSBhZnRl ciBzZXJ2aWNlLgorICoKKyAqIFhYWCBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBjaGFuZ2VkIHRv IGEgbGluZWFyIHBhZ2UgdGFibGUgYW5kIHVzZSB0aGUKKyAqIENvbnRleHQgYW5kIFhDb250ZXh0 IHJlZ2lzdGVycy4gIFRoYXQgaXMgcmVhbGx5IHdoYXQgaXQgd2FzIGRlc2lnbmVkIGZvci4KICAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAgCS5zZXQgcHVzaApAQCAtMTM3LDI1ICsxNzMsODkg QEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ CSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQ VFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwg MChrMSkJCQkjIGsxPXBkZSBlbnRyeQotCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkj IGswPWJhZCBhZGRyZXNzIChhZ2FpbikKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUg ZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCWJlcQkJ azEsIHplcm8sIDJmCQkJIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQorCW5vcAorCisjaWZkZWYgTUlQ UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90 X3N1cGVycGFnZQkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkj IGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBp biB0aGUgUERFIGlmIHZhbGlkLgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJp dCBoZXJlIHNhdmVzIGEgZmF1bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8g ZG8gc28uIFRoZXJlZm9yZSwganVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZl cmVuY2UgYml0LgorIwlJRl9WQUxJRF9TRVRfUkVGQklUKGsxLCBrMCwgMCwgMSkKKworCSMgVGhl IFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxv MCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9U TEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZO IGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdF VF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24K KworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1w ZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZs YWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMg TG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9QVEVfU1dCSVRTKGsx KQkJCQkjIE5vIFNXIGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf TE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VN YXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sg Zm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VN YXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdyaXRlIHRvIHRsYgor CUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyB6 ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJIyByZXR1cm4gZnJv bSBleGNlcHRpb24KKworbm90X3N1cGVycGFnZToKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg Ki8KICNlbmRpZgorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRy ZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMwYjogazA9 VlBOIChha2EgdmE+PjEwKQogCWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMwYzogazA9cGFnZSB0 YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKLQlQ VEVfTAkJazAsIDAoazEpCQkJIzBlOiBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsx KQkJCSMwZjogazE9bG8wIHB0ZQorCisJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQor CisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIworCSMg WFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRlciBi dXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRha2Ug dGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NFVF9S RUZCSVQoazAsIGsxLCAwLCAyKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlr MCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjMTI6IGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlD TEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMx NTogbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0 ZQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF VF9SRUZCSVQoazAsIGsxLCAwLCAzKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRD MAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK IAl0bGJ3cgkJCQkJCSMxYTogd3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCiAJZXJldAkJCQkJ CSMxZjogcmV0VXJuIGZyb20gZXhjZXB0aW9uCisKIDE6CWoJCU1pcHNUTEJNaXNzRXhjZXB0aW9u CQkjMjA6IGtlcm5lbCBleGNlcHRpb24KIAlub3AJCQkJCQkjMjE6IGJyYW5jaCBkZWxheSBzbG90 CiAyOglqCQlTbG93RmF1bHQJCQkjMjI6IG5vIHBhZ2UgdGFibGUgcHJlc2VudApAQCAtMjY1LDcg KzM2NSw3IEBACiAjZW5kaWYKIAogLyoKLSAqIFNhdmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3Rh dGUuCisgKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lzdGVyIHN0YXRlIHdoZW4gdGFraW5nIGFuIGV4 Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZS4KICAqCiAgKiBUaGlzIGlzIHN0cmFpZ2h0Zm9yd2FyZCBl eGNlcHQgZm9yIHNhdmluZyB0aGUgZXhjZXB0aW9uIHByb2dyYW0KICAqIGNvdW50ZXIuIFRoZSBk ZGIgYmFja3RyYWNlIGNvZGUgbG9va3MgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgpAQCAtNDA2 LDYgKzUwNiw3IEBACiAJU0FWRV9SRUcoYTEsIFNSLCBzcCkKIAlSRVNUT1JFX0NQVQkJCSMgdjAg Y29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzLgogCXN5bmMKKwogCWVyZXQKIAkuc2V0CWF0CiBF TkQoTWlwc0tlcm5HZW5FeGNlcHRpb24pCkBAIC04ODQsMjEgKzk4NSw2MCBAQAogCVBUUl9TUkwJ CWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPXBkZSBvZmZzZXQgKGFsbW9zdCkKIAliZXEJ CWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09MCAtLSBubyBwZGUgdGFiCiAJYW5k aQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAs IGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBk ZSBlbnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGswPXBkZSBlbnRyeSBhZGRyZXNzCisJ UFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAKIAkvKiBWYWxpZGF0ZSBwZGUgdGFi bGUgcG9pbnRlci4gICovCiAJYmVxegkJazEsIDNmCiAJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVX X1BNQVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJ IyBrMT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3BnCQkj ID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5 IChkZWxheSBzbG90KQorCisJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCisJYW5k aQkJazEsIFBURV9WUgorCWJlcXoJCWsxLCAzZgorCW5vcAorCisJIyBUaGUgUERFIGlzIGFjdHVh bGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVB Ul9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8w IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIg bG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5f RlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFy ZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdh aW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJ CWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8g dGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJIyBDTEVBUl9QVEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNX IGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBw YWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UK KwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRl ZAorCUNPUDBfU1lOQworCisJYgkJdGxiX2luc2VydF9lbnRyeQorCW5vcAorCitub3Rfc3BnOgor I2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09Q XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdF X1NISUZUIC0gUFRFU0hJRlQJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURU1BU0sJCQkjIGsw PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNz CiAJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9dGhpcyBQVEUKIAogCS8qIFZhbGlkYXRlIHBhZ2Ug dGFibGUgZW50cnkuICAqLwotCWFuZGkJCWswLCBQVEVfVgorCWFuZGkJCWswLCBQVEVfVlIKIAli ZXF6CQlrMCwgM2YKIAlub3AKIApAQCAtOTA4LDI1ICsxMDQ4LDMxIEBACiAJbm9wCiAKIAlQVEVf TAkJazAsIDAoazEpCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklU UyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xF QVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQ VEVfTAkJazAsIFBURVNJWkUoazEpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMw CWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlDT1AwX1NZTkMKIAogCWIJCXRsYl9pbnNlcnRfZW50 cnkKIAlub3AKIAogb2RkX3BhZ2U6CiAJUFRFX0wJCWswLCAtUFRFU0laRShrMSkKLQlQVEVfTAkJ azEsIDAoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP UF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMw CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgMChrMSkKKworCUNMRUFSX1BU RV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQogCUNPUDBfU1lO QwogCiB0bGJfaW5zZXJ0X2VudHJ5OgpAQCAtOTM2LDExICsxMDgyLDE1IEBACiAJYmx0egkJazAs IHRsYl9pbnNlcnRfcmFuZG9tCiAJbm9wCiAJdGxid2kKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NP UF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9wCiAKIHRsYl9pbnNlcnRf cmFuZG9tOgogCXRsYndyCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwor CUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCkBAIC0xMDU0LDIxICsxMjA0LDY3IEBACiAjaWZk ZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPVZQ TgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRk cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQorCisjaWZkZWYgTUlQUzY0 X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgoazEp CQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90X2tz cGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUg ZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCisJ IyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBU TEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NP UF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRo ZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCku CisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9z dGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkj IGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBU TEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRz CisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJ VFMoazEpCQkJCSMgTm8gU1cgQml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8w X1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIg UGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdl TWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMg UGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8g dGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT SwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVy biBmcm9tIGV4Y2VwdGlvbgorCitub3Rfa3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg Ki8KKwogCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChh Z2FpbikKICAgCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5v IHBhZ2UgdGFibGUKICNlbmRpZgogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJ IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjIGswPXBhZ2UgdGFiIG9mZnNldAog CVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNzCisKIAlQVEVfTAkJazAsIDAo azEpCQkJIyBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQkJCSMgazE9bG8xIHB0 ZQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKwogCUNMRUFSX1BURV9TV0JJVFMo azApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCiAJ Q09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1Bf MF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkj IGswPWxvMSBwdGUKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf Q09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCiAJQ09QMF9TWU5DCiAJdGxid3IJCQkJCSMg d3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2Nw dS5jIGIvc3lzL21pcHMvbWlwcy9jcHUuYwotLS0gYS9zeXMvbWlwcy9taXBzL2NwdS5jCisrKyBi L3N5cy9taXBzL21pcHMvY3B1LmMKQEAgLTMxMyw2ICszMTMsMjUgQEAKIAljcHVpbmZvLT5sMi5k Y19zaXplID0gY3B1aW5mby0+bDIuZGNfbGluZXNpemUKIAkgICAgKiBjcHVpbmZvLT5sMi5kY19u c2V0cyAqIGNwdWluZm8tPmwyLmRjX253YXlzOwogI2VuZGlmCisKKwkvKgorCSAqIFByb2JlIFBh Z2VNYXNrIHJlZ2lzdGVyIHRvIHNlZSB3aGF0IHNpemVzIG9mIHBhZ2VzIGFyZSBzdXBwb3J0ZWQK KwkgKiBieSB3cml0aW5nIGFsbCBvbmUncyBhbmQgdGhlbiByZWFkaW5nIGl0IGJhY2suCisJICov CisJbWlwc193cl9wYWdlbWFzayh+MCk7CisJY3B1aW5mby0+dGxiX3BnbWFzayA9IG1pcHNfcmRf cGFnZW1hc2soKTsKKwltaXBzX3dyX3BhZ2VtYXNrKE1JUFMzX1BHTUFTS180Syk7CisKKyNpZmRl ZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18xNkspID09IDApCisJCXBhbmljKCIlczogMTZLIHNpemVkIHBhZ2VzIGFyZSBub3Qgc3Vw cG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1bmNfXyk7CisjZW5kaWYgLyogS1NUQUNL X0xBUkdFX1BBR0UgKi8KKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpZiAoKGNwdWluZm8tPnRs Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMU0pID09IDApCisJCXBhbmljKCIlczogMU0gc2l6ZWQg cGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsK KyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH0KIAogdm9pZApAQCAtMzg5LDYgKzQwOCwz MCBAQAogCQkJcHJpbnRmKCJGaXhlZCBtYXBwaW5nIik7CiAJCX0KIAkJcHJpbnRmKCIsICVkIGVu dHJpZXMgIiwgY3B1aW5mby50bGJfbmVudHJpZXMpOworCQlpZiAoY3B1aW5mby50bGJfcGdtYXNr KSB7CisJCQlwcmludGYoIigiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19Q R01BU0tfTUFTS1gpCisJCQkJcHJpbnRmKCIxSyAiKTsKKwkJCXByaW50ZigiNEsgIik7CisJCQlp ZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykKKwkJCQlwcmludGYoIjE2 SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRLKQorCQkJ CXByaW50ZigiNjRLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFT S18yNTZLKQorCQkJCXByaW50ZigiMjU2SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sg JiBNSVBTM19QR01BU0tfMU0pCisJCQkJcHJpbnRmKCIxTSAiKTsKKwkJCWlmIChjcHVpbmZvLnRs Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNE0pCisJCQkJcHJpbnRmKCI0TSAiKTsKKwkJCWlmIChj cHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZNKQorCQkJCXByaW50ZigiMTZNICIp OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NE0pCisJCQkJcHJp bnRmKCI2NE0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1 Nk0pCisJCQkJcHJpbnRmKCIyNTZNICIpOworCQkJcHJpbnRmKCJwZyBzaXplcykiKTsKKwkJfQor CQlwcmludGYoIlxuIik7CiAJfQogCiAJaWYgKGNwdWluZm8udGxiX3BnbWFzaykgewpkaWZmIC0t Z2l0IGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFy YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNs dWRlL3ZtcGFyYW0uaApAQCAtMTAwLDE1ICsxMDAsNDcgQEAKICNkZWZpbmUJRlJFRUJTRDMyX1VT UlNUQUNLCSgoKHZtX29mZnNldF90KTB4ODAwMDAwMDApIC0gUEFHRV9TSVpFKQogI2VuZGlmCiAK KyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKIC8qCi0gKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZh dGlvbnMuIChub3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0Ci0gKiBJIGNvcGllZCBpdCBmcm9tIEFS TSkKKyAqIEVuYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zOiAxIGxldmVsLgorICoKKyAqIFZN X05SRVNFUlZMRVZFTCBzcGVjaWZpZXMgYSBudW1iZXIgb2YgcHJvbW90aW9uIGxldmVscyBlbmFi bGVkLgorICogQ3VycmVudGx5IG1pcHM2NCBvbmx5IHN1cHBvcnRzIG9uZSBzaXplIG9yIGxldmVs IChWTV9MRVZFTF8wX09SREVSKSBvZgorICogc3VwZXJwYWdlcyAoMk1CKQorICovCisjaWZuZGVm CVZNX05SRVNFUlZMRVZFTAorI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCQkxCisjZW5kaWYKKwor LyoKKyAqIExldmVsIDAgcmVzZXJ2YXRpb25zIGNvbnNpc3Qgb2YgNTEyICgyXjkpIHBhZ2VzICgy TUIpLgorICovCisjaWZuZGVmCVZNX0xFVkVMXzBfT1JERVIKKyNkZWZpbmUJVk1fTEVWRUxfMF9P UkRFUgkJOQorI2VuZGlmCisKKy8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMg NE1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJCQkxMQorCisjZWxzZSAvKiAhIE1JUFM2 NF9ORVdfUE1BUCAqLworCisvKgorICogRGlzYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zLgog ICovCiAjaWZuZGVmCVZNX05SRVNFUlZMRVZFTAogI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCTAK ICNlbmRpZgogCiAvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KKyAq LworI2RlZmluZQlWTV9ORlJFRU9SREVSCQk5CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1B UCAqLworCisvKgogICogSG93IG1hbnkgcGh5c2ljYWwgcGFnZXMgcGVyIGttZW0gYXJlbmEgdmly dHVhbCBwYWdlLgogICovCiAjaWZuZGVmIFZNX0tNRU1fU0laRV9TQ0FMRQpAQCAtMTc3LDExICsy MDksNiBAQAogI2RlZmluZQlWTV9MT1dNRU1fQk9VTkRBUlkJKCh2bV9wYWRkcl90KTB4MjAwMDAw MDApCiAjZW5kaWYKIAotLyoKLSAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAxTUIu Ci0gKi8KLSNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQotCiAjZGVmaW5lCVpFUk9fUkVHSU9OX1NJ WkUJKDY0ICogMTAyNCkJLyogNjRLQiAqLwogCiAjaWZuZGVmIF9fbWlwc19uNjQKZGlmZiAtLWdp dCBhL3N5cy9taXBzL2luY2x1ZGUvcHRlLmggYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUuaApAQCAt MjksNiArMjksMTAgQEAKICNpZm5kZWYJX01BQ0hJTkVfUFRFX0hfCiAjZGVmaW5lCV9NQUNISU5F X1BURV9IXwogCisjaWYgIWRlZmluZWQoX0tFUk5FTCkKKyNpbmNsdWRlIDxtYWNoaW5lL3BhcmFt Lmg+CisjZW5kaWYKKwogI2lmbmRlZiBfTE9DT1JFCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8 fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KIHR5cGVkZWYJdWlu dDY0X3QgcHRfZW50cnlfdDsKQEAgLTcyLDIyICs3NiwyNSBAQAogICogTk9URTogVGhpcyBtZWFu cyB0aGF0IGZvciAzMi1iaXQgdXNlIG9mIENQMCwgd2UgYXJlbid0IGFibGUgdG8gc2V0IHRoZSB0 b3AKICAqIGJpdCBvZiBQRk4gdG8gYSBub24temVybyB2YWx1ZSwgYXMgc29mdHdhcmUgaXMgdXNp bmcgaXQhICBUaGlzIHBoeXNpY2FsCiAgKiBtZW1vcnkgc2l6ZSBsaW1pdCBtYXkgbm90IGJlIHN1 ZmZpY2llbnRseSBlbmZvcmNlZCBlbHNld2hlcmUuCisgKgorICogWFhYUlc6IE9uIENIRVJJLCBi aXRzIDYzIGFuZCA2MiBhcmUgdXNlZCBmb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0Cisg KiBwcmV2ZW50IGxvYWRpbmcgYW5kIHN0b3Jpbmcgb2YgY2FwYWJpbGl0aWVzLCBzbyB3ZSBoYXZl IHJlZHVjZWQgdGhlIDU1LWJpdAorICogc2hpZnQgdG8gNTMgYml0cy4KICAqLwogI2lmIGRlZmlu ZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklU ICovCi0jZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTUpCi0jZGVmaW5lCVRMQkxPX1NXQklU U19DTEVBUl9TSElGVAkoOSkKLSNkZWZpbmUJVExCTE9fUEZOX01BU0sJCTB4M0ZGRkZGRkMwVUxM CisjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTMpCQkvKiBYWFhSVzogV2FzIDU1LiAqLwor I2RlZmluZQlUTEJMT19SRUZfQklUX1NISUZUCSg2MSkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX0NM RUFSX1NISUZUCSgxMSkJLyogWFhYU1M6IFdhcyA5LiAqLworI2RlZmluZQlUTEJMT19QRk5fTUFT SwkJMHhGRkZGRkZDMFVMTAorI2RlZmluZQlUTEJfMU1fU1VQRVJQQUdFX1NISUZUCShQRFJTSElG VCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4N0YgPDwgVExCTE9f U1dCSVRTX1NISUZUKQogI2Vsc2UKICNkZWZpbmUJVExCTE9fU1dCSVRTX1NISUZUCSgyOSkKICNk ZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSgzKQogI2RlZmluZQlUTEJMT19QRk5fTUFT SwkJKDB4MUZGRkZGQzApCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkw eDcgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2VuZGlmCiAjZGVmaW5lCVRMQkxPX1BGTl9TSElG VAkJKDYpCi0jZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDcgPDwgVExC TE9fU1dCSVRTX1NISUZUKQotI2RlZmluZQlUTEJMT19QQV9UT19QRk4ocGEpCSgoKChwYSkgPj4g VExCX1BBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSykKLSNk ZWZpbmUJVExCTE9fUEZOX1RPX1BBKHBmbikJKCh2bV9wYWRkcl90KSgocGZuKSA+PiBUTEJMT19Q Rk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NISUZUKQotI2RlZmluZQlUTEJMT19QVEVfVE9fUEZOKHB0 ZSkJKChwdGUpICYgVExCTE9fUEZOX01BU0spCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QQShwdGUp CShUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRlKSkpKQogCiAvKgogICogWFhY IFRoaXMgY29tbWVudCBpcyBub3QgY29ycmVjdCBmb3IgYW55dGhpbmcgbW9yZSBtb2Rlcm4gdGhh biBSNEsuCkBAIC0xMjEsMjUgKzEyOCw4MyBAQAogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242 NCkgKi8KIAogLyoKKyAqIFBURSBIYXJkd2FyZSBCaXRzIChFbnRyeUxvMC0xIHJlZ2lzdGVyIGZp ZWxkcykKKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtLS0tLS0tLS0tLS0tLS0gNiA1IC0gMyAgMiAg IDEgICAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgICAgICAgUEZOICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8CisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICoKKyAqIExvd2VyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICA1MiAt LS0tLS0tLS0tLS0tLS0tLS0tLSAzNCAgMzMgLS0tLS0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAy ICAgMSAgIDAKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgIFJlc2VydmVkIChaZXJvKSAg ICAgfCAgICAgICAgICBQRk4gICAgICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKgogICogVExCIGZsYWdzIG1hbmFnZWQgaW4gaGFyZHdhcmU6CisgKiAgICBQ Rk46CVBhZ2UgRnJhbWUgTnVtYmVyLgogICogCUM6CUNhY2hlIGF0dHJpYnV0ZS4KICAqIAlEOglE aXJ0eSBiaXQuICBUaGlzIG1lYW5zIGEgcGFnZSBpcyB3cml0YWJsZS4gIEl0IGlzIG5vdAogICog CQlzZXQgYXQgZmlyc3QsIGFuZCBhIHdyaXRlIGlzIHRyYXBwZWQsIGFuZCB0aGUgZGlydHkKICAq IAkJYml0IGlzIHNldC4gIFNlZSBhbHNvIFBURV9STy4KLSAqIAlWOglWYWxpZCBiaXQuICBPYnZp b3VzLCBpc24ndCBpdD8KKyAqIAlWUjoJVmFsaWQvUmVmZXJlbmNlIGJpdC4gU2VlIGFsc28gUFRF X1NWLgogICogCUc6CUdsb2JhbCBiaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBtYXBwaW5nIGlz IHByZXNlbnQKICAqIAkJaW4gRVZFUlkgYWRkcmVzcyBzcGFjZSwgYW5kIHRvIGlnbm9yZSB0aGUg QVNJRCB3aGVuCiAgKiAJCWl0IGlzIG1hdGNoZWQuCiAgKi8KICNkZWZpbmUJUFRFX0MoYXR0cikJ CSgoYXR0ciAmIDB4MDcpIDw8IDMpCiAjZGVmaW5lCVBURV9DX1VOQ0FDSEVECQkoUFRFX0MoTUlQ U19DQ0FfVU5DQUNIRUQpKQogI2RlZmluZQlQVEVfQ19DQUNIRQkJKFBURV9DKE1JUFNfQ0NBX0NB Q0hFRCkpCiAjZGVmaW5lCVBURV9ECQkJMHgwNAotI2RlZmluZQlQVEVfVgkJCTB4MDIKKyNkZWZp bmUJUFRFX1ZSCQkJMHgwMgogI2RlZmluZQlQVEVfRwkJCTB4MDEKIAorI2lmZGVmIENQVV9DSEVS SQorLyoKKyAqIENIRVJJIEVudHJ5TG8gZXh0ZW5zaW9ucyB0aGF0IGxpbWl0IHN0b3JpbmcgbG9h ZGluZyBhbmQgc3RvcmluZyB0YWdnZWQKKyAqIHZhbHVlcy4KKyAqLworI2RlZmluZQlQVEVfU0MJ CQkoMHgxVUxMIDw8IDYzKQorI2RlZmluZQlQVEVfTEMJCQkoMHgxVUxMIDw8IDYyKQorI2VuZGlm CisKIC8qCisgKiBQVEUgU29mdHdhcmUgQml0cworICoKKyAqIFVwcGVyIGJpdHMgb2YgYSAzMiBi aXQgUFRFOgorICoKKyAqICAgICAzMSAgIDMwICAgMjkKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisg KiAgIHwgTU4gfCBXICB8IFJPIHwKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisgKgorICogVXBwZXIg Yml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogICA2My02MiAgIDYxLTYwICA1OSAgIDU4IC0t IDU2ICAgIDU1ICAgNTQgICA1MworICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqICB8ICBSRyAgfCAgICAgIHwgU1YgfCBQRyBTWiBJRFggfCBNTiB8 IFcgIHwgUk8gfAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqCiAgKiBWTSBmbGFncyBtYW5hZ2VkIGluIHNvZnR3YXJlOgorICoJUkc6CVJlZ2lv bi4JIChSZXNlcnZlZC4gQ3VycmVudGx5IG5vdCB1c2VkLikKKyAqCVNWOglTb2Z0IFZhbGlkIGJp dC4KKyAqCVBHIFNaIElEWDogUGFnZSBTaXplIEluZGV4ICgwLTcpLgorICoJCUluZGV4CVBhZ2Ug TWFzayAoQmluYXJ5KQlIVyBQYWdlIFNpemUKKyAqCQktLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0t CS0tLS0tLS0tLS0tLQorICoJCTAJMDAwMCAwMDAwIDAwMDAgMDAwMAkgIDRLCisgKgkJMQkwMDAw IDAwMDAgMDAwMCAwMDExCSAxNksKKyAqCQkyCTAwMDAgMDAwMCAwMDAwIDExMTEJIDY0SworICoJ CTMJMDAwMCAwMDAwIDAwMTEgMTExMQkyNTZLCisgKgkJNAkwMDAwIDAwMDAgMTExMSAxMTExCSAg MU0KKyAqCQk1CTAwMDAgMDAxMSAxMTExIDExMTEJICA0TQorICoJCTYJMDAwMCAxMTExIDExMTEg MTExMQkgMTZNCisgKiAoTUlQUyAzOikKKyAqCQk3CTAwMTEgMTExMSAxMTExIDExMTEJIDY0TQor ICoJCTgJMTExMSAxMTExIDExMTEgMTExMQkyNTZNIChOb3QgY3VycmVudGx5IHN1cHBvcnRlZCkK KyAqCiAgKiAJUk86CVJlYWQgb25seS4gIE5ldmVyIHNldCBQVEVfRCBvbiB0aGlzIHBhZ2UsIGFu ZCBkb24ndAogICogCQlsaXN0ZW4gdG8gcmVxdWVzdHMgdG8gd3JpdGUgdG8gaXQuCiAgKiAJVzoJ V2lyZWQuICA/Pz8KQEAgLTE1MSwxMyArMjE2LDI5MSBAQAogI2RlZmluZQlQVEVfUk8JCQkoKHB0 X2VudHJ5X3QpMHgwMSA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9XCQkJKChw dF9lbnRyeV90KTB4MDIgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVfTUFOQUdF RAkJKChwdF9lbnRyeV90KTB4MDQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2lmIGRlZmluZWQo X19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICov CisjZGVmaW5lCVBURV9QU18xNksJCSgocHRfZW50cnlfdCkweDA4IDw8IFRMQkxPX1NXQklUU19T SElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0SwkJKChwdF9lbnRyeV90KTB4MTAgPDwgVExCTE9fU1dC SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMjU2SwkJKChwdF9lbnRyeV90KTB4MTggPDwgVExC TE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMU0JCSgocHRfZW50cnlfdCkweDIwIDw8 IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzRNCQkoKHB0X2VudHJ5X3QpMHgy OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU18xNk0JCSgocHRfZW50cnlf dCkweDMwIDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0TQkJKChwdF9l bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfSURYX01B U0sJCSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRF X1BTSURYX05CSVRTX1RPX0xFRlQJCTUKKyNkZWZpbmUJUFRFX1BTSURYX05CSVRTX1RPX1JJR0hU CTU2CisjZGVmaW5lCVBURV9QRk5fTkJJVFNfVE9fTEVGVAkJMTEKKyNkZWZpbmUJUFRFX1BGTl9O QklUU19UT19SSUdIVAkJNgorI2RlZmluZQlQVEVfSFdGTEFHU19OQklUU19UT19MRUZUCTU4Cisj ZGVmaW5lCVNXX1ZBTElECQkweDQwCisjZGVmaW5lCVBURV9TVgkJCSgocHRfZW50cnlfdClTV19W QUxJRCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZWxzZQorI2RlZmluZQlQVEVfUFNfSURYX01B U0sJCTAKKyNkZWZpbmUJUFRFX1NWCQkJMAorI2VuZGlmCisKKy8qCisgKiBQcm9tb3Rpb24gdG8g YSA0TUIgKFBERSkgcGFnZSBtYXBwaW5nIHJlcXVpcmVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcg NEtCCisgKiAoUFRFKSBwYWdlIG1hcHBpbmdzIGhhdmUgaWRlbnRpY2FsIHNldHRpbmdzIGZvciB0 aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqLworI2RlZmluZQlQR19QUk9NT1RFX01BU0sJKFBURV9H IHwgUFRFX1ZBTElEIHwgUFRFX0QgfCBQVEVfQ19VTkNBQ0hFRCB8IFwKKwkJCVBURV9DX0NBQ0hF IHwgUFRFX1JPIHwgUFRFX1cgfCBQVEVfTUFOQUdFRCB8IFwKKwkJCVBURV9SRUYpCisKKyNpZmRl ZiBNSVBTNjRfTkVXX1BNQVAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpCSgoKHB0ZSkg JiBQVEVfUFNfSURYX01BU0spID4+IDU2KQorI2RlZmluZQlUTEJNQVNLX0lEWF9UT19NQVNLKGlk eCkgKCgoMSA8PCAoKGlkeCkgPDwgMSkpIC0gMSkgPDwgVExCTUFTS19TSElGVCkKKyNkZWZpbmUJ VExCTE9fUFRFX1RPX01BU0socHRlKQlUTEJNQVNLX0lEWF9UT19NQVNLKFRMQkxPX1BURV9UT19J RFgocHRlKSkKKyNkZWZpbmUJVExCTUFTS180S19QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDAp CisjZGVmaW5lCVRMQk1BU0tfMTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygxKQorI2RlZmlu ZQlUTEJNQVNLXzY0S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMikKKyNkZWZpbmUJVExCTUFT S18yNTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygzKQorI2RlZmluZQlUTEJNQVNLXzFNX1BB R0UJCVRMQk1BU0tfSURYX1RPX01BU0soNCkKKyNkZWZpbmUJVExCTUFTS180TV9QQUdFCQlUTEJN QVNLX0lEWF9UT19NQVNLKDUpCisjZGVmaW5lCVRMQk1BU0tfMTZNX1BBR0UJVExCTUFTS19JRFhf VE9fTUFTSyg2KQorI2RlZmluZQlUTEJNQVNLXzY0TV9QQUdFCVRMQk1BU0tfSURYX1RPX01BU0so NykKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisjZGVmaW5lCVRMQkxPX1BURV9UT19J RFgocHRlKSAJMAorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCTAKKyNlbmRpZiAvKiAh IE1JUFM2NF9ORVdfUE1BUCAqLwogCiAvKgogICogUFRFIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZv ciBiaXRzIGRlZmluZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUJcHRlX2NsZWFyKHB0ZSwgYml0KQko KihwdGUpICY9IH4oYml0KSkKLSNkZWZpbmUJcHRlX3NldChwdGUsIGJpdCkJKCoocHRlKSB8PSAo Yml0KSkKLSNkZWZpbmUJcHRlX3Rlc3QocHRlLCBiaXQpCSgoKihwdGUpICYgKGJpdCkpID09IChi aXQpKQorI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcHRlX2NsZWFyKHB0 X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlICY9ICh+Yml0KTsKK30K Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9zZXQocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRy eV90IGJpdCkKK3sKKworCSpwdGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50Citw dGVfdGVzdChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgo KnB0ZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9jbGVh cihwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICop cGRlICY9ICh+Yml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9zZXQocGRfZW50 cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50cnlfdCAqKXBkZSB8PSBi aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV90ZXN0KHBkX2VudHJ5X3QgKnBkZSwg cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqKHB0X2VudHJ5X3QgKilwZGUgJiBiaXQp ID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QQV9UT19Q Rk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfUEFHRV9TSElGVCkg PDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKTsKK30KKworc3RhdGljIF9faW5s aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BGTl9UT19QQShwdF9lbnRyeV90IHBmbikKK3sKKworCXJl dHVybiAoKHZtX3BhZGRyX3QpKHBmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NI SUZUKTsKK30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BURV9UT19QRk4o cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKHB0ZSAmIFRMQkxPX1BGTl9NQVNLKTsKK30K KworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisjZGVmaW5lCVBURV9SRUYJCVBURV9WUgorI2Rl ZmluZQlQVEVfVkFMSUQgCVBURV9TVgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRlKQkJCXB0ZV90 ZXN0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2NsZWFyKHB0ZSkJCXB0ZV9jbGVh cigocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQkJcHRlX3NldCgocHRl KSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQlhdG9taWNfY2xl YXJfbG9uZygocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSkJ CWF0b21pY19zZXRfbG9uZygocHRlKSwgUFRFX1JFRikKKworI2Vsc2UgLyogISBNSVBTNjRfTkVX X1BNQVAgKi8KKworI2RlZmluZQlQVEVfUkVGCQkwCisjZGVmaW5lCVBURV9WQUxJRAlQVEVfVlIK KworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJCQkwCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRl KQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFy KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSwgYml0KQorCisjZW5kaWYgLyog ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlwdGVfaXNfdmFsaWQocHRlKQkJcHRlX3Rl c3QoKHB0ZSksIFBURV9WQUxJRCkKKworI2lmIGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5l ZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21p Y19jbGVhcihwdGUsIGJpdCkJYXRvbWljX2NsZWFyXzY0KChwdGUpLCBiaXQpCisjZGVmaW5lCXB0 ZV9hdG9taWNfc2V0KHB0ZSwgYml0KQlhdG9taWNfc2V0XzY0KChwdGUpLCBiaXQpCisjZGVmaW5l CXB0ZV9sb2FkX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfNjQocHRlcCwgcHRl KQorI2RlZmluZQlwZGVfbG9hZF9zdG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19y ZWFkYW5kc2V0XzY0KFwKKwkJCQkJCShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5l CXB0ZV9hdG9taWNfc3RvcmUocHRlcCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzY0KHB0ZXAsIHB0 ZSkKKyNkZWZpbmUgcHRlX3N0b3JlKHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9sb25nICopKHB0 ZXApID0gKHVfbG9uZykocHRlKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBk ZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUpCisKKworI2Vsc2UgLyogISBQSFlTQUREUl82 NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNfY2xl YXJfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0b21p Y19zZXRfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRlKQlh dG9taWNfcmVhZGFuZHNldF8zMihwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3JlKHBk ZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfMzIoXAorCQkJCQkJKHB0X2Vu dHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBwdGUp CWF0b21pY19zdG9yZV9yZWxfMzIocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRlcCwg cHRlKQlkbyB7CQlcCisJKih1X2ludCAqKShwdGVwKSA9ICh1X2ludCkocHRlKTsJXAorfSB3aGls ZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBkZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUp CisKKyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZW5kaWYgLyogISBfTE9DT1JF ICovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog IFBIWVNBRERSXzY0X0JJVCAqLworCisjaWZuZGVmIF9MT0NPUkUKKy8qCisgKiBDaGVjayB0byBz ZWUgaWYgYSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgKFBhZ2VTaXplID4gNEspIFBURS4K KyAqCisgKiBPbiBfX21pcHNfbjY0IHRoZSBrZXJuZWwgdXNlcyB0aGUgdmlydHVhbCBtZW1vcnkg YWRkcmVzcyByYW5nZSBmcm9tCisgKiBWTV9NSU5fS0VSTkVMX0FERFJFU1MgKDB4YzAwMDAwMDAw MDAwMDAwMCkgdG8gVk1fTUFYX0tFUk5FTF9BRERSRVNTCisgKiAoMHhjMDAwMDA4MDAwMDAwMDAw KS4gVGhlcmVmb3JlLCBhIHZhbGlkIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgUERFCisgKiAoYSBw b2ludGVyIHRvIGEgcGFnZSB0YWJsZSkgd2lsbCBoYXZlIGJpdHMgNjEgdG8gNDAgc2V0IHRvIHpl cm8uIEEKKyAqIHN1cGVycGFnZSB3aWxsIGhhdmUgb25lIG9mIHRoZSBzdXBlcnBhZ2Ugc2l6ZSBi aXRzIChiaXRzIDU4IHRvIDU2KQorICogc2V0LgorICovCisKKy8qIElzIHRoZSBQREUgYSBzdXBl cnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfc3VwZXJw YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ VEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUFRFIGEgc3VwZXJwYWdlIG9m IGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcHRlX2lzX3N1cGVycGFnZShwdF9l bnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAw KTsKK30KKworLyogSXMgdGhlIFBERSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5s aW5lIGludAorcGRlX2lzXzFtX3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1 cm4gKCgocHRfZW50cnlfdCkqcGRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisv KiBJcyB0aGUgUFRFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw dGVfaXNfMW1fc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVybiAoKCpwdGUg JiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIFBoeXNpY2FsIEFkZHJlc3MgdG8g U3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJlci4gKi8KK3N0YXRpYyBfX2lubGluZSBwdF9l bnRyeV90CitUTEJMT19QQV9UT19TUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgo cGEgPj4gVExCXzFNX1NVUEVSUEFHRV9TSElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmCisJICAg IFRMQkxPX1BGTl9NQVNLKTsKK30KKworLyogU3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJl ciB0byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RM QkxPX1NQRk5fVE9fUEEocHRfZW50cnlfdCBzcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJf dCkoc3BmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8CisJICAgIFRMQl8xTV9TVVBFUlBBR0VfU0hJ RlQpOworfQorCisvKiBTdXBlcnBhZ2UgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1NQVEVfVE9fUEEocHRf ZW50cnlfdCBwdGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BERV9U T19QQShwZF9lbnRyeV90IHBkZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9f UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisKKworLyogQW4gNEtCIFBhZ2UgVGFi bGUgRW50cnkgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk cl90CitUTEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxP X1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5l IHZtX3BhZGRyX3QKK1RMQkxPX1BERV9UT19QQShwZF9lbnRyeV90IHBkZSkKK3sKKworCXJldHVy biAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOwor fQorI2VuZGlmIC8qICEgX0xPQ09SRSAqLworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAq LworCisjZGVmaW5lCXB0ZV9pc19yZWZlcmVuY2VkKHB0ZSkJCTAKKyNkZWZpbmUJcHRlX3JlZmVy ZW5jZV9yZXNldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZlcmVuY2VfcGFnZShwdGUpCisjZGVmaW5l CXBkZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZQlwdGVfaXNfc3VwZXJwYWdlKHBkZSkJ CTAKKyNkZWZpbmUgcGRlX2lzXzFtX3N1cGVycGFnZShwdGUpCTAKKyNkZWZpbmUgcHRlX2lzXzFt X3N1cGVycGFnZShwdGUpCTAKKworI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm1f cGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChU TEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisjZW5kaWYgLyogISBf TE9DT1JFICovCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KIAogLyogQXNzZW1ibHkg c3VwcG9ydCBmb3IgUFRFIGFjY2VzcyovCiAjaWZkZWYgTE9DT1JFCkBAIC0xNjcsMTYgKzUxMCwx MDQgQEAKICNkZWZpbmUJUFRFTUFTSwkJCTB4ZmY4CiAjZGVmaW5lCVBURVNJWkUJCQk4CiAjZGVm aW5lCVBURV9MCQkJbGQKKyNkZWZpbmUJUFRFX1MJCQlzZAogI2RlZmluZQlQVEVfTVRDMAkJZG10 YzAKLSNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhwcikKLSNlbHNlCisjZGVmaW5lCUNMRUFSX1BU RV9TV0JJVFMocikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisvKiBTdXBlcnBhZ2UgYW5k IHJlZmVyZW5jZWQgYml0IGVtdWxhdGlvbiBBU00gbWFjcm9zLiAqLworCisvKgorICogR0VUX1NV UEVSUEFHRV9JRFgocikKKyAqCisgKiBHZXQgdGhlIHN1cGVycGFnZSBpbmRleCBmcm9tIHRoZSBQ VEUgYnkgc2hpZnRpbmcgaXQgbGVmdCBieQorICogUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgKGNs ZWFyaW5nIHRoZSB1cHBlciBzb2Z0Yml0cykgYW5kIHRoZW4gYmFjayB0byB0aGUKKyAqIHJpZ2h0 IGJ5IChQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQp IGNsZWFyaW5nCisgKiBhbGwgdGhlIGxvd2VyIGJpdHMgaW4gdGhlIHByb2Nlc3MuCisgKi8KKyNk ZWZpbmUgR0VUX1NVUEVSUEFHRV9JRFgocikJCQkJXAorCWRzbGwJciwgKFBURV9QU0lEWF9OQklU U19UT19MRUZUKTsJCVwKKwlkc3JsMzIJciwgKFBURV9QU0lEWF9OQklUU19UT19SSUdIVCArIFBU RV9QU0lEWF9OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfSFdfVExCX0ZMQUdTKHIp CisgKgorICogR2V0IHRoZSBsb3dlciBoYXJkd2FyZSBUTEIgZmxhZ3MgYnV0IHNoaWZ0aW5nIGxl ZnQgdGhlbiByaWdodC4KKyAqLworI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCQkJCVwKKwlk c2xsMzIJciwgKFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMik7CVwKKwlkc3JsMzIJciwg KFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9PRERfMU1fUEZO X0ZST01fRVZFTihyKQorICoKKyAqIEdldCB0aGUgb2RkIDFNIFBGTiAoVExCIGxvMSkgZnJvbSB0 aGUgZXZlbiAxTSBQVEUuICBGaXJzdCwgbWFzayBvdXQgdGhlIFBGTgorICogZnJvbSB0aGUgZXZl biBQVEUuIFRoZW4gYWRkIDFNIHdvcnRoIG9mIHBhZ2VzIHRvIGl0ICgyNTYpLiBGaW5hbGx5LCBz aGlmdCBpdAorICogYmFjayB0byBpdHMgcG9zaXRpb24gaW4gdGhlIFBURS4KKyAqLworI2RlZmlu ZSBHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4ocikJCQlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklU U19UT19MRUZUKTsJCVwKKwlkc3JsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQgKyBQVEVfUEZO X05CSVRTX1RPX1JJR0hUKTsgXAorCWRhZGRpdQlyLCByLCAoMTAyNCAqIDEwMjQgLyBQQUdFX1NJ WkUpOwlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklUU19UT19SSUdIVCkKKworLyoKKyAqIElGX1ZB TElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKyAqCisgKiBJZiBhIFBERSBp cyB2YWxpZCB0aGVuIHNldCB0aGUgcmVmZXJlbmNlZCBiaXQgKFBURV9WUikuICBUaGUgZmlyc3Qg dmVyc2lvbgorICogZG9lcyBpdCBhdG9taWNhbGx5LgorICovCisjZGVmaW5lIEFUT01JQ19SRUZC SVRfVVBEQVRFCisjaWZkZWYgQVRPTUlDX1JFRkJJVF9VUERBVEUKKworI2RlZmluZSBJRl9WQUxJ RF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlx dWUgIyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMik7CQlc CisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQgIyMgdW5p cXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlsbGQJcjAsIG9mZnNl dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJc2NkCXIwLCBvZmZz ZXQgIyMgKHIxKSA7CQkJXAorCWJlcXoJcjAsIHRyeV9hZ2FpbiAjIyB1bmlxdWUgOwkJXAorCVBU RV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMjIHVuaXF1ZSAjIyA6CisK KyNlbHNlIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8KKworI2RlZmluZSBJRl9WQUxJRF9T RVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlxdWUg IyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMikgOwkJXAor CWFuZGkJcjAsIHIwLCBTV19WQUxJRCA7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlx dWUgOwkJXAorCVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBU RV9WUiA7CQkJXAorCVBURV9TCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMj IHVuaXF1ZSAjIyA6CisjZW5kaWYgLyogISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZWxz ZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCUdFVF9TVVBFUlBBR0VfSURYKHIp CisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikKKyNkZWZpbmUJSUZfVkFMSURfU0VUX1JFRkJJ VChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorCisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAg Ki8KKworI2Vsc2UgLyogISBMT0NPUkUgKi8KICNkZWZpbmUJUFRFU0hJRlQJCTIKICNkZWZpbmUJ UFRFMk1BU0sJCTB4ZmY4CS8qIGZvciB0aGUgMi1wYWdlIGxvMC9sbzEgKi8KICNkZWZpbmUJUFRF TUFTSwkJCTB4ZmZjCiAjZGVmaW5lCVBURVNJWkUJCQk0CiAjZGVmaW5lCVBURV9MCQkJbHcKKyNk ZWZpbmUJUFRFX1MJCQlzdwogI2RlZmluZQlQVEVfTVRDMAkJbXRjMAogI2RlZmluZQlDTEVBUl9Q VEVfU1dCSVRTKHIpCUxPTkdfU0xMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVDsgTE9OR19T UkwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUIC8qIHJlbW92ZSBzd2JpdHMgKi8KKworI2Rl ZmluZQlJU19QVEVfVkFMSUQocjAsIHIxLCBvZmZzZXQsIGxhYmVsKQorI2RlZmluZQlTRVRfUkVG X0JJVChyMCwgcjEsIG9mZnNldCkKKwogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242NCkgfHwg ZGVmaW5lZChfX21pcHNfbjMyKSAqLwogCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KQpAQCAtMjAx LDQgKzYzMiwxNyBAQAogI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKICNkZWZp bmUJTUlQUzNfUEdNQVNLXzI1Nk0JMHgxZmZmZTAwMAogCisKKy8qIFBhZ2VNYXNrIFJlZ2lzdGVy IChDUDAgUmVnaXN0ZXIgNSwgU2VsZWN0IDApIFZhbHVlcyAqLworI2RlZmluZQlNSVBTM19QR01B U0tfTUFTS1gJMHgwMDAwMTgwMAorI2RlZmluZQlNSVBTM19QR01BU0tfNEsJCTB4MDAwMDAwMDAK KyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2SwkweDAwMDA2MDAwCisjZGVmaW5lCU1JUFMzX1BHTUFT S182NEsJMHgwMDAxZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2SwkweDAwMDdlMDAwCisj ZGVmaW5lCU1JUFMzX1BHTUFTS18xTQkJMHgwMDFmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tf NE0JCTB4MDA3ZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2TQkweDAxZmZlMDAwCisjZGVm aW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2 TQkweDFmZmZlMDAwCisKICNlbmRpZiAvKiAhX01BQ0hJTkVfUFRFX0hfICovCmRpZmYgLS1naXQg YS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaCBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCkBA IC00OCw2ICs0OCw3IEBACiAKICNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KICNpbmNsdWRl IDxtYWNoaW5lL3B0ZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaWYgZGVmaW5lZChf X21pcHNfbjMyKSB8fCBkZWZpbmVkKF9fbWlwc19uNjQpIC8qIFBIWVNBRERSXzY0QklUICovCiAj ZGVmaW5lCU5LUFQJCTI1NgkvKiBtZW0gPiA0Rywgdm1fcGFnZV9zdGFydHVwIG5lZWRzIG1vcmUg S1BUcyAqLwpAQCAtNjIsMTUgKzYzLDI0IEBACiAjaW5jbHVkZSA8c3lzL19sb2NrLmg+CiAjaW5j bHVkZSA8c3lzL19tdXRleC5oPgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjaW5jbHVkZSA8 dm0vX3ZtX3JhZGl4Lmg+CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCisKIC8qCiAgKiBQ bWFwIHN0dWZmCiAgKi8KIHN0cnVjdCBwdl9lbnRyeTsKIHN0cnVjdCBwdl9jaHVuazsKIAogc3Ry dWN0IG1kX3BhZ2UgewotCWludCBwdl9mbGFnczsKIAlUQUlMUV9IRUFEKCwgcHZfZW50cnkpIHB2 X2xpc3Q7CisJdm1fbWVtYXR0cl90IHB2X21lbWF0dHI7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQ CisJaW50IHB2X2dlbjsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisJaW50IHB2X2Zs YWdzOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiB9OwogCiAjZGVmaW5lCVBWX1RB QkxFX1JFRgkJMHgwMgkvKiByZWZlcmVuY2VkICovCkBAIC04MSwxNSArOTEsMTggQEAKICNkZWZp bmUJQVNJREdFTl9NQVNLCQkoKDEgPDwgQVNJREdFTl9CSVRTKSAtIDEpCiAKIHN0cnVjdCBwbWFw IHsKKwlzdHJ1Y3QgbXR4IHBtX210eDsKIAlwZF9lbnRyeV90ICpwbV9zZWd0YWI7CS8qIEtWQSBv ZiBzZWdtZW50IHRhYmxlICovCiAJVEFJTFFfSEVBRCgsIHB2X2NodW5rKQlwbV9wdmNodW5rOwkv KiBsaXN0IG9mIG1hcHBpbmdzIGluIHBtYXAgKi8KIAljcHVzZXRfdAlwbV9hY3RpdmU7CQkvKiBh Y3RpdmUgb24gY3B1cyAqLwogCXN0cnVjdCB7CiAJCXVfaW50MzJfdCBhc2lkOkFTSURfQklUUzsJ LyogVExCIGFkZHJlc3Mgc3BhY2UgdGFnICovCiAJCXVfaW50MzJfdCBnZW46QVNJREdFTl9CSVRT OwkvKiBpdHMgZ2VuZXJhdGlvbiBudW1iZXIgKi8KIAl9ICAgICAgcG1fYXNpZFtNQVhTTVBDUFVd OwogCXN0cnVjdCBwbWFwX3N0YXRpc3RpY3MgcG1fc3RhdHM7CS8qIHBtYXAgc3RhdGlzdGljcyAq LwotCXN0cnVjdCBtdHggcG1fbXR4OworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCXN0cnVjdCB2 bV9yYWRpeCBwbV9yb290OwkJLyogc3BhcmUgcGFnZSB0YWJsZSBwYWdlcyAqLworI2VuZGlmIC8q IE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcG1hcCAqcG1hcF90OwpA QCAtMTIxLDcgKzEzNCw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHB2X2VudHJ5IHsKIAl2bV9v ZmZzZXRfdCBwdl92YTsJLyogdmlydHVhbCBhZGRyZXNzIGZvciBtYXBwaW5nICovCi0JVEFJTFFf RU5UUlkocHZfZW50cnkpIHB2X2xpc3Q7CisJVEFJTFFfRU5UUlkocHZfZW50cnkpIHB2X25leHQ7 CiB9ICAgICAgICpwdl9lbnRyeV90OwogCiAvKgpAQCAtMTY5LDYgKzE4Miw3IEBACiAKIHZvaWQg cG1hcF9ib290c3RyYXAodm9pZCk7CiB2b2lkICpwbWFwX21hcGRldih2bV9wYWRkcl90LCB2bV9z aXplX3QpOworLy9ib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CiB2 b2lkIHBtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QsIHZtX3NpemVfdCk7CiB2bV9vZmZzZXRfdCBw bWFwX3N0ZWFsX21lbW9yeSh2bV9zaXplX3Qgc2l6ZSk7CiB2b2lkIHBtYXBfa2VudGVyKHZtX29m ZnNldF90IHZhLCB2bV9wYWRkcl90IHBhKTsKQEAgLTE3OCw2ICsxOTIsNyBAQAogdm9pZCBwbWFw X2tlbnRlcl90ZW1wb3JhcnlfZnJlZSh2bV9wYWRkcl90IHBhKTsKIHZvaWQgcG1hcF9mbHVzaF9w dmNhY2hlKHZtX3BhZ2VfdCBtKTsKIGludCBwbWFwX2VtdWxhdGVfbW9kaWZpZWQocG1hcF90IHBt YXAsIHZtX29mZnNldF90IHZhKTsKK2ludCBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOwogdm9pZCBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFn ZV90LCB2bV9tZW1hdHRyX3QpOwogCiAjZW5kaWYJCQkJLyogX0tFUk5FTCAqLwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCi0t LSBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFt LmgKQEAgLTE2MywxNyArMTYzLDM4IEBACiAKICNkZWZpbmUJTUFYRFVNUFBHUwkJMQkJLyogeHh4 OiB3aHkgaXMgdGhpcyBvbmx5IG9uZT8gKi8KIAorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisv KgorICogRm9yIGEgbGFyZ2Uga2VybmVsIHN0YWNrIHBhZ2UgdGhlIEtTVEFDS19TSVpFIG5lZWRz IHRvIGJlIGEgcGFnZSBzaXplCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIChlLmcuIDE2 SykuCisgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCSgxIDw8IDE0KQkvKiBTaW5nbGUgMTZLIHBh Z2UgKi8KKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlLU1RBQ0tfU0laRQorI2RlZmluZQlLU1RB Q0tfUEFHRV9NQVNLCShLU1RBQ0tfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VT CQkoS1NUQUNLX1NJWkUgLyBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19UTEJNQVNLX01BU0sJ KChLU1RBQ0tfUEFHRV9NQVNLID4+IChUTEJNQVNLX1NISUZUIC0gMSkpIFwKKwkJCQkJPDwgVExC TUFTS19TSElGVCkKKyNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCSgoS1NUQUNLX1BBR0VfU0la RSAqIDIpIC8gUEFHRV9TSVpFKQorCisjZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisK IC8qCiAgKiBUaGUga2VybmVsIHN0YWNrIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSAoUEFHRV9T SVpFICogMikgYm91bmRhcnkuCiAgKi8KICNkZWZpbmUJS1NUQUNLX1BBR0VTCQkyCS8qIGtlcm5l bCBzdGFjayAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKEtTVEFDS19QQUdFUyAqIFBBR0VfU0la RSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlQQUdFX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BB R0VfTUFTSwkoUEFHRV9TSVpFIC0gMSkKICNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCTIJLyog cGFnZXMgb2Yga3N0YWNrIGd1YXJkOyAwIGRpc2FibGVzICovCisjZW5kaWYgLyogISBLU1RBQ0tf TEFSR0VfUEFHRSAqLwogCiAvKgogICogTWFjaCBkZXJpdmVkIGNvbnZlcnNpb24gbWFjcm9zCiAg Ki8KICNkZWZpbmUJcm91bmRfcGFnZSh4KQkJKCgoeCkgKyBQQUdFX01BU0spICYgflBBR0VfTUFT SykKICNkZWZpbmUJdHJ1bmNfcGFnZSh4KQkJKCh4KSAmIH5QQUdFX01BU0spCisjZGVmaW5lCXJv dW5kXzJtcGFnZSh4KQkJKCgoeCkgKyBQRFJNQVNLKSAmIH5QRFJNQVNLKQorI2RlZmluZQl0cnVu Y18ybXBhZ2UoeCkJCSgoeCkgJiB+UERSTUFTSykKIAogI2RlZmluZQlhdG9wKHgpCQkJKCh4KSA+ PiBQQUdFX1NISUZUKQogI2RlZmluZQlwdG9hKHgpCQkJKCh4KSA8PCBQQUdFX1NISUZUKQpkaWZm IC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9ucy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0t LSBhL3N5cy9jb25mL29wdGlvbnMubWlwcworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAg LTk3LDExICs5NywyNCBAQAogQkVSSV9MQVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBV c2UgdGhlIG5ldyBwbWFwIGZvciBNSVBTNjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVt dWxhdGlvbgorIyBhbmQgc3VwZXJwYWdlIHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlv cHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcg RW1iZWRkZWQgQ1BVIEV0aGVybmV0IENvcmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRm cGdhLmgKIAogIworIyBPcHRpb25zIGZvciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVy IHN1cHBvcnQKKyMKKworIyBVc2Ugb25lIGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0 aGUga2VybmVsIHRocmVhZCBzdGFjaworS1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwu aAorCisjCiAjIE9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFs cwogIwogQVJHRV9ERUJVRwkJCW9wdF9hcmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVz Lm1pcHMgYi9zeXMvY29uZi9maWxlcy5taXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysr IGIvc3lzL2NvbmYvZmlsZXMubWlwcwpAQCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVz LmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1p cHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlzdGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5k YXJkCittaXBzL21pcHMvcG1hcC5jCQkJb3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9t aXBzL3BtYXBfbWlwczY0LmMJCQlvcHRpb25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9w dHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFyZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5k YXJkCiBtaXBzL21pcHMvc3RhY2tfbWFjaGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZm IC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1fbWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0t LSBhL2xpYi9saWJrdm0va3ZtX21pcHMuaAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAg LTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJTUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZm ZmYKIAogI2RlZmluZQlNSVBTMzJfUEZOX01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBT NjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMwCisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZG RkZDMAogI2RlZmluZQlNSVBTX1BGTl9TSElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9f UEEocGZuKQkoKChwZm4pID4+IE1JUFNfUEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo= --b1_8cfbda1353b73aeded57f1b1746022d2-- From owner-freebsd-mips@freebsd.org Fri Sep 16 19:53:19 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 20DA9BDD9AF for ; Fri, 16 Sep 2016 19:53:19 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 0D870F5 for ; Fri, 16 Sep 2016 19:53:18 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id C590BBD00; Fri, 16 Sep 2016 19:53:17 +0000 (UTC) Date: Fri, 16 Sep 2016 19:53:17 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <0f329be06464796422fbdb79db4d9952@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcTa0= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_0f329be06464796422fbdb79db4d9952" X-Mailman-Approved-At: Fri, 16 Sep 2016 20:20:21 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 19:53:19 -0000 --b1_0f329be06464796422fbdb79db4d9952 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkyLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgQ29weS9wYXN0ZSBhIGNvdXBsZSBvZiBxdWljayBmdW5jdGlvbnMgZnJv bSBwbWFwLmMgdG8gcG1hcF9taXBzNjQuYyAKICBhbmQgbm93IHRoZSBuZXcgb3B0aW9uIGNvbXBp bGVzIGFuZCBib290cyB1bmRlciBNQUxUQTY0CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMg cmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5m cmVlYnNkLm9yZy9EMjUzNT92cz0yMDM5MSZpZD0yMDM5MgoKUkVWSVNJT04gREVUQUlMCiAgaHR0 cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJr dm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2ZpbGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1p cHMKICBzeXMvbWlwcy9jb25mL01BTFRBNjQKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKICBz eXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBzeXMvbWlw cy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlwcy9taXBz L2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMvbWlwcy9t YWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9taXBzL21p cHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMvbWlwcy9z d3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5jCiAgc3lz L21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKICBz eXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3cy5mcmVl YnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVubywgc3Nv bgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxpc3QsIGRu ZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K --b1_0f329be06464796422fbdb79db4d9952 Content-Type: text/x-patch; charset=utf-8; name="D2535.20392.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20392.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5 IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0 ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7 CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT LCBQQUdFX1NJWkUsIDApKQpAQCAtNjgsNiArNzIsOCBAQAogCX0KIAogCXBhID0gVk1fUEFHRV9U T19QSFlTKG0pOworCWlmICgod2FpdCAmIE1fTk9EVU1QKSA9PSAwKQorCQlkdW1wX2FkZF9wYWdl KHBhKTsKIAl2YSA9ICh2b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVChwYSk7CiAJaWYgKCh3YWl0 ICYgTV9aRVJPKSAmJiAobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQogCQliemVybyh2YSwgUEFH RV9TSVpFKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdHJhcC5jIGIvc3lzL21pcHMvbWlw cy90cmFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90cmFwLmMKKysrIGIvc3lzL21pcHMvbWlwcy90 cmFwLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlIDxtYWNoaW5lL21pcHNfb3Bjb2RlLmg+ CiAjaW5jbHVkZSA8bWFjaGluZS9mcmFtZS5oPgogI2luY2x1ZGUgPG1hY2hpbmUvcmVnbnVtLmg+ CisjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rscy5oPgogCiAj aWZkZWYgRERCCkBAIC0yNjQsNyArMjY1LDcgQEAKIAkicmVzZXJ2ZWQgMjEiLAogCSJyZXNlcnZl ZCAyMiIsCiAJIndhdGNoIiwKLQkicmVzZXJ2ZWQgMjQiLAorCSJtYWNoaW5lIGNoZWNrIiwKIAki cmVzZXJ2ZWQgMjUiLAogCSJyZXNlcnZlZCAyNiIsCiAJInJlc2VydmVkIDI3IiwKQEAgLTYzMiw2 ICs2MzMsMzMgQEAKICNlbmRpZgogCQlwYW5pYygiTUNIRUNLXG4iKTsKIAkJYnJlYWs7CisJY2Fz ZSBUX01DSEVDSyArIFRfVVNFUjoKKwkJeworCQkJdWludDMyX3Qgc3RhdHVzID0gbWlwc19yZF9z dGF0dXMoKTsKKworCQkJaWYgKHN0YXR1cyAmIE1JUFNfU1JfVFMpIHsKKwkJCQkvKgorCQkJCSAq IE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGNhdXNlZCBieSBUTEIKKwkJCQkgKiBkZXRlY3Rpbmcg YSBtYXRjaCBmb3IgbXVsdGlwbGUgZW50cmllcy4KKwkJCQkgKgorCQkJCSAqIEF0dGVtcHQgdG8g cmVjb3ZlciBieSBmbHVzaGluZyB0aGUgdXNlciBUTEIKKwkJCQkgKiBhbmQgcmVzZXR0aW5nIHRo ZSBzdGF0dXMgYml0LgorCQkJCSAqLworCQkJCXByaW50ZigiTWFjaGluZSBDaGVjayBpbiBVc2Vy IC0gRHVwIFRMQiBlbnRyeS4gIgorCQkJCSAgICAiUmVjb3ZlcmluZy4uLlxuIik7CisJCQkJcG1h cCA9ICZwLT5wX3Ztc3BhY2UtPnZtX3BtYXA7CisJCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIo cG1hcCk7CisJCQkJbWlwc193cl9zdGF0dXMoc3RhdHVzICYgfk1JUFNfU1JfVFMpOworCisJCQkJ cmV0dXJuICh0cmFwZnJhbWUtPnBjKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgRERCCisJCQkJa2Ri X3RyYXAodHlwZSwgMCwgdHJhcGZyYW1lKTsKKyNlbmRpZgorCQkJCXBhbmljKCJNQ0hFQ0tcbiIp OworCQkJfQorCQl9CisJCWJyZWFrOwogCWNhc2UgVF9UTEJfTU9EOgogCQkvKiBjaGVjayBmb3Ig a2VybmVsIGFkZHJlc3MgKi8KIAkJaWYgKEtFUk5MQU5EKHRyYXBmcmFtZS0+YmFkdmFkZHIpKSB7 CkBAIC02OTQsMTAgKzcyMiwyMyBAQAogCiAJY2FzZSBUX1RMQl9MRF9NSVNTICsgVF9VU0VSOgog CQlmdHlwZSA9IFZNX1BST1RfUkVBRDsKLQkJZ290byBkb2ZhdWx0OworCQlnb3RvIGNoZWNrcmVm Yml0OwogCiAJY2FzZSBUX1RMQl9TVF9NSVNTICsgVF9VU0VSOgogCQlmdHlwZSA9IFZNX1BST1Rf V1JJVEU7CisKK2NoZWNrcmVmYml0OgorCQkvKgorCQkgKiBXYXMgdGhpcyB0cmFwIGNhdXNlZCBi eSB0aGUgUFRFX1ZSIGJpdCBub3QgYmVpbmcgc2V0PworCQkgKi8KKwkJaWYgKHBtYXBfZW11bGF0 ZV9yZWZlcmVuY2VkKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsCisJCSAgICB0cmFwZnJhbWUtPmJh ZHZhZGRyKSA9PSAwKSB7CisJCQlpZiAoIXVzZXJtb2RlKSB7CisJCQkJcmV0dXJuICh0cmFwZnJh bWUtPnBjKTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKIGRvZmF1bHQ6CiAJCXsKIAkJCXZt X29mZnNldF90IHZhOwpAQCAtMTQxMSw5ICsxNDUyLDE2IEBACiAJc3RydWN0IHByb2MgKnAgPSBj dXJwcm9jOwogCiAJcGRlcCA9ICgmKHAtPnBfdm1zcGFjZS0+dm1fcG1hcC5wbV9zZWd0YWJbKHZh ID4+IFNFR1NISUZUKSAmIChOUERFUEcgLSAxKV0pKTsKLQlpZiAoKnBkZXApCi0JCXB0ZXAgPSBw bWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7Ci0JZWxzZQorCWlmICgqcGRlcCkg eworI2lmIFZNX05SRVNFUlZMRVZFTCA+IDAKKwkJcGRfZW50cnlfdCAqcGRlID0gJnBkZXBbKHZh ID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKV07CisKKwkJaWYgKHBkZV9pc19zdXBlcnBhZ2Uo cGRlKSkKKwkJCXB0ZXAgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorI2VuZGlmIC8qIFZN X05SRVNFUlZMRVZFTCA+IDAgKi8KKwkJCXB0ZXAgPSBwbWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52 bV9wbWFwLCB2YSk7CisJfSBlbHNlCiAJCXB0ZXAgPSAocHRfZW50cnlfdCAqKTA7CiAKIAkqcGRl cHAgPSBwZGVwOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90bGIuYyBiL3N5cy9taXBzL21p cHMvdGxiLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90bGIuYworKysgYi9zeXMvbWlwcy9taXBzL3Rs Yi5jCkBAIC00MCwxMCArNDAsMTQgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3B0ZS5oPgogI2luY2x1 ZGUgPG1hY2hpbmUvdGxiLmg+CiAKKyNpbmNsdWRlICJvcHRfdm0uaCIKKwogI2lmIGRlZmluZWQo Q1BVX0NOTUlQUykKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJMTI4CiAjZWxpZiBkZWZp bmVkKENQVV9OTE0pCiAjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCSgyMDQ4ICsgMTI4KQor I2VsaWYgZGVmaW5lZChDUFVfQ0hFUkkpCisjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTE0 NAogI2Vsc2UKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJNjQKICNlbmRpZgpAQCAtMTAy LDIwICsxMDYsMzEgQEAKIHsKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOworCXVp bnQzMl90IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKIAotCXZhICY9IH5Q QUdFX01BU0s7CisJS0FTU0VSVCgoVExCTE9fUFRFX1RPX0lEWChwdGUwKSA9PSBUTEJMT19QVEVf VE9fSURYKHB0ZTEpKSwKKwkgICAgKCIlczogcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0 IG1hdGNoIiwgX19mdW5jX18pKTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6 ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZTApOworCW1hc2sgPSAodW5z aWduZWQgbG9uZylwYWdlbWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBi aXRzICovCisJc2l6ZSA9IG1hc2sgKyAxOworCisJdmEgJj0gfm1hc2s7CiAKIAlzID0gaW50cl9k aXNhYmxlKCk7CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwog CiAJbWlwc193cl9pbmRleChpKTsKLQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFn ZW1hc2socGFnZW1hc2spOwogCW1pcHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgMCkpOwog CW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CiAJbWlwc193cl9lbnRyeWxvMShwdGUxKTsKIAl0bGJf d3JpdGVfaW5kZXhlZCgpOwogCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOworCW1pcHNfd3JfcGFn ZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCkBAIC0xMzcsNyArMTUyLDYgQEAKIAlp ID0gbWlwc19yZF9pbmRleCgpOwogCWlmIChpID49IDApCiAJCXRsYl9pbnZhbGlkYXRlX29uZShp KTsKLQogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CkBAIC0y OTgsMjkgKzMxMiw1MyBAQAogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90IHM7CiAJaW50 IGk7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOworCXB0 X2VudHJ5X3QgcHRlMCwgcHRlMTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6 ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZSk7CisJbWFzayA9ICh1bnNp Z25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxvd2VyIDEyIGJp dHMgKi8KKwlzaXplID0gbWFzayArIDE7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCXZhICY9IH5t YXNrOwogCXB0ZSAmPSB+VExCTE9fU1dCSVRTX01BU0s7CiAKIAlzID0gaW50cl9kaXNhYmxlKCk7 CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwogCi0JbWlwc193 cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNrKTsKIAltaXBzX3dyX2Vu dHJ5aGkoVExCSElfRU5UUlkodmEsIHBtYXBfYXNpZChwbWFwKSkpOwogCXRsYl9wcm9iZSgpOwog CWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkgewogCQl0bGJfcmVhZCgpOworCQlw dGUwID0gbWlwc19yZF9lbnRyeWxvMCgpOworCQlwdGUxID0gbWlwc19yZF9lbnRyeWxvMSgpOwor CQlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUw KSAmJgorCQkgICAgVExCTE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRl MSkpLAorCQkJKCIlczogcHRlLCBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6ZXMgZG9uJ3QgbWF0Y2gi LCBfX2Z1bmNfXykpOwogCi0JCWlmICgodmEgJiBQQUdFX1NJWkUpID09IDApIHsKKwkJaWYgKCh2 YSAmIHNpemUpID09IDApIHsKIAkJCW1pcHNfd3JfZW50cnlsbzAocHRlKTsKKwkJCWlmIChwYWdl bWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBlcnBhZ2UgKi8KKwkJCQlwdGUxID0gKHB0 ZTEgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYgKFBURV9WUiB8IFBURV9EKSk7CisJCQkJ bWlwc193cl9lbnRyeWxvMShwdGUxKTsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCW1pcHNfd3JfZW50 cnlsbzEocHRlKTsKKwkJCWlmIChwYWdlbWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBl cnBhZ2UgKi8KKwkJCQlwdGUwID0gKHB0ZTAgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYg KFBURV9WUiB8IFBURV9EKSk7CisJCQkJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKKwkJCX0KIAkJ fQogCQl0bGJfd3JpdGVfaW5kZXhlZCgpOwogCX0KIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsK KwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWludHJfcmVzdG9yZShzKTsKIH0KIApkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCi0tLSBhL3N5 cy9taXBzL21pcHMvc3d0Y2guUworKysgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMKQEAgLTMxNSwz NiArMzE1LDkxIEBACiAgKiBOT1RFOiBUaGlzIGlzIGhhcmQgY29kZWQgdG8gVVBBR0VTID09IDIu CiAgKiBBbHNvLCB0aGVyZSBzaG91bGQgYmUgbm8gVExCIGZhdWx0cyBhdCB0aGlzIHBvaW50Lgog ICovCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlNVEMwCQl2MCwg TUlQU19DT1BfMF9UTEJfSEkJIyBWUE4gPSB2YQogCUhBWkFSRF9ERUxBWQogCXRsYnAJCQkJCSMg cHJvYmUgVlBOCiAJSEFaQVJEX0RFTEFZCi0JbWZjMAlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgK KwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgKIAlIQVpBUkRfREVMQVkKIAotCVBUUl9M SQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQotCWJsdHoJczAs IGVudHJ5MHNldAorCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQQUdFX1NJWkUp IC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBp bnZhbGlkYXRlIHRsYiBlbnRyeQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJYmx0egkJczAs IGludmFsX254dDEKKyNlbHNlCisJYmx0egkJczAsIGVudHJ5MHNldAorI2VuZGlmCiAJbm9wCi0J c2xsCXMwLCBQQUdFX1NISUZUICsgMQotCWFkZHUJdDEsIHMwCi0JTVRDMAl0MSwgTUlQU19DT1Bf MF9UTEJfSEkKKwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1U QzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9ISQogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC X0xPMAogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1J UFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpBUkRfREVMQVkKIAl0bGJ3aQogCUhBWkFSRF9ERUxB WQotCU1UQzAJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKworI2lmZGVm IEtTVEFDS19MQVJHRV9QQUdFCisvKgorICogV2l0aCBhIEtTVEFDS19QQUdFX1NJWkUgb2YgMTZL IGFuZCBQQUdFX1NJWkUgb2YgNEsgaXQgaXMgcG9zc2libGUgdGhhdAorICogYSBzZWNvbmQgVExC IGVudHJ5IGlzIGN1cnJlbnRseSBtYXBwaW5nIHRoZSBrZXJuZWwgdGhyZWFkIHN0YWNrIGFzIGEK KyAqIHJlZ3VsYXIgNEsgc2l6ZWQgcGFnZShzKS4gQ2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQsIGlm IHNvLCBpbnZhbGlkYXRlCisgKiB0aGF0IFRMQiBlbnRyeSBhcyB3ZWxsLgorICovCisjaWYgKFBB R0VfU0laRSAhPSA0MDk2KSAmJiAoS1NUQUNLX1BBR0VfU0laRSAhPSAxNjM4NCkKKyNlcnJvciBQ QUdFX1NJWkUgaXMgbm90IDRLIG9yIEtTVEFDS19QQUdFX1NJWkUgaXMgbm90IDE2Sy4KKyNlbmRp ZgoraW52YWxfbnh0MToKKwltb3ZlCQl2MSwgdjAKKwlQVFJfQUREVQl2MSwgUEFHRV9TSVpFICog MgorCU1UQzAJCXYxLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCUhBWkFSRF9ERUxB WQorCXRsYnAJCQkJCQkjIHByb2JlIFZQTgorCUhBWkFSRF9ERUxBWQorCW1mYzAJCXMwLCBNSVBT X0NPUF8wX1RMQl9JTkRFWAorCUhBWkFSRF9ERUxBWQorCisJIyBNSVBTX0tTRUcwX1NUQVJUICsg KDIgKiBpbmRleCAqIFBBR0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQx LCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisJYmx0egkJczAsIGVu dHJ5MHNldAorCW5vcAorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEsIHMw CisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJUFRFX01UQzAJemVybywgTUlQU19DT1Bf MF9UTEJfTE8wCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJemVy bywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhBWkFSRF9ERUxBWQorCXRsYndpCisJSEFaQVJE X0RFTEFZCisjZW5kaWYJLyogS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogZW50cnkwc2V0OgorCU1U QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisJSEFaQVJEX0RFTEFZ CiAvKiBTTVAhISAtIFdvcmtzIG9ubHkgZm9yICB1bnNoYXJlZCBUTEIgY2FzZSAtIGkuZS4gbm8g di1jcHVzICovCi0JbXRjMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkJIyBUTEIgZW50cnkg IzAKKwltdGMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkjIFRMQiBlbnRyeSAjMAogCUhB WkFSRF9ERUxBWQogCVBURV9NVEMwCWExLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgdXB0ZVswXQog CUhBWkFSRF9ERUxBWQogCVBURV9NVEMwCWEyLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgdXB0ZVsx XQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJSEFaQVJEX0RFTEFZCisJbGkJCXQxLCBLU1RB Q0tfVExCTUFTS19NQVNLCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpB UkRfREVMQVkKKyNlbHNlCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhB WkFSRF9ERUxBWQorI2VuZGlmCiAJdGxid2kJCQkJCSMgc2V0IFRMQiBlbnRyeSAjMAogCUhBWkFS RF9ERUxBWQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NP UF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIC8qCiAgKiBOb3cgcnVubmlu ZyBvbiBuZXcgdSBzdHJ1Y3QuCiAgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcF9t aXBzNjQuYyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpAQCAtMCww ICsxLDU1NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5p dmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly aWdodCAoYykgMTk5NCBKb2huIFMuIER5c29uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog Q29weXJpZ2h0IChjKSAxOTk0IERhdmlkIEdyZWVubWFuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICogQ29weXJpZ2h0IChjKSAyMDAzIFBldGVyIFdlbW0KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBbGFuIEwuIENveCA8YWxjQGNzLnJpY2Uu ZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBTdGFj ZXkgRC4gU29uIDxzc29uQC4uLj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBi eQorICogdGhlIFN5c3RlbXMgUHJvZ3JhbW1pbmcgR3JvdXAgb2YgdGhlIFVuaXZlcnNpdHkgb2Yg VXRhaCBDb21wdXRlcgorICogU2NpZW5jZSBEZXBhcnRtZW50IGFuZCBXaWxsaWFtIEpvbGl0eiBv ZiBVVU5FVCBUZWNobm9sb2dpZXMgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0 aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0 aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFt ZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAq ICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy b20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5U UyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhF IFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElO RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwK KyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP RiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFO RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU CisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT RSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4K KyAqCisgKglmcm9tOglAKCMpcG1hcC5jCTcuNyAoQmVya2VsZXkpCTUvMTIvOTEKKyAqCWZyb206 IHNyYy9zeXMvaTM4Ni9pMzg2L3BtYXAuYyx2IDEuMjUwLjIuOCAyMDAwLzExLzIxIDAwOjA5OjE0 IHBzCisgKglKTlBSOiBwbWFwLmMsdiAxLjExLjIuMSAyMDA3LzA4LzE2IDExOjUxOjA2IGdpcmlz aAorICovCisKKy8qCisgKglNYW5hZ2VzIHBoeXNpY2FsIGFkZHJlc3MgbWFwcy4KKyAqCisgKglT aW5jZSB0aGUgaW5mb3JtYXRpb24gbWFuYWdlZCBieSB0aGlzIG1vZHVsZSBpcworICoJYWxzbyBz dG9yZWQgYnkgdGhlIGxvZ2ljYWwgYWRkcmVzcyBtYXBwaW5nIG1vZHVsZSwKKyAqCXRoaXMgbW9k dWxlIG1heSB0aHJvdyBhd2F5IHZhbGlkIHZpcnR1YWwtdG8tcGh5c2ljYWwKKyAqCW1hcHBpbmdz IGF0IGFsbW9zdCBhbnkgdGltZS4gIEhvd2V2ZXIsIGludmFsaWRhdGlvbnMKKyAqCW9mIHZpcnR1 YWwtdG8tcGh5c2ljYWwgbWFwcGluZ3MgbXVzdCBiZSBkb25lIGFzCisgKglyZXF1ZXN0ZWQuCisg KgorICoJSW4gb3JkZXIgdG8gY29wZSB3aXRoIGhhcmR3YXJlIGFyY2hpdGVjdHVyZXMgd2hpY2gK KyAqCW1ha2UgdmlydHVhbC10by1waHlzaWNhbCBtYXAgaW52YWxpZGF0ZXMgZXhwZW5zaXZlLAor ICoJdGhpcyBtb2R1bGUgbWF5IGRlbGF5IGludmFsaWRhdGUgb3IgcmVkdWNlZCBwcm90ZWN0aW9u CisgKglvcGVyYXRpb25zIHVudGlsIHN1Y2ggdGltZSBhcyB0aGV5IGFyZSBhY3R1YWxseQorICoJ bmVjZXNzYXJ5LiAgVGhpcyBtb2R1bGUgaXMgZ2l2ZW4gZnVsbCBpbmZvcm1hdGlvbiBhcworICoJ dG8gd2hpY2ggcHJvY2Vzc29ycyBhcmUgY3VycmVudGx5IHVzaW5nIHdoaWNoIG1hcHMsCisgKglh bmQgdG8gd2hlbiBwaHlzaWNhbCBtYXBzIG11c3QgYmUgbWFkZSBjb3JyZWN0LgorICovCisKKyNp bmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2luY2x1ZGUg Im9wdF9kZGIuaCIKKyNpbmNsdWRlICJvcHRfcG1hcC5oIgorI2luY2x1ZGUgIm9wdF92bS5oIgor CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVk ZSA8c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21tYW4u aD4KKyNpbmNsdWRlIDxzeXMvbXNnYnVmLmg+CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5j bHVkZSA8c3lzL3BjcHUuaD4KKyNpbmNsdWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9y d2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K KyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5o PgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMv c3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1 ZGUgPGRkYi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2 bS92bV9wYXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9w YWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+ CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgor I2luY2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNs dWRlIDx2bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1h Y2hpbmUvY2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvdGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9T VElDKQorI2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9J TkxJTkUKKyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNk ZWZpbmUgUFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZf U1RBVCh4KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJ KChwYSkgPj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9p bmRleChwYSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBI WVNfVE9fUFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkg JSBOUFZfTElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlT KGxvY2twLCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlc CisJc3RydWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0g UEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkg ewkJCVwKKwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3Ap OwkJXAorCQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJ CVwKKwl9CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NL X1RPX1ZNX1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv Y2twLCBWTV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0so bG9ja3ApCQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJ CQkJCQlcCisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2Nr cCk7CQkJXAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQor CisjZGVmaW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNU X0xPQ0soVk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9y IHVzZXIva2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2 KQkoKCh2KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2lu ZGV4KHYpCSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9w dGVfaW5kZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5l CXBtYXBfcGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJ KE5QREVQRyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykK KworI2RlZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1 Y3QgcG1hcCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisK K3ZtX29mZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFm dGVyIGtlcm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFz dCBhdmFpbCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1 bnNpZ25lZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0 ZW0gKi8KKworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdf UkQsIDAsICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9 IDA7CitTWVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxB R19SRFRVTiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBs YXJnZSBwYWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VS VkVECTAKKwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVT UzsKKworc3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGlj IHN0cnVjdCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBm b3IgdGhlIHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9I RUFEKHBjaCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZf Y2h1bmtzKTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1 Y3Qgcndsb2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBt ZF9wYWdlICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZf Y2h1bmsgKnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2Vu dHJ5X3QgcHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBz dHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5r KHBtYXBfdCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lk IHBtYXBfcHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhKTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFn ZSAqcHZoLCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFn ZV90IHBtYXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsK K3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZt X29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90 IG1wdGUsICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9l bnRyaWVzKHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2Nr cCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50 cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3Rl X3BkZV9sb2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRf dCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxv Y3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxv Y2twKTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29m ZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9j ayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2tw KTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor c3RhdGljIHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg dmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2 b2lkIHBtYXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRl KTsKK3N0YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwg dm1fcGFnZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9w dF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3By b21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShw bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0 IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBf cmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRf dCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVj dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBw bWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7Citz dGF0aWMgYm9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz dGF0aWMgdm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg cHRfZW50cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3Qg cG1hcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsK Kworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf dCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1h cF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCBy d2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZz ZXRfdCwgcGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBp bml0X3B0ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJv dCk7CisKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcp Oworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOwor c3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAq IFBhZ2UgdGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNl Z21lbnQgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg X19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEp XSk7Cit9CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdt ZW50IHRhYmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5 X3QgKgorcG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkK K3sKKwlwZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJl dHVybiAoJnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBk aXJlY3RvcnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0 aWMgX19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFw LCB2YSk7CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4g KHBtYXBfcGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJs ZSBlbnRyeSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitz dGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRf ZW50cnlfdCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQor CisvKiBSZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh ZGRyZXNzLiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEp OworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJ aWYgKHBkZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRl KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitz dGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAs IGludCBjb3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBt YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxp bmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkK K3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+ cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVu dCBjb3VudCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVz aWRlbnRfY291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0g Y291bnQ7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhl IHZpcnR1YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZz ZXRfdAorcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBi YW5rX3NpemUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6 ZSk7CisJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUg KHNpemUgPiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFp bFtpICsgMl07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJd OworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlz X2F2YWlsW2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZh aWxbMF0pCisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJ YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBw aHlzX2F2YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19U T19ESVJFQ1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsK K30KKworLyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0 dWFsIG1lbW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBo YXMgYmVlbiBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5l bF9wYWdldGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJ cHRfZW50cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7 CisJaW50IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3Ig dGhlIGtlcm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3Rl YWxfbWVtb3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBw YWdlIHRhYmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5Q REVQRyk7CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJ bmtwdCA9IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtw dCk7CisKKwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhl IEdsb2JhbCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3Ig ZWFjaCAyIHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhl IEdsb2JhbCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRz IGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3Rv cmUKKwkgKiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90 ICopcHRhZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRF X0c7CisKKwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5l bF9zZWdtYXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBk ZSA9IChwZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwg TlBERVBHICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCko cHRhZGRyICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQ TUFQX0xPQ0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtl cm5lbF9zZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxR X0lOSVQoJmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFsw XS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdl biA9IDA7CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQor Cit2b2lkCitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8K K2FnYWluOgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgewor CQkvKgorCQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkg Ki8KKwkJcGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNf YXZhaWxbaSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkg PCAyKQorCQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxb aV0pIHsKKwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFp bFtpICsgMF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2 YWlsW2kgKyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBw aHlzX2F2YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJ CXBoeXNfYXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQor CisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0 ZWFsaW5nIG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSAr IDFdICE9IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOwor CQlwaHlzbWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVt ID0gYXRvcChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJp bnRmKCJQaHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19h dmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNp emUgPSBwaHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhq eCAtICUjMDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3Qp IHBoeXNfYXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAx LAorCQkJICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUp OworCQl9CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1h eG1lbSkpOworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBi ZWdpbm5pbmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBt YXBfc3RlYWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVm c2l6ZSk7CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxp Z25lZCB0bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBh IHNpbmdsZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1v cnkoKEtTVEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJ RlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIp KTsKKworCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9l bmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFs IHNvbWUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLwor CXZpcnR1YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsK KwlwY3B1cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCAr PSBQQUdFX1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50 cnkgbWFwcGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBV cCB1bnRpbCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVw JyBmb3IgdGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcw IHNvIHRoZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNw dV90bGJfaW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYo InBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNl bmRpZgorCisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQg PSBWTU5VTV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDAp OworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLwor CXJ3X2luaXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisg KiBJbml0aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwor dm9pZAorcG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5t ZC5wdl9saXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQor CisvKgorICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5p dCwgdG8gaW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0g bmVlZHMgdG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkK K3sKKwlpbnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0 aWFsaXplIHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVu a3NfbXV0ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJ ICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9 IDA7IGkgPCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ld LCAicHYgbGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhl YWQgdGFibGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp ICsgMV07IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAy KSArIDFdKSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBo ZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcg KiBzaXplb2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJs ZSA9IChzdHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAg TV9XQUlUT0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJ TFFfSU5JVCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShf dm1fcG1hcCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFw cGluZyBjb3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZ U0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQs CisgICAgJnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitz dGF0aWMgdV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3Bk ZSwgT0lEX0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5n cywgMCwgIjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9m YWlsdXJlczsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVz LCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJv bW90aW9uIGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsK K1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFH X1JELAorICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIp OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKiBMb3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBf X2lubGluZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQg KCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNw dXNldF90IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFw KHBtYXApKSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3Rv IG91dDsKKwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQ VV9GT1JFQUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUp KQorCQkJcG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQo Y3B1aWQpOworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgor CSAqIFRha2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBh cmUgaWdub3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNz IG9uIGluYWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsK KwlzZWxmID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQs ICZhY3RpdmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1 IGlzIHRoZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykp IHsKKwkJaWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJ Q1BVX1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3Rp dmVfY3B1cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7 Cit9CisjZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29u X2FjdGl2ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykK K3sKKwlpbnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJn KTsKKwkJcmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9J U1NFVChjcHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdl biA9IDA7CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMg dm9pZAorcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9v bl9hY3RpdmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0 ZV9hbGxfdXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3Bt YXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52 YWxpZGF0ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+ cG1hcCwgcC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1h cF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFn ZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2Fs bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcp OworfQorCitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7 CisJdm1fb2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lk CitwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h cF9pbnZhbGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3Jhbmdl KHAtPnBtYXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxp ZGF0ZV9yYW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEp Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAg PSBwbWFwOworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25f YWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9 CisKK3N0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zm c2V0X3QgdmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRh dGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2Fy ZyAqcCA9IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisK K3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSwgcHRfZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsK KworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBt YXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFy Zyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVf aXNfMW1fc3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNp ZmljIDJtYiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2 YSAmIH5QRFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2Ug aWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBm bHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRo ZXJlIGFyZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52 YWxpZGF0ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246 IGZsdXNoIGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRp bmcgYW55IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVf YWxsKCk7CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBt YXA7CisJdm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3 cGRlOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0 KQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3Vw ZGF0ZV9wZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30K Kworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50 cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3Bk ZSk7Cit9CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVk IHZpcnR1YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxp dHkgb2YgdGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNh bWUgdmlydHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0 aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRf ZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVf cGRlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBk ZSA9IHBkZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3Jl KHBtYXAsIHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1h cF91cGRhdGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91 dGluZToJcG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNh bCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFs X2FkZHJlc3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRl OworCXZtX29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgewor CQlwYSA9IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7 CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0g VExCTE9fUFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxP Q0socG1hcCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJh Y3RfYW5kX2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9s ZCB0aGUgcGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwg YWRkcmVzcyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3Rl Y3Rpb24uCisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsK KwlwdF9lbnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3Bh Z2VfdCBtOworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBN QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYg KHBkZXAgIT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJw YWdlKHBkZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAo cHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9f UEEoKnBkZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFf dHJ5cmVsb2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0g UEhZU19UT19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9 IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRl cCAhPSBOVUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRl KSAmJgorCQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3Qg JiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKKwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJ ICAgICZwYSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0 ZV9wYSk7CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFf VU5MT0NLX0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisK Ky8qLQorICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFj dCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJl c3MuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJ aW50IG1hcHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMu CisJICovCisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNf RU5EKQorCQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBN SVBTX0tTRUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19L U0VHMF9UT19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8 IE1JUFNfS1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJ LyoKKwkgKiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVT RVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOwor CisJCWlmIChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBf cGRlKCZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5V TEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9z dXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJl dHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsK KwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXAp IHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQ QUdFX01BU0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNo b3VsZCBiZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBl ZCA9ICh2YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1h cHBlZCA9IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtT RUdfRU5EKTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkg eworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRo ZSBrZXJuZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9w bWFwLT5wbV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNz IHJhbmdlICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChw ZGVwID09IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBk ZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVw OworCQkJCXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBE Uk1BU0spKTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJ aWYgKHB0ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAg ICAodmEgJiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBh bmljKCIlcyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAq KXZhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQg YSB3aXJlZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9v ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRl OworCXB0X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYo InBtYXBfa2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilw YSk7CisjZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9 ICpwdGU7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf UkVGIHwgUFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0 ZV9pc192YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtl cm5lbF9wbWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90 IHZhLCB2bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwK KwkJKCJwbWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9s b25nKXBhKSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQor CisvKi0KKyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLwor IC8qIFBNQVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sK KwlwdF9lbnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9t IHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl X2luZGV4KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZh KTsKKwlwdGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVs X3BtYXAsIHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwg YWRkcmVzc2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJ VGhlIHZhbHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVz cyBmb3IKKyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEg ZGlyZWN0LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0 aGUgYXBwcm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcq dmlydCcgdW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBw YWdlcyBzdGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUg Zmlyc3QgdXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAq CVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29m ZnNldF90ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3Qp Cit7CisKKwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisg KiBBZGQgYSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBp cyBvbmx5IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90 IG5lZWQgdG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRl ZC4KKyAqIE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVy LiAgVGhlIHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9v ZmZzZXRfdCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zm c2V0X3Qgb3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlw bWFwX2ZsdXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BI WVMobVtpXSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZf cmFuZ2VfaW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMg cm91dGluZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMg bWVhbnQgb25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1v dmUodm1fb2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1f b2Zmc2V0X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNh Y2hlX3diaW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0g dmE7CisJZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3Rv cmUocHRlLCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4g MCk7CisJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogUGFnZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGlu ZSB2b2lkCitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2 bV9wYWdlX3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7 CisJCVNMSVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUg dGhlIHBhZ2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJ fQorfQorCisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUg cGFnZSB0byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBz cGVjaWZpZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBw aHlzaWNhbCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisg Ki8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9w YWdlX3QgbSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJP KQoreworCisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UK KwkJbS0+ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxp bmtzLnMuc3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUg cGFnZSBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFn ZSB0YWJsZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNw b25zaWJsZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJl c3Nlcy4gIFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1 YWwgYWRkcmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRf cHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNT RVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1f cm9vdCwgbXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1h cHBpbmcgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQg cG1hcCdzIGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxM IGlmIHRoZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUg c3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2Vf dAorcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisK KwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xv b2t1cCgmcG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICog UmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQg cG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVj aWZpZWQgcGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3Mg Y29sbGVjdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3Bh Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChw bWFwLCBNQV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5w aW5kZXgpOworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUg Y291bnQsIHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBh Z2UgdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICog ZHJvcHMgdG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0 dXJucyBUUlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFM U0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vu d2lyZV9wdHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0 IHNwZ2xpc3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291 bnQgPT0gMCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0 dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lk CitfcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90 IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2 bV9wYWdlX3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8q CisJICogdW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBO VVBERSkgeworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFw X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBk ZWNyZW1lbnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChw ZF9lbnRyeV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1f UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwg dmEsIHBkcGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZh KTsKKwkJKnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0K KworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBp dC4KKwkgKiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9y ZSB1bm1hcHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1l ZCBiZWZvcmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1 YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdl IG9uIGEgbGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNo b290ZG93biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZy ZWUsIFRSVUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5 LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdl LCBhbmQgbWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFw X3VudXNlX3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUs CisgICAgc3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAo dmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRl ICE9IDAsICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9f Vk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndp cmVfcHRwKHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBt YXBfdCBwbWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+ cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsK Kwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lk ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQor CVBDUFVfU0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmsp OworCWJ6ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwor c3RhdGljIHZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZShpbnQgcmVxKQoreworCisJ aWYgKCF2bV9wYWdlX3JlY2xhaW1fY29udGlnKHJlcSwgMSwgMCwgTUlQU19YS1BIWVNfTEFSR0VT VF9QSFlTLAorCSAgICBQQUdFX1NJWkUsIDApKQorCQlWTV9XQUlUOworfQorCitzdGF0aWMgdm1f cGFnZV90CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJl cSkKK3sKKwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZS RUVMSVNUX0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJP KTsKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAm IFBHX1pFUk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5k ZXg7CisJcmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVk IGFuZCB6ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ug c3RydWN0dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zm c2V0X3QgcHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpLCByZXFfY2xhc3M7CisKKwkv KgorCSAqIGFsbG9jYXRlIHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJICovCisJcmVxX2NsYXNz ID0gVk1fQUxMT0NfTk9STUFMOworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9jX2RpcmVjdF9w YWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIHJlcV9jbGFzcykpID09IE5V TEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKHJlcV9jbGFzcyk7CisJ fQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhwdGRwZykp OworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pFUk8oJnBt YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp XS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwliemVybygm cG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4gKDEpOwor fQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBwYWdlIHRh YmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19wbWFwX2Fs bG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xvY2sgKips b2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xP Q0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJyaWNhdGUg YSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9jKE5VTEws IHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9B TExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2NrcCAhPSBO VUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VOTE9DSyhw bWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlUOworCQkJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCX0KKwor CQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGluZywgdGhl IHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJICovCisJ CXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlw bWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFnZSBpbnRv IHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFkeSB0aGVy ZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht KSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3RhYltwdGVw aW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJcGRfZW50 cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElG VCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEp OworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2VnaW5kZXhd OworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBw ZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5k ZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQsIHJlbGVh c2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3VidHJhY3Rf aW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVybyhtKTsK KwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJlZmVyZW5j ZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1Rf VE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBOZXh0IGxl dmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtwZGVpbmRl eF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMo cG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFwX2Fs bG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2tw KQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9wYWdlX3Qg bTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICovCisJcHRl cGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0IHRoZSBw YWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEpOworCisJ LyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8gYQorCSAq IG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkpKSB7CisJ CSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkpIHsKKwkJ CSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBtYXkgaGF2 ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIFBEIHBh Z2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICogSWYgdGhl IHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBob2xkCisJ ICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAmJiAqcGQg IT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHB0 X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkvKgorCQkg KiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBiZWVuCisJ CSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBp bmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJCQlnb3Rv IHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVhbGxvY2F0 aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGUg Z2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxpemVkIGJ5 IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQg aWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9y ZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBw dGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0gMCwKKwkg ICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAorCSAgICBw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGFu eSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUgYXNpZC4K KwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1fb2Zmc2V0 X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNU X1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWljX3N1YnRy YWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3plcm8ocHRk cGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0YWJsZSBl bnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29mZnNldF90 IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZTsKKwlw dF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFwLT5zeXN0 ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsKKwlpZiAo YWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5lbF9tYXAt Pm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBkcGUgPSBw bWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRwZSA9PSAw KSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJCW5rcGcg PSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJCQkgICAg Vk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQkJaWYg KG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtlcm5lbCIs IF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVCgK KwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRyeSBhZ2Fp biAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3ZtX2VuZCk7 CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCAr IE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9t YXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29m ZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICog VGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlua3BnID0g dm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkgICAgVk1f QUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlpZiAoIW5r cGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwi KTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChW TV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVz IG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5zbGF0aW9u IGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVzIGludmFs aWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkgKiBFbnRy eSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwKKwkJ ICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICovCisJCXB0 ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQor CQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsg TkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFw LT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNl dDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuCisg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitD VEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RBU1NFUlQo X05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9faW5saW5l IHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQoreworCisJcmV0 dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJfdClQQUdF X01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYpLT5wY19w bWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBD X0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAwMDAwZmZm ZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01dID0geyBQ Q19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUworc3RhdGlj IGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVlcywgcGNf Y2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5r X2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVt YmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8s IHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwKKyAgICAi Q3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lTQ1RMX0lO VChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAmcGNfY2h1 bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyBmcmVl cyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZhaWwsIENU TEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGltZXMgdHJp ZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9uZyBwdl9l bnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRpYyBpbnQg cHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50 cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3VycmVudCBu dW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVU TywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAwLAorICAg ICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05HKF92bV9w bWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9jb3Vu dCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RMX0lOVChf dm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZfZW50cnlf c3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMiKTsKKyNl bmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRpdGlvbi4g IFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMgc28gd2Ug Y2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJldHVybnMg TlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmllZCBwbWFw LgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNlIHN1YnNl cXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMgdW50aWwg cmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNob3J0YWdl IG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFpbV9wdl9j aHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1 Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlfdCAqcGRl OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2VudHJ5X3Qg cHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0IHNwZ2xp c3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQsIGlkeDsK KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B U1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5VTEwsICgi cmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsKKwltX3Bj ID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CisJ bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJUlNUKCZw dl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlMUV9SRU1P VkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRl eCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBOVUxMKSB7 CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBsb2NrZWRf cG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMtPnBjX3Bt YXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJCQlpZiAo cG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3ApOwor CQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCAm JiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJTFFfSU5T RVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZfY2h1bmtz X211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERlc3Ryb3kg ZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJCSAqLwor CQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7 CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tbZmllbGRd OworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJCQliaXQg PSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2UpICogTkJC WSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0gcHYtPnB2 X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBkZSAhPSBO VUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsKKwkJCQlp ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGUgPSBw bWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlpZiAocHRl X3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNfa2VybmVs X3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpwdGUgPSAw OworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52YWxpZGF0 ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BURV9UT19Q QShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCQl2bV9w YWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2bV9wYWdl X2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYgKFRBSUxR X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJ T1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAgcGFfdG9f cHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9s aXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBHQV9XUklU RUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBi aXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJCWZyZWVk Kys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VSVF9UQUlM KCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK KwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9yIGEgNCBL QiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7CisJCVBW X1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RB VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRv bWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlMUV9SRU1P VkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19tYXBbMF0g PT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAgcGMtPnBj X21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZw dl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo JnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu a19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBpdC4gKi8K KwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJCSAgICAo dm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRkcik7CisJ CQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VS VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0 ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3VmZmljaWVu dC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJVEFJTFFf Q09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2NrKCZwdl9j aHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs bChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7CisJCW1f cGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVlLCBwbGlu a3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICovCisJCW1f cGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2lyZV9jb3Vu dCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4gKG1fcGMp OworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBsaXN0Cisg Ki8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2 KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKworCXJ3 X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVl cywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAxKSk7CisJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwlwYyA9 IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsKKwlmaWVs ZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChzaXplb2Yo dV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7CisJaWYg KHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19GUkVFMSB8 fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0aGUgdGlt ZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYgKF9fcHJl ZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7CisJCQlU QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJcmV0dXJu OworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwlm cmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmsoc3RydWN0 IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9jaHVua3Nf bXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5s b2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZf ZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcGNf Y2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19mcmVl cywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwltID0gUEhZ U19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7CisJZHVt cF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9JTkFDVElW RSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQViBlbnRy eSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgorICogbmVl ZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxpc3QgbG9j ayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZyb20gYW4g YXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgorICoKKyAq IFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0aWMgcHZf ZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap Cit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBwdl9j aHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFU KGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlwYyA9IFRB SUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgeworCQlmb3Ig KGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5wY19tYXBb ZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOworCQkJCWJy ZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBmaWVsZCAq IHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAmcGMtPnBj X3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJpdCk7CisJ CQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8KKwkJCWlm IChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkgICAgcGMt PnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBw YywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBj LAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZw dl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9l bnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8gZnJlZSBp dGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEws IDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxMT0NfV0lS RUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJCVBWX1NU QVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJbSA9IHJl Y2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJZ290byBy ZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsK KwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlkdW1wX2Fk ZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1hcDsKKwlw Yy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0IDAgKi8K KwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZSRUUyOwor CW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdl9jaHVu a3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJcHYgPSAm cGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmss IHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQs IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWIC0g MSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9u ZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8KK3N0YXRp YyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQoreworCWlu dCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5nIHRoZSBv bmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVudCB0eXBp Y2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8KKwljb3Vu dCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291bnQrKzsK KwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1iZXIgb2Yg c3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAqIGV4Y2Vl ZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBs b2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZfZW50cmll cyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0 cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZhaWwsIGZy ZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D S0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2tw ICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoKKwkgKiBO ZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0ZSBsaXN0 IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBiZWVuIGFs bG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQgcmVjeWNs ZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1bmtzIG11 c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRBSUxRX0lO SVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNIKHBjLCAm cG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNfbWFwX2Vs ZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBj X21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21hcFsyXSk7 CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJaWYgKGF2 YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVkZWQ7IGF2 YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19O T1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJCWlmICht ID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsKKwkJCWlm IChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21pY19hZGRf aW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19j aHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCQlwYyA9 IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht KSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwOwor CQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsK KwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RBVChhdG9t aWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRBSUxRX0VN UFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCVRBSUxR X0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2 X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhlbiByZW1v dmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwKKyAqIGFk ZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBlbnRyeSBp ZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBl cmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2UgbWFwcGlu Z3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0IG1kX3Bh Z2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5X3QgcHY7 CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlMUV9GT1JF QUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBWX1BNQVAo cHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3Qs IHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQorCX0KKwly ZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIgcGFnZSBt YXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2IGVudHJ5 IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYKKyAqIGVu dHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9p ZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFk ZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2Ug KnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1fb2Zmc2V0 X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3X2Fzc2Vy dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg TUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIlczogcGEg aXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElTVF9MT0NL X1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFnZSdzIHB2 IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2IGxpc3Qu ICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICogbXVzdCBu b3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50aWF0ZWQu CisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2YSk7CisJ cHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxM LCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo cGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJ bS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx IHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2FsbG9j cywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpFOworCWZv ciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJCUtBU1NF UlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkgICAgcGMt PnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsKKwkJZm9y IChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChwYy0+cGNf bWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJ CQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBjLT5wY19w dmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJCQlwdi0+ cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFO QUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5j X18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l eHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQorCQkJCQln b3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBj LCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBw Y19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+cGNfbWFw WzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgmcG1hcC0+ cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1hcC0+cG1f cHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZf ZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo JnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBwcm9tb3Rp b24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGlu ZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdlIG1hcHBp bmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcuCisg Ki8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZz ZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJ c3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xh c3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D S0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5v dCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19Q SFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdlJ3MgcHYg ZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0LiAgQXNp ZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5KCksCisJ ICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2VudHJ5KCkg Y2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9jaHVuaygp IHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJvbW90ZWQu CisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBhZ2UodmEp OworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NFUlQocHYg IT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBwYV90b19w dmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsK KwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAxIHB2IGVu dHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8geworCQlt Kys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBtYXAsIHZh KTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmluZCBhbmQg dGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFuZCB2aXJ0 dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBvbiBwdiBs aXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8KK3N0YXRp YyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2aF9yZW1v dmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZoX2ZyZWU6 IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BBR0VfVE9f UEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAgICAodV9s b25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBDb25kaXRp b25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBpZiB0aGUg cmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9ydGluZyB0 byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5zZXJ0X3B2 X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgc3Ry dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2 aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X TkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxMKSB7CisJ CXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0UobG9ja3As IG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwor CQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChG QUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50cnkgZm9y IGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxs b2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0aWMgYm9v bGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2 bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf cGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKiBQ YXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVjbGFtYXRp b24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgewor CQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBw YSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2 X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsK Kwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEgcGFnZSB0 YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFnZXMuCisg Ki8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBwdF9l bnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9IGZpcnN0 cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5ld3B0ZTsK KwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9CisKKy8q CisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rpb24gZmFp bHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLworc3RhdGlj IGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs IHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVhbl90IHJ2 OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBk ZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor CXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9wZGVfbG9j a2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwkg cHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90IG1wdGVw YTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkgUE1BUF9M T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9sZHB0ZSA9 IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdlKCZvbGRw dGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBpcyBub3Qg c3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lzX3JlZigm b2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAhPQorCSAg ICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVsc2Ugewor CQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6IHBhZ2Ug dGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAgIF9fZnVu Y19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQg cmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFjY2Vzc2Vk IG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFnZSBmYWls cy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBkaXJlY3Qg bWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkgICogdGhl IHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3NzaWJsZQor CQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRoZSBwcmlv cml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxsb2NhdGVk IGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2Us IHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUg a2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhlcmUuCisJ CSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3BhZ2VfYWxs b2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlOX0tFUk5F TF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9DX0lOVEVS UlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxM T0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkgcG1hcF9y ZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkgICAgIGxv Y2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZtX29mZnNl dF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5QRFJNQVNL KSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkgQ1RSMyhL VFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgICBf X2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkgaWYgKHZh IDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAs IDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3cGRlID0g KHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0ZSA9IG5l d3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczogb2xkcHRl IGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rlc3QoJm9s ZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAoIiVzOiBv bGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9sZHB0ZSAm IH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBp cyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3VudCA9PSAx KSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0cChmaXJz dHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmlyc3RwdGUp ID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUgYW5kIG5l d3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1bmNfXykp OworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0ZXMsIHVw ZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgqZmlyc3Rw dGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0spKQorCQkg cG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRoZSBzcGFy ZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhlCisJICAq IG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhlcndpc2Us IHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBiZSBpbmNv bnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVuaygpIGF0 dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3JvbmcgUFYgbGlz dCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBlY3RlZAor CSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWluZyBkZW1v dGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkKKwkJIHJl c2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoKKwkgICog RGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQgUERFIGhh cworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xlYXIsIGl0 IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdlciBvZiBh IHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0dGluZyBv ZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3ZlIGFuZCB0 aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwg KHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3RhbGUgcmVj dXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlmICh2YSA+ PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCAodm1f b2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUgdGhlIFBW IGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkgewor CQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSwg bG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25zLCAxKTsK KwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf X2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQorCisvKgor ICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFnZSBtYXBw aW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwX3QgcG1h cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90IGRvaW5n IGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2VybmVsX3Bk ZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRlOiBkbyB0 aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMg aW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zm c2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9j a3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsKKwl2bV9v ZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBXcml0ZSBi YWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJ ICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNLKSwgTkJQ RFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3Zh ICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBub3QgMm1w YWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9sZHBkZSA9 IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRlX2xvYWRf c3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlwbWFwLT5w bV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChwZGVfdGVz dCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCBz dmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdFX1NJWkUp OworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAg IHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBtYXBfcHZo X2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkgICAgZm9y ICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7 CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBkZV90ZXN0 KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJCSAgICB2 bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9SRUYpKQor CQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYgKFRBSUxR X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkp CisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkgICAgfQor CX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJuZWxfcGRl KHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFn ZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92ZV9wdF9w YWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJ CQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1hcF9yZW1v dmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2lyZV9jb3Vu dCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBGQUxTRSk7 CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJfQor CX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAocG1hcCwg c3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUgdGhpbmdz IHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1v dmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNldF90IHZh LAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3RydWN0IHJ3 bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlfdCBvbGRw dGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFnZSBiZWlu ZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFH RV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQor CQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVzdCgmb2xk cHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisKKwlwbWFw X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRF X01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BBKG9sZHB0 ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf dGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3Jp dGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwg KHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJaWYgKHB0 ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNF RCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJCXBtYXBf cHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf bGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCXB2 aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VNUFRZKCZw dmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7 CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUsIGZyZWUp KTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNzIGFkZHJl c3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAg KnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlzdHJ1Y3Qg cndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlQ TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2 YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0ZSA9IHBt YXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gcHRlIGZv ciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChw dGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92ZV9wdGUo cG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJ CXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworfQor CisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgc3Bl Y2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQg YXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3ZvaWQKK3Bt YXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkK K3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0OworCXBk X2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCXN0cnVj dCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3JtIGFuIHVu c3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLworCWlmIChw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlhbnl2YWxp ZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVt b3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRv IHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9 PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVfaXNfMW1f c3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAmZnJlZSk7 CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBzdmEgPCBl dmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50 ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJ aWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7 CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7 CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFibGUuCisJ CSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4 dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShw ZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91dCBpbnZh bGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNvbnRpbnVl OworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18x bV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92aW5nIHRo ZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFu ZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYm IGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBU RV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4K KwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJCWFueXZh bGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZmcmVlLCAm bG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9j a2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBzdXBlcnBh Z2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsK KwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0IG91ciBz Y2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUg Y3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdl IGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQg PSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw ZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUp IHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkg eworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0g dmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90ZXN0KHB0 ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9uZXh0KQor CQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgcHRw YWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0laRTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBfaW52YWxp ZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndf d3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxpZGF0ZV9h bGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9DSyhw bWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglSb3V0aW5l OglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBwaHlzaWNh bCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNpZGVzLgor ICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAqCU5vdGVz OgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkKKyAqCQlp bmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1hcF9yZW1v dmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3QgbSkKK3sK KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJ cHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCB2 YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VO TUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMgbm90IG1h bmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21h bGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJd2hp bGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAg PSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92YTsKKwkJ cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUocG1hcCwg cGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCXdo aWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJcG1h cCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICogSWYgaXQn cyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUgcGFnZSBi ZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBO VUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJ WkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUgPSBwbWFw X3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpwZGUgIT0g MCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFn ZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGlu IHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg cHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVs X3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cp KQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBVcGRhdGUg dGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlpZiAocHRl X2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7 CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVfdGVzdCgm dHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTog dmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+cHZfdmEs ICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlwbWFwX3Vu dXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFsaWRhdGVf cGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwg cHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShwbWFwLCBw dik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwg UEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2Zy ZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRlOiBkbyB0 aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8KK3N0YXRp YyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBk ZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90IG5ld3Bk ZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJYm9vbGVh bl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlL QVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90IDJtcGFn ZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRyeToKKwlv bGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdF RCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RP X1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7IHZhICs9 IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJgorCQkJ ICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJ fQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgmbmV3cGRl LCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAobmV3cGRl ICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlfdCAqKXBk ZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkKKwkJCWdv dG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwl9 CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNpY2FsIHBy b3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMgcmVxdWVz dGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2 YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRfdCB2YSwg dmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwli b29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90ICYgVk1f UFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwgc3ZhLCBl dmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJcmV0dXJu OworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZB TFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25l eHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAw KSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25l eHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25l eHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ dmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisK KwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmICgqcGRl ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdl LgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoKKwkJCSAq IEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBk ZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSAr IE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJCSAqIFRo ZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0ZWQgYnkg cG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3RfcGRlKHBt YXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJY29udGlu dWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJCXB2X2xp c3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv Y2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRhdGVfYWxs KAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJcndf cmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJfQorCQkJ CX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJCQkJLyoK KwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJCSAqLwor CQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNj YW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBj dXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2Ug YmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2 YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90 b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFH RV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJCQl2bV9w YWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxpZCgmcGJp dHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2YV9uZXh0 KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEg PSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQoJnBiaXRz LCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJcHRlX2Ns ZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9NQU5BR0VE KSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQSFlTX1RP X1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlpZiAodmEg PT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICog VW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGluZyAic3Zh IiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0IGJlIGlu dmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0OworCQkJ CX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJ CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFueWNoYW5n ZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkg eworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFw KTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3VvdXMgNEtC IHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRhYmxlIHBh Z2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8KKyAqIG9j Y3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBtYXBwaW5n cyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kICgy KSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hhcmFjdGVy aXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBkb25lIGlu IHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFyZHdhcmUg YXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisgKiBUTEIg ZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9uIHRoYXQg dGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRpYyB2b2lk CitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNl dF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90IG5ld3Bk ZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9vZmZzZXRf dCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg TUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBzcGVjaWZp ZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwgdW51c2Vk LCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICogd2l0aGlu IGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVuY18ybXBh Z2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tlcm5lbF9w bWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICovCisJCWF0 b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3BkZSkgfHwg IXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9wX2Zh aWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGlu IHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOworCX0KKwlp ZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX1JP KSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9STyBjYW4g YmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJaWYgKCFh dG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3BkZSB8CisJ CSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87CisJfQor CisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNwZWNpZmll ZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0S0IgcGh5 c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3RlcmlzdGlj cyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5ld3BkZSkg KyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBHIC0gMTsg cHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7CisJCWlm IChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9sb25nKCZw bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBm b3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJ cmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFwdGVfdGVz dCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhwdGUsIG9s ZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0ZSB8PSBQ VEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRMQkxPX1BU RV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IHByb3Rl Y3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0ZXZhLCBw bWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5ld3BkZSAm IFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWls dXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g cG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQor CQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRhYmxlIHBh Z2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcgdGhlIHN1 cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVzdHJveWVk IGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQ U19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2VfYXJyYXkg JiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJICAg ICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykpOworCUtB U1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgiJXM6IHBh Z2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYgKHBtYXBf aW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor CX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAocHRlX3Rl c3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXAsIHZh LCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAgdGhlIHN1 cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3cGRlIHwg UFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9ucywgMSk7 CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf X2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBnaXZlbiBw aHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgKHYp IGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9uIHJlcXVl c3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQgZG93biwg bWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWltZWQuCisg KgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBsYXp5LWV2 YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0aW5lIG11 c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFwIE5PVy4K KyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFn ZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNpbmQgX191 bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZtX3BhZGRy X3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9lbnRyeV90 ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAgICBwdl9l bnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJvb2xlYW5f dCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAgIEtBU1NF UlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2JpZyIpKTsK KyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8fCB2YSA8 IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEsCisgICAg ICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFuIHN1 Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYm ICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FTU0VSVF9M T0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAgICBsb2Nr ID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBN QVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2FzZSB0aGF0 IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAgICAqIGNy ZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT UykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBpZiB0aGUg cHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAg ICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5v c2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAgICAgICAg ICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDogJmxvY2sp OworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAg ICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAgICAgICAg ICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQTUFQX1VO TE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9SRVNPVVJD RV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0gcG1hcF9w ZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcGFuaWMo IiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7CisJfQor CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAgICAgICAg KiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEgbmV3IFBU IHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAgICAgICAg ICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBwZGlyPSVw LCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2VndGFiLCAo dm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0p OworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9wYSA9IFRM QkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19QQV9UT19Q Rk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8qCisgICAg ICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2ltdWxhdGVk IGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8gYXZvaWQg YSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUpOworICAg ICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAgICAgICAg ICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKyAg ICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNoZWFibGVf bWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F TUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF X0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg ICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAg ICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAgICAgIGlm ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAgICAgICAg bmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJfTk9TVE9S RVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNlbmRpZgor CisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVhYmxlIG1h cHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2FudCB0byB0 YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3IgdGhlc2Ug bWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwKSB7 CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQVEVfRDsK Kwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5nZWQsIG11 c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAg aWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAgICAgICAg ICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0 cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcgUFQgcGFn ZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAgICAgICAg ICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2VyIHBhZ2Ug aXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBhbHNvLgor ICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmbmV3cHRl LCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAgICAgICAg ICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVs c2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdwdGUsCisg ICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtYXAt PnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJUKCFwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAgICAoIiVz OiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAorICAgICAg ICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmlncHRlKSk7 CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0aGUgZXh0 cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAg ICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRlLT53aXJl X2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndpcmVfY291 bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjogbWlzc2lu ZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKHB0ZV90 ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0ZSB8PSBQ VEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCQl2bV9w YWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlkYXRlOwor CX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5nIGhhcyBj aGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisgICAgICAg ICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAgICAgICAg aWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cp KQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsK KworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEpOworICAg ICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2Nr LCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92ZSgmb20t Pm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICht cHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVfY291bnQt LTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3VudCA+IDAs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5nIHJlZmVy ZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIg dmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl CisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7CisKKyAg ICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIg bWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFncyAmIFZQ T19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX01BTkFH RUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2ID0gZ2V0 X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEgPSB2YTsK KyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ssIHBhKTsK KyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2 X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAgICAgICAg IGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVsc2UgaWYg KHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAgICAgLyoK KyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAo cHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBtX3N0YXRz LndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAgICAgICAg cHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZv aWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1hcHBpbmcg b3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAgICAgICog dXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUgJiB+IChQ VEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBU RV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK KyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAgICAgICAg ICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg Ym9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRfc3RvcmUo cHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19yZWYoJm9y aWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm b3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRF X0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQp KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfZGlydHko b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBWTV9QUk9U X1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg ICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYKKwkJCSAg ICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlMUV9FTVBU WSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfSBlbHNl CisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAg ICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2VydmF0aW9u IGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJvbW90aW9u LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+d2lyZV9j b3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9sZXZlbF9p ZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRlKHBtYXAs IHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkgJiBEIGNh Y2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAgICAgICAg ICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNl LCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorICAgICAg ICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9PSAmY3Vy cHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBWTV9QUk9U X0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQorICAgICAg ICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2aF9nbG9i YWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1cm4gKEtF Uk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFKT1IqIGFz c3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAyLiBOb3Qg d2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFnZXMuCisg KiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9pZAorcG1h cF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2 bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCSh2b2lk KXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAmbG9jayk7 CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZw dmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMgdm1fcGFn ZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEs IHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwgc3RydWN0 IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZtX3BhZGRy X3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWkuY2xlYW5f c3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQT19VTk1B TkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFu IHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xP Q0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIElu IHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3ZSBhcmUK KwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT UykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKworCQkvKgor CQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBpbmRleCA9 IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXggPT0gcHRl cGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJ CSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1hcF9w ZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBt YXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFjdGl2 YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChwZGVf aXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0ZSA9IFBI WVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJCQkJ bXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBhc3MgTlVM TCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNhdXNlIHdl IGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBfYWxsb2Nw dGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQorCQkJCQly ZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7CisJfQor CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRlKSkgewor CQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQltcHRlID0g TlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIgb24gdGhl IFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYgKChtLT5v ZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZf ZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlT TElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIG1wdGUs ICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQlwbWFw X2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJ CXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8K KwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFHRV9UT19Q SFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp b24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZB TElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3cHRlIHw9 IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5t ZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUgfD0gUFRF X0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UK KwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9zZXQoJm5l d3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRlX3N0b3Jl KHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0aGlzIG9u bHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vz cy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBvY2N1ci4K KwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJ CXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJ WkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJCX0KKwl9 CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBNYWtlIGEg dGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMgb25seSBp bnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNlIFhLUEhZ UyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRk cl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVSUk9SISEh IE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1hcHBpbmcg bm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1JUFNfUEhZ U19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUo dm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAqLworCXJl dHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5kZXhfdCBw ZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90IG1wdGUg PSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToKKwkJcGRw ZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAoKnBkcGUg IT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4gKi8KKwkJ CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkpOworCQkJ bXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBwZCBwYWdl LiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJCQlwdGVw aW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5kZXggPj4g TlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBO VVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxvY2twICE9 IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOworfQorCisv KgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMgVFJVRSBp ZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEpIGEgcGFn ZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tpbmcsICgy KSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl c3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVj bGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2Vu dGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90 X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlfdCAqcGRl OworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBzcGdsaXN0 IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwlpZiAo aXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwgcG1hcCBm b3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBw bWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCXJldHVy biAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZhLCBOVUxM KSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHgg aW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNF KTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChwZF9lbnRy eV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOworCXBkZSA9 ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJS0FTU0VS VChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNvdW50IGlz IHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sCisJ CSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BBR0VfVE9f UEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8 IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKwkJ aWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCW5ld3Bk ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NBQ0hFOwor CX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxhZ3MgJiBW UE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKworCQkvKgor CQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBiZSBjcmVh dGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZNX1BBR0Vf VE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlp ZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUp OworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBt YXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZBTFNFKTsK KwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBwbWFwX3Jl c2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoKKwkgICog TWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0b3JlKHBk ZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUg cGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0 aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJsZSBUTEIg bWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkgJiYgKHBt YXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90ICYgVk1f UFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNhY2hlX3N5 bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgTkJQ RFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmcoJnBtYXBf cGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0dXJuIChU UlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdlcyBiZWxv bmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3aXRoIHRo ZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0aGUgZ2l2 ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMKKyAqIG1h cHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0IGJ5IHRo ZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFydCB3aXRo aW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBpcyB0aGUg cGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQgY2FuIGJl IG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisgKiB2aXJ0 dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0YXJ0IGFu ZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVudCBwYWdl IGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0YXJ0IGFy ZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0YXJ0LCB2 bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZh OworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOworCisJVk1f T0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0gYXRvcChl bmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCXdoaWxl IChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgpIDwgcHNp emUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJNQVNLKSA9 PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYmIHBnX3Nw X2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90LCAmbG9j aykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJbXB0ZSA9 IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAgIG1wdGUs ICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9jayAhPSBO VUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7 CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0X3B0IHBy ZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3BlY2lmaWVk IHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0cyBvbiBw cm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoKKyAqIFRo aXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQorICogcHJv Y2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICogYXJlIHRh a2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2luaXRfcHQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwKKyAgICB2 bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3QgKnBkZTsK Kwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9tZW1hdHRy X3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOworCUtBU1NF UlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBPQkpUX1NH LAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0IikpOworCisJ aWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2VybmVsIHBt YXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBEUiAtIDEp KSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19zcF9lbmFi bGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3QsIHBpbmRl eCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdlX2xvb2t1 cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRTX0FM TCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJCW1lbWF0 dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBwaW5nIGlm IHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8gYSAyTUIg cGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHApOworCQlp ZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBTa2lwIHRo ZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkgKiB0aGUg cGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJpbmcKKwkJ ICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7 CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7CisJCSAg ICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRT X0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkpOworCQkJ aWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0gcC0+bWQu cHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7CisJ CX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAyTSBhbGln bmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJCVBNQVBf TE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsgcGEgKz0g TkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwpOworCQkJ aWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9mIG1hcHBp bmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBhZ2UgZGly ZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxvY2tpbmcs CisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhhbgorCQkJ CSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29udGludWU7 CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkg ICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgo YWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7CisJCQkJ cHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAgUFRFX1BT XzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2NhY2hlYWJs ZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJCSAgICBW TV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor CQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNlCisJCQkJ CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5ld3B0ZSk7 CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpFKTsKKwkJ CQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxzZSB7CisJ CQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLworCQkJCXBk cGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAwLAorCQkJ CSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJCQkJICAg ICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRkciArPSBO QlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglDbGVhciB0 aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkIHJh bmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxpZCBtYXBw aW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJpYnV0ZSBz ZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUgdGhlIHdp cmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhlIHdpcmVk IGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2FyZSBmZWF0 dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIgZW50cmll cy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg dm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlf dCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3RzX2xvY2tl ZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9DSyhwbWFw KTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3Nl Z21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4dCA9IChz dmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25l eHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAm IH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCXBk ZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVMTCkKKwkJ CWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBk ZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUjanggaXMg bWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgorCQkJICog QXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBkZW1v dGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSArIE5C UERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xlYXJfbG9u ZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv dW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJ CQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOwor CQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJIFBNQVBf VU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQkJ IC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJ CQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5pYygicG1h cF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9uZXh0ID4g ZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRl LCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7 CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFwdGVf dGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1p c3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJICogUFRF X1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAorCQkJICog bG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3NvcgorCQkJ ICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50bHkuCisJ CQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5wbV9zdGF0 cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndf cnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisK Ky8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisgKglmcm9t IHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRoZSBkZXN0 aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkgYW5kIG5l ZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3QgZHN0X3Bt YXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1fc2l6ZV90 IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBUaGlzIGRv ZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9yZSBvdmVy aGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1c2luZyBm YXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAqbG9jazsK KwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRyLCB2YV9u ZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlpZiAoUENQ VV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRyID0gc3Jj X2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBkZWFkbG9j ay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0X3BtYXAp OworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhzcmNfcG1h cCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3JjX2FkZHI7 IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAqc3JjX3B0 ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRlOworCQlw ZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRyeV90IHNy Y3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKworCQlzcmNf cGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBlID09IE5V TEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VHKSAmIH5T RUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUgY29weSBy YW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29weSBhbGwg bWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAodmFfbmV4 dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJCX0KKwor CQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBh ZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3BkcGVfdG9f cGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3JjX3BkZSA9 PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRlOworCisJ CWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1cGVycGFn ZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBOQlBEUiA+ IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2NwZGUoZHN0 X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQlicmVhazsK KworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJCWRzdF9w ZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9U T19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9pbmRleChh ZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVzdCgmc3Jj cHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0X3BtYXAs IGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsKKwkJCQkq ZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBfcmVzaWRl bnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7CisJCQl9 IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJfQorCisJ CXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21wdGUgPSBQ SFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVfY291bnQg PiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMgdW51c2Vk IikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRo ZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUgcGFnZSwg b3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkgKi8KKwkJ aWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKworCQkvKgor CQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRoZSBtYW5h Z2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3BkZV90b19w dGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1JUFNfUEhZ U19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9wdGVfaW5k ZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0gMCkKKwkJ CWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZhX25leHQp IHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsKKworCisJ CQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1YWwgY29w eSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwgUFRFX01B TkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICovCisJCQkJ cGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRoZSBwYWdl IGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3BtYXAsIGFk ZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7CisJCQkJ CWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9UT19QSFlT KCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJCQkJaWYg KGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRlcGluZGV4 KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBqdXN0CisJ CQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUt PndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFnZSB0 YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2NhdGVkLgor CQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJCQkJCSAg ICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5nIG1lbW9y eSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5IHRoZSBw YWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09IE5VTEwp CisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3ZSBoYXZl IGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisKKwkJCQkv KiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9wdGUgPSAo cHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlWTV9QQUdF X1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0ZV9pbmRl eChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICovCisJCQkJ bSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJCWlmICgq ZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShkc3RfcG1h cCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBvcHVsYXRl IHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2RpZmllZCwg YW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1cmluZyB0 aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cgfCBQVEVf RCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOworCQkJCQkv KiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFw LCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJaWYgKHBt YXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZmcmVlKSkg eworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAgYWRkcik7 CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJZ290byBv dXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3ZSdyZSBk b25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndpcmVfY291 bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlzcmNfcHRl Kys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2Nr KTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNyY19wbWFw KTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30KKworLyoK KyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBieSBt YXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIgaXRz IGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQKK3Bt YXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRy X3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVD VChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsK KwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigp OworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lmaWVkIGhh cmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVzaW5nIGJ6 ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5IG5vdCBj b3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2b2lkCitw bWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKK3sKKwl2 bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisK Kwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnplcm8o KGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu Z2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKglwbWFwX2Nv cHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBh Z2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJ YmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQor ICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LgorICovCisjZGVmaW5lCVBN QVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRpYyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRl cm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3QgZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zm c2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFkZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9f UEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19kc3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsK KworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBhY2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgor CSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRoYXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UK KwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGluIFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8K KwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93 Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpF KTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBN SVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsKKyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxh Z3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlfYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2Fk ZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxzZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3Qp dmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNo ZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKwor LyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRs eSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBwYWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24t d3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChlLmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20g Vk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlzIG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQg dG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFn cykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8KKyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNl IGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBz cmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRz dCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Mo dm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkKK3sKKworCXBtYXBfY29weV9wYWdlX2ludGVy bmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVk X2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZt X3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAg dm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIg KmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20sIGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29m ZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJfdCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250 OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhmZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNl dCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0la RSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFbYV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJ CWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20pOworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0 ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7 CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdF X1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hl X3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19UT19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBB R0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1JUFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSAr IGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5 cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVfQ0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9D T1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2NwLCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxz ZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymlu dl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQli X29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsK K30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFn Z2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisgKiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0 YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zm c2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0 LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2NvcHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zm c2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAwKTsKK30KKworI2lmZGVmIENQVV9DSEVSSQor dm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisK Kwordm1fb2Zmc2V0X3QKK3BtYXBfcXVpY2tfZW50ZXJfcGFnZSh2bV9wYWdlX3QgbSkKK3sKKyNp ZiBkZWZpbmVkKF9fbWlwc19uNjQpCisgICAgICAgIHJldHVybiBNSVBTX1BIWVNfVE9fRElSRUNU KFZNX1BBR0VfVE9fUEhZUyhtKSk7CisjZWxzZQorICAgICAgICB2bV9wYWRkcl90IHBhOworICAg ICAgICBzdHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRl OworCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisgICAgICAgIGlmIChNSVBT X0RJUkVDVF9NQVBQQUJMRShwYSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobS0+bWQucHZfZmxh Z3MgJiBQVl9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUX1VOQ0FDSEVEKHBhKSk7CisgICAgICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNU KHBhKSk7CisgICAgICAgIH0KKyAgICAgICAgY3JpdGljYWxfZW50ZXIoKTsKKyAgICAgICAgc3lz bSA9ICZzeXNtYXBfbG1lbVtQQ1BVX0dFVChjcHVpZCldOworCisgICAgICAgIEtBU1NFUlQoc3lz bS0+dmFsaWQxID09IDAsICgicG1hcF9xdWlja19lbnRlcl9wYWdlOiBQVEUgYnVzeSIpKTsKKwor ICAgICAgICBwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CisgICAgICAg ICpwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8 CisgICAgICAgICAgICAoaXNfY2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQ VEVfQ19VTkNBQ0hFRCk7CisgICAgICAgIHN5c20tPnZhbGlkMSA9IDE7CisKKyAgICAgICAgcmV0 dXJuIChzeXNtLT5iYXNlKTsKKyNlbmRpZgorfQorCit2b2lkCitwbWFwX3F1aWNrX3JlbW92ZV9w YWdlKHZtX29mZnNldF90IGFkZHIpCit7CisgICAgICAgIG1pcHNfZGNhY2hlX3diaW52X3Jhbmdl KGFkZHIsIFBBR0VfU0laRSk7CisKKyNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQorICAgICAgICBz dHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworCisg ICAgICAgIGlmIChhZGRyID49IE1JUFNfS1NFRzBfU1RBUlQgJiYgYWRkciA8IE1JUFNfS1NFRzBf RU5EKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzeXNtID0gJnN5c21hcF9s bWVtW1BDUFVfR0VUKGNwdWlkKV07CisKKyAgICAgICAgS0FTU0VSVChzeXNtLT52YWxpZDEgIT0g MCwKKyAgICAgICAgICAgICgicG1hcF9xdWlja19yZW1vdmVfcGFnZTogUFRFIG5vdCBpbiB1c2Ui KSk7CisgICAgICAgIEtBU1NFUlQoc3lzbS0+YmFzZSA9PSBhZGRyLAorICAgICAgICAgICAgKCJw bWFwX3F1aWNrX3JlbW92ZV9wYWdlOiBpbnZhbGlkIGFkZHJlc3MiKSk7CisKKyAgICAgICAgcHRl ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAgICAqcHRlID0gUFRFX0c7Cisg ICAgICAgIHRsYl9pbnZhbGlkYXRlX2FkZHJlc3Moa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAg ICBzeXNtLT52YWxpZDEgPSAwOworICAgICAgICBjcml0aWNhbF9leGl0KCk7CisjZW5kaWYKK30K KworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9uZSBvZiB0aGUgZmly c3QKKyAqIDE2IHB2cyBsaW5rZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlzIGNvdW50IG1heQor ICogYmUgY2hhbmdlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0dXJlOyBpdAorICog aXMgb25seSBuZWNlc3NhcnkgdGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBhIHNtYWxsCisgKiBz dWJzZXQgb2YgcG1hcHMgZm9yIHByb3BlciBwYWdlIGFnaW5nLgorICovCitib29sZWFuX3QKK3Bt YXBfcGFnZV9leGlzdHNfcXVpY2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtKQoreworCXN0cnVj dCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2Owor CWludCBsb29wcyA9IDA7CisJYm9vbGVhbl90IHJ2OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCIlczogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIs IF9fZnVuY19fLCBtKSk7CisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJaWYgKFBW X1BNQVAocHYpID09IHBtYXApIHsKKwkJCXJ2ID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCWxv b3BzKys7CisJCWlmIChsb29wcyA+PSAxNikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJ2ICYmIGxv b3BzIDwgMTYgJiYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlwdmggPSBw YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+ cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKKwkJCQly diA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsb29wcysrOworCQkJaWYgKGxvb3BzID49 IDE2KQorCQkJCWJyZWFrOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfcGFn ZV93aXJlZF9tYXBwaW5nczoKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBtYW5hZ2VkIG1h cHBpbmdzIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBwYWdlCisgKgl0aGF0IGFyZSB3aXJlZC4KKyAq LworaW50CitwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3Modm1fcGFnZV90IG0pCit7CisJc3RydWN0 IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5 X3QgKnB0ZTsKKwlpbnQgY291bnQsIG1kX2dlbjsKKworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VO TUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CityZXN0YXJ0OgorCWNvdW50ID0gMDsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NL KHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd19ydW5sb2NrKGxvY2sp OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfcmxvY2sobG9jayk7CisJCQlpZiAobWRfZ2Vu ICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVz dGFydDsKKwkJCX0KKwkJfQorCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlp ZiAocHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQljb3VudCsrOworCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJc3RydWN0 IG1kX3BhZ2UgKnB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9G T1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChw dik7CisJCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCWludCBwdmhfZ2VuID0gcHZo LT5wdl9nZW47CisJCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9j ayk7CisJCQkJUE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmICht ZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4p IHsKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJ CQl9CisJCQlwZF9lbnRyeV90ICpwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQkJ aWYgKHB0ZV90ZXN0KChwdF9lbnRyeV90ICopcGRlLCBQVEVfVykpCisJCQkJY291bnQrKzsKKwkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVu bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworI2lmIDAKKy8q CisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlzIG1hcHBlZCBpbmRpdmlkdWFs bHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndpc2UsIHJldHVybnMgRkFMU0Uu CisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSkKK3sKKwlz dHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWlmICgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7CisJcndfcmxvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3Js b2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSB8fAorCSAgICAo KG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkhVEFJTFFfRU1QVFkoJnBhX3Rv X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJcndfcnVubG9jayhsb2NrKTsK Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorI2VuZGlm CisKKy8qCisgKiBEZXN0cm95IGFsbCBtYW5hZ2VkLCBub24td2lyZWQgbWFwcGluZ3MgaW4gdGhl IGdpdmVuIHVzZXItc3BhY2UKKyAqIHBtYXAuICBUaGlzIHBtYXAgY2Fubm90IGJlIGFjdGl2ZSBv biBhbnkgcHJvY2Vzc29yIGJlc2lkZXMgdGhlCisgKiBjYWxsZXIuCisgKgorICogVGhpcyBmdW5j dGlvbiBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUga2VybmVsIHBtYXAuICBNb3Jlb3ZlciwgaXQK KyAqIGlzIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBJdCBpcyBvbmx5IHRvIGJlIHVz ZWQgZHVyaW5nCisgKiBwcm9jZXNzIHRlcm1pbmF0aW9uLiAgQ29uc2VxdWVudGx5LCBpdCBjYW4g YmUgaW1wbGVtZW50ZWQgaW4gd2F5cworICogdGhhdCBtYWtlIGl0IGZhc3RlciB0aGFuIHBtYXBf cmVtb3ZlKCkuICBGaXJzdCwgaXQgY2FuIG1vcmUgcXVpY2tseQorICogZGVzdHJveSBtYXBwaW5n cyBieSBpdGVyYXRpbmcgb3ZlciB0aGUgcG1hcCdzIGNvbGxlY3Rpb24gb2YgUFYKKyAqIGVudHJp ZXMsIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgcGFnZSB0YWJsZS4gIFNlY29uZCwgaXQgZG9l c24ndAorICogaGF2ZSB0byB0ZXN0IGFuZCBjbGVhciB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGF0 b21pY2FsbHksIGJlY2F1c2UKKyAqIG5vIHByb2Nlc3NvciBpcyBjdXJyZW50bHkgYWNjZXNzaW5n IHRoZSB1c2VyIGFkZHJlc3Mgc3BhY2UuICBJbgorICogcGFydGljdWxhciwgYSBwYWdlIHRhYmxl IGVudHJ5J3MgZGlydHkgYml0IHdvbid0IGNoYW5nZSBzdGF0ZSBvbmNlCisgKiB0aGlzIGZ1bmN0 aW9uIHN0YXJ0cy4KKyAqLwordm9pZAorcG1hcF9yZW1vdmVfcGFnZXMocG1hcF90IHBtYXApCit7 CisJcGRfZW50cnlfdCBwdGVwZGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXN0 cnVjdCBzcGdsaXN0IGZyZWU7CisJdm1fcGFnZV90IG0sIG1wdGUsIG10OworCXB2X2VudHJ5X3Qg cHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjLCAqbnBjOwor CXN0cnVjdCByd2xvY2sgKmxvY2s7CisJaW50IGJpdDsKKwl1aW50NjRfdCBpbnVzZSwgYml0bWFz azsKKwlpbnQgYWxsZnJlZSwgZmllbGQsIGZyZWVkLCBpZHg7CisJYm9vbGVhbl90IHN1cGVycGFn ZTsKKwl2bV9wYWRkcl90IHBhOworCisJLyoKKwkgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gcG1h cCBpcyBvbmx5IGFjdGl2ZSBvbiB0aGUgY3VycmVudAorCSAqIENQVS4gIFVuZm9ydHVuYXRlbHks IHdlIGNhbm5vdCBibG9jayBhbm90aGVyIENQVSBmcm9tCisJICogYWN0aXZhdGluZyB0aGUgcG1h cCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4KKwkgKi8KKwlLQVNTRVJUKHBtYXAg PT0gdm1zcGFjZV9wbWFwKGN1cnRocmVhZC0+dGRfcHJvYy0+cF92bXNwYWNlKSwKKwkgICAgKCIl czogbm9uLWN1cnJlbnQgcG1hcCAlcCIsIF9fZnVuY19fLCBwbWFwKSk7CisKKwlsb2NrID0gTlVM TDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQ TUFQX0xPQ0socG1hcCk7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHBjLCAmcG1hcC0+cG1fcHZjaHVu aywgcGNfbGlzdCwgbnBjKSB7CisJCWFsbGZyZWUgPSAxOworCQlmcmVlZCA9IDA7CisJCWZvciAo ZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7CisJCQlpbnVzZSA9IH5wYy0+cGNf bWFwW2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCXdoaWxlIChpbnVzZSAhPSAwKSB7 CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWJpdG1hc2sgPSAxVUwgPDwgYml0Owor CQkJCWlkeCA9IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAm cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCQlpbnVzZSAmPSB+Yml0bWFzazsKKworCQkJCXBkZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQlw ZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKSB7CisJCQkJCXN1cGVycGFnZSA9IFRSVUU7CisJCQkJCXB0ZSA9IChw dF9lbnRyeV90ICopcGRlOworCQkJCX0gZWxzZSB7CisJCQkJCXN1cGVycGFnZSA9IEZBTFNFOwor CQkJCQlwdGVwZGUgPSAqcGRlOworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+ cHZfdmEpOworCQkJCX0KKwkJCQl0cHRlID0gKnB0ZTsKKwkJCQlpZiAoIXB0ZV9pc192YWxpZChw dGUpKSAgeworCQkJCQlwYW5pYygiJXM6IGJhZCAlcyBwdGUgdmEgJWx4IHB0ZSAlbHgiLAorCQkJ CQkgICAgX19mdW5jX18sIHN1cGVycGFnZSA/ICJzdXBlcnBhZ2UiIDoKKwkJCQkJICAgICIiLCBw di0+cHZfdmEsIHRwdGUpOworCQkJCX0KKworLyoKKyAqIFdlIGNhbm5vdCByZW1vdmUgd2lyZWQg cGFnZXMgZnJvbSBhIHByb2Nlc3MnIG1hcHBpbmcgYXQgdGhpcyB0aW1lCisgKi8KKwkJCQlpZiAo cHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkgeworCQkJCQlhbGxmcmVlID0gMDsKKwkJCQkJY29udGlu dWU7CisJCQkJfQorCisJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEodHB0ZSk7CisJCQkJaWYgKHN1 cGVycGFnZSkKKwkJCQkJcGEgJj0gflBEUk1BU0s7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShw YSk7CisJCQkJS0FTU0VSVChtLT5waHlzX2FkZHIgPT0gcGEsCisJCQkJICAgICgiJXM6IHZtX3Bh Z2VfdCAlcCBwaHlzX2FkZHIgbWlzbWF0Y2ggIgorCQkJCSAgICAiJTAxNmp4ICUwMTZqeCIsIF9f ZnVuY19fLCBtLAorCQkJCSAgICAodWludG1heF90KW0tPnBoeXNfYWRkciwgKHVpbnRtYXhfdCl0 cHRlKSk7CisKKwkJCQlLQVNTRVJUKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwK KwkJCQkgICAgbSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJCQkJICAg ICgiJXM6IGJhZCB0cHRlICUjangiLCBfX2Z1bmNfXywKKwkJCQkgICAgKHVpbnRtYXhfdCl0cHRl KSk7CisKKwkJCQkvKiBDbGVhciBQVEUgKi8KKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwdGVf c3RvcmUocHRlLCAwKTsKKwkJCQllbHNlCisJCQkJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9w bWFwKHBtYXApID8KKwkJCQkJICAgIFBURV9HIDogMCk7CisKKwkJCQkvKgorCQkJCSAqIFVwZGF0 ZSB0aGUgdm1fcGFnZV90IGNsZWFuIGFuZCByZWZlcmVuY2UgYml0cworCQkJCSAqLworCQkJCWlm IChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVfdGVzdCgmdHB0ZSwgUFRF X1JPKSkgeworCQkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCQl2bV9wYWdlX3QgbXQ7CisKKwkJ CQkJCWZvciAobXQgPSBtOyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJ CQl2bV9wYWdlX2RpcnR5KG10KTsKKwkJCQkJfSBlbHNlCisJCQkJCQl2bV9wYWdlX2RpcnR5KG0p OworCQkJCX0KKworCQkJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgbSk7 CisKKwkJCQkvKiBNYXJrIGZyZWUgKi8KKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNr OworCQkJCWlmIChzdXBlcnBhZ2UpIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1h cCwgTkJQRFIgLyBQQUdFX1NJWkUpOworCQkJCQlwdmggPSBwYV90b19wdmgoVExCTE9fUFRFX1RP X1BBKHRwdGUpKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0 KTsKKwkJCQkJcHZoLT5wdl9nZW4rKzsKKwkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xp c3QpKSB7CisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10 KyspCisJCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZtdC0+bWQucHZfbGlzdCkpCisJCQkJCQkJCXZt X3BhZ2VfYWZsYWdfY2xlYXIobXQsIFBHQV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJCW1wdGUg PSBwbWFwX2xvb2t1cF9wdF9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJCWlmIChtcHRlICE9 IE5VTEwpIHsKKwkJCQkJCXBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJCQkJCQlw bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJCUtBU1NFUlQobXB0ZS0+d2ly ZV9jb3VudCA9PSBOUFRFUEcsCisJCQkJCQkgICAgKCIlczogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl cnJvciIsCisJCQkJCQkgICAgX19mdW5jX18pKTsKKwkJCQkJCW1wdGUtPndpcmVfY291bnQgPSAw OworCQkJCQkJcG1hcF9hZGRfZGVsYXllZF9mcmVlX2xpc3QobXB0ZSwgJmZyZWUsIEZBTFNFKTsK KwkJCQkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCQkJ CQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7 CisJCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlt LT5tZC5wdl9nZW4rKzsKKwkJCQkJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSAhPSAw ICYmCisJCQkJCSAgICBUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJCQkJICAgICht LT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCQkJCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3Qp KQorCQkJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJCQkJCX0K KwkJCQl9CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsIHB0ZXBkZSwgJmZyZWUp OworCQkJCWZyZWVkKys7CisJCQl9CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2 X2VudHJ5X2ZyZWVzLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRy eV9zcGFyZSwgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50 cnlfY291bnQsIGZyZWVkKSk7CisJCWlmIChhbGxmcmVlKSB7CisJCQlUQUlMUV9SRU1PVkUoJnBt YXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCWZyZWVfcHZfY2h1bmsocGMpOworCQl9 CisJfQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZh bGlkYXRlX2FsbChwbWFwKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyd19ydW5sb2NrKCZwdmhf Z2xvYmFsX2xvY2spOworCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKK30KKworLyoKKyAq IENsZWFyIHRoZSB3cml0ZSBhbmQgbW9kaWZpZWQgYml0cyBpbiBlYWNoIG9mIHRoZSBnaXZlbiBw YWdlJ3MgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3dyaXRlKHZtX3BhZ2VfdCBt KQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJdm1fb2Zmc2V0X3QgdmE7CisJcHZfZW50cnlf dCBuZXh0X3B2OworCWludCBwdmhfZ2VuOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sg KmxvY2s7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXB2 X2VudHJ5X3QgcHY7CisJaW50IG1kX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19V Tk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9yZW1vdmVfd3JpdGU6IHBhZ2UgJXAgaXMgbm90 IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBleGNsdXNpdmUg YnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJlCisJICogc2V0IGJ5IGFub3RoZXIg dGhyZWFkIHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywKKwkgKiBpZiBQR0FfV1JJ VEVBQkxFIGlzIGNsZWFyLCBubyBwYWdlIHRhYmxlIGVudHJpZXMgbmVlZCB1cGRhdGluZy4KKwkg Ki8KKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2Vf eGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJu OworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RPX1BWX0xJ U1RfTE9DSyhtKTsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKK3JldHJ5 X3B2X2xvb3A6CisJcndfd2xvY2sobG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElP VVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFwcGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2 LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBuZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2 KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7 CisJCQl9CisJCX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZh KTsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSAmJiAhcGRlX3Rlc3QocGRlLCBQVEVf Uk8pKQorCQkJKHZvaWQpcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9j ayk7CisJCUtBU1NFUlQobG9jayA9PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKSwKKwkJICAg ICgiaW5jb25zaXN0ZW50IHB2IGxvY2sgJXAgJXAgZm9yIHBhZ2UgJXAiLAorCQkgICAgbG9jaywg Vk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSksIG0pKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJ fQorc21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2 X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFw KSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2Vu OworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2Nr KGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJCSAgICBtZF9nZW4g IT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJcndfd3VubG9j ayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7CisJCQl9CisJCX0KKwkJcGRlID0gcG1h cF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUp LAorCQkgICAgKCIlczogZm91bmQgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAor CQkgICAgX19mdW5jX18sIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2 X3ZhKTsKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfaXNfdmFsaWQocHRlKSwKKwkJICAg ICgiJXM6cGFnZSBvbiBwdl9saXN0IGhhcyBubyBwdGUiLCBfX2Z1bmNfXykpOworcmV0cnk6CisJ CW9sZHB0ZSA9ICpwdGU7CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJ aWYgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsCisJCQkgICAgKChvbGRwdGUgJiB+ UFRFX0QpIHwgUFRFX1JPKSkpCisJCQkJZ290byByZXRyeTsKKwkJCWlmIChwdGVfdGVzdCgmb2xk cHRlLCBQVEVfRCkpCisJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9w YWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXZt X3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jayhsb2NrKTsK Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisjZGVmaW5lCVBNQVBfVFNfUkVG RVJFTkNFRF9NQVgJNQorCisvKi0KKyAqCXBtYXBfdHNfcmVmZXJlbmNlZDoKKyAqCisgKiAgUmV0 dXJuIGEgY291bnQgb2YgcGFnZXMgdGhhdCBoYXZlIGJlZW4gcmVmZXJlbmNlZCwgYW5kIHJlc2V0 IHRoZQorICogIHJlZmVyZW5jZSBiaXQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBldmVyeSBy ZWZlcmVuY2UgYml0IHRvIGJlCisgKiAgcmVzZXQsIGJ1dCBpdCBpcyBuZWNlc3NhcnkgdGhhdCAw IG9ubHkgYmUgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUKKyAqICB0cnVseSBoYXZlIGJlZW4gcGFn ZXMgcmVmZXJlbmNlZC4KKyAqCisgKiAgWFhYOiBUaGUgZXhhY3QgbnVtYmVyIG9mIGZsYWdzIHRv IGNoZWNrIGFuZCByZXNldCBpcyBhIG1hdHRlciB0aGF0CisgKiAgc2hvdWxkIGJlIHRlc3RlZCBh bmQgc3RhbmRhcmRpemVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBmb3IKKyAqICBvcHRp bWFsIGFnaW5nIG9mIHNoYXJlZCBwYWdlcy4KKyAqLworaW50CitwbWFwX3RzX3JlZmVyZW5jZWQo dm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2LCBw dmY7CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGE7 CisJaW50IGNsZWFyZWQsIG1kX2dlbiwgbm90X2NsZWFyZWQsIHB2aF9nZW47CisKKwlLQVNTRVJU KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfdHNfcmVmZXJl bmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwljbGVhcmVkID0gMDsKKwlwYSA9 IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlsb2NrID0gUEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwor CXB2aCA9IHBhX3RvX3B2aChwYSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcndf d2xvY2sobG9jayk7CityZXRyeToKKwlub3RfY2xlYXJlZCA9IDA7CisJaWYgKChtLT5mbGFncyAm IFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkgICAgKHB2ZiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2 X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2ID0gcHZmOworCWRv IHsKKwkJaWYgKHB2ZiA9PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2 KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsK KwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV9pc19yZWYoKHB0 X2VudHJ5X3QgKilwZGUpKSB7CisJCQkvKgorCQkJICogU2luY2UgdGhpcyByZWZlcmVuY2UgYml0 IGlzIHNoYXJlZCBieSA1MTIgNEtCCisJCQkgKiBwYWdlcywgaXQgc2hvdWxkIG5vdCBiZSBjbGVh cmVkIGV2ZXJ5IHRpbWUgaXQgaXMKKwkJCSAqIHRlc3RlZC4gIEFwcGx5IGEgc2ltcGxlICJoYXNo IiBmdW5jdGlvbiBvbiB0aGUKKwkJCSAqIHBoeXNpY2FsIHBhZ2UgbnVtYmVyLCB0aGUgdmlydHVh bCBzdXBlcnBhZ2UgbnVtYmVyLAorCQkJICogYW5kIHRoZSBwbWFwIGFkZHJlc3MgdG8gc2VsZWN0 IG9uZSA0S0IgcGFnZSBvdXQgb2YKKwkJCSAqIHRoZSA1MTIgb24gd2hpY2ggdGVzdGluZyB0aGUg cmVmZXJlbmNlIGJpdCB3aWxsCisJCQkgKiByZXN1bHQgaW4gY2xlYXJpbmcgdGhhdCByZWZlcmVu Y2UgYml0LiAgVGhpcworCQkJICogZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYXZvaWQgdGhlIHNl bGVjdGlvbiBvZiB0aGUKKwkJCSAqIHNhbWUgNEtCIHBhZ2UgZm9yIGV2ZXJ5IDJNQiBwYWdlIG1h cHBpbmcuCisJCQkgKgorCQkJICogT24gZGVtb3Rpb24sIGEgbWFwcGluZyB0aGF0IGhhc24ndCBi ZWVuIHJlZmVyZW5jZWQKKwkJCSAqIGlzIHNpbXBseSBkZXN0cm95ZWQuICBUbyBhdm9pZCB0aGUg cG9zc2liaWxpdHkgb2YgYQorCQkJICogc3Vic2VxdWVudCBwYWdlIGZhdWx0IG9uIGEgZGVtb3Rl ZCB3aXJlZCBtYXBwaW5nLAorCQkJICogYWx3YXlzIGxlYXZlIGl0cyByZWZlcmVuY2UgYml0IHNl dC4gIE1vcmVvdmVyLAorCQkJICogc2luY2UgdGhlIHN1cGVycGFnZSBpcyB3aXJlZCwgdGhlIGN1 cnJlbnQgc3RhdGUgb2YKKwkJCSAqIGl0cyByZWZlcmVuY2UgYml0IHdvbid0IGFmZmVjdCBwYWdl IHJlcGxhY2VtZW50LgorCQkJICovCisJCQlpZiAoKCgocGEgPj4gUEFHRV9TSElGVCkgXiAocHYt PnB2X3ZhID4+IFBEUlNISUZUKSBeCisJCQkgICAgKHVpbnRwdHJfdClwbWFwKSAmIChOUFRFUEcg LSAxKSkgPT0gMCAmJgorCQkJICAgICFwZGVfdGVzdChwZGUsIFBURV9XKSkgeworCQkJCWF0b21p Y19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCWNsZWFyZWQrKzsKKwkJCX0gZWxzZQor CQkJCW5vdF9jbGVhcmVkKys7CisKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyogUm90 YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlpZiAo cHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlUQUlM UV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RB SUwoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQl9CisJCWlmICgoY2xlYXJlZCArIG5v dF9jbGVhcmVkKSA+PSBQTUFQX1RTX1JFRkVSRU5DRURfTUFYKQorCQkJZ290byBvdXQ7CisJfSB3 aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpICE9IHB2Zik7CitzbWFsbF9t YXBwaW5nczoKKwlpZiAoKHB2ZiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgPT0gTlVM TCkKKwkJZ290byBvdXQ7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZf Z2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3ds b2NrKGxvY2spOworCQkJaWYgKAorCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJ CSAgICBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJ CQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5w dl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwKKwkJICAgICgicG1hcF90 c19yZWZlcmVuY2VkOiBmb3VuZCBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAorCQkg ICAgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlpZiAo cHRlX2lzX3JlZihwdGUpKSB7CisJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBk ZSwgUFRFX1JFRik7CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOwor CQkJY2xlYXJlZCsrOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhl IFBWIGxpc3QgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBO VUxMICYmIFRBSUxRX05FWFQocHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9W RSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCW0tPm1kLnB2X2dlbisrOworCQl9CisJfSB3 aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSAhPSBwdmYgJiYgY2xlYXJl ZCArCisJICAgIG5vdF9jbGVhcmVkIDwgUE1BUF9UU19SRUZFUkVOQ0VEX01BWCk7CitvdXQ6CisJ cndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy biAoY2xlYXJlZCArIG5vdF9jbGVhcmVkKTsKK30KKworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9w YWdlX3Rlc3RfbWFwcGluZ3Modm1fcGFnZV90IG0sIGJvb2xlYW5fdCBhY2Nlc3NlZCwgYm9vbGVh bl90IG1vZGlmaWVkKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwbWFwX3QgcG1hcDsK KwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwlUQUlMUV9GT1JFQUNIKHB2LCAm bS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICgh UE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkgbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJIHJ3 X3J1bmxvY2sobG9jayk7CisJCQkgUE1BUF9MT0NLKHBtYXApOworCQkJIHJ3X3Jsb2NrKGxvY2sp OworCQkJIGlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJIFBNQVBfVU5MT0NLKHBt YXApOworCQkJCSBnb3RvIHJlc3RhcnQ7CisJCQkgfQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBt YXAsIHB2LT5wdl92YSk7CisJCWlmIChtb2RpZmllZCkgeworCQkJcnYgPSBwdGVfdGVzdChwdGUs IFBURV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJaWYgKGFjY2Vzc2VkKQorCQkJ CXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9IGVs c2UgaWYgKGFjY2Vzc2VkKSB7CisJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19y ZWYocHRlKTsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJaWYgKHJ2KQorCQkJZ290byBv dXQ7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9 IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZo LT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChwdik7CisJCQlpZiAoIVBN QVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCQlwdmhf Z2VuID0gcHZoLT5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQTUFQX0xPQ0so cG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9n ZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQTUFQX1VOTE9D SyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXB0ZSA9IChwdF9l bnRyeV90ICopcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChtb2RpZmllZCkgewor CQkJCXJ2ID0gcHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCQkgICAgIXB0ZV90ZXN0KHB0ZSwg UFRFX1JPKTsKKwkJCQlpZiAoYWNjZXNzZWQpCisJCQkJCXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlk KHB0ZSkgJiYKKwkJCQkJICAgIHB0ZV9pc19yZWYocHRlKTsKKwkJCX0gZWxzZSBpZiAoYWNjZXNz ZWQpIHsKKwkJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmCisJCQkJICAgIHB0ZV9pc19yZWYo cHRlKTsKKwkJCX0KKwkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJaWYgKHJ2KQorCQkJCWdvdG8g b3V0OworCQl9CisJfQorb3V0OgorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworCisvKgorICoJcG1hcF9pc19tb2Rp ZmllZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwaHlzaWNh bCBwYWdlIHdhcyBtb2RpZmllZAorICoJaW4gYW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xl YW5fdAorcG1hcF9pc19tb2RpZmllZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19tb2RpZmllZDogcGFn ZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90 IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUKKwkgKiBjb25j dXJyZW50bHkgc2V0IHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywgaWYgUEdBX1dS SVRFQUJMRQorCSAqIGlzIGNsZWFyLCBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKi8K KwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2VfeGJ1 c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuIChG QUxTRSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBGQUxTRSwgVFJVRSkp OworfQorCisvKgorICoJcG1hcF9pc19wcmVmYXVsdGFibGU6CisgKgorICoJUmV0dXJuIHdoZXRo ZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGlzIGVsZ2libGUKKyAqCWZv ciBwcmVmYXVsdC4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgYWRkcikKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlf dCAqcHRlOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJUE1BUF9MT0NLKHBtYXAp OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGUgIT0gTlVMTCAmJiAqcGRl ICE9IDApIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJCXB0ZSA9IChwdF9l bnRyeV90ICopcGRlOworCQllbHNlCisJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBhZGRy KTsKKwkJcnYgPSAoKnB0ZSA9PSAwKSB8fCAoKnB0ZSA9PSBQVEVfRyk7CisJfQorCVBNQVBfVU5M T0NLKHBtYXApOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9pc19yZWZlcmVuY2Vk OgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBh Z2Ugd2FzIHJlZmVyZW5jZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgorICovCitib29sZWFu X3QKK3BtYXBfaXNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19yZWZlcmVuY2VkOiBw YWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFw cGluZ3MobSwgVFJVRSwgRkFMU0UpKTsKK30KKworLyoKKyAqCUFwcGx5IHRoZSBnaXZlbiBhZHZp Y2UgdG8gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBhZGRyZXNzZXMgd2l0aGluIHRoZQorICoJZ2l2 ZW4gcG1hcC4gIERlcGVuZGluZyBvbiB0aGUgYWR2aWNlLCBjbGVhciB0aGUgcmVmZXJlbmNlZCBh bmQvb3IKKyAqCW1vZGlmaWVkIGZsYWdzIGluIGVhY2ggbWFwcGluZyBhbmQgc2V0IHRoZSBtYXBw ZWQgcGFnZSdzIGRpcnR5IGZpZWxkLgorICovCit2b2lkCitwbWFwX2FkdmlzZShwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEsIGludCBhZHZpY2UpCit7CisJc3Ry dWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlLCBvbGRwZGU7CisJcHRf ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJdm1fcGFnZV90IG07CisJYm9v bGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3RzX2xvY2tlZDsKKworCWlmIChhZHZpY2UgIT0gTUFE Vl9ET05UTkVFRCAmJiBhZHZpY2UgIT0gTUFEVl9GUkVFKQorCQlyZXR1cm47CisKKwlwdl9saXN0 c19sb2NrZWQgPSBGQUxTRTsKK3Jlc3VtZToKKwlhbnljaGFuZ2VkID0gRkFMU0U7CisJUE1BUF9M T0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJcGRwZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0 ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25leHQgPSAoc3ZhICsgTkJQ RFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsK KworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCW9sZHBkZSA9ICpwZGU7 CisJCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IDApCisJCQljb250aW51ZTsKKwkJZWxzZSBp ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUs IFBURV9NQU5BR0VEKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7 CisJCQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZo X2dsb2JhbF9sb2NrKSkgeworCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlyd19ybG9jaygm cHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJZ290byByZXN1bWU7CisJCQkJfQorCQkJfQorCQkJbG9j ayA9IE5VTEw7CisJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRlLCBzdmEs ICZsb2NrKSkgeworCQkJCWlmIChsb2NrICE9IE5VTEwpCisJCQkJCXJ3X3d1bmxvY2sobG9jayk7 CisKKwkJCQkvKgorCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLgor CQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogVW5sZXNzIHRoZSBw YWdlIG1hcHBpbmdzIGFyZSB3aXJlZCwgcmVtb3ZlIHRoZQorCQkJICogbWFwcGluZyB0byBhIHNp bmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkgKiBhY2Nlc3MgbWF5IHJlcHJvbW90 ZS4gIFNpbmNlIHRoZSB1bmRlcmx5aW5nIHBhZ2UKKwkJCSAqIHRhYmxlIHBhZ2UgaXMgZnVsbHkg cG9wdWxhdGVkLCB0aGlzIHJlbW92YWwgbmV2ZXIKKwkJCSAqIGZyZWVzIGEgcGFnZSB0YWJsZSBw YWdlLgorCQkJICovCisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7CisJCQkJS0FTU0VSVChwdGVfdGVzdChwdGUs IFBURV9WQUxJRCksCisJCQkJICAgICgicG1hcF9hZHZpc2U6IGludmFsaWQgUFRFIikpOworCQkJ CXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgKnBkZSwgTlVMTCwKKwkJCQkgICAgJmxv Y2spOworCQkJCWFueWNoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJaWYgKGxvY2sgIT0gTlVMTCkK KwkJCQlyd193dW5sb2NrKGxvY2spOworCQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRv IGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVu dCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5n IHdyaXRlIHByb3RlY3RlZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4 dCA9IGV2YTsKKworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAh PSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKKwkJCWlmICghcHRl X2lzX3ZhbGlkKHB0ZSkgfHwgIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp bnVlOworCQkJZWxzZSBpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcHRlX3Rl c3QocHRlLCBQVEVfUk8pKSB7CisJCQkJaWYgKGFkdmljZSA9PSBNQURWX0RPTlRORUVEKSB7CisJ CQkJCS8qCisJCQkJCSAqIEZ1dHVyZSBjYWxscyB0byBwbWFwX2lzX21vZGlmaWVkKCkKKwkJCQkJ ICogY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIHRoZSBwYWdlCisJCQkJCSAqIGRpcnR5IG5vdy4K KwkJCQkJICovCisJCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBUTEJMT19QVEVf VE9fUEEoKnB0ZSkpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlwdGVfYXRv bWljX2NsZWFyKHB0ZSwgUFRFX0QgfCBQVEVfUkVGKTsKKwkJCX0gZWxzZSBpZiAocHRlX2lzX3Jl ZihwdGUpKQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfUkVGKTsKKwkJCWVsc2UKKwkJ CQljb250aW51ZTsKKwkJCWlmIChwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQkJZWxzZQorCQkJCWFueWNoYW5nZWQgPSBUUlVFOwor CQl9CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOwor CWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsK Kwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKglDbGVhciB0aGUgbW9kaWZ5IGJp dHMgb24gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBwYWdlLgorICovCit2b2lkCitwbWFwX2NsZWFy X21vZGlmeSh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXBtYXBfdCBw bWFwOworCXB2X2VudHJ5X3QgbmV4dF9wdiwgcHY7CisJcGRfZW50cnlfdCBvbGRwZGUsICpwZGU7 CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2bV9v ZmZzZXRfdCB2YTsKKwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCisJS0FTU0VSVCgobS0+b2ZsYWdz ICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAl cCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2Jq ZWN0KTsKKwlLQVNTRVJUKCF2bV9wYWdlX3hidXNpZWQobSksCisJICAgICgicG1hcF9jbGVhcl9t b2RpZnk6IHBhZ2UgJXAgaXMgZXhjbHVzaXZlIGJ1c2llZCIsIG0pKTsKKworCS8qCisJICogSWYg dGhlIHBhZ2UgaXMgbm90IFBHQV9XUklURUFCTEUsIHRoZW4gbm8gUFRFcyBjYW4gaGF2ZSBQVEVf RCBzZXQuCisJICogSWYgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwYWdlIGlzIGxvY2tlZCBh bmQgdGhlIHBhZ2UgaXMgbm90CisJICogd3JpdGUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUg Y2Fubm90IGJlIGNvbmN1cnJlbnRseSBzZXQuCisJICovCisJaWYgKChtLT5hZmxhZ3MgJiBQR0Ff V1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0Vf VE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3dsb2NrKGxvY2spOworcmVzdGFydDoKKwlpZiAoKG0t PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlU QUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQsIG5leHRfcHYpIHsK KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ cHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9D SyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9n ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJ CX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJb2xk cGRlID0gKnBkZTsKKwkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9STykpIHsKKwkJCWlmIChwbWFw X2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKSkgeworCQkJCWlmICghcGRl X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJCS8qCisJCQkJCSAqIFdyaXRlIHByb3RlY3Qg dGhlIG1hcHBpbmcgdG8gYQorCQkJCQkgKiBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVu dAorCQkJCQkgKiB3cml0ZSBhY2Nlc3MgbWF5IHJlcHJvbW90ZS4KKwkJCQkJICovCisJCQkJCXZh ICs9IFZNX1BBR0VfVE9fUEhZUyhtKSAtCisJCQkJCSAgIFRMQkxPX1BERV9UT19QQShvbGRwZGUp OworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJCW9sZHB0ZSA9ICpw dGU7CisJCQkJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1ZBTElEKSkgeworCQkJCQkJd2hp bGUgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLAorCQkJCQkJICAgIG9sZHB0ZSwKKwkJCQkJCSAg ICAob2xkcHRlICYgflBURV9EKSB8IFBURV9STykpCisJCQkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJ CQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2 YSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQor c21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l eHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkg eworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOwor CQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxv Y2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4gfHwgbWRfZ2VuICE9IG0tPm1kLnB2 X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0K KwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVf aXNfc3VwZXJwYWdlKHBkZSksICgicG1hcF9jbGVhcl9tb2RpZnk6IGZvdW5kIgorCQkgICAgIiBh IHN1cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVf dG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFw dGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCk7 CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBf VU5MT0NLKHBtYXApOworCX0KKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9n bG9iYWxfbG9jayk7Cit9CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN1cHBvcnQgcm91dGluZXMg Zm9sbG93CisgKi8KKworLyoKKyAqIE1hcCBhIHNldCBvZiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMg aW50byB0aGUga2VybmVsIHZpcnR1YWwKKyAqIGFkZHJlc3Mgc3BhY2UuIFJldHVybiBhIHBvaW50 ZXIgdG8gd2hlcmUgaXQgaXMgbWFwcGVkLiBUaGlzCisgKiByb3V0aW5lIGlzIGludGVuZGVkIHRv IGJlIHVzZWQgZm9yIG1hcHBpbmcgZGV2aWNlIG1lbW9yeSwKKyAqIE5PVCByZWFsIG1lbW9yeS4K KyAqCisgKiBVc2UgWEtQSFlTIHVuY2FjaGVkIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQgKgorcG1h cF9tYXBkZXYodm1fcGFkZHJfdCBwYSwgdm1fc2l6ZV90IHNpemUpCit7CisKKwlyZXR1cm4gKCh2 b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVF9VTkNBQ0hFRChwYSkpOworfQorCit2b2lkCitwbWFw X3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKworCS8qIE5vdGhp bmcgdG8gZG8gZm9yIG1pcHM2NC4gKi8KK30KKworLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRy aWJ1dGUgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZS4KKyAqLwordm9pZAorcG1hcF9wYWdlX3NldF9t ZW1hdHRyKHZtX3BhZ2VfdCBtLCB2bV9tZW1hdHRyX3QgbWEpCit7CisJLyoKKwkgKiBTZXQgdGhl IG1lbWF0dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkg KiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9 IG1hOworCisJLyoKKwkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5 IGNhbGxlZCBiZWZvcmUgYW55IG1hcHBpbmdzCisJICogYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhp cyBpcyBub3QgdGhlIGNhc2UgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKKwkgKiBuZWVkIHRvIHdh bGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkg KiB1bmNhY2hlYWJsZSwgc3luYyB0aGUgY2FjaGUgKHdpdGggbWlwc19pY2FjaGVfc3luY19hbGwo KSBhbmQKKwkgKiBtaXBzX2RjYWNoZV93Ymludl9hbGwoKSkgYW5kIG1vc3QgbGlrZWx5IGludmFs aWRhdGUgVExCIGVudHJpZXMgZm9yCisJICogYW55IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0 IG1vZGlmaWVzLgorCSAqLworCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgIT0gTlVM TCkKKwkJcGFuaWMoIkNhbid0IGNoYW5nZSBtZW1hdHRyIG9uIHBhZ2Ugd2l0aCBleGlzdGluZyBt YXBwaW5ncyIpOworfQorCisvKgorICogcGVyZm9ybSB0aGUgcG1hcCB3b3JrIGZvciBtaW5jb3Jl CisgKi8KK2ludAorcG1hcF9taW5jb3JlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyLCB2 bV9wYWRkcl90ICpsb2NrZWRfcGEpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9lbnRyeV90 ICpwdGVwLCBwdGU7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgdmFsOworCisJUE1BUF9MT0NLKHBt YXApOworcmV0cnk6CisJcGRlcCA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGVwICE9 IE5VTEwpIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCXB0ZSA9IChw dF9lbnRyeV90KSpwZGVwOworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9 IE1JTkNPUkVfU1VQRVI7CisJCX0gZWxzZSB7CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBk ZXAsIGFkZHIpOworCQkJcHRlID0gKHB0ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7CisJCQlwYSA9 IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXB0 ZSA9IDA7CisJCXBhID0gMDsKKwkJdmFsID0gMDsKKwl9CisJaWYgKHB0ZV9pc192YWxpZCgmcHRl KSkgeworCQl2YWwgfD0gTUlOQ09SRV9JTkNPUkU7CisJCWlmIChwdGVfdGVzdCgmcHRlLCBQVEVf RCkpCisJCQl2YWwgfD0gTUlOQ09SRV9NT0RJRklFRCB8IE1JTkNPUkVfTU9ESUZJRURfT1RIRVI7 CisJCWlmIChwdGVfaXNfcmVmKCZwdGUpKQorCQkJdmFsIHw9IE1JTkNPUkVfUkVGRVJFTkNFRCB8 IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUjsKKwl9CisJaWYgKCh2YWwgJiAoTUlOQ09SRV9NT0RJ RklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikpICE9CisJICAgIChNSU5DT1JF X01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVSKSAmJgorCSAgICBwdGVf dGVzdCgmcHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJLyogRW5zdXJlIHRoYXQgIlBIWVNfVE9fVk1f UEFHRShwYSktPm9iamVjdCIgZG9lc24ndCBjaGFuZ2UuICovCisJCWlmICh2bV9wYWdlX3BhX3Ry eXJlbG9jayhwbWFwLCBwYSwgbG9ja2VkX3BhKSkKKwkJCWdvdG8gcmV0cnk7CisJfSBlbHNlCisJ CVBBX1VOTE9DS19DT05EKCpsb2NrZWRfcGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVy biAodmFsKTsKK30KKwordm9pZAorcG1hcF9hY3RpdmF0ZShzdHJ1Y3QgdGhyZWFkICp0ZCkKK3sK KwlwbWFwX3QgcG1hcCwgb2xkcG1hcDsKKwlzdHJ1Y3QgcHJvYyAqcCA9IHRkLT50ZF9wcm9jOwor CXVfaW50IGNwdWlkOworCisJY3JpdGljYWxfZW50ZXIoKTsKKworCXBtYXAgPSB2bXNwYWNlX3Bt YXAocC0+cF92bXNwYWNlKTsKKwlvbGRwbWFwID0gUENQVV9HRVQoY3VycG1hcCk7CisJY3B1aWQg PSBQQ1BVX0dFVChjcHVpZCk7CisKKwlpZiAob2xkcG1hcCkKKwkJQ1BVX0NMUl9BVE9NSUMoY3B1 aWQsICZvbGRwbWFwLT5wbV9hY3RpdmUpOworCUNQVV9TRVRfQVRPTUlDKGNwdWlkLCAmcG1hcC0+ cG1fYWN0aXZlKTsKKwlwbWFwX2FzaWRfYWxsb2MocG1hcCk7CisJaWYgKHRkID09IGN1cnRocmVh ZCkgeworCQlQQ1BVX1NFVChzZWdiYXNlLCBwbWFwLT5wbV9zZWd0YWIpOworCQltaXBzX3dyX2Vu dHJ5aGkocG1hcC0+cG1fYXNpZFtjcHVpZF0uYXNpZCk7CisJfQorCisJUENQVV9TRVQoY3VycG1h cCwgcG1hcCk7CisJY3JpdGljYWxfZXhpdCgpOworfQorCit2b2lkCitwbWFwX3N5bmNfaWNhY2hl KHBtYXBfdCBwbSwgdm1fb2Zmc2V0X3QgdmEsIHZtX3NpemVfdCBzeikKK3sKK30KKworLyoKKyAq CUluY3JlYXNlIHRoZSBzdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIG1hcHBp bmcgaWYgYQorICoJZGlmZmVyZW50IGFsaWdubWVudCBtaWdodCByZXN1bHQgaW4gbW9yZSBzdXBl cnBhZ2UgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfYWxpZ25fc3VwZXJwYWdlKHZtX29iamVj dF90IG9iamVjdCwgdm1fb29mZnNldF90IG9mZnNldCwKKyAgICB2bV9vZmZzZXRfdCAqYWRkciwg dm1fc2l6ZV90IHNpemUpCit7CisJdm1fb2Zmc2V0X3Qgc3VwZXJwYWdlX29mZnNldDsKKworCWlm IChzaXplIDwgTkJTRUcpCisJCXJldHVybjsKKwlpZiAob2JqZWN0ICE9IE5VTEwgJiYgKG9iamVj dC0+ZmxhZ3MgJiBPQkpfQ09MT1JFRCkgIT0gMCkKKwkJb2Zmc2V0ICs9IHB0b2Eob2JqZWN0LT5w Z19jb2xvcik7CisJc3VwZXJwYWdlX29mZnNldCA9IG9mZnNldCAmIFNFR01BU0s7CisJaWYgKHNp emUgLSAoKE5CU0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdNQVNLKSA8IE5CU0VHIHx8CisJ ICAgICgqYWRkciAmIFNFR01BU0spID09IHN1cGVycGFnZV9vZmZzZXQpCisJCXJldHVybjsKKwlp ZiAoKCphZGRyICYgU0VHTUFTSykgPCBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQkqYWRkciA9ICgqYWRk ciAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7CisJZWxzZQorCQkqYWRkciA9ICgoKmFk ZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7Cit9CisKKyNpZmRl ZiBEREIKK0RCX1NIT1dfQ09NTUFORChwdGFibGUsIGRkYl9waWRfZHVtcCkKK3sKKwlwbWFwX3Qg cG1hcDsKKwlzdHJ1Y3QgdGhyZWFkICp0ZCA9IE5VTEw7CisJc3RydWN0IHByb2MgKnA7CisJaW50 IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCWlmIChoYXZl X2FkZHIpIHsKKwkJdGQgPSBkYl9sb29rdXBfdGhyZWFkKGFkZHIsIFRSVUUpOworCQlpZiAodGQg PT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJJbnZhbGlkIHBpZCBvciB0aWQiKTsKKwkJCXJldHVy bjsKKwkJfQorCQlwID0gdGQtPnRkX3Byb2M7CisJCWlmIChwLT5wX3Ztc3BhY2UgPT0gTlVMTCkg eworCQkJZGJfcHJpbnRmKCJObyB2bXNwYWNlIGZvciBwcm9jZXNzIik7CisJCQlyZXR1cm47CisJ CX0KKwkJCXBtYXAgPSB2bXNwYWNlX3BtYXAocC0+cF92bXNwYWNlKTsKKwl9IGVsc2UKKwkJcG1h cCA9IGtlcm5lbF9wbWFwOworCisJZGJfcHJpbnRmKCJwbWFwOiVwIHNlZ3RhYjolcCBhc2lkOiV4 IGdlbmVyYXRpb246JXhcbiIsCisJICAgIHBtYXAsIHBtYXAtPnBtX3NlZ3RhYiwgcG1hcC0+cG1f YXNpZFswXS5hc2lkLAorCSAgICBwbWFwLT5wbV9hc2lkWzBdLmdlbik7CisJZm9yIChpID0gMDsg aSA8IE5QREVQRzsgaSsrKSB7CisJCXBkX2VudHJ5X3QgKnBkcGU7CisJCXB0X2VudHJ5X3QgKnBk ZTsKKwkJcHRfZW50cnlfdCBwdGU7CisKKwkJcGRwZSA9IChwZF9lbnRyeV90ICopcG1hcC0+cG1f c2VndGFiW2ldOworCQlpZiAocGRwZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRiX3ByaW50 ZigiWyU0ZF0gJXBcbiIsIGksIHBkcGUpOworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHOyBqKysp IHsKKwkJCXBkZSA9IChwdF9lbnRyeV90ICopcGRwZVtqXTsKKwkJCWlmIChwZGUgPT0gTlVMTCkK KwkJCQljb250aW51ZTsKKwkJCWRiX3ByaW50ZigiXHRbJTRkXSAlcFxuIiwgaiwgcGRlKTsKKwkJ CWZvciAoayA9IDA7IGsgPCBOUFRFUEc7IGsrKykgeworCQkJCXB0ZSA9IHBkZVtrXTsKKwkJCQlp ZiAocHRlID09IDAgfHwgIXB0ZV9pc192YWxpZCgmcHRlKSkKKwkJCQkJY29udGludWU7CisJCQkJ cGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJ RlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFHRV9TSElGVCk7CisJCQkJZGJfcHJpbnRm KCJcdFx0WyUwNGRdIHZhOiAlcCBwdGU6ICU4anggcGE6JWp4XG4iLAorCQkJCSAgICAgICBrLCAo dm9pZCAqKXZhLCAodWludG1heF90KXB0ZSwgKHVpbnRtYXhfdClwYSk7CisJCQl9CisJCX0KKwl9 Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpCisKK3N0YXRpYyB2b2lkIHBhZHMocG1h cF90IHBtKTsKK3ZvaWQgcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3QgcGEpOworCisvKiBwcmludCBh ZGRyZXNzIHNwYWNlIG9mIHBtYXAqLworc3RhdGljIHZvaWQKK3BhZHMocG1hcF90IHBtKQorewor CXVuc2lnbmVkIHZhLCBpLCBqOworCXB0X2VudHJ5X3QgKnB0ZXA7CisKKwlpZiAocG0gPT0ga2Vy bmVsX3BtYXApCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspCisJCWlm IChwbS0+cG1fc2VndGFiW2ldKQorCQkJZm9yIChqID0gMDsgaiA8IE5QVEVQRzsgaisrKSB7CisJ CQkJdmEgPSAoaSA8PCBTRUdTSElGVCkgKyAoaiA8PCBQQUdFX1NISUZUKTsKKwkJCQlpZiAocG0g PT0ga2VybmVsX3BtYXAgJiYgdmEgPCBLRVJOQkFTRSkKKwkJCQkJY29udGludWU7CisJCQkJaWYg KHBtICE9IGtlcm5lbF9wbWFwICYmCisJCQkJICAgIHZhID49IFZNX01BWFVTRVJfQUREUkVTUykK KwkJCQkJY29udGludWU7CisJCQkJcHRlcCA9IHBtYXBfcHRlKHBtLCB2YSk7CisJCQkJaWYgKHB0 ZV9pc192YWxpZChwdGVwKSkKKwkJCQkJcHJpbnRmKCIleDoleCAiLCB2YSwgKihpbnQgKilwdGVw KTsKKwkJCX0KKworfQorCit2b2lkCitwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSkKK3sKKwly ZWdpc3RlciBwdl9lbnRyeV90IHB2OworCXZtX3BhZ2VfdCBtOworCisJcHJpbnRmKCJwYSAleCIs IHBhKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklSU1Qo Jm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSkg eworCQlwcmludGYoIiAtPiBwbWFwICVwLCB2YSAleCIsICh2b2lkICopcHYtPnB2X3BtYXAsIHB2 LT5wdl92YSk7CisJCXBhZHMocHYtPnB2X3BtYXApOworCX0KKwlwcmludGYoIiAiKTsKK30KKwor LyogTi9DICovCisjZW5kaWYKKworCisvKgorICogQWxsb2NhdGUgVExCIGFkZHJlc3Mgc3BhY2Ug dGFnIChjYWxsZWQgQVNJRCBvciBUTEJQSUQpIGFuZCByZXR1cm4gaXQuCisgKiBJdCB0YWtlcyBh bG1vc3QgYXMgbXVjaCBvciBtb3JlIHRpbWUgdG8gc2VhcmNoIHRoZSBUTEIgZm9yIGEKKyAqIHNw ZWNpZmljIEFTSUQgYW5kIGZsdXNoIHRob3NlIGVudHJpZXMgYXMgaXQgZG9lcyB0byBmbHVzaCB0 aGUgZW50aXJlIFRMQi4KKyAqIFRoZXJlZm9yZSwgd2hlbiB3ZSBhbGxvY2F0ZSBhIG5ldyBBU0lE LCB3ZSBqdXN0IHRha2UgdGhlIG5leHQgbnVtYmVyLiBXaGVuCisgKiB3ZSBydW4gb3V0IG9mIG51 bWJlcnMsIHdlIGZsdXNoIHRoZSBUTEIsIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBjb3VudAor ICogYW5kIHN0YXJ0IG92ZXIuIEFTSUQgemVybyBpcyByZXNlcnZlZCBmb3Iga2VybmVsIHVzZS4K KyAqLworc3RhdGljIHZvaWQKK3BtYXBfYXNpZF9hbGxvYyhwbWFwKQorCXBtYXBfdCBwbWFwOwor eworCWlmIChwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCAhPSBQTUFQX0FTSURf UkVTRVJWRUQgJiYKKwkgICAgcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9PSBQ Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pKTsKKwllbHNlIHsKKwkJaWYgKFBDUFVfR0VUKG5leHRf YXNpZCkgPT0gcG1hcF9tYXhfYXNpZCkgeworCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIoTlVM TCk7CisJCQlQQ1BVX1NFVChhc2lkX2dlbmVyYXRpb24sCisJCQkgICAgKFBDUFVfR0VUKGFzaWRf Z2VuZXJhdGlvbikgKyAxKSAmIEFTSURHRU5fTUFTSyk7CisJCQlpZiAoUENQVV9HRVQoYXNpZF9n ZW5lcmF0aW9uKSA9PSAwKSB7CisJCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLCAxKTsKKwkJ CX0KKwkJCVBDUFVfU0VUKG5leHRfYXNpZCwgMSk7CS8qIDAgbWVhbnMgaW52YWxpZCAqLworCQl9 CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkID0gUENQVV9HRVQobmV4dF9h c2lkKTsKKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IFBDUFVfR0VUKGFz aWRfZ2VuZXJhdGlvbik7CisJCVBDUFVfU0VUKG5leHRfYXNpZCwgUENQVV9HRVQobmV4dF9hc2lk KSArIDEpOworCX0KK30KKworc3RhdGljIHB0X2VudHJ5X3QKK2luaXRfcHRlX3Byb3Qodm1fcGFn ZV90IG0sIHZtX3Byb3RfdCBhY2Nlc3MsIHZtX3Byb3RfdCBwcm90KQoreworCXB0X2VudHJ5X3Qg cnc7CisKKwlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCisJCXJ3ID0gUFRFX1ZBTElEIHwg UFRFX1JPOworCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJ CWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkKKwkJCXJ3ID0gUFRFX1ZBTElEIHwg UFRFX0Q7CisJCWVsc2UKKwkJCXJ3ID0gUFRFX1ZBTElEOworCX0gZWxzZSB7CisJCS8qCisJCSAq IE5lZWRuJ3QgZW11bGF0ZSBhIHJlZmVyZW5jZS9tb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZAor CQkgKiBwYWdlcy4KKwkJICovCisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CisJCXB0ZV9yZWZf c2V0KCZydyk7CisJfQorCisJcmV0dXJuIChydyk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVf bW9kaWZpZWQgOiBkbyBkaXJ0eSBiaXQgZW11bGF0aW9uCisgKgorICogT24gU01QLCB1cGRhdGUg anVzdCB0aGUgbG9jYWwgVExCLCBvdGhlciBDUFVzIHdpbGwgdXBkYXRlIHRoZWlyCisgKiBUTEJz IGZyb20gUFRFIGxhemlseSwgaWYgdGhleSBnZXQgdGhlIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMg MCBpbiBjYXNlIG9mIHN1Y2VzcywgMSBpZiB0aGUgcGFnZSBpcyByZWFkIG9ubHkgYW5kIHdlCisg KiBuZWVkIHRvIGZhdWx0LgorICovCitpbnQKK3BtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qg KnB0ZTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJ aWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7 CisJZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBO VUxMKQorCQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwor I2lmZGVmIFNNUAorCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdl ZCBtLWJpdCAqLworCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXAp OworCQlyZXR1cm4gKDApOworCX0KKyNlbHNlCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCBw dGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwkJ UE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2VuZGlmCisJaWYgKHB0ZV90 ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0dXJuICgxKTsK Kwl9CisJcHRlX2F0b21pY19zZXQocHRlLCBQVEVfRCk7IC8qIG1hcmsgaXQgcmVmZXJlbmNlZCBh bmQgbW9kaWZpZWQgKi8KKwlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKwl0bGJfdXBkYXRlKHBt YXAsIHZhLCAqcHRlKTsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQlwYW5p YygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiB1bm1hbmFnZWQgcGFnZSIpOworCVBNQVBfVU5MT0NL KHBtYXApOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNl ZDogZG8gcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBv ZiBzdWNjZXNzLiAgUmV0dXJucyAxIGlmIHdlIG5lZWQgdG8gZmF1bHQuCisgKi8KK2ludAorcG1h cF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBk X2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAo cG1hcCkpCisJCXJldHVybiAoMSk7CisJUE1BUF9MT0NLKHBtYXApOworCXBkZSA9IHBtYXBfcGRl KHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKSB7CisJCS8qIElu dmFsaWQgcGFnZSBkaXJlY3RvcnkuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYgKHBkZV9p c18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwl9IGVs c2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlmIChwdGUgPT0gTlVMTCkg eworCQkvKiBJbnZhbGlkIHBhZ2UgdGFibGUuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYg KCFwdGVfaXNfdmFsaWQocHRlKSkgeworCQkvKiBJbnZhbGlkIFBURS4gKi8KKwkJZ290byBkb2Zh dWx0OworCX0KKwkvKiBDaGVjayB0byBzZWUgaWYgYWxyZWFkeSBtYXJrZWQgYnkgb3RoZXIgQ1BV LiAgKi8KKwlpZiAoIXB0ZV9pc19yZWYocHRlKSkKKwkJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7 CisKKwl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwor CXJldHVybiAoMCk7CisKK2RvZmF1bHQ6CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgx KTsKK30KKwordm9pZAorcG1hcF9mbHVzaF9wdmNhY2hlKHZtX3BhZ2VfdCBtKQoreworCXB2X2Vu dHJ5X3QgcHY7CisKKwlpZiAobSAhPSBOVUxMKSB7CisJCWZvciAocHYgPSBUQUlMUV9GSVJTVCgm bS0+bWQucHZfbGlzdCk7IHB2OworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkg eworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUp OworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9wbWFwLmMgYi9zeXMvbWlw cy9taXBzL3BtYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3BtYXAuYworKysgYi9zeXMvbWlwcy9t aXBzL3BtYXAuYwpAQCAtNzQsNiArNzQsNyBAQAogI2luY2x1ZGUgPHN5cy9wcm9jLmg+CiAjaW5j bHVkZSA8c3lzL3J3bG9jay5oPgogI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2luY2x1ZGUgPHN5 cy9fdHlwZXMuaD4KICNpZmRlZiBTTVAKICNpbmNsdWRlIDxzeXMvc21wLmg+CiAjZWxzZQpAQCAt MjMyLDcgKzIzMyw3IEBACiAJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCXN5c20tPnNhdmVk X2ludHIgPSBpbnRyOwogCXZhID0gc3lzbS0+YmFzZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZO KHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM QkxPX1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQ VEVfRzsKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCSpwdGUgPSBucHRlOwog CXN5c20tPnZhbGlkMSA9IDE7CkBAIC0yNTQsMTAgKzI1NSwxMCBAQAogCXN5c20tPnNhdmVkX2lu dHIgPSBpbnRyOwogCXZhMSA9IHN5c20tPmJhc2U7CiAJdmEyID0gc3lzbS0+YmFzZSArIFBBR0Vf U0laRTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBoeXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRF X0QgfCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRF X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtl cm5lbF9wbWFwLCB2YTEpOwogCSpwdGUgPSBucHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4o cGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM QkxPX1BBX1RPX1BGTihwaHlzMikgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwg UFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhMik7CiAJKnB0ZSA9IG5wdGU7 CiAJc3lzbS0+dmFsaWQxID0gMTsKQEAgLTU1Niw5ICs1NTcsMTUgQEAKIAltc2didWZpbml0KG1z Z2J1ZnAsIG1zZ2J1ZnNpemUpOwogCiAJLyoKLQkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4KKwkg KiBTdGVhbCB0aHJlYWQwIGtzdGFjay4gIFRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvCisJICogKEtT VEFDS19QQUdFX1NJWkUgKiAyKSBzbyBpdCBjYW4gbWFwcGVkIHRvIGEgc2luZ2xlIFRMQiBlbnRy eS4KKwkgKgorCSAqIFhYWCBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IG9mIGdldHRpbmcg YWxpZ25lZCBtZW1vcnkKKwkgKiB3aXRoIHBtYXBfc3RlYWxfbWVtb3J5KCkuCiAJICovCi0Ja3N0 YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KEtTVEFDS19QQUdFUyA8PCBQQUdFX1NISUZUKTsKKwlr c3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtTVEFDS19QQUdFUyArIEtTVEFDS19HVUFSRF9Q QUdFUykgXAorCQkJCQk8PCBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNr MCwgKEtTVEFDS19QQUdFX1NJWkUgKiAyKSk7CiAKIAl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tF Uk5FTF9BRERSRVNTOwogCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOwpAQCAt NjA1LDYgKzYxMiw3IEBACiAKIAlUQUlMUV9JTklUKCZtLT5tZC5wdl9saXN0KTsKIAltLT5tZC5w dl9mbGFncyA9IDA7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFUVFJfREVGQVVMVDsKIH0K IAogLyoKQEAgLTgwMSw3ICs4MDksNyBAQAogCXB0ZXAgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CiAJ aWYgKHB0ZXAgIT0gTlVMTCkgewogCQlwdGUgPSAqcHRlcDsKLQkJaWYgKHB0ZV90ZXN0KCZwdGUs IFBURV9WKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJaWYgKHB0ZV90ZXN0KCZw dGUsIFBURV9WQUxJRCkgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CiAJCSAgICAocHJv dCAmIFZNX1BST1RfV1JJVEUpID09IDApKSB7CiAJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKIAkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwdGVfcGEsICZwYSkpCkBA IC04MzQsOSArODQyLDkgQEAKIAogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJ b3B0ZSA9ICpwdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0Qg fCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0ciB8IFBU RV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJKnB0ZSA9IG5wdGU7Ci0JaWYgKHB0ZV90ZXN0KCZv cHRlLCBQVEVfVikgJiYgb3B0ZSAhPSBucHRlKQorCWlmIChwdGVfdGVzdCgmb3B0ZSwgUFRFX1ZB TElEKSAmJiBvcHRlICE9IG5wdGUpCiAJCXBtYXBfdXBkYXRlX3BhZ2Uoa2VybmVsX3BtYXAsIHZh LCBucHRlKTsKIH0KIApAQCAtMTQ0OSw3ICsxNDU3LDcgQEAKIAkJCQlpZiAobS0+bWQucHZfZmxh Z3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9SRUZFUkVO Q0VEKTsKIAkJCQltLT5tZC5wdl9mbGFncyAmPSB+UFZfVEFCTEVfUkVGOwotCQkJCVRBSUxRX1JF TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgmbS0+ bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf bGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJCQkJ cGMtPnBjX21hcFtmaWVsZF0gfD0gMVVMIDw8IGJpdDsKQEAgLTE2MjcsOSArMTYzNSw5IEBACiAJ cHZfZW50cnlfdCBwdjsKIAogCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VE KTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFf Rk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgewogCQlpZiAocG1hcCA9PSBQVl9Q TUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKLQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9s aXN0LCBwdiwgcHZfbGlzdCk7CisJCQlUQUlMUV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2 X25leHQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNjcxLDcgKzE2NzksNyBAQAogCVBNQVBf TE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwogCWlmICgocHYgPSBnZXRfcHZfZW50cnkocG1h cCwgVFJVRSkpICE9IE5VTEwpIHsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCXJldHVybiAoVFJVRSk7CiAJfSBlbHNlCiAJ CXJldHVybiAoRkFMU0UpOwpAQCAtMTc0NCw3ICsxNzUyLDcgQEAKIAkvKgogCSAqIElmIHRoZXJl IGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQhCiAJICovCi0JaWYgKCFw dGVfdGVzdChwdHEsIFBURV9WKSkKKwlpZiAoIXB0ZV90ZXN0KHB0cSwgUFRFX1ZBTElEKSkKIAkJ cmV0dXJuOwogCiAJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0cSwgdmEsICpwZGUpOwpA QCAtMTgxMCw3ICsxODE4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBf cGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSAr PSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwkJCWlmICgh cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJ CQkJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25l eHQ7CkBAIC0xODY4LDcgKzE4NzYsNyBAQAogCQkgKiBJZiBpdCdzIGxhc3QgbWFwcGluZyB3cml0 ZWJhY2sgYWxsIGNhY2hlcyBmcm9tIAogCQkgKiB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKIAkg CSAqLwotCQlpZiAoVEFJTFFfTkVYVChwdiwgcHZfbGlzdCkgPT0gTlVMTCkKKwkJaWYgKFRBSUxR X05FWFQocHYsIHB2X25leHQpID09IE5VTEwpCiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9p bmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CiAKIAkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf Y291bnQtLTsKQEAgLTE4OTcsNyArMTkwNSw3IEBACiAJCX0KIAkJcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcCwgcHYtPnB2X3ZhKTsKIAotCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2 LCBwdl9saXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7 CiAJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsKIAkJZnJlZV9wdl9lbnRy eShwbWFwLCBwdik7CiAJCVBNQVBfVU5MT0NLKHBtYXApOwpAQCAtMTk1OSw3ICsxOTY3LDcgQEAK IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CiAJCQlwYml0cyA9ICpwdGU7Ci0JCQlp ZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1YpIHx8IHB0ZV90ZXN0KCZwYml0cywKKwkJCWlmICgh cHRlX3Rlc3QoJnBiaXRzLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KCZwYml0cywKIAkJCSAgICBQ VEVfUk8pKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlkYXRl X3JhbmdlKHBtYXAsIHZhLCBzdmEpOwpAQCAtMjA3MSw3ICsyMDc5LDcgQEAKIAkvKgogCSAqIE1h cHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNoYW5n ZS4KIAkgKi8KLQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WKSAmJiBvcGEgPT0gcGEpIHsK KwlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkgJiYgb3BhID09IHBhKSB7CiAJCS8q CiAJCSAqIFdpcmluZyBjaGFuZ2UsIGp1c3QgdXBkYXRlIHN0YXRzLiBXZSBkb24ndCB3b3JyeSBh Ym91dAogCQkgKiB3aXJpbmcgUFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9u ZyBhcyB0aGVyZQpAQCAtMjEzNSw3ICsyMTQzLDcgQEAKIAkJaWYgKHB2ID09IE5VTEwpCiAJCQlw diA9IGdldF9wdl9lbnRyeShwbWFwLCBGQUxTRSk7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQluZXdwdGUgfD0gUFRFX01B TkFHRUQ7CiAJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKIAkJCXZtX3BhZ2VfYWZs YWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOwpAQCAtMjE2MCw3ICsyMTY4LDcgQEAKIAkgKi8KIAlp ZiAob3JpZ3B0ZSAhPSBuZXdwdGUpIHsKIAkJKnB0ZSA9IG5ld3B0ZTsKLQkJaWYgKHB0ZV90ZXN0 KCZvcmlncHRlLCBQVEVfVikpIHsKKwkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQp KSB7CiAJCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJiBvcGEgIT0gcGEp IHsKIAkJCQlpZiAob20tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdl X2FmbGFnX3NldChvbSwgUEdBX1JFRkVSRU5DRUQpOwpAQCAtMjI2OCw3ICsyMjc2LDcgQEAKIAl9 CiAKIAlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7Ci0JaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1Yp KSB7CisJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQlpZiAobXB0ZSAhPSBOVUxM KSB7CiAJCQltcHRlLT53aXJlX2NvdW50LS07CiAJCQltcHRlID0gTlVMTDsKQEAgLTIyOTgsNyAr MjMwNiw3IEBACiAJLyoKIAkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp b24KIAkgKi8KLQkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WOwor CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZBTElEOwogCWlmICgo bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKIAkJKnB0ZSB8PSBQVEVfTUFOQUdFRDsK IApAQCAtMjM1Niw3ICsyMzY0LDcgQEAKIAkJY3B1ID0gUENQVV9HRVQoY3B1aWQpOwogCQlzeXNt ID0gJnN5c21hcF9sbWVtW2NwdV07CiAJCS8qIFNpbmNlIHRoaXMgaXMgZm9yIHRoZSBkZWJ1Z2dl ciwgbm8gbG9ja3Mgb3IgYW55IG90aGVyIGZ1biAqLwotCQlucHRlID0gVExCTE9fUEFfVE9fUEZO KHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8CisJCW5wdGUgPSBUTEJMT19QQV9U T19QRk4ocGEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8CiAJCSAgICBQVEVf RzsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwogCQkqcHRlID0g bnB0ZTsKQEAgLTI0ODQsNyArMjQ5Miw3IEBACiAJCQl2YV9uZXh0ID0gZXZhOwogCQlmb3IgKHB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpCisJ CQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICgh cHRlX3Rlc3QocHRlLCBQVEVfVykpCiAJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBwdGUgJSNqeCBp cyBtaXNzaW5nIFBHX1ciLApAQCAtMjY2Niw3ICsyNjc0LDcgQEAKIAlLQVNTRVJUKHN5c20tPnZh bGlkMSA9PSAwLCAoInBtYXBfcXVpY2tfZW50ZXJfcGFnZTogUFRFIGJ1c3kiKSk7CiAKIAlwdGUg PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7Ci0JKnB0ZSA9IFRMQkxPX1BBX1RP X1BGTihwYSkgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfAorCSpwdGUgPSBUTEJMT19QQV9UT19Q Rk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8CiAJICAgIChpc19jYWNoZWFibGVf cGFnZShwYSwgbSkgPyBQVEVfQ19DQUNIRSA6IFBURV9DX1VOQ0FDSEVEKTsKIAlzeXNtLT52YWxp ZDEgPSAxOwogCkBAIC0yNzE5LDcgKzI3MjcsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNf cXVpY2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193 bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0 KSB7CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVh azsKQEAgLTI3NzIsNyArMjc4MCw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRl ICE9IDAsCiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBw bWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQ VEVfVikpCisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJw bWFwX3JlbW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAy LDcgKzI4MTAsNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVs ZF0gfD0gYml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJ CVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JF TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgm bS0+bWQucHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJM RSk7CiAJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3 ICsyODQxLDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xp c3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlw bWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUo cG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg3MSw3IEBACiAJaWYgKChtLT5vZmxhZ3Mg JiBWUE9fVU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlz dCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBt YXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShw bWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkwNSwxMSBAQAogCWlmICghdm1fcGFnZV94 YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47 CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg cHZfbmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJ cHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAm JiBwdGVfdGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVz dChwdGUsIFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikp OwogCQlwYml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAt MzA0MCw3ICszMDQ4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQ QUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkg eworCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJ CWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2 YSwgc3ZhKTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTE0LDcgQEAKIAlpZiAo KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygm cHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf bGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0 ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMzIwOCw3ICszMjE2LDcgQEAKIHJldHJ5OgogCXB0ZXAg PSBwbWFwX3B0ZShwbWFwLCBhZGRyKTsKIAlwdGUgPSAocHRlcCAhPSBOVUxMKSA/ICpwdGVwIDog MDsKLQlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WKSkgeworCWlmICghcHRlX3Rlc3QoJnB0ZSwg UFRFX1ZBTElEKSkgewogCQl2YWwgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMzQ1LDcgKzMz NTMsNyBAQAogI2VuZGlmCiAJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKIAkJCQlw dGUgPSBwZGVba107Ci0JCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVikp CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKQogCQkJCQlj b250aW51ZTsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJCXZhID0gKCh1X2xv bmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdFX1NISUZUKTsK QEAgLTMzOTMsMTUgKzM0MDEsMTUgQEAKIAlwdF9lbnRyeV90IHJ3OwogCiAJaWYgKCEocHJvdCAm IFZNX1BST1RfV1JJVEUpKQotCQlydyA9IFBURV9WIHwgUFRFX1JPOworCQlydyA9IFBURV9WQUxJ RCB8IFBURV9STzsKIAllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkg ewogCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCi0JCQlydyA9IFBURV9WIHwg UFRFX0Q7CisJCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCQllbHNlCi0JCQlydyA9IFBURV9W OworCQkJcncgPSBQVEVfVkFMSUQ7CiAJfSBlbHNlCiAJCS8qIE5lZWRuJ3QgZW11bGF0ZSBhIG1v ZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkIHBhZ2VzLiAqLwotCQlydyA9IFBURV9WIHwgUFRFX0Q7 CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJcmV0dXJuIChydyk7CiB9CiAKQEAgLTM0MjQs MTMgKzM0MzIsMTMgQEAKIAkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu ZCBQVEUiKTsKICNpZmRlZiBTTVAKIAkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg Q1BVIGNoYW5nZWQgbS1iaXQgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90 ZXN0KHB0ZSwgUFRFX0QpKSB7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRl X3Rlc3QocHRlLCBQVEVfRCkpIHsKIAkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CiAJCVBN QVBfVU5MT0NLKHBtYXApOwogCQlyZXR1cm4gKDApOwogCX0KICNlbHNlCi0JaWYgKCFwdGVfdGVz dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKKwlpZiAoIXB0ZV90ZXN0KHB0 ZSwgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKIAkJcGFuaWMoInBtYXBfZW11 bGF0ZV9tb2RpZmllZDogaW52YWxpZCBwdGUiKTsKICNlbmRpZgogCWlmIChwdGVfdGVzdChwdGUs IFBURV9STykpIHsKQEAgLTM0NDYsNiArMzQ1NCwxOCBAQAogfQogCiAvKgorICogcG1hcF9lbXVs YXRlX3JlZmVyZW5jZWQKKyAqCisgKiBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbiBpcyBub3Qgc3Vw cG9ydGVkIGluIHRoaXMgcG1hcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworaW50CitwbWFwX2VtdWxh dGVfcmVmZXJlbmNlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwkJcmV0dXJu ICgxKTsKK30KKworLyoKICAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKICAqCUZ1bmN0aW9uOgog ICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCkBAIC0zNTIy LDE3ICszNTQyLDI2IEBACiAKIAlpZiAobSAhPSBOVUxMKSB7CiAJCWZvciAocHYgPSBUQUlMUV9G SVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OwotCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9s aXN0KSkgeworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkgewogCQkJbWlwc19k Y2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCQl9CiAJfQog fQogCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw YWdlLgorICovCiB2b2lkCiBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l bWF0dHJfdCBtYSkKIHsKIAogCS8qCisJICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBh cHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQgaW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBj cmVhdGVkLgorCSAqLworCW0tPm1kLnB2X21lbWF0dHIgPSBtYTsKKworCS8qCiAJICogSXQgYXBw ZWFycyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbWFw cGluZ3MKIAkgKiBmb3IgdGhlIHBhZ2UgYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhpcyBldmVyIGNo YW5nZXMsIHRoaXMgY29kZSB3aWxsCiAJICogbmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBt YWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9t aXBzL21pbmlkdW1wX21hY2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5j Ci0tLSBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21p cHMvbWluaWR1bXBfbWFjaGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVq eCBpcyBOVUxMIiwgKHVpbnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBp KyspIHsKLQkJCWlmIChwdGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNf dmFsaWQoJnB0ZVtpXSkpIHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJ CWlmIChpc19kdW1wYWJsZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0g YS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpA QCAtMjgzLDkgKzI4Myw5IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFk MCk7CiAKLQlLQVNTRVJUKChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAg aXMgbm90IGFsaWduZWQgb24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3Rh Y2swKSk7CisJS0FTU0VSVCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkp ID09IDAsCisJCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91 bmRhcnk6IDB4JTBseCIsCisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtz dGFjazApKTsKIAl0aHJlYWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3Rh Y2tfcGFnZXMgPSBLU1RBQ0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBX ZSB1c2UgYSB3aXJlZCB0bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAq LwogCXBhID0gdnRvcGh5cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQ VEVfQ19DQUNIRTsKKwlwdGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8 IFBURV9DX0NBQ0hFOwogCXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZz ZXRfdClwY3B1cCwKIAkJCSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BB X1RPX1BGTihwYSArIFBBR0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9nZW5hc3N5bS5jIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21p cHMvZ2VuYXNzeW0uYworKysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsx MDIsOSBAQAogQVNTWU0oVERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1B WENPTUxFTiwgTUFYQ09NTEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQp OworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBL U1RBQ0tfVExCTUFTS19NQVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBN SVBTX0tTRUcwX1NUQVJUKTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RB UlQpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21p cHMvZXhjZXB0aW9uLlMKLS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMv bWlwcy9taXBzL2V4Y2VwdGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlO VFJDTlRfQ09VTlQJMjU2CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNl cHRpb25zOgorICoKKyAqIEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlv biB0aGF0IGNhdXNlZCBmYXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24g d2FzIGluIGEgYnJhbmNoIGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBv aW50IHRvIHRoZSBicmFuY2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlv bi4KKyAqCisgKiBUaGUgY2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRo ZSBleGNlcHRpb24gYW5kIHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgor ICogVGhlIHN0YXR1cyByZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3Rh dHVzIG9mIHRoZSBDUFUgc3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1 cHQgZW5hYmxlIGJpdC4KKyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhl IHZpcnR1YWwgYWRkcmVzcyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgor ICogVGhlIENvbnRleHQgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhl IFZQTiAoc3RhcnRpbmcgYXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlv biBleGNlcHQgYml0MCBhbmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRz IDIzIHRvIDMxIGZvciBNSVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAq IGtlcm5lbCBjb250cm9sIChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRl eHQvWENvbnRleHQKKyAqIHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVC U0QuCisgKi8KIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcg QEAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisg KiBNaXBzRG9UTEJNaXNzIC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwg VExCIE1pc3MgSGFuZGxlciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5k bGVyIGNvZGUuICBBIG1pc3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRv IGt1c2VnIGFuZCB0aGVyZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhl IFRMQi4KICAqICdzZWdiYXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFi bGUgZm9yIHVzZXIgcHJvY2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5n IGZvciBhbiBVVExCIG1pc3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0 cyB0aGUgQ2F1c2UgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hp ZnRzIEsvVSBhbmQgSUUgYml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50 IEtlcm5lbC9Vc2VyIGFuZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IK KyAqICAgaXMgaW4ga2VybmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisg KiAtIFNldHMgQmFkVmFkZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRl eHQgcmVnaXN0ZXIocykuCisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNv bnRhaW4gVlBOIG9mIHRoZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZv ciBpbnZhbGlkIHB0ZSdzIGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRo ZSBwcm9jZXNzb3IgdHJhcCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2Uu CisgKgorICogWFhYIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIg cGFnZSB0YWJsZSBhbmQgdXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJz LiAgVGhhdCBpcyByZWFsbHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAgKi8KICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVm IF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4K IAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsx LCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMg azE9cGRlIGVudHJ5Ci0JTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFk ZHJlc3MgKGFnYWluKQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy ZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywg MmYJCQkjID09MCAtLSBubyBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BN QVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBr MT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdl CQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVu dHJ5IChkZWxheSBzbG90KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUg aWYgdmFsaWQuCisJIworCSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2 ZXMgYSBmYXVsdCBsYXRlciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhl cmVmb3JlLCBqdXN0IHRha2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQu CisjCUlGX1ZBTElEX1NFVF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFj dHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlD TEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMg bG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBU TEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9Q Rk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQg aGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAo YWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJ b3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGlu dG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8g U1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8x IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFN IHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFn ZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9h ZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RF TEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBh Z2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlv bgorCitub3Rfc3VwZXJwYWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlm CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWlu KQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2 YT4+MTApCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQK IAlQVFJfQUREVQlrMSwgazEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwg MChrMSkJCQkjMGU6IGswPWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBr MT1sbzAgcHRlCisKKwlQVEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0 aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGlu ZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMg bWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQg dG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwg azEsIDAsIDIpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP UF8wX1RMQl9MTzAJCSMxMjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9T V0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMg bG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNl dCB0aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0 dGluZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAor CSMgbWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1 bHQgdG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChr MCwgazEsIDAsIDMpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBT X0NPUF8wX1RMQl9MTzEJCSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJ CQkJIzFhOiB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRV cm4gZnJvbSBleGNlcHRpb24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2Vy bmVsIGV4Y2VwdGlvbgogCW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNs b3dGYXVsdAkJCSMyMjogbm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAK ICNlbmRpZgogCiAvKgotICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNh dmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGlu IGtlcm5lbCBtb2RlLgogICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Ig c2F2aW5nIHRoZSBleGNlcHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJh Y2UgY29kZSBsb29rcyBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcg QEAKIAlTQVZFX1JFRyhhMSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0 aGUgcmV0dXJuIGFkZHJlc3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2Vy bkdlbkV4Y2VwdGlvbikKQEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNI SUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8s IE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAs IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJ UFRSX0FERFUJazAsIGswLCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEs IDAoazApCQkJIyBrMT1wZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVy LiAgKi8KIAliZXF6CQlrMSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMg Q2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVy cGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5v dCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNs b3QpCisKKwkvKiBWYWxpZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRF X1ZSCisJYmVxegkJazEsIDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBl cnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJ VFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVk CisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0 ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4o azEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFn IGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRf SFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBr MAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExv MSByZWdpc3Rlci4KKwkjIENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBj bGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAor CUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRs aQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMw CWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9T WU5DCisKKwliCQl0bGJfaW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyog TUlQUzY0X05FV19QTUFQICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFE RFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQ VEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIg b2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJ azAsIDAoazEpCQkJIyBrMD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRy eS4gICovCi0JYW5kaQkJazAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAz ZgogCW5vcAogCkBAIC05MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChr MSkKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBU RV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwg UFRFU0laRShrMSkKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf Q09QXzBfVExCX0xPMQogCUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAog CiBvZGRfcGFnZToKIAlQVEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkK KwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xP MAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNf Q09QXzBfVExCX0xPMQorCisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhr MCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9p bnNlcnRfZW50cnk6CkBAIC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2Vy dF9yYW5kb20KIAlub3AKIAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJ dGxid3IKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5D CiAJZXJldAogCXNzbm9wCiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNf bjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJ azAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsx CQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBl bnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRS X0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1z dXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAg LS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVs YXkgc2xvdCkKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUg aXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVn LgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP MAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3Ig dGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0RE XzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkj IEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVu dHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJp dHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQg aXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ IyBObyBTVyBCaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpB UkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBv dXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhj ZXB0aW9uCisKK25vdF9rc3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZD MAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJ YmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJs ZQogI2VuZGlmCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgog CWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJ azEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGsw PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhY WCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVf TVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK LQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJ CSMgbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0 ZQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJf TE8xCQkjIGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0 bGIKIAlIQVpBUkRfREVMQVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMv bWlwcy9taXBzL2NwdS5jCi0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMv bWlwcy9jcHUuYwpAQCAtMzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBj cHVpbmZvLT5sMi5kY19saW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1 aW5mby0+bDIuZGNfbndheXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVn aXN0ZXIgdG8gc2VlIHdoYXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdy aXRpbmcgYWxsIG9uZSdzIGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dy X3BhZ2VtYXNrKH4wKTsKKwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygp OworCW1pcHNfd3JfcGFnZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19M QVJHRV9QQUdFCisJaWYgKChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2Sykg PT0gMCkKKwkJcGFuaWMoIiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkg dGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFH RSAqLworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAm IE1JUFMzX1BHTUFTS18xTSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUg bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q IE1JUFM2NF9ORVdfUE1BUCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlw cmludGYoIkZpeGVkIG1hcHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBj cHVpbmZvLnRsYl9uZW50cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXBy aW50ZigiKCIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNL WCkKKwkJCQlwcmludGYoIjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZv LnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJ aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2 NEsgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJ CQkJcHJpbnRmKCIyNTZLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18xTSkKKwkJCQlwcmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAm IE1JUFMzX1BHTUFTS180TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxi X3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAo Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAi KTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlw cmludGYoIjI1Nk0gIik7CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50Zigi XG4iKTsKIAl9CiAKIAlpZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMv bWlwcy9pbmNsdWRlL3ZtcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJh bS5oCkBAIC0xMDAsMTUgKzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgo dm1fb2Zmc2V0X3QpMHg4MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1J UFM2NF9ORVdfUE1BUAogLyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5v dCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5h YmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxF VkVMIHNwZWNpZmllcyBhIG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBD dXJyZW50bHkgbWlwczY0IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVM XzBfT1JERVIpIG9mCisgKiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VS VkxFVkVMCisjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2 ZWwgMCByZXNlcnZhdGlvbnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8K KyNpZm5kZWYJVk1fTEVWRUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5Cisj ZW5kaWYKKworLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8K KyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQ ICovCisKKy8qCisgKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5k ZWYJVk1fTlJFU0VSVkxFVkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAK IC8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5l CVZNX05GUkVFT1JERVIJCTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8q CiAgKiBIb3cgbWFueSBwaHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2Uu CiAgKi8KICNpZm5kZWYgVk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAj ZGVmaW5lCVZNX0xPV01FTV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRp ZgogCi0vKgotICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2Rl ZmluZQlWTV9ORlJFRU9SREVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAx MDI0KQkvKiA2NEtCICovCiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21p cHMvaW5jbHVkZS9wdGUuaCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMv aW5jbHVkZS9wdGUuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwx MCBAQAogI2lmbmRlZglfTUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAK KyNpZiAhZGVmaW5lZChfS0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRp ZgorCiAjaWZuZGVmIF9MT0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQo X19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9l bnRyeV90OwpAQCAtNzIsMjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9y IDMyLWJpdCB1c2Ugb2YgQ1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0 IG9mIFBGTiB0byBhIG5vbi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRo aXMgcGh5c2ljYWwKICAqIG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5 IGVuZm9yY2VkIGVsc2V3aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5k IDYyIGFyZSB1c2VkIGZvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQg bG9hZGluZyBhbmQgc3RvcmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0 aGUgNTUtYml0CisgKiBzaGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNf bjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZp bmUJVExCTE9fU1dCSVRTX1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NI SUZUCSg5KQotI2RlZmluZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJ VExCTE9fU1dCSVRTX1NISUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRM QkxPX1JFRl9CSVRfU0hJRlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJ KDExKQkvKiBYWFhTUzogV2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZG RkMwVUxMCisjZGVmaW5lCVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmlu ZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJ RlQpCiAjZWxzZQogI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZG RkZDMCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJM T19TV0JJVFNfU0hJRlQpCiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNk ZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNf U0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9T SElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJM T19QRk5fVE9fUEEocGZuKQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkg PDwgVExCX1BBR0VfU0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkg JiBUTEJMT19QRk5fTUFTSykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BG Tl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21t ZW50IGlzIG5vdCBjb3JyZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAg LTEyMSwyNSArMTI4LDgzIEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAv KgorICogUFRFIEhhcmR3YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoK KyAqIExvd2VyIGJpdHMgb2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICBQRk4gICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KgorICogTG93ZXIgYml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0t LS0tLS0tLS0tIDM0ICAzMyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAor ICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAg ICAgIFBGTiAgICAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqCiAgKiBUTEIgZmxhZ3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBG cmFtZSBOdW1iZXIuCiAgKiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4g IFRoaXMgbWVhbnMgYSBwYWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBm aXJzdCwgYW5kIGEgd3JpdGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMg c2V0LiAgU2VlIGFsc28gUFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0 IGl0PworICogCVZSOglWYWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJ RzoJR2xvYmFsIGJpdC4gIFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAog ICogCQlpbiBFVkVSWSBhZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4K ICAqIAkJaXQgaXMgbWF0Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYg MHgwNykgPDwgMykKICNkZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNB Q0hFRCkpCiAjZGVmaW5lCVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNk ZWZpbmUJUFRFX0QJCQkweDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJ CQkweDAyCiAjZGVmaW5lCVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICog Q0hFUkkgRW50cnlMbyBleHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBz dG9yaW5nIHRhZ2dlZAorICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwg PDwgNjMpCisjZGVmaW5lCVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAq IFBURSBTb2Z0d2FyZSBCaXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6Cisg KgorICogICAgIDMxICAgMzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8 IFcgIHwgUk8gfAorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEg NjQgYml0IFBURToKKyAqCisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUg ICA1NCAgIDUzCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICogIHwgIFJHICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8 CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK ICAqIFZNIGZsYWdzIG1hbmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2Vy dmVkLiBDdXJyZW50bHkgbm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcg U1ogSURYOiBQYWdlIFNpemUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5h cnkpCUhXIFBhZ2UgU2l6ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0t LS0tCisgKgkJMAkwMDAwIDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAw IDAwMTEJIDE2SworICoJCTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAw MDAgMDAxMSAxMTExCTI1NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJ MDAwMCAwMDExIDExMTEgMTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0K KyAqIChNSVBTIDM6KQorICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTEx IDExMTEgMTExMSAxMTExCTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlS TzoJUmVhZCBvbmx5LiAgTmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAg KiAJCWxpc3RlbiB0byByZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/ PwpAQCAtMTUxLDEzICsyMTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkw eDAxIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3Qp MHgwMiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2Vu dHJ5X3QpMHgwNCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0 KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJ UFRFX1BTXzE2SwkJKChwdF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl ZmluZQlQVEVfUFNfNjRLCQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQp CisjZGVmaW5lCVBURV9QU18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNf U0hJRlQpCisjZGVmaW5lCVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dC SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxP X1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwg VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgz OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9l bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJ VFNfVE9fTEVGVAkJNQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZp bmUJUFRFX1BGTl9OQklUU19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJ R0hUCQk2CisjZGVmaW5lCVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1df VkFMSUQJCTB4NDAKKyNkZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRM QkxPX1NXQklUU19TSElGVCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2Rl ZmluZQlQVEVfU1YJCQkwCisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERF KSBwYWdlIG1hcHBpbmcgcmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQ VEUpIHBhZ2UgbWFwcGluZ3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dp bmcgZmllbGRzOgorICovCisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFM SUQgfCBQVEVfRCB8IFBURV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8g fCBQVEVfVyB8IFBURV9NQU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9O RVdfUE1BUAorI2RlZmluZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19J RFhfTUFTSykgPj4gNTYpCisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8 ICgoaWR4KSA8PCAxKSkgLSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVf VE9fTUFTSyhwdGUpCVRMQk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQor I2RlZmluZQlUTEJNQVNLXzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJ VExCTUFTS18xNktfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tf NjRLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFH RQlUTEJNQVNLX0lEWF9UT19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFT S19JRFhfVE9fTUFTSyg0KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RP X01BU0soNSkKKyNkZWZpbmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYp CisjZGVmaW5lCVRMQk1BU0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2Ug LyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkw CisjZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05F V19QTUFQICovCiAKIC8qCiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVm aW5lZCBhYm92ZS4KICAqLwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0g fihiaXQpKQotI2RlZmluZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2Rl ZmluZQlwdGVfdGVzdChwdGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZu ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAq cHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMg X19pbmxpbmUgdm9pZAorcHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQor eworCisJKnB0ZSB8PSBiaXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0 X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0 KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5 X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5i aXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUs IHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKwor c3RhdGljIF9faW5saW5lIGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90 IGJpdCkKK3sKKworCXJldHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsK K30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRk cl90IHBhKQoreworCisJcmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19Q Rk5fU0hJRlQpICYgVExCTE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFk ZHJfdAorVExCTE9fUEZOX1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1f cGFkZHJfdCkocGZuID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQor CitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90 IHB0ZSkKK3sKKworCXJldHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYg TUlQUzY0X05FV19QTUFQCisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9W QUxJRCAJUFRFX1NWCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSks IFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQ VEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVG KQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChw dGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3Nl dF9sb25nKChwdGUpLCBQVEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwor CisjZGVmaW5lCVBURV9SRUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5l CXB0ZV9pc19yZWYocHRlKQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5l CXB0ZV9yZWZfc2V0KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2Rl ZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCisjZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwg UFRFX1ZBTElEKQorCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgYml0KQlhdG9taWNfY2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19z ZXQocHRlLCBiaXQpCWF0b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRf c3RvcmUocHRlcCwgcHRlKQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5l CXBkZV9sb2FkX3N0b3JlKHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRf NjQoXAorCQkJCQkJKHB0X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21p Y19zdG9yZShwdGVwLCBwdGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmlu ZSBwdGVfc3RvcmUocHRlcCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9s b25nKShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJ cHRlX3N0b3JlKHBkZXAsIHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwor CisjZGVmaW5lCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRl KSwgYml0KQorI2RlZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigo cHRlKSwgYml0KQorI2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFk YW5kc2V0XzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQko cGRfZW50cnlfdClhdG9taWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBk ZXAsIHBkZSkKKworI2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0 b3JlX3JlbF8zMihwdGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJ CVwKKwkqKHVfaW50ICopKHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2Rl ZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlm IC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lm IGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJf NjRfQklUICovCisKKyNpZm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBE RSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9u IF9fbWlwc19uNjQgdGhlIGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJh bmdlIGZyb20KKyAqIFZNX01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0 byBWTV9NQVhfS0VSTkVMX0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZv cmUsIGEgdmFsaWQgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8g YSBwYWdlIHRhYmxlKSB3aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICog c3VwZXJwYWdlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMg NTggdG8gNTYpCisgKiBzZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBh bnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50 cnlfdCAqcGRlKQoreworCisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhf TUFTSykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/ ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0 ZSkKK3sKKworCXJldHVybiAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisv KiBJcyB0aGUgUERFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw ZGVfaXNfMW1fc3VwZXJwYWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9l bnRyeV90KSpwZGUgJiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQ VEUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9z dXBlcnBhZ2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18x TSkgPT0gUFRFX1BTXzFNKTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2Ug UGh5c2ljYWwgRnJhbWUgTnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RM QkxPX1BBX1RPX1NQRk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJf MU1fU1VQRVJQQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZO X01BU0spOworfQorCisvKiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNp Y2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9U T19QQShwdF9lbnRyeV90IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+ IFRMQkxPX1BGTl9TSElGVCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisK Ky8qIFN1cGVycGFnZSBQYWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitz dGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0 ZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7 Cit9CisKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2Vu dHJ5X3QgcGRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZO KChwdF9lbnRyeV90KXBkZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0 byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP X1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BB KFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJf dAorVExCTE9fUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19Q Rk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYg LyogISBfTE9DT1JFICovCisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZp bmUJcHRlX2lzX3JlZmVyZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0 KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1 cGVycGFnZShwZGUpCQkwCisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmlu ZSBwZGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdl KHB0ZSkJMAorCisjaWZuZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitU TEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9U T19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8K KyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZv ciBQVEUgYWNjZXNzKi8KICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2Rl ZmluZQlQVEVNQVNLCQkJMHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJ CQlsZAorI2RlZmluZQlQVEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmlu ZQlDTEVBUl9QVEVfU1dCSVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhy KQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNl ZCBiaXQgZW11bGF0aW9uIEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lE WChyKQorICoKKyAqIEdldCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlm dGluZyBpdCBsZWZ0IGJ5CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhl IHVwcGVyIHNvZnRiaXRzKSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9Q U0lEWF9OQklUU19UT19SSUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcK KyAqIGFsbCB0aGUgbG93ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRf U1VQRVJQQUdFX0lEWChyKQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQp OwkJXAorCWRzcmwzMglyLCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05C SVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBH ZXQgdGhlIGxvd2VyIGhhcmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJp Z2h0LgorICovCisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAo UFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxB R1NfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVO KHIpCisgKgorICogR2V0IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFN IFBURS4gIEZpcnN0LCBtYXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhl biBhZGQgMU0gd29ydGggb2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0Cisg KiBiYWNrIHRvIGl0cyBwb3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERf MU1fUEZOX0ZST01fRVZFTihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQp OwkJXAorCWRzcmwJciwgKFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9f UklHSFQpOyBcCisJZGFkZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlk c2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JF RkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRo ZW4gc2V0IHRoZSByZWZlcmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisg KiBkb2VzIGl0IGF0b21pY2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUK KyNpZmRlZiBBVE9NSUNfUkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZC SVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJ CQkJXAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIw LCByMCwgU1dfVkFMSUQ7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAor CVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkg OwkJCVwKKwlvcmkJcjAsIHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEp IDsJCQlcCisJYmVxeglyMCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9m ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyog ISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQo cjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJ XAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwg cjAsIFNXX1ZBTElEIDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJ UFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlc CisJUFRFX1MJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMj IDoKKyNlbmRpZiAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQ UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUg R0VUX0hXX1RMQl9GTEFHUyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwg b2Zmc2V0LCB1bmlxdWUpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxz ZSAvKiAhIExPQ09SRSAqLwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJ MHhmZjgJLyogZm9yIHRoZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhm ZmMKICNkZWZpbmUJUFRFU0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVf UwkJCXN3CiAjZGVmaW5lCVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMo cikJTE9OR19TTEwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BU RV9WQUxJRChyMCwgcjEsIG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCBy MSwgb2Zmc2V0KQorCiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f bWlwc19uMzIpICovCiAKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3 IEBACiAjZGVmaW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19Q R01BU0tfMjU2TQkweDFmZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdp c3RlciA1LCBTZWxlY3QgMCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkw eDAwMDAxODAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlN SVBTM19QR01BU0tfMTZLCTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAw MDFlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQ UzNfUEdNQVNLXzFNCQkweDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdm ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNf UEdNQVNLXzY0TQkweDA3ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUw MDAKKwogI2VuZGlmIC8qICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBz L2luY2x1ZGUvcG1hcC5oIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMv aW5jbHVkZS9wbWFwLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTQ4LDYgKzQ4 LDcgQEAKIAogI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgogI2luY2x1ZGUgPG1hY2hpbmUv cHRlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpZiBkZWZpbmVkKF9fbWlwc19uMzIp IHx8IGRlZmluZWQoX19taXBzX242NCkgLyogUEhZU0FERFJfNjRCSVQgKi8KICNkZWZpbmUJTktQ VAkJMjU2CS8qIG1lbSA+IDRHLCB2bV9wYWdlX3N0YXJ0dXAgbmVlZHMgbW9yZSBLUFRzICovCkBA IC02MiwxNSArNjMsMjQgQEAKICNpbmNsdWRlIDxzeXMvX2xvY2suaD4KICNpbmNsdWRlIDxzeXMv X211dGV4Lmg+CiAKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKyNpbmNsdWRlIDx2bS9fdm1fcmFk aXguaD4KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KKwogLyoKICAqIFBtYXAgc3R1ZmYK ICAqLwogc3RydWN0IHB2X2VudHJ5Owogc3RydWN0IHB2X2NodW5rOwogCiBzdHJ1Y3QgbWRfcGFn ZSB7Ci0JaW50IHB2X2ZsYWdzOwogCVRBSUxRX0hFQUQoLCBwdl9lbnRyeSkgcHZfbGlzdDsKKwl2 bV9tZW1hdHRyX3QgcHZfbWVtYXR0cjsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpbnQgcHZf Z2VuOworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKwlpbnQgcHZfZmxhZ3M7CisjZW5k aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKICNkZWZpbmUJUFZfVEFCTEVfUkVGCQkw eDAyCS8qIHJlZmVyZW5jZWQgKi8KQEAgLTgxLDE1ICs5MSwxOCBAQAogI2RlZmluZQlBU0lER0VO X01BU0sJCSgoMSA8PCBBU0lER0VOX0JJVFMpIC0gMSkKIAogc3RydWN0IHBtYXAgeworCXN0cnVj dCBtdHggcG1fbXR4OwogCXBkX2VudHJ5X3QgKnBtX3NlZ3RhYjsJLyogS1ZBIG9mIHNlZ21lbnQg dGFibGUgKi8KIAlUQUlMUV9IRUFEKCwgcHZfY2h1bmspCXBtX3B2Y2h1bms7CS8qIGxpc3Qgb2Yg bWFwcGluZ3MgaW4gcG1hcCAqLwogCWNwdXNldF90CXBtX2FjdGl2ZTsJCS8qIGFjdGl2ZSBvbiBj cHVzICovCiAJc3RydWN0IHsKIAkJdV9pbnQzMl90IGFzaWQ6QVNJRF9CSVRTOwkvKiBUTEIgYWRk cmVzcyBzcGFjZSB0YWcgKi8KIAkJdV9pbnQzMl90IGdlbjpBU0lER0VOX0JJVFM7CS8qIGl0cyBn ZW5lcmF0aW9uIG51bWJlciAqLwogCX0gICAgICBwbV9hc2lkW01BWFNNUENQVV07CiAJc3RydWN0 IHBtYXBfc3RhdGlzdGljcyBwbV9zdGF0czsJLyogcG1hcCBzdGF0aXN0aWNzICovCi0Jc3RydWN0 IG10eCBwbV9tdHg7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJc3RydWN0IHZtX3JhZGl4IHBt X3Jvb3Q7CQkvKiBzcGFyZSBwYWdlIHRhYmxlIHBhZ2VzICovCisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBwbWFwICpwbWFwX3Q7CkBAIC0xMjEsNyAr MTM0LDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgcHZfZW50cnkgewogCXZtX29mZnNldF90IHB2 X3ZhOwkvKiB2aXJ0dWFsIGFkZHJlc3MgZm9yIG1hcHBpbmcgKi8KLQlUQUlMUV9FTlRSWShwdl9l bnRyeSkgcHZfbGlzdDsKKwlUQUlMUV9FTlRSWShwdl9lbnRyeSkgcHZfbmV4dDsKIH0gICAgICAg KnB2X2VudHJ5X3Q7CiAKIC8qCkBAIC0xNjQsMTEgKzE3NywxNSBAQAogZXh0ZXJuIHZtX3BhZGRy X3QgZHVtcF9hdmFpbFtQSFlTX0FWQUlMX0VOVFJJRVMgKyAyXTsKIAogI2RlZmluZQlwbWFwX3Bh Z2VfZ2V0X21lbWF0dHIobSkJVk1fTUVNQVRUUl9ERUZBVUxUCi0jZGVmaW5lCXBtYXBfcGFnZV9p c19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKICNkZWZpbmUJcG1h cF9wYWdlX2lzX3dyaXRlX21hcHBlZChtKQkoKChtKS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkg IT0gMCkKIAogdm9pZCBwbWFwX2Jvb3RzdHJhcCh2b2lkKTsKIHZvaWQgKnBtYXBfbWFwZGV2KHZt X3BhZGRyX3QsIHZtX3NpemVfdCk7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCXBt YXBfcGFnZV9pc19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKKyNl bHNlCitib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CisjZW5kaWYK IHZvaWQgcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCwgdm1fc2l6ZV90KTsKIHZtX29mZnNldF90 IHBtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKTsKIHZvaWQgcG1hcF9rZW50ZXIodm1f b2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEpOwpAQCAtMTc4LDYgKzE5NSw3IEBACiB2b2lkIHBt YXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpOwogdm9pZCBwbWFwX2ZsdXNo X3B2Y2FjaGUodm1fcGFnZV90IG0pOwogaW50IHBtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworaW50IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CiB2b2lkIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2bV9w YWdlX3QsIHZtX21lbWF0dHJfdCk7CiAKICNlbmRpZgkJCQkvKiBfS0VSTkVMICovCmRpZmYgLS1n aXQgYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgK LS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcGFy YW0uaApAQCAtMTYzLDE3ICsxNjMsMzggQEAKIAogI2RlZmluZQlNQVhEVU1QUEdTCQkxCQkvKiB4 eHg6IHdoeSBpcyB0aGlzIG9ubHkgb25lPyAqLwogCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UK Ky8qCisgKiBGb3IgYSBsYXJnZSBrZXJuZWwgc3RhY2sgcGFnZSB0aGUgS1NUQUNLX1NJWkUgbmVl ZHMgdG8gYmUgYSBwYWdlIHNpemUKKyAqIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKGUuZy4g MTZLKS4KKyAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKDEgPDwgMTQpCS8qIFNpbmdsZSAxNksg cGFnZSAqLworI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCUtTVEFDS19TSVpFCisjZGVmaW5lCUtT VEFDS19QQUdFX01BU0sJKEtTVEFDS19QQUdFX1NJWkUgLSAxKQorI2RlZmluZQlLU1RBQ0tfUEFH RVMJCShLU1RBQ0tfU0laRSAvIFBBR0VfU0laRSkKKyNkZWZpbmUJS1NUQUNLX1RMQk1BU0tfTUFT SwkoKEtTVEFDS19QQUdFX01BU0sgPj4gKFRMQk1BU0tfU0hJRlQgLSAxKSkgXAorCQkJCQk8PCBU TEJNQVNLX1NISUZUKQorI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJKChLU1RBQ0tfUEFHRV9T SVpFICogMikgLyBQQUdFX1NJWkUpCisKKyNlbHNlIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8K KwogLyoKICAqIFRoZSBrZXJuZWwgc3RhY2sgbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBhIChQQUdF X1NJWkUgKiAyKSBib3VuZGFyeS4KICAqLwogI2RlZmluZQlLU1RBQ0tfUEFHRVMJCTIJLyoga2Vy bmVsIHN0YWNrICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoS1NUQUNLX1BBR0VTICogUEFHRV9T SVpFKQorI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCVBBR0VfU0laRQorI2RlZmluZQlLU1RBQ0tf UEFHRV9NQVNLCShQQUdFX1NJWkUgLSAxKQogI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJMgkv KiBwYWdlcyBvZiBrc3RhY2sgZ3VhcmQ7IDAgZGlzYWJsZXMgKi8KKyNlbmRpZiAvKiAhIEtTVEFD S19MQVJHRV9QQUdFICovCiAKIC8qCiAgKiBNYWNoIGRlcml2ZWQgY29udmVyc2lvbiBtYWNyb3MK ICAqLwogI2RlZmluZQlyb3VuZF9wYWdlKHgpCQkoKCh4KSArIFBBR0VfTUFTSykgJiB+UEFHRV9N QVNLKQogI2RlZmluZQl0cnVuY19wYWdlKHgpCQkoKHgpICYgflBBR0VfTUFTSykKKyNkZWZpbmUJ cm91bmRfMm1wYWdlKHgpCQkoKCh4KSArIFBEUk1BU0spICYgflBEUk1BU0spCisjZGVmaW5lCXRy dW5jXzJtcGFnZSh4KQkJKCh4KSAmIH5QRFJNQVNLKQogCiAjZGVmaW5lCWF0b3AoeCkJCQkoKHgp ID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lCXB0b2EoeCkJCQkoKHgpIDw8IFBBR0VfU0hJRlQpCmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9jb25mL01BTFRBNjQgYi9zeXMvbWlwcy9jb25mL01BTFRBNjQK LS0tIGEvc3lzL21pcHMvY29uZi9NQUxUQTY0CisrKyBiL3N5cy9taXBzL2NvbmYvTUFMVEE2NApA QCAtMTEsMyArMTEsNSBAQAogbWFrZW9wdGlvbnMJQVJDSF9GTEFHUz0iLW1hcmNoPW1pcHM2NCAt bWFiaT02NCIKICAKIG1ha2VvcHRpb25zIAlLRVJOTE9BREFERFI9MHhmZmZmZmZmZjgwMTAwMDAw CisKK29wdGlvbnMJCU1JUFM2NF9ORVdfUE1BUApkaWZmIC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9u cy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0tLSBhL3N5cy9jb25mL29wdGlvbnMubWlw cworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAgLTk3LDExICs5NywyNCBAQAogQkVSSV9M QVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBVc2UgdGhlIG5ldyBwbWFwIGZvciBNSVBT NjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorIyBhbmQgc3VwZXJwYWdl IHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRp b25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcgRW1iZWRkZWQgQ1BVIEV0aGVybmV0IENv cmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRmcGdhLmgKIAogIworIyBPcHRpb25zIGZv ciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVyIHN1cHBvcnQKKyMKKworIyBVc2Ugb25l IGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0aGUga2VybmVsIHRocmVhZCBzdGFjawor S1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwuaAorCisjCiAjIE9wdGlvbnMgdGhhdCBj b250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFscwogIwogQVJHRV9ERUJVRwkJCW9wdF9h cmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLm1pcHMgYi9zeXMvY29uZi9maWxlcy5t aXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysrIGIvc3lzL2NvbmYvZmlsZXMubWlwcwpA QCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVzLmMJCQlzdGFuZGFyZAogbWlwcy9taXBz L29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1pcHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlz dGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5kYXJkCittaXBzL21pcHMvcG1hcC5jCQkJ b3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9taXBzL3BtYXBfbWlwczY0LmMJCQlvcHRp b25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9wdHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFy ZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5kYXJkCiBtaXBzL21pcHMvc3RhY2tfbWFj aGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZmIC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1f bWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0tLSBhL2xpYi9saWJrdm0va3ZtX21pcHMu aAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJ TUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZmZmYKIAogI2RlZmluZQlNSVBTMzJfUEZO X01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMw CisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZGRkZDMAogI2RlZmluZQlNSVBTX1BGTl9T SElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9fUEEocGZuKQkoKChwZm4pID4+IE1JUFNf UEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo= --b1_0f329be06464796422fbdb79db4d9952-- From owner-freebsd-mips@freebsd.org Fri Sep 16 20:21:21 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 034A0BDDF5C for ; Fri, 16 Sep 2016 20:21:21 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id D3E0EEAE for ; Fri, 16 Sep 2016 20:21:20 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 4D0F0BC0D; Fri, 16 Sep 2016 20:21:20 +0000 (UTC) Date: Fri, 16 Sep 2016 20:21:20 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <8a577292d7ba81f6936a5f02d4571a79@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcVEA= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 20:21:21 -0000 c2JydW5vIGFkZGVkIHN1YnNjcmliZXJzOiBhbGMsIG1hcmtqLgoKUkVQT1NJVE9SWQogIHJTIEZy ZWVCU0Qgc3JjIHJlcG9zaXRvcnkKClJFVklTSU9OIERFVEFJTAogIGh0dHBzOi8vcmV2aWV3cy5m cmVlYnNkLm9yZy9EMjUzNQoKRU1BSUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJl ZWJzZC5vcmcvc2V0dGluZ3MvcGFuZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBzYnJ1bm8sIHNz b24KQ2M6IG1hcmtqLCBhbGMsIHNicnVubywgcndhdHNvbiwgZW1hc3RlLCBpbXAsIGZyZWVic2Qt bWlwcy1saXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2FfZ21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 20:34:08 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B1CFABDD3F7 for ; Fri, 16 Sep 2016 20:34:08 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 843CE90F for ; Fri, 16 Sep 2016 20:34:08 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 0AC09B48F; Fri, 16 Sep 2016 20:34:08 +0000 (UTC) Date: Fri, 16 Sep 2016 20:34:08 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <61414fdb3315e2089d68f04b79a47e81@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcV0A= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 20:34:08 -0000 c2JydW5vIGFkZGVkIGEgc3Vic2NyaWJlcjogYnJvb2tzLgoKUkVQT1NJVE9SWQogIHJTIEZyZWVC U0Qgc3JjIHJlcG9zaXRvcnkKClJFVklTSU9OIERFVEFJTAogIGh0dHBzOi8vcmV2aWV3cy5mcmVl YnNkLm9yZy9EMjUzNQoKRU1BSUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJlZWJz ZC5vcmcvc2V0dGluZ3MvcGFuZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBzYnJ1bm8sIHNzb24K Q2M6IGJyb29rcywgam1hbGxldHQsIG1hcmtqLCBhbGMsIHNicnVubywgcndhdHNvbiwgZW1hc3Rl LCBpbXAsIGZyZWVic2QtbWlwcy1saXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2Ff Z21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 20:41:56 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B1A23BDD54E for ; Fri, 16 Sep 2016 20:41:56 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 8D8A5B9A for ; Fri, 16 Sep 2016 20:41:56 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 05695B94D; Fri, 16 Sep 2016 20:41:56 +0000 (UTC) Date: Fri, 16 Sep 2016 20:41:56 +0000 To: freebsd-mips@freebsd.org From: "jmallett (Juli Mallett)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcWRQ= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 20:41:56 -0000 am1hbGxldHQgYWRkZWQgaW5saW5lIGNvbW1lbnRzLgoKSU5MSU5FIENPTU1FTlRTCgo+IGt2bV9t aXBzLmg6NTIKPiAgI2RlZmluZQlNSVBTMzJfUEZOX01BU0sJCSgweDFGRkZGRkMwKQo+IC0jZGVm aW5lCU1JUFM2NF9QRk5fTUFTSwkJMHgzRkZGRkZGQzAKPiArI2RlZmluZQlNSVBTNjRfUEZOX01B U0sJCTB4RkZGRkZGQzAKPiAgI2RlZmluZQlNSVBTX1BGTl9TSElGVAkJKDYpCgpJbiB0aGlzIGFu ZCB0aGUgUEZOIG1hc2sgY2hhbmdlcyBpbiB0aGUga2VybmVsIGhlYWRlcnMsIEkgcmVhbGx5IHdv bmRlciB3aGV0aGVyIHdlIGNhbiBzYWZlbHkgbWFrZSB0aGVzZSBjaGFuZ2VzLiAgSSB1bmRlcnN0 YW5kIHRoZXkgZ2l2ZSB1cyBtb3JlIHVwcGVyIHNvZnR3YXJlIGJpdHMsIGFuZCB0aGF0IG9uIENI RVJJIHRoZXNlIGFyZSBzYWZlIGJlY2F1c2UgdGhlIHNvZnR3YXJlIGFuZCBoYXJkd2FyZSBhcmUg aGFybW9uaXplZCBoZXJlLCBidXQgYXJlIHdlIHF1aXRlIHN1cmUgdGhhdCB0aGVyZSdzIG5vIHJl YWwgaGFyZHdhcmUgd2hlcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgbGF5b3V0IG1pZ2h0IHJlcXVp cmUgYmVpbmcgYWJsZSB0byBkZWNvZGUgdGhlc2UgYml0cyBvZiB0aGUgUEZOPwoKPiBvcHRpb25z Lm1pcHM6MTAzCj4gKyMKPiArTUlQUzY0X05FV19QTUFQCQkJb3B0X2dsb2JhbC5oCj4gKwoKQ2Fu IHdlIGdldCBhIHRpbWVsaW5lIG9uIGRlcHJlY2F0aW9uIG9mIHRoZSBvbGQgcG1hcCwgYW5kIG5v dGUgdGhhdCB0aGUgb3B0aW9uIGlzIHRlbXBvcmFyeT8KCj4gb3B0aW9ucy5taXBzOjExNQo+ICsj IFVzZSBvbmUgbGFyZ2UgcGFnZSAoY3VycmVudGx5IDE2SykgZm9yIHRoZSBrZXJuZWwgdGhyZWFk IHN0YWNrCj4gK0tTVEFDS19MQVJHRV9QQUdFICAgCQlvcHRfZ2xvYmFsLmgKPiArCgpJIHdvdWxk IHJlYWxseSByYXRoZXIganVzdCBzZWUgdXMgb25seSB1c2UgbGFyZ2Uga2VybmVsIHN0YWNrIHBh Z2VzLiAgSXQganVzdCBtYWtlcyBtb3JlIHNlbnNlLiAgSSBkb24ndCB0aGluayB0aGUgb3B0aW9u IGhlcmUgaXMgaGVhbHRoeSBmb3IgdXMuICBEbyB3ZSByZWFsbHkgc3VwcG9ydCBoYXJkd2FyZSB3 aGljaCBkb2Vzbid0IHVzZSBQYWdlTWFzaz8KCj4gcG1hcC5oOjE4NAo+ICB2b2lkICpwbWFwX21h cGRldih2bV9wYWRkcl90LCB2bV9zaXplX3QpOwo+ICsjaWZkZWYgTUlQUzY0X05FV19QTUFQCj4g KyNkZWZpbmUJcG1hcF9wYWdlX2lzX21hcHBlZChtKQkoIVRBSUxRX0VNUFRZKCYobSktPm1kLnB2 X2xpc3QpKQoKQXJlIHRoZXNlIGlmZGVmcyBjb3JyZWN0PyAgSSBhbSBoYXZpbmcgYSBoYXJkIHRp bWUgbWFraW5nIHNlbnNlIG9mIHdoYXQgY2hhbmdlZCBoZXJlIGFuZCB3aHkuCgo+IHB0ZS5oOjgy Cj4gKyAqIHByZXZlbnQgbG9hZGluZyBhbmQgc3RvcmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdl IGhhdmUgcmVkdWNlZCB0aGUgNTUtYml0Cj4gKyAqIHNoaWZ0IHRvIDUzIGJpdHMuCj4gICAqLwoK QWdhaW4sIHJlYWxseSBub3Qgc3VyZSB3ZSBjYW4gc2FmZWx5IGRvIHRoaXMgb24gYWxsIHN5c3Rl bXMuICBSb2JlcnQgaXMgcmlnaHQgdG8gYmUgY2F1dGlvdXMuCgo+IHZtcGFyYW0uaDoxMDkKPiAr ICogQ3VycmVudGx5IG1pcHM2NCBvbmx5IHN1cHBvcnRzIG9uZSBzaXplIG9yIGxldmVsIChWTV9M RVZFTF8wX09SREVSKSBvZgo+ICsgKiBzdXBlcnBhZ2VzICgyTUIpCj4gKyAqLwoKSSdtIHN1cnBy aXNlZCBieSB0aGlzLCBzaW5jZSB0aGVyZSBzZWVtcyB0byBoYWxmLWJlIGluZnJhc3RydWN0dXJl IGZvciBvdGhlciBsZXZlbHMuICBXaGF0J3MgdGhlIHBsYW4gaGVyZT8KCj4gcG1hcC5jOjgxMgo+ ICAJCXB0ZSA9ICpwdGVwOwo+IC0JCWlmIChwdGVfdGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVf dGVzdCgmcHRlLCBQVEVfUk8pIHx8Cj4gKwkJaWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9WQUxJRCkg JiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8Cj4gIAkJICAgIChwcm90ICYgVk1fUFJPVF9X UklURSkgPT0gMCkpIHsKCnB0ZV9pc192YWxpZCBvciB3aGF0ZXZlciBoZXJlLCBhcyB3YXMgZG9u ZSBlbHNld2hlcmU/ICBDb25zaXN0ZW5jeSB3b3VsZCBoZWxwIGdldCBvdmVyIGFsbCB0aGUgUFRF IGJpdCByZW5hbWluZy4KCj4gcG1hcC5jOjM0NTkKPiArICoKPiArICogUmVmZXJlbmNlIGJpdCBl bXVsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24uCj4g KyAqLwoKU28gd2h5IGFsbCB0aGUgbmV3IFBURSBmaWVsZHM/ICBBZ2FpbiwgY29uZnVzZWQuCgo+ IHRsYi5jOjQzCj4gIAo+ICsjaW5jbHVkZSAib3B0X3ZtLmgiCj4gKwoKTmVjZXNzYXJ5PwoKPiB0 cmFwLmM6NjQ2Cj4gKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1c2hpbmcgdGhlIHVz ZXIgVExCCj4gKwkJCQkgKiBhbmQgcmVzZXR0aW5nIHRoZSBzdGF0dXMgYml0Lgo+ICsJCQkJICov CgpDYW4geW91IGV4cGxhaW4gdG8gbWUgd2h5IHRoaXMgaGFwcGVucyB3aXRoIHRoZSBuZXcgcG1h cD8gIElzIGl0IHJlbGF0ZWQgdG8gc3VwZXJwYWdlcyBzb21laG93PyAgSXQgc2VlbXMgd29ycnlp bmcuICBBZ2FpbiwgSSBtdXN0IGJlIG1pc3Npbmcgc29tZXRoaW5nPwoKPiB2bV9nbHVlLmM6MzE1 Cj4gIAo+ICsjaWYgZGVmaW5lZChfX21pcHNfXykKPiArCgpUaGlzIGlzIGEgZ29vZCBjaGFuZ2Ug dG8gbWFrZSBzdGFjayBhbGxvY2F0aW9uIGEgYml0IG1vcmUgc2VtYW50aWMsIGZsZXhpYmxlLCBj bGVhciwgZXRjLiAgSXQncyBhbHNvIHZlcnkgc2VsZi1jb250YWluZWQsIGFuZCBJJ2Qgc3VnZ2Vz dCBpdCBiZSByZXZpZXdlZCBhbmQgY29tbWl0dGVkIHNlcGFyYXRlbHkuCgpSRVBPU0lUT1JZCiAg clMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6Ly9yZXZp ZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3 cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVu bywgc3NvbgpDYzogYnJvb2tzLCBqbWFsbGV0dCwgbWFya2osIGFsYywgc2JydW5vLCByd2F0c29u LCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxpc3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20s IG1pemhrYV9nbWFpbC5jb20K From owner-freebsd-mips@freebsd.org Fri Sep 16 21:51:39 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2074CBDD3FF for ; Fri, 16 Sep 2016 21:51:39 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id EE552267 for ; Fri, 16 Sep 2016 21:51:38 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 7B5B3BF9D; Fri, 16 Sep 2016 21:51:38 +0000 (UTC) Date: Fri, 16 Sep 2016 21:51:38 +0000 To: freebsd-mips@freebsd.org From: "adrian (Adrian Chadd)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <1ce26b0e70c239162cda410e3294b750@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcaWo= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 21:51:39 -0000 YWRyaWFuIGFkZGVkIGEgY29tbWVudC4KCgogIEkgY29tbWl0dGVkIHRoZSBwYWdlbWFzayBlbnVt ZXJhdGlvbi9wcmludGluZyBsb2dpYyB0byAtaGVhZCBhIHdoaWxlIGFnby4gV2Ugc2hvdWxkIGdh dGhlciBzb21lIGRtZXNnJ3MgZnJvbSB2YXJpb3VzIGVtYmVkZGVkIE1JUFMgYm9hcmRzLgogIAog IElJUkMsIHNvbWUgb2YgdGhlIG1pcHMyNGtjIHBhcnRzIHdlcmUgb25seSBkb2luZyA0ayBwYWdl cy4uIDooCgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKUkVWSVNJT04g REVUQUlMCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpFTUFJTCBQUkVGRVJF TkNFUwogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHBy ZWZlcmVuY2VzLwoKVG86IHNicnVubywgc3NvbgpDYzogYWRyaWFuLCBicm9va3MsIGptYWxsZXR0 LCBtYXJraiwgYWxjLCBzYnJ1bm8sIHJ3YXRzb24sIGVtYXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMt bGlzdCwgZG5lbHNvbl8xOTAxX3lhaG9vLmNvbSwgbWl6aGthX2dtYWlsLmNvbQo= From owner-freebsd-mips@freebsd.org Fri Sep 16 22:24:54 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id EF17BBDDADA for ; Fri, 16 Sep 2016 22:24:54 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id CB1CE2E4 for ; Fri, 16 Sep 2016 22:24:54 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 60A05BF97; Fri, 16 Sep 2016 22:24:54 +0000 (UTC) Date: Fri, 16 Sep 2016 22:24:54 +0000 To: freebsd-mips@freebsd.org From: "sson (Stacey Son)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <1a765d6044a36757ca5c25147952551f@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfccTY= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 22:24:55 -0000 c3NvbiBhZGRlZCBhIGNvbW1lbnQuCgoKICBJbiBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcv RDI1MzUjMTYzOTU0LCBAYWRyaWFuIHdyb3RlOgogIAogID4gSSBjb21taXR0ZWQgdGhlIHBhZ2Vt YXNrIGVudW1lcmF0aW9uL3ByaW50aW5nIGxvZ2ljIHRvIC1oZWFkIGEgd2hpbGUgYWdvLiBXZSBz aG91bGQgZ2F0aGVyIHNvbWUgZG1lc2cncyBmcm9tIHZhcmlvdXMgZW1iZWRkZWQgTUlQUyBib2Fy ZHMuCiAgPgogID4gSUlSQywgc29tZSBvZiB0aGUgbWlwczI0a2MgcGFydHMgd2VyZSBvbmx5IGRv aW5nIDRrIHBhZ2VzLi4gOigKICAKICAKICBUaGlzIHN1cGVycGFnZS9uZXcgcG1hcCBpbXBsZW1l bnRhdGlvbiByZWFsbHkgb25seSBhcHBsaWVzIHRvIG1pcHM2NC4gIFRvIHN1cHBvcnQgc3VwZXJw YWdlcyBvbiBtaXBzMzIgdGhlIHBhZ2UgdGFibGUgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZCBhIGJp dC4gIEN1cnJlbnRseSB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBpbiB0aGUgUFRFIGZvciB0aGUg YWRkaXRpb25hbCBiaXRzIG5lZWRlZC4gZS5nLCBiaXQgZm9yIHJlZmVyZW5jZSBiaXQgZW11bGF0 aW9uIChyZWZlcmVuY2UvdmFsaWQgYml0KSwgc3VwZXJwYWdlIGZsYWcsIGV0Yy4KICAKICBGWUks IEkgZG8gaGF2ZSBhIHBhdGNoIGtpY2tpbmcgYXJvdW5kIGZvciBsYXJnZSBrZXJuZWwgc3RhY2sg c3VwcG9ydCB0aGF0IHVzZXMgbXVsdGlwbGUgd2lyZWQgVExCIGVudHJpZXMgdGhhdCBtaWdodCBi ZSB1c2VmdWwgZm9yIG1pcHMzMiB3aXRoIG9ubHkgNGsgcGFnZSBzdXBwb3J0LiAgT2YgY291cnNl LCBJIGRvbid0IGtub3cgaWYgYmxvd2luZyB0aGUga2VybmVsIHN0YWNrIChlLmcuIHVzaW5nIE5G UykgaXMgYSBwcm9ibGVtIGZvciBtaXBzMzIgb3Igbm90LiAgQnJvb2tzIGhhZCBpdCBjb21taXR0 ZWQgdG8gQ2hlcmlCU0QgYXQgb25lIHRpbWUgc28gSSBrbm93IGl0IGlzIGluIHRoYXQgcmVwb3Np dG9yeS4KClJFUE9TSVRPUlkKICByUyBGcmVlQlNEIHNyYyByZXBvc2l0b3J5CgpSRVZJU0lPTiBE RVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkVNQUlMIFBSRUZFUkVO Q0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRpbmdzL3BhbmVsL2VtYWlscHJl ZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBhZHJpYW4sIGJyb29rcywgam1hbGxldHQs IG1hcmtqLCBhbGMsIHNicnVubywgcndhdHNvbiwgZW1hc3RlLCBpbXAsIGZyZWVic2QtbWlwcy1s aXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2FfZ21haWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 23:09:08 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BEAF2BDD5C4 for ; Fri, 16 Sep 2016 23:09:08 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 742161D54 for ; Fri, 16 Sep 2016 23:09:08 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id CBD23BA0E; Fri, 16 Sep 2016 23:09:07 +0000 (UTC) Date: Fri, 16 Sep 2016 23:09:07 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <3d65de3c6f99ba3978f79873a5b6007d@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfce5M= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 23:09:08 -0000 c2JydW5vIGFkZGVkIGEgY29tbWVudC4KCgogIFNlZW1zIHRoaXMgcGF0Y2ggaXMgYSBsb3QgbW9y ZSAiY2xhbmcgZnJpZW5kbHkiIGFzIHRoZSBNSVBTNjQgY2xhbmcgY29tcGlsZWQga2VybmVsIGNh biBub3cgYXQgbGVhc3QgKmdldCogdG8gdHJ5aW5nIHRvIHN0YXJ0IGluaXQ6CiAgCiAgICBzYnJ1 bm9AdGFzdHkueXN2On4gJSBxZW11LXN5c3RlbS1taXBzNjQgLW0gNTEyTSAtTSBtYWx0YSAta2Vy bmVsIC92YXIvdG1wL21pcHMubWlwczY0L2hvbWUvc2JydW5vL21pcHM2NC1jbGFuZy9zeXMvTUFM VEE2NC9rZXJuZWwgLWhkYSAuL21pcHM2NF9jbGFuZy5pbWcgLW5vZ3JhcGhpYwogICAgV0FSTklO RzogSW1hZ2UgZm9ybWF0IHdhcyBub3Qgc3BlY2lmaWVkIGZvciAnLi9taXBzNjRfY2xhbmcuaW1n JyBhbmQgcHJvYmluZyBndWVzc2VkIHJhdy4KICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZGV0 ZWN0aW5nIHRoZSBmb3JtYXQgaXMgZGFuZ2Vyb3VzIGZvciByYXcgaW1hZ2VzLCB3cml0ZSBvcGVy YXRpb25zIG9uIGJsb2NrIDAgd2lsbCBiZSByZXN0cmljdGVkLgogICAgICAgICAgICAgU3BlY2lm eSB0aGUgJ3JhdycgZm9ybWF0IGV4cGxpY2l0bHkgdG8gcmVtb3ZlIHRoZSByZXN0cmljdGlvbnMu CiAgICBlbnRyeTogcGxhdGZvcm1fc3RhcnQoKQogICAgY21kIGxpbmU6IC92YXIvdG1wL21pcHMu bWlwczY0L2hvbWUvc2JydW5vL21pcHM2NC1jbGFuZy9zeXMvTUFMVEE2NC9rZXJuZWwgIAogICAg ZW52cDoKICAgICAgICAgICAgbWVtc2l6ZSA9IDI2ODQzNTQ1NgogICAgICAgICAgICBlbWVtc2l6 ZSA9IDUzNjg3MDkxMgogICAgICAgICAgICBtb2RldHR5MCA9IDM4NDAwbjhyCiAgICBtZW1zaXpl ID0gMjY4NDM1NDU2ICgweDEwMDAwMDAwKQogICAgZW1lbXNpemUgPSA1MzY4NzA5MTIKICAgIENh Y2hlIGluZm86CiAgICAgIGljYWNoZSBpcyB2aXJ0dWFsCiAgICAgIHBpY2FjaGVfc3RyaWRlICAg ID0gODE5MgogICAgICBwaWNhY2hlX2xvb3Bjb3VudCA9IDQKICAgICAgcGRjYWNoZV9zdHJpZGUg ICAgPSA0MDk2CiAgICAgIHBkY2FjaGVfbG9vcGNvdW50ID0gOAogICAgY3B1MDogTUlQUyBUZWNo bm9sb2dpZXMgcHJvY2Vzc29yIHYxNjAuMTMwCiAgICAgIE1NVTogU3RhbmRhcmQgVExCLCA0OCBl bnRyaWVzICg0SyAxNksgNjRLIDI1NksgMU0gNE0gMTZNIDY0TSAyNTZNIHBnIHNpemVzKQogICAg KDRLIDE2SyA2NEsgMjU2SyAxTSAxNk0gNjRNIDI1Nk0gcGcgc2l6ZXMpCiAgICAgIEwxIGktY2Fj aGU6IDQgd2F5cyBvZiAyNTYgc2V0cywgMzIgYnl0ZXMgcGVyIGxpbmUKICAgICAgTDEgZC1jYWNo ZTogNCB3YXlzIG9mIDI1NiBzZXRzLCAzMiBieXRlcyBwZXIgbGluZQogICAgICBMMiBjYWNoZTog ZGlzYWJsZWQKICAgICAgQ29uZmlnMT0weGRlYTM1MTliPFBlcmZDb3VudCxXYXRjaFJlZ3MsRUpU QUcsRlBVPgogICAgICBDb25maWcyPTB4ODAwMDAwMDAKICAgIFBoeXNpY2FsIG1lbW9yeSBjaHVu ayhzKToKICAgIDB4NzJhMDAwIC0gMHhmZmZmZmZmLCAyNjA5MjMzOTIgYnl0ZXMgKDYzNzAyIHBh Z2VzKQogICAgMHg5MDAwMDAwMCAtIDB4OWZmZmZmZmYsIDI2ODQzNTQ1NiBieXRlcyAoNjU1MzYg cGFnZXMpCiAgICBNYXhtZW0gaXMgMHhhMDAwMDAwMAogICAgS0RCOiBkZWJ1Z2dlciBiYWNrZW5k czogZGRiCiAgICBLREI6IGN1cnJlbnQgYmFja2VuZDogZGRiCiAgICBDb3B5cmlnaHQgKGMpIDE5 OTItMjAxNiBUaGUgRnJlZUJTRCBQcm9qZWN0LgogICAgQ29weXJpZ2h0IChjKSAxOTc5LCAxOTgw LCAxOTgzLCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0CiAgICAgICAg ICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCiAgICBGcmVlQlNEIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhl IEZyZWVCU0QgRm91bmRhdGlvbi4KICAgIEZyZWVCU0QgMTIuMC1DVVJSRU5UICM5IHIzMDU4OTBN OiBGcmkgU2VwIDE2IDIyOjUyOjAyIFVUQyAyMDE2CiAgICAgICAgc2JydW5vQHRhc3R5Lnlzdi5m cmVlYnNkLm9yZzovdmFyL3RtcC9taXBzLm1pcHM2NC9ob21lL3NicnVuby9taXBzNjQtY2xhbmcv c3lzL01BTFRBNjQgbWlwcwogICAgY2xhbmcgdmVyc2lvbiA0LjAuMCAodHJ1bmsgMjgxNjA4KQog ICAgUHJlbG9hZGVkIGVsZiBrZXJuZWwgImtlcm5lbCIgYXQgMHhmZmZmZmZmZjgwNzFlMTAwLgog ICAgcmVhbCBtZW1vcnkgID0gNTM2ODcwOTEyICg1MjQyODhLIGJ5dGVzKQogICAgUGh5c2ljYWwg bWVtb3J5IGNodW5rKHMpOgogICAgMHgwMDg0OTAwMCAtIDB4MGZmZmZmZmYsIDI1OTc0Nzg0MCBi eXRlcyAoNjM0MTUgcGFnZXMpCiAgICAweDkwMDAwMDAwIC0gMHg5ZjJiOGZmZiwgMjU0NTEzMTUy IGJ5dGVzICg2MjEzNyBwYWdlcykKICAgIGF2YWlsIG1lbW9yeSA9IDUxMTY2ODIyNCAoNDg3TUIp CiAgICByYW5kb206IGVudHJvcHkgZGV2aWNlIGV4dGVybmFsIGludGVyZmFjZQogICAgbnVsbDog PGZ1bGwgZGV2aWNlLCBudWxsIGRldmljZSwgemVybyBkZXZpY2U+CiAgICBtZW06IDxtZW1vcnk+ CiAgICBuZnNsb2NrOiBwc2V1ZG8tZGV2aWNlCiAgICBuZXh1czA6IDxNSVBTMzIgcm9vdCBuZXh1 cz4KICAgIHJhbmRvbTogaGFydmVzdGluZyBhdHRhY2gsIDggYnl0ZXMgKDQgYml0cykgZnJvbSBu ZXh1czAKICAgIGd0MDogPEdUNjQxMjAgY2hpcD4gb24gbmV4dXMwCiAgICBwY2liMDogPEdUNjQx MjAgUENJIGJyaWRnZT4gb24gZ3QwCiAgICBwY2kwOiA8UENJIGJ1cz4gb24gcGNpYjAKICAgIHBj aTA6IGRvbWFpbj0wLCBwaHlzaWNhbCBidXM9MAogICAgZm91bmQtPiB2ZW5kb3I9MHgxMWFiLCBk ZXY9MHg0NjIwLCByZXZpZD0weDEwCiAgICAgICAgICAgIGRvbWFpbj0wLCBidXM9MCwgc2xvdD0w LCBmdW5jPTAKICAgICAgICAgICAgY2xhc3M9MDYtMDAtMDAsIGhkcnR5cGU9MHgwMCwgbWZkZXY9 MAogICAgICAgICAgICBjbWRyZWc9MHgwMDAwLCBzdGF0cmVnPTB4MDI4MCwgY2FjaGVsbnN6PTAg KGR3b3JkcykKICAgICAgICAgICAgbGF0dGltZXI9MHgwMCAoMCBucyksIG1pbmdudD0weDAwICgw IG5zKSwgbWF4bGF0PTB4MDAgKDAgbnMpCiAgICAgICAgICAgIGludHBpbj1hLCBpcnE9MAogICAg ICAgICAgICBtYXBbMTRdOiB0eXBlIFByZWZldGNoYWJsZSBNZW1vcnksIHJhbmdlIDMyLCBiYXNl IDB4MTAwMDAwMCwgc2l6ZSAyNCwgbWVtb3J5IGRpc2FibGVkCiAgICAgICAgICAgIG1hcFsxOF06 IHR5cGUgTWVtb3J5LCByYW5nZSAzMiwgYmFzZSAweDFjMDAwMDAwLCBzaXplIDI2LCBtZW1vcnkg ZGlzYWJsZWQKICAgICAgICAgICAgbWFwWzFjXTogdHlwZSBNZW1vcnksIHJhbmdlIDMyLCBiYXNl IDB4MWYwMDAwMDAsIHNpemUgMjQsIG1lbW9yeSBkaXNhYmxlZAogICAgICAgICAgICBtYXBbMjBd OiB0eXBlIE1lbW9yeSwgcmFuZ2UgMzIsIGJhc2UgMHgxNDAwMDAwMCwgc2l6ZSAyNiwgbWVtb3J5 IGRpc2FibGVkCiAgICAgICAgICAgIG1hcFsyNF06IHR5cGUgSS9PIFBvcnQsIHJhbmdlIDMyLCBi YXNlIDB4MTQwMDAwMDAsIHNpemUgMjYsIHBvcnQgZGlzYWJsZWQKICAgIHBjaWIwOiBubyBJUlEg bWFwcGluZyBmb3IgMC8wLzAvMQogICAgZm91bmQtPiB2ZW5kb3I9MHg4MDg2LCBkZXY9MHg3MTEw LCByZXZpZD0weDAwCiAgICAgICAgICAgIGRvbWFpbj0wLCBidXM9MCwgc2xvdD0xMCwgZnVuYz0w CiAgICAgICAgICAgIGNsYXNzPTA2LTAxLTAwLCBoZHJ0eXBlPTB4MDAsIG1mZGV2PTEKICAgICAg ICAgICAgY21kcmVnPTB4MDAwMCwgc3RhdHJlZz0weDAyMDAsIGNhY2hlbG5zej0wIChkd29yZHMp CiAgICAgICAgICAgIGxhdHRpbWVyPTB4MDAgKDAgbnMpLCBtaW5nbnQ9MHgwMCAoMCBucyksIG1h eGxhdD0weDAwICgwIG5zKQogICAgZm91bmQtPiB2ZW5kb3I9MHg4MDg2LCBkZXY9MHg3MTExLCBy ZXZpZD0weDAwCiAgICAgICAgICAgIGRvbWFpbj0wLCBidXM9MCwgc2xvdD0xMCwgZnVuYz0xCiAg ICAgICAgICAgIGNsYXNzPTAxLTAxLTgwLCBoZHJ0eXBlPTB4MDAsIG1mZGV2PTAKICAgICAgICAg ICAgY21kcmVnPTB4MDAwMCwgc3RhdHJlZz0weDAyODAsIGNhY2hlbG5zej0wIChkd29yZHMpCiAg ICAgICAgICAgIGxhdHRpbWVyPTB4MDAgKDAgbnMpLCBtaW5nbnQ9MHgwMCAoMCBucyksIG1heGxh dD0weDAwICgwIG5zKQogICAgICAgICAgICBtYXBbMjBdOiB0eXBlIEkvTyBQb3J0LCByYW5nZSAz MiwgYmFzZSAwLCBzaXplICA0LCBwb3J0IGRpc2FibGVkCiAgICBmb3VuZC0+IHZlbmRvcj0weDgw ODYsIGRldj0weDcxMTIsIHJldmlkPTB4MDEKICAgICAgICAgICAgZG9tYWluPTAsIGJ1cz0wLCBz bG90PTEwLCBmdW5jPTIKICAgICAgICAgICAgY2xhc3M9MGMtMDMtMDAsIGhkcnR5cGU9MHgwMCwg bWZkZXY9MAogICAgICAgICAgICBjbWRyZWc9MHgwMDAwLCBzdGF0cmVnPTB4MDAwMCwgY2FjaGVs bnN6PTAgKGR3b3JkcykKICAgICAgICAgICAgbGF0dGltZXI9MHgwMCAoMCBucyksIG1pbmdudD0w eDAwICgwIG5zKSwgbWF4bGF0PTB4MDAgKDAgbnMpCiAgICAgICAgICAgIGludHBpbj1kLCBpcnE9 MAogICAgICAgICAgICBtYXBbMjBdOiB0eXBlIEkvTyBQb3J0LCByYW5nZSAzMiwgYmFzZSAwLCBz aXplICA1LCBwb3J0IGRpc2FibGVkCiAgICBwY2liMDogbm8gSVJRIG1hcHBpbmcgZm9yIDAvMTAv Mi80CiAgICBmb3VuZC0+IHZlbmRvcj0weDgwODYsIGRldj0weDcxMTMsIHJldmlkPTB4MDMKICAg ICAgICAgICAgZG9tYWluPTAsIGJ1cz0wLCBzbG90PTEwLCBmdW5jPTMKICAgICAgICAgICAgY2xh c3M9MDYtODAtMDAsIGhkcnR5cGU9MHgwMCwgbWZkZXY9MAogICAgICAgICAgICBjbWRyZWc9MHgw MDAwLCBzdGF0cmVnPTB4MDI4MCwgY2FjaGVsbnN6PTAgKGR3b3JkcykKICAgICAgICAgICAgbGF0 dGltZXI9MHgwMCAoMCBucyksIG1pbmdudD0weDAwICgwIG5zKSwgbWF4bGF0PTB4MDAgKDAgbnMp CiAgICAgICAgICAgIGludHBpbj1hLCBpcnE9MAogICAgcGNpYjA6IG5vIElSUSBtYXBwaW5nIGZv ciAwLzEwLzMvMQogICAgZm91bmQtPiB2ZW5kb3I9MHgxMDIyLCBkZXY9MHgyMDAwLCByZXZpZD0w eDEwCiAgICAgICAgICAgIGRvbWFpbj0wLCBidXM9MCwgc2xvdD0xMSwgZnVuYz0wCiAgICAgICAg ICAgIGNsYXNzPTAyLTAwLTAwLCBoZHJ0eXBlPTB4MDAsIG1mZGV2PTAKICAgICAgICAgICAgY21k cmVnPTB4MDAwMCwgc3RhdHJlZz0weDAyODAsIGNhY2hlbG5zej0wIChkd29yZHMpCiAgICAgICAg ICAgIGxhdHRpbWVyPTB4MDAgKDAgbnMpLCBtaW5nbnQ9MHgwNiAoMTUwMCBucyksIG1heGxhdD0w eGZmICg2Mzc1MCBucykKICAgICAgICAgICAgaW50cGluPWEsIGlycT0wCiAgICAgICAgICAgIG1h cFsxMF06IHR5cGUgSS9PIFBvcnQsIHJhbmdlIDMyLCBiYXNlIDAsIHNpemUgIDUsIHBvcnQgZGlz YWJsZWQKICAgICAgICAgICAgbWFwWzE0XTogdHlwZSBNZW1vcnksIHJhbmdlIDMyLCBiYXNlIDAs IHNpemUgIDUsIG1lbW9yeSBkaXNhYmxlZAogICAgZm91bmQtPiB2ZW5kb3I9MHgxMDEzLCBkZXY9 MHgwMGI4LCByZXZpZD0weDAwCiAgICAgICAgICAgIGRvbWFpbj0wLCBidXM9MCwgc2xvdD0xOCwg ZnVuYz0wCiAgICAgICAgICAgIGNsYXNzPTAzLTAwLTAwLCBoZHJ0eXBlPTB4MDAsIG1mZGV2PTAK ICAgICAgICAgICAgY21kcmVnPTB4MDAwMCwgc3RhdHJlZz0weDAwMDAsIGNhY2hlbG5zej0wIChk d29yZHMpCiAgICAgICAgICAgIGxhdHRpbWVyPTB4MDAgKDAgbnMpLCBtaW5nbnQ9MHgwMCAoMCBu cyksIG1heGxhdD0weDAwICgwIG5zKQogICAgICAgICAgICBtYXBbMTBdOiB0eXBlIFByZWZldGNo YWJsZSBNZW1vcnksIHJhbmdlIDMyLCBiYXNlIDAsIHNpemUgMjUsIG1lbW9yeSBkaXNhYmxlZAog ICAgICAgICAgICBtYXBbMTRdOiB0eXBlIE1lbW9yeSwgcmFuZ2UgMzIsIGJhc2UgMCwgc2l6ZSAx MiwgbWVtb3J5IGRpc2FibGVkCiAgICBvYmlvMCBpcnEgMCBhdCBkZXZpY2UgMC4wIG9uIHBjaTAK ICAgIHVhcnQwOiA8MTY1NTAgb3IgY29tcGF0aWJsZT4gb24gb2JpbzAKICAgIHVhcnQwOiBjb25z b2xlICg5NjAwLG4sOCwxKQogICAgdWFydDA6IGZhc3QgaW50ZXJydXB0CiAgICB1YXJ0MDogUFBT IGNhcHR1cmUgbW9kZTogRENECiAgICByYW5kb206IGhhcnZlc3RpbmcgYXR0YWNoLCA4IGJ5dGVz ICg0IGJpdHMpIGZyb20gdWFydDAKICAgIHJhbmRvbTogaGFydmVzdGluZyBhdHRhY2gsIDggYnl0 ZXMgKDQgYml0cykgZnJvbSBvYmlvMAogICAgcGNpMDogPGJyaWRnZSwgUENJLUlTQT4gYXQgZGV2 aWNlIDEwLjAgKG5vIGRyaXZlciBhdHRhY2hlZCkKICAgIGF0YXBjaTA6IDxJbnRlbCBQSUlYNCBV RE1BMzMgY29udHJvbGxlcj4gcG9ydCAweDFmMC0weDFmNywweDNmNiwweDE3MC0weDE3NywweDM3 NiBhdCBkZXZpY2UgMTAuMSBvbiBwY2kwCiAgICBhdGFwY2kwOiBMYXp5IGFsbG9jYXRpb24gb2Yg MHgxMCBieXRlcyByaWQgMHgyMCB0eXBlIDQgYXQgMHgxMDAKICAgIGF0YTA6IDxBVEEgY2hhbm5l bD4gYXQgY2hhbm5lbCAwIG9uIGF0YXBjaTAKICAgIHJhbmRvbTogaGFydmVzdGluZyBhdHRhY2gs IDggYnl0ZXMgKDQgYml0cykgZnJvbSBhdGEwCiAgICBhdGExOiA8QVRBIGNoYW5uZWw+IGF0IGNo YW5uZWwgMSBvbiBhdGFwY2kwCiAgICByYW5kb206IGhhcnZlc3RpbmcgYXR0YWNoLCA4IGJ5dGVz ICg0IGJpdHMpIGZyb20gYXRhMQogICAgcmFuZG9tOiBoYXJ2ZXN0aW5nIGF0dGFjaCwgOCBieXRl cyAoNCBiaXRzKSBmcm9tIGF0YXBjaTAKICAgIHBjaTA6IDxzZXJpYWwgYnVzLCBVU0I+IGF0IGRl dmljZSAxMC4yIChubyBkcml2ZXIgYXR0YWNoZWQpCiAgICBwY2kwOiA8YnJpZGdlPiBhdCBkZXZp Y2UgMTAuMyAobm8gZHJpdmVyIGF0dGFjaGVkKQogICAgbGUwOiA8QU1EIFBDbmV0LVBDST4gaXJx IDEwIGF0IGRldmljZSAxMS4wIG9uIHBjaTAKICAgIGxlMDogTGF6eSBhbGxvY2F0aW9uIG9mIDB4 MjAgYnl0ZXMgcmlkIDB4MTAgdHlwZSA0IGF0IDB4MTIwCiAgICBsZTA6IDE2IHJlY2VpdmUgYnVm ZmVycywgNCB0cmFuc21pdCBidWZmZXJzCiAgICBsZTA6IGJwZiBhdHRhY2hlZAogICAgbGUwOiBF dGhlcm5ldCBhZGRyZXNzOiA1Mjo1NDowMDoxMjozNDo1NgogICAgcmFuZG9tOiBoYXJ2ZXN0aW5n IGF0dGFjaCwgOCBieXRlcyAoNCBiaXRzKSBmcm9tIGxlMAogICAgdmdhcGNpMDogPFZHQS1jb21w YXRpYmxlIGRpc3BsYXk+IGF0IGRldmljZSAxOC4wIG9uIHBjaTAKICAgIHJhbmRvbTogaGFydmVz dGluZyBhdHRhY2gsIDggYnl0ZXMgKDQgYml0cykgZnJvbSB2Z2FwY2kwCiAgICByYW5kb206IGhh cnZlc3RpbmcgYXR0YWNoLCA4IGJ5dGVzICg0IGJpdHMpIGZyb20gcGNpMAogICAgcmFuZG9tOiBo YXJ2ZXN0aW5nIGF0dGFjaCwgOCBieXRlcyAoNCBiaXRzKSBmcm9tIHBjaWIwCiAgICByYW5kb206 IGhhcnZlc3RpbmcgYXR0YWNoLCA4IGJ5dGVzICg0IGJpdHMpIGZyb20gZ3QwCiAgICBjbG9jazA6 IDxHZW5lcmljIE1JUFMzMiB0aWNrZXI+IG9uIG5leHVzMAogICAgVGltZWNvdW50ZXIgIk1JUFMz MiIgZnJlcXVlbmN5IDEwMDAwMDAwMCBIeiBxdWFsaXR5IDgwMAogICAgRXZlbnQgdGltZXIgIk1J UFMzMiIgZnJlcXVlbmN5IDEwMDAwMDAwMCBIeiBxdWFsaXR5IDgwMAogICAgcmFuZG9tOiBoYXJ2 ZXN0aW5nIGF0dGFjaCwgOCBieXRlcyAoNCBiaXRzKSBmcm9tIGNsb2NrMAogICAgRGV2aWNlIGNv bmZpZ3VyYXRpb24gZmluaXNoZWQuCiAgICBUaW1lY291bnRlcnMgdGljayBldmVyeSAxMC4wMDAg bXNlYwogICAgbG8wOiBicGYgYXR0YWNoZWQKICAgIHRjcF9pbml0OiBuZXQuaW5ldC50Y3AudGNi aGFzaHNpemUgYXV0byB0dW5lZCB0byA4MTkyCiAgICBhdGEwOiByZXNldCB0cDEgbWFzaz0wMyBv c3RhdDA9NTAgb3N0YXQxPTAwCiAgICBhdGEwOiBzdGF0MD0weDUwIGVycj0weDAxIGxzYj0weDAw IG1zYj0weDAwCiAgICBhdGEwOiBzdGF0MT0weDAwIGVycj0weDAwIGxzYj0weGZmIG1zYj0weGZm CiAgICBhdGEwOiByZXNldCB0cDIgc3RhdDA9NTAgc3RhdDE9MDAgZGV2aWNlcz0weDEKICAgIGF0 YTE6IHJlc2V0IHRwMSBtYXNrPTAzIG9zdGF0MD01MCBvc3RhdDE9MDAKICAgIGF0YTE6IHN0YXQw PTB4MDAgZXJyPTB4MDEgbHNiPTB4MTQgbXNiPTB4ZWIKICAgIGF0YTE6IHN0YXQxPTB4MDAgZXJy PTB4MDAgbHNiPTB4ZmYgbXNiPTB4ZmYKICAgIGF0YTE6IHJlc2V0IHRwMiBzdGF0MD0wMCBzdGF0 MT0wMCBkZXZpY2VzPTB4MTAwMDAKICAgIHBhc3MwIGF0IGF0YTAgYnVzIDAgc2NidXMwIHRhcmdl dCAwIGx1biAwCiAgICBwYXNzMDogPFFFTVUgSEFSRERJU0sgMi41Kz4gQVRBLTcgZGV2aWNlCiAg ICBwYXNzMDogU2VyaWFsIE51bWJlciBRTTAwMDAxCiAgICBwYXNzMDogMzMuMzAwTUIvcyB0cmFu c2ZlcnMgKFVETUEyLCBQSU8gODE5MmJ5dGVzKQogICAgcGFzczEgYXQgYXRhMSBidXMgMCBzY2J1 czEgdGFyZ2V0IDAgbHVuIDAKICAgIHBhc3MxOiA8UUVNVSBRRU1VIERWRC1ST00gMi41Kz4gUmVt b3ZhYmxlIENELVJPTSBTQ1NJIGRldmljZQogICAgcGFzczE6IFNlcmlhbCBOdW1iZXIgUU0wMDAw MwogICAgcGFzczE6IDEzLjMwME1CL3MgdHJhbnNmZXJzIChXRE1BMSwgQVRBUEkgMTJieXRlcywg UElPIDY1NTM0Ynl0ZXMpCiAgICBhZGEwIGF0IGF0YTAgYnVzIDAgc2NidXMwIHRhcmdldCAwIGx1 biAwCiAgICBhZGEwOiA8UUVNVSBIQVJERElTSyAyLjUrPiBBVEEtNyBkZXZpY2UKICAgIGFkYTA6 IFNlcmlhbCBOdW1iZXIgUU0wMDAwMQogICAgYWRhMDogMzMuMzAwTUIvcyB0cmFuc2ZlcnMgKFVE TUEyLCBQSU8gODE5MmJ5dGVzKQogICAgYWRhMDogMTAyNE1CICgyMDk3MTUyIDUxMiBieXRlIHNl Y3RvcnMpCiAgICB0YXNrcWdyb3VwX2FkanVzdCBmYWlsZWQgY250OiAxIHN0cmlkZTogMSBtcF9u Y3B1czogMSBzbXBfc3RhcnRlZDogMAogICAgdGFza3Fncm91cF9hZGp1c3QgZmFpbGVkIGNudDog MSBzdHJpZGU6IDEgbXBfbmNwdXM6IDEgc21wX3N0YXJ0ZWQ6IDAKICAgIFRyeWluZyB0byBtb3Vu dCByb290IGZyb20gdWZzOmFkYTAgW10uLi4KICAgIEdFT006IG5ldyBkaXNrIGNkMAogICAgR0VP TTogbmV3IGRpc2sgYWRhMAogICAgY2QwIGF0IGF0YTEgYnVzIDAgc2NidXMxIHRhcmdldCAwIGx1 biAwCiAgICBjZDA6IDxRRU1VIFFFTVUgRFZELVJPTSAyLjUrPiBSZW1vdmFibGUgQ0QtUk9NIFND U0kgZGV2aWNlCiAgICBjZDA6IFNlcmlhbCBOdW1iZXIgUU0wMDAwMwogICAgY2QwOiAxMy4zMDBN Qi9zIHRyYW5zZmVycyAoV0RNQTEsIEFUQVBJIDEyYnl0ZXMsIFBJTyA2NTUzNGJ5dGVzKQogICAg Y2QwOiBBdHRlbXB0IHRvIHF1ZXJ5IGRldmljZSBzaXplIGZhaWxlZDogTk9UIFJFQURZLCBNZWRp dW0gbm90IHByZXNlbnQKICAgIHdhcm5pbmc6IG5vIHRpbWUtb2YtZGF5IGNsb2NrIHJlZ2lzdGVy ZWQsIHN5c3RlbSB0aW1lIHdpbGwgbm90IGJlIHNldCBhY2N1cmF0ZWx5CiAgICBzdGFydF9pbml0 OiB0cnlpbmcgL3NiaW4vaW5pdAogICAgQUREUkVTU19TUEFDRV9FUlI6IHBpZCAxIHRpZCAxMDAw MDEgKGluaXQpLCB1aWQgMDogcGMgMHgxMjAwMmZhNzggZ290IGEgcmVhZCBmYXVsdCAodHlwZSAw eDQpIGF0IDB4ZmZmZmZmZmY4MDZlOTFmMAogICAgVHJhcGZyYW1lIFJlZ2lzdGVyIER1bXA6CiAg ICAgICAgICAgIHplcm86IDAgYXQ6IDB4ZmZmZmZmZmY4MDZlODUxMCAgdjA6IDAgICB2MTogMAog ICAgICAgICAgICBhMDogMHg3ZmZmZmZlZGYwICAgICAgICBhMTogMHg4IGEyOiAwICAgYTM6IDB4 MTIwMTEwMDAwCiAgICAgICAgICAgIGE0OiAweDMgYTU6IDAgICBhNjogMCAgIGE2OiAwCiAgICAg ICAgICAgIHQwOiAwICAgdDE6IDAgICB0MjogMCAgIHQzOiAwCiAgICAgICAgICAgIHQ4OiAwICAg dDk6IDB4MTIwMDJmYTA4IHMwOiAweDdmZmZmZmVkZTAgICAgICAgIHMxOiAweDdmZmZmZmVkYzgK ICAgICAgICAgICAgczI6IDAgICBzMzogMHgyIHM0OiAwICAgczU6IDAKICAgICAgICAgICAgczY6 IDAgICBzNzogMCAgIGswOiAwICAgazE6IDAKICAgICAgICAgICAgZ3A6IDB4MTIwMTQyZGUwIHNw OiAweDdmZmZmZmVkNTAgICAgICAgIHM4OiAweDdmZmZmZmVkNTAgICAgICAgIHJhOiAweDEyMDAw NWFmYwogICAgICAgICAgICBzcjogMHg4MDg0YjMgICAgbXVsbG86IDB4MTggICAgIG11bGhpOiAw ICAgICAgICBiYWR2YWRkcjogMHhmZmZmZmZmZjgwNmU5MWYwCiAgICAgICAgICAgIGNhdXNlOiAw eDEwICAgICBwYzogMHgxMjAwMmZhNzgKClJFUE9TSVRPUlkKICByUyBGcmVlQlNEIHNyYyByZXBv c2l0b3J5CgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1 MzUKCkVNQUlMIFBSRUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRp bmdzL3BhbmVsL2VtYWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBhZHJpYW4s IGJyb29rcywgam1hbGxldHQsIG1hcmtqLCBhbGMsIHNicnVubywgcndhdHNvbiwgZW1hc3RlLCBp bXAsIGZyZWVic2QtbWlwcy1saXN0LCBkbmVsc29uXzE5MDFfeWFob28uY29tLCBtaXpoa2FfZ21h aWwuY29tCg== From owner-freebsd-mips@freebsd.org Fri Sep 16 23:35:21 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 84BE3BDDB29 for ; Fri, 16 Sep 2016 23:35:21 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 5FC78AC9 for ; Fri, 16 Sep 2016 23:35:21 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id DE803BB07; Fri, 16 Sep 2016 23:35:20 +0000 (UTC) Date: Fri, 16 Sep 2016 23:35:20 +0000 To: freebsd-mips@freebsd.org From: "brooks (Brooks Davis)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <02e49c271487ec3f9e0f5a1909bc3a23@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcgbg= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 23:35:21 -0000 YnJvb2tzIGFkZGVkIGlubGluZSBjb21tZW50cy4KCklOTElORSBDT01NRU5UUwoKPiBqbWFsbGV0 dCB3cm90ZSBpbiBwdGUuaDo4Mgo+IEFnYWluLCByZWFsbHkgbm90IHN1cmUgd2UgY2FuIHNhZmVs eSBkbyB0aGlzIG9uIGFsbCBzeXN0ZW1zLiAgUm9iZXJ0IGlzIHJpZ2h0IHRvIGJlIGNhdXRpb3Vz LgoKSSB0aGluayB0aGlzIGNvbW1lbnQgYW5kIHRoZSByZWxhdGVkIGNoYW5nZSBpcyB1bnJlbGF0 ZWQgdG8gdGhlIG5ldyBwbWFwIGNvZGUgYW5kIHNob3VsZG4ndCBiZSBtZXJnZWQuCgpSRVBPU0lU T1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6 Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8v cmV2aWV3cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86 IHNicnVubywgc3NvbgpDYzogYWRyaWFuLCBicm9va3MsIGptYWxsZXR0LCBtYXJraiwgYWxjLCBz YnJ1bm8sIHJ3YXRzb24sIGVtYXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8x OTAxX3lhaG9vLmNvbSwgbWl6aGthX2dtYWlsLmNvbQo= From owner-freebsd-mips@freebsd.org Fri Sep 16 23:57:35 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DB282BDC2F3 for ; Fri, 16 Sep 2016 23:57:35 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id B203F8A3 for ; Fri, 16 Sep 2016 23:57:35 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 3F42BB8EB; Fri, 16 Sep 2016 23:57:35 +0000 (UTC) Date: Fri, 16 Sep 2016 23:57:35 +0000 To: freebsd-mips@freebsd.org From: "jmallett (Juli Mallett)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfchu8= MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8" X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 23:57:35 -0000 am1hbGxldHQgYWRkZWQgaW5saW5lIGNvbW1lbnRzLgoKSU5MSU5FIENPTU1FTlRTCgo+IGJyb29r cyB3cm90ZSBpbiBwdGUuaDo4Mgo+IEkgdGhpbmsgdGhpcyBjb21tZW50IGFuZCB0aGUgcmVsYXRl ZCBjaGFuZ2UgaXMgdW5yZWxhdGVkIHRvIHRoZSBuZXcgcG1hcCBjb2RlIGFuZCBzaG91bGRuJ3Qg YmUgbWVyZ2VkLgoKSSBhc3N1bWVkLCBwZXJoYXBzIHdyb25nbHkgKEkgaGF2ZSBub3QgYm90aGVy ZWQgdG8gZG8gdGhlIG1hdGgsIG5vciBleGhhdXN0aXZlbHkgdHJpZWQgdG8gd2FkZSB0aHJvdWdo IHRoZW0gYWxsKSB0aGF0IHRoaXMgd2FzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IGFkZGluZyBhbGwg dGhlIG5ldyBzb2Z0d2FyZSBiaXRzLgoKUkVQT1NJVE9SWQogIHJTIEZyZWVCU0Qgc3JjIHJlcG9z aXRvcnkKClJFVklTSU9OIERFVEFJTAogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUz NQoKRU1BSUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvc2V0dGlu Z3MvcGFuZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBzYnJ1bm8sIHNzb24KQ2M6IGFkcmlhbiwg YnJvb2tzLCBqbWFsbGV0dCwgbWFya2osIGFsYywgc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGlt cCwgZnJlZWJzZC1taXBzLWxpc3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFp bC5jb20K