From unknown Mon Jun 16 23:48:15 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#24161 <24161@debbugs.gnu.org> To: bug#24161 <24161@debbugs.gnu.org> Subject: Status: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher Reply-To: bug#24161 <24161@debbugs.gnu.org> Date: Tue, 17 Jun 2025 06:48:15 +0000 retitle 24161 [PATCH 2/2] sed: speed up matching by reguler expression with= dfa matcher reassign 24161 sed submitter 24161 Norihiro Tanaka severity 24161 normal tag 24161 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Fri Aug 05 10:04:27 2016 Received: (at submit) by debbugs.gnu.org; 5 Aug 2016 14:04:27 +0000 Received: from localhost ([127.0.0.1]:56757 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVfje-0002BJ-Vp for submit@debbugs.gnu.org; Fri, 05 Aug 2016 10:04:27 -0400 Received: from eggs.gnu.org ([208.118.235.92]:58420) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVfjd-0002B1-8U for submit@debbugs.gnu.org; Fri, 05 Aug 2016 10:04:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bVfjN-0008Le-BO for submit@debbugs.gnu.org; Fri, 05 Aug 2016 10:04:20 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:51489) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bVfjN-0008LZ-5g for submit@debbugs.gnu.org; Fri, 05 Aug 2016 10:04:09 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49301) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bVfj6-0005lj-Iy for bug-sed@gnu.org; Fri, 05 Aug 2016 10:04:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bVfit-0008Dd-UQ for bug-sed@gnu.org; Fri, 05 Aug 2016 10:03:51 -0400 Received: from mailgw06.kcn.ne.jp ([61.86.7.213]:42004) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bVfis-00089o-6P for bug-sed@gnu.org; Fri, 05 Aug 2016 10:03:39 -0400 Received: from mxs01-s (mailgw1.kcn.ne.jp [61.86.15.233]) by mailgw06.kcn.ne.jp (Postfix) with ESMTP id E9E58E8002B for ; Fri, 5 Aug 2016 23:03:27 +0900 (JST) X-matriXscan-loop-detect: b3034c20a62f9ae5536c3950510754becffb59a8 Received: from mail03.kcn.ne.jp ([61.86.6.182]) by mxs01-s with ESMTP; Fri, 05 Aug 2016 23:03:25 +0900 (JST) Received: from [10.120.1.35] (i118-21-128-66.s30.a048.ap.plala.or.jp [118.21.128.66]) by mail03.kcn.ne.jp (Postfix) with ESMTPA id A65111410099 for ; Fri, 5 Aug 2016 23:03:23 +0900 (JST) Date: Fri, 05 Aug 2016 23:03:26 +0900 From: Norihiro Tanaka To: Subject: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher Message-Id: <20160805230325.6516.27F6AC2D@kcn.ne.jp> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------_57A497D20000000064F2_MULTIPART_MIXED_" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.65.07 [ja] X-matriXscan-Sophos-AV: Clean X-matriXscan-Action: Approve X-matriXscan: Uncategorized X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --------_57A497D20000000064F2_MULTIPART_MIXED_ Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hi, We can speeds up sed by using dfa matcher brought from grep. gawk users it, sed does not uses it yet. It will speed up matching for typical cases. $ yes $(printf %040d 0) | head -1000000 >k Before: ]$ time -p env LC_ALL=C sed/sed -ne /000000000k/p k real 3.04 user 2.99 sys 0.03 $ time -p env LC_ALL=en_US.utf8 sed/sed -ne /000000000k/p k real 3.04 user 2.90 sys 0.06 $ time -p env LC_ALL=ja_JP.eucjp sed/sed -ne /000000000k/p k real 7.09 user 6.77 sys 0.31 After patching: $ time -p env LC_ALL=C sed/sed -ne /000000000k/p k real 0.29 user 0.15 sys 0.10 $ time -p env LC_ALL=en_US.utf8 sed/sed -ne /000000000k/p k real 0.27 user 0.25 sys 0.02 $ time -p env LC_ALL=ja_JP.eucjp sed/sed -ne /000000000k/p k real 0.33 user 0.29 sys 0.03 I believe that this patch can greatly improve performance of matching by sed, however I worry about the maintenance as updates for dfa is always done in grep. Thanks, Norihiro --------_57A497D20000000064F2_MULTIPART_MIXED_ Content-Type: text/plain; charset="US-ASCII"; name="0002-sed-speed-up-matching-by-reguler-expression-with-dfa.patch" Content-Disposition: attachment; filename="0002-sed-speed-up-matching-by-reguler-expression-with-dfa.patch" Content-Transfer-Encoding: base64 RnJvbSA4ZjZjZWYxMDNlMGVjMDVmMDBkMDlmNTE0Y2IyY2IxNDg0ZjZmY2RkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOb3JpaGlybyBUYW5ha2EgPG5vcml0bmtAa2NuLm5lLmpwPgpE YXRlOiBGcmksIDUgQXVnIDIwMTYgMDg6NTA6MzIgKzA5MDAKU3ViamVjdDogW1BBVENIIDIvMl0g c2VkOiBzcGVlZCB1cCBtYXRjaGluZyBieSByZWd1bGVyIGV4cHJlc3Npb24gd2l0aCBkZmEgbWF0 Y2hlcgoKTm93IHNlZCB1c2VzIGRmYSBtYXRjaGVyIGZvciBtYXRjaGluZyByZWd1bGVyIGV4cHJl c3Npb24sIGFuZCBpdCBzcGVlZHMKdXAgMTB4IGZvciB0eXBpY2FsIGNhc2UuCgoqIHNlZC9ORVdT OiBNZW50aW9uIGl0LgoqIHNlZC9sb2NhbC5tayAoc2VkX3NlZF9TT1VSQ0VTKTogQWRkIGRmYS5j Lgoobm9pbnN0X0hFQURFUlMpOiBBZGQgZGZhLmguCiogc2VkL3JlZ2V4cC5jIChkZmFlcnJvciwg ZGZhd2Fybik6IE5ldyBmdW5jdGlvbnMuCihjb21waWxlX3JlZ2V4XzEpOiBDb21waWxlIHBhdHRl cm4gd2l0aCBkZmEuCihtYXRjaF9yZWdleCk6IFVzZSBkZmEuCiogc2VkL3NlZC5oOiBJbmNsdWRl IGRmYS5oLgooc3RydWN0IHJlZ2V4KTogTmV3IG1lbWJlciBkZmEuCiogc2VkL2RmYS5jOiBOZXcg ZmlsZSBkZXJpdmVkIGZyb20gZ3JlcC4KKiBzZWQvZGZhLmg6IE5ldyBmaWxlIGRlcml2ZWQgZnJv bSBncmVwLgotLS0KIE5FV1MgICAgICAgICB8ICAgIDIgKwogc2VkL2RmYS5jICAgIHwgNDAxMCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr CiBzZWQvZGZhLmggICAgfCAgMTAzICsrCiBzZWQvbG9jYWwubWsgfCAgICA2ICstCiBzZWQvcmVn ZXhwLmMgfCAgIDQzICsKIHNlZC9zZWQuaCAgICB8ICAgIDIgKwogNiBmaWxlcyBjaGFuZ2VkLCA0 MTY0IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2Vk L2RmYS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2VkL2RmYS5oCgpkaWZmIC0tZ2l0IGEvTkVXUyBi L05FV1MKaW5kZXggNmFmOGI5YS4uYTg2NDMzYiAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdT CkBAIC03Niw2ICs3Niw4IEBAIEdOVSBzZWQgTkVXUyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0qLSBvdXRsaW5lIC0qLQogCiAqKiBJbXByb3ZlbWVudHMKIAorICBzZWQgaXMg bm93IHR5cGljYWx5IDEweCBmYXN0IGZvciBtYXRjaGluZyBieSByZWd1bGFyIGV4cHJlc3Npb24u CisKICAgc2VkIG5vdyB1c2VzIHVubG9ja2VkLWlvIHdoZXJlIGF2YWlsYWJsZSwgcmVzdWx0aW5n IGluIGZhc3RlciBJL08KICAgb3BlcmF0aW9ucy4KIApkaWZmIC0tZ2l0IGEvc2VkL2RmYS5jIGIv c2VkL2RmYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDc0MWMKLS0t IC9kZXYvbnVsbAorKysgYi9zZWQvZGZhLmMKQEAgLTAsMCArMSw0MDEwIEBACisvKiBkZmEuYyAt IGRldGVybWluaXN0aWMgZXh0ZW5kZWQgcmVnZXhwIHJvdXRpbmVzIGZvciBHTlUKKyAgIENvcHly aWdodCAoQykgMTk4OCwgMTk5OCwgMjAwMCwgMjAwMiwgMjAwNC0yMDA1LCAyMDA3LTIwMTYgRnJl ZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4s CisgICA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt MTMwMSwgVVNBICovCisKKy8qIFdyaXR0ZW4gSnVuZSwgMTk4OCBieSBNaWtlIEhhZXJ0ZWwKKyAg IE1vZGlmaWVkIEp1bHksIDE5ODggYnkgQXJ0aHVyIERhdmlkIE9sc29uIHRvIGFzc2lzdCBCTUcg c3BlZWR1cHMgICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgImRmYS5oIgor CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRp by5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUg PHN0cmluZy5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjZGVmaW5lIFNUUkVRKGEsIGIpIChz dHJjbXAgKGEsIGIpID09IDApCisKKy8qIElTQVNDSUlESUdJVCBkaWZmZXJzIGZyb20gaXNkaWdp dCwgYXMgZm9sbG93czoKKyAgIC0gSXRzIGFyZyBtYXkgYmUgYW55IGludCBvciB1bnNpZ25lZCBp bnQ7IGl0IG5lZWQgbm90IGJlIGFuIHVuc2lnbmVkIGNoYXIuCisgICAtIEl0J3MgZ3VhcmFudGVl ZCB0byBldmFsdWF0ZSBpdHMgYXJndW1lbnQgZXhhY3RseSBvbmNlLgorICAgLSBJdCdzIHR5cGlj YWxseSBmYXN0ZXIuCisgICBQb3NpeCAxMDAzLjItMTk5MiBzZWN0aW9uIDIuNS4yLjEgcGFnZSA1 MCBsaW5lcyAxNTU2LTE1NTggc2F5cyB0aGF0CisgICBvbmx5ICcwJyB0aHJvdWdoICc5JyBhcmUg ZGlnaXRzLiAgUHJlZmVyIElTQVNDSUlESUdJVCB0byBpc2RpZ2l0IHVubGVzcworICAgaXQncyBp bXBvcnRhbnQgdG8gdXNlIHRoZSBsb2NhbGUncyBkZWZpbml0aW9uIG9mICJkaWdpdCIgZXZlbiB3 aGVuIHRoZQorICAgaG9zdCBkb2VzIG5vdCBjb25mb3JtIHRvIFBvc2l4LiAgKi8KKyNkZWZpbmUg SVNBU0NJSURJR0lUKGMpICgodW5zaWduZWQpIChjKSAtICcwJyA8PSA5KQorCisjaW5jbHVkZSAi Z2V0dGV4dC5oIgorI2RlZmluZSBfKHN0cikgZ2V0dGV4dCAoc3RyKQorCisjaW5jbHVkZSA8d2No YXIuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKworLyogSFBVWCBkZWZpbmVzIHRoZXNlIGFzIG1h Y3JvcyBpbiBzeXMvcGFyYW0uaC4gICovCisjaWZkZWYgc2V0Yml0CisjIHVuZGVmIHNldGJpdAor I2VuZGlmCisjaWZkZWYgY2xyYml0CisjIHVuZGVmIGNscmJpdAorI2VuZGlmCisKKy8qIEZpcnN0 IGludGVnZXIgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gYW55IGNoYXJhY3RlciBjb2RlLiAg Ki8KK2VudW0geyBOT1RDSEFSID0gMSA8PCBDSEFSX0JJVCB9OworCisvKiBUaGlzIHJlcHJlc2Vu dHMgcGFydCBvZiBhIGNoYXJhY3RlciBjbGFzcy4gIEl0IG11c3QgYmUgdW5zaWduZWQgYW5kCisg ICBhdCBsZWFzdCBDSEFSQ0xBU1NfV09SRF9CSVRTIHdpZGUuICBBbnkgZXhjZXNzIGJpdHMgYXJl IHplcm8uICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgY2hhcmNsYXNzX3dvcmQ7CisKKy8qIFRo ZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIGEgY2hhcmNsYXNzIHdvcmQuICB1dGY4X2NsYXNzZXMg YXNzdW1lcworICAgdGhpcyBpcyBleGFjdGx5IDMyLiAgKi8KK2VudW0geyBDSEFSQ0xBU1NfV09S RF9CSVRTID0gMzIgfTsKKworLyogVGhlIG1heGltdW0gdXNlZnVsIHZhbHVlIG9mIGEgY2hhcmNs YXNzX3dvcmQ7IGFsbCB1c2VkIGJpdHMgYXJlIDEuICAqLworI2RlZmluZSBDSEFSQ0xBU1NfV09S RF9NQVNLIFwKKyAgKCgoY2hhcmNsYXNzX3dvcmQpIDEgPDwgKENIQVJDTEFTU19XT1JEX0JJVFMg LSAxKSA8PCAxKSAtIDEpCisKKy8qIE51bWJlciBvZiB3b3JkcyByZXF1aXJlZCB0byBob2xkIGEg Yml0IGZvciBldmVyeSBjaGFyYWN0ZXIuICAqLworZW51bQoreworICBDSEFSQ0xBU1NfV09SRFMg PSAoTk9UQ0hBUiArIENIQVJDTEFTU19XT1JEX0JJVFMgLSAxKSAvIENIQVJDTEFTU19XT1JEX0JJ VFMKK307CisKKy8qIFNldHMgb2YgdW5zaWduZWQgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGFzIGJp dCB2ZWN0b3JzIGluIGFycmF5cyBvZiBpbnRzLiAgKi8KK3R5cGVkZWYgY2hhcmNsYXNzX3dvcmQg Y2hhcmNsYXNzW0NIQVJDTEFTU19XT1JEU107CisKKy8qIENvbnZlcnQgYSBwb3NzaWJseS1zaWdu ZWQgY2hhcmFjdGVyIHRvIGFuIHVuc2lnbmVkIGNoYXJhY3Rlci4gIFRoaXMgaXMKKyAgIGEgYml0 IHNhZmVyIHRoYW4gY2FzdGluZyB0byB1bnNpZ25lZCBjaGFyLCBzaW5jZSBpdCBjYXRjaGVzIHNv bWUgdHlwZQorICAgZXJyb3JzIHRoYXQgdGhlIGNhc3QgZG9lc24ndC4gICovCitzdGF0aWMgdW5z aWduZWQgY2hhcgordG9fdWNoYXIgKGNoYXIgY2gpCit7CisgIHJldHVybiBjaDsKK30KKworLyog Q29udGV4dHMgdGVsbCB1cyB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIGEgbmV3bGluZSBvciBhIHdv cmQgY29uc3RpdHVlbnQuCisgICBXb3JkLWNvbnN0aXR1ZW50IGNoYXJhY3RlcnMgYXJlIHRob3Nl IHRoYXQgc2F0aXNmeSBpc3dhbG51bSwgcGx1cyAnXycuCisgICBFYWNoIGNoYXJhY3RlciBoYXMg YSBzaW5nbGUgQ1RYXyogdmFsdWU7IGJpdG1hc2tzIG9mIENUWF8qIHZhbHVlcyBkZW5vdGUKKyAg IGEgcGFydGljdWxhciBjaGFyYWN0ZXIgY2xhc3MuCisKKyAgIEEgc3RhdGUgYWxzbyBzdG9yZXMg YSBjb250ZXh0IHZhbHVlLCB3aGljaCBpcyBhIGJpdG1hc2sgb2YgQ1RYXyogdmFsdWVzLgorICAg QSBzdGF0ZSdzIGNvbnRleHQgcmVwcmVzZW50cyBhIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhl IHN0YXRlJ3MKKyAgIHByZWRlY2Vzc29ycyBtdXN0IG1hdGNoLiAgRm9yIGV4YW1wbGUsIGEgc3Rh dGUgd2hvc2UgY29udGV4dCBkb2VzIG5vdAorICAgaW5jbHVkZSBDVFhfTEVUVEVSIHdpbGwgbmV2 ZXIgaGF2ZSB0cmFuc2l0aW9ucyB3aGVyZSB0aGUgcHJldmlvdXMKKyAgIGNoYXJhY3RlciBpcyBh IHdvcmQgY29uc3RpdHVlbnQuICBBIHN0YXRlIHdob3NlIGNvbnRleHQgaXMgQ1RYX0FOWQorICAg bWlnaHQgaGF2ZSB0cmFuc2l0aW9ucyBmcm9tIGFueSBjaGFyYWN0ZXIuICAqLworCisjZGVmaW5l IENUWF9OT05FCTEKKyNkZWZpbmUgQ1RYX0xFVFRFUgkyCisjZGVmaW5lIENUWF9ORVdMSU5FCTQK KyNkZWZpbmUgQ1RYX0FOWQkJNworCisvKiBTb21ldGltZXMgY2hhcmFjdGVycyBjYW4gb25seSBi ZSBtYXRjaGVkIGRlcGVuZGluZyBvbiB0aGUgc3Vycm91bmRpbmcKKyAgIGNvbnRleHQuICBTdWNo IGNvbnRleHQgZGVjaXNpb25zIGRlcGVuZCBvbiB3aGF0IHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIK KyAgIHdhcywgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCAobG9va2FoZWFkKSBjaGFyYWN0 ZXIuICBDb250ZXh0CisgICBkZXBlbmRlbnQgY29uc3RyYWludHMgYXJlIGVuY29kZWQgYXMgOCBi aXQgaW50ZWdlcnMuICBFYWNoIGJpdCB0aGF0CisgICBpcyBzZXQgaW5kaWNhdGVzIHRoYXQgdGhl IGNvbnN0cmFpbnQgc3VjY2VlZHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGNvbnRleHQuCisK KyAgIGJpdCA4LTExIC0gdmFsaWQgY29udGV4dHMgd2hlbiBuZXh0IGNoYXJhY3RlciBpcyBDVFhf TkVXTElORQorICAgYml0IDQtNyAgLSB2YWxpZCBjb250ZXh0cyB3aGVuIG5leHQgY2hhcmFjdGVy IGlzIENUWF9MRVRURVIKKyAgIGJpdCAwLTMgIC0gdmFsaWQgY29udGV4dHMgd2hlbiBuZXh0IGNo YXJhY3RlciBpcyBDVFhfTk9ORQorCisgICBUaGUgbWFjcm8gU1VDQ0VFRFNfSU5fQ09OVEVYVCBk ZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBjb25zdHJhaW50CisgICBzdWNjZWVkcyBpbiBhIHBh cnRpY3VsYXIgY29udGV4dC4gIFByZXYgaXMgYSBiaXRtYXNrIG9mIHBvc3NpYmxlCisgICBjb250 ZXh0IHZhbHVlcyBmb3IgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgY3VyciBpcyB0aGUgKHNpbmds ZS1iaXQpCisgICBjb250ZXh0IHZhbHVlIGZvciB0aGUgbG9va2FoZWFkIGNoYXJhY3Rlci4gICov CisjZGVmaW5lIE5FV0xJTkVfQ09OU1RSQUlOVChjb25zdHJhaW50KSAoKChjb25zdHJhaW50KSA+ PiA4KSAmIDB4ZikKKyNkZWZpbmUgTEVUVEVSX0NPTlNUUkFJTlQoY29uc3RyYWludCkgICgoKGNv bnN0cmFpbnQpID4+IDQpICYgMHhmKQorI2RlZmluZSBPVEhFUl9DT05TVFJBSU5UKGNvbnN0cmFp bnQpICAgICgoY29uc3RyYWludCkgICAgICAgJiAweGYpCisKKyNkZWZpbmUgU1VDQ0VFRFNfSU5f Q09OVEVYVChjb25zdHJhaW50LCBwcmV2LCBjdXJyKSBcCisgICgoKChjdXJyKSAmIENUWF9OT05F ICAgICAgPyBPVEhFUl9DT05TVFJBSU5UIChjb25zdHJhaW50KSA6IDApIFwKKyAgICB8ICgoY3Vy cikgJiBDVFhfTEVUVEVSICA/IExFVFRFUl9DT05TVFJBSU5UIChjb25zdHJhaW50KSA6IDApIFwK KyAgICB8ICgoY3VycikgJiBDVFhfTkVXTElORSA/IE5FV0xJTkVfQ09OU1RSQUlOVCAoY29uc3Ry YWludCkgOiAwKSkgJiAocHJldikpCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGRlc2NyaWJl IHdoYXQgYSBjb25zdHJhaW50IGRlcGVuZHMgb24uICAqLworI2RlZmluZSBQUkVWX05FV0xJTkVf Q09OU1RSQUlOVChjb25zdHJhaW50KSAoKChjb25zdHJhaW50KSA+PiAyKSAmIDB4MTExKQorI2Rl ZmluZSBQUkVWX0xFVFRFUl9DT05TVFJBSU5UKGNvbnN0cmFpbnQpICAoKChjb25zdHJhaW50KSA+ PiAxKSAmIDB4MTExKQorI2RlZmluZSBQUkVWX09USEVSX0NPTlNUUkFJTlQoY29uc3RyYWludCkg ICAgKChjb25zdHJhaW50KSAgICAgICAmIDB4MTExKQorCisjZGVmaW5lIFBSRVZfTkVXTElORV9E RVBFTkRFTlQoY29uc3RyYWludCkgXAorICAoUFJFVl9ORVdMSU5FX0NPTlNUUkFJTlQgKGNvbnN0 cmFpbnQpICE9IFBSRVZfT1RIRVJfQ09OU1RSQUlOVCAoY29uc3RyYWludCkpCisjZGVmaW5lIFBS RVZfTEVUVEVSX0RFUEVOREVOVChjb25zdHJhaW50KSBcCisgIChQUkVWX0xFVFRFUl9DT05TVFJB SU5UIChjb25zdHJhaW50KSAhPSBQUkVWX09USEVSX0NPTlNUUkFJTlQgKGNvbnN0cmFpbnQpKQor CisvKiBUb2tlbnMgdGhhdCBtYXRjaCB0aGUgZW1wdHkgc3RyaW5nIHN1YmplY3QgdG8gc29tZSBj b25zdHJhaW50IGFjdHVhbGx5CisgICB3b3JrIGJ5IGFwcGx5aW5nIHRoYXQgY29uc3RyYWludCB0 byBkZXRlcm1pbmUgd2hhdCBtYXkgZm9sbG93IHRoZW0sCisgICB0YWtpbmcgaW50byBhY2NvdW50 IHdoYXQgaGFzIGdvbmUgYmVmb3JlLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlCisgICB0aGUg Y29uc3RyYWludHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lhbCB0b2tlbnMgcHJldmlvdXNs eSBkZWZpbmVkLiAgKi8KKyNkZWZpbmUgTk9fQ09OU1RSQUlOVCAgICAgICAgIDB4Nzc3CisjZGVm aW5lIEJFR0xJTkVfQ09OU1RSQUlOVCAgICAweDQ0NAorI2RlZmluZSBFTkRMSU5FX0NPTlNUUkFJ TlQgICAgMHg3MDAKKyNkZWZpbmUgQkVHV09SRF9DT05TVFJBSU5UICAgIDB4MDUwCisjZGVmaW5l IEVORFdPUkRfQ09OU1RSQUlOVCAgICAweDIwMgorI2RlZmluZSBMSU1XT1JEX0NPTlNUUkFJTlQg ICAgMHgyNTIKKyNkZWZpbmUgTk9UTElNV09SRF9DT05TVFJBSU5UIDB4NTI1CisKKy8qIFRoZSBy ZWdleHAgaXMgcGFyc2VkIGludG8gYW4gYXJyYXkgb2YgdG9rZW5zIGluIHBvc3RmaXggZm9ybS4g IFNvbWUgdG9rZW5zCisgICBhcmUgb3BlcmF0b3JzIGFuZCBvdGhlcnMgYXJlIHRlcm1pbmFsIHN5 bWJvbHMuICBNb3N0IChidXQgbm90IGFsbCkgb2YgdGhlc2UKKyAgIGNvZGVzIGFyZSByZXR1cm5l ZCBieSB0aGUgbGV4aWNhbCBhbmFseXplci4gICovCisKK3R5cGVkZWYgcHRyZGlmZl90IHRva2Vu OworCisvKiBQcmVkZWZpbmVkIHRva2VuIHZhbHVlcy4gICovCitlbnVtCit7CisgIEVORCA9IC0x LCAgICAgICAgICAgICAgICAgICAgIC8qIEVORCBpcyBhIHRlcm1pbmFsIHN5bWJvbCB0aGF0IG1h dGNoZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBpbnB1 dDsgYW55IHZhbHVlIG9mIEVORCBvciBsZXNzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHRoZSBwYXJzZSB0cmVlIGlzIHN1Y2ggYSBzeW1ib2wuICBBY2NlcHRpbmcKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzIG9mIHRoZSBERkEgYXJlIHRo b3NlIHRoYXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh IHRyYW5zaXRpb24gb24gRU5ELiAgKi8KKworICAvKiBPcmRpbmFyeSBjaGFyYWN0ZXIgdmFsdWVz IGFyZSB0ZXJtaW5hbCBzeW1ib2xzIHRoYXQgbWF0Y2ggdGhlbXNlbHZlcy4gICovCisKKyAgRU1Q VFkgPSBOT1RDSEFSLCAgICAgICAgICAgICAgLyogRU1QVFkgaXMgYSB0ZXJtaW5hbCBzeW1ib2wg dGhhdCBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbXB0 eSBzdHJpbmcuICAqLworCisgIEJBQ0tSRUYsICAgICAgICAgICAgICAgICAgICAgIC8qIEJBQ0tS RUYgaXMgZ2VuZXJhdGVkIGJ5IFw8ZGlnaXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG9yIGJ5IGFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpcyBub3QgY29tcGxldGVseSBoYW5kbGVkLiAgSWYgdGhlIHNjYW5u ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0cyBhIHRyYW5zaXRp b24gb24gYmFja3JlZiwgaXQgcmV0dXJucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhIGtpbmQgb2YgInNlbWktc3VjY2VzcyIgaW5kaWNhdGluZyB0aGF0CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCB3aWxsIGhhdmUgdG8gYmUgdmVyaWZp ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJhY2t0cmFja2lu ZyBtYXRjaGVyLiAgKi8KKworICBCRUdMSU5FLCAgICAgICAgICAgICAgICAgICAgICAvKiBCRUdM SU5FIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLiAgKi8KKworICBFTkRMSU5F LCAgICAgICAgICAgICAgICAgICAgICAvKiBFTkRMSU5FIGlzIGEgdGVybWluYWwgc3ltYm9sIHRo YXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW1wdHkg c3RyaW5nIGF0IHRoZSBlbmQgb2YgYSBsaW5lLiAgKi8KKworICBCRUdXT1JELCAgICAgICAgICAg ICAgICAgICAgICAvKiBCRUdXT1JEIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRo ZSBiZWdpbm5pbmcgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jk LiAgKi8KKworICBFTkRXT1JELCAgICAgICAgICAgICAgICAgICAgICAvKiBFTkRXT1JEIGlzIGEg dGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgb2YgYSB3b3JkLiAgKi8KKworICBM SU1XT1JELCAgICAgICAgICAgICAgICAgICAgICAvKiBMSU1XT1JEIGlzIGEgdGVybWluYWwgc3lt Ym9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUg ZW1wdHkgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb3IgdGhlCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVuZCBvZiBhIHdvcmQuICAqLworCisgIE5PVExJTVdPUkQsICAgICAg ICAgICAgICAgICAgIC8qIE5PVExJTVdPUkQgaXMgYSB0ZXJtaW5hbCBzeW1ib2wgdGhhdAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcg bm90IGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcg b3IgZW5kIG9mIGEgd29yZC4gICovCisKKyAgUU1BUkssICAgICAgICAgICAgICAgICAgICAgICAg LyogUU1BUksgaXMgYW4gb3BlcmF0b3Igb2Ygb25lIGFyZ3VtZW50IHRoYXQKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyB6ZXJvIG9yIG9uZSBvY2N1cnJlbmNlcyBv ZiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQuICAqLwor CisgIFNUQVIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNUQVIgaXMgYW4gb3BlcmF0b3Ig b2Ygb25lIGFyZ3VtZW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bWF0Y2hlcyB0aGUgS2xlZW5lIGNsb3N1cmUgKHplcm8gb3IgbW9yZQorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlcykgb2YgaXRzIGFyZ3VtZW50LiAgKi8KKwor ICBQTFVTLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQTFVTIGlzIGFuIG9wZXJhdG9yIG9m IG9uZSBhcmd1bWVudCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1h dGNoZXMgdGhlIHBvc2l0aXZlIGNsb3N1cmUgKG9uZSBvciBtb3JlCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzKSBvZiBpdHMgYXJndW1lbnQuICAqLworCisg IFJFUE1OLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFUE1OIGlzIGEgbGV4aWNhbCB0b2tl biBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRo ZSB7bSxufSBjb25zdHJ1Y3QuICBSRVBNTiBuZXZlcgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhcHBlYXJzIGluIHRoZSBjb21waWxlZCB0b2tlbiB2ZWN0b3IuICAqLworCisg IENBVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENBVCBpcyBhbiBvcGVyYXRvciBvZiB0 d28gYXJndW1lbnRzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0 Y2hlcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYXJndW1lbnRzLiAgQ0FUIGlzIG5ldmVyIHJldHVybmVkIGJ5IHRoZQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhpY2FsIGFuYWx5emVyLiAgKi8KKworICBP UiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUiBpcyBhbiBvcGVyYXRvciBvZiB0d28g YXJndW1lbnRzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hl cyBlaXRoZXIgb2YgaXRzIGFyZ3VtZW50cy4gICovCisKKyAgTFBBUkVOLCAgICAgICAgICAgICAg ICAgICAgICAgLyogTFBBUkVOIG5ldmVyIGFwcGVhcnMgaW4gdGhlIHBhcnNlIHRyZWUsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG9ubHkgYSBsZXhlbWUuICAqLwor CisgIFJQQVJFTiwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJQQVJFTiBuZXZlciBhcHBlYXJz IGluIHRoZSBwYXJzZSB0cmVlLiAgKi8KKworICBBTllDSEFSLCAgICAgICAgICAgICAgICAgICAg ICAvKiBBTllDSEFSIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbGlkIG11bHRpYnl0ZSAob3Igc2luZ2xlIGJ5 dGUpIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMg dXNlZCBvbmx5IGlmIE1CX0NVUl9NQVggPiAxLiAgKi8KKworICBNQkNTRVQsICAgICAgICAgICAg ICAgICAgICAgICAvKiBNQkNTRVQgaXMgc2ltaWxhciB0byBDU0VULCBidXQgZm9yCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLiAgKi8KKwor ICBXQ0hBUiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHJldHVybmVkIGJ5IGxleC4g IHdjdG9rIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3 aWRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbi4gICovCisKKyAgQ1NFVCAgICAgICAgICAgICAg ICAgICAgICAgICAgLyogQ1NFVCBhbmQgKGFuZCBhbnkgdmFsdWUgZ3JlYXRlcikgaXMgYQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCBzeW1ib2wgdGhhdCBtYXRj aGVzIGFueSBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG9m IGNoYXJhY3RlcnMuICAqLworfTsKKworCisvKiBTdGF0ZXMgb2YgdGhlIHJlY29nbml6ZXIgY29y cmVzcG9uZCB0byBzZXRzIG9mIHBvc2l0aW9ucyBpbiB0aGUgcGFyc2UKKyAgIHRyZWUsIHRvZ2V0 aGVyIHdpdGggdGhlIGNvbnN0cmFpbnRzIHVuZGVyIHdoaWNoIHRoZXkgbWF5IGJlIG1hdGNoZWQu CisgICBTbyBhIHBvc2l0aW9uIGlzIGVuY29kZWQgYXMgYW4gaW5kZXggaW50byB0aGUgcGFyc2Ug dHJlZSB0b2dldGhlciB3aXRoCisgICBhIGNvbnN0cmFpbnQuICAqLwordHlwZWRlZiBzdHJ1Y3QK K3sKKyAgc2l6ZV90IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5kZXggaW50byB0aGUgcGFy c2UgYXJyYXkuICAqLworICB1bnNpZ25lZCBpbnQgY29uc3RyYWludDsgICAgICAvKiBDb25zdHJh aW50IGZvciBtYXRjaGluZyB0aGlzIHBvc2l0aW9uLiAgKi8KK30gcG9zaXRpb247CisKKy8qIFNl dHMgb2YgcG9zaXRpb25zIGFyZSBzdG9yZWQgYXMgYXJyYXlzLiAgKi8KK3R5cGVkZWYgc3RydWN0 Cit7CisgIHBvc2l0aW9uICplbGVtczsgICAgICAgICAgICAgIC8qIEVsZW1lbnRzIG9mIHRoaXMg cG9zaXRpb24gc2V0LiAgKi8KKyAgc2l6ZV90IG5lbGVtOyAgICAgICAgICAgICAgICAgLyogTnVt YmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LiAgKi8KKyAgc2l6ZV90IGFsbG9jOyAgICAgICAg ICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGFsbG9jYXRlZCBpbiBFTEVNUy4gICovCit9 IHBvc2l0aW9uX3NldDsKKworLyogU2V0cyBvZiBsZWF2ZXMgYXJlIGFsc28gc3RvcmVkIGFzIGFy cmF5cy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgKmVsZW1zOyAgICAgICAgICAg ICAgICAvKiBFbGVtZW50cyBvZiB0aGlzIHBvc2l0aW9uIHNldC4gICovCisgIHNpemVfdCBuZWxl bTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHNldC4gICov Cit9IGxlYWZfc2V0OworCisvKiBBIHN0YXRlIG9mIHRoZSBkZmEgY29uc2lzdHMgb2YgYSBzZXQg b2YgcG9zaXRpb25zLCBzb21lIGZsYWdzLAorICAgYW5kIHRoZSB0b2tlbiB2YWx1ZSBvZiB0aGUg bG93ZXN0LW51bWJlcmVkIHBvc2l0aW9uIG9mIHRoZSBzdGF0ZSB0aGF0CisgICBjb250YWlucyBh biBFTkQgdG9rZW4uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGhhc2g7ICAgICAg ICAgICAgICAgICAgLyogSGFzaCBvZiB0aGUgcG9zaXRpb25zIG9mIHRoaXMgc3RhdGUuICAqLwor ICBwb3NpdGlvbl9zZXQgZWxlbXM7ICAgICAgICAgICAvKiBQb3NpdGlvbnMgdGhpcyBzdGF0ZSBj b3VsZCBtYXRjaC4gICovCisgIHVuc2lnbmVkIGNoYXIgY29udGV4dDsgICAgICAgIC8qIENvbnRl eHQgZnJvbSBwcmV2aW91cyBzdGF0ZS4gICovCisgIHVuc2lnbmVkIHNob3J0IGNvbnN0cmFpbnQ7 ICAgIC8qIENvbnN0cmFpbnQgZm9yIHRoaXMgc3RhdGUgdG8gYWNjZXB0LiAgKi8KKyAgdG9rZW4g Zmlyc3RfZW5kOyAgICAgICAgICAgICAgLyogVG9rZW4gdmFsdWUgb2YgdGhlIGZpcnN0IEVORCBp biBlbGVtcy4gICovCisgIHBvc2l0aW9uX3NldCBtYnBzOyAgICAgICAgICAgIC8qIFBvc2l0aW9u cyB3aGljaCBjYW4gbWF0Y2ggbXVsdGlieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNoYXJhY3RlcnMsIGUuZy4sIHBlcmlvZC4KKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVXNlZCBvbmx5IGlmIE1CX0NVUl9NQVggPiAxLiAgKi8KK30gZGZhX3N0YXRl OworCisvKiBTdGF0ZXMgYXJlIGluZGV4ZWQgYnkgc3RhdGVfbnVtIHZhbHVlcy4gIFRoZXNlIGFy ZSBub3JtYWxseQorICAgbm9ubmVnYXRpdmUgYnV0IC0xIGlzIHVzZWQgYXMgYSBzcGVjaWFsIHZh bHVlLiAgKi8KK3R5cGVkZWYgcHRyZGlmZl90IHN0YXRlX251bTsKKworLyogQSBicmFja2V0IG9w ZXJhdG9yLgorICAgZS5nLiwgW2EtY10sIFtbOmFscGhhOl1dLCBldGMuICAqLworc3RydWN0IG1i X2NoYXJfY2xhc3NlcworeworICBwdHJkaWZmX3QgY3NldDsKKyAgYm9vbCBpbnZlcnQ7CisgIHdj aGFyX3QgKmNoYXJzOyAgICAgICAgICAgICAgIC8qIE5vcm1hbCBjaGFyYWN0ZXJzLiAgKi8KKyAg c2l6ZV90IG5jaGFyczsKK307CisKKy8qIEEgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uLiAg Ki8KK3N0cnVjdCBkZmEKK3sKKyAgLyogRmllbGRzIGZpbGxlZCBieSB0aGUgc2Nhbm5lci4gICov CisgIGNoYXJjbGFzcyAqY2hhcmNsYXNzZXM7ICAgICAgIC8qIEFycmF5IG9mIGNoYXJhY3RlciBz ZXRzIGZvciBDU0VUIHRva2Vucy4gICovCisgIHNpemVfdCBjaW5kZXg7ICAgICAgICAgICAgICAg IC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IGNoYXJjbGFzc2VzLiAgKi8KKyAgc2l6ZV90IGNhbGxv YzsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYXJjbGFzc2VzIGFsbG9jYXRlZC4gICov CisKKyAgLyogRmllbGRzIGZpbGxlZCBieSB0aGUgcGFyc2VyLiAgKi8KKyAgdG9rZW4gKnRva2Vu czsgICAgICAgICAgICAgICAgLyogUG9zdGZpeCBwYXJzZSBhcnJheS4gICovCisgIHNpemVfdCB0 aW5kZXg7ICAgICAgICAgICAgICAgIC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IHRva2Vucy4gICov CisgIHNpemVfdCB0YWxsb2M7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0b2tlbnMgY3Vy cmVudGx5IGFsbG9jYXRlZC4gICovCisgIHNpemVfdCBkZXB0aDsgICAgICAgICAgICAgICAgIC8q IERlcHRoIHJlcXVpcmVkIG9mIGFuIGV2YWx1YXRpb24gc3RhY2sKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9mIHRoZQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSB0cmVlLiAgKi8KKyAgc2l6 ZV90IG5sZWF2ZXM7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGxlYXZlcyBvbiB0aGUgcGFy c2UgdHJlZS4gICovCisgIHNpemVfdCBucmVnZXhwczsgICAgICAgICAgICAgIC8qIENvdW50IG9m IHBhcmFsbGVsIHJlZ2V4cHMgYmVpbmcgYnVpbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgd2l0aCBkZmFwYXJzZS4gICovCisgIGJvb2wgZmFzdDsJCQkvKiBUaGUgREZBIGlz IGZhc3QuICAqLworICBib29sIG11bHRpYnl0ZTsJCS8qIE1CX0NVUl9NQVggPiAxLiAgKi8KKyAg dG9rZW4gdXRmOF9hbnljaGFyX2NsYXNzZXNbNV07IC8qIFRvIGxvd2VyIEFOWUNIQVIgaW4gVVRG LTggbG9jYWxlcy4gICovCisgIG1ic3RhdGVfdCBtYnM7CQkvKiBNdWx0aWJ5dGUgY29udmVyc2lv biBzdGF0ZS4gICovCisKKyAgLyogZGZhZXhlYyBpbXBsZW1lbnRhdGlvbi4gICovCisgIGNoYXIg KigqZGZhZXhlYykgKHN0cnVjdCBkZmEgKiwgY2hhciBjb25zdCAqLCBjaGFyICosCisgICAgICAg ICAgICAgICAgICAgIGJvb2wsIHNpemVfdCAqLCBib29sICopOworCisgIC8qIFRoZSBmb2xsb3dp bmcgYXJlIHZhbGlkIG9ubHkgaWYgTUJfQ1VSX01BWCA+IDEuICAqLworCisgIC8qIFRoZSB2YWx1 ZSBvZiBtdWx0aWJ5dGVfcHJvcFtpXSBpcyBkZWZpbmVkIGJ5IGZvbGxvd2luZyBydWxlLgorICAg ICBpZiB0b2tlbnNbaV0gPCBOT1RDSEFSCisgICAgIGJpdCAwIDogdG9rZW5zW2ldIGlzIHRoZSBm aXJzdCBieXRlIG9mIGEgY2hhcmFjdGVyLCBpbmNsdWRpbmcKKyAgICAgc2luZ2xlLWJ5dGUgY2hh cmFjdGVycy4KKyAgICAgYml0IDEgOiB0b2tlbnNbaV0gaXMgdGhlIGxhc3QgYnl0ZSBvZiBhIGNo YXJhY3RlciwgaW5jbHVkaW5nCisgICAgIHNpbmdsZS1ieXRlIGNoYXJhY3RlcnMuCisKKyAgICAg aWYgdG9rZW5zW2ldID0gTUJDU0VUCisgICAgICgidGhlIGluZGV4IG9mIG1iY3NldHMgY29ycmVz cG9uZGluZyB0byB0aGlzIG9wZXJhdG9yIiA8PCAyKSArIDMKKworICAgICBlLmcuCisgICAgIHRv a2VucworICAgICA9ICdzaW5nbGVfYnl0ZV9hJywgJ211bHRpX2J5dGVfQScsIHNpbmdsZV9ieXRl X2InCisgICAgID0gJ3NiX2EnLCAnbWJfQSgxc3QgYnl0ZSknLCAnbWJfQSgybmQgYnl0ZSknLCAn bWJfQSgzcmQgYnl0ZSknLCAnc2JfYicKKyAgICAgbXVsdGlieXRlX3Byb3AKKyAgICAgPSAzICAg ICAsIDEgICAgICAgICAgICAgICAsICAwICAgICAgICAgICAgICAsICAyICAgICAgICAgICAgICAs IDMKKyAgICovCisgIGludCAqbXVsdGlieXRlX3Byb3A7CisKKyAgLyogQXJyYXkgb2YgdGhlIGJy YWNrZXQgZXhwcmVzc2lvbiBpbiB0aGUgREZBLiAgKi8KKyAgc3RydWN0IG1iX2NoYXJfY2xhc3Nl cyAqbWJjc2V0czsKKyAgc2l6ZV90IG5tYmNzZXRzOworICBzaXplX3QgbWJjc2V0c19hbGxvYzsK KworICAvKiBGaWVsZHMgZmlsbGVkIGJ5IHRoZSBzdXBlcnNldC4gICovCisgIHN0cnVjdCBkZmEg KnN1cGVyc2V0OyAgICAgICAgICAgICAvKiBIaW50IG9mIHRoZSBkZmEuICAqLworCisgIC8qIEZp ZWxkcyBmaWxsZWQgYnkgdGhlIHN0YXRlIGJ1aWxkZXIuICAqLworICBkZmFfc3RhdGUgKnN0YXRl czsgICAgICAgICAgICAvKiBTdGF0ZXMgb2YgdGhlIGRmYS4gICovCisgIHN0YXRlX251bSBzaW5k ZXg7ICAgICAgICAgICAgIC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IHN0YXRlcy4gICovCisgIHNp emVfdCBzYWxsb2M7CQkvKiBOdW1iZXIgb2Ygc3RhdGVzIGN1cnJlbnRseSBhbGxvY2F0ZWQuICAq LworCisgIC8qIEZpZWxkcyBmaWxsZWQgYnkgdGhlIHBhcnNlIHRyZWUtPk5GQSBjb252ZXJzaW9u LiAgKi8KKyAgcG9zaXRpb25fc2V0ICpmb2xsb3dzOyAgICAgICAgLyogQXJyYXkgb2YgZm9sbG93 IHNldHMsIGluZGV4ZWQgYnkgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaW5kZXguICBUaGUgZm9sbG93IG9mIGEgcG9zaXRpb24gaXMgdGhlIHNldAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBwb3NpdGlvbnMgY29udGFpbmluZyBjaGFy YWN0ZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgY29u Y2VpdmFibHkgZm9sbG93IGEgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG1hdGNoaW5nIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZyB0aGUgcmVnZXhwLiAgQWxsb2NhdGVk IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIHBvc3Np YmxlIHBvc2l0aW9uIGluZGV4LiAgKi8KKyAgYm9vbCBzZWFyY2hmbGFnOwkJLyogV2UgYXJlIHN1 cHBvc2VkIHRvIGJ1aWxkIGEgc2VhcmNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGFzIG9wcG9zZWQgdG8gYW4gZXhhY3QgbWF0Y2hlci4gIEEgc2VhcmNoaW5nCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIgZmluZHMgdGhlIGZpcnN0IGFu ZCBzaG9ydGVzdCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0 Y2hpbmcgYSByZWdleHAgYW55d2hlcmUgaW4gdGhlIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgd2hlcmVhcyBhbiBleGFjdCBtYXRjaGVyIGZpbmRzIHRoZSBsb25n ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXRjaGluZywg YnV0IGFuY2hvcmVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi ZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gICovCisKKyAgLyogRmllbGRzIGZpbGxlZCBieSBkZmFl eGVjLiAgKi8KKyAgc3RhdGVfbnVtIHRyYWxsb2M7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHRy YW5zaXRpb24gdGFibGVzIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzbG90cyBzbyBmYXIsIG5vdCBjb3VudGluZyB0cmFuc1stMV0uICAqLworICBpbnQgdHJj b3VudDsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdHJhbnNpdGlvbiB0YWJsZXMgdGhh dCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IGJlZW4g YnVpbHQuICAqLworICBpbnQgbWluX3RyY291bnQ7ICAgICAgICAgICAgICAvKiBNaW5pbXVtIG9m IG51bWJlciBvZiB0cmFuc2l0aW9uIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQWx3YXlzIGtlZXAgdGhlIG51bWJlciwgZXZlbiBhZnRlciBmcmVlaW5nCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFuc2l0aW9uIHRhYmxlcy4gIEl0 IGlzIGFsc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBv ZiBpbml0aWFsIHN0YXRlcy4gICovCisgIHN0YXRlX251bSAqKnRyYW5zOyAgICAgICAgICAgIC8q IFRyYW5zaXRpb24gdGFibGVzIGZvciBzdGF0ZXMgdGhhdCBjYW4KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmV2ZXIgYWNjZXB0LiAgSWYgdGhlIHRyYW5zaXRpb25zIGZvciBh CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIGhhdmUgbm90IHlldCBi ZWVuIGNvbXB1dGVkLCBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RhdGUgY291bGQgcG9zc2libHkgYWNjZXB0LCBpdHMgZW50cnkgaW4KKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdGhpcyB0YWJsZSBpcyBOVUxMLiAgVGhpcyBwb2ludHMgdG8g b25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3QgdGhlIHN0YXJ0IG9m IHRoZSBhbGxvY2F0ZWQgYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGFuZCB0cmFuc1stMV0gaXMgYWx3YXlzIE5VTEwuICAqLworICBzdGF0ZV9udW0gKipmYWlsczsg ICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRhYmxlcyBhZnRlciBmYWlsaW5nIHRvIGFjY2VwdAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIHN0YXRlIHRoYXQgcG90ZW50 aWFsbHkgY291bGQgZG8gc28uICAqLworICBpbnQgKnN1Y2Nlc3M7ICAgICAgICAgICAgICAgICAv KiBUYWJsZSBvZiBhY2NlcHRhbmNlIGNvbmRpdGlvbnMgdXNlZCBpbgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZmFleGVjIGFuZCBjb21wdXRlZCBpbiBidWlsZF9zdGF0ZS4g ICovCisgIHN0YXRlX251bSAqbmV3bGluZXM7ICAgICAgICAgIC8qIFRyYW5zaXRpb25zIG9uIG5l d2xpbmVzLiAgVGhlIGVudHJ5IGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG5ld2xpbmUgaW4gYW55IHRyYW5zaXRpb24gdGFibGUgaXMgYWx3YXlzCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIC0xIHNvIHdlIGNhbiBjb3VudCBsaW5lcyB3aXRob3V0 IHdhc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vIG1hbnkgY3lj bGVzLiAgVGhlIHRyYW5zaXRpb24gZm9yIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbmV3bGluZSBpcyBzdG9yZWQgc2VwYXJhdGVseSBhbmQgaGFuZGxlZAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIHNwZWNpYWwgY2FzZS4gIE5ld2xpbmUgaXMg YWxzbyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgc2VudGlu ZWwgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgc3RhdGVfbnVtIGluaXRzdGF0ZV9u b3Rib2w7ICAgLyogSW5pdGlhbCBzdGF0ZSBmb3IgQ1RYX0xFVFRFUiBhbmQgQ1RYX05PTkUKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBpbiBtdWx0aWJ5dGUgbG9j YWxlcywgaW4gd2hpY2ggd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8g bm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlaXIgY29udGV4dHMsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGFzIG5vdCBzdXBwb3J0ZWQgd29yZC4gICovCisgIHBvc2l0aW9u X3NldCBtYl9mb2xsb3dzOyAgICAgIC8qIEZvbGxvdyBzZXQgYWRkZWQgYnkgQU5ZQ0hBUiBhbmQv b3IgTUJDU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGRlbWFuZC4g ICovCit9OworCisvKiBTb21lIG1hY3JvcyBmb3IgdXNlciBhY2Nlc3MgdG8gZGZhIGludGVybmFs cy4gICovCisKKy8qIFMgY291bGQgcG9zc2libHkgYmUgYW4gYWNjZXB0aW5nIHN0YXRlIG9mIFIu ICAqLworI2RlZmluZSBBQ0NFUFRJTkcocywgcikgKChyKS5zdGF0ZXNbc10uY29uc3RyYWludCkK KworLyogU1RBVEUgYWNjZXB0cyBpbiB0aGUgc3BlY2lmaWVkIGNvbnRleHQuICAqLworI2RlZmlu ZSBBQ0NFUFRTX0lOX0NPTlRFWFQocHJldiwgY3Vyciwgc3RhdGUsIGRmYSkgXAorICBTVUNDRUVE U19JTl9DT05URVhUICgoZGZhKS5zdGF0ZXNbc3RhdGVdLmNvbnN0cmFpbnQsIHByZXYsIGN1cnIp CisKK3N0YXRpYyB2b2lkIHJlZ2V4cCAodm9pZCk7CisKKy8qIEEgdGFibGUgaW5kZXhlZCBieSBi eXRlIHZhbHVlcyB0aGF0IGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIHdpZGUKKyAgIGNoYXJh Y3RlciAoaWYgYW55KSBmb3IgdGhhdCBieXRlLiAgV0VPRiBtZWFucyB0aGUgYnl0ZSBpcyBub3Qg YQorICAgdmFsaWQgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLiAgKi8KK3N0YXRpYyB3aW50X3QgbWJy dG93Y19jYWNoZVtOT1RDSEFSXTsKKworLyogU3RvcmUgaW50byAqUFdDIHRoZSByZXN1bHQgb2Yg Y29udmVydGluZyB0aGUgbGVhZGluZyBieXRlcyBvZiB0aGUKKyAgIG11bHRpYnl0ZSBidWZmZXIg UyBvZiBsZW5ndGggTiBieXRlcywgdXNpbmcgdGhlIG1icnRvd2NfY2FjaGUgaW4gKkQKKyAgIGFu ZCB1cGRhdGluZyB0aGUgY29udmVyc2lvbiBzdGF0ZSBpbiAqRC4gIE9uIGNvbnZlcnNpb24gZXJy b3IsCisgICBjb252ZXJ0IGp1c3QgYSBzaW5nbGUgYnl0ZSwgdG8gV0VPRi4gIFJldHVybiB0aGUg bnVtYmVyIG9mIGJ5dGVzCisgICBjb252ZXJ0ZWQuCisKKyAgIFRoaXMgZGlmZmVycyBmcm9tIG1i cnRvd2MgKFBXQywgUywgTiwgJkQtPm1icykgYXMgZm9sbG93czoKKworICAgKiBQV0MgcG9pbnRz IHRvIHdpbnRfdCwgbm90IHRvIHdjaGFyX3QuCisgICAqIFRoZSBsYXN0IGFyZyBpcyBhIGRmYSAq RCBpbnN0ZWFkIG9mIG1lcmVseSBhIG11bHRpYnl0ZSBjb252ZXJzaW9uCisgICAgIHN0YXRlIEQt Pm1icy4gIEQgYWxzbyBjb250YWlucyBhbiBtYnJ0b3djX2NhY2hlIGZvciBzcGVlZC4KKyAgICog TiBtdXN0IGJlIGF0IGxlYXN0IDEuCisgICAqIFNbTiAtIDFdIG11c3QgYmUgYSBzZW50aW5lbCBi eXRlLgorICAgKiBTaGlmdCBlbmNvZGluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAqIFRoZSBy ZXR1cm4gdmFsdWUgaXMgYWx3YXlzIGluIHRoZSByYW5nZSAxLi5OLgorICAgKiBELT5tYnMgaXMg YWx3YXlzIHZhbGlkIGFmdGVyd2FyZHMuCisgICAqICpQV0MgaXMgYWx3YXlzIHNldCB0byBzb21l dGhpbmcuICAqLworc3RhdGljIHNpemVfdAorbWJzX3RvX3djaGFyICh3aW50X3QgKnB3YywgY2hh ciBjb25zdCAqcywgc2l6ZV90IG4sIHN0cnVjdCBkZmEgKmQpCit7CisgIHVuc2lnbmVkIGNoYXIg dWMgPSBzWzBdOworICB3aW50X3Qgd2MgPSBtYnJ0b3djX2NhY2hlW3VjXTsKKworICBpZiAod2Mg PT0gV0VPRikKKyAgICB7CisgICAgICB3Y2hhcl90IHdjaDsKKyAgICAgIHNpemVfdCBuYnl0ZXMg PSBtYnJ0b3djICgmd2NoLCBzLCBuLCAmZC0+bWJzKTsKKyAgICAgIGlmICgwIDwgbmJ5dGVzICYm IG5ieXRlcyA8IChzaXplX3QpIC0yKQorICAgICAgICB7CisgICAgICAgICAgKnB3YyA9IHdjaDsK KyAgICAgICAgICByZXR1cm4gbmJ5dGVzOworICAgICAgICB9CisgICAgICBtZW1zZXQgKCZkLT5t YnMsIDAsIHNpemVvZiBkLT5tYnMpOworICAgIH0KKworICAqcHdjID0gd2M7CisgIHJldHVybiAx OworfQorCisjaWZkZWYgREVCVUcKKworc3RhdGljIHZvaWQKK3BydG9rICh0b2tlbiB0KQorewor ICBjaGFyIGNvbnN0ICpzOworCisgIGlmICh0IDwgMCkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJF TkQiKTsKKyAgZWxzZSBpZiAodCA8IE5PVENIQVIpCisgICAgeworICAgICAgdW5zaWduZWQgaW50 IGNoID0gdDsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIjB4JTAyeCIsIGNoKTsKKyAgICB9Cisg IGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKHQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBF TVBUWToKKyAgICAgICAgICBzID0gIkVNUFRZIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAg Y2FzZSBCQUNLUkVGOgorICAgICAgICAgIHMgPSAiQkFDS1JFRiI7CisgICAgICAgICAgYnJlYWs7 CisgICAgICAgIGNhc2UgQkVHTElORToKKyAgICAgICAgICBzID0gIkJFR0xJTkUiOworICAgICAg ICAgIGJyZWFrOworICAgICAgICBjYXNlIEVORExJTkU6CisgICAgICAgICAgcyA9ICJFTkRMSU5F IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUdXT1JEOgorICAgICAgICAgIHMg PSAiQkVHV09SRCI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU5EV09SRDoKKyAg ICAgICAgICBzID0gIkVORFdPUkQiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJ TVdPUkQ6CisgICAgICAgICAgcyA9ICJMSU1XT1JEIjsKKyAgICAgICAgICBicmVhazsKKyAgICAg ICAgY2FzZSBOT1RMSU1XT1JEOgorICAgICAgICAgIHMgPSAiTk9UTElNV09SRCI7CisgICAgICAg ICAgYnJlYWs7CisgICAgICAgIGNhc2UgUU1BUks6CisgICAgICAgICAgcyA9ICJRTUFSSyI7Cisg ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICBzID0gIlNUQVIi OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgcyA9ICJQ TFVTIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQVQ6CisgICAgICAgICAgcyA9 ICJDQVQiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9SOgorICAgICAgICAgIHMg PSAiT1IiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAg ICBzID0gIkxQQVJFTiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlBBUkVOOgor ICAgICAgICAgIHMgPSAiUlBBUkVOIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBB TllDSEFSOgorICAgICAgICAgIHMgPSAiQU5ZQ0hBUiI7CisgICAgICAgICAgYnJlYWs7CisgICAg ICAgIGNhc2UgTUJDU0VUOgorICAgICAgICAgIHMgPSAiTUJDU0VUIjsKKyAgICAgICAgICBicmVh azsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzID0gIkNTRVQiOworICAgICAgICAgIGJy ZWFrOworICAgICAgICB9CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsIHMpOworICAgIH0K K30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBTdHVmZiBwZXJ0YWluaW5nIHRvIGNoYXJjbGFz c2VzLiAgKi8KKworc3RhdGljIGJvb2wKK3RzdGJpdCAodW5zaWduZWQgaW50IGIsIGNoYXJjbGFz cyBjb25zdCBjKQoreworICByZXR1cm4gY1tiIC8gQ0hBUkNMQVNTX1dPUkRfQklUU10gPj4gYiAl IENIQVJDTEFTU19XT1JEX0JJVFMgJiAxOworfQorCitzdGF0aWMgdm9pZAorc2V0Yml0ICh1bnNp Z25lZCBpbnQgYiwgY2hhcmNsYXNzIGMpCit7CisgIGNbYiAvIENIQVJDTEFTU19XT1JEX0JJVFNd IHw9IChjaGFyY2xhc3Nfd29yZCkgMSA8PCBiICUgQ0hBUkNMQVNTX1dPUkRfQklUUzsKK30KKwor c3RhdGljIHZvaWQKK2NscmJpdCAodW5zaWduZWQgaW50IGIsIGNoYXJjbGFzcyBjKQoreworICBj W2IgLyBDSEFSQ0xBU1NfV09SRF9CSVRTXSAmPSB+KChjaGFyY2xhc3Nfd29yZCkgMQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGIgJSBDSEFSQ0xBU1NfV09SRF9CSVRTKTsK K30KKworc3RhdGljIHZvaWQKK2NvcHlzZXQgKGNoYXJjbGFzcyBjb25zdCBzcmMsIGNoYXJjbGFz cyBkc3QpCit7CisgIG1lbWNweSAoZHN0LCBzcmMsIHNpemVvZiAoY2hhcmNsYXNzKSk7Cit9CisK K3N0YXRpYyB2b2lkCit6ZXJvc2V0IChjaGFyY2xhc3MgcykKK3sKKyAgbWVtc2V0IChzLCAwLCBz aXplb2YgKGNoYXJjbGFzcykpOworfQorCitzdGF0aWMgdm9pZAorbm90c2V0IChjaGFyY2xhc3Mg cykKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IENIQVJDTEFTU19XT1JEUzsgKytp KQorICAgIHNbaV0gPSBDSEFSQ0xBU1NfV09SRF9NQVNLICYgfnNbaV07Cit9CisKK3N0YXRpYyBi b29sCitlcXVhbCAoY2hhcmNsYXNzIGNvbnN0IHMxLCBjaGFyY2xhc3MgY29uc3QgczIpCit7Cisg IHJldHVybiBtZW1jbXAgKHMxLCBzMiwgc2l6ZW9mIChjaGFyY2xhc3MpKSA9PSAwOworfQorCisv KiBFbnN1cmUgdGhhdCB0aGUgYXJyYXkgYWRkcmVzc2VkIGJ5IFBUUiBob2xkcyBhdCBsZWFzdCBO SVRFTVMgKworICAgKFBUUiB8fCAhTklURU1TKSBpdGVtcy4gIEVpdGhlciByZXR1cm4gUFRSLCBv ciByZWFsbG9jYXRlIHRoZSBhcnJheQorICAgYW5kIHJldHVybiBpdHMgbmV3IGFkZHJlc3MuICBB bHRob3VnaCBQVFIgbWF5IGJlIG51bGwsIHRoZSByZXR1cm5lZAorICAgdmFsdWUgaXMgbmV2ZXIg bnVsbC4KKworICAgVGhlIGFycmF5IGhvbGRzICpOQUxMT0MgaXRlbXM7ICpOQUxMT0MgaXMgdXBk YXRlZCBvbiByZWFsbG9jYXRpb24uCisgICBJVEVNU0laRSBpcyB0aGUgc2l6ZSBvZiBvbmUgaXRl bS4gIEF2b2lkIE8oTioqMikgYmVoYXZpb3Igb24gYXJyYXlzCisgICBncm93aW5nIGxpbmVhcmx5 LiAgKi8KK3N0YXRpYyB2b2lkICoKK21heWJlX3JlYWxsb2MgKHZvaWQgKnB0ciwgc2l6ZV90IG5p dGVtcywgc2l6ZV90ICpuYWxsb2MsIHNpemVfdCBpdGVtc2l6ZSkKK3sKKyAgaWYgKG5pdGVtcyA8 ICpuYWxsb2MpCisgICAgcmV0dXJuIHB0cjsKKyAgKm5hbGxvYyA9IG5pdGVtczsKKyAgcmV0dXJu IHgybnJlYWxsb2MgKHB0ciwgbmFsbG9jLCBpdGVtc2l6ZSk7Cit9CisKKy8qIEluIERGQSBELCBm aW5kIHRoZSBpbmRleCBvZiBjaGFyY2xhc3MgUywgb3IgYWxsb2NhdGUgYSBuZXcgb25lLiAgKi8K K3N0YXRpYyBzaXplX3QKK2RmYV9jaGFyY2xhc3NfaW5kZXggKHN0cnVjdCBkZmEgKmQsIGNoYXJj bGFzcyBjb25zdCBzKQoreworICBzaXplX3QgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgZC0+Y2lu ZGV4OyArK2kpCisgICAgaWYgKGVxdWFsIChzLCBkLT5jaGFyY2xhc3Nlc1tpXSkpCisgICAgICBy ZXR1cm4gaTsKKyAgZC0+Y2hhcmNsYXNzZXMgPSBtYXliZV9yZWFsbG9jIChkLT5jaGFyY2xhc3Nl cywgZC0+Y2luZGV4LCAmZC0+Y2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpemVvZiAqZC0+Y2hhcmNsYXNzZXMpOworICArK2QtPmNpbmRleDsKKyAgY29weXNldCAo cywgZC0+Y2hhcmNsYXNzZXNbaV0pOworICByZXR1cm4gaTsKK30KKworLyogQSBwb2ludGVyIHRv IHRoZSBjdXJyZW50IGRmYSBpcyBrZXB0IGhlcmUgZHVyaW5nIHBhcnNpbmcuICAqLworc3RhdGlj IHN0cnVjdCBkZmEgKmRmYTsKKworLyogRmluZCB0aGUgaW5kZXggb2YgY2hhcmNsYXNzIFMgaW4g dGhlIGN1cnJlbnQgREZBLCBvciBhbGxvY2F0ZSBhIG5ldyBvbmUuICAqLworc3RhdGljIHNpemVf dAorY2hhcmNsYXNzX2luZGV4IChjaGFyY2xhc3MgY29uc3QgcykKK3sKKyAgcmV0dXJuIGRmYV9j aGFyY2xhc3NfaW5kZXggKGRmYSwgcyk7Cit9CisKKy8qIFN5bnRheCBiaXRzIGNvbnRyb2xsaW5n IHRoZSBiZWhhdmlvciBvZiB0aGUgbGV4aWNhbCBhbmFseXplci4gICovCitzdGF0aWMgcmVnX3N5 bnRheF90IHN5bnRheF9iaXRzOworc3RhdGljIGJvb2wgc3ludGF4X2JpdHNfc2V0OworCisvKiBG bGFnIGZvciBjYXNlLWZvbGRpbmcgbGV0dGVycyBpbnRvIHNldHMuICAqLworc3RhdGljIGJvb2wg Y2FzZV9mb2xkOworCisvKiBFbmQtb2YtbGluZSBieXRlIGluIGRhdGEuICAqLworc3RhdGljIHVu c2lnbmVkIGNoYXIgZW9sYnl0ZTsKKworLyogQ2FjaGUgb2YgY2hhci1jb250ZXh0IHZhbHVlcy4g ICovCitzdGF0aWMgaW50IHNiaXRbTk9UQ0hBUl07CisKKy8qIElmIG5ldmVyX3RyYWlsW0JdLCB0 aGUgYnl0ZSBCIGNhbm5vdCBiZSBhIG5vbi1pbml0aWFsIGJ5dGUgaW4gYQorICAgbXVsdGlieXRl IGNoYXJhY3Rlci4gICovCitzdGF0aWMgYm9vbCBuZXZlcl90cmFpbFtOT1RDSEFSXTsKKworLyog U2V0IG9mIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBsZXR0ZXJzLiAgKi8KK3N0YXRpYyBjaGFyY2xh c3MgbGV0dGVyczsKKworLyogU2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgbmV3bGluZS4gICov CitzdGF0aWMgY2hhcmNsYXNzIG5ld2xpbmU7CisKK3N0YXRpYyBib29sCit1bmlieXRlX3dvcmRf Y29uc3RpdHVlbnQgKHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgcmV0dXJuIG1icnRvd2NfY2FjaGVb Y10gIT0gV0VPRiAmJiAoaXNhbG51bSAoYykgfHwgKGMpID09ICdfJyk7Cit9CisKK3N0YXRpYyBp bnQKK2NoYXJfY29udGV4dCAodW5zaWduZWQgY2hhciBjKQoreworICBpZiAoYyA9PSBlb2xieXRl KQorICAgIHJldHVybiBDVFhfTkVXTElORTsKKyAgaWYgKHVuaWJ5dGVfd29yZF9jb25zdGl0dWVu dCAoYykpCisgICAgcmV0dXJuIENUWF9MRVRURVI7CisgIHJldHVybiBDVFhfTk9ORTsKK30KKwor LyogRW50cnkgcG9pbnQgdG8gc2V0IHN5bnRheCBvcHRpb25zLiAgKi8KK3ZvaWQKK2RmYXN5bnRh eCAocmVnX3N5bnRheF90IGJpdHMsIGJvb2wgZm9sZCwgdW5zaWduZWQgY2hhciBlb2wpCit7Cisg IGludCBpOworICBzeW50YXhfYml0c19zZXQgPSB0cnVlOworICBzeW50YXhfYml0cyA9IGJpdHM7 CisgIGNhc2VfZm9sZCA9IGZvbGQ7CisgIGVvbGJ5dGUgPSBlb2w7CisKKyAgZm9yIChpID0gQ0hB Ul9NSU47IGkgPD0gQ0hBUl9NQVg7ICsraSkKKyAgICB7CisgICAgICBjaGFyIGMgPSBpOworICAg ICAgdW5zaWduZWQgY2hhciB1YyA9IGk7CisgICAgICBtYnN0YXRlX3QgcyA9IHsgMCB9OworICAg ICAgd2NoYXJfdCB3YzsKKyAgICAgIG1icnRvd2NfY2FjaGVbdWNdID0gbWJydG93YyAoJndjLCAm YywgMSwgJnMpIDw9IDEgPyB3YyA6IFdFT0Y7CisKKyAgICAgIC8qIE5vdyB0aGF0IG1icnRvd2Nf Y2FjaGVbdWNdIGlzIHNldCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSBzYml0LiAgKi8KKyAgICAgIHNi aXRbdWNdID0gY2hhcl9jb250ZXh0ICh1Yyk7CisgICAgICBzd2l0Y2ggKHNiaXRbdWNdKQorICAg ICAgICB7CisgICAgICAgIGNhc2UgQ1RYX0xFVFRFUjoKKyAgICAgICAgICBzZXRiaXQgKHVjLCBs ZXR0ZXJzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFhfTkVXTElORToKKyAg ICAgICAgICBzZXRiaXQgKHVjLCBuZXdsaW5lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAg fQorCisgICAgICAvKiBQT1NJWCByZXF1aXJlcyB0aGF0IHRoZSBmaXZlIGJ5dGVzIGluICJcblxy Li8iIChpbmNsdWRpbmcgdGhlCisgICAgICAgICB0ZXJtaW5hdGluZyBOVUwpIGNhbm5vdCBvY2N1 ciBpbnNpZGUgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAgKi8KKyAgICAgIG5ldmVyX3RyYWlsW3Vj XSA9ICh1c2luZ191dGY4ICgpID8gKHVjICYgMHhjMCkgIT0gMHg4MAorICAgICAgICAgICAgICAg ICAgICAgICAgIDogc3RyY2hyICgiXG5cci4vIiwgdWMpICE9IE5VTEwpOworICAgIH0KK30KKwor LyogU2V0IGEgYml0IGluIHRoZSBjaGFyY2xhc3MgZm9yIHRoZSBnaXZlbiB3Y2hhcl90LiAgRG8g bm90aGluZyBpZiBXQworICAgaXMgcmVwcmVzZW50ZWQgYnkgYSBtdWx0aS1ieXRlIHNlcXVlbmNl LiAgRXZlbiBmb3IgTUJfQ1VSX01BWCA9PSAxLAorICAgdGhpcyBtYXkgaGFwcGVuIHdoZW4gZm9s ZGluZyBjYXNlIGluIHdlaXJkIFR1cmtpc2ggbG9jYWxlcyB3aGVyZQorICAgZG90bGVzcyBpL2Rv dHRlZCBJIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNob3NlbiBjaGFyYWN0ZXIgc2V0LgorICAg UmV0dXJuIHdoZXRoZXIgYSBiaXQgd2FzIHNldCBpbiB0aGUgY2hhcmNsYXNzLiAgKi8KK3N0YXRp YyBib29sCitzZXRiaXRfd2MgKHdpbnRfdCB3YywgY2hhcmNsYXNzIGMpCit7CisgIGludCBiID0g d2N0b2IgKHdjKTsKKyAgaWYgKGIgPT0gRU9GKQorICAgIHJldHVybiBmYWxzZTsKKworICBzZXRi aXQgKGIsIGMpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IGEgYml0IGZvciBCIGFuZCBp dHMgY2FzZSB2YXJpYW50cyBpbiB0aGUgY2hhcmNsYXNzIEMuCisgICBNQl9DVVJfTUFYIG11c3Qg YmUgMS4gICovCitzdGF0aWMgdm9pZAorc2V0Yml0X2Nhc2VfZm9sZF9jIChpbnQgYiwgY2hhcmNs YXNzIGMpCit7CisgIGludCB1YiA9IHRvdXBwZXIgKGIpOworICBpbnQgaTsKKyAgZm9yIChpID0g MDsgaSA8IE5PVENIQVI7IGkrKykKKyAgICBpZiAodG91cHBlciAoaSkgPT0gdWIpCisgICAgICBz ZXRiaXQgKGksIGMpOworfQorCisKKworLyogVVRGLTggZW5jb2RpbmcgYWxsb3dzIHNvbWUgb3B0 aW1pemF0aW9ucyB0aGF0IHdlIGNhbid0IG90aGVyd2lzZQorICAgYXNzdW1lIGluIGEgbXVsdGli eXRlIGVuY29kaW5nLiAgKi8KK2Jvb2wKK3VzaW5nX3V0ZjggKHZvaWQpCit7CisgIHN0YXRpYyBp bnQgdXRmOCA9IC0xOworICBpZiAodXRmOCA8IDApCisgICAgeworICAgICAgd2NoYXJfdCB3YzsK KyAgICAgIG1ic3RhdGVfdCBtYnMgPSB7IDAgfTsKKyAgICAgIHV0ZjggPSBtYnJ0b3djICgmd2Ms ICJceGM0XHg4MCIsIDIsICZtYnMpID09IDIgJiYgd2MgPT0gMHgxMDA7CisgICAgfQorICByZXR1 cm4gdXRmODsKK30KKworLyogVGhlIGN1cnJlbnQgbG9jYWxlIGlzIGtub3duIHRvIGJlIGEgdW5p Ynl0ZSBsb2NhbGUKKyAgIHdpdGhvdXQgbXVsdGljaGFyYWN0ZXIgY29sbGF0aW5nIHNlcXVlbmNl cyBhbmQgd2hlcmUgcmFuZ2UKKyAgIGNvbXBhcmlzb25zIHNpbXBseSB1c2UgdGhlIG5hdGl2ZSBl bmNvZGluZy4gIFRoZXNlIGxvY2FsZXMgY2FuIGJlCisgICBwcm9jZXNzZWQgbW9yZSBlZmZpY2ll bnRseS4gICovCisKK3N0YXRpYyBib29sCit1c2luZ19zaW1wbGVfbG9jYWxlICh2b2lkKQorewor ICAvKiBUaGUgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMga25vd24gdG8gYmUgY29tcGF0aWJsZSB3 aXRoCisgICAgIHRoZSBDIGxvY2FsZS4gIFRoZSBmb2xsb3dpbmcgdGVzdCBpc24ndCBwZXJmZWN0 LCBidXQgaXQncyBnb29kCisgICAgIGVub3VnaCBpbiBwcmFjdGljZSwgYXMgb25seSBBU0NJSSBh bmQgRUJDRElDIGFyZSBpbiBjb21tb24gdXNlCisgICAgIGFuZCB0aGlzIHRlc3QgY29ycmVjdGx5 IGFjY2VwdHMgQVNDSUkgYW5kIHJlamVjdHMgRUJDRElDLiAgKi8KKyAgZW51bSB7IG5hdGl2ZV9j X2NoYXJzZXQgPQorICAgICgnXGInID09IDggJiYgJ1x0JyA9PSA5ICYmICdcbicgPT0gMTAgJiYg J1x2JyA9PSAxMSAmJiAnXGYnID09IDEyCisgICAgICYmICdccicgPT0gMTMgJiYgJyAnID09IDMy ICYmICchJyA9PSAzMyAmJiAnIicgPT0gMzQgJiYgJyMnID09IDM1CisgICAgICYmICclJyA9PSAz NyAmJiAnJicgPT0gMzggJiYgJ1wnJyA9PSAzOSAmJiAnKCcgPT0gNDAgJiYgJyknID09IDQxCisg ICAgICYmICcqJyA9PSA0MiAmJiAnKycgPT0gNDMgJiYgJywnID09IDQ0ICYmICctJyA9PSA0NSAm JiAnLicgPT0gNDYKKyAgICAgJiYgJy8nID09IDQ3ICYmICcwJyA9PSA0OCAmJiAnOScgPT0gNTcg JiYgJzonID09IDU4ICYmICc7JyA9PSA1OQorICAgICAmJiAnPCcgPT0gNjAgJiYgJz0nID09IDYx ICYmICc+JyA9PSA2MiAmJiAnPycgPT0gNjMgJiYgJ0EnID09IDY1CisgICAgICYmICdaJyA9PSA5 MCAmJiAnWycgPT0gOTEgJiYgJ1xcJyA9PSA5MiAmJiAnXScgPT0gOTMgJiYgJ14nID09IDk0Cisg ICAgICYmICdfJyA9PSA5NSAmJiAnYScgPT0gOTcgJiYgJ3onID09IDEyMiAmJiAneycgPT0gMTIz ICYmICd8JyA9PSAxMjQKKyAgICAgJiYgJ30nID09IDEyNSAmJiAnficgPT0gMTI2KQorICB9Owor CisgIGlmICghIG5hdGl2ZV9jX2NoYXJzZXQgfHwgZGZhLT5tdWx0aWJ5dGUpCisgICAgcmV0dXJu IGZhbHNlOworICBlbHNlCisgICAgeworICAgICAgc3RhdGljIGludCB1bmlieXRlX2MgPSAtMTsK KyAgICAgIGlmICh1bmlieXRlX2MgPCAwKQorICAgICAgICB7CisgICAgICAgICAgY2hhciBjb25z dCAqbG9jYWxlID0gc2V0bG9jYWxlIChMQ19BTEwsIE5VTEwpOworICAgICAgICAgIHVuaWJ5dGVf YyA9ICghbG9jYWxlCisgICAgICAgICAgICAgICAgICAgICAgIHx8IFNUUkVRIChsb2NhbGUsICJD IikKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgU1RSRVEgKGxvY2FsZSwgIlBPU0lYIikpOwor ICAgICAgICB9CisgICAgICByZXR1cm4gdW5pYnl0ZV9jOworICAgIH0KK30KKworLyogTGV4aWNh bCBhbmFseXplci4gIEFsbCB0aGUgZHJvc3MgdGhhdCBkZWFscyB3aXRoIHRoZSBvYm5veGlvdXMK KyAgIEdOVSBSZWdleCBzeW50YXggYml0cyBpcyBsb2NhdGVkIGhlcmUuICBUaGUgcG9vciwgc3Vm ZmVyaW5nCisgICByZWFkZXIgaXMgcmVmZXJyZWQgdG8gdGhlIEdOVSBSZWdleCBkb2N1bWVudGF0 aW9uIGZvciB0aGUKKyAgIG1lYW5pbmcgb2YgdGhlIEAjJSFAIyVeIUAgc3ludGF4IGJpdHMuICAq LworCitzdGF0aWMgY2hhciBjb25zdCAqbGV4cHRyOyAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBp bnB1dCBjaGFyYWN0ZXIuICAqLworc3RhdGljIHNpemVfdCBsZXhsZWZ0OyAgICAgICAgICAvKiBO dW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcuICAqLworc3RhdGljIHRva2VuIGxhc3R0b2s7 ICAgICAgICAgICAvKiBQcmV2aW91cyB0b2tlbiByZXR1cm5lZDsgaW5pdGlhbGx5IEVORC4gICov CitzdGF0aWMgYm9vbCBsYXN0c3RhcnQ7CQkvKiBXZSdyZSBzZXBhcmF0ZWQgZnJvbSBiZWdpbm5p bmcgb3IgKCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvbmx5IGJ5IHpl cm8td2lkdGggY2hhcmFjdGVycy4gICovCitzdGF0aWMgc2l6ZV90IHBhcmVuczsgICAgICAgICAg IC8qIENvdW50IG9mIG91dHN0YW5kaW5nIGxlZnQgcGFyZW5zLiAgKi8KK3N0YXRpYyBpbnQgbWlu cmVwLCBtYXhyZXA7ICAgICAgLyogUmVwZWF0IGNvdW50cyBmb3Ige20sbn0uICAqLworCitzdGF0 aWMgaW50IGN1cl9tYl9sZW4gPSAxOyAgICAgIC8qIExlbmd0aCBvZiB0aGUgbXVsdGlieXRlIHJl cHJlc2VudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjdG9r LiAgKi8KKworc3RhdGljIHdpbnRfdCB3Y3RvazsJCS8qIFdpZGUgY2hhcmFjdGVyIHJlcHJlc2Vu dGF0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG11bHRpYnl0ZSBjaGFyYWN0ZXIsIG9yIFdFT0YgaWYgdGhlcmUgd2FzCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGFuIGVuY29kaW5nIGVycm9yLiAgVXNlZCBvbmx5IGlmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX0NVUl9NQVggPiAxLiAgKi8KKwor CisvKiBGZXRjaCB0aGUgbmV4dCBsZXhpY2FsIGlucHV0IGNoYXJhY3Rlci4gIFNldCBDIChvZiB0 eXBlIGludCkgdG8gdGhlCisgICBuZXh0IGlucHV0IGJ5dGUsIGV4Y2VwdCBzZXQgQyB0byBFT0Yg aWYgdGhlIGlucHV0IGlzIGEgbXVsdGlieXRlCisgICBjaGFyYWN0ZXIgb2YgbGVuZ3RoIGdyZWF0 ZXIgdGhhbiAxLiAgU2V0IFdDIChvZiB0eXBlIHdpbnRfdCkgdG8gdGhlCisgICB2YWx1ZSBvZiB0 aGUgaW5wdXQgaWYgaXQgaXMgYSB2YWxpZCBtdWx0aWJ5dGUgY2hhcmFjdGVyIChwb3NzaWJseQor ICAgb2YgbGVuZ3RoIDEpOyBvdGhlcndpc2Ugc2V0IFdDIHRvIFdFT0YuICBJZiB0aGVyZSBpcyBu byBtb3JlIGlucHV0LAorICAgcmVwb3J0IEVPRkVSUiBpZiBFT0ZFUlIgaXMgbm90IG51bGwsIGFu ZCByZXR1cm4gbGFzdHRvayA9IEVORAorICAgb3RoZXJ3aXNlLiAgKi8KKyMgZGVmaW5lIEZFVENI X1dDKGMsIHdjLCBlb2ZlcnIpCQlcCisgIGRvIHsJCQkJCQlcCisgICAgaWYgKCEgbGV4bGVmdCkJ CQkJXAorICAgICAgewkJCQkJCVwKKyAgICAgICAgaWYgKChlb2ZlcnIpICE9IDApCQkJXAorICAg ICAgICAgIGRmYWVycm9yIChlb2ZlcnIpOwkJCVwKKyAgICAgICAgZWxzZQkJCQkJXAorICAgICAg ICAgIHJldHVybiBsYXN0dG9rID0gRU5EOwkJCVwKKyAgICAgIH0JCQkJCQlcCisgICAgZWxzZQkJ CQkJXAorICAgICAgewkJCQkJCVwKKyAgICAgICAgd2ludF90IF93YzsJCQkJXAorICAgICAgICBz aXplX3QgbmJ5dGVzID0gbWJzX3RvX3djaGFyICgmX3djLCBsZXhwdHIsIGxleGxlZnQsIGRmYSk7 IFwKKyAgICAgICAgY3VyX21iX2xlbiA9IG5ieXRlczsJCQlcCisgICAgICAgICh3YykgPSBfd2M7 CQkJCVwKKyAgICAgICAgKGMpID0gbmJ5dGVzID09IDEgPyB0b191Y2hhciAoKmxleHB0cikgOiBF T0Y7ICAgIFwKKyAgICAgICAgbGV4cHRyICs9IG5ieXRlczsJCQlcCisgICAgICAgIGxleGxlZnQg LT0gbmJ5dGVzOwkJCVwKKyAgICAgIH0JCQkJCQlcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjaWZu ZGVmIE1JTgorIyBkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNlbmRp ZgorCisvKiBUaGUgc2V0IG9mIHdjaGFyX3QgdmFsdWVzIEMgc3VjaCB0aGF0IHRoZXJlJ3MgYSB1 c2VmdWwgbG9jYWxlCisgICBzb21ld2hlcmUgd2hlcmUgQyAhPSB0b3d1cHBlciAoQykgJiYgQyAh PSB0b3dsb3dlciAodG93dXBwZXIgKEMpKS4KKyAgIEZvciBleGFtcGxlLCAweDAwQjUgKFUrMDBC NSBNSUNSTyBTSUdOKSBpcyBpbiB0aGlzIHRhYmxlLCBiZWNhdXNlCisgICB0b3d1cHBlciAoMHgw MEI1KSA9PSAweDAzOUMgKFUrMDM5QyBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVSksIGFuZAorICAg dG93bG93ZXIgKDB4MDM5QykgPT0gMHgwM0JDIChVKzAzQkMgR1JFRUsgU01BTEwgTEVUVEVSIE1V KS4gICovCitzdGF0aWMgc2hvcnQgY29uc3QgbG9uZXNvbWVfbG93ZXJbXSA9CisgIHsKKyAgICAw eDAwQjUsIDB4MDEzMSwgMHgwMTdGLCAweDAxQzUsIDB4MDFDOCwgMHgwMUNCLCAweDAxRjIsIDB4 MDM0NSwKKyAgICAweDAzQzIsIDB4MDNEMCwgMHgwM0QxLCAweDAzRDUsIDB4MDNENiwgMHgwM0Yw LCAweDAzRjEsCisKKyAgICAvKiBVKzAzRjIgR1JFRUsgTFVOQVRFIFNJR01BIFNZTUJPTCBsYWNr cyBhIHNwZWNpZmljIHVwcGVyY2FzZQorICAgICAgIGNvdW50ZXJwYXJ0IGluIGxvY2FsZXMgcHJl ZGF0aW5nIFVuaWNvZGUgNC4wLjAgKEFwcmlsIDIwMDMpLiAgKi8KKyAgICAweDAzRjIsCisKKyAg ICAweDAzRjUsIDB4MUU5QiwgMHgxRkJFLAorICB9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBj aGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHRoZSBjYXNlLWZvbGRlZAorICAgY291bnRlcnBhcnRzIG9m IGEgc2luZ2xlIGNoYXJhY3Rlciwgbm90IGNvdW50aW5nIHRoZSBjaGFyYWN0ZXIKKyAgIGl0c2Vs Zi4gIFRoaXMgaXMgMSBmb3IgdG93dXBwZXIsIDEgZm9yIHRvd2xvd2VyLCBhbmQgMSBmb3IgZWFj aAorICAgZW50cnkgaW4gTE9ORVNPTUVfTE9XRVIuICAqLworZW51bQoreyBDQVNFX0ZPTERFRF9C VUZTSVpFID0gMiArIHNpemVvZiBsb25lc29tZV9sb3dlciAvIHNpemVvZiAqbG9uZXNvbWVfbG93 ZXIgfTsKKworLyogRmluZCB0aGUgY2hhcmFjdGVycyBlcXVhbCB0byBDIGFmdGVyIGNhc2UtZm9s ZGluZywgb3RoZXIgdGhhbiBDCisgICBpdHNlbGYsIGFuZCBzdG9yZSB0aGVtIGludG8gRk9MREVE LiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgc3RvcmVkLiAgKi8KK3N0YXRp YyB1bnNpZ25lZCBpbnQKK2Nhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0cyAod2NoYXJfdCBjLCB3Y2hh cl90IGZvbGRlZFtDQVNFX0ZPTERFRF9CVUZTSVpFXSkKK3sKKyAgdW5zaWduZWQgaW50IGk7Cisg IHVuc2lnbmVkIGludCBuID0gMDsKKyAgd2ludF90IHVjID0gdG93dXBwZXIgKGMpOworICB3aW50 X3QgbGMgPSB0b3dsb3dlciAodWMpOworICBpZiAodWMgIT0gYykKKyAgICBmb2xkZWRbbisrXSA9 IHVjOworICBpZiAobGMgIT0gdWMgJiYgbGMgIT0gYyAmJiB0b3d1cHBlciAobGMpID09IHVjKQor ICAgIGZvbGRlZFtuKytdID0gbGM7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgbG9uZXNvbWVf bG93ZXIgLyBzaXplb2YgKmxvbmVzb21lX2xvd2VyOyBpKyspCisgICAgeworICAgICAgd2ludF90 IGxpID0gbG9uZXNvbWVfbG93ZXJbaV07CisgICAgICBpZiAobGkgIT0gbGMgJiYgbGkgIT0gdWMg JiYgbGkgIT0gYyAmJiB0b3d1cHBlciAobGkpID09IHVjKQorICAgICAgICBmb2xkZWRbbisrXSA9 IGxpOworICAgIH0KKyAgcmV0dXJuIG47Cit9CisKK3R5cGVkZWYgaW50IHByZWRpY2F0ZSAoaW50 KTsKKworLyogVGhlIGZvbGxvd2luZyBsaXN0IG1hcHMgdGhlIG5hbWVzIG9mIHRoZSBQb3NpeCBu YW1lZCBjaGFyYWN0ZXIgY2xhc3NlcworICAgdG8gcHJlZGljYXRlIGZ1bmN0aW9ucyB0aGF0IGRl dGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIGluCisgICB0aGUgY2xhc3MuICBU aGUgbGVhZGluZyBbIGhhcyBhbHJlYWR5IGJlZW4gZWF0ZW4gYnkgdGhlIGxleGljYWwKKyAgIGFu YWx5emVyLiAgKi8KK3N0cnVjdCBkZmFfY3R5cGUKK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAg cHJlZGljYXRlICpmdW5jOworICBib29sIHNpbmdsZV9ieXRlX29ubHk7Cit9OworCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRmYV9jdHlwZSBwcmVkbmFtZXNbXSA9IHsKKyAgeyJhbHBoYSIsIGlzYWxw aGEsIGZhbHNlfSwKKyAgeyJ1cHBlciIsIGlzdXBwZXIsIGZhbHNlfSwKKyAgeyJsb3dlciIsIGlz bG93ZXIsIGZhbHNlfSwKKyAgeyJkaWdpdCIsIGlzZGlnaXQsIHRydWV9LAorICB7InhkaWdpdCIs IGlzeGRpZ2l0LCBmYWxzZX0sCisgIHsic3BhY2UiLCBpc3NwYWNlLCBmYWxzZX0sCisgIHsicHVu Y3QiLCBpc3B1bmN0LCBmYWxzZX0sCisgIHsiYWxudW0iLCBpc2FsbnVtLCBmYWxzZX0sCisgIHsi cHJpbnQiLCBpc3ByaW50LCBmYWxzZX0sCisgIHsiZ3JhcGgiLCBpc2dyYXBoLCBmYWxzZX0sCisg IHsiY250cmwiLCBpc2NudHJsLCBmYWxzZX0sCisgIHsiYmxhbmsiLCBpc2JsYW5rLCBmYWxzZX0s CisgIHtOVUxMLCBOVUxMLCBmYWxzZX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGZhX2N0 eXBlICpfR0xfQVRUUklCVVRFX1BVUkUKK2ZpbmRfcHJlZCAoY29uc3QgY2hhciAqc3RyKQorewor ICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgcHJlZG5hbWVzW2ldLm5hbWU7ICsraSkK KyAgICBpZiAoU1RSRVEgKHN0ciwgcHJlZG5hbWVzW2ldLm5hbWUpKQorICAgICAgcmV0dXJuICZw cmVkbmFtZXNbaV07CisgIHJldHVybiBOVUxMOworfQorCisvKiBNdWx0aWJ5dGUgY2hhcmFjdGVy IGhhbmRsaW5nIHN1Yi1yb3V0aW5lIGZvciBsZXguCisgICBQYXJzZSBhIGJyYWNrZXQgZXhwcmVz c2lvbiBhbmQgYnVpbGQgYSBzdHJ1Y3QgbWJfY2hhcl9jbGFzc2VzLiAgKi8KK3N0YXRpYyB0b2tl bgorcGFyc2VfYnJhY2tldF9leHAgKHZvaWQpCit7CisgIGJvb2wgaW52ZXJ0OworICBpbnQgYywg YzEsIGMyOworICBjaGFyY2xhc3MgY2NsOworCisgIC8qIFRoaXMgaXMgYSBicmFja2V0IGV4cHJl c3Npb24gdGhhdCBkZmFleGVjIGlzIGtub3duIHRvCisgICAgIHByb2Nlc3MgY29ycmVjdGx5LiAg Ki8KKyAgYm9vbCBrbm93bl9icmFja2V0X2V4cCA9IHRydWU7CisKKyAgLyogVXNlZCB0byB3YXJu IGFib3V0IFs6c3BhY2U6XS4KKyAgICAgQml0IDAgPSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBjb2xv bi4KKyAgICAgQml0IDEgPSBsYXN0IGNoYXJhY3RlciBpcyBhIGNvbG9uLgorICAgICBCaXQgMiA9 IGluY2x1ZGVzIGFueSBvdGhlciBjaGFyYWN0ZXIgYnV0IGEgY29sb24uCisgICAgIEJpdCAzID0g aW5jbHVkZXMgcmFuZ2VzLCBjaGFyL2VxdWl2IGNsYXNzZXMgb3IgY29sbGF0aW9uIGVsZW1lbnRz LiAgKi8KKyAgaW50IGNvbG9uX3dhcm5pbmdfc3RhdGU7CisKKyAgd2ludF90IHdjOworICB3aW50 X3Qgd2MyOworICB3aW50X3Qgd2MxID0gMDsKKworICAvKiBXb3JrIGFyZWEgdG8gYnVpbGQgYSBt Yl9jaGFyX2NsYXNzZXMuICAqLworICBzdHJ1Y3QgbWJfY2hhcl9jbGFzc2VzICp3b3JrX21iYzsK KyAgc2l6ZV90IGNoYXJzX2FsOworCisgIGNoYXJzX2FsID0gMDsKKyAgaWYgKGRmYS0+bXVsdGli eXRlKQorICAgIHsKKyAgICAgIGRmYS0+bWJjc2V0cyA9IG1heWJlX3JlYWxsb2MgKGRmYS0+bWJj c2V0cywgZGZhLT5ubWJjc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZkZmEtPm1iY3NldHNfYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzaXplb2YgKmRmYS0+bWJjc2V0cyk7CisKKyAgICAgIC8qIGRmYS0+bXVsdGlieXRlX3Byb3Bb XSBob2xkIHRoZSBpbmRleCBvZiBkZmEtPm1iY3NldHMuCisgICAgICAgICBXZSB3aWxsIHVwZGF0 ZSBkZmEtPm11bHRpYnl0ZV9wcm9wW10gaW4gYWRkdG9rLCBiZWNhdXNlIHdlIGNhbid0CisgICAg ICAgICBkZWNpZGUgdGhlIGluZGV4IGluIGRmYS0+dG9rZW5zW10uICAqLworCisgICAgICAvKiBJ bml0aWFsaXplIHdvcmsgYXJlYS4gICovCisgICAgICB3b3JrX21iYyA9ICYoZGZhLT5tYmNzZXRz W2RmYS0+bm1iY3NldHMrK10pOworICAgICAgbWVtc2V0ICh3b3JrX21iYywgMCwgc2l6ZW9mICp3 b3JrX21iYyk7CisgICAgfQorICBlbHNlCisgICAgd29ya19tYmMgPSBOVUxMOworCisgIG1lbXNl dCAoY2NsLCAwLCBzaXplb2YgY2NsKTsKKyAgRkVUQ0hfV0MgKGMsIHdjLCBfKCJ1bmJhbGFuY2Vk IFsiKSk7CisgIGlmIChjID09ICdeJykKKyAgICB7CisgICAgICBGRVRDSF9XQyAoYywgd2MsIF8o InVuYmFsYW5jZWQgWyIpKTsKKyAgICAgIGludmVydCA9IHRydWU7CisgICAgICBrbm93bl9icmFj a2V0X2V4cCA9IHVzaW5nX3NpbXBsZV9sb2NhbGUgKCk7CisgICAgfQorICBlbHNlCisgICAgaW52 ZXJ0ID0gZmFsc2U7CisKKyAgY29sb25fd2FybmluZ19zdGF0ZSA9IChjID09ICc6Jyk7CisgIGRv CisgICAgeworICAgICAgYzEgPSBOT1RDSEFSOwkvKiBNYXJrIGMxIGFzIG5vdCBpbml0aWFsaXpl ZC4gICovCisgICAgICBjb2xvbl93YXJuaW5nX3N0YXRlICY9IH4yOworCisgICAgICAvKiBOb3Rl IHRoYXQgaWYgd2UncmUgbG9va2luZyBhdCBzb21lIG90aGVyIFs6Li4uOl0gY29uc3RydWN0LAor ICAgICAgICAgd2UganVzdCB0cmVhdCBpdCBhcyBhIGJ1bmNoIG9mIG9yZGluYXJ5IGNoYXJhY3Rl cnMuICBXZSBjYW4gZG8KKyAgICAgICAgIHRoaXMgYmVjYXVzZSB3ZSBhc3N1bWUgcmVnZXggaGFz IGNoZWNrZWQgZm9yIHN5bnRheCBlcnJvcnMgYmVmb3JlCisgICAgICAgICBkZmEgaXMgZXZlciBj YWxsZWQuICAqLworICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICB7CisgICAgICAgICAgRkVU Q0hfV0MgKGMxLCB3YzEsIF8oInVuYmFsYW5jZWQgWyIpKTsKKworICAgICAgICAgIGlmICgoYzEg PT0gJzonICYmIChzeW50YXhfYml0cyAmIFJFX0NIQVJfQ0xBU1NFUykpCisgICAgICAgICAgICAg IHx8IGMxID09ICcuJyB8fCBjMSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg IGVudW0geyBNQVhfQlJBQ0tFVF9TVFJJTkdfTEVOID0gMzIgfTsKKyAgICAgICAgICAgICAgY2hh ciBzdHJbTUFYX0JSQUNLRVRfU1RSSU5HX0xFTiArIDFdOworICAgICAgICAgICAgICBzaXplX3Qg bGVuID0gMDsKKyAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAg ICAgICAgICAgICAgICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQgWyIpKTsKKyAgICAg ICAgICAgICAgICAgIGlmICgoYyA9PSBjMSAmJiAqbGV4cHRyID09ICddJykgfHwgbGV4bGVmdCA9 PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChs ZW4gPCBNQVhfQlJBQ0tFVF9TVFJJTkdfTEVOKQorICAgICAgICAgICAgICAgICAgICBzdHJbbGVu KytdID0gYzsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLyog VGhpcyBpcyBpbiBhbnkgY2FzZSBhbiBpbnZhbGlkIGNsYXNzIG5hbWUuICAqLworICAgICAgICAg ICAgICAgICAgICBzdHJbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgc3RyW2xlbl0gPSAnXDAnOworCisgICAgICAgICAgICAgIC8qIEZldGNoIGJyYWNrZXQuICAq LworICAgICAgICAgICAgICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQgWyIpKTsKKyAg ICAgICAgICAgICAgaWYgKGMxID09ICc6JykKKyAgICAgICAgICAgICAgICAvKiBCdWlsZCBjaGFy YWN0ZXIgY2xhc3MuICBQT1NJWCBhbGxvd3MgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAg Y2xhc3NlcyB0byBtYXRjaCBtdWx0aWNoYXJhY3RlciBjb2xsYXRpbmcgZWxlbWVudHMsCisgICAg ICAgICAgICAgICAgICAgYnV0IHRoZSByZWdleCBjb2RlIGRvZXMgbm90IHN1cHBvcnQgdGhhdCwg c28gZG8gbm90CisgICAgICAgICAgICAgICAgICAgd29ycnkgYWJvdXQgdGhhdCBwb3NzaWJpbGl0 eS4gICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAq Y2xhc3MKKyAgICAgICAgICAgICAgICAgICAgPSAoY2FzZV9mb2xkICYmIChTVFJFUSAoc3RyLCAi dXBwZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFNUUkVRIChz dHIsICJsb3dlciIpKSA/ICJhbHBoYSIgOiBzdHIpOworICAgICAgICAgICAgICAgICAgY29uc3Qg c3RydWN0IGRmYV9jdHlwZSAqcHJlZCA9IGZpbmRfcHJlZCAoY2xhc3MpOworICAgICAgICAgICAg ICAgICAgaWYgKCFwcmVkKQorICAgICAgICAgICAgICAgICAgICBkZmFlcnJvciAoXygiaW52YWxp ZCBjaGFyYWN0ZXIgY2xhc3MiKSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChkZmEtPm11bHRp Ynl0ZSAmJiAhcHJlZC0+c2luZ2xlX2J5dGVfb25seSkKKyAgICAgICAgICAgICAgICAgICAga25v d25fYnJhY2tldF9leHAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg ICAgICAgICAgICAgZm9yIChjMiA9IDA7IGMyIDwgTk9UQ0hBUjsgKytjMikKKyAgICAgICAgICAg ICAgICAgICAgICBpZiAocHJlZC0+ZnVuYyAoYzIpKQorICAgICAgICAgICAgICAgICAgICAgICAg c2V0Yml0IChjMiwgY2NsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UK KyAgICAgICAgICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworCisgICAgICAgICAg ICAgIGNvbG9uX3dhcm5pbmdfc3RhdGUgfD0gODsKKworICAgICAgICAgICAgICAvKiBGZXRjaCBu ZXcgbG9va2FoZWFkIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgIEZFVENIX1dDIChjMSwg d2MxLCBfKCJ1bmJhbGFuY2VkIFsiKSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg ICAgICAgfQorCisgICAgICAgICAgLyogV2UgdHJlYXQgJ1snIGFzIGEgbm9ybWFsIGNoYXJhY3Rl ciBoZXJlLiAgYy9jMS93Yy93YzEKKyAgICAgICAgICAgICBhcmUgYWxyZWFkeSBzZXQgdXAuICAq LworICAgICAgICB9CisKKyAgICAgIGlmIChjID09ICdcXCcgJiYgKHN5bnRheF9iaXRzICYgUkVf QkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUykpCisgICAgICAgIEZFVENIX1dDIChjLCB3YywgXygi dW5iYWxhbmNlZCBbIikpOworCisgICAgICBpZiAoYzEgPT0gTk9UQ0hBUikKKyAgICAgICAgRkVU Q0hfV0MgKGMxLCB3YzEsIF8oInVuYmFsYW5jZWQgWyIpKTsKKworICAgICAgaWYgKGMxID09ICct JykKKyAgICAgICAgLyogYnVpbGQgcmFuZ2UgY2hhcmFjdGVycy4gICovCisgICAgICAgIHsKKyAg ICAgICAgICBGRVRDSF9XQyAoYzIsIHdjMiwgXygidW5iYWxhbmNlZCBbIikpOworCisgICAgICAg ICAgLyogQSBicmFja2V0IGV4cHJlc3Npb24gbGlrZSBbYS1bLmFhLl1dIG1hdGNoZXMgYW4gdW5r bm93biBzZXQuCisgICAgICAgICAgICAgVHJlYXQgaXQgbGlrZSBbLWFbLmFhLl1dIHdoaWxlIHBh cnNpbmcgaXQsIGFuZAorICAgICAgICAgICAgIHJlbWVtYmVyIHRoYXQgdGhlIHNldCBpcyB1bmtu b3duLiAgKi8KKyAgICAgICAgICBpZiAoYzIgPT0gJ1snICYmICpsZXhwdHIgPT0gJy4nKQorICAg ICAgICAgICAgeworICAgICAgICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworICAg ICAgICAgICAgICBjMiA9ICddJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChjMiA9 PSAnXScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEluIHRoZSBjYXNlIFt4LV0s IHRoZSAtIGlzIGFuIG9yZGluYXJ5IGh5cGhlbiwKKyAgICAgICAgICAgICAgICAgd2hpY2ggaXMg bGVmdCBpbiBjMSwgdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXIuICAqLworICAgICAgICAgICAgICBs ZXhwdHIgLT0gY3VyX21iX2xlbjsKKyAgICAgICAgICAgICAgbGV4bGVmdCArPSBjdXJfbWJfbGVu OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgaWYgKGMyID09ICdcXCcgJiYgKHN5bnRheF9iaXRzICYgUkVfQkFDS1NMQVNIX0VTQ0FQ RV9JTl9MSVNUUykpCisgICAgICAgICAgICAgICAgRkVUQ0hfV0MgKGMyLCB3YzIsIF8oInVuYmFs YW5jZWQgWyIpKTsKKworICAgICAgICAgICAgICBjb2xvbl93YXJuaW5nX3N0YXRlIHw9IDg7Cisg ICAgICAgICAgICAgIEZFVENIX1dDIChjMSwgd2MxLCBfKCJ1bmJhbGFuY2VkIFsiKSk7CisKKyAg ICAgICAgICAgICAgLyogVHJlYXQgW3gteV0gYXMgYSByYW5nZSBpZiB4ICE9IHkuICAqLworICAg ICAgICAgICAgICBpZiAod2MgIT0gd2MyIHx8IHdjID09IFdFT0YpCisgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgaWYgKGRmYS0+bXVsdGlieXRlKQorICAgICAgICAgICAgICAg ICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgZWxzZSBp ZiAodXNpbmdfc2ltcGxlX2xvY2FsZSAoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAg ICAgICAgICAgICAgICAgIGludCBjaTsKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNpID0g YzsgY2kgPD0gYzI7IGNpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRiaXQgKGNpLCBj Y2wpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisgICAgICAgICAgICAg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1YyA9IHRvdXBwZXIg KGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWMyID0gdG91cHBlciAoYzIpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNpID0gMDsgY2kgPCBOT1RDSEFSOyBjaSsr KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGludCB1Y2kgPSB0b3VwcGVyIChjaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpZiAodWMgPD0gdWNpICYmIHVjaSA8PSB1YzIpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHNldGJpdCAoY2ksIGNjbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg fQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAg ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGtub3duX2JyYWNrZXRfZXhw ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBjb2xvbl93YXJuaW5nX3N0YXRl IHw9IChjID09ICc6JykgPyAyIDogNDsKKworICAgICAgaWYgKCFkZmEtPm11bHRpYnl0ZSkKKyAg ICAgICAgeworICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisgICAgICAgICAgICBzZXRiaXRfY2Fz ZV9mb2xkX2MgKGMsIGNjbCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0Yml0IChj LCBjY2wpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIGlmICh3YyA9 PSBXRU9GKQorICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworICAgICAgZWxzZQor ICAgICAgICB7CisgICAgICAgICAgd2NoYXJfdCBmb2xkZWRbQ0FTRV9GT0xERURfQlVGU0laRSAr IDFdOworICAgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICAgIHVuc2lnbmVkIGludCBu ID0gKGNhc2VfZm9sZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2FzZV9mb2xkZWRf Y291bnRlcnBhcnRzICh3YywgZm9sZGVkICsgMSkgKyAxCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOiAxKTsKKyAgICAgICAgICBmb2xkZWRbMF0gPSB3YzsKKyAgICAgICAgICBmb3IgKGkg PSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgaWYgKCFzZXRiaXRfd2MgKGZvbGRlZFtpXSwg Y2NsKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmtfbWJjLT5jaGFycwor ICAgICAgICAgICAgICAgICAgPSBtYXliZV9yZWFsbG9jICh3b3JrX21iYy0+Y2hhcnMsIHdvcmtf bWJjLT5uY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19h bCwgc2l6ZW9mICp3b3JrX21iYy0+Y2hhcnMpOworICAgICAgICAgICAgICAgIHdvcmtfbWJjLT5j aGFyc1t3b3JrX21iYy0+bmNoYXJzKytdID0gZm9sZGVkW2ldOworICAgICAgICAgICAgICB9Cisg ICAgICAgIH0KKyAgICB9CisgIHdoaWxlICgod2MgPSB3YzEsIChjID0gYzEpICE9ICddJykpOwor CisgIGlmIChjb2xvbl93YXJuaW5nX3N0YXRlID09IDcpCisgICAgZGZhd2FybiAoXygiY2hhcmFj dGVyIGNsYXNzIHN5bnRheCBpcyBbWzpzcGFjZTpdXSwgbm90IFs6c3BhY2U6XSIpKTsKKworICBp ZiAoISBrbm93bl9icmFja2V0X2V4cCkKKyAgICByZXR1cm4gQkFDS1JFRjsKKworICBpZiAoZGZh LT5tdWx0aWJ5dGUpCisgICAgeworICAgICAgc3RhdGljIGNoYXJjbGFzcyBjb25zdCB6ZXJvY2xh c3M7CisgICAgICB3b3JrX21iYy0+aW52ZXJ0ID0gaW52ZXJ0OworICAgICAgd29ya19tYmMtPmNz ZXQgPSBlcXVhbCAoY2NsLCB6ZXJvY2xhc3MpID8gLTEgOiBjaGFyY2xhc3NfaW5kZXggKGNjbCk7 CisgICAgICByZXR1cm4gTUJDU0VUOworICAgIH0KKworICBpZiAoaW52ZXJ0KQorICAgIHsKKyAg ICAgIGFzc2VydCAoIWRmYS0+bXVsdGlieXRlKTsKKyAgICAgIG5vdHNldCAoY2NsKTsKKyAgICAg IGlmIChzeW50YXhfYml0cyAmIFJFX0hBVF9MSVNUU19OT1RfTkVXTElORSkKKyAgICAgICAgY2xy Yml0ICgnXG4nLCBjY2wpOworICAgIH0KKworICByZXR1cm4gQ1NFVCArIGNoYXJjbGFzc19pbmRl eCAoY2NsKTsKK30KKworI2RlZmluZSBQVVNIX0xFWF9TVEFURShzKQkJCVwKKyAgZG8JCQkJCQlc CisgICAgewkJCQkJCVwKKyAgICAgIGNoYXIgY29uc3QgKmxleHB0cl9zYXZlZCA9IGxleHB0cjsJ XAorICAgICAgc2l6ZV90IGxleGxlZnRfc2F2ZWQgPSBsZXhsZWZ0OwkJXAorICAgICAgbGV4cHRy ID0gKHMpOwkJCQlcCisgICAgICBsZXhsZWZ0ID0gc3RybGVuIChsZXhwdHIpCisKKyNkZWZpbmUg UE9QX0xFWF9TVEFURSgpCQkJCVwKKyAgICAgIGxleHB0ciA9IGxleHB0cl9zYXZlZDsJCQlcCisg ICAgICBsZXhsZWZ0ID0gbGV4bGVmdF9zYXZlZDsJCQlcCisgICAgfQkJCQkJCVwKKyAgd2hpbGUg KGZhbHNlKQorCitzdGF0aWMgdG9rZW4KK2xleCAodm9pZCkKK3sKKyAgaW50IGMsIGMyOworICBi b29sIGJhY2tzbGFzaCA9IGZhbHNlOworICBjaGFyY2xhc3MgY2NsOworICBpbnQgaTsKKworICAv KiBCYXNpYyBwbGFuOiBXZSBmZXRjaCBhIGNoYXJhY3Rlci4gIElmIGl0J3MgYSBiYWNrc2xhc2gs CisgICAgIHdlIHNldCB0aGUgYmFja3NsYXNoIGZsYWcgYW5kIGdvIHRocm91Z2ggdGhlIGxvb3Ag YWdhaW4uCisgICAgIE9uIHRoZSBwbHVzIHNpZGUsIHRoaXMgYXZvaWRzIGhhdmluZyBhIGR1cGxp Y2F0ZSBvZiB0aGUKKyAgICAgbWFpbiBzd2l0Y2ggaW5zaWRlIHRoZSBiYWNrc2xhc2ggY2FzZS4g IE9uIHRoZSBtaW51cyBzaWRlLAorICAgICBpdCBtZWFucyB0aGF0IGp1c3QgYWJvdXQgZXZlcnkg Y2FzZSBiZWdpbnMgd2l0aAorICAgICAiaWYgKGJhY2tzbGFzaCkgLi4uIi4gICovCisgIGZvciAo aSA9IDA7IGkgPCAyOyArK2kpCisgICAgeworICAgICAgRkVUQ0hfV0MgKGMsIHdjdG9rLCBOVUxM KTsKKworICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ1xcJzoKKyAg ICAgICAgICBpZiAoYmFja3NsYXNoKQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAg ICAgICAgICBpZiAobGV4bGVmdCA9PSAwKQorICAgICAgICAgICAgZGZhZXJyb3IgKF8oInVuZmlu aXNoZWQgXFwgZXNjYXBlIikpOworICAgICAgICAgIGJhY2tzbGFzaCA9IHRydWU7CisgICAgICAg ICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCkK KyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKHN5bnRheF9iaXRz ICYgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCisgICAgICAgICAgICAgIHx8IGxhc3R0b2sgPT0g RU5EIHx8IGxhc3R0b2sgPT0gTFBBUkVOIHx8IGxhc3R0b2sgPT0gT1IpCisgICAgICAgICAgICBy ZXR1cm4gbGFzdHRvayA9IEJFR0xJTkU7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKwor ICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoKQorICAgICAgICAgICAg Z290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9DT05URVhU X0lOREVQX0FOQ0hPUlMKKyAgICAgICAgICAgICAgfHwgbGV4bGVmdCA9PSAwCisgICAgICAgICAg ICAgIHx8IChzeW50YXhfYml0cyAmIFJFX05PX0JLX1BBUkVOUworICAgICAgICAgICAgICAgICAg PyBsZXhsZWZ0ID4gMCAmJiAqbGV4cHRyID09ICcpJworICAgICAgICAgICAgICAgICAgOiBsZXhs ZWZ0ID4gMSAmJiBsZXhwdHJbMF0gPT0gJ1xcJyAmJiBsZXhwdHJbMV0gPT0gJyknKQorICAgICAg ICAgICAgICB8fCAoc3ludGF4X2JpdHMgJiBSRV9OT19CS19WQkFSCisgICAgICAgICAgICAgICAg ICA/IGxleGxlZnQgPiAwICYmICpsZXhwdHIgPT0gJ3wnCisgICAgICAgICAgICAgICAgICA6IGxl eGxlZnQgPiAxICYmIGxleHB0clswXSA9PSAnXFwnICYmIGxleHB0clsxXSA9PSAnfCcpCisgICAg ICAgICAgICAgIHx8ICgoc3ludGF4X2JpdHMgJiBSRV9ORVdMSU5FX0FMVCkKKyAgICAgICAgICAg ICAgICAgICYmIGxleGxlZnQgPiAwICYmICpsZXhwdHIgPT0gJ1xuJykpCisgICAgICAgICAgICBy ZXR1cm4gbGFzdHRvayA9IEVORExJTkU7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKwor ICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgY2FzZSAnMic6CisgICAgICAgIGNhc2UgJzMnOgor ICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6CisgICAgICAgIGNhc2UgJzYnOgor ICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgIGNhc2UgJzknOgor ICAgICAgICAgIGlmIChiYWNrc2xhc2ggJiYgIShzeW50YXhfYml0cyAmIFJFX05PX0JLX1JFRlMp KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBmYWxzZTsKKyAgICAg ICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBCQUNLUkVGOworICAgICAgICAgICAgfQorICAgICAg ICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAgICAgICAgY2FzZSAnYCc6CisgICAgICAgICAgaWYg KGJhY2tzbGFzaCAmJiAhKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAg ICByZXR1cm4gbGFzdHRvayA9IEJFR0xJTkU7IC8qIEZJWE1FOiBzaG91bGQgYmUgYmVnaW5uaW5n IG9mIHN0cmluZyAqLworICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAgICAgICAgY2Fz ZSAnXCcnOgorICAgICAgICAgIGlmIChiYWNrc2xhc2ggJiYgIShzeW50YXhfYml0cyAmIFJFX05P X0dOVV9PUFMpKQorICAgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBFTkRMSU5FOyAgIC8qIEZJ WE1FOiBzaG91bGQgYmUgZW5kIG9mIHN0cmluZyAqLworICAgICAgICAgIGdvdG8gbm9ybWFsX2No YXI7CisKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAmJiAhKHN5 bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9 IEJFR1dPUkQ7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAgICAgICBjYXNlICc+ JzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoICYmICEoc3ludGF4X2JpdHMgJiBSRV9OT19HTlVf T1BTKSkKKyAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gRU5EV09SRDsKKyAgICAgICAgICBn b3RvIG5vcm1hbF9jaGFyOworCisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgIGlmIChiYWNr c2xhc2ggJiYgIShzeW50YXhfYml0cyAmIFJFX05PX0dOVV9PUFMpKQorICAgICAgICAgICAgcmV0 dXJuIGxhc3R0b2sgPSBMSU1XT1JEOworICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAg ICAgICAgY2FzZSAnQic6CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAmJiAhKHN5bnRheF9iaXRz ICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IE5PVExJTVdP UkQ7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAgICAgICBjYXNlICc/JzoKKyAg ICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9MSU1JVEVEX09QUykKKyAgICAgICAgICAgIGdv dG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5bnRheF9iaXRz ICYgUkVfQktfUExVU19RTSkgIT0gMCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwor ICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfQ09OVEVYVF9JTkRFUF9PUFMpICYmIGxh c3RzdGFydCkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgcmV0dXJu IGxhc3R0b2sgPSBRTUFSSzsKKworICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICBpZiAoYmFj a3NsYXNoKQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICBpZiAoIShz eW50YXhfYml0cyAmIFJFX0NPTlRFWFRfSU5ERVBfT1BTKSAmJiBsYXN0c3RhcnQpCisgICAgICAg ICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gU1RBUjsK KworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9MSU1J VEVEX09QUykKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJh Y2tzbGFzaCAhPSAoKHN5bnRheF9iaXRzICYgUkVfQktfUExVU19RTSkgIT0gMCkpCisgICAgICAg ICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVf Q09OVEVYVF9JTkRFUF9PUFMpICYmIGxhc3RzdGFydCkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFs X2NoYXI7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBQTFVTOworCisgICAgICAgIGNhc2Ug J3snOgorICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfSU5URVJWQUxTKSkKKyAgICAg ICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5 bnRheF9iaXRzICYgUkVfTk9fQktfQlJBQ0VTKSA9PSAwKSkKKyAgICAgICAgICAgIGdvdG8gbm9y bWFsX2NoYXI7CisgICAgICAgICAgaWYgKCEoc3ludGF4X2JpdHMgJiBSRV9DT05URVhUX0lOREVQ X09QUykgJiYgbGFzdHN0YXJ0KQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAg ICAgICAgIC8qIENhc2VzOgorICAgICAgICAgICAgIHtNfSAtIGV4YWN0IGNvdW50CisgICAgICAg ICAgICAge00sfSAtIG1pbmltdW0gY291bnQsIG1heGltdW0gaXMgaW5maW5pdHkKKyAgICAgICAg ICAgICB7LE59IC0gMCB0aHJvdWdoIE4KKyAgICAgICAgICAgICB7LH0gLSAwIHRvIGluZmluaXR5 IChzYW1lIGFzICcqJykKKyAgICAgICAgICAgICB7TSxOfSAtIE0gdGhyb3VnaCBOICovCisgICAg ICAgICAgeworICAgICAgICAgICAgY2hhciBjb25zdCAqcCA9IGxleHB0cjsKKyAgICAgICAgICAg IGNoYXIgY29uc3QgKmxpbSA9IHAgKyBsZXhsZWZ0OworICAgICAgICAgICAgbWlucmVwID0gbWF4 cmVwID0gLTE7CisgICAgICAgICAgICBmb3IgKDsgcCAhPSBsaW0gJiYgSVNBU0NJSURJR0lUICgq cCk7IHArKykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtaW5yZXAgPCAw KQorICAgICAgICAgICAgICAgICAgbWlucmVwID0gKnAgLSAnMCc7CisgICAgICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgICAgbWlucmVwID0gTUlOIChSRV9EVVBfTUFYICsgMSwgbWlu cmVwICogMTAgKyAqcCAtICcwJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChw ICE9IGxpbSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnLCcp CisgICAgICAgICAgICAgICAgICBtYXhyZXAgPSBtaW5yZXA7CisgICAgICAgICAgICAgICAgZWxz ZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobWlucmVwIDwg MCkKKyAgICAgICAgICAgICAgICAgICAgICBtaW5yZXAgPSAwOworICAgICAgICAgICAgICAgICAg ICB3aGlsZSAoKytwICE9IGxpbSAmJiBJU0FTQ0lJRElHSVQgKCpwKSkKKyAgICAgICAgICAgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4cmVwIDwgMCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgbWF4cmVwID0gKnAgLSAnMCc7CisgICAgICAgICAgICAgICAg ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHJlcCA9IE1JTiAoUkVf RFVQX01BWCArIDEsIG1heHJlcCAqIDEwICsgKnAgLSAnMCcpOworICAgICAgICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAg aWYgKCEgKCghIGJhY2tzbGFzaCB8fCAocCAhPSBsaW0gJiYgKnArKyA9PSAnXFwnKSkKKyAgICAg ICAgICAgICAgICAgICAmJiBwICE9IGxpbSAmJiAqcCsrID09ICd9JworICAgICAgICAgICAgICAg ICAgICYmIDAgPD0gbWlucmVwICYmIChtYXhyZXAgPCAwIHx8IG1pbnJlcCA8PSBtYXhyZXApKSkK KyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzeW50YXhfYml0cyAmIFJFX0lO VkFMSURfSU5URVJWQUxfT1JEKQorICAgICAgICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsK KyAgICAgICAgICAgICAgICBkZmFlcnJvciAoXygiaW52YWxpZCBjb250ZW50IG9mIFxce1xcfSIp KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFJFX0RVUF9NQVggPCBtYXhyZXAp CisgICAgICAgICAgICAgIGRmYWVycm9yIChfKCJyZWd1bGFyIGV4cHJlc3Npb24gdG9vIGJpZyIp KTsKKyAgICAgICAgICAgIGxleHB0ciA9IHA7CisgICAgICAgICAgICBsZXhsZWZ0ID0gbGltIC0g cDsKKyAgICAgICAgICB9CisgICAgICAgICAgbGFzdHN0YXJ0ID0gZmFsc2U7CisgICAgICAgICAg cmV0dXJuIGxhc3R0b2sgPSBSRVBNTjsKKworICAgICAgICBjYXNlICd8JzoKKyAgICAgICAgICBp ZiAoc3ludGF4X2JpdHMgJiBSRV9MSU1JVEVEX09QUykKKyAgICAgICAgICAgIGdvdG8gbm9ybWFs X2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5bnRheF9iaXRzICYgUkVfTk9f QktfVkJBUikgPT0gMCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAg IGxhc3RzdGFydCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBPUjsKKworICAg ICAgICBjYXNlICdcbic6CisgICAgICAgICAgaWYgKHN5bnRheF9iaXRzICYgUkVfTElNSVRFRF9P UFMKKyAgICAgICAgICAgICAgfHwgYmFja3NsYXNoIHx8ICEoc3ludGF4X2JpdHMgJiBSRV9ORVdM SU5FX0FMVCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGxhc3Rz dGFydCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBPUjsKKworICAgICAgICBj YXNlICcoJzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoICE9ICgoc3ludGF4X2JpdHMgJiBSRV9O T19CS19QQVJFTlMpID09IDApKQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAg ICAgICArK3BhcmVuczsKKyAgICAgICAgICBsYXN0c3RhcnQgPSB0cnVlOworICAgICAgICAgIHJl dHVybiBsYXN0dG9rID0gTFBBUkVOOworCisgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgIGlm IChiYWNrc2xhc2ggIT0gKChzeW50YXhfYml0cyAmIFJFX05PX0JLX1BBUkVOUykgPT0gMCkpCisg ICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmIChwYXJlbnMgPT0gMCAm JiBzeW50YXhfYml0cyAmIFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCisgICAgICAgICAg ICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIC0tcGFyZW5zOworICAgICAgICAgIGxhc3Rz dGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gUlBBUkVOOworCisgICAg ICAgIGNhc2UgJy4nOgorICAgICAgICAgIGlmIChiYWNrc2xhc2gpCisgICAgICAgICAgICBnb3Rv IG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmIChkZmEtPm11bHRpYnl0ZSkKKyAgICAgICAgICAg IHsKKyAgICAgICAgICAgICAgLyogSW4gbXVsdGlieXRlIGVudmlyb25tZW50IHBlcmlvZCBtdXN0 IG1hdGNoIHdpdGggYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIG5vdCBhIGJ5 dGUuICBTbyB3ZSB1c2UgQU5ZQ0hBUi4gICovCisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGZh bHNlOworICAgICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IEFOWUNIQVI7CisgICAgICAgICAg ICB9CisgICAgICAgICAgemVyb3NldCAoY2NsKTsKKyAgICAgICAgICBub3RzZXQgKGNjbCk7Cisg ICAgICAgICAgaWYgKCEoc3ludGF4X2JpdHMgJiBSRV9ET1RfTkVXTElORSkpCisgICAgICAgICAg ICBjbHJiaXQgKCdcbicsIGNjbCk7CisgICAgICAgICAgaWYgKHN5bnRheF9iaXRzICYgUkVfRE9U X05PVF9OVUxMKQorICAgICAgICAgICAgY2xyYml0ICgnXDAnLCBjY2wpOworICAgICAgICAgIGxh c3RzdGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gQ1NFVCArIGNoYXJj bGFzc19pbmRleCAoY2NsKTsKKworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgY2FzZSAnUyc6 CisgICAgICAgICAgaWYgKCFiYWNrc2xhc2ggfHwgKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09Q UykpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmICghZGZhLT5t dWx0aWJ5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHplcm9zZXQgKGNjbCk7Cisg ICAgICAgICAgICAgIGZvciAoYzIgPSAwOyBjMiA8IE5PVENIQVI7ICsrYzIpCisgICAgICAgICAg ICAgICAgaWYgKGlzc3BhY2UgKGMyKSkKKyAgICAgICAgICAgICAgICAgIHNldGJpdCAoYzIsIGNj bCk7CisgICAgICAgICAgICAgIGlmIChjID09ICdTJykKKyAgICAgICAgICAgICAgICBub3RzZXQg KGNjbCk7CisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgICBy ZXR1cm4gbGFzdHRvayA9IENTRVQgKyBjaGFyY2xhc3NfaW5kZXggKGNjbCk7CisgICAgICAgICAg ICB9CisKKyAgICAgICAgICAvKiBGSVhNRTogc2VlIGlmIG9wdGltaXppbmcgdGhpcywgYXMgaXMg ZG9uZSB3aXRoIEFOWUNIQVIgYW5kCisgICAgICAgICAgICAgYWRkX3V0ZjhfYW55Y2hhciwgbWFr ZXMgc2Vuc2UuICAqLworCisgICAgICAgICAgLyogXHMgYW5kIFxTIGFyZSBkb2N1bWVudGVkIHRv IGJlIGVxdWl2YWxlbnQgdG8gW1s6c3BhY2U6XV0gYW5kCisgICAgICAgICAgICAgW15bOnNwYWNl Ol1dIHJlc3BlY3RpdmVseSwgc28gdGVsbCB0aGUgbGV4ZXIgdG8gcHJvY2VzcyB0aG9zZQorICAg ICAgICAgICAgIHN0cmluZ3MsIGVhY2ggbWludXMgaXRzICJhbHJlYWR5IHByb2Nlc3NlZCIgJ1sn LiAgKi8KKyAgICAgICAgICBQVVNIX0xFWF9TVEFURSAoYyA9PSAncycgPyAiWzpzcGFjZTpdXSIg OiAiXls6c3BhY2U6XV0iKTsKKworICAgICAgICAgIGxhc3R0b2sgPSBwYXJzZV9icmFja2V0X2V4 cCAoKTsKKworICAgICAgICAgIFBPUF9MRVhfU1RBVEUgKCk7CisKKyAgICAgICAgICBsYXN0c3Rh cnQgPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gbGFzdHRvazsKKworICAgICAgICBjYXNlICd3 JzoKKyAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgaWYgKCFiYWNrc2xhc2ggfHwgKHN5bnRh eF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwor CisgICAgICAgICAgaWYgKCFkZmEtPm11bHRpYnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgemVyb3NldCAoY2NsKTsKKyAgICAgICAgICAgICAgZm9yIChjMiA9IDA7IGMyIDwgTk9U Q0hBUjsgKytjMikKKyAgICAgICAgICAgICAgICBpZiAodW5pYnl0ZV93b3JkX2NvbnN0aXR1ZW50 IChjMikpCisgICAgICAgICAgICAgICAgICBzZXRiaXQgKGMyLCBjY2wpOworICAgICAgICAgICAg ICBpZiAoYyA9PSAnVycpCisgICAgICAgICAgICAgICAgbm90c2V0IChjY2wpOworICAgICAgICAg ICAgICBsYXN0c3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBD U0VUICsgY2hhcmNsYXNzX2luZGV4IChjY2wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg LyogRklYTUU6IHNlZSBpZiBvcHRpbWl6aW5nIHRoaXMsIGFzIGlzIGRvbmUgd2l0aCBBTllDSEFS IGFuZAorICAgICAgICAgICAgIGFkZF91dGY4X2FueWNoYXIsIG1ha2VzIHNlbnNlLiAgKi8KKwor ICAgICAgICAgIC8qIFx3IGFuZCBcVyBhcmUgZG9jdW1lbnRlZCB0byBiZSBlcXVpdmFsZW50IHRv IFtfWzphbG51bTpdXSBhbmQKKyAgICAgICAgICAgICBbXl9bOmFsbnVtOl1dIHJlc3BlY3RpdmVs eSwgc28gdGVsbCB0aGUgbGV4ZXIgdG8gcHJvY2VzcyB0aG9zZQorICAgICAgICAgICAgIHN0cmlu Z3MsIGVhY2ggbWludXMgaXRzICJhbHJlYWR5IHByb2Nlc3NlZCIgJ1snLiAgKi8KKyAgICAgICAg ICBQVVNIX0xFWF9TVEFURSAoYyA9PSAndycgPyAiX1s6YWxudW06XV0iIDogIl5fWzphbG51bTpd XSIpOworCisgICAgICAgICAgbGFzdHRvayA9IHBhcnNlX2JyYWNrZXRfZXhwICgpOworCisgICAg ICAgICAgUE9QX0xFWF9TVEFURSAoKTsKKworICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOwor ICAgICAgICAgIHJldHVybiBsYXN0dG9rOworCisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAg IGlmIChiYWNrc2xhc2gpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAg IGxhc3RzdGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gcGFyc2VfYnJh Y2tldF9leHAgKCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgbm9ybWFsX2NoYXI6Cisg ICAgICAgICAgbGFzdHN0YXJ0ID0gZmFsc2U7CisgICAgICAgICAgLyogRm9yIG11bHRpYnl0ZSBj aGFyYWN0ZXIgc2V0cywgZm9sZGluZyBpcyBkb25lIGluIGF0b20uICBBbHdheXMKKyAgICAgICAg ICAgICByZXR1cm4gV0NIQVIuICAqLworICAgICAgICAgIGlmIChkZmEtPm11bHRpYnl0ZSkKKyAg ICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gV0NIQVI7CisKKyAgICAgICAgICBpZiAoY2FzZV9m b2xkICYmIGlzYWxwaGEgKGMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB6ZXJvc2V0 IChjY2wpOworICAgICAgICAgICAgICBzZXRiaXRfY2FzZV9mb2xkX2MgKGMsIGNjbCk7CisgICAg ICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gQ1NFVCArIGNoYXJjbGFzc19pbmRleCAoY2NsKTsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gYzsKKyAgICAgICAg fQorICAgIH0KKworICAvKiBUaGUgYWJvdmUgbG9vcCBzaG91bGQgY29uc3VtZSBhdCBtb3N0IGEg YmFja3NsYXNoCisgICAgIGFuZCBzb21lIG90aGVyIGNoYXJhY3Rlci4gICovCisgIGFib3J0ICgp OworICByZXR1cm4gRU5EOyAgICAgICAgICAgICAgICAgICAvKiBrZWVwcyBwZWRhbnRpYyBjb21w aWxlcnMgaGFwcHkuICAqLworfQorCisvKiBSZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgZm9yIHJl Z3VsYXIgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgdG9rZW4gdG9rOyAgICAgICAgICAgICAg IC8qIExvb2thaGVhZCB0b2tlbi4gICovCitzdGF0aWMgc2l6ZV90IGRlcHRoOyAgICAgICAgICAg IC8qIEN1cnJlbnQgZGVwdGggb2YgYSBoeXBvdGhldGljYWwgc3RhY2sKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaG9sZGluZyBkZWZlcnJlZCBwcm9kdWN0aW9ucy4gIFRoaXMg aXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBkZXRlcm1pbmUg dGhlIGRlcHRoIHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXF1aXJlZCBvZiB0aGUgcmVhbCBzdGFjayBsYXRlciBvbiBpbgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZmFhbmFseXplLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZHRv a19tYiAodG9rZW4gdCwgaW50IG1icHJvcCkKK3sKKyAgaWYgKGRmYS0+dGFsbG9jID09IGRmYS0+ dGluZGV4KQorICAgIHsKKyAgICAgIGRmYS0+dG9rZW5zID0geDJucmVhbGxvYyAoZGZhLT50b2tl bnMsICZkZmEtPnRhbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m ICpkZmEtPnRva2Vucyk7CisgICAgICBpZiAoZGZhLT5tdWx0aWJ5dGUpCisgICAgICAgIGRmYS0+ bXVsdGlieXRlX3Byb3AgPSB4bnJlYWxsb2MgKGRmYS0+bXVsdGlieXRlX3Byb3AsIGRmYS0+dGFs bG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKmRm YS0+bXVsdGlieXRlX3Byb3ApOworICAgIH0KKyAgaWYgKGRmYS0+bXVsdGlieXRlKQorICAgIGRm YS0+bXVsdGlieXRlX3Byb3BbZGZhLT50aW5kZXhdID0gbWJwcm9wOworICBkZmEtPnRva2Vuc1tk ZmEtPnRpbmRleCsrXSA9IHQ7CisKKyAgc3dpdGNoICh0KQorICAgIHsKKyAgICBjYXNlIFFNQVJL OgorICAgIGNhc2UgU1RBUjoKKyAgICBjYXNlIFBMVVM6CisgICAgICBicmVhazsKKworICAgIGNh c2UgQ0FUOgorICAgIGNhc2UgT1I6CisgICAgICAtLWRlcHRoOworICAgICAgYnJlYWs7CisKKyAg ICBjYXNlIEJBQ0tSRUY6CisgICAgICBkZmEtPmZhc3QgPSBmYWxzZTsKKyAgICAgIC8qIGZhbGx0 aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICsrZGZhLT5ubGVhdmVzOworICAgICAgLyog ZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEVNUFRZOgorICAgICAgKytkZXB0aDsKKyAgICAgIGJy ZWFrOworICAgIH0KKyAgaWYgKGRlcHRoID4gZGZhLT5kZXB0aCkKKyAgICBkZmEtPmRlcHRoID0g ZGVwdGg7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHRva193YyAod2ludF90IHdjKTsKKworLyogQWRk IHRoZSBnaXZlbiB0b2tlbiB0byB0aGUgcGFyc2UgdHJlZSwgbWFpbnRhaW5pbmcgdGhlIGRlcHRo IGNvdW50IGFuZAorICAgdXBkYXRpbmcgdGhlIG1heGltdW0gZGVwdGggaWYgbmVjZXNzYXJ5LiAg Ki8KK3N0YXRpYyB2b2lkCithZGR0b2sgKHRva2VuIHQpCit7CisgIGlmIChkZmEtPm11bHRpYnl0 ZSAmJiB0ID09IE1CQ1NFVCkKKyAgICB7CisgICAgICBib29sIG5lZWRfb3IgPSBmYWxzZTsKKyAg ICAgIHN0cnVjdCBtYl9jaGFyX2NsYXNzZXMgKndvcmtfbWJjID0gJmRmYS0+bWJjc2V0c1tkZmEt Pm5tYmNzZXRzIC0gMV07CisgICAgICBzaXplX3QgaTsKKworICAgICAgLyogRXh0cmFjdCB3aWRl IGNoYXJhY3RlcnMgaW50byBhbHRlcm5hdGlvbnMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KKyAg ICAgICAgIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBVVEYtOC4gICovCisgICAgICBmb3IgKGkgPSAw OyBpIDwgd29ya19tYmMtPm5jaGFyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgYWRkdG9r X3djICh3b3JrX21iYy0+Y2hhcnNbaV0pOworICAgICAgICAgIGlmIChuZWVkX29yKQorICAgICAg ICAgICAgYWRkdG9rIChPUik7CisgICAgICAgICAgbmVlZF9vciA9IHRydWU7CisgICAgICAgIH0K KyAgICAgIHdvcmtfbWJjLT5uY2hhcnMgPSAwOworCisgICAgICAvKiBDaGFyYWN0ZXJzIGhhdmUg YmVlbiBoYW5kbGVkIGFib3ZlLCBzbyBpdCBpcyBwb3NzaWJsZQorICAgICAgICAgdGhhdCB0aGUg bWJjc2V0IGlzIGVtcHR5IG5vdy4gIERvIG5vdGhpbmcgaW4gdGhhdCBjYXNlLiAgKi8KKyAgICAg IGlmICh3b3JrX21iYy0+Y3NldCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgIGFkZHRvayAo Q1NFVCArIHdvcmtfbWJjLT5jc2V0KTsKKyAgICAgICAgICBpZiAobmVlZF9vcikKKyAgICAgICAg ICAgIGFkZHRvayAoT1IpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAg YWRkdG9rX21iICh0LCAzKTsKKyAgICB9Cit9CisKKy8qIFdlIHRyZWF0IGEgbXVsdGlieXRlIGNo YXJhY3RlciBhcyBhIHNpbmdsZSBhdG9tLCBzbyB0aGF0IERGQQorICAgY2FuIHRyZWF0IGEgbXVs dGlieXRlIGNoYXJhY3RlciBhcyBhIHNpbmdsZSBleHByZXNzaW9uLgorCisgICBlLmcuLCB3ZSBj b25zdHJ1Y3QgdGhlIGZvbGxvd2luZyB0cmVlIGZyb20gIjxtYjE+PG1iMj4iLgorICAgPG1iMSgx c3QtYnl0ZSk+PG1iMSgybmQtYnl0ZSk+PENBVD48bWIxKDNyZC1ieXRlKT48Q0FUPgorICAgPG1i Migxc3QtYnl0ZSk+PG1iMigybmQtYnl0ZSk+PENBVD48bWIyKDNyZC1ieXRlKT48Q0FUPjxDQVQ+ ICovCitzdGF0aWMgdm9pZAorYWRkdG9rX3djICh3aW50X3Qgd2MpCit7CisgIHVuc2lnbmVkIGNo YXIgYnVmW01CX0xFTl9NQVhdOworICBtYnN0YXRlX3QgcyA9IHsgMCB9OworICBpbnQgaTsKKyAg c2l6ZV90IHN0b3JlZF9ieXRlcyA9IHdjcnRvbWIgKChjaGFyICopIGJ1Ziwgd2MsICZzKTsKKwor ICBpZiAoc3RvcmVkX2J5dGVzICE9IChzaXplX3QpIC0xKQorICAgIGN1cl9tYl9sZW4gPSBzdG9y ZWRfYnl0ZXM7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIG1lcmVseSBzdG9wLWdh cC4gIGJ1ZlswXSBpcyB1bmRlZmluZWQsIHlldCBza2lwcGluZworICAgICAgICAgdGhlIGFkZHRv a19tYiBjYWxsIGFsdG9nZXRoZXIgY2FuIGNvcnJ1cHQgdGhlIGhlYXAuICAqLworICAgICAgY3Vy X21iX2xlbiA9IDE7CisgICAgICBidWZbMF0gPSAwOworICAgIH0KKworICBhZGR0b2tfbWIgKGJ1 ZlswXSwgY3VyX21iX2xlbiA9PSAxID8gMyA6IDEpOworICBmb3IgKGkgPSAxOyBpIDwgY3VyX21i X2xlbjsgaSsrKQorICAgIHsKKyAgICAgIGFkZHRva19tYiAoYnVmW2ldLCBpID09IGN1cl9tYl9s ZW4gLSAxID8gMiA6IDApOworICAgICAgYWRkdG9rIChDQVQpOworICAgIH0KK30KKworc3RhdGlj IHZvaWQKK2FkZF91dGY4X2FueWNoYXIgKHZvaWQpCit7CisgIHN0YXRpYyBjaGFyY2xhc3MgY29u c3QgdXRmOF9jbGFzc2VzWzVdID0geworICAgIC8qIDgwLWJmOiBub24tbGVhZGluZyBieXRlcy4g ICovCisgICAgezAsIDAsIDAsIDAsIENIQVJDTEFTU19XT1JEX01BU0ssIENIQVJDTEFTU19XT1JE X01BU0ssIDAsIDB9LAorCisgICAgLyogMDAtN2Y6IDEtYnl0ZSBzZXF1ZW5jZS4gICovCisgICAg e0NIQVJDTEFTU19XT1JEX01BU0ssIENIQVJDTEFTU19XT1JEX01BU0ssIENIQVJDTEFTU19XT1JE X01BU0ssCisgICAgIENIQVJDTEFTU19XT1JEX01BU0ssIDAsIDAsIDAsIDB9LAorCisgICAgLyog YzItZGY6IDItYnl0ZSBzZXF1ZW5jZS4gICovCisgICAgezAsIDAsIDAsIDAsIDAsIDAsIH4zICYg Q0hBUkNMQVNTX1dPUkRfTUFTSywgMH0sCisKKyAgICAvKiBlMC1lZjogMy1ieXRlIHNlcXVlbmNl LiAgKi8KKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMHhmZmZmfSwKKworICAgIC8qIGYwLWY3 OiA0LWJ5dGUgc2VxdWVuY2UuICAqLworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAweGZmMDAw MH0KKyAgfTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSBzaXplb2YgKHV0ZjhfY2xhc3Nlcykg LyBzaXplb2YgKHV0ZjhfY2xhc3Nlc1swXSk7CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qIERl ZmluZSB0aGUgZml2ZSBjaGFyYWN0ZXIgY2xhc3NlcyB0aGF0IGFyZSBuZWVkZWQgYmVsb3cuICAq LworICBpZiAoZGZhLT51dGY4X2FueWNoYXJfY2xhc3Nlc1swXSA9PSAwKQorICAgIGZvciAoaSA9 IDA7IGkgPCBuOyBpKyspCisgICAgICB7CisgICAgICAgIGNoYXJjbGFzcyBjOworICAgICAgICBj b3B5c2V0ICh1dGY4X2NsYXNzZXNbaV0sIGMpOworICAgICAgICBpZiAoaSA9PSAxKQorICAgICAg ICAgIHsKKyAgICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfRE9UX05FV0xJTkUpKQor ICAgICAgICAgICAgICBjbHJiaXQgKCdcbicsIGMpOworICAgICAgICAgICAgaWYgKHN5bnRheF9i aXRzICYgUkVfRE9UX05PVF9OVUxMKQorICAgICAgICAgICAgICBjbHJiaXQgKCdcMCcsIGMpOwor ICAgICAgICAgIH0KKyAgICAgICAgZGZhLT51dGY4X2FueWNoYXJfY2xhc3Nlc1tpXSA9IENTRVQg KyBjaGFyY2xhc3NfaW5kZXggKGMpOworICAgICAgfQorCisgIC8qIEEgdmFsaWQgVVRGLTggY2hh cmFjdGVyIGlzCisKKyAgICAgKFsweDAwLTB4N2ZdCisgICAgIHxbMHhjMi0weGRmXVsweDgwLTB4 YmZdCisgICAgIHxbMHhlMC0weGVmWzB4ODAtMHhiZl1bMHg4MC0weGJmXQorICAgICB8WzB4ZjAt ZjddWzB4ODAtMHhiZl1bMHg4MC0weGJmXVsweDgwLTB4YmZdKQorCisgICAgIHdoaWNoIEknbGwg d3JpdGUgbW9yZSBjb25jaXNlbHkgIkJ8Q0F8REFBfEVBQUEiLiAgRmFjdG9yIHRoZSBbMHgwMC0w eDdmXQorICAgICBhbmQgeW91IGdldCAiQnwoQ3woRHxFQSlBKUEiLiAgQW5kIHNpbmNlIHRoZSB0 b2tlbiBidWZmZXIgaXMgaW4gcmV2ZXJzZQorICAgICBQb2xpc2ggbm90YXRpb24sIHlvdSBnZXQg IkIgQyBEIEUgQSBDQVQgT1IgQSBDQVQgT1IgQSBDQVQgT1IiLiAgKi8KKyAgZm9yIChpID0gMTsg aSA8IG47IGkrKykKKyAgICBhZGR0b2sgKGRmYS0+dXRmOF9hbnljaGFyX2NsYXNzZXNbaV0pOwor ICB3aGlsZSAoLS1pID4gMSkKKyAgICB7CisgICAgICBhZGR0b2sgKGRmYS0+dXRmOF9hbnljaGFy X2NsYXNzZXNbMF0pOworICAgICAgYWRkdG9rIChDQVQpOworICAgICAgYWRkdG9rIChPUik7Cisg ICAgfQorfQorCisvKiBUaGUgZ3JhbW1hciB1bmRlcnN0b29kIGJ5IHRoZSBwYXJzZXIgaXMgYXMg Zm9sbG93cy4KKworICAgcmVnZXhwOgorICAgICByZWdleHAgT1IgYnJhbmNoCisgICAgIGJyYW5j aAorCisgICBicmFuY2g6CisgICAgIGJyYW5jaCBjbG9zdXJlCisgICAgIGNsb3N1cmUKKworICAg Y2xvc3VyZToKKyAgICAgY2xvc3VyZSBRTUFSSworICAgICBjbG9zdXJlIFNUQVIKKyAgICAgY2xv c3VyZSBQTFVTCisgICAgIGNsb3N1cmUgUkVQTU4KKyAgICAgYXRvbQorCisgICBhdG9tOgorICAg ICA8bm9ybWFsIGNoYXJhY3Rlcj4KKyAgICAgPG11bHRpYnl0ZSBjaGFyYWN0ZXI+CisgICAgIEFO WUNIQVIKKyAgICAgTUJDU0VUCisgICAgIENTRVQKKyAgICAgQkFDS1JFRgorICAgICBCRUdMSU5F CisgICAgIEVORExJTkUKKyAgICAgQkVHV09SRAorICAgICBFTkRXT1JECisgICAgIExJTVdPUkQK KyAgICAgTk9UTElNV09SRAorICAgICBMUEFSRU4gcmVnZXhwIFJQQVJFTgorICAgICA8ZW1wdHk+ CisKKyAgIFRoZSBwYXJzZXIgYnVpbGRzIGEgcGFyc2UgdHJlZSBpbiBwb3N0Zml4IGZvcm0gaW4g YW4gYXJyYXkgb2YgdG9rZW5zLiAgKi8KKworc3RhdGljIHZvaWQKK2F0b20gKHZvaWQpCit7Cisg IGlmICh0b2sgPT0gV0NIQVIpCisgICAgeworICAgICAgaWYgKHdjdG9rID09IFdFT0YpCisgICAg ICAgIGFkZHRvayAoQkFDS1JFRik7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBh ZGR0b2tfd2MgKHdjdG9rKTsKKworICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgIHdjaGFyX3QgZm9sZGVkW0NBU0VfRk9MREVEX0JVRlNJWkVdOwor ICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaSwgbiA9IGNhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0 cyAod2N0b2ssIGZvbGRlZCk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKysp CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWRkdG9rX3djIChmb2xkZWRb aV0pOworICAgICAgICAgICAgICAgICAgYWRkdG9rIChPUik7CisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHRvayA9IGxleCAoKTsKKyAgICB9Cisg IGVsc2UgaWYgKHRvayA9PSBBTllDSEFSICYmIHVzaW5nX3V0ZjggKCkpCisgICAgeworICAgICAg LyogRm9yIFVURi04IGV4cGFuZCB0aGUgcGVyaW9kIHRvIGEgc2VyaWVzIG9mIENTRVRzIHRoYXQg ZGVmaW5lIGEgdmFsaWQKKyAgICAgICAgIFVURi04IGNoYXJhY3Rlci4gIFRoaXMgYXZvaWRzIHVz aW5nIHRoZSBzbG93IG11bHRpYnl0ZSBwYXRoLiAgSSdtCisgICAgICAgICBwcmV0dHkgc3VyZSBp dCB3b3VsZCBiZSBib3RoIHByb2ZpdGFibGUgYW5kIGNvcnJlY3QgdG8gZG8gaXQgZm9yCisgICAg ICAgICBhbnkgZW5jb2Rpbmc7IGhvd2V2ZXIsIHRoZSBvcHRpbWl6YXRpb24gbXVzdCBiZSBkb25l IG1hbnVhbGx5IGFzCisgICAgICAgICBpdCBpcyBkb25lIGFib3ZlIGluIGFkZF91dGY4X2FueWNo YXIuICBTbywgbGV0J3Mgc3RhcnQgd2l0aAorICAgICAgICAgVVRGLTg6IGl0IGlzIHRoZSBtb3N0 IHVzZWQsIGFuZCB0aGUgc3RydWN0dXJlIG9mIHRoZSBlbmNvZGluZworICAgICAgICAgbWFrZXMg dGhlIGNvcnJlY3RuZXNzIG1vcmUgb2J2aW91cy4gICovCisgICAgICBhZGRfdXRmOF9hbnljaGFy ICgpOworICAgICAgdG9rID0gbGV4ICgpOworICAgIH0KKyAgZWxzZSBpZiAoKHRvayA+PSAwICYm IHRvayA8IE5PVENIQVIpIHx8IHRvayA+PSBDU0VUIHx8IHRvayA9PSBCQUNLUkVGCisgICAgICAg ICAgIHx8IHRvayA9PSBCRUdMSU5FIHx8IHRvayA9PSBFTkRMSU5FIHx8IHRvayA9PSBCRUdXT1JE CisgICAgICAgICAgIHx8IHRvayA9PSBBTllDSEFSIHx8IHRvayA9PSBNQkNTRVQKKyAgICAgICAg ICAgfHwgdG9rID09IEVORFdPUkQgfHwgdG9rID09IExJTVdPUkQgfHwgdG9rID09IE5PVExJTVdP UkQpCisgICAgeworICAgICAgYWRkdG9rICh0b2spOworICAgICAgdG9rID0gbGV4ICgpOworICAg IH0KKyAgZWxzZSBpZiAodG9rID09IExQQVJFTikKKyAgICB7CisgICAgICB0b2sgPSBsZXggKCk7 CisgICAgICByZWdleHAgKCk7CisgICAgICBpZiAodG9rICE9IFJQQVJFTikKKyAgICAgICAgZGZh ZXJyb3IgKF8oInVuYmFsYW5jZWQgKCIpKTsKKyAgICAgIHRvayA9IGxleCAoKTsKKyAgICB9Cisg IGVsc2UKKyAgICBhZGR0b2sgKEVNUFRZKTsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2Yg dG9rZW5zIGluIHRoZSBnaXZlbiBzdWJleHByZXNzaW9uLiAgKi8KK3N0YXRpYyBzaXplX3QgX0dM X0FUVFJJQlVURV9QVVJFCituc3VidG9rcyAoc2l6ZV90IHRpbmRleCkKK3sKKyAgc2l6ZV90IG50 b2tzMTsKKworICBzd2l0Y2ggKGRmYS0+dG9rZW5zW3RpbmRleCAtIDFdKQorICAgIHsKKyAgICBk ZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBRTUFSSzoKKyAgICBjYXNlIFNUQVI6 CisgICAgY2FzZSBQTFVTOgorICAgICAgcmV0dXJuIDEgKyBuc3VidG9rcyAodGluZGV4IC0gMSk7 CisgICAgY2FzZSBDQVQ6CisgICAgY2FzZSBPUjoKKyAgICAgIG50b2tzMSA9IG5zdWJ0b2tzICh0 aW5kZXggLSAxKTsKKyAgICAgIHJldHVybiAxICsgbnRva3MxICsgbnN1YnRva3MgKHRpbmRleCAt IDEgLSBudG9rczEpOworICAgIH0KK30KKworLyogQ29weSB0aGUgZ2l2ZW4gc3ViZXhwcmVzc2lv biB0byB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgKi8KK3N0YXRpYyB2b2lkCitjb3B5dG9rcyAoc2l6 ZV90IHRpbmRleCwgc2l6ZV90IG50b2tlbnMpCit7CisgIHNpemVfdCBpOworCisgIGlmIChkZmEt Pm11bHRpYnl0ZSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRva2VuczsgKytpKQorICAgICAgYWRk dG9rX21iIChkZmEtPnRva2Vuc1t0aW5kZXggKyBpXSwgZGZhLT5tdWx0aWJ5dGVfcHJvcFt0aW5k ZXggKyBpXSk7CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRva2VuczsgKytpKQorICAg ICAgYWRkdG9rX21iIChkZmEtPnRva2Vuc1t0aW5kZXggKyBpXSwgMyk7Cit9CisKK3N0YXRpYyB2 b2lkCitjbG9zdXJlICh2b2lkKQoreworICBpbnQgaTsKKyAgc2l6ZV90IHRpbmRleCwgbnRva2Vu czsKKworICBhdG9tICgpOworICB3aGlsZSAodG9rID09IFFNQVJLIHx8IHRvayA9PSBTVEFSIHx8 IHRvayA9PSBQTFVTIHx8IHRvayA9PSBSRVBNTikKKyAgICBpZiAodG9rID09IFJFUE1OICYmICht aW5yZXAgfHwgbWF4cmVwKSkKKyAgICAgIHsKKyAgICAgICAgbnRva2VucyA9IG5zdWJ0b2tzIChk ZmEtPnRpbmRleCk7CisgICAgICAgIHRpbmRleCA9IGRmYS0+dGluZGV4IC0gbnRva2VuczsKKyAg ICAgICAgaWYgKG1heHJlcCA8IDApCisgICAgICAgICAgYWRkdG9rIChQTFVTKTsKKyAgICAgICAg aWYgKG1pbnJlcCA9PSAwKQorICAgICAgICAgIGFkZHRvayAoUU1BUkspOworICAgICAgICBmb3Ig KGkgPSAxOyBpIDwgbWlucmVwOyArK2kpCisgICAgICAgICAgeworICAgICAgICAgICAgY29weXRv a3MgKHRpbmRleCwgbnRva2Vucyk7CisgICAgICAgICAgICBhZGR0b2sgKENBVCk7CisgICAgICAg ICAgfQorICAgICAgICBmb3IgKDsgaSA8IG1heHJlcDsgKytpKQorICAgICAgICAgIHsKKyAgICAg ICAgICAgIGNvcHl0b2tzICh0aW5kZXgsIG50b2tlbnMpOworICAgICAgICAgICAgYWRkdG9rIChR TUFSSyk7CisgICAgICAgICAgICBhZGR0b2sgKENBVCk7CisgICAgICAgICAgfQorICAgICAgICB0 b2sgPSBsZXggKCk7CisgICAgICB9CisgICAgZWxzZSBpZiAodG9rID09IFJFUE1OKQorICAgICAg eworICAgICAgICBkZmEtPnRpbmRleCAtPSBuc3VidG9rcyAoZGZhLT50aW5kZXgpOworICAgICAg ICB0b2sgPSBsZXggKCk7CisgICAgICAgIGNsb3N1cmUgKCk7CisgICAgICB9CisgICAgZWxzZQor ICAgICAgeworICAgICAgICBhZGR0b2sgKHRvayk7CisgICAgICAgIHRvayA9IGxleCAoKTsKKyAg ICAgIH0KK30KKworc3RhdGljIHZvaWQKK2JyYW5jaCAodm9pZCkKK3sKKyAgY2xvc3VyZSAoKTsK KyAgd2hpbGUgKHRvayAhPSBSUEFSRU4gJiYgdG9rICE9IE9SICYmIHRvayA+PSAwKQorICAgIHsK KyAgICAgIGNsb3N1cmUgKCk7CisgICAgICBhZGR0b2sgKENBVCk7CisgICAgfQorfQorCitzdGF0 aWMgdm9pZAorcmVnZXhwICh2b2lkKQoreworICBicmFuY2ggKCk7CisgIHdoaWxlICh0b2sgPT0g T1IpCisgICAgeworICAgICAgdG9rID0gbGV4ICgpOworICAgICAgYnJhbmNoICgpOworICAgICAg YWRkdG9rIChPUik7CisgICAgfQorfQorCisvKiBNYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGFy c2VyLiAgUyBpcyBhIHN0cmluZyB0byBiZSBwYXJzZWQsIGxlbiBpcyB0aGUKKyAgIGxlbmd0aCBv ZiB0aGUgc3RyaW5nLCBzbyBzIGNhbiBpbmNsdWRlIE5VTCBjaGFyYWN0ZXJzLiAgRCBpcyBhIHBv aW50ZXIgdG8KKyAgIHRoZSBzdHJ1Y3QgZGZhIHRvIHBhcnNlIGludG8uICAqLworc3RhdGljIHZv aWQKK2RmYXBhcnNlIChjaGFyIGNvbnN0ICpzLCBzaXplX3QgbGVuLCBzdHJ1Y3QgZGZhICpkKQor eworICBkZmEgPSBkOworICBsZXhwdHIgPSBzOworICBsZXhsZWZ0ID0gbGVuOworICBsYXN0dG9r ID0gRU5EOworICBsYXN0c3RhcnQgPSB0cnVlOworICBwYXJlbnMgPSAwOworICBpZiAoZGZhLT5t dWx0aWJ5dGUpCisgICAgeworICAgICAgY3VyX21iX2xlbiA9IDA7CisgICAgICBtZW1zZXQgKCZk LT5tYnMsIDAsIHNpemVvZiBkLT5tYnMpOworICAgIH0KKworICBpZiAoIXN5bnRheF9iaXRzX3Nl dCkKKyAgICBkZmFlcnJvciAoXygibm8gc3ludGF4IHNwZWNpZmllZCIpKTsKKworICB0b2sgPSBs ZXggKCk7CisgIGRlcHRoID0gZC0+ZGVwdGg7CisKKyAgcmVnZXhwICgpOworCisgIGlmICh0b2sg IT0gRU5EKQorICAgIGRmYWVycm9yIChfKCJ1bmJhbGFuY2VkICkiKSk7CisKKyAgYWRkdG9rIChF TkQgLSBkLT5ucmVnZXhwcyk7CisgIGFkZHRvayAoQ0FUKTsKKworICBpZiAoZC0+bnJlZ2V4cHMp CisgICAgYWRkdG9rIChPUik7CisKKyAgKytkLT5ucmVnZXhwczsKK30KKworLyogU29tZSBwcmlt aXRpdmVzIGZvciBvcGVyYXRpbmcgb24gc2V0cyBvZiBwb3NpdGlvbnMuICAqLworCisvKiBDb3B5 IG9uZSBzZXQgdG8gYW5vdGhlci4gICovCitzdGF0aWMgdm9pZAorY29weSAocG9zaXRpb25fc2V0 IGNvbnN0ICpzcmMsIHBvc2l0aW9uX3NldCAqZHN0KQoreworICBpZiAoZHN0LT5hbGxvYyA8IHNy Yy0+bmVsZW0pCisgICAgeworICAgICAgZnJlZSAoZHN0LT5lbGVtcyk7CisgICAgICBkc3QtPmFs bG9jID0gc3JjLT5uZWxlbTsKKyAgICAgIGRzdC0+ZWxlbXMgPSB4Mm5yZWFsbG9jIChOVUxMLCAm ZHN0LT5hbGxvYywgc2l6ZW9mICpkc3QtPmVsZW1zKTsKKyAgICB9CisgIG1lbWNweSAoZHN0LT5l bGVtcywgc3JjLT5lbGVtcywgc3JjLT5uZWxlbSAqIHNpemVvZiAqZHN0LT5lbGVtcyk7CisgIGRz dC0+bmVsZW0gPSBzcmMtPm5lbGVtOworfQorCitzdGF0aWMgdm9pZAorYWxsb2NfcG9zaXRpb25f c2V0IChwb3NpdGlvbl9zZXQgKnMsIHNpemVfdCBzaXplKQoreworICBzLT5lbGVtcyA9IHhubWFs bG9jIChzaXplLCBzaXplb2YgKnMtPmVsZW1zKTsKKyAgcy0+YWxsb2MgPSBzaXplOworICBzLT5u ZWxlbSA9IDA7Cit9CisKKy8qIEluc2VydCBwb3NpdGlvbiBQIGluIHNldCBTLiAgUyBpcyBtYWlu dGFpbmVkIGluIHNvcnRlZCBvcmRlciBvbgorICAgZGVjcmVhc2luZyBpbmRleC4gIElmIHRoZXJl IGlzIGFscmVhZHkgYW4gZW50cnkgaW4gUyB3aXRoIFAuaW5kZXgKKyAgIHRoZW4gbWVyZ2UgKGxv Z2ljYWxseS1PUikgUCdzIGNvbnN0cmFpbnRzIGludG8gdGhlIG9uZSBpbiBTLgorICAgUy0+ZWxl bXMgbXVzdCBwb2ludCB0byBhbiBhcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgcmVzdWx0 aW5nIHNldC4gICovCitzdGF0aWMgdm9pZAoraW5zZXJ0IChwb3NpdGlvbiBwLCBwb3NpdGlvbl9z ZXQgKnMpCit7CisgIHNpemVfdCBjb3VudCA9IHMtPm5lbGVtOworICBzaXplX3QgbG8gPSAwLCBo aSA9IGNvdW50OworICBzaXplX3QgaTsKKyAgd2hpbGUgKGxvIDwgaGkpCisgICAgeworICAgICAg c2l6ZV90IG1pZCA9IChsbyArIGhpKSA+PiAxOworICAgICAgaWYgKHMtPmVsZW1zW21pZF0uaW5k ZXggPiBwLmluZGV4KQorICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgICBlbHNlCisgICAgICAg IGhpID0gbWlkOworICAgIH0KKworICBpZiAobG8gPCBjb3VudCAmJiBwLmluZGV4ID09IHMtPmVs ZW1zW2xvXS5pbmRleCkKKyAgICB7CisgICAgICBzLT5lbGVtc1tsb10uY29uc3RyYWludCB8PSBw LmNvbnN0cmFpbnQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHMtPmVsZW1zID0gbWF5YmVf cmVhbGxvYyAocy0+ZWxlbXMsIGNvdW50LCAmcy0+YWxsb2MsIHNpemVvZiAqcy0+ZWxlbXMpOwor ICBmb3IgKGkgPSBjb3VudDsgaSA+IGxvOyBpLS0pCisgICAgcy0+ZWxlbXNbaV0gPSBzLT5lbGVt c1tpIC0gMV07CisgIHMtPmVsZW1zW2xvXSA9IHA7CisgICsrcy0+bmVsZW07Cit9CisKKy8qIE1l cmdlIHR3byBzZXRzIG9mIHBvc2l0aW9ucyBpbnRvIGEgdGhpcmQuICBUaGUgcmVzdWx0IGlzIGV4 YWN0bHkgYXMgaWYKKyAgIHRoZSBwb3NpdGlvbnMgb2YgYm90aCBzZXRzIHdlcmUgaW5zZXJ0ZWQg aW50byBhbiBpbml0aWFsbHkgZW1wdHkgc2V0LiAgKi8KK3N0YXRpYyB2b2lkCittZXJnZSAocG9z aXRpb25fc2V0IGNvbnN0ICpzMSwgcG9zaXRpb25fc2V0IGNvbnN0ICpzMiwgcG9zaXRpb25fc2V0 ICptKQoreworICBzaXplX3QgaSA9IDAsIGogPSAwOworCisgIGlmIChtLT5hbGxvYyA8IHMxLT5u ZWxlbSArIHMyLT5uZWxlbSkKKyAgICB7CisgICAgICBmcmVlIChtLT5lbGVtcyk7CisgICAgICBt LT5lbGVtcyA9IG1heWJlX3JlYWxsb2MgKE5VTEwsIHMxLT5uZWxlbSArIHMyLT5uZWxlbSwgJm0t PmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKm0tPmVsZW1z KTsKKyAgICB9CisgIG0tPm5lbGVtID0gMDsKKyAgd2hpbGUgKGkgPCBzMS0+bmVsZW0gJiYgaiA8 IHMyLT5uZWxlbSkKKyAgICBpZiAoczEtPmVsZW1zW2ldLmluZGV4ID4gczItPmVsZW1zW2pdLmlu ZGV4KQorICAgICAgbS0+ZWxlbXNbbS0+bmVsZW0rK10gPSBzMS0+ZWxlbXNbaSsrXTsKKyAgICBl bHNlIGlmIChzMS0+ZWxlbXNbaV0uaW5kZXggPCBzMi0+ZWxlbXNbal0uaW5kZXgpCisgICAgICBt LT5lbGVtc1ttLT5uZWxlbSsrXSA9IHMyLT5lbGVtc1tqKytdOworICAgIGVsc2UKKyAgICAgIHsK KyAgICAgICAgbS0+ZWxlbXNbbS0+bmVsZW1dID0gczEtPmVsZW1zW2krK107CisgICAgICAgIG0t PmVsZW1zW20tPm5lbGVtKytdLmNvbnN0cmFpbnQgfD0gczItPmVsZW1zW2orK10uY29uc3RyYWlu dDsKKyAgICAgIH0KKyAgd2hpbGUgKGkgPCBzMS0+bmVsZW0pCisgICAgbS0+ZWxlbXNbbS0+bmVs ZW0rK10gPSBzMS0+ZWxlbXNbaSsrXTsKKyAgd2hpbGUgKGogPCBzMi0+bmVsZW0pCisgICAgbS0+ ZWxlbXNbbS0+bmVsZW0rK10gPSBzMi0+ZWxlbXNbaisrXTsKK30KKworLyogRGVsZXRlIGEgcG9z aXRpb24gZnJvbSBhIHNldC4gICovCitzdGF0aWMgdm9pZAorZGVsZXRlIChwb3NpdGlvbiBwLCBw b3NpdGlvbl9zZXQgKnMpCit7CisgIHNpemVfdCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBzLT5u ZWxlbTsgKytpKQorICAgIGlmIChwLmluZGV4ID09IHMtPmVsZW1zW2ldLmluZGV4KQorICAgICAg YnJlYWs7CisgIGlmIChpIDwgcy0+bmVsZW0pCisgICAgZm9yICgtLXMtPm5lbGVtOyBpIDwgcy0+ bmVsZW07ICsraSkKKyAgICAgIHMtPmVsZW1zW2ldID0gcy0+ZWxlbXNbaSArIDFdOworfQorCisv KiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4g cG9zaXRpb24gc2V0IHdpdGgKKyAgIHRoZSBnaXZlbiBwcmVjZWRpbmcgY29udGV4dCwgb3IgY3Jl YXRlIGEgbmV3IHN0YXRlIGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyAgIHN0YXRlLiAgQ29udGV4dCB0 ZWxscyB3aGV0aGVyIHdlIGdvdCBoZXJlIG9uIGEgbmV3bGluZSBvciBsZXR0ZXIuICAqLworc3Rh dGljIHN0YXRlX251bQorc3RhdGVfaW5kZXggKHN0cnVjdCBkZmEgKmQsIHBvc2l0aW9uX3NldCBj b25zdCAqcywgaW50IGNvbnRleHQpCit7CisgIHNpemVfdCBoYXNoID0gMDsKKyAgaW50IGNvbnN0 cmFpbnQ7CisgIHN0YXRlX251bSBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBzLT5uZWxlbTsg KytpKQorICAgIGhhc2ggXj0gcy0+ZWxlbXNbaV0uaW5kZXggKyBzLT5lbGVtc1tpXS5jb25zdHJh aW50OworCisgIC8qIFRyeSB0byBmaW5kIGEgc3RhdGUgdGhhdCBleGFjdGx5IG1hdGNoZXMgdGhl IHByb3Bvc2VkIG9uZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zaW5kZXg7ICsraSkKKyAg ICB7CisgICAgICBpZiAoaGFzaCAhPSBkLT5zdGF0ZXNbaV0uaGFzaCB8fCBzLT5uZWxlbSAhPSBk LT5zdGF0ZXNbaV0uZWxlbXMubmVsZW0KKyAgICAgICAgICB8fCBjb250ZXh0ICE9IGQtPnN0YXRl c1tpXS5jb250ZXh0KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBz LT5uZWxlbTsgKytqKQorICAgICAgICBpZiAocy0+ZWxlbXNbal0uY29uc3RyYWludAorICAgICAg ICAgICAgIT0gZC0+c3RhdGVzW2ldLmVsZW1zLmVsZW1zW2pdLmNvbnN0cmFpbnQKKyAgICAgICAg ICAgIHx8IHMtPmVsZW1zW2pdLmluZGV4ICE9IGQtPnN0YXRlc1tpXS5lbGVtcy5lbGVtc1tqXS5p bmRleCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChqID09IHMtPm5lbGVtKQorICAgICAg ICByZXR1cm4gaTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJu ZXcgc3RhdGUgJXpkXG4gbmV4dHBvczoiLCBpKTsKKyAgZm9yIChqID0gMDsgaiA8IHMtPm5lbGVt OyArK2opCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBzLT5lbGVtc1tq XS5pbmRleCk7CisgICAgICBwcnRvayAoZC0+dG9rZW5zW3MtPmVsZW1zW2pdLmluZGV4XSk7Cisg ICAgfQorICBmcHJpbnRmIChzdGRlcnIsICJcbiBjb250ZXh0OiIpOworICBpZiAoY29udGV4dCBe IENUWF9BTlkpCisgICAgeworICAgICAgaWYgKGNvbnRleHQgJiBDVFhfTk9ORSkKKyAgICAgICAg ZnByaW50ZiAoc3RkZXJyLCAiIENUWF9OT05FIik7CisgICAgICBpZiAoY29udGV4dCAmIENUWF9M RVRURVIpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBDVFhfTEVUVEVSIik7CisgICAgICBp ZiAoY29udGV4dCAmIENUWF9ORVdMSU5FKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RY X05FV0xJTkUiKTsKKyAgICB9CisgIGVsc2UKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RYX0FO WSIpOworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgLyogV2UnbGwgaGF2 ZSB0byBjcmVhdGUgYSBuZXcgc3RhdGUuICAqLworICBkLT5zdGF0ZXMgPSBtYXliZV9yZWFsbG9j IChkLT5zdGF0ZXMsIGQtPnNpbmRleCwgJmQtPnNhbGxvYywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZW9mICpkLT5zdGF0ZXMpOworICBkLT5zdGF0ZXNbaV0uaGFzaCA9IGhhc2g7 CisgIGFsbG9jX3Bvc2l0aW9uX3NldCAoJmQtPnN0YXRlc1tpXS5lbGVtcywgcy0+bmVsZW0pOwor ICBjb3B5IChzLCAmZC0+c3RhdGVzW2ldLmVsZW1zKTsKKyAgZC0+c3RhdGVzW2ldLmNvbnRleHQg PSBjb250ZXh0OworICBkLT5zdGF0ZXNbaV0uY29uc3RyYWludCA9IDA7CisgIGQtPnN0YXRlc1tp XS5maXJzdF9lbmQgPSAwOworICBkLT5zdGF0ZXNbaV0ubWJwcy5uZWxlbSA9IDA7CisgIGQtPnN0 YXRlc1tpXS5tYnBzLmVsZW1zID0gTlVMTDsKKworICBmb3IgKGogPSAwOyBqIDwgcy0+bmVsZW07 ICsraikKKyAgICBpZiAoZC0+dG9rZW5zW3MtPmVsZW1zW2pdLmluZGV4XSA8IDApCisgICAgICB7 CisgICAgICAgIGNvbnN0cmFpbnQgPSBzLT5lbGVtc1tqXS5jb25zdHJhaW50OworICAgICAgICBp ZiAoU1VDQ0VFRFNfSU5fQ09OVEVYVCAoY29uc3RyYWludCwgY29udGV4dCwgQ1RYX0FOWSkpCisg ICAgICAgICAgZC0+c3RhdGVzW2ldLmNvbnN0cmFpbnQgfD0gY29uc3RyYWludDsKKyAgICAgICAg aWYgKCFkLT5zdGF0ZXNbaV0uZmlyc3RfZW5kKQorICAgICAgICAgIGQtPnN0YXRlc1tpXS5maXJz dF9lbmQgPSBkLT50b2tlbnNbcy0+ZWxlbXNbal0uaW5kZXhdOworICAgICAgfQorICAgIGVsc2Ug aWYgKGQtPnRva2Vuc1tzLT5lbGVtc1tqXS5pbmRleF0gPT0gQkFDS1JFRikKKyAgICAgIGQtPnN0 YXRlc1tpXS5jb25zdHJhaW50ID0gTk9fQ09OU1RSQUlOVDsKKworICArK2QtPnNpbmRleDsKKwor ICByZXR1cm4gaTsKK30KKworLyogRmluZCB0aGUgZXBzaWxvbiBjbG9zdXJlIG9mIGEgc2V0IG9m IHBvc2l0aW9ucy4gIElmIGFueSBwb3NpdGlvbiBvZiB0aGUgc2V0CisgICBjb250YWlucyBhIHN5 bWJvbCB0aGF0IG1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZyBpbiBzb21lIGNvbnRleHQsIHJlcGxh Y2UKKyAgIHRoYXQgcG9zaXRpb24gd2l0aCB0aGUgZWxlbWVudHMgb2YgaXRzIGZvbGxvdyBsYWJl bGVkIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAgIGNvbnN0cmFpbnQuICBSZXBlYXQgZXhoYXVzdGl2 ZWx5IHVudGlsIG5vIGZ1bm55IHBvc2l0aW9ucyBhcmUgbGVmdC4KKyAgIFMtPmVsZW1zIG11c3Qg YmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdC4gICovCitzdGF0aWMgdm9pZAorZXBz Y2xvc3VyZSAocG9zaXRpb25fc2V0ICpzLCBzdHJ1Y3QgZGZhIGNvbnN0ICpkLCBjaGFyICp2aXNp dGVkKQoreworICBzaXplX3QgaSwgajsKKyAgcG9zaXRpb24gcCwgb2xkOworICBib29sIGluaXRp YWxpemVkID0gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IHMtPm5lbGVtOyArK2kpCisgICAg aWYgKGQtPnRva2Vuc1tzLT5lbGVtc1tpXS5pbmRleF0gPj0gTk9UQ0hBUgorICAgICAgICAmJiBk LT50b2tlbnNbcy0+ZWxlbXNbaV0uaW5kZXhdICE9IEJBQ0tSRUYKKyAgICAgICAgJiYgZC0+dG9r ZW5zW3MtPmVsZW1zW2ldLmluZGV4XSAhPSBBTllDSEFSCisgICAgICAgICYmIGQtPnRva2Vuc1tz LT5lbGVtc1tpXS5pbmRleF0gIT0gTUJDU0VUCisgICAgICAgICYmIGQtPnRva2Vuc1tzLT5lbGVt c1tpXS5pbmRleF0gPCBDU0VUKQorICAgICAgeworICAgICAgICBpZiAoIWluaXRpYWxpemVkKQor ICAgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCAodmlzaXRlZCwgMCwgZC0+dGluZGV4ICog c2l6ZW9mICgqdmlzaXRlZCkpOworICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAg ICAgICAgIH0KKyAgICAgICAgb2xkID0gcy0+ZWxlbXNbaV07CisgICAgICAgIHAuY29uc3RyYWlu dCA9IG9sZC5jb25zdHJhaW50OworICAgICAgICBkZWxldGUgKHMtPmVsZW1zW2ldLCBzKTsKKyAg ICAgICAgaWYgKHZpc2l0ZWRbb2xkLmluZGV4XSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAt LWk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIHZpc2l0ZWRb b2xkLmluZGV4XSA9IDE7CisgICAgICAgIHN3aXRjaCAoZC0+dG9rZW5zW29sZC5pbmRleF0pCisg ICAgICAgICAgeworICAgICAgICAgIGNhc2UgQkVHTElORToKKyAgICAgICAgICAgIHAuY29uc3Ry YWludCAmPSBCRUdMSU5FX0NPTlNUUkFJTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg ICBjYXNlIEVORExJTkU6CisgICAgICAgICAgICBwLmNvbnN0cmFpbnQgJj0gRU5ETElORV9DT05T VFJBSU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBCRUdXT1JEOgorICAg ICAgICAgICAgcC5jb25zdHJhaW50ICY9IEJFR1dPUkRfQ09OU1RSQUlOVDsKKyAgICAgICAgICAg IGJyZWFrOworICAgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgICAgIHAuY29uc3RyYWlu dCAmPSBFTkRXT1JEX0NPTlNUUkFJTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBj YXNlIExJTVdPUkQ6CisgICAgICAgICAgICBwLmNvbnN0cmFpbnQgJj0gTElNV09SRF9DT05TVFJB SU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOT1RMSU1XT1JEOgorICAg ICAgICAgICAgcC5jb25zdHJhaW50ICY9IE5PVExJTVdPUkRfQ09OU1RSQUlOVDsKKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5mb2xsb3dzW29sZC5pbmRleF0ubmVs ZW07ICsraikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLmluZGV4ID0gZC0+Zm9sbG93c1tv bGQuaW5kZXhdLmVsZW1zW2pdLmluZGV4OworICAgICAgICAgICAgaW5zZXJ0IChwLCBzKTsKKyAg ICAgICAgICB9CisgICAgICAgIC8qIEZvcmNlIHJlc2NhbiB0byBzdGFydCBhdCB0aGUgYmVnaW5u aW5nLiAgKi8KKyAgICAgICAgaSA9IC0xOworICAgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSBz ZXQgb2YgY29udGV4dHMgZm9yIHdoaWNoIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQorICAgY2hhcmFj dGVyIGluY2x1ZGVkIGluIEMuICAqLworCitzdGF0aWMgaW50CitjaGFyY2xhc3NfY29udGV4dCAo Y2hhcmNsYXNzIGMpCit7CisgIGludCBjb250ZXh0ID0gMDsKKyAgdW5zaWduZWQgaW50IGo7CisK KyAgaWYgKHRzdGJpdCAoZW9sYnl0ZSwgYykpCisgICAgY29udGV4dCB8PSBDVFhfTkVXTElORTsK KworICBmb3IgKGogPSAwOyBqIDwgQ0hBUkNMQVNTX1dPUkRTOyArK2opCisgICAgeworICAgICAg aWYgKGNbal0gJiBsZXR0ZXJzW2pdKQorICAgICAgICBjb250ZXh0IHw9IENUWF9MRVRURVI7Cisg ICAgICBpZiAoY1tqXSAmIH4obGV0dGVyc1tqXSB8IG5ld2xpbmVbal0pKQorICAgICAgICBjb250 ZXh0IHw9IENUWF9OT05FOworICAgIH0KKworICByZXR1cm4gY29udGV4dDsKK30KKworLyogUmV0 dXJucyB0aGUgY29udGV4dHMgb24gd2hpY2ggdGhlIHBvc2l0aW9uIHNldCBTIGRlcGVuZHMuICBF YWNoIGNvbnRleHQKKyAgIGluIHRoZSBzZXQgb2YgcmV0dXJuZWQgY29udGV4dHMgKGxldCdzIGNh bGwgaXQgU0MpIG1heSBoYXZlIGEgZGlmZmVyZW50CisgICBmb2xsb3cgc2V0IHRoYW4gb3RoZXIg Y29udGV4dHMgaW4gU0MsIGFuZCBhbHNvIGRpZmZlcmVudCBmcm9tIHRoZQorICAgZm9sbG93IHNl dCBvZiB0aGUgY29tcGxlbWVudCBzZXQgKHNjIF4gQ1RYX0FOWSkuICBIb3dldmVyLCBhbGwgY29u dGV4dHMKKyAgIGluIHRoZSBjb21wbGVtZW50IHNldCB3aWxsIGhhdmUgdGhlIHNhbWUgZm9sbG93 IHNldC4gICovCisKK3N0YXRpYyBpbnQgX0dMX0FUVFJJQlVURV9QVVJFCitzdGF0ZV9zZXBhcmF0 ZV9jb250ZXh0cyAocG9zaXRpb25fc2V0IGNvbnN0ICpzKQoreworICBpbnQgc2VwYXJhdGVfY29u dGV4dHMgPSAwOworICBzaXplX3QgajsKKworICBmb3IgKGogPSAwOyBqIDwgcy0+bmVsZW07ICsr aikKKyAgICB7CisgICAgICBpZiAoUFJFVl9ORVdMSU5FX0RFUEVOREVOVCAocy0+ZWxlbXNbal0u Y29uc3RyYWludCkpCisgICAgICAgIHNlcGFyYXRlX2NvbnRleHRzIHw9IENUWF9ORVdMSU5FOwor ICAgICAgaWYgKFBSRVZfTEVUVEVSX0RFUEVOREVOVCAocy0+ZWxlbXNbal0uY29uc3RyYWludCkp CisgICAgICAgIHNlcGFyYXRlX2NvbnRleHRzIHw9IENUWF9MRVRURVI7CisgICAgfQorCisgIHJl dHVybiBzZXBhcmF0ZV9jb250ZXh0czsKK30KKworCisvKiBQZXJmb3JtIGJvdHRvbS11cCBhbmFs eXNpcyBvbiB0aGUgcGFyc2UgdHJlZSwgY29tcHV0aW5nIHZhcmlvdXMgZnVuY3Rpb25zLgorICAg Tm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQsIHdlJ3JlIHByZXRlbmRpbmcgY29uc3RydWN0cyBsaWtl IFw8IGFyZSByZWFsCisgICBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIGNvbnN0cmFpbnRzIG9uIHdo YXQgY2FuIGZvbGxvdyB0aGVtLgorCisgICBOdWxsYWJsZTogIEEgbm9kZSBpcyBudWxsYWJsZSBp ZiBpdCBpcyBhdCB0aGUgcm9vdCBvZiBhIHJlZ2V4cCB0aGF0IGNhbgorICAgbWF0Y2ggdGhlIGVt cHR5IHN0cmluZy4KKyAgICogIEVNUFRZIGxlYXZlcyBhcmUgbnVsbGFibGUuCisgICAqIE5vIG90 aGVyIGxlYWYgaXMgbnVsbGFibGUuCisgICAqIEEgUU1BUksgb3IgU1RBUiBub2RlIGlzIG51bGxh YmxlLgorICAgKiBBIFBMVVMgbm9kZSBpcyBudWxsYWJsZSBpZiBpdHMgYXJndW1lbnQgaXMgbnVs bGFibGUuCisgICAqIEEgQ0FUIG5vZGUgaXMgbnVsbGFibGUgaWYgYm90aCBpdHMgYXJndW1lbnRz IGFyZSBudWxsYWJsZS4KKyAgICogQW4gT1Igbm9kZSBpcyBudWxsYWJsZSBpZiBlaXRoZXIgYXJn dW1lbnQgaXMgbnVsbGFibGUuCisKKyAgIEZpcnN0cG9zOiAgVGhlIGZpcnN0cG9zIG9mIGEgbm9k ZSBpcyB0aGUgc2V0IG9mIHBvc2l0aW9ucyAobm9uZW1wdHkgbGVhdmVzKQorICAgdGhhdCBjb3Vs ZCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcgbWF0Y2hpbmcg dGhlCisgICByZWdleHAgcm9vdGVkIGF0IHRoZSBnaXZlbiBub2RlLgorICAgKiBFTVBUWSBsZWF2 ZXMgaGF2ZSBlbXB0eSBmaXJzdHBvcy4KKyAgICogVGhlIGZpcnN0cG9zIG9mIGEgbm9uZW1wdHkg bGVhZiBpcyB0aGF0IGxlYWYgaXRzZWxmLgorICAgKiBUaGUgZmlyc3Rwb3Mgb2YgYSBRTUFSSywg U1RBUiwgb3IgUExVUyBub2RlIGlzIHRoZSBmaXJzdHBvcyBvZiBpdHMKKyAgICAgYXJndW1lbnQu CisgICAqIFRoZSBmaXJzdHBvcyBvZiBhIENBVCBub2RlIGlzIHRoZSBmaXJzdHBvcyBvZiB0aGUg bGVmdCBhcmd1bWVudCwgdW5pb24KKyAgICAgdGhlIGZpcnN0cG9zIG9mIHRoZSByaWdodCBpZiB0 aGUgbGVmdCBhcmd1bWVudCBpcyBudWxsYWJsZS4KKyAgICogVGhlIGZpcnN0cG9zIG9mIGFuIE9S IG5vZGUgaXMgdGhlIHVuaW9uIG9mIGZpcnN0cG9zIG9mIGVhY2ggYXJndW1lbnQuCisKKyAgIExh c3Rwb3M6ICBUaGUgbGFzdHBvcyBvZiBhIG5vZGUgaXMgdGhlIHNldCBvZiBwb3NpdGlvbnMgdGhh dCBjb3VsZAorICAgY29ycmVzcG9uZCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcg bWF0Y2hpbmcgdGhlIHJlZ2V4cCBhdAorICAgdGhlIGdpdmVuIG5vZGUuCisgICAqIEVNUFRZIGxl YXZlcyBoYXZlIGVtcHR5IGxhc3Rwb3MuCisgICAqIFRoZSBsYXN0cG9zIG9mIGEgbm9uZW1wdHkg bGVhZiBpcyB0aGF0IGxlYWYgaXRzZWxmLgorICAgKiBUaGUgbGFzdHBvcyBvZiBhIFFNQVJLLCBT VEFSLCBvciBQTFVTIG5vZGUgaXMgdGhlIGxhc3Rwb3Mgb2YgaXRzCisgICAgIGFyZ3VtZW50Lgor ICAgKiBUaGUgbGFzdHBvcyBvZiBhIENBVCBub2RlIGlzIHRoZSBsYXN0cG9zIG9mIGl0cyByaWdo dCBhcmd1bWVudCwgdW5pb24KKyAgICAgdGhlIGxhc3Rwb3Mgb2YgdGhlIGxlZnQgaWYgdGhlIHJp Z2h0IGFyZ3VtZW50IGlzIG51bGxhYmxlLgorICAgKiBUaGUgbGFzdHBvcyBvZiBhbiBPUiBub2Rl IGlzIHRoZSB1bmlvbiBvZiB0aGUgbGFzdHBvcyBvZiBlYWNoIGFyZ3VtZW50LgorCisgICBGb2xs b3c6ICBUaGUgZm9sbG93IG9mIGEgcG9zaXRpb24gaXMgdGhlIHNldCBvZiBwb3NpdGlvbnMgdGhh dCBjb3VsZAorICAgY29ycmVzcG9uZCB0byB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyBhIGNoYXJh Y3RlciBtYXRjaGluZyB0aGUgbm9kZSBpbgorICAgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIHJlZ2V4 cC4gIEF0IHRoaXMgcG9pbnQgd2UgY29uc2lkZXIgc3BlY2lhbCBzeW1ib2xzCisgICB0aGF0IG1h dGNoIHRoZSBlbXB0eSBzdHJpbmcgaW4gc29tZSBjb250ZXh0IHRvIGJlIGp1c3Qgbm9ybWFsIGNo YXJhY3RlcnMuCisgICBMYXRlciwgaWYgd2UgZmluZCB0aGF0IGEgc3BlY2lhbCBzeW1ib2wgaXMg aW4gYSBmb2xsb3cgc2V0LCB3ZSB3aWxsCisgICByZXBsYWNlIGl0IHdpdGggdGhlIGVsZW1lbnRz IG9mIGl0cyBmb2xsb3csIGxhYmVsZWQgd2l0aCBhbiBhcHByb3ByaWF0ZQorICAgY29uc3RyYWlu dC4KKyAgICogRXZlcnkgbm9kZSBpbiB0aGUgZmlyc3Rwb3Mgb2YgdGhlIGFyZ3VtZW50IG9mIGEg U1RBUiBvciBQTFVTIG5vZGUgaXMgaW4KKyAgICAgdGhlIGZvbGxvdyBvZiBldmVyeSBub2RlIGlu IHRoZSBsYXN0cG9zLgorICAgKiBFdmVyeSBub2RlIGluIHRoZSBmaXJzdHBvcyBvZiB0aGUgc2Vj b25kIGFyZ3VtZW50IG9mIGEgQ0FUIG5vZGUgaXMgaW4KKyAgICAgdGhlIGZvbGxvdyBvZiBldmVy eSBub2RlIGluIHRoZSBsYXN0cG9zIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKworICAgQmVjYXVz ZSBvZiB0aGUgcG9zdGZpeCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyc2UgdHJlZSwgdGhlIGRl cHRoLWZpcnN0CisgICBhbmFseXNpcyBpcyBjb252ZW5pZW50bHkgZG9uZSBieSBhIGxpbmVhciBz Y2FuIHdpdGggdGhlIGFpZCBvZiBhIHN0YWNrLgorICAgU2V0cyBhcmUgc3RvcmVkIGFzIGFycmF5 cyBvZiB0aGUgZWxlbWVudHMsIG9iZXlpbmcgYSBzdGFjay1saWtlIGFsbG9jYXRpb24KKyAgIHNj aGVtZTsgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBlYWNoIHNldCBkZWVwZXIgaW4gdGhlIHN0 YWNrIGNhbiBiZQorICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgYSBwYXJ0aWN1 bGFyIHNldCdzIGFycmF5LiAgKi8KK3N0YXRpYyB2b2lkCitkZmFhbmFseXplIChzdHJ1Y3QgZGZh ICpkLCBib29sIHNlYXJjaGZsYWcpCit7CisgIC8qIEFycmF5IGFsbG9jYXRlZCB0byBob2xkIHBv c2l0aW9uIHNldHMuICAqLworICBwb3NpdGlvbiAqcG9zYWxsb2MgPSB4bm1hbGxvYyAoZC0+bmxl YXZlcywgMiAqIHNpemVvZiAqcG9zYWxsb2MpOworICAvKiBGaXJzdHBvcyBhbmQgbGFzdHBvcyBl bGVtZW50cy4gICovCisgIHBvc2l0aW9uICpmaXJzdHBvcyA9IHBvc2FsbG9jICsgZC0+bmxlYXZl czsKKyAgcG9zaXRpb24gKmxhc3Rwb3MgPSBmaXJzdHBvcyArIGQtPm5sZWF2ZXM7CisKKyAgLyog U3RhY2sgZm9yIGVsZW1lbnQgY291bnRzIGFuZCBudWxsYWJsZSBmbGFncy4gICovCisgIHN0cnVj dAorICB7CisgICAgLyogV2hldGhlciB0aGUgZW50cnkgaXMgbnVsbGFibGUuICAqLworICAgIGJv b2wgbnVsbGFibGU7CisKKyAgICAvKiBDb3VudHMgb2YgZmlyc3Rwb3MgYW5kIGxhc3Rwb3Mgc2V0 cy4gICovCisgICAgc2l6ZV90IG5maXJzdHBvczsKKyAgICBzaXplX3Qgbmxhc3Rwb3M7CisgIH0g KnN0a2FsbG9jID0geG5tYWxsb2MgKGQtPmRlcHRoLCBzaXplb2YgKnN0a2FsbG9jKSwgKnN0ayA9 IHN0a2FsbG9jOworCisgIHBvc2l0aW9uX3NldCB0bXA7ICAgICAgICAgICAgIC8qIFRlbXBvcmFy eSBzZXQgZm9yIG1lcmdpbmcgc2V0cy4gICovCisgIHBvc2l0aW9uX3NldCBtZXJnZWQ7ICAgICAg ICAgIC8qIFJlc3VsdCBvZiBtZXJnaW5nIHNldHMuICAqLworICBpbnQgc2VwYXJhdGVfY29udGV4 dHM7ICAgICAgICAvKiBDb250ZXh0IHdhbnRlZCBieSBzb21lIHBvc2l0aW9uLiAgKi8KKyAgc2l6 ZV90IGksIGo7CisgIHBvc2l0aW9uICpwb3M7CisgIGNoYXIgKnZpc2l0ZWQgPSB4bm1hbGxvYyAo ZC0+dGluZGV4LCBzaXplb2YgKnZpc2l0ZWQpOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAo c3RkZXJyLCAiZGZhYW5hbHl6ZTpcbiIpOworICBmb3IgKGkgPSAwOyBpIDwgZC0+dGluZGV4OyAr K2kpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBpKTsKKyAgICAgIHBy dG9rIChkLT50b2tlbnNbaV0pOworICAgIH0KKyAgcHV0YyAoJ1xuJywgc3RkZXJyKTsKKyNlbmRp ZgorCisgIGQtPnNlYXJjaGZsYWcgPSBzZWFyY2hmbGFnOworICBhbGxvY19wb3NpdGlvbl9zZXQg KCZtZXJnZWQsIGQtPm5sZWF2ZXMpOworICBkLT5mb2xsb3dzID0geGNhbGxvYyAoZC0+dGluZGV4 LCBzaXplb2YgKmQtPmZvbGxvd3MpOworCisgIGZvciAoaSA9IDA7IGkgPCBkLT50aW5kZXg7ICsr aSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGQtPnRva2Vuc1tpXSkKKyAgICAgICAgeworICAgICAg ICBjYXNlIEVNUFRZOgorICAgICAgICAgIC8qIFRoZSBlbXB0eSBzZXQgaXMgbnVsbGFibGUuICAq LworICAgICAgICAgIHN0ay0+bnVsbGFibGUgPSB0cnVlOworCisgICAgICAgICAgLyogVGhlIGZp cnN0cG9zIGFuZCBsYXN0cG9zIG9mIHRoZSBlbXB0eSBsZWFmIGFyZSBib3RoIGVtcHR5LiAgKi8K KyAgICAgICAgICBzdGstPm5maXJzdHBvcyA9IHN0ay0+bmxhc3Rwb3MgPSAwOworICAgICAgICAg IHN0aysrOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAg Y2FzZSBQTFVTOgorICAgICAgICAgIC8qIEV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGZpcnN0cG9zIG9m IHRoZSBhcmd1bWVudCBpcyBpbiB0aGUgZm9sbG93CisgICAgICAgICAgICAgb2YgZXZlcnkgZWxl bWVudCBpbiB0aGUgbGFzdHBvcy4gICovCisgICAgICAgICAgdG1wLm5lbGVtID0gc3RrWy0xXS5u Zmlyc3Rwb3M7CisgICAgICAgICAgdG1wLmVsZW1zID0gZmlyc3Rwb3M7CisgICAgICAgICAgcG9z ID0gbGFzdHBvczsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3RrWy0xXS5ubGFzdHBvczsg KytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtZXJnZSAoJnRtcCwgJmQtPmZvbGxv d3NbcG9zW2pdLmluZGV4XSwgJm1lcmdlZCk7CisgICAgICAgICAgICAgIGNvcHkgKCZtZXJnZWQs ICZkLT5mb2xsb3dzW3Bvc1tqXS5pbmRleF0pOworICAgICAgICAgICAgfQorICAgICAgICAgIC8q IGZhbGx0aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBRTUFSSzoKKyAgICAgICAgICAvKiBBIFFN QVJLIG9yIFNUQVIgbm9kZSBpcyBhdXRvbWF0aWNhbGx5IG51bGxhYmxlLiAgKi8KKyAgICAgICAg ICBpZiAoZC0+dG9rZW5zW2ldICE9IFBMVVMpCisgICAgICAgICAgICBzdGtbLTFdLm51bGxhYmxl ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENBVDoKKyAgICAgICAg ICAvKiBFdmVyeSBlbGVtZW50IGluIHRoZSBmaXJzdHBvcyBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50 IGlzIGluIHRoZQorICAgICAgICAgICAgIGZvbGxvdyBvZiBldmVyeSBlbGVtZW50IGluIHRoZSBs YXN0cG9zIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4gICovCisgICAgICAgICAgdG1wLm5lbGVtID0g c3RrWy0xXS5uZmlyc3Rwb3M7CisgICAgICAgICAgdG1wLmVsZW1zID0gZmlyc3Rwb3M7CisgICAg ICAgICAgcG9zID0gbGFzdHBvcyArIHN0a1stMV0ubmxhc3Rwb3M7CisgICAgICAgICAgZm9yIChq ID0gMDsgaiA8IHN0a1stMl0ubmxhc3Rwb3M7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgbWVyZ2UgKCZ0bXAsICZkLT5mb2xsb3dzW3Bvc1tqXS5pbmRleF0sICZtZXJnZWQpOwor ICAgICAgICAgICAgICBjb3B5ICgmbWVyZ2VkLCAmZC0+Zm9sbG93c1twb3Nbal0uaW5kZXhdKTsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBmaXJzdHBvcyBvZiBhIENBVCBub2Rl IGlzIHRoZSBmaXJzdHBvcyBvZiB0aGUgZmlyc3QgYXJndW1lbnQsCisgICAgICAgICAgICAgdW5p b24gdGhhdCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIHRoZSBmaXJzdCBpcyBudWxsYWJsZS4g ICovCisgICAgICAgICAgaWYgKHN0a1stMl0ubnVsbGFibGUpCisgICAgICAgICAgICBzdGtbLTJd Lm5maXJzdHBvcyArPSBzdGtbLTFdLm5maXJzdHBvczsKKyAgICAgICAgICBlbHNlCisgICAgICAg ICAgICBmaXJzdHBvcyArPSBzdGtbLTFdLm5maXJzdHBvczsKKworICAgICAgICAgIC8qIFRoZSBs YXN0cG9zIG9mIGEgQ0FUIG5vZGUgaXMgdGhlIGxhc3Rwb3Mgb2YgdGhlIHNlY29uZCBhcmd1bWVu dCwKKyAgICAgICAgICAgICB1bmlvbiB0aGF0IG9mIHRoZSBmaXJzdCBhcmd1bWVudCBpZiB0aGUg c2Vjb25kIGlzIG51bGxhYmxlLiAgKi8KKyAgICAgICAgICBpZiAoc3RrWy0xXS5udWxsYWJsZSkK KyAgICAgICAgICAgIHN0a1stMl0ubmxhc3Rwb3MgKz0gc3RrWy0xXS5ubGFzdHBvczsKKyAgICAg ICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBvcyA9IGxhc3Rwb3MgKyBz dGtbLTJdLm5sYXN0cG9zOworICAgICAgICAgICAgICBmb3IgKGogPSBzdGtbLTFdLm5sYXN0cG9z OyBqLS0gPiAwOykKKyAgICAgICAgICAgICAgICBwb3Nbal0gPSBsYXN0cG9zW2pdOworICAgICAg ICAgICAgICBsYXN0cG9zICs9IHN0a1stMl0ubmxhc3Rwb3M7CisgICAgICAgICAgICAgIHN0a1st Ml0ubmxhc3Rwb3MgPSBzdGtbLTFdLm5sYXN0cG9zOworICAgICAgICAgICAgfQorCisgICAgICAg ICAgLyogQSBDQVQgbm9kZSBpcyBudWxsYWJsZSBpZiBib3RoIGFyZ3VtZW50cyBhcmUgbnVsbGFi bGUuICAqLworICAgICAgICAgIHN0a1stMl0ubnVsbGFibGUgJj0gc3RrWy0xXS5udWxsYWJsZTsK KyAgICAgICAgICBzdGstLTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9SOgor ICAgICAgICAgIC8qIFRoZSBmaXJzdHBvcyBpcyB0aGUgdW5pb24gb2YgdGhlIGZpcnN0cG9zIG9m IGVhY2ggYXJndW1lbnQuICAqLworICAgICAgICAgIHN0a1stMl0ubmZpcnN0cG9zICs9IHN0a1st MV0ubmZpcnN0cG9zOworCisgICAgICAgICAgLyogVGhlIGxhc3Rwb3MgaXMgdGhlIHVuaW9uIG9m IHRoZSBsYXN0cG9zIG9mIGVhY2ggYXJndW1lbnQuICAqLworICAgICAgICAgIHN0a1stMl0ubmxh c3Rwb3MgKz0gc3RrWy0xXS5ubGFzdHBvczsKKworICAgICAgICAgIC8qIEFuIE9SIG5vZGUgaXMg bnVsbGFibGUgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIG51bGxhYmxlLiAgKi8KKyAgICAgICAgICBz dGtbLTJdLm51bGxhYmxlIHw9IHN0a1stMV0ubnVsbGFibGU7CisgICAgICAgICAgc3RrLS07Cisg ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvKiBBbnl0aGlu ZyBlbHNlIGlzIGEgbm9uZW1wdHkgcG9zaXRpb24uICAoTm90ZSB0aGF0IHNwZWNpYWwKKyAgICAg ICAgICAgICBjb25zdHJ1Y3RzIGxpa2UgXDwgYXJlIHRyZWF0ZWQgYXMgbm9uZW1wdHkgc3RyaW5n cyBoZXJlOworICAgICAgICAgICAgIGFuICJlcHNpbG9uIGNsb3N1cmUiIGVmZmVjdGl2ZWx5IG1h a2VzIHRoZW0gbnVsbGFibGUgbGF0ZXIuCisgICAgICAgICAgICAgQmFja3JlZmVyZW5jZXMgaGF2 ZSB0byBnZXQgYSByZWFsIHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3QKKyAgICAgICAgICAgICB0 cmFuc2l0aW9ucyBvbiB0aGVtIGxhdGVyLiAgQnV0IHRoZXkgYXJlIG51bGxhYmxlLiAgKi8KKyAg ICAgICAgICBzdGstPm51bGxhYmxlID0gZC0+dG9rZW5zW2ldID09IEJBQ0tSRUY7CisKKyAgICAg ICAgICAvKiBUaGlzIHBvc2l0aW9uIGlzIGluIGl0cyBvd24gZmlyc3Rwb3MgYW5kIGxhc3Rwb3Mu ICAqLworICAgICAgICAgIHN0ay0+bmZpcnN0cG9zID0gc3RrLT5ubGFzdHBvcyA9IDE7CisgICAg ICAgICAgc3RrKys7CisKKyAgICAgICAgICAtLWZpcnN0cG9zLCAtLWxhc3Rwb3M7CisgICAgICAg ICAgZmlyc3Rwb3MtPmluZGV4ID0gbGFzdHBvcy0+aW5kZXggPSBpOworICAgICAgICAgIGZpcnN0 cG9zLT5jb25zdHJhaW50ID0gbGFzdHBvcy0+Y29uc3RyYWludCA9IE5PX0NPTlNUUkFJTlQ7CisK KyAgICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgZm9sbG93IHNldCBmb3IgdGhpcyBwb3NpdGlvbi4g ICovCisgICAgICAgICAgYWxsb2NfcG9zaXRpb25fc2V0ICgmZC0+Zm9sbG93c1tpXSwgMSk7Cisg ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgLyogLi4uIGJh bGFuY2UgdGhlIGFib3ZlIG5vbnN5bnRhY3RpYyAjaWZkZWYgZ29vLi4uICAqLworICAgICAgZnBy aW50ZiAoc3RkZXJyLCAibm9kZSAlenU6IiwgaSk7CisgICAgICBwcnRvayAoZC0+dG9rZW5zW2ld KTsKKyAgICAgIHB1dGMgKCdcbicsIHN0ZGVycik7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisg ICAgICAgICAgICAgICBzdGtbLTFdLm51bGxhYmxlID8gIiBudWxsYWJsZTogeWVzXG4iIDogIiBu dWxsYWJsZTogbm9cbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGZpcnN0cG9zOiIpOwor ICAgICAgZm9yIChqID0gc3RrWy0xXS5uZmlyc3Rwb3M7IGotLSA+IDA7KQorICAgICAgICB7Cisg ICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBmaXJzdHBvc1tqXS5pbmRleCk7Cisg ICAgICAgICAgcHJ0b2sgKGQtPnRva2Vuc1tmaXJzdHBvc1tqXS5pbmRleF0pOworICAgICAgICB9 CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiBsYXN0cG9zOiIpOworICAgICAgZm9yIChqID0g c3RrWy0xXS5ubGFzdHBvczsgai0tID4gMDspCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRm IChzdGRlcnIsICIgJXp1OiIsIGxhc3Rwb3Nbal0uaW5kZXgpOworICAgICAgICAgIHBydG9rIChk LT50b2tlbnNbbGFzdHBvc1tqXS5pbmRleF0pOworICAgICAgICB9CisgICAgICBwdXRjICgnXG4n LCBzdGRlcnIpOworI2VuZGlmCisgICAgfQorCisgIC8qIEZvciBlYWNoIGZvbGxvdyBzZXQgdGhh dCBpcyB0aGUgZm9sbG93IHNldCBvZiBhIHJlYWwgcG9zaXRpb24sIHJlcGxhY2UKKyAgICAgaXQg d2l0aCBpdHMgZXBzaWxvbiBjbG9zdXJlLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGQtPnRpbmRl eDsgKytpKQorICAgIGlmIChkLT50b2tlbnNbaV0gPCBOT1RDSEFSIHx8IGQtPnRva2Vuc1tpXSA9 PSBCQUNLUkVGCisgICAgICAgIHx8IGQtPnRva2Vuc1tpXSA9PSBBTllDSEFSIHx8IGQtPnRva2Vu c1tpXSA9PSBNQkNTRVQKKyAgICAgICAgfHwgZC0+dG9rZW5zW2ldID49IENTRVQpCisgICAgICB7 CisjaWZkZWYgREVCVUcKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9sbG93cyglenU6Iiwg aSk7CisgICAgICAgIHBydG9rIChkLT50b2tlbnNbaV0pOworICAgICAgICBmcHJpbnRmIChzdGRl cnIsICIpOiIpOworICAgICAgICBmb3IgKGogPSBkLT5mb2xsb3dzW2ldLm5lbGVtOyBqLS0gPiAw OykKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgJXp1OiIsIGQt PmZvbGxvd3NbaV0uZWxlbXNbal0uaW5kZXgpOworICAgICAgICAgICAgcHJ0b2sgKGQtPnRva2Vu c1tkLT5mb2xsb3dzW2ldLmVsZW1zW2pdLmluZGV4XSk7CisgICAgICAgICAgfQorICAgICAgICBw dXRjICgnXG4nLCBzdGRlcnIpOworI2VuZGlmCisgICAgICAgIGNvcHkgKCZkLT5mb2xsb3dzW2ld LCAmbWVyZ2VkKTsKKyAgICAgICAgZXBzY2xvc3VyZSAoJm1lcmdlZCwgZCwgdmlzaXRlZCk7Cisg ICAgICAgIGNvcHkgKCZtZXJnZWQsICZkLT5mb2xsb3dzW2ldKTsKKyAgICAgIH0KKworICAvKiBH ZXQgdGhlIGVwc2lsb24gY2xvc3VyZSBvZiB0aGUgZmlyc3Rwb3Mgb2YgdGhlIHJlZ2V4cC4gIFRo ZSByZXN1bHQgd2lsbAorICAgICBiZSB0aGUgc2V0IG9mIHBvc2l0aW9ucyBvZiBzdGF0ZSAwLiAg Ki8KKyAgbWVyZ2VkLm5lbGVtID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHN0a1stMV0ubmZpcnN0 cG9zOyArK2kpCisgICAgaW5zZXJ0IChmaXJzdHBvc1tpXSwgJm1lcmdlZCk7CisgIGVwc2Nsb3N1 cmUgKCZtZXJnZWQsIGQsIHZpc2l0ZWQpOworCisgIC8qIEJ1aWxkIHRoZSBpbml0aWFsIHN0YXRl LiAgKi8KKyAgc2VwYXJhdGVfY29udGV4dHMgPSBzdGF0ZV9zZXBhcmF0ZV9jb250ZXh0cyAoJm1l cmdlZCk7CisgIGlmIChzZXBhcmF0ZV9jb250ZXh0cyAmIENUWF9ORVdMSU5FKQorICAgIHN0YXRl X2luZGV4IChkLCAmbWVyZ2VkLCBDVFhfTkVXTElORSk7CisgIGQtPmluaXRzdGF0ZV9ub3Rib2wg PSBkLT5taW5fdHJjb3VudAorICAgID0gc3RhdGVfaW5kZXggKGQsICZtZXJnZWQsIHNlcGFyYXRl X2NvbnRleHRzIF4gQ1RYX0FOWSk7CisgIGlmIChzZXBhcmF0ZV9jb250ZXh0cyAmIENUWF9MRVRU RVIpCisgICAgZC0+bWluX3RyY291bnQgPSBzdGF0ZV9pbmRleCAoZCwgJm1lcmdlZCwgQ1RYX0xF VFRFUik7CisgIGQtPm1pbl90cmNvdW50Kys7CisKKyAgZnJlZSAocG9zYWxsb2MpOworICBmcmVl IChzdGthbGxvYyk7CisgIGZyZWUgKG1lcmdlZC5lbGVtcyk7CisgIGZyZWUgKHZpc2l0ZWQpOwor fQorCisKKy8qIEZpbmQsIGZvciBlYWNoIGNoYXJhY3RlciwgdGhlIHRyYW5zaXRpb24gb3V0IG9m IHN0YXRlIHMgb2YgZCwgYW5kIHN0b3JlCisgICBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgc2xvdCBv ZiB0cmFucy4KKworICAgV2UgZGl2aWRlIHRoZSBwb3NpdGlvbnMgb2YgcyBpbnRvIGdyb3VwcyAo cG9zaXRpb25zIGNhbiBhcHBlYXIgaW4gbW9yZQorICAgdGhhbiBvbmUgZ3JvdXApLiAgRWFjaCBn cm91cCBpcyBsYWJlbGVkIHdpdGggYSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0CisgICBldmVyeSBw b3NpdGlvbiBpbiB0aGUgZ3JvdXAgbWF0Y2hlcyAodGFraW5nIGludG8gYWNjb3VudCwgaWYgbmVj ZXNzYXJ5LAorICAgcHJlY2VkaW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb2YgcykuICBGb3IgZWFj aCBncm91cCwgZmluZCB0aGUgdW5pb24KKyAgIG9mIHRoZSBpdHMgZWxlbWVudHMnIGZvbGxvd3Mu ICBUaGlzIHNldCBpcyB0aGUgc2V0IG9mIHBvc2l0aW9ucyBvZiB0aGUKKyAgIG5ldyBzdGF0ZS4g IEZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgZ3JvdXAncyBsYWJlbCwgc2V0IHRoZSB0cmFuc2l0 aW9uCisgICBvbiB0aGlzIGNoYXJhY3RlciB0byBiZSB0byBhIHN0YXRlIGNvcnJlc3BvbmRpbmcg dG8gdGhlIHNldCdzIHBvc2l0aW9ucywKKyAgIGFuZCBpdHMgYXNzb2NpYXRlZCBiYWNrd2FyZCBj b250ZXh0IGluZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuCisKKyAgIElmIHdlIGFyZSBidWlsZGlu ZyBhIHNlYXJjaGluZyBtYXRjaGVyLCB3ZSBpbmNsdWRlIHRoZSBwb3NpdGlvbnMgb2Ygc3RhdGUK KyAgIDAgaW4gZXZlcnkgc3RhdGUuCisKKyAgIFRoZSBjb2xsZWN0aW9uIG9mIGdyb3VwcyBpcyBj b25zdHJ1Y3RlZCBieSBidWlsZGluZyBhbiBlcXVpdmFsZW5jZS1jbGFzcworICAgcGFydGl0aW9u IG9mIHRoZSBwb3NpdGlvbnMgb2Ygcy4KKworICAgRm9yIGVhY2ggcG9zaXRpb24sIGZpbmQgdGhl IHNldCBvZiBjaGFyYWN0ZXJzIEMgdGhhdCBpdCBtYXRjaGVzLiAgRWxpbWluYXRlCisgICBhbnkg Y2hhcmFjdGVycyBmcm9tIEMgdGhhdCBmYWlsIG9uIGdyb3VuZHMgb2YgYmFja3dhcmQgY29udGV4 dC4KKworICAgU2VhcmNoIHRocm91Z2ggdGhlIGdyb3VwcywgbG9va2luZyBmb3IgYSBncm91cCB3 aG9zZSBsYWJlbCBMIGhhcyBub25lbXB0eQorICAgaW50ZXJzZWN0aW9uIHdpdGggQy4gIElmIEwg LSBDIGlzIG5vbmVtcHR5LCBjcmVhdGUgYSBuZXcgZ3JvdXAgbGFiZWxlZAorICAgTCAtIEMgYW5k IGhhdmluZyB0aGUgc2FtZSBwb3NpdGlvbnMgYXMgdGhlIGN1cnJlbnQgZ3JvdXAsIGFuZCBzZXQg TCB0bworICAgdGhlIGludGVyc2VjdGlvbiBvZiBMIGFuZCBDLiAgSW5zZXJ0IHRoZSBwb3NpdGlv biBpbiB0aGlzIGdyb3VwLCBzZXQKKyAgIEMgPSBDIC0gTCwgYW5kIHJlc3VtZSBzY2FubmluZy4K KworICAgSWYgYWZ0ZXIgY29tcGFyaW5nIHdpdGggZXZlcnkgZ3JvdXAgdGhlcmUgYXJlIGNoYXJh Y3RlcnMgcmVtYWluaW5nIGluIEMsCisgICBjcmVhdGUgYSBuZXcgZ3JvdXAgbGFiZWxlZCB3aXRo IHRoZSBjaGFyYWN0ZXJzIG9mIEMgYW5kIGluc2VydCB0aGlzCisgICBwb3NpdGlvbiBpbiB0aGF0 IGdyb3VwLiAgKi8KK3N0YXRpYyB2b2lkCitkZmFzdGF0ZSAoc3RhdGVfbnVtIHMsIHN0cnVjdCBk ZmEgKmQsIHN0YXRlX251bSB0cmFuc1tdKQoreworICBsZWFmX3NldCBncnBzW05PVENIQVJdOyAg ICAgICAvKiBBcyBtYW55IGFzIHdpbGwgZXZlciBiZSBuZWVkZWQuICAqLworICBjaGFyY2xhc3Mg bGFiZWxzW05PVENIQVJdOyAgICAvKiBMYWJlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JvdXBz LiAgKi8KKyAgc2l6ZV90IG5ncnBzID0gMDsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGdyb3Vw cyBhY3R1YWxseSB1c2VkLiAgKi8KKyAgcG9zaXRpb24gcG9zOyAgICAgICAgICAgICAgICAgLyog Q3VycmVudCBwb3NpdGlvbiBiZWluZyBjb25zaWRlcmVkLiAgKi8KKyAgY2hhcmNsYXNzIG1hdGNo ZXM7ICAgICAgICAgICAgLyogU2V0IG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuICAqLworICBjaGFy Y2xhc3Nfd29yZCBtYXRjaGVzZjsJLyogTm9uemVybyBpZiBtYXRjaGVzIGlzIG5vbmVtcHR5LiAg Ki8KKyAgY2hhcmNsYXNzIGludGVyc2VjdDsgICAgICAgICAgLyogSW50ZXJzZWN0aW9uIHdpdGgg c29tZSBsYWJlbCBzZXQuICAqLworICBjaGFyY2xhc3Nfd29yZCBpbnRlcnNlY3RmOwkvKiBOb256 ZXJvIGlmIGludGVyc2VjdCBpcyBub25lbXB0eS4gICovCisgIGNoYXJjbGFzcyBsZWZ0b3ZlcnM7 ICAgICAgICAgIC8qIFN0dWZmIGluIHRoZSBsYWJlbCB0aGF0IGRpZG4ndCBtYXRjaC4gICovCisg IGNoYXJjbGFzc193b3JkIGxlZnRvdmVyc2Y7CS8qIE5vbnplcm8gaWYgbGVmdG92ZXJzIGlzIG5v bmVtcHR5LiAgKi8KKyAgcG9zaXRpb25fc2V0IGZvbGxvd3M7ICAgICAgICAgLyogVW5pb24gb2Yg dGhlIGZvbGxvd3Mgb2Ygc29tZSBncm91cC4gICovCisgIHBvc2l0aW9uX3NldCB0bXA7ICAgICAg ICAgICAgIC8qIFRlbXBvcmFyeSBzcGFjZSBmb3IgbWVyZ2luZyBzZXRzLiAgKi8KKyAgaW50IHBv c3NpYmxlX2NvbnRleHRzOyAgICAgICAgLyogQ29udGV4dHMgdGhhdCB0aGlzIGdyb3VwIGNhbiBt YXRjaC4gICovCisgIGludCBzZXBhcmF0ZV9jb250ZXh0czsgICAgICAgIC8qIENvbnRleHQgdGhh dCBuZXcgc3RhdGUgd2FudHMgdG8ga25vdy4gICovCisgIHN0YXRlX251bSBzdGF0ZTsgICAgICAg ICAgICAgIC8qIE5ldyBzdGF0ZS4gICovCisgIHN0YXRlX251bSBzdGF0ZV9uZXdsaW5lOyAgICAg IC8qIE5ldyBzdGF0ZSBvbiBhIG5ld2xpbmUgdHJhbnNpdGlvbi4gICovCisgIHN0YXRlX251bSBz dGF0ZV9sZXR0ZXI7ICAgICAgIC8qIE5ldyBzdGF0ZSBvbiBhIGxldHRlciB0cmFuc2l0aW9uLiAg Ki8KKyAgYm9vbCBuZXh0X2lzbnRfMXN0X2J5dGUgPSBmYWxzZTsgLyogV2UgY2FuJ3QgYWRkIHN0 YXRlMC4gICovCisgIHNpemVfdCBpLCBqLCBrOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAo c3RkZXJyLCAiYnVpbGQgc3RhdGUgJXRkXG4iLCBzKTsKKyNlbmRpZgorCisgIHplcm9zZXQgKG1h dGNoZXMpOworCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zdGF0ZXNbc10uZWxlbXMubmVsZW07ICsr aSkKKyAgICB7CisgICAgICBwb3MgPSBkLT5zdGF0ZXNbc10uZWxlbXMuZWxlbXNbaV07CisgICAg ICBpZiAoZC0+dG9rZW5zW3Bvcy5pbmRleF0gPj0gMCAmJiBkLT50b2tlbnNbcG9zLmluZGV4XSA8 IE5PVENIQVIpCisgICAgICAgIHNldGJpdCAoZC0+dG9rZW5zW3Bvcy5pbmRleF0sIG1hdGNoZXMp OworICAgICAgZWxzZSBpZiAoZC0+dG9rZW5zW3Bvcy5pbmRleF0gPj0gQ1NFVCkKKyAgICAgICAg Y29weXNldCAoZC0+Y2hhcmNsYXNzZXNbZC0+dG9rZW5zW3Bvcy5pbmRleF0gLSBDU0VUXSwgbWF0 Y2hlcyk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZC0+dG9rZW5zW3Bv cy5pbmRleF0gPT0gTUJDU0VUCisgICAgICAgICAgICAgIHx8IGQtPnRva2Vuc1twb3MuaW5kZXhd ID09IEFOWUNIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEFOWUNIQVIgYW5k IE1CQ1NFVCBtdXN0IG1hdGNoIHdpdGggYSBzaW5nbGUgY2hhcmFjdGVyLCBzbyB3ZQorICAgICAg ICAgICAgICAgICBtdXN0IHB1dCBpdCB0byBkLT5zdGF0ZXNbc10ubWJwcywgd2hpY2ggY29udGFp bnMgdGhlIHBvc2l0aW9ucworICAgICAgICAgICAgICAgICB3aGljaCBjYW4gbWF0Y2ggd2l0aCBh IHNpbmdsZSBjaGFyYWN0ZXIgbm90IGEgYnl0ZS4gICovCisgICAgICAgICAgICAgIGlmIChkLT5z dGF0ZXNbc10ubWJwcy5uZWxlbSA9PSAwKQorICAgICAgICAgICAgICAgIGFsbG9jX3Bvc2l0aW9u X3NldCAoJmQtPnN0YXRlc1tzXS5tYnBzLCAxKTsKKyAgICAgICAgICAgICAgaW5zZXJ0IChwb3Ms ICYoZC0+c3RhdGVzW3NdLm1icHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51 ZTsKKyAgICAgICAgfQorCisgICAgICAvKiBTb21lIGNoYXJhY3RlcnMgbWF5IG5lZWQgdG8gYmUg ZWxpbWluYXRlZCBmcm9tIG1hdGNoZXMgYmVjYXVzZQorICAgICAgICAgdGhleSBmYWlsIGluIHRo ZSBjdXJyZW50IGNvbnRleHQuICAqLworICAgICAgaWYgKHBvcy5jb25zdHJhaW50ICE9IE5PX0NP TlNUUkFJTlQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIVNVQ0NFRURTX0lOX0NPTlRFWFQg KHBvcy5jb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ c3RhdGVzW3NdLmNvbnRleHQsIENUWF9ORVdMSU5FKSkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7 IGogPCBDSEFSQ0xBU1NfV09SRFM7ICsraikKKyAgICAgICAgICAgICAgbWF0Y2hlc1tqXSAmPSB+ bmV3bGluZVtqXTsKKyAgICAgICAgICBpZiAoIVNVQ0NFRURTX0lOX0NPTlRFWFQgKHBvcy5jb25z dHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c3RhdGVzW3Nd LmNvbnRleHQsIENUWF9MRVRURVIpKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENIQVJD TEFTU19XT1JEUzsgKytqKQorICAgICAgICAgICAgICBtYXRjaGVzW2pdICY9IH5sZXR0ZXJzW2pd OworICAgICAgICAgIGlmICghU1VDQ0VFRFNfSU5fQ09OVEVYVCAocG9zLmNvbnN0cmFpbnQsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5zdGF0ZXNbc10uY29udGV4dCwg Q1RYX05PTkUpKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENIQVJDTEFTU19XT1JEUzsg KytqKQorICAgICAgICAgICAgICBtYXRjaGVzW2pdICY9IGxldHRlcnNbal0gfCBuZXdsaW5lW2pd OworCisgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgbGVmdCwgdGhlcmUn cyBubyBwb2ludCBpbiBnb2luZyBvbi4gICovCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENI QVJDTEFTU19XT1JEUyAmJiAhbWF0Y2hlc1tqXTsgKytqKQorICAgICAgICAgICAgY29udGludWU7 CisgICAgICAgICAgaWYgKGogPT0gQ0hBUkNMQVNTX1dPUkRTKQorICAgICAgICAgICAgY29udGlu dWU7CisgICAgICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIg bmV4dHBvcyAlenU6IiwgcG9zLmluZGV4KTsKKyAgICAgIHBydG9rIChkLT50b2tlbnNbcG9zLmlu ZGV4XSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgb2YiKTsKKyAgICAgIGZvciAoaiA9IDA7 IGogPCBOT1RDSEFSOyBqKyspCisgICAgICAgIGlmICh0c3RiaXQgKGosIG1hdGNoZXMpKQorICAg ICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAweCUwMnp4Iiwgaik7CisgICAgICBmcHJpbnRmIChz dGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuZ3JwczsgKytq KQorICAgICAgICB7CisgICAgICAgICAgLyogSWYgbWF0Y2hlcyBjb250YWlucyBhIHNpbmdsZSBj aGFyYWN0ZXIgb25seSwgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgZ3JvdXAncyBsYWJl bCBkb2Vzbid0IGNvbnRhaW4gdGhhdCBjaGFyYWN0ZXIsIGdvIG9uIHRvIHRoZQorICAgICAgICAg ICAgIG5leHQgZ3JvdXAuICAqLworICAgICAgICAgIGlmIChkLT50b2tlbnNbcG9zLmluZGV4XSA+ PSAwICYmIGQtPnRva2Vuc1twb3MuaW5kZXhdIDwgTk9UQ0hBUgorICAgICAgICAgICAgICAmJiAh dHN0Yml0IChkLT50b2tlbnNbcG9zLmluZGV4XSwgbGFiZWxzW2pdKSkKKyAgICAgICAgICAgIGNv bnRpbnVlOworCisgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBncm91cCdzIGxhYmVsIGhhcyBh IG5vbmVtcHR5IGludGVyc2VjdGlvbiB3aXRoCisgICAgICAgICAgICAgbWF0Y2hlcy4gICovCisg ICAgICAgICAgaW50ZXJzZWN0ZiA9IDA7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IENIQVJD TEFTU19XT1JEUzsgKytrKQorICAgICAgICAgICAgaW50ZXJzZWN0ZiB8PSBpbnRlcnNlY3Rba10g PSBtYXRjaGVzW2tdICYgbGFiZWxzW2pdW2tdOworICAgICAgICAgIGlmICghaW50ZXJzZWN0ZikK KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLyogSXQgZG9lczsgbm93IGZpbmQg dGhlIHNldCBkaWZmZXJlbmNlcyBib3RoIHdheXMuICAqLworICAgICAgICAgIGxlZnRvdmVyc2Yg PSBtYXRjaGVzZiA9IDA7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IENIQVJDTEFTU19XT1JE UzsgKytrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBFdmVuIGFuIG9wdGltaXpp bmcgY29tcGlsZXIgY2FuJ3Qga25vdyB0aGlzIGZvciBzdXJlLiAgKi8KKyAgICAgICAgICAgICAg Y2hhcmNsYXNzX3dvcmQgbWF0Y2ggPSBtYXRjaGVzW2tdLCBsYWJlbCA9IGxhYmVsc1tqXVtrXTsK KworICAgICAgICAgICAgICBsZWZ0b3ZlcnNmIHw9IGxlZnRvdmVyc1trXSA9IH5tYXRjaCAmIGxh YmVsOworICAgICAgICAgICAgICBtYXRjaGVzZiB8PSBtYXRjaGVzW2tdID0gbWF0Y2ggJiB+bGFi ZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBJZiB0aGVyZSB3ZXJlIGxlZnRvdmVy cywgY3JlYXRlIGEgbmV3IGdyb3VwIGxhYmVsZWQgd2l0aCB0aGVtLiAgKi8KKyAgICAgICAgICBp ZiAobGVmdG92ZXJzZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29weXNldCAobGVm dG92ZXJzLCBsYWJlbHNbbmdycHNdKTsKKyAgICAgICAgICAgICAgY29weXNldCAoaW50ZXJzZWN0 LCBsYWJlbHNbal0pOworICAgICAgICAgICAgICBncnBzW25ncnBzXS5lbGVtcyA9IHhubWFsbG9j IChkLT5ubGVhdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzaXplb2YgKmdycHNbbmdycHNdLmVsZW1zKTsKKyAgICAgICAgICAgICAgbWVtY3B5IChncnBz W25ncnBzXS5lbGVtcywgZ3Jwc1tqXS5lbGVtcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXpl b2YgKGdycHNbal0uZWxlbXNbMF0pICogZ3Jwc1tqXS5uZWxlbSk7CisgICAgICAgICAgICAgIGdy cHNbbmdycHNdLm5lbGVtID0gZ3Jwc1tqXS5uZWxlbTsKKyAgICAgICAgICAgICAgKytuZ3JwczsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFB1dCB0aGUgcG9zaXRpb24gaW4gdGhlIGN1 cnJlbnQgZ3JvdXAuICBUaGUgY29uc3RyYWludCBpcworICAgICAgICAgICAgIGlycmVsZXZhbnQg aGVyZS4gICovCisgICAgICAgICAgZ3Jwc1tqXS5lbGVtc1tncnBzW2pdLm5lbGVtKytdID0gcG9z LmluZGV4OworCisgICAgICAgICAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIG1hdGNoaW5nIHRoZSBj dXJyZW50IHBvc2l0aW9uIGhhcyBiZWVuCisgICAgICAgICAgICAgYWNjb3VudGVkIGZvciwgd2Un cmUgZG9uZS4gICovCisgICAgICAgICAgaWYgKCFtYXRjaGVzZikKKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICB9CisKKyAgICAgIC8qIElmIHdlJ3ZlIHBhc3NlZCB0aGUgbGFzdCBncm91cCwg YW5kIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzCisgICAgICAgICB1bmFjY291bnRlZCBmb3Is IHRoZW4gd2UnbGwgaGF2ZSB0byBjcmVhdGUgYSBuZXcgZ3JvdXAuICAqLworICAgICAgaWYgKGog PT0gbmdycHMpCisgICAgICAgIHsKKyAgICAgICAgICBjb3B5c2V0IChtYXRjaGVzLCBsYWJlbHNb bmdycHNdKTsKKyAgICAgICAgICB6ZXJvc2V0IChtYXRjaGVzKTsKKyAgICAgICAgICBncnBzW25n cnBzXS5lbGVtcyA9IHhubWFsbG9jIChkLT5ubGVhdmVzLCBzaXplb2YgKmdycHNbbmdycHNdLmVs ZW1zKTsKKyAgICAgICAgICBncnBzW25ncnBzXS5uZWxlbSA9IDE7CisgICAgICAgICAgZ3Jwc1tu Z3Jwc10uZWxlbXNbMF0gPSBwb3MuaW5kZXg7CisgICAgICAgICAgKytuZ3JwczsKKyAgICAgICAg fQorICAgIH0KKworICBhbGxvY19wb3NpdGlvbl9zZXQgKCZmb2xsb3dzLCBkLT5ubGVhdmVzKTsK KyAgYWxsb2NfcG9zaXRpb25fc2V0ICgmdG1wLCBkLT5ubGVhdmVzKTsKKworICAvKiBJZiB3ZSBh cmUgYSBzZWFyY2hpbmcgbWF0Y2hlciwgdGhlIGRlZmF1bHQgdHJhbnNpdGlvbiBpcyB0byBhIHN0 YXRlCisgICAgIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9ucyBvZiBzdGF0ZSAwLCBvdGhlcndpc2Ug dGhlIGRlZmF1bHQgdHJhbnNpdGlvbgorICAgICBpcyB0byBmYWlsIG1pc2VyYWJseS4gICovCisg IGlmIChkLT5zZWFyY2hmbGFnKQorICAgIHsKKyAgICAgIC8qIEZpbmQgdGhlIHN0YXRlKHMpIGNv cnJlc3BvbmRpbmcgdG8gdGhlIHBvc2l0aW9ucyBvZiBzdGF0ZSAwLiAgKi8KKyAgICAgIGNvcHkg KCZkLT5zdGF0ZXNbMF0uZWxlbXMsICZmb2xsb3dzKTsKKyAgICAgIHNlcGFyYXRlX2NvbnRleHRz ID0gc3RhdGVfc2VwYXJhdGVfY29udGV4dHMgKCZmb2xsb3dzKTsKKyAgICAgIHN0YXRlID0gc3Rh dGVfaW5kZXggKGQsICZmb2xsb3dzLCBzZXBhcmF0ZV9jb250ZXh0cyBeIENUWF9BTlkpOworICAg ICAgaWYgKHNlcGFyYXRlX2NvbnRleHRzICYgQ1RYX05FV0xJTkUpCisgICAgICAgIHN0YXRlX25l d2xpbmUgPSBzdGF0ZV9pbmRleCAoZCwgJmZvbGxvd3MsIENUWF9ORVdMSU5FKTsKKyAgICAgIGVs c2UKKyAgICAgICAgc3RhdGVfbmV3bGluZSA9IHN0YXRlOworICAgICAgaWYgKHNlcGFyYXRlX2Nv bnRleHRzICYgQ1RYX0xFVFRFUikKKyAgICAgICAgc3RhdGVfbGV0dGVyID0gc3RhdGVfaW5kZXgg KGQsICZmb2xsb3dzLCBDVFhfTEVUVEVSKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RhdGVfbGV0 dGVyID0gc3RhdGU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOT1RDSEFSOyArK2kpCisgICAg ICAgIHRyYW5zW2ldID0gdW5pYnl0ZV93b3JkX2NvbnN0aXR1ZW50IChpKSA/IHN0YXRlX2xldHRl ciA6IHN0YXRlOworICAgICAgdHJhbnNbZW9sYnl0ZV0gPSBzdGF0ZV9uZXdsaW5lOworICAgIH0K KyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBOT1RDSEFSOyArK2kpCisgICAgICB0cmFuc1tp XSA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBuZ3JwczsgKytpKQorICAgIHsKKyAgICAgIGZv bGxvd3MubmVsZW0gPSAwOworCisgICAgICAvKiBGaW5kIHRoZSB1bmlvbiBvZiB0aGUgZm9sbG93 cyBvZiB0aGUgcG9zaXRpb25zIG9mIHRoZSBncm91cC4KKyAgICAgICAgIFRoaXMgaXMgYSBoaWRl b3VzbHkgaW5lZmZpY2llbnQgbG9vcC4gIEZpeCBpdCBzb21lZGF5LiAgKi8KKyAgICAgIGZvciAo aiA9IDA7IGogPCBncnBzW2ldLm5lbGVtOyArK2opCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBk LT5mb2xsb3dzW2dycHNbaV0uZWxlbXNbal1dLm5lbGVtOyArK2spCisgICAgICAgICAgaW5zZXJ0 IChkLT5mb2xsb3dzW2dycHNbaV0uZWxlbXNbal1dLmVsZW1zW2tdLCAmZm9sbG93cyk7CisKKyAg ICAgIGlmIChkLT5tdWx0aWJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiBhIHRva2Vu IGluIGZvbGxvd3MuZWxlbXMgaXMgbm90IDFzdCBieXRlIG9mIGEgbXVsdGlieXRlCisgICAgICAg ICAgICAgY2hhcmFjdGVyLCBvciB0aGUgc3RhdGVzIG9mIGZvbGxvd3MgbXVzdCBhY2NlcHQgdGhl IGJ5dGVzCisgICAgICAgICAgICAgd2hpY2ggYXJlIG5vdCAxc3QgYnl0ZSBvZiB0aGUgbXVsdGli eXRlIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICBUaGVuLCBpZiBhIHN0YXRlIG9mIGZvbGxvd3Mg ZW5jb3VudGVyIGEgYnl0ZSwgaXQgbXVzdCBub3QgYmUKKyAgICAgICAgICAgICBhIDFzdCBieXRl IG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciBub3Igc2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgorICAg ICAgICAgICAgIFdlIGNhbnNlbCB0byBhZGQgc3RhdGVbMF0uZm9sbG93cyB0byBuZXh0IHN0YXRl LCBiZWNhdXNlCisgICAgICAgICAgICAgc3RhdGVbMF0gbXVzdCBhY2NlcHQgMXN0LWJ5dGUKKwor ICAgICAgICAgICAgIEZvciBleGFtcGxlLCB3ZSBhc3N1bWUgPHNiIGE+IGlzIGEgY2VydGFpbiBz aW5nbGUgYnl0ZQorICAgICAgICAgICAgIGNoYXJhY3RlciwgPG1iIEE+IGlzIGEgY2VydGFpbiBt dWx0aWJ5dGUgY2hhcmFjdGVyLCBhbmQgdGhlCisgICAgICAgICAgICAgY29kZXBvaW50IG9mIDxz YiBhPiBlcXVhbHMgdGhlIDJuZCBieXRlIG9mIHRoZSBjb2RlcG9pbnQgb2YKKyAgICAgICAgICAg ICA8bWIgQT4uCisgICAgICAgICAgICAgV2hlbiBzdGF0ZVswXSBhY2NlcHRzIDxzYiBhPiwgc3Rh dGVbaV0gdHJhbnNpdCB0byBzdGF0ZVtpKzFdCisgICAgICAgICAgICAgYnkgYWNjZXB0aW5nIGFj Y2VwdHMgMXN0IGJ5dGUgb2YgPG1iIEE+LCBhbmQgc3RhdGVbaSsxXQorICAgICAgICAgICAgIGFj Y2VwdHMgMm5kIGJ5dGUgb2YgPG1iIEE+LCBpZiBzdGF0ZVtpKzFdIGVuY291bnRlciB0aGUKKyAg ICAgICAgICAgICBjb2RlcG9pbnQgb2YgPHNiIGE+LCBpdCBtdXN0IG5vdCBiZSA8c2IgYT4gYnV0 IDJuZCBieXRlIG9mCisgICAgICAgICAgICAgPG1iIEE+LCBzbyB3ZSBjYW5ub3QgYWRkIHN0YXRl WzBdLiAgKi8KKworICAgICAgICAgIG5leHRfaXNudF8xc3RfYnl0ZSA9IGZhbHNlOworICAgICAg ICAgIGZvciAoaiA9IDA7IGogPCBmb2xsb3dzLm5lbGVtOyArK2opCisgICAgICAgICAgICB7Cisg ICAgICAgICAgICAgIGlmICghKGQtPm11bHRpYnl0ZV9wcm9wW2ZvbGxvd3MuZWxlbXNbal0uaW5k ZXhdICYgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbmV4dF9pc250 XzFzdF9ieXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3ZSBhcmUgYnVp bGRpbmcgYSBzZWFyY2hpbmcgbWF0Y2hlciwgdGhyb3cgaW4gdGhlIHBvc2l0aW9ucworICAgICAg ICAgb2Ygc3RhdGUgMCBhcyB3ZWxsLiAgKi8KKyAgICAgIGlmIChkLT5zZWFyY2hmbGFnICYmICgh ZC0+bXVsdGlieXRlIHx8ICFuZXh0X2lzbnRfMXN0X2J5dGUpKQorICAgICAgICB7CisgICAgICAg ICAgbWVyZ2UgKCZkLT5zdGF0ZXNbMF0uZWxlbXMsICZmb2xsb3dzLCAmdG1wKTsKKyAgICAgICAg ICBjb3B5ICgmdG1wLCAmZm9sbG93cyk7CisgICAgICAgIH0KKworICAgICAgLyogRmluZCBvdXQg aWYgdGhlIG5ldyBzdGF0ZSB3aWxsIHdhbnQgYW55IGNvbnRleHQgaW5mb3JtYXRpb24uICAqLwor ICAgICAgcG9zc2libGVfY29udGV4dHMgPSBjaGFyY2xhc3NfY29udGV4dCAobGFiZWxzW2ldKTsK KyAgICAgIHNlcGFyYXRlX2NvbnRleHRzID0gc3RhdGVfc2VwYXJhdGVfY29udGV4dHMgKCZmb2xs b3dzKTsKKworICAgICAgLyogRmluZCB0aGUgc3RhdGUocykgY29ycmVzcG9uZGluZyB0byB0aGUg dW5pb24gb2YgdGhlIGZvbGxvd3MuICAqLworICAgICAgaWYgKChzZXBhcmF0ZV9jb250ZXh0cyAm IHBvc3NpYmxlX2NvbnRleHRzKSAhPSBwb3NzaWJsZV9jb250ZXh0cykKKyAgICAgICAgc3RhdGUg PSBzdGF0ZV9pbmRleCAoZCwgJmZvbGxvd3MsIHNlcGFyYXRlX2NvbnRleHRzIF4gQ1RYX0FOWSk7 CisgICAgICBlbHNlCisgICAgICAgIHN0YXRlID0gLTE7CisgICAgICBpZiAoc2VwYXJhdGVfY29u dGV4dHMgJiBwb3NzaWJsZV9jb250ZXh0cyAmIENUWF9ORVdMSU5FKQorICAgICAgICBzdGF0ZV9u ZXdsaW5lID0gc3RhdGVfaW5kZXggKGQsICZmb2xsb3dzLCBDVFhfTkVXTElORSk7CisgICAgICBl bHNlCisgICAgICAgIHN0YXRlX25ld2xpbmUgPSBzdGF0ZTsKKyAgICAgIGlmIChzZXBhcmF0ZV9j b250ZXh0cyAmIHBvc3NpYmxlX2NvbnRleHRzICYgQ1RYX0xFVFRFUikKKyAgICAgICAgc3RhdGVf bGV0dGVyID0gc3RhdGVfaW5kZXggKGQsICZmb2xsb3dzLCBDVFhfTEVUVEVSKTsKKyAgICAgIGVs c2UKKyAgICAgICAgc3RhdGVfbGV0dGVyID0gc3RhdGU7CisKKyNpZmRlZiBERUJVRworICAgICAg ZnByaW50ZiAoc3RkZXJyLCAiZ3JvdXAgJXp1XG4gbmV4dHBvczoiLCBpKTsKKyAgICAgIGZvciAo aiA9IDA7IGogPCBncnBzW2ldLm5lbGVtOyArK2opCisgICAgICAgIHsKKyAgICAgICAgICBmcHJp bnRmIChzdGRlcnIsICIgJXp1OiIsIGdycHNbaV0uZWxlbXNbal0pOworICAgICAgICAgIHBydG9r IChkLT50b2tlbnNbZ3Jwc1tpXS5lbGVtc1tqXV0pOworICAgICAgICB9CisgICAgICBmcHJpbnRm IChzdGRlcnIsICJcbiBmb2xsb3dzOiIpOworICAgICAgZm9yIChqID0gMDsgaiA8IGZvbGxvd3Mu bmVsZW07ICsraikKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAlenU6 IiwgZm9sbG93cy5lbGVtc1tqXS5pbmRleCk7CisgICAgICAgICAgcHJ0b2sgKGQtPnRva2Vuc1tm b2xsb3dzLmVsZW1zW2pdLmluZGV4XSk7CisgICAgICAgIH0KKyAgICAgIGZwcmludGYgKHN0ZGVy ciwgIlxuIHN0YXRlczoiKTsKKyAgICAgIGlmIChwb3NzaWJsZV9jb250ZXh0cyAmIENUWF9ORVdM SU5FKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RYX05FV0xJTkU6JXRkIiwgc3RhdGVf bmV3bGluZSk7CisgICAgICBpZiAocG9zc2libGVfY29udGV4dHMgJiBDVFhfTEVUVEVSKQorICAg ICAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RYX0xFVFRFUjoldGQiLCBzdGF0ZV9sZXR0ZXIpOwor ICAgICAgaWYgKHBvc3NpYmxlX2NvbnRleHRzICYgQ1RYX05PTkUpCisgICAgICAgIGZwcmludGYg KHN0ZGVyciwgIiBDVFhfTk9ORToldGQiLCBzdGF0ZSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIs ICJcbiIpOworI2VuZGlmCisKKyAgICAgIC8qIFNldCB0aGUgdHJhbnNpdGlvbnMgZm9yIGVhY2gg Y2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGxhYmVsLiAgKi8KKyAgICAgIGZvciAoaiA9IDA7IGog PCBDSEFSQ0xBU1NfV09SRFM7ICsraikKKyAgICAgICAgZm9yIChrID0gMDsgayA8IENIQVJDTEFT U19XT1JEX0JJVFM7ICsraykKKyAgICAgICAgICBpZiAobGFiZWxzW2ldW2pdID4+IGsgJiAxKQor ICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgYyA9IGogKiBDSEFSQ0xBU1NfV09SRF9C SVRTICsgazsKKworICAgICAgICAgICAgICBpZiAoYyA9PSBlb2xieXRlKQorICAgICAgICAgICAg ICAgIHRyYW5zW2NdID0gc3RhdGVfbmV3bGluZTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAodW5p Ynl0ZV93b3JkX2NvbnN0aXR1ZW50IChjKSkKKyAgICAgICAgICAgICAgICB0cmFuc1tjXSA9IHN0 YXRlX2xldHRlcjsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8IE5PVENIQVIpCisgICAgICAg ICAgICAgICAgdHJhbnNbY10gPSBzdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyNpZmRl ZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJ0cmFucyB0YWJsZSAldGQiLCBzKTsKKyAgZm9y IChpID0gMDsgaSA8IE5PVENIQVI7ICsraSkKKyAgICB7CisgICAgICBpZiAoIShpICYgMHhmKSkK KyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwg IiAlMnRkIiwgdHJhbnNbaV0pOworICAgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyNl bmRpZgorCisgIGZvciAoaSA9IDA7IGkgPCBuZ3JwczsgKytpKQorICAgIGZyZWUgKGdycHNbaV0u ZWxlbXMpOworICBmcmVlIChmb2xsb3dzLmVsZW1zKTsKKyAgZnJlZSAodG1wLmVsZW1zKTsKK30K KworLyogTWFrZSBzdXJlIEQncyBzdGF0ZSBhcnJheXMgYXJlIGxhcmdlIGVub3VnaCB0byBob2xk IE5FV19TVEFURS4gICovCitzdGF0aWMgdm9pZAorcmVhbGxvY190cmFuc19pZl9uZWNlc3Nhcnkg KHN0cnVjdCBkZmEgKmQsIHN0YXRlX251bSBuZXdfc3RhdGUpCit7CisgIHN0YXRlX251bSBvbGRh bGxvYyA9IGQtPnRyYWxsb2M7CisgIGlmIChvbGRhbGxvYyA8PSBuZXdfc3RhdGUpCisgICAgewor ICAgICAgc3RhdGVfbnVtICoqcmVhbHRyYW5zID0gZC0+dHJhbnMgPyBkLT50cmFucyAtIDEgOiBO VUxMOworICAgICAgc2l6ZV90IG5ld2FsbG9jLCBuZXdhbGxvYzE7CisgICAgICBuZXdhbGxvYzEg PSBuZXdfc3RhdGUgKyAxOworICAgICAgcmVhbHRyYW5zID0geDJucmVhbGxvYyAocmVhbHRyYW5z LCAmbmV3YWxsb2MxLCBzaXplb2YgKnJlYWx0cmFucyk7CisgICAgICByZWFsdHJhbnNbMF0gPSBO VUxMOworICAgICAgZC0+dHJhbnMgPSByZWFsdHJhbnMgKyAxOworICAgICAgZC0+dHJhbGxvYyA9 IG5ld2FsbG9jID0gbmV3YWxsb2MxIC0gMTsKKyAgICAgIGQtPmZhaWxzID0geG5yZWFsbG9jIChk LT5mYWlscywgbmV3YWxsb2MsIHNpemVvZiAqZC0+ZmFpbHMpOworICAgICAgZC0+c3VjY2VzcyA9 IHhucmVhbGxvYyAoZC0+c3VjY2VzcywgbmV3YWxsb2MsIHNpemVvZiAqZC0+c3VjY2Vzcyk7Cisg ICAgICBkLT5uZXdsaW5lcyA9IHhucmVhbGxvYyAoZC0+bmV3bGluZXMsIG5ld2FsbG9jLCBzaXpl b2YgKmQtPm5ld2xpbmVzKTsKKyAgICAgIGZvciAoOyBvbGRhbGxvYyA8IG5ld2FsbG9jOyBvbGRh bGxvYysrKQorICAgICAgICB7CisgICAgICAgICAgZC0+dHJhbnNbb2xkYWxsb2NdID0gTlVMTDsK KyAgICAgICAgICBkLT5mYWlsc1tvbGRhbGxvY10gPSBOVUxMOworICAgICAgICB9CisgICAgfQor fQorCisvKiBTb21lIHJvdXRpbmVzIGZvciBtYW5pcHVsYXRpbmcgYSBjb21waWxlZCBkZmEncyB0 cmFuc2l0aW9uIHRhYmxlcy4KKyAgIEVhY2ggc3RhdGUgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRy YW5zaXRpb24gdGFibGU7IGlmIGl0IGRvZXMsIGFuZCBpdAorICAgaXMgYSBub24tYWNjZXB0aW5n IHN0YXRlLCB0aGVuIGQtPnRyYW5zW3N0YXRlXSBwb2ludHMgdG8gaXRzIHRhYmxlLgorICAgSWYg aXQgaXMgYW4gYWNjZXB0aW5nIHN0YXRlIHRoZW4gZC0+ZmFpbHNbc3RhdGVdIHBvaW50cyB0byBp dHMgdGFibGUuCisgICBJZiBpdCBoYXMgbm8gdGFibGUgYXQgYWxsLCB0aGVuIGQtPnRyYW5zW3N0 YXRlXSBpcyBOVUxMLgorICAgVE9ETzogSW1wcm92ZSB0aGlzIGNvbW1lbnQsIGdldCByaWQgb2Yg dGhlIHVubmVjZXNzYXJ5IHJlZHVuZGFuY3kuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfc3Rh dGUgKHN0YXRlX251bSBzLCBzdHJ1Y3QgZGZhICpkKQoreworICBzdGF0ZV9udW0gKnRyYW5zOyAg ICAgICAgICAgICAvKiBUaGUgbmV3IHRyYW5zaXRpb24gdGFibGUuICAqLworICBzdGF0ZV9udW0g aSwgbWF4c3RhdGU7CisKKyAgLyogU2V0IGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Yg dHJhbnNpdGlvbiB0YWJsZXMgdGhhdCB3aWxsIGV2ZXIKKyAgICAgZXhpc3QgYXQgb25jZS4gIDEw MjQgaXMgYXJiaXRyYXJ5LiAgVGhlIGlkZWEgaXMgdGhhdCB0aGUgZnJlcXVlbnRseQorICAgICB1 c2VkIHRyYW5zaXRpb24gdGFibGVzIHdpbGwgYmUgcXVpY2tseSByZWJ1aWx0LCB3aGVyZWFzIHRo ZSBvbmVzIHRoYXQKKyAgICAgd2VyZSBvbmx5IG5lZWRlZCBvbmNlIG9yIHR3aWNlIHdpbGwgYmUg Y2xlYXJlZCBhd2F5LiAgSG93ZXZlciwgZG8gbm90CisgICAgIGNsZWFyIHRoZSBpbml0aWFsIEQt Pm1pbl90cmNvdW50IHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWx3YXlzIHVzZWQuICAqLworICBp ZiAoZC0+dHJjb3VudCA+PSAxMDI0KQorICAgIHsKKyAgICAgIGZvciAoaSA9IGQtPm1pbl90cmNv dW50OyBpIDwgZC0+dHJhbGxvYzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgZnJlZSAoZC0+ dHJhbnNbaV0pOworICAgICAgICAgIGZyZWUgKGQtPmZhaWxzW2ldKTsKKyAgICAgICAgICBkLT50 cmFuc1tpXSA9IGQtPmZhaWxzW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgZC0+dHJjb3Vu dCA9IGQtPm1pbl90cmNvdW50OworICAgIH0KKworICArK2QtPnRyY291bnQ7CisKKyAgLyogU2V0 IHVwIHRoZSBzdWNjZXNzIGJpdHMgZm9yIHRoaXMgc3RhdGUuICAqLworICBkLT5zdWNjZXNzW3Nd ID0gMDsKKyAgaWYgKEFDQ0VQVFNfSU5fQ09OVEVYVCAoZC0+c3RhdGVzW3NdLmNvbnRleHQsIENU WF9ORVdMSU5FLCBzLCAqZCkpCisgICAgZC0+c3VjY2Vzc1tzXSB8PSBDVFhfTkVXTElORTsKKyAg aWYgKEFDQ0VQVFNfSU5fQ09OVEVYVCAoZC0+c3RhdGVzW3NdLmNvbnRleHQsIENUWF9MRVRURVIs IHMsICpkKSkKKyAgICBkLT5zdWNjZXNzW3NdIHw9IENUWF9MRVRURVI7CisgIGlmIChBQ0NFUFRT X0lOX0NPTlRFWFQgKGQtPnN0YXRlc1tzXS5jb250ZXh0LCBDVFhfTk9ORSwgcywgKmQpKQorICAg IGQtPnN1Y2Nlc3Nbc10gfD0gQ1RYX05PTkU7CisKKyAgdHJhbnMgPSB4bWFsbG9jIChOT1RDSEFS ICogc2l6ZW9mICp0cmFucyk7CisgIGRmYXN0YXRlIChzLCBkLCB0cmFucyk7CisKKyAgLyogTm93 IGdvIHRocm91Z2ggdGhlIG5ldyB0cmFuc2l0aW9uIHRhYmxlLCBhbmQgbWFrZSBzdXJlIHRoYXQg dGhlIHRyYW5zCisgICAgIGFuZCBmYWlsIGFycmF5cyBhcmUgYWxsb2NhdGVkIGxhcmdlIGVub3Vn aCB0byBob2xkIGEgcG9pbnRlciBmb3IgdGhlCisgICAgIGxhcmdlc3Qgc3RhdGUgbWVudGlvbmVk IGluIHRoZSB0YWJsZS4gICovCisgIG1heHN0YXRlID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCBO T1RDSEFSOyArK2kpCisgICAgaWYgKG1heHN0YXRlIDwgdHJhbnNbaV0pCisgICAgICBtYXhzdGF0 ZSA9IHRyYW5zW2ldOworICByZWFsbG9jX3RyYW5zX2lmX25lY2Vzc2FyeSAoZCwgbWF4c3RhdGUp OworCisgIC8qIEtlZXAgdGhlIG5ld2xpbmUgdHJhbnNpdGlvbiBpbiBhIHNwZWNpYWwgcGxhY2Ug c28gd2UgY2FuIHVzZSBpdCBhcworICAgICBhIHNlbnRpbmVsLiAgKi8KKyAgZC0+bmV3bGluZXNb c10gPSB0cmFuc1tlb2xieXRlXTsKKyAgdHJhbnNbZW9sYnl0ZV0gPSAtMTsKKworICBpZiAoQUND RVBUSU5HIChzLCAqZCkpCisgICAgZC0+ZmFpbHNbc10gPSB0cmFuczsKKyAgZWxzZQorICAgIGQt PnRyYW5zW3NdID0gdHJhbnM7Cit9CisKKy8qIE11bHRpYnl0ZSBjaGFyYWN0ZXIgaGFuZGxpbmcg c3ViLXJvdXRpbmVzIGZvciBkZmFleGVjLiAgKi8KKworLyogQ29uc3VtZSBhIHNpbmdsZSBieXRl IGFuZCB0cmFuc2l0IHN0YXRlIGZyb20gJ3MnIHRvICcqbmV4dF9zdGF0ZScuCisgICBUaGlzIGZ1 bmN0aW9uIGlzIGFsbW9zdCBzYW1lIGFzIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIHJvdXRpbiBpbiBk ZmFleGVjLgorICAgQnV0IHN0YXRlIHRyYW5zaXRpb24gaXMgZG9uZSBqdXN0IG9uY2UsIG90aGVy d2lzZSBtYXRjaGluZyBzdWNjZWVkIG9yCisgICByZWFjaCB0aGUgZW5kIG9mIHRoZSBidWZmZXIu ICAqLworc3RhdGljIHN0YXRlX251bQordHJhbnNpdF9zdGF0ZV9zaW5nbGVieXRlIChzdHJ1Y3Qg ZGZhICpkLCBzdGF0ZV9udW0gcywgdW5zaWduZWQgY2hhciBjb25zdCAqKnBwKQoreworICBzdGF0 ZV9udW0gKnQ7CisKKyAgaWYgKCoqcHAgPT0gZW9sYnl0ZSkKKyAgICB7CisgICAgICAvKiBTIGlz IGFsd2F5cyBhbiBpbml0aWFsIHN0YXRlIGluIHRyYW5zaXRfc3RhdGUsIHNvIHRoZQorICAgICAg ICAgdHJhbnNpdGlvbiB0YWJsZSBmb3IgdGhlIHN0YXRlIG11c3QgaGF2ZSBiZWVuIGJ1aWx0IGFs cmVhZHkuICAqLworICAgICAgYXNzZXJ0IChkLT50cmFuc1tzXSB8fCBkLT5mYWlsc1tzXSk7CisK KyAgICAgICsrKnBwOworICAgICAgcmV0dXJuIGQtPm5ld2xpbmVzW3NdOworICAgIH0KKworICBp ZiAoZC0+dHJhbnNbc10pCisgICAgdCA9IGQtPnRyYW5zW3NdOworICBlbHNlIGlmIChkLT5mYWls c1tzXSkKKyAgICB0ID0gZC0+ZmFpbHNbc107CisgIGVsc2UKKyAgICB7CisgICAgICBidWlsZF9z dGF0ZSAocywgZCk7CisgICAgICBpZiAoZC0+dHJhbnNbc10pCisgICAgICAgIHQgPSBkLT50cmFu c1tzXTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHQgPSBkLT5mYWlsc1tzXTsK KyAgICAgICAgICBhc3NlcnQgKHQpOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiB0Wyoo KnBwKSsrXTsKK30KKworLyogVHJhbnNpdCBzdGF0ZSBmcm9tIHMsIHRoZW4gcmV0dXJuIG5ldyBz dGF0ZSBhbmQgdXBkYXRlIHRoZSBwb2ludGVyIG9mCisgICB0aGUgYnVmZmVyLiAgVGhpcyBmdW5j dGlvbiBpcyBmb3IgYSBwZXJpb2Qgb3BlcmF0b3Igd2hpY2ggY2FuIG1hdGNoIGEKKyAgIG11bHRp LWJ5dGUgY2hhcmFjdGVyLiAgKi8KK3N0YXRpYyBzdGF0ZV9udW0KK3RyYW5zaXRfc3RhdGUgKHN0 cnVjdCBkZmEgKmQsIHN0YXRlX251bSBzLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICoqcHAsCisgICAg ICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICplbmQpCit7CisgIHN0YXRlX251bSBzMSwg czI7CisgIHdpbnRfdCB3YzsKKyAgc2l6ZV90IGksIGo7CisgIGludCBrOworICBpbnQgc2VwYXJh dGVfY29udGV4dHM7CisKKyAgaW50IG1iY2xlbiA9IG1ic190b193Y2hhciAoJndjLCAoY2hhciBj b25zdCAqKSAqcHAsIGVuZCAtICpwcCwgZCk7CisgIGludCBjb250ZXh0ID0gd2MgPT0gZW9sYnl0 ZSA/IENUWF9ORVdMSU5FIDogQ1RYX05PTkU7CisKKyAgLyogVGhpcyBzdGF0ZSBoYXMgc29tZSBv cGVyYXRvcnMgd2hpY2ggY2FuIG1hdGNoIGEgbXVsdGlieXRlIGNoYXJhY3Rlci4gICovCisgIGQt Pm1iX2ZvbGxvd3MubmVsZW0gPSAwOworCisgIC8qIENhbGN1bGF0ZSB0aGUgc3RhdGUgd2hpY2gg Y2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhdGUgJ3MnIGJ5CisgICAgIGNvbnN1bWluZyAnbWJj bGVuJyBzaW5nbGUgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLiAgKi8KKyAgczEgPSBzOworICBmb3Ig KGsgPSAwOyBrIDwgbWJjbGVuOyBrKyspCisgICAgeworICAgICAgczIgPSBzMTsKKyAgICAgIHMx ID0gdHJhbnNpdF9zdGF0ZV9zaW5nbGVieXRlIChkLCBzMiwgcHApOworICAgIH0KKyAgY29weSAo JmQtPnN0YXRlc1tzMV0uZWxlbXMsICZkLT5tYl9mb2xsb3dzKTsKKworICAvKiBBZGQgYWxsIG9m IHRoZSBwb3NpdGlvbnMgd2hpY2ggY2FuIGJlIHJlYWNoZWQgZnJvbSAncycgYnkgY29uc3VtaW5n CisgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4gICovCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zdGF0 ZXNbc10ubWJwcy5uZWxlbTsgaSsrKQorICAgIHsKKyAgICAgIGlmICghU1VDQ0VFRFNfSU5fQ09O VEVYVCAoZC0+c3RhdGVzW3NdLm1icHMuZWxlbXNbaV0uY29uc3RyYWludCwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZC0+c3RhdGVzW3NdLmNvbnRleHQsIGNvbnRleHQpKQorICAg ICAgICBjb250aW51ZTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5mb2xsb3dzW2QtPnN0YXRl c1tzXS5tYnBzLmVsZW1zW2ldLmluZGV4XS5uZWxlbTsgaisrKQorICAgICAgICBpbnNlcnQgKGQt PmZvbGxvd3NbZC0+c3RhdGVzW3NdLm1icHMuZWxlbXNbaV0uaW5kZXhdLmVsZW1zW2pdLAorICAg ICAgICAgICAgICAgICZkLT5tYl9mb2xsb3dzKTsKKyAgICB9CisKKyAgc2VwYXJhdGVfY29udGV4 dHMgPSBzdGF0ZV9zZXBhcmF0ZV9jb250ZXh0cyAoJmQtPm1iX2ZvbGxvd3MpOworICBpZiAoISAo Y29udGV4dCA9PSBDVFhfTkVXTElORSB8fCBzZXBhcmF0ZV9jb250ZXh0cyAmIENUWF9ORVdMSU5F KSkKKyAgICBjb250ZXh0ID0gc2VwYXJhdGVfY29udGV4dHMgXiBDVFhfQU5ZOworICBzMSA9IHN0 YXRlX2luZGV4IChkLCAmZC0+bWJfZm9sbG93cywgY29udGV4dCk7CisgIHJlYWxsb2NfdHJhbnNf aWZfbmVjZXNzYXJ5IChkLCBzMSk7CisKKyAgcmV0dXJuIHMxOworfQorCisvKiBUaGUgaW5pdGlh bCBzdGF0ZSBtYXkgZW5jb3VudGVyIGEgYnl0ZSB3aGljaCBpcyBub3QgYSBzaW5nbGUgYnl0ZSBj aGFyYWN0ZXIKKyAgIG5vciB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIu ICBCdXQgaXQgaXMgaW5jb3JyZWN0IGZvciB0aGUKKyAgIGluaXRpYWwgc3RhdGUgdG8gYWNjZXB0 IHN1Y2ggYSBieXRlLiAgRm9yIGV4YW1wbGUsIGluIFNoaWZ0IEpJUyB0aGUgcmVndWxhcgorICAg ZXhwcmVzc2lvbiAiXFwiIGFjY2VwdHMgdGhlIGNvZGVwb2ludCAweDVjLCBidXQgc2hvdWxkIG5v dCBhY2NlcHQgdGhlIHNlY29uZAorICAgYnl0ZSBvZiB0aGUgY29kZXBvaW50IDB4ODE1Yy4gIFRo ZW4gdGhlIGluaXRpYWwgc3RhdGUgbXVzdCBza2lwIHRoZSBieXRlcworICAgdGhhdCBhcmUgbm90 IGEgc2luZ2xlIGJ5dGUgY2hhcmFjdGVyIG5vciB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpYnl0 ZQorICAgY2hhcmFjdGVyLgorCisgICBHaXZlbiBERkEgc3RhdGUgZCwgdXNlIG1ic190b193Y2hh ciB0byBhZHZhbmNlIE1CUCB1bnRpbCBpdCByZWFjaGVzCisgICBvciBleGNlZWRzIFAsIGFuZCBy ZXR1cm4gdGhlIGFkdmFuY2VkIE1CUC4gIElmIFdDUCBpcyBub24tTlVMTCBhbmQKKyAgIHRoZSBy ZXN1bHQgaXMgZ3JlYXRlciB0aGFuIFAsIHNldCAqV0NQIHRvIHRoZSBmaW5hbCB3aWRlIGNoYXJh Y3RlcgorICAgcHJvY2Vzc2VkLCBvciB0byBXRU9GIGlmIG5vIHdpZGUgY2hhcmFjdGVyIGlzIHBy b2Nlc3NlZC4gIE90aGVyd2lzZSwKKyAgIGlmIFdDUCBpcyBub24tTlVMTCwgKldDUCBtYXkgb3Ig bWF5IG5vdCBiZSB1cGRhdGVkLgorCisgICBCb3RoIFAgYW5kIE1CUCBtdXN0IGJlIG5vIGxhcmdl ciB0aGFuIEVORC4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb25zdCAqCitza2lwX3JlbWFp bnNfbWIgKHN0cnVjdCBkZmEgKmQsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsCisgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKm1icCwgY2hhciBjb25zdCAqZW5kLCB3aW50X3Qg KndjcCkKK3sKKyAgd2ludF90IHdjID0gV0VPRjsKKyAgaWYgKG5ldmVyX3RyYWlsWypwXSkKKyAg ICByZXR1cm4gcDsKKyAgd2hpbGUgKG1icCA8IHApCisgICAgbWJwICs9IG1ic190b193Y2hhciAo JndjLCAoY2hhciBjb25zdCAqKSBtYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0g KGNoYXIgY29uc3QgKikgbWJwLCBkKTsKKyAgaWYgKHdjcCAhPSBOVUxMKQorICAgICp3Y3AgPSB3 YzsKKyAgcmV0dXJuIG1icDsKK30KKworLyogU2VhcmNoIHRocm91Z2ggYSBidWZmZXIgbG9va2lu ZyBmb3IgYSBtYXRjaCB0byB0aGUgc3RydWN0IGRmYSAqRC4KKyAgIEZpbmQgdGhlIGZpcnN0IG9j Y3VycmVuY2Ugb2YgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIHJlZ2V4cCBpbiB0aGUKKyAgIGJ1ZmZl ciwgYW5kIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHRoZXJlb2YuICBSZXR1cm4gYSBw b2ludGVyIHRvCisgICB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBtYXRjaCwgb3IgTlVM TCBpZiBub25lIGlzIGZvdW5kLiAgQkVHSU4KKyAgIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9m IHRoZSBidWZmZXIsIGFuZCBFTkQgcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlCisgICBhZnRlciBp dHMgZW5kLiAgTm90ZSBob3dldmVyIHRoYXQgd2Ugc3RvcmUgYSBzZW50aW5lbCBieXRlICh1c3Vh bGx5CisgICBuZXdsaW5lKSBpbiAqRU5ELCBzbyB0aGUgYWN0dWFsIGJ1ZmZlciBtdXN0IGJlIG9u ZSBieXRlIGxvbmdlci4KKyAgIFdoZW4gQUxMT1dfTkwsIG5ld2xpbmVzIG1heSBhcHBlYXIgaW4g dGhlIG1hdGNoaW5nIHN0cmluZy4KKyAgIElmIENPVU5UIGlzIG5vbi1OVUxMLCBpbmNyZW1lbnQg KkNPVU5UIG9uY2UgZm9yIGVhY2ggbmV3bGluZSBwcm9jZXNzZWQuCisgICBJZiBNVUxUSUJZVEUs IHRoZSBpbnB1dCBjb25zaXN0cyBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBhbmQvb3IKKyAgIGVu Y29kaW5nLWVycm9yIGJ5dGVzLiAgT3RoZXJ3aXNlLCBpdCBjb25zaXN0cyBvZiBzaW5nbGUtYnl0 ZSBjaGFyYWN0ZXJzLgorICAgSGVyZSBpcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IG1ha2Ug dGhpcyBERkEgbWF0Y2hlciBwdW50OgorICAgIC0gW00tTl0gcmFuZ2UgaW4gbm9uLXNpbXBsZSBs b2NhbGU6IHJlZ2V4IGlzIHVwIHRvIDI1JSBmYXN0ZXIgb24gW2Etel0KKyAgICAtIFteLi4uXSBp biBub24tc2ltcGxlIGxvY2FsZQorICAgIC0gW1s9Zm9vPV1dIG9yIFtbLmZvby5dXQorICAgIC0g W1s6YWxwaGE6XV0gZXRjLiBpbiBtdWx0aWJ5dGUgbG9jYWxlIChleGNlcHQgW1s6ZGlnaXQ6XV0g d29ya3MgT0spCisgICAgLSBiYWNrLXJlZmVyZW5jZTogKC4pXDEKKyAgICAtIHdvcmQtZGVsaW1p dGVyIGluIG11bHRpYnl0ZSBsb2NhbGU6IFw8LCBcPiwgXGIsIFxCCisgICBTZWUgdXNpbmdfc2lt cGxlX2xvY2FsZSBmb3IgdGhlIGRlZmluaXRpb24gb2YgInNpbXBsZSBsb2NhbGUiLiAgKi8KKwor c3RhdGljIGlubGluZSBjaGFyICoKK2RmYWV4ZWNfbWFpbiAoc3RydWN0IGRmYSAqZCwgY2hhciBj b25zdCAqYmVnaW4sIGNoYXIgKmVuZCwgYm9vbCBhbGxvd19ubCwKKyAgICAgICAgICAgICAgc2l6 ZV90ICpjb3VudCwgYm9vbCBtdWx0aWJ5dGUpCit7CisgIHN0YXRlX251bSBzLCBzMTsgICAgICAg ICAgICAgIC8qIEN1cnJlbnQgc3RhdGUuICAqLworICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCAq bWJwOyAvKiBDdXJyZW50IGlucHV0IGNoYXJhY3Rlci4gICovCisgIHN0YXRlX251bSAqKnRyYW5z LCAqdDsgICAgICAgIC8qIENvcHkgb2YgZC0+dHJhbnMgc28gaXQgY2FuIGJlIG9wdGltaXplZAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGEgcmVnaXN0ZXIuICAqLwor ICB1bnNpZ25lZCBjaGFyIGVvbCA9IGVvbGJ5dGU7ICAvKiBMaWtld2lzZSBmb3IgZW9sYnl0ZS4g ICovCisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfZW5kOworICBzaXplX3Qgbmxjb3VudCA9IDA7CisK KyAgaWYgKCFkLT50cmFsbG9jKQorICAgIHsKKyAgICAgIHJlYWxsb2NfdHJhbnNfaWZfbmVjZXNz YXJ5IChkLCAxKTsKKyAgICAgIGJ1aWxkX3N0YXRlICgwLCBkKTsKKyAgICB9CisKKyAgcyA9IHMx ID0gMDsKKyAgcCA9IG1icCA9ICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopIGJlZ2luOworICB0cmFu cyA9IGQtPnRyYW5zOworICBzYXZlZF9lbmQgPSAqKHVuc2lnbmVkIGNoYXIgKikgZW5kOworICAq ZW5kID0gZW9sOworCisgIGlmIChtdWx0aWJ5dGUpCisgICAgeworICAgICAgbWVtc2V0ICgmZC0+ bWJzLCAwLCBzaXplb2YgZC0+bWJzKTsKKyAgICAgIGlmIChkLT5tYl9mb2xsb3dzLmFsbG9jID09 IDApCisgICAgICAgIGFsbG9jX3Bvc2l0aW9uX3NldCAoJmQtPm1iX2ZvbGxvd3MsIGQtPm5sZWF2 ZXMpOworICAgIH0KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChtdWx0aWJ5dGUpCisg ICAgICAgIHsKKyAgICAgICAgICB3aGlsZSAoKHQgPSB0cmFuc1tzXSkgIT0gTlVMTCkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgczEgPSBzOworCisgICAgICAgICAgICAgIGlmIChzIDwg ZC0+bWluX3RyY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYg KGQtPm1pbl90cmNvdW50ID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg ICAgICAgICAgICBpZiAoZC0+c3RhdGVzW3NdLm1icHMubmVsZW0gPT0gMCkKKyAgICAgICAgICAg ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAo dFsqcF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG1icCA9IHNraXBfcmVtYWluc19tYiAoZCwgcCwg bWJwLCBlbmQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICAgICAgICAgICAgd2hpbGUgKHRbKnBdID09IDApOworICAgICAgICAgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg ICAgIHAgPSBtYnAgPSBza2lwX3JlbWFpbnNfbWIgKGQsIHAsIG1icCwgZW5kLCBOVUxMKTsKKyAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg ICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgd2ludF90IHdjOworICAgICAgICAgICAg ICAgICAgICAgIG1icCA9IHNraXBfcmVtYWluc19tYiAoZCwgcCwgbWJwLCBlbmQsICZ3Yyk7CisK KyAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkLT5taW5fdHJjb3VudCBpcyBncmVhdGVyIHRo YW4gMSwgbWF5YmUKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0IHRvIGFub3RoZXIg aW5pdGlhbCBzdGF0ZSBhZnRlciBza2lwLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpZiAo cCA8IG1icCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgLyogSXQncyBDVFhfTEVUVEVSIG9yIENUWF9OT05FLiAgQ1RYX05FV0xJTkUKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGhhcHBlbiwgYXMgd2UgYXNzdW1lIHRoYXQg YSBuZXdsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsd2F5cyBhIHNpbmds ZSBieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMxID0gcyA9 IGQtPmluaXRzdGF0ZV9ub3Rib2w7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBtYnA7 CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg ICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGQtPnN0YXRlc1tzXS5tYnBzLm5lbGVt ID09IDAgfHwgKCpwID09IGVvbCAmJiAhYWxsb3dfbmwpCisgICAgICAgICAgICAgICAgICB8fCAo KnAgPT0gJ1xuJyAmJiAhKHN5bnRheF9iaXRzICYgUkVfRE9UX05FV0xJTkUpKQorICAgICAgICAg ICAgICAgICAgfHwgKCpwID09ICdcMCcgJiYgKHN5bnRheF9iaXRzICYgUkVfRE9UX05PVF9OVUxM KSkKKyAgICAgICAgICAgICAgICAgIHx8IChjaGFyICopIHAgPj0gZW5kKQorICAgICAgICAgICAg ICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIElmIGFuIGlucHV0IGNoYXJhY3RlciBkb2VzIG5v dCBtYXRjaCBBTllDSEFSLCBkbyBpdAorICAgICAgICAgICAgICAgICAgICAgbGlrZSBhIHNpbmds ZS1ieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgICAgICBzID0gdFsqcCsrXTsKKyAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7Cisg ICAgICAgICAgICAgICAgICBzID0gdHJhbnNpdF9zdGF0ZSAoZCwgcywgJnAsICh1bnNpZ25lZCBj aGFyICopIGVuZCk7CisgICAgICAgICAgICAgICAgICBpZiAocyA+PSAwICYmIHBbLTFdID09IGVv bCkKKyAgICAgICAgICAgICAgICAgICAgbmxjb3VudCsrOworICAgICAgICAgICAgICAgICAgbWJw ID0gcDsKKyAgICAgICAgICAgICAgICAgIHRyYW5zID0gZC0+dHJhbnM7CisgICAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAg ICAgICAgICBpZiAocyA9PSAwICYmICh0ID0gdHJhbnNbc10pICE9IE5VTEwpCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgIHdoaWxlICh0WypwXSA9PSAwKQorICAgICAgICAgICAgICAgIHAr KzsKKyAgICAgICAgICAgICAgczEgPSAwOworICAgICAgICAgICAgICBzID0gdFsqcCsrXTsKKyAg ICAgICAgICAgIH0KKworICAgICAgICAgIHdoaWxlICgodCA9IHRyYW5zW3NdKSAhPSBOVUxMKQor ICAgICAgICAgICAgeworICAgICAgICAgICAgICBzMSA9IHRbKnArK107CisgICAgICAgICAgICAg IGlmICgodCA9IHRyYW5zW3MxXSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAg ICAgICAgICAgICBzdGF0ZV9udW0gdG1wID0gczsKKyAgICAgICAgICAgICAgICAgIHMgPSBzMTsK KyAgICAgICAgICAgICAgICAgIHMxID0gdG1wOyAgICAgLyogc3dhcCAqLworICAgICAgICAgICAg ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzID0gdFsqcCsr XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocyA8IDApCisgICAgICAg IHsKKyAgICAgICAgICBpZiAoKGNoYXIgKikgcCA+IGVuZCB8fCBwWy0xXSAhPSBlb2wgfHwgZC0+ bmV3bGluZXNbczFdIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcCA9IE5VTEw7 CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8q IFRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZSwgY291bnQgaXQsIGFuZCBza2lw CisgICAgICAgICAgICAgY2hlY2tpbmcgb2YgbXVsdGlieXRlIGNoYXJhY3RlciBib3VuZGFyeSB1 bnRpbCBoZXJlLiAgKi8KKyAgICAgICAgICBubGNvdW50Kys7CisgICAgICAgICAgbWJwID0gcDsK KworICAgICAgICAgIHMgPSBhbGxvd19ubCA/IGQtPm5ld2xpbmVzW3MxXSA6IDA7CisgICAgICAg IH0KKyAgICAgIGVsc2UgaWYgKGQtPmZhaWxzW3NdKQorICAgICAgICB7CisgICAgICAgICAgaWYg KGQtPnN1Y2Nlc3Nbc10gJiBzYml0WypwXSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKworICAg ICAgICAgIHMxID0gczsKKyAgICAgICAgICBpZiAoIW11bHRpYnl0ZSB8fCBkLT5zdGF0ZXNbc10u bWJwcy5uZWxlbSA9PSAwCisgICAgICAgICAgICAgIHx8ICgqcCA9PSBlb2wgJiYgIWFsbG93X25s KQorICAgICAgICAgICAgICB8fCAoKnAgPT0gJ1xuJyAmJiAhKHN5bnRheF9iaXRzICYgUkVfRE9U X05FV0xJTkUpKQorICAgICAgICAgICAgICB8fCAoKnAgPT0gJ1wwJyAmJiAoc3ludGF4X2JpdHMg JiBSRV9ET1RfTk9UX05VTEwpKQorICAgICAgICAgICAgICB8fCAoY2hhciAqKSBwID49IGVuZCkK KyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSWYgYSBpbnB1dCBjaGFyYWN0ZXIgZG9l cyBub3QgbWF0Y2ggQU5ZQ0hBUiwgZG8gaXQKKyAgICAgICAgICAgICAgICAgbGlrZSBhIHNpbmds ZS1ieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgIHMgPSBkLT5mYWlsc1tzXVsqcCsr XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAg ICAgICAgIHMgPSB0cmFuc2l0X3N0YXRlIChkLCBzLCAmcCwgKHVuc2lnbmVkIGNoYXIgKikgZW5k KTsKKyAgICAgICAgICAgICAgaWYgKHMgPj0gMCAmJiBwWy0xXSA9PSBlb2wpCisgICAgICAgICAg ICAgICAgbmxjb3VudCsrOworICAgICAgICAgICAgICBtYnAgPSBwOworICAgICAgICAgICAgICB0 cmFucyA9IGQtPnRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisg ICAgICAgIHsKKyAgICAgICAgICBidWlsZF9zdGF0ZSAocywgZCk7CisgICAgICAgICAgdHJhbnMg PSBkLT50cmFuczsKKyAgICAgICAgfQorICAgIH0KKworIGRvbmU6CisgIGlmIChjb3VudCkKKyAg ICAqY291bnQgKz0gbmxjb3VudDsKKyAgKmVuZCA9IHNhdmVkX2VuZDsKKyAgcmV0dXJuIChjaGFy ICopIHA7Cit9CisKKy8qIFNwZWNpYWxpemVkIHZlcnNpb25zIG9mIGRmYWV4ZWMgZm9yIG11bHRp Ynl0ZSBhbmQgc2luZ2xlLWJ5dGUgY2FzZXMuCisgICBUaGlzIGlzIGZvciBwZXJmb3JtYW5jZSwg YXMgZGZhZXhlY19tYWluIGlzIGFuIGlubGluZSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBjaGFy ICoKK2RmYWV4ZWNfbWIgKHN0cnVjdCBkZmEgKmQsIGNoYXIgY29uc3QgKmJlZ2luLCBjaGFyICpl bmQsCisgICAgICAgICAgICBib29sIGFsbG93X25sLCBzaXplX3QgKmNvdW50LCBib29sICpiYWNr cmVmKQoreworICByZXR1cm4gZGZhZXhlY19tYWluIChkLCBiZWdpbiwgZW5kLCBhbGxvd19ubCwg Y291bnQsIHRydWUpOworfQorCitzdGF0aWMgY2hhciAqCitkZmFleGVjX3NiIChzdHJ1Y3QgZGZh ICpkLCBjaGFyIGNvbnN0ICpiZWdpbiwgY2hhciAqZW5kLAorICAgICAgICAgICAgYm9vbCBhbGxv d19ubCwgc2l6ZV90ICpjb3VudCwgYm9vbCAqYmFja3JlZikKK3sKKyAgcmV0dXJuIGRmYWV4ZWNf bWFpbiAoZCwgYmVnaW4sIGVuZCwgYWxsb3dfbmwsIGNvdW50LCBmYWxzZSk7Cit9CisKKy8qIEFs d2F5cyBzZXQgKkJBQ0tSRUYgYW5kIHJldHVybiBCRUdJTi4gIFVzZSB0aGlzIHdyYXBwZXIgZm9y CisgICBhbnkgcmVnZXhwIHRoYXQgdXNlcyBhIGNvbnN0cnVjdCBub3Qgc3VwcG9ydGVkIGJ5IHRo aXMgY29kZS4gICovCitzdGF0aWMgY2hhciAqCitkZmFleGVjX25vb3AgKHN0cnVjdCBkZmEgKmQs IGNoYXIgY29uc3QgKmJlZ2luLCBjaGFyICplbmQsCisgICAgICAgICAgICAgIGJvb2wgYWxsb3df bmwsIHNpemVfdCAqY291bnQsIGJvb2wgKmJhY2tyZWYpCit7CisgICpiYWNrcmVmID0gdHJ1ZTsK KyAgcmV0dXJuIChjaGFyICopIGJlZ2luOworfQorCisvKiBMaWtlIGRmYWV4ZWNfbWFpbiAoRCwg QkVHSU4sIEVORCwgQUxMT1dfTkwsIENPVU5ULCBELT5tdWx0aWJ5dGUpLAorICAgYnV0IGZhc3Rl ciBhbmQgc2V0ICpCQUNLUkVGIGlmIHRoZSBERkEgY29kZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMK KyAgIHJlZ2V4cCB1c2FnZS4gICovCisKK2NoYXIgKgorZGZhZXhlYyAoc3RydWN0IGRmYSAqZCwg Y2hhciBjb25zdCAqYmVnaW4sIGNoYXIgKmVuZCwKKyAgICAgICAgIGJvb2wgYWxsb3dfbmwsIHNp emVfdCAqY291bnQsIGJvb2wgKmJhY2tyZWYpCit7CisgIHJldHVybiBkLT5kZmFleGVjIChkLCBi ZWdpbiwgZW5kLCBhbGxvd19ubCwgY291bnQsIGJhY2tyZWYpOworfQorCitzdHJ1Y3QgZGZhICoK K2RmYXN1cGVyc2V0IChzdHJ1Y3QgZGZhIGNvbnN0ICpkKQoreworICByZXR1cm4gZC0+c3VwZXJz ZXQ7Cit9CisKK2Jvb2wKK2RmYWlzZmFzdCAoc3RydWN0IGRmYSBjb25zdCAqZCkKK3sKKyAgcmV0 dXJuIGQtPmZhc3Q7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX21iZGF0YSAoc3RydWN0IGRmYSAq ZCkKK3sKKyAgc2l6ZV90IGk7CisKKyAgZnJlZSAoZC0+bXVsdGlieXRlX3Byb3ApOworCisgIGZv ciAoaSA9IDA7IGkgPCBkLT5ubWJjc2V0czsgKytpKQorICAgIHsKKyAgICAgIHN0cnVjdCBtYl9j aGFyX2NsYXNzZXMgKnAgPSAmKGQtPm1iY3NldHNbaV0pOworICAgICAgZnJlZSAocC0+Y2hhcnMp OworICAgIH0KKworICBmcmVlIChkLT5tYmNzZXRzKTsKKyAgZnJlZSAoZC0+bWJfZm9sbG93cy5l bGVtcyk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudHMgb2YgYSBkZmEgdGhhdCB0 aGUgb3RoZXIgcm91dGluZXMgZG9uJ3QKKyAgIGluaXRpYWxpemUgZm9yIHRoZW1zZWx2ZXMuICAq Lworc3RhdGljIHZvaWQKK2RmYWluaXQgKHN0cnVjdCBkZmEgKmQpCit7CisgIG1lbXNldCAoZCwg MCwgc2l6ZW9mICpkKTsKKyAgZC0+bXVsdGlieXRlID0gTUJfQ1VSX01BWCA+IDE7CisgIGQtPmRm YWV4ZWMgPSBkLT5tdWx0aWJ5dGUgPyBkZmFleGVjX21iIDogZGZhZXhlY19zYjsKKyAgZC0+ZmFz dCA9ICFkLT5tdWx0aWJ5dGU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIGV2ZXJ5IGNvbnN0cnVj dCBpbiBEIGlzIHN1cHBvcnRlZCBieSB0aGlzIERGQSBtYXRjaGVyLiAgKi8KK3N0YXRpYyBib29s IF9HTF9BVFRSSUJVVEVfUFVSRQorZGZhX3N1cHBvcnRlZCAoc3RydWN0IGRmYSBjb25zdCAqZCkK K3sKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkLT50aW5kZXg7IGkrKykKKyAgICB7CisgICAg ICBzd2l0Y2ggKGQtPnRva2Vuc1tpXSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJFR1dPUkQ6 CisgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgY2FzZSBMSU1XT1JEOgorICAgICAgICBj YXNlIE5PVExJTVdPUkQ6CisgICAgICAgICAgaWYgKCFkLT5tdWx0aWJ5dGUpCisgICAgICAgICAg ICBjb250aW51ZTsKKyAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLworCisgICAgICAgIGNhc2Ug QkFDS1JFRjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgICAgcmV0dXJuIGZhbHNlOwor ICAgICAgICB9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK2RmYW9w dGltaXplIChzdHJ1Y3QgZGZhICpkKQoreworICBzaXplX3QgaTsKKyAgYm9vbCBoYXZlX2JhY2ty ZWYgPSBmYWxzZTsKKworICBpZiAoIXVzaW5nX3V0ZjggKCkpCisgICAgcmV0dXJuOworCisgIGZv ciAoaSA9IDA7IGkgPCBkLT50aW5kZXg7ICsraSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGQtPnRv a2Vuc1tpXSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEFOWUNIQVI6CisgICAgICAgICAgLyog TG93ZXJlZC4gICovCisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIGNhc2UgQkFDS1JFRjoK KyAgICAgICAgICBoYXZlX2JhY2tyZWYgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAg ICBjYXNlIE1CQ1NFVDoKKyAgICAgICAgICAvKiBSZXF1aXJlcyBtdWx0aS1ieXRlIGFsZ29yaXRo bS4gICovCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJy ZWFrOworICAgICAgICB9CisgICAgfQorCisgIGlmICghaGF2ZV9iYWNrcmVmICYmIGQtPnN1cGVy c2V0KQorICAgIHsKKyAgICAgIC8qIFRoZSBzdXBlcnNldCBERkEgaXMgbm90IGxpa2VseSB0byBi ZSBtdWNoIGZhc3Rlciwgc28gcmVtb3ZlIGl0LiAgKi8KKyAgICAgIGRmYWZyZWUgKGQtPnN1cGVy c2V0KTsKKyAgICAgIGZyZWUgKGQtPnN1cGVyc2V0KTsKKyAgICAgIGQtPnN1cGVyc2V0ID0gTlVM TDsKKyAgICB9CisKKyAgZnJlZV9tYmRhdGEgKGQpOworICBkLT5tdWx0aWJ5dGUgPSBmYWxzZTsK KyAgZC0+ZGZhZXhlYyA9IGRmYWV4ZWNfc2I7CisgIGQtPmZhc3QgPSB0cnVlOworfQorCitzdGF0 aWMgdm9pZAorZGZhc3NidWlsZCAoc3RydWN0IGRmYSAqZCkKK3sKKyAgc2l6ZV90IGksIGo7Cisg IGNoYXJjbGFzcyBjY2w7CisgIGJvb2wgaGF2ZV9hY2hhciA9IGZhbHNlOworICBib29sIGhhdmVf bmNoYXIgPSBmYWxzZTsKKyAgc3RydWN0IGRmYSAqc3VwID0gZGZhYWxsb2MgKCk7CisKKyAgKnN1 cCA9ICpkOworICBzdXAtPm11bHRpYnl0ZSA9IGZhbHNlOworICBzdXAtPmRmYWV4ZWMgPSBkZmFl eGVjX3NiOworICBzdXAtPm11bHRpYnl0ZV9wcm9wID0gTlVMTDsKKyAgc3VwLT5tYmNzZXRzID0g TlVMTDsKKyAgc3VwLT5zdXBlcnNldCA9IE5VTEw7CisgIHN1cC0+c3RhdGVzID0gTlVMTDsKKyAg c3VwLT5zaW5kZXggPSAwOworICBzdXAtPmZvbGxvd3MgPSBOVUxMOworICBzdXAtPnRyYWxsb2Mg PSAwOworICBzdXAtPnRyYW5zID0gTlVMTDsKKyAgc3VwLT5mYWlscyA9IE5VTEw7CisgIHN1cC0+ c3VjY2VzcyA9IE5VTEw7CisgIHN1cC0+bmV3bGluZXMgPSBOVUxMOworCisgIHN1cC0+Y2hhcmNs YXNzZXMgPSB4bm1hbGxvYyAoc3VwLT5jYWxsb2MsIHNpemVvZiAqc3VwLT5jaGFyY2xhc3Nlcyk7 CisgIGlmIChkLT5jaW5kZXgpCisgICAgeworICAgICAgbWVtY3B5IChzdXAtPmNoYXJjbGFzc2Vz LCBkLT5jaGFyY2xhc3NlcywKKyAgICAgICAgICAgICAgZC0+Y2luZGV4ICogc2l6ZW9mICpzdXAt PmNoYXJjbGFzc2VzKTsKKyAgICB9CisKKyAgc3VwLT50b2tlbnMgPSB4bm1hbGxvYyAoZC0+dGlu ZGV4LCAyICogc2l6ZW9mICpzdXAtPnRva2Vucyk7CisgIHN1cC0+dGFsbG9jID0gZC0+dGluZGV4 ICogMjsKKworICBmb3IgKGkgPSBqID0gMDsgaSA8IGQtPnRpbmRleDsgaSsrKQorICAgIHsKKyAg ICAgIHN3aXRjaCAoZC0+dG9rZW5zW2ldKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQU5ZQ0hB UjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgIGNhc2UgQkFDS1JFRjoKKyAgICAgICAg ICB6ZXJvc2V0IChjY2wpOworICAgICAgICAgIG5vdHNldCAoY2NsKTsKKyAgICAgICAgICBzdXAt PnRva2Vuc1tqKytdID0gQ1NFVCArIGRmYV9jaGFyY2xhc3NfaW5kZXggKHN1cCwgY2NsKTsKKyAg ICAgICAgICBzdXAtPnRva2Vuc1tqKytdID0gU1RBUjsKKyAgICAgICAgICBpZiAoZC0+dG9rZW5z W2kgKyAxXSA9PSBRTUFSSyB8fCBkLT50b2tlbnNbaSArIDFdID09IFNUQVIKKyAgICAgICAgICAg ICAgfHwgZC0+dG9rZW5zW2kgKyAxXSA9PSBQTFVTKQorICAgICAgICAgICAgaSsrOworICAgICAg ICAgIGhhdmVfYWNoYXIgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJF R1dPUkQ6CisgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgY2FzZSBMSU1XT1JEOgorICAg ICAgICBjYXNlIE5PVExJTVdPUkQ6CisgICAgICAgICAgaWYgKGQtPm11bHRpYnl0ZSkKKyAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhlc2UgY29uc3RyYWludHMgYXJlbid0IHN1cHBv cnRlZCBpbiBhIG11bHRpYnl0ZSBsb2NhbGUuCisgICAgICAgICAgICAgICAgIElnbm9yZSB0aGVt IGluIHRoZSBzdXBlcnNldCBERkEuICAqLworICAgICAgICAgICAgICBzdXAtPnRva2Vuc1tqKytd ID0gRU1QVFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBk ZWZhdWx0OgorICAgICAgICAgIHN1cC0+dG9rZW5zW2orK10gPSBkLT50b2tlbnNbaV07CisgICAg ICAgICAgaWYgKCgwIDw9IGQtPnRva2Vuc1tpXSAmJiBkLT50b2tlbnNbaV0gPCBOT1RDSEFSKQor ICAgICAgICAgICAgICB8fCBkLT50b2tlbnNbaV0gPj0gQ1NFVCkKKyAgICAgICAgICAgIGhhdmVf bmNoYXIgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICBzdXAt PnRpbmRleCA9IGo7CisKKyAgaWYgKGhhdmVfbmNoYXIgJiYgKGhhdmVfYWNoYXIgfHwgZC0+bXVs dGlieXRlKSkKKyAgICBkLT5zdXBlcnNldCA9IHN1cDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRm YWZyZWUgKHN1cCk7CisgICAgICBmcmVlIChzdXApOworICAgIH0KK30KKworLyogUGFyc2UgYW5k IGFuYWx5emUgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBnaXZlbiBsZW5ndGguICAqLwordm9pZAor ZGZhY29tcCAoY2hhciBjb25zdCAqcywgc2l6ZV90IGxlbiwgc3RydWN0IGRmYSAqZCwgYm9vbCBz ZWFyY2hmbGFnKQoreworICBkZmFpbml0IChkKTsKKyAgZGZhcGFyc2UgKHMsIGxlbiwgZCk7Cisg IGRmYXNzYnVpbGQgKGQpOworCisgIGlmIChkZmFfc3VwcG9ydGVkIChkKSkKKyAgICB7CisgICAg ICBkZmFvcHRpbWl6ZSAoZCk7CisgICAgICBkZmFhbmFseXplIChkLCBzZWFyY2hmbGFnKTsKKyAg ICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkLT5kZmFleGVjID0gZGZhZXhlY19ub29wOworICAg IH0KKworICBpZiAoZC0+c3VwZXJzZXQpCisgICAgeworICAgICAgZC0+ZmFzdCA9IHRydWU7Cisg ICAgICBkZmFhbmFseXplIChkLT5zdXBlcnNldCwgc2VhcmNoZmxhZyk7CisgICAgfQorfQorCisv KiBGcmVlIHRoZSBzdG9yYWdlIGhlbGQgYnkgdGhlIGNvbXBvbmVudHMgb2YgYSBkZmEuICAqLwor dm9pZAorZGZhZnJlZSAoc3RydWN0IGRmYSAqZCkKK3sKKyAgc2l6ZV90IGk7CisKKyAgZnJlZSAo ZC0+Y2hhcmNsYXNzZXMpOworICBmcmVlIChkLT50b2tlbnMpOworCisgIGlmIChkLT5tdWx0aWJ5 dGUpCisgICAgZnJlZV9tYmRhdGEgKGQpOworCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zaW5kZXg7 ICsraSkKKyAgICB7CisgICAgICBmcmVlIChkLT5zdGF0ZXNbaV0uZWxlbXMuZWxlbXMpOworICAg ICAgZnJlZSAoZC0+c3RhdGVzW2ldLm1icHMuZWxlbXMpOworICAgIH0KKyAgZnJlZSAoZC0+c3Rh dGVzKTsKKworICBpZiAoZC0+Zm9sbG93cykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwg ZC0+dGluZGV4OyArK2kpCisgICAgICAgIGZyZWUgKGQtPmZvbGxvd3NbaV0uZWxlbXMpOworICAg ICAgZnJlZSAoZC0+Zm9sbG93cyk7CisgICAgfQorCisgIGlmIChkLT50cmFucykKKyAgICB7Cisg ICAgICBmb3IgKGkgPSAwOyBpIDwgZC0+dHJhbGxvYzsgKytpKQorICAgICAgICB7CisgICAgICAg ICAgZnJlZSAoZC0+dHJhbnNbaV0pOworICAgICAgICAgIGZyZWUgKGQtPmZhaWxzW2ldKTsKKyAg ICAgICAgfQorCisgICAgICBmcmVlIChkLT50cmFucyAtIDEpOworICAgICAgZnJlZSAoZC0+ZmFp bHMpOworICAgICAgZnJlZSAoZC0+bmV3bGluZXMpOworICAgICAgZnJlZSAoZC0+c3VjY2Vzcyk7 CisgICAgfQorCisgIGlmIChkLT5zdXBlcnNldCkKKyAgICBkZmFmcmVlIChkLT5zdXBlcnNldCk7 Cit9CisKKy8qIEhhdmluZyBmb3VuZCB0aGUgcG9zdGZpeCByZXByZXNlbnRhdGlvbiBvZiB0aGUg cmVndWxhciBleHByZXNzaW9uLAorICAgdHJ5IHRvIGZpbmQgYSBsb25nIHNlcXVlbmNlIG9mIGNo YXJhY3RlcnMgdGhhdCBtdXN0IGFwcGVhciBpbiBhbnkgbGluZQorICAgY29udGFpbmluZyB0aGUg ci5lLgorICAgRmluZGluZyBhICJsb25nZXN0IiBzZXF1ZW5jZSBpcyBiZXlvbmQgdGhlIHNjb3Bl IGhlcmU7CisgICB3ZSB0YWtlIGFuIGVhc3kgd2F5IG91dCBhbmQgaG9wZSBmb3IgdGhlIGJlc3Qu CisgICAoVGFrZSAiKGFifGEpYiItLXBsZWFzZS4pCisKKyAgIFdlIGRvIGEgYm90dG9tLXVwIGNh bGN1bGF0aW9uIG9mIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBhcHBlYXIKKyAg IGluIG1hdGNoZXMgb2Ygci5lLidzIHJlcHJlc2VudGVkIGJ5IHRyZWVzIHJvb3RlZCBhdCB0aGUg bm9kZXMgb2YgdGhlIHBvc3RmaXgKKyAgIHJlcHJlc2VudGF0aW9uOgorICAgICAgICBzZXF1ZW5j ZXMgdGhhdCBtdXN0IGFwcGVhciBhdCB0aGUgbGVmdCBvZiB0aGUgbWF0Y2ggKCJsZWZ0IikKKyAg ICAgICAgc2VxdWVuY2VzIHRoYXQgbXVzdCBhcHBlYXIgYXQgdGhlIHJpZ2h0IG9mIHRoZSBtYXRj aCAoInJpZ2h0IikKKyAgICAgICAgbGlzdHMgb2Ygc2VxdWVuY2VzIHRoYXQgbXVzdCBhcHBlYXIg c29tZXdoZXJlIGluIHRoZSBtYXRjaCAoImluIikKKyAgICAgICAgc2VxdWVuY2VzIHRoYXQgbXVz dCBjb25zdGl0dXRlIHRoZSBtYXRjaCAoImlzIikKKworICAgV2hlbiB3ZSBnZXQgdG8gdGhlIHJv b3Qgb2YgdGhlIHRyZWUsIHdlIHVzZSBvbmUgb2YgdGhlIGxvbmdlc3Qgb2YgaXRzCisgICBjYWxj dWxhdGVkICJpbiIgc2VxdWVuY2VzIGFzIG91ciBhbnN3ZXIuCisKKyAgIFRoZSBzZXF1ZW5jZXMg Y2FsY3VsYXRlZCBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2Ygbm9kZSAoaW4gcHNldWRvIEFOU0kg YykKKyAgIGFyZSBzaG93biBiZWxvdy4gICJwIiBpcyB0aGUgb3BlcmFuZCBvZiB1bmFyeSBvcGVy YXRvcnMgKGFuZCB0aGUgbGVmdC1oYW5kCisgICBvcGVyYW5kIG9mIGJpbmFyeSBvcGVyYXRvcnMp OyAicSIgaXMgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBvZiBiaW5hcnkKKyAgIG9wZXJhdG9ycy4K KworICAgIlpFUk8iIG1lYW5zICJhIHplcm8tbGVuZ3RoIHNlcXVlbmNlIiBiZWxvdy4KKworICAg ICAgICBUeXBlCWxlZnQJCXJpZ2h0CQlpcwkJaW4KKyAgICAgICAgLS0tLQktLS0tCQktLS0tLQkJ LS0JCS0tCisgICAgICAgIGNoYXIgYwkjIGMJCSMgYwkJIyBjCQkjIGMKKworICAgICAgICBBTllD SEFSCVpFUk8JCVpFUk8JCVpFUk8JCVpFUk8KKworICAgICAgICBNQkNTRVQJWkVSTwkJWkVSTwkJ WkVSTwkJWkVSTworCisgICAgICAgIENTRVQJWkVSTwkJWkVSTwkJWkVSTwkJWkVSTworCisgICAg ICAgIFNUQVIJWkVSTwkJWkVSTwkJWkVSTwkJWkVSTworCisgICAgICAgIFFNQVJLCVpFUk8JCVpF Uk8JCVpFUk8JCVpFUk8KKworICAgICAgICBQTFVTCXAtPmxlZnQJCXAtPnJpZ2h0CVpFUk8JCXAt PmluCisKKyAgICAgICAgQ0FUCShwLT5pcz09WkVSTyk/CShxLT5pcz09WkVSTyk/CShwLT5pcyE9 WkVSTyAmJglwLT5pbiBwbHVzCisgICAgICAgICAgICAgICAgcC0+bGVmdCA6CXEtPnJpZ2h0IDoJ cS0+aXMhPVpFUk8pID8JcS0+aW4gcGx1cworICAgICAgICAgICAgICAgIHAtPmlzIyNxLT5sZWZ0 CXAtPnJpZ2h0IyNxLT5pcwlwLT5pcyMjcS0+aXMgOiBwLT5yaWdodCMjcS0+bGVmdAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTworCisgICAgICAg IE9SCWxvbmdlc3QgY29tbW9uCWxvbmdlc3QgY29tbW9uCShkbyBwLT5pcyBhbmQgc3Vic3RyaW5n cyBjb21tb24KKyAgICAgICAgICAgICAgICBsZWFkaW5nCQl0cmFpbGluZwl0byBxLT5pcyBoYXZl IHNhbWUgcC0+aW4gYW5kCisgICAgICAgICAgICAgICAgKHN1YilzZXF1ZW5jZQkoc3ViKXNlcXVl bmNlCXEtPmluIGxlbmd0aCBhbmQgY29udGVudCkgPworICAgICAgICAgICAgICAgIG9mIHAtPmxl ZnQJb2YgcC0+cmlnaHQKKyAgICAgICAgICAgICAgICBhbmQgcS0+bGVmdAlhbmQgcS0+cmlnaHQJ cC0+aXMgOiBOVUxMCisKKyAgIElmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZSB3ZSByZWNvZ25pemUg aW4gdGhlIHRyZWUsIGFsbCBmb3VyIHNlcXVlbmNlcyBnZXQgc2V0CisgICB0byB6ZXJvLWxlbmd0 aCBzZXF1ZW5jZXMuICBJZiB0aGVyZSdzIHNvbWV0aGluZyB3ZSBkb24ndCByZWNvZ25pemUgaW4g dGhlCisgICB0cmVlLCB3ZSBqdXN0IHJldHVybiBhIHplcm8tbGVuZ3RoIHNlcXVlbmNlLgorCisg ICBCcmVhayB0aWVzIGluIGZhdm9yIG9mIGluZnJlcXVlbnQgbGV0dGVycyAoY2hvb3NpbmcgJ3p6 eicgaW4gcHJlZmVyZW5jZSB0bworICAgJ2FhYScpPworCisgICBBbmQgLi4uIGlzIGl0IGhlcmUg b3Igc29tZXBsYWNlIHRoYXQgd2UgbWlnaHQgcG9uZGVyICJvcHRpbWl6YXRpb25zIiBzdWNoIGFz CisgICAgICAgIGVncmVwICdwc2l8ZXBzaWxvbicJLT4JZWdyZXAgJ3BzaScKKyAgICAgICAgZWdy ZXAgJ3BlcHNpfGVwc2lsb24nCS0+CWVncmVwICdlcHNpJworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChZZXMsIHdlIG5vdyBmaW5kICJlcHNpIiBhcyBhICJzdHJpbmcK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG11c3Qgb2NjdXIi LCBidXQgd2UgbWlnaHQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpbXBsaWZ5IHRoZSAqZW50aXJlKiByLmUuIGJlaW5nIHNvdWdodCkKKyAgICAgICAgZ3Jl cCAnW2NdJwkJLT4JZ3JlcCAnYycKKyAgICAgICAgZ3JlcCAnKGFifGEpYicJCS0+CWdyZXAgJ2Fi JworICAgICAgICBncmVwICdhYionCQktPglncmVwICdhJworICAgICAgICBncmVwICdhKmInCQkt PglncmVwICdiJworCisgICBUaGVyZSBhcmUgc2V2ZXJhbCBpc3N1ZXM6CisKKyAgIElzIG9wdGlt aXphdGlvbiBlYXN5IChlbm91Z2gpPworCisgICBEb2VzIG9wdGltaXphdGlvbiBhY3R1YWxseSBh Y2NvbXBsaXNoIGFueXRoaW5nLAorICAgb3IgaXMgdGhlIGF1dG9tYXRvbiB5b3UgZ2V0IGZyb20g InBzaXxlcHNpbG9uIiAoZm9yIGV4YW1wbGUpCisgICB0aGUgc2FtZSBhcyB0aGUgb25lIHlvdSBn ZXQgZnJvbSAicHNpIiAoZm9yIGV4YW1wbGUpPworCisgICBBcmUgb3B0aW1pemFibGUgci5lLidz IGxpa2VseSB0byBiZSB1c2VkIGluIHJlYWwtbGlmZSBzaXR1YXRpb25zCisgICAoc29tZXRoaW5n IGxpa2UgJ2FiKicgaXMgcHJvYmFibHkgdW5saWtlbHk7IHNvbWV0aGluZyBsaWtlIGlzCisgICAn cHNpfGVwc2lsb24nIGlzIGxpa2VsaWVyKT8gICovCisKK3N0YXRpYyBjaGFyICoKK2ljYXRhbGxv YyAoY2hhciAqb2xkLCBjaGFyIGNvbnN0ICpuZXcpCit7CisgIGNoYXIgKnJlc3VsdDsKKyAgc2l6 ZV90IG9sZHNpemU7CisgIHNpemVfdCBuZXdzaXplID0gc3RybGVuIChuZXcpOworICBpZiAobmV3 c2l6ZSA9PSAwKQorICAgIHJldHVybiBvbGQ7CisgIG9sZHNpemUgPSBzdHJsZW4gKG9sZCk7Cisg IHJlc3VsdCA9IHhyZWFsbG9jIChvbGQsIG9sZHNpemUgKyBuZXdzaXplICsgMSk7CisgIG1lbWNw eSAocmVzdWx0ICsgb2xkc2l6ZSwgbmV3LCBuZXdzaXplICsgMSk7CisgIHJldHVybiByZXN1bHQ7 Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlbGlzdCAoY2hhciAqKmNwcCkKK3sKKyAgd2hpbGUgKCpj cHApCisgICAgZnJlZSAoKmNwcCsrKTsKK30KKworc3RhdGljIGNoYXIgKioKK2VubGlzdCAoY2hh ciAqKmNwcCwgY2hhciAqbmV3LCBzaXplX3QgbGVuKQoreworICBzaXplX3QgaSwgajsKKyAgbmV3 ID0gbWVtY3B5ICh4bWFsbG9jIChsZW4gKyAxKSwgbmV3LCBsZW4pOworICBuZXdbbGVuXSA9ICdc MCc7CisgIC8qIElzIHRoZXJlIGFscmVhZHkgc29tZXRoaW5nIGluIHRoZSBsaXN0IHRoYXQncyBu ZXcgKG9yIGxvbmdlcik/ICAqLworICBmb3IgKGkgPSAwOyBjcHBbaV0gIT0gTlVMTDsgKytpKQor ICAgIGlmIChzdHJzdHIgKGNwcFtpXSwgbmV3KSAhPSBOVUxMKQorICAgICAgeworICAgICAgICBm cmVlIChuZXcpOworICAgICAgICByZXR1cm4gY3BwOworICAgICAgfQorICAvKiBFbGltaW5hdGUg YW55IG9ic29sZXRlZCBzdHJpbmdzLiAgKi8KKyAgaiA9IDA7CisgIHdoaWxlIChjcHBbal0gIT0g TlVMTCkKKyAgICBpZiAoc3Ryc3RyIChuZXcsIGNwcFtqXSkgPT0gTlVMTCkKKyAgICAgICsrajsK KyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZWUgKGNwcFtqXSk7CisgICAgICAgIGlmICgt LWkgPT0gaikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY3BwW2pdID0gY3BwW2ldOworICAg ICAgICBjcHBbaV0gPSBOVUxMOworICAgICAgfQorICAvKiBBZGQgdGhlIG5ldyBzdHJpbmcuICAq LworICBjcHAgPSB4bnJlYWxsb2MgKGNwcCwgaSArIDIsIHNpemVvZiAqY3BwKTsKKyAgY3BwW2ld ID0gbmV3OworICBjcHBbaSArIDFdID0gTlVMTDsKKyAgcmV0dXJuIGNwcDsKK30KKworLyogR2l2 ZW4gcG9pbnRlcnMgdG8gdHdvIHN0cmluZ3MsIHJldHVybiBhIHBvaW50ZXIgdG8gYW4gYWxsb2Nh dGVkCisgICBsaXN0IG9mIHRoZWlyIGRpc3RpbmN0IGNvbW1vbiBzdWJzdHJpbmdzLiAgKi8KK3N0 YXRpYyBjaGFyICoqCitjb21zdWJzIChjaGFyICpsZWZ0LCBjaGFyIGNvbnN0ICpyaWdodCkKK3sK KyAgY2hhciAqKmNwcCA9IHh6YWxsb2MgKHNpemVvZiAqY3BwKTsKKyAgY2hhciAqbGNwOworCisg IGZvciAobGNwID0gbGVmdDsgKmxjcCAhPSAnXDAnOyArK2xjcCkKKyAgICB7CisgICAgICBzaXpl X3QgbGVuID0gMDsKKyAgICAgIGNoYXIgKnJjcCA9IHN0cmNociAocmlnaHQsICpsY3ApOworICAg ICAgd2hpbGUgKHJjcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IGk7Cisg ICAgICAgICAgZm9yIChpID0gMTsgbGNwW2ldICE9ICdcMCcgJiYgbGNwW2ldID09IHJjcFtpXTsg KytpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKGkgPiBsZW4pCisgICAg ICAgICAgICBsZW4gPSBpOworICAgICAgICAgIHJjcCA9IHN0cmNociAocmNwICsgMSwgKmxjcCk7 CisgICAgICAgIH0KKyAgICAgIGlmIChsZW4gIT0gMCkKKyAgICAgICAgY3BwID0gZW5saXN0IChj cHAsIGxjcCwgbGVuKTsKKyAgICB9CisgIHJldHVybiBjcHA7Cit9CisKK3N0YXRpYyBjaGFyICoq CithZGRsaXN0cyAoY2hhciAqKm9sZCwgY2hhciAqKm5ldykKK3sKKyAgZm9yICg7ICpuZXc7IG5l dysrKQorICAgIG9sZCA9IGVubGlzdCAob2xkLCAqbmV3LCBzdHJsZW4gKCpuZXcpKTsKKyAgcmV0 dXJuIG9sZDsKK30KKworLyogR2l2ZW4gdHdvIGxpc3RzIG9mIHN1YnN0cmluZ3MsIHJldHVybiBh IG5ldyBsaXN0IGdpdmluZyBzdWJzdHJpbmdzCisgICBjb21tb24gdG8gYm90aC4gICovCitzdGF0 aWMgY2hhciAqKgoraW5ib3RoIChjaGFyICoqbGVmdCwgY2hhciAqKnJpZ2h0KQoreworICBjaGFy ICoqYm90aCA9IHh6YWxsb2MgKHNpemVvZiAqYm90aCk7CisgIHNpemVfdCBsbnVtLCBybnVtOwor CisgIGZvciAobG51bSA9IDA7IGxlZnRbbG51bV0gIT0gTlVMTDsgKytsbnVtKQorICAgIHsKKyAg ICAgIGZvciAocm51bSA9IDA7IHJpZ2h0W3JudW1dICE9IE5VTEw7ICsrcm51bSkKKyAgICAgICAg eworICAgICAgICAgIGNoYXIgKip0ZW1wID0gY29tc3VicyAobGVmdFtsbnVtXSwgcmlnaHRbcm51 bV0pOworICAgICAgICAgIGJvdGggPSBhZGRsaXN0cyAoYm90aCwgdGVtcCk7CisgICAgICAgICAg ZnJlZWxpc3QgKHRlbXApOworICAgICAgICAgIGZyZWUgKHRlbXApOworICAgICAgICB9CisgICAg fQorICByZXR1cm4gYm90aDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgbXVzdCBtdXN0OworCitzdHJ1 Y3QgbXVzdAoreworICBjaGFyICoqaW47CisgIGNoYXIgKmxlZnQ7CisgIGNoYXIgKnJpZ2h0Owor ICBjaGFyICppczsKKyAgYm9vbCBiZWdsaW5lOworICBib29sIGVuZGxpbmU7CisgIG11c3QgKnBy ZXY7Cit9OworCitzdGF0aWMgbXVzdCAqCithbGxvY211c3QgKG11c3QgKm1wLCBzaXplX3Qgc2l6 ZSkKK3sKKyAgbXVzdCAqbmV3X21wID0geG1hbGxvYyAoc2l6ZW9mICpuZXdfbXApOworICBuZXdf bXAtPmluID0geHphbGxvYyAoc2l6ZW9mICpuZXdfbXAtPmluKTsKKyAgbmV3X21wLT5sZWZ0ID0g eHphbGxvYyAoc2l6ZSk7CisgIG5ld19tcC0+cmlnaHQgPSB4emFsbG9jIChzaXplKTsKKyAgbmV3 X21wLT5pcyA9IHh6YWxsb2MgKHNpemUpOworICBuZXdfbXAtPmJlZ2xpbmUgPSBmYWxzZTsKKyAg bmV3X21wLT5lbmRsaW5lID0gZmFsc2U7CisgIG5ld19tcC0+cHJldiA9IG1wOworICByZXR1cm4g bmV3X21wOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRtdXN0IChtdXN0ICptcCkKK3sKKyAgZnJl ZWxpc3QgKG1wLT5pbik7CisgIG1wLT5pblswXSA9IE5VTEw7CisgIG1wLT5sZWZ0WzBdID0gbXAt PnJpZ2h0WzBdID0gbXAtPmlzWzBdID0gJ1wwJzsKKyAgbXAtPmJlZ2xpbmUgPSBmYWxzZTsKKyAg bXAtPmVuZGxpbmUgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVtdXN0IChtdXN0ICpt cCkKK3sKKyAgZnJlZWxpc3QgKG1wLT5pbik7CisgIGZyZWUgKG1wLT5pbik7CisgIGZyZWUgKG1w LT5sZWZ0KTsKKyAgZnJlZSAobXAtPnJpZ2h0KTsKKyAgZnJlZSAobXAtPmlzKTsKKyAgZnJlZSAo bXApOworfQorCitzdHJ1Y3QgZGZhbXVzdCAqCitkZmFtdXN0IChzdHJ1Y3QgZGZhIGNvbnN0ICpk KQoreworICBtdXN0ICptcCA9IE5VTEw7CisgIGNoYXIgY29uc3QgKnJlc3VsdCA9ICIiOworICBz aXplX3QgaTsKKyAgYm9vbCBleGFjdCA9IGZhbHNlOworICBib29sIGJlZ2xpbmUgPSBmYWxzZTsK KyAgYm9vbCBlbmRsaW5lID0gZmFsc2U7CisgIGJvb2wgbmVlZF9iZWdsaW5lID0gZmFsc2U7Cisg IGJvb2wgbmVlZF9lbmRsaW5lID0gZmFsc2U7CisgIGJvb2wgY2FzZV9mb2xkX3VuaWJ5dGUgPSBj YXNlX2ZvbGQgJiYgTUJfQ1VSX01BWCA9PSAxOworCisgIGZvciAoc2l6ZV90IHJpID0gMDsgcmkg PCBkLT50aW5kZXg7ICsrcmkpCisgICAgeworICAgICAgdG9rZW4gdCA9IGQtPnRva2Vuc1tyaV07 CisgICAgICBzd2l0Y2ggKHQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCRUdMSU5FOgorICAg ICAgICAgIG1wID0gYWxsb2NtdXN0IChtcCwgMik7CisgICAgICAgICAgbXAtPmJlZ2xpbmUgPSB0 cnVlOworICAgICAgICAgIG5lZWRfYmVnbGluZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7Cisg ICAgICAgIGNhc2UgRU5ETElORToKKyAgICAgICAgICBtcCA9IGFsbG9jbXVzdCAobXAsIDIpOwor ICAgICAgICAgIG1wLT5lbmRsaW5lID0gdHJ1ZTsKKyAgICAgICAgICBuZWVkX2VuZGxpbmUgPSB0 cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExQQVJFTjoKKyAgICAgICAgY2Fz ZSBSUEFSRU46CisgICAgICAgICAgYXNzZXJ0ICghIm5laXRoZXIgTFBBUkVOIG5vciBSUEFSRU4g bWF5IGFwcGVhciBoZXJlIik7CisKKyAgICAgICAgY2FzZSBFTVBUWToKKyAgICAgICAgY2FzZSBC RUdXT1JEOgorICAgICAgICBjYXNlIEVORFdPUkQ6CisgICAgICAgIGNhc2UgTElNV09SRDoKKyAg ICAgICAgY2FzZSBOT1RMSU1XT1JEOgorICAgICAgICBjYXNlIEJBQ0tSRUY6CisgICAgICAgIGNh c2UgQU5ZQ0hBUjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgICAgbXAgPSBhbGxvY211 c3QgKG1wLCAyKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVI6CisgICAg ICAgIGNhc2UgUU1BUks6CisgICAgICAgICAgcmVzZXRtdXN0IChtcCk7CisgICAgICAgICAgYnJl YWs7CisKKyAgICAgICAgY2FzZSBPUjoKKyAgICAgICAgICB7CisgICAgICAgICAgICBjaGFyICoq bmV3OworICAgICAgICAgICAgbXVzdCAqcm1wID0gbXA7CisgICAgICAgICAgICBtdXN0ICpsbXAg PSBtcCA9IG1wLT5wcmV2OworICAgICAgICAgICAgc2l6ZV90IGosIGxuLCBybiwgbjsKKworICAg ICAgICAgICAgLyogR3VhcmFudGVlZCB0byBiZS4gIFVubGlrZWx5LCBidXQgLi4uICAqLworICAg ICAgICAgICAgaWYgKFNUUkVRIChsbXAtPmlzLCBybXAtPmlzKSkKKyAgICAgICAgICAgICAgewor ICAgICAgICAgICAgICAgIGxtcC0+YmVnbGluZSAmPSBybXAtPmJlZ2xpbmU7CisgICAgICAgICAg ICAgICAgbG1wLT5lbmRsaW5lICY9IHJtcC0+ZW5kbGluZTsKKyAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG1wLT5pc1sw XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgbG1wLT5iZWdsaW5lID0gZmFsc2U7CisgICAgICAg ICAgICAgICAgbG1wLT5lbmRsaW5lID0gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIC8qIExlZnQgc2lkZS0tZWFzeSAqLworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAg ICB3aGlsZSAobG1wLT5sZWZ0W2ldICE9ICdcMCcgJiYgbG1wLT5sZWZ0W2ldID09IHJtcC0+bGVm dFtpXSkKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgbG1wLT5sZWZ0W2ldID0gJ1ww JzsKKyAgICAgICAgICAgIC8qIFJpZ2h0IHNpZGUgKi8KKyAgICAgICAgICAgIGxuID0gc3RybGVu IChsbXAtPnJpZ2h0KTsKKyAgICAgICAgICAgIHJuID0gc3RybGVuIChybXAtPnJpZ2h0KTsKKyAg ICAgICAgICAgIG4gPSBsbjsKKyAgICAgICAgICAgIGlmIChuID4gcm4pCisgICAgICAgICAgICAg IG4gPSBybjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgICAg ICAgIGlmIChsbXAtPnJpZ2h0W2xuIC0gaSAtIDFdICE9IHJtcC0+cmlnaHRbcm4gLSBpIC0gMV0p CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsg KytqKQorICAgICAgICAgICAgICBsbXAtPnJpZ2h0W2pdID0gbG1wLT5yaWdodFsobG4gLSBpKSAr IGpdOworICAgICAgICAgICAgbG1wLT5yaWdodFtqXSA9ICdcMCc7CisgICAgICAgICAgICBuZXcg PSBpbmJvdGggKGxtcC0+aW4sIHJtcC0+aW4pOworICAgICAgICAgICAgZnJlZWxpc3QgKGxtcC0+ aW4pOworICAgICAgICAgICAgZnJlZSAobG1wLT5pbik7CisgICAgICAgICAgICBsbXAtPmluID0g bmV3OworICAgICAgICAgICAgZnJlZW11c3QgKHJtcCk7CisgICAgICAgICAgfQorICAgICAgICAg IGJyZWFrOworCisgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICBtcC0+aXNbMF0gPSAnXDAn OworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5EOgorICAgICAgICAgIGFzc2Vy dCAoIW1wLT5wcmV2KTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBtcC0+aW5baV0gIT0gTlVMTDsg KytpKQorICAgICAgICAgICAgaWYgKHN0cmxlbiAobXAtPmluW2ldKSA+IHN0cmxlbiAocmVzdWx0 KSkKKyAgICAgICAgICAgICAgcmVzdWx0ID0gbXAtPmluW2ldOworICAgICAgICAgIGlmIChTVFJF USAocmVzdWx0LCBtcC0+aXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKCFu ZWVkX2JlZ2xpbmUgfHwgbXAtPmJlZ2xpbmUpICYmICghbmVlZF9lbmRsaW5lCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1wLT5lbmRsaW5l KSkKKyAgICAgICAgICAgICAgICBleGFjdCA9IHRydWU7CisgICAgICAgICAgICAgIGJlZ2xpbmUg PSBtcC0+YmVnbGluZTsKKyAgICAgICAgICAgICAgZW5kbGluZSA9IG1wLT5lbmRsaW5lOworICAg ICAgICAgICAgfQorICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICBjYXNlIENBVDoKKyAg ICAgICAgICB7CisgICAgICAgICAgICBtdXN0ICpybXAgPSBtcDsKKyAgICAgICAgICAgIG11c3Qg KmxtcCA9IG1wID0gbXAtPnByZXY7CisKKyAgICAgICAgICAgIC8qIEluLiAgRXZlcnl0aGluZyBp biBsZWZ0LCBwbHVzIGV2ZXJ5dGhpbmcgaW4KKyAgICAgICAgICAgICAgIHJpZ2h0LCBwbHVzIGNv bmNhdGVuYXRpb24gb2YKKyAgICAgICAgICAgICAgIGxlZnQncyByaWdodCBhbmQgcmlnaHQncyBs ZWZ0LiAgKi8KKyAgICAgICAgICAgIGxtcC0+aW4gPSBhZGRsaXN0cyAobG1wLT5pbiwgcm1wLT5p bik7CisgICAgICAgICAgICBpZiAobG1wLT5yaWdodFswXSAhPSAnXDAnICYmIHJtcC0+bGVmdFsw XSAhPSAnXDAnKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxybGVu ID0gc3RybGVuIChsbXAtPnJpZ2h0KTsKKyAgICAgICAgICAgICAgICBzaXplX3QgcmxsZW4gPSBz dHJsZW4gKHJtcC0+bGVmdCk7CisgICAgICAgICAgICAgICAgY2hhciAqdHAgPSB4bWFsbG9jIChs cmxlbiArIHJsbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkgKHRwLCBsbXAtPnJpZ2h0LCBs cmxlbik7CisgICAgICAgICAgICAgICAgbWVtY3B5ICh0cCArIGxybGVuLCBybXAtPmxlZnQsIHJs bGVuKTsKKyAgICAgICAgICAgICAgICBsbXAtPmluID0gZW5saXN0IChsbXAtPmluLCB0cCwgbHJs ZW4gKyBybGxlbik7CisgICAgICAgICAgICAgICAgZnJlZSAodHApOworICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAvKiBMZWZ0LWhhbmQgKi8KKyAgICAgICAgICAgIGlmIChsbXAtPmlzWzBd ICE9ICdcMCcpCisgICAgICAgICAgICAgIGxtcC0+bGVmdCA9IGljYXRhbGxvYyAobG1wLT5sZWZ0 LCBybXAtPmxlZnQpOworICAgICAgICAgICAgLyogUmlnaHQtaGFuZCAqLworICAgICAgICAgICAg aWYgKHJtcC0+aXNbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgbG1wLT5yaWdodFswXSA9ICdc MCc7CisgICAgICAgICAgICBsbXAtPnJpZ2h0ID0gaWNhdGFsbG9jIChsbXAtPnJpZ2h0LCBybXAt PnJpZ2h0KTsKKyAgICAgICAgICAgIC8qIEd1YXJhbnRlZWQgdG8gYmUgKi8KKyAgICAgICAgICAg IGlmICgobG1wLT5pc1swXSAhPSAnXDAnIHx8IGxtcC0+YmVnbGluZSkKKyAgICAgICAgICAgICAg ICAmJiAocm1wLT5pc1swXSAhPSAnXDAnIHx8IHJtcC0+ZW5kbGluZSkpCisgICAgICAgICAgICAg IHsKKyAgICAgICAgICAgICAgICBsbXAtPmlzID0gaWNhdGFsbG9jIChsbXAtPmlzLCBybXAtPmlz KTsKKyAgICAgICAgICAgICAgICBsbXAtPmVuZGxpbmUgPSBybXAtPmVuZGxpbmU7CisgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgIGxtcC0+aXNbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGxtcC0+YmVnbGluZSA9IGZh bHNlOworICAgICAgICAgICAgICAgIGxtcC0+ZW5kbGluZSA9IGZhbHNlOworICAgICAgICAgICAg ICB9CisgICAgICAgICAgICBmcmVlbXVzdCAocm1wKTsKKyAgICAgICAgICB9CisgICAgICAgICAg YnJlYWs7CisKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgIC8qIE5vdCBvbiAqbXkqIHNo aWZ0LiAgKi8KKyAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg ICAgICBpZiAoQ1NFVCA8PSB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBJZiBU IGlzIGEgc2luZ2xldG9uLCBvciBpZiBjYXNlLWZvbGRpbmcgaW4gYSB1bmlieXRlCisgICAgICAg ICAgICAgICAgIGxvY2FsZSBhbmQgVCdzIG1lbWJlcnMgYWxsIGNhc2UtZm9sZCB0byB0aGUgc2Ft ZSBjaGFyLAorICAgICAgICAgICAgICAgICBjb252ZXJ0IFQgdG8gb25lIG9mIGl0cyBtZW1iZXJz LiAgT3RoZXJ3aXNlLCBkbworICAgICAgICAgICAgICAgICBub3RoaW5nIGZ1cnRoZXIgd2l0aCBU LiAgKi8KKyAgICAgICAgICAgICAgY2hhcmNsYXNzICpjY2wgPSAmZC0+Y2hhcmNsYXNzZXNbdCAt IENTRVRdOworICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsg aiA8IE5PVENIQVI7IGorKykKKyAgICAgICAgICAgICAgICBpZiAodHN0Yml0IChqLCAqY2NsKSkK KyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBpZiAoISAoaiA8IE5PVENI QVIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1wID0gYWxsb2NtdXN0 IChtcCwgMik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICAgIHQgPSBqOworICAgICAgICAgICAgICB3aGlsZSAoKytqIDwgTk9UQ0hBUikK KyAgICAgICAgICAgICAgICBpZiAodHN0Yml0IChqLCAqY2NsKQorICAgICAgICAgICAgICAgICAg ICAmJiAhIChjYXNlX2ZvbGRfdW5pYnl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0 b3VwcGVyIChqKSA9PSB0b3VwcGVyICh0KSkpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgICAgICAgaWYgKGogPCBOT1RDSEFSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAg ICAgICAgICAgIG1wID0gYWxsb2NtdXN0IChtcCwgMik7CisgICAgICAgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBzaXplX3Qg cmogPSByaSArIDI7CisgICAgICAgICAgaWYgKGQtPnRva2Vuc1tyaSArIDFdID09IENBVCkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yICg7IHJqIDwgZC0+dGluZGV4IC0gMTsgcmog Kz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoKHJqICE9IHJp ICYmIChkLT50b2tlbnNbcmpdIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHx8IE5PVENIQVIgPD0gZC0+dG9rZW5zW3JqXSkpCisgICAgICAgICAgICAgICAgICAgICAg fHwgZC0+dG9rZW5zW3JqICsgMV0gIT0gQ0FUKQorICAgICAgICAgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgbXAgPSBhbGxvY211 c3QgKG1wLCAoKHJqIC0gcmkpID4+IDEpICsgMSk7CisgICAgICAgICAgbXAtPmlzWzBdID0gbXAt PmxlZnRbMF0gPSBtcC0+cmlnaHRbMF0KKyAgICAgICAgICAgID0gY2FzZV9mb2xkX3VuaWJ5dGUg PyB0b3VwcGVyICh0KSA6IHQ7CisKKyAgICAgICAgICBmb3IgKGkgPSAxOyByaSArIDIgPCByajsg aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByaSArPSAyOworICAgICAgICAgICAg ICB0ID0gZC0+dG9rZW5zW3JpXTsKKyAgICAgICAgICAgICAgbXAtPmlzW2ldID0gbXAtPmxlZnRb aV0gPSBtcC0+cmlnaHRbaV0KKyAgICAgICAgICAgICAgICA9IGNhc2VfZm9sZF91bmlieXRlID8g dG91cHBlciAodCkgOiB0OworICAgICAgICAgICAgfQorICAgICAgICAgIG1wLT5pc1tpXSA9IG1w LT5sZWZ0W2ldID0gbXAtPnJpZ2h0W2ldID0gJ1wwJzsKKyAgICAgICAgICBtcC0+aW4gPSBlbmxp c3QgKG1wLT5pbiwgbXAtPmlzLCBpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg IH0KKyBkb25lOjsKKworICBzdHJ1Y3QgZGZhbXVzdCAqZG0gPSBOVUxMOworICBpZiAoKnJlc3Vs dCkKKyAgICB7CisgICAgICBkbSA9IHhtYWxsb2MgKHNpemVvZiAqZG0pOworICAgICAgZG0tPmV4 YWN0ID0gZXhhY3Q7CisgICAgICBkbS0+YmVnbGluZSA9IGJlZ2xpbmU7CisgICAgICBkbS0+ZW5k bGluZSA9IGVuZGxpbmU7CisgICAgICBkbS0+bXVzdCA9IHhzdHJkdXAgKHJlc3VsdCk7CisgICAg fQorCisgIHdoaWxlIChtcCkKKyAgICB7CisgICAgICBtdXN0ICpwcmV2ID0gbXAtPnByZXY7Cisg ICAgICBmcmVlbXVzdCAobXApOworICAgICAgbXAgPSBwcmV2OworICAgIH0KKworICByZXR1cm4g ZG07Cit9CisKK3ZvaWQKK2RmYW11c3RmcmVlIChzdHJ1Y3QgZGZhbXVzdCAqZG0pCit7CisgIGZy ZWUgKGRtLT5tdXN0KTsKKyAgZnJlZSAoZG0pOworfQorCitzdHJ1Y3QgZGZhICoKK2RmYWFsbG9j ICh2b2lkKQoreworICByZXR1cm4geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGZhKSk7Cit9CisK Ky8qIHZpbTpzZXQgc2hpZnR3aWR0aD0yOiAqLwpkaWZmIC0tZ2l0IGEvc2VkL2RmYS5oIGIvc2Vk L2RmYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGEwZTQKLS0tIC9k ZXYvbnVsbAorKysgYi9zZWQvZGZhLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIGRmYS5oIC0gZGVj bGFyYXRpb25zIGZvciBHTlUgZGV0ZXJtaW5pc3RpYyByZWdleHAgY29tcGlsZXIKKyAgIENvcHly aWdodCAoQykgMTk4OCwgMTk5OCwgMjAwNywgMjAwOS0yMDE2IEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlv bikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJD SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl CisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZ b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhl IEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJl ZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBICovCisKKy8qIFdy aXR0ZW4gSnVuZSwgMTk4OCBieSBNaWtlIEhhZXJ0ZWwgKi8KKworI2luY2x1ZGUgPHJlZ2V4Lmg+ CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAi eGFsbG9jLmgiIC8qIGZvciBfR0xfQVRUUklCVVRFX01BTExPQyAqLworCisvKiBFbGVtZW50IG9m IGEgbGlzdCBvZiBzdHJpbmdzLCBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMga25vd24gdG8KKyAg IGFwcGVhciBpbiBhbnkgUi5FLiBtYXRjaGluZyB0aGUgREZBLiAqLworc3RydWN0IGRmYW11c3QK K3sKKyAgYm9vbCBleGFjdDsKKyAgYm9vbCBiZWdsaW5lOworICBib29sIGVuZGxpbmU7CisgIGNo YXIgKm11c3Q7Cit9OworCisvKiBUaGUgZGZhIHN0cnVjdHVyZS4gSXQgaXMgY29tcGxldGVseSBv cGFxdWUuICovCitzdHJ1Y3QgZGZhOworCisvKiBFbnRyeSBwb2ludHMuICovCisKKy8qIEFsbG9j YXRlIGEgc3RydWN0IGRmYS4gIFRoZSBzdHJ1Y3QgZGZhIGlzIGNvbXBsZXRlbHkgb3BhcXVlLgor ICAgVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIHBhc3NlZCBkaXJlY3RseSB0byBmcmVl KCkgYWZ0ZXIKKyAgIGNhbGxpbmcgZGZhZnJlZSgpIG9uIGl0LiAqLworZXh0ZXJuIHN0cnVjdCBk ZmEgKmRmYWFsbG9jICh2b2lkKSBfR0xfQVRUUklCVVRFX01BTExPQzsKKworLyogQnVpbGQgYW5k IHJldHVybiB0aGUgc3RydWN0IGRmYW11c3QgZnJvbSB0aGUgZ2l2ZW4gc3RydWN0IGRmYS4gKi8K K2V4dGVybiBzdHJ1Y3QgZGZhbXVzdCAqZGZhbXVzdCAoc3RydWN0IGRmYSBjb25zdCAqKTsKKwor LyogRnJlZSB0aGUgc3RvcmFnZSBoZWxkIGJ5IHRoZSBjb21wb25lbnRzIG9mIGEgc3RydWN0IGRm YW11c3QuICovCitleHRlcm4gdm9pZCBkZmFtdXN0ZnJlZSAoc3RydWN0IGRmYW11c3QgKik7CisK Ky8qIGRmYXN5bnRheCgpIHRha2VzIHRocmVlIGFyZ3VtZW50czsgdGhlIGZpcnN0IHNldHMgdGhl IHN5bnRheCBiaXRzIGRlc2NyaWJlZAorICAgZWFybGllciBpbiB0aGlzIGZpbGUsIHRoZSBzZWNv bmQgc2V0cyB0aGUgY2FzZS1mb2xkaW5nIGZsYWcsIGFuZCB0aGUKKyAgIHRoaXJkIHNwZWNpZmll cyB0aGUgbGluZSB0ZXJtaW5hdG9yLiAqLworZXh0ZXJuIHZvaWQgZGZhc3ludGF4IChyZWdfc3lu dGF4X3QsIGJvb2wsIHVuc2lnbmVkIGNoYXIpOworCisvKiBDb21waWxlIHRoZSBnaXZlbiBzdHJp bmcgb2YgdGhlIGdpdmVuIGxlbmd0aCBpbnRvIHRoZSBnaXZlbiBzdHJ1Y3QgZGZhLgorICAgRmlu YWwgYXJndW1lbnQgaXMgYSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0byBidWlsZCBhIHNlYXJj aGluZyBvciBhbgorICAgZXhhY3QgbWF0Y2hlci4gKi8KK2V4dGVybiB2b2lkIGRmYWNvbXAgKGNo YXIgY29uc3QgKiwgc2l6ZV90LCBzdHJ1Y3QgZGZhICosIGJvb2wpOworCisvKiBTZWFyY2ggdGhy b3VnaCBhIGJ1ZmZlciBsb29raW5nIGZvciBhIG1hdGNoIHRvIHRoZSBnaXZlbiBzdHJ1Y3QgZGZh LgorICAgRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBtYXRjaGluZyB0aGUg cmVnZXhwIGluIHRoZQorICAgYnVmZmVyLCBhbmQgdGhlIHNob3J0ZXN0IHBvc3NpYmxlIHZlcnNp b24gdGhlcmVvZi4gIFJldHVybiBhIHBvaW50ZXIgdG8KKyAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIg YWZ0ZXIgdGhlIG1hdGNoLCBvciBOVUxMIGlmIG5vbmUgaXMgZm91bmQuICBCRUdJTgorICAgcG9p bnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgYW5kIEVORCBwb2ludHMgdG8gdGhl IGZpcnN0IGJ5dGUKKyAgIGFmdGVyIGl0cyBlbmQuICBOb3RlIGhvd2V2ZXIgdGhhdCB3ZSBzdG9y ZSBhIHNlbnRpbmVsIGJ5dGUgKHVzdWFsbHkKKyAgIG5ld2xpbmUpIGluICpFTkQsIHNvIHRoZSBh Y3R1YWwgYnVmZmVyIG11c3QgYmUgb25lIGJ5dGUgbG9uZ2VyLgorICAgV2hlbiBBTExPV19OTCBp cyB0cnVlLCBuZXdsaW5lcyBtYXkgYXBwZWFyIGluIHRoZSBtYXRjaGluZyBzdHJpbmcuCisgICBJ ZiBDT1VOVCBpcyBub24tTlVMTCwgaW5jcmVtZW50ICpDT1VOVCBvbmNlIGZvciBlYWNoIG5ld2xp bmUgcHJvY2Vzc2VkLgorICAgRmluYWxseSwgaWYgQkFDS1JFRiBpcyBub24tTlVMTCBzZXQgKkJB Q0tSRUYgdG8gaW5kaWNhdGUgd2hldGhlciB3ZQorICAgZW5jb3VudGVyZWQgYSBiYWNrLXJlZmVy ZW5jZS4gIFRoZSBjYWxsZXIgY2FuIHVzZSB0aGlzIHRvIGRlY2lkZQorICAgd2hldGhlciB0byBm YWxsIGJhY2sgb24gYSBiYWNrdHJhY2tpbmcgbWF0Y2hlci4gICovCitleHRlcm4gY2hhciAqZGZh ZXhlYyAoc3RydWN0IGRmYSAqZCwgY2hhciBjb25zdCAqYmVnaW4sIGNoYXIgKmVuZCwKKyAgICAg ICAgICAgICAgICAgICAgICBib29sIGFsbG93X25sLCBzaXplX3QgKmNvdW50LCBib29sICpiYWNr cmVmKTsKKworLyogUmV0dXJuIGEgc3VwZXJzZXQgZm9yIEQuICBUaGUgc3VwZXJzZXQgbWF0Y2hl cyBldmVyeXRoaW5nIHRoYXQgRAorICAgbWF0Y2hlcywgYWxvbmcgd2l0aCBzb21lIG90aGVyIHN0 cmluZ3MgKHRob3VnaCB0aGUgbGF0dGVyIHNob3VsZCBiZQorICAgcmFyZSwgZm9yIGVmZmljaWVu Y3kgcmVhc29ucykuICBSZXR1cm4gYSBudWxsIHBvaW50ZXIgaWYgbm8gdXNlZnVsCisgICBzdXBl cnNldCBpcyBhdmFpbGFibGUuICAqLworZXh0ZXJuIHN0cnVjdCBkZmEgKmRmYXN1cGVyc2V0IChz dHJ1Y3QgZGZhIGNvbnN0ICpkKSBfR0xfQVRUUklCVVRFX1BVUkU7CisKKy8qIFRoZSBERkEgaXMg bGlrZWx5IHRvIGJlIGZhc3QuICAqLworZXh0ZXJuIGJvb2wgZGZhaXNmYXN0IChzdHJ1Y3QgZGZh IGNvbnN0ICopIF9HTF9BVFRSSUJVVEVfUFVSRTsKKworLyogRnJlZSB0aGUgc3RvcmFnZSBoZWxk IGJ5IHRoZSBjb21wb25lbnRzIG9mIGEgc3RydWN0IGRmYS4gKi8KK2V4dGVybiB2b2lkIGRmYWZy ZWUgKHN0cnVjdCBkZmEgKik7CisKKy8qIEVycm9yIGhhbmRsaW5nLiAqLworCisvKiBkZmF3YXJu KCkgaXMgY2FsbGVkIGJ5IHRoZSByZWdleHAgcm91dGluZXMgd2hlbmV2ZXIgYSByZWdleCBpcyBj b21waWxlZAorICAgdGhhdCBsaWtlbHkgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2VyIHdhbnRlZC4g IEl0IHRha2VzIGEgc2luZ2xlCisgICBhcmd1bWVudCwgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcg ZGVzY3JpYmluZyB0aGUgc2l0dWF0aW9uLiAgVGhlIHVzZXIKKyAgIG11c3Qgc3VwcGx5IGEgZGZh d2Fybi4gICovCitleHRlcm4gdm9pZCBkZmF3YXJuIChjb25zdCBjaGFyICopOworCisvKiBkZmFl cnJvcigpIGlzIGNhbGxlZCBieSB0aGUgcmVnZXhwIHJvdXRpbmVzIHdoZW5ldmVyIGFuIGVycm9y IG9jY3Vycy4gIEl0CisgICB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgYSBOVUwtdGVybWluYXRl ZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgICBUaGUgdXNlciBtdXN0IHN1cHBseSBh IGRmYWVycm9yLiAgKi8KK2V4dGVybiBfTm9yZXR1cm4gdm9pZCBkZmFlcnJvciAoY29uc3QgY2hh ciAqKTsKKworZXh0ZXJuIGJvb2wgdXNpbmdfdXRmOCAodm9pZCk7CmRpZmYgLS1naXQgYS9zZWQv bG9jYWwubWsgYi9zZWQvbG9jYWwubWsKaW5kZXggN2Y4OGZhOC4uMWExODdkNCAxMDA2NDQKLS0t IGEvc2VkL2xvY2FsLm1rCisrKyBiL3NlZC9sb2NhbC5tawpAQCAtMjIsMTAgKzIyLDEyIEBAIHNl ZF9zZWRfU09VUkNFUyA9IHNlZC9zZWQuYyBcCiAgICAgICAgICAgICAgICAgICBzZWQvZXhlY3V0 ZS5jIFwKICAgICAgICAgICAgICAgICAgIHNlZC9yZWdleHAuYyBcCiAgICAgICAgICAgICAgICAg ICBzZWQvbWJjcy5jIFwKLSAgICAgICAgICAgICAgICAgIHNlZC91dGlscy5jCisgICAgICAgICAg ICAgICAgICBzZWQvdXRpbHMuYyBcCisgICAgICAgICAgICAgICAgICBzZWQvZGZhLmMKIAogbm9p bnN0X0hFQURFUlMgKz0gc2VkL3NlZC5oIFwKLSAgICAgICAgICAgICAgICAgIHNlZC91dGlscy5o CisgICAgICAgICAgICAgICAgICBzZWQvdXRpbHMuaCBcCisgICAgICAgICAgICAgICAgICBzZWQv ZGZhLmgKIAogc2VkX3NlZF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICAtRExPQ0FMRURJUj1c IiQobG9jYWxlZGlyKVwiCiBzZWRfc2VkX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFdBUk5fQ0ZM QUdTKSAkKFdFUlJPUl9DRkxBR1MpCmRpZmYgLS1naXQgYS9zZWQvcmVnZXhwLmMgYi9zZWQvcmVn ZXhwLmMKaW5kZXggOThmOWU2MS4uMTNkNGM1ZiAxMDA2NDQKLS0tIGEvc2VkL3JlZ2V4cC5jCisr KyBiL3NlZC9yZWdleHAuYwpAQCAtMzksNiArMzksMjUgQEAgc3RhdGljIGNvbnN0IGNoYXIgZXJy b3JzW10gPQogCiAMCiAKK3ZvaWQKK2RmYWVycm9yIChjaGFyIGNvbnN0ICptZXNnKQoreworICBw YW5pYyAoIiVzIiwgbWVzZyk7CisKKyAgLyogbm90cmVhY2hlZCAqLworICAvKiBUZWxsIHN0YXRp YyBhbmFseXplcnMgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybi4gICovCisgIGFi b3J0ICgpOworfQorCit2b2lkCitkZmF3YXJuIChjaGFyIGNvbnN0ICptZXNnKQoreworICBpZiAo IWdldGVudiAoIlBPU0lYTFlfQ09SUkVDVCIpKQorICAgIGRmYWVycm9yIChtZXNnKTsKK30KKwor DAorCiBzdGF0aWMgdm9pZAogY29tcGlsZV9yZWdleF8xIChzdHJ1Y3QgcmVnZXggKm5ld19yZWdl eCwgaW50IG5lZWRlZF9zdWIpCiB7CkBAIC0xMjYsNiArMTQ1LDEwIEBAIGNvbXBpbGVfcmVnZXhf MSAoc3RydWN0IHJlZ2V4ICpuZXdfcmVnZXgsIGludCBuZWVkZWRfc3ViKQogICAgICAgICAgICAg ICBuZWVkZWRfc3ViIC0gMSk7CiAgICAgICBiYWRfcHJvZyhidWYpOwogICAgIH0KKworICBkZmFz eW50YXggKHN5bnRheCwgKG5ld19yZWdleC0+ZmxhZ3MgJiBSRUdfSUNBU0UpICE9IDAsICdcbicp OworICBuZXdfcmVnZXgtPmRmYSA9IGRmYWFsbG9jICgpOworICBkZmFjb21wIChuZXdfcmVnZXgt PnJlLCBuZXdfcmVnZXgtPnN6LCBuZXdfcmVnZXgtPmRmYSwgMSk7CiB9CiAKIHN0cnVjdCByZWdl eCAqCkBAIC0yMzYsNiArMjU5LDI2IEBAIG1hdGNoX3JlZ2V4KHN0cnVjdCByZWdleCAqcmVnZXgs IGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwKIAogICByZWdleC0+cGF0dGVybi5yZWdzX2FsbG9j YXRlZCA9IFJFR1NfUkVBTExPQ0FURTsKIAorICBpZiAoYnVmX3N0YXJ0X29mZnNldCA9PSAwKQor ICAgIHsKKyAgICAgIHN0cnVjdCBkZmEgKnN1cGVyc2V0ID0gZGZhc3VwZXJzZXQgKHJlZ2V4LT5k ZmEpOworCisgICAgICBpZiAoc3VwZXJzZXQgJiYgIWRmYWV4ZWMoc3VwZXJzZXQsIGJ1ZiwgYnVm ICsgYnVmbGVuLCB0cnVlLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAg IGlmICgoIXJlZ3NpemUgJiYgcmVnZXgtPnBhdHRlcm4ubmV3bGluZV9hbmNob3IpCisgICAgICAg ICAgfHwgKCFzdXBlcnNldCAmJiBkZmFpc2Zhc3QgKHJlZ2V4LT5kZmEpKSkKKyAgICAgICAgewor ICAgICAgICAgIGJvb2wgYmFja3JlZiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKCFkZmFleGVj KHJlZ2V4LT5kZmEsIGJ1ZiwgYnVmICsgYnVmbGVuLCB0cnVlLCBOVUxMLCAmYmFja3JlZikpCisg ICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgIGlmICghcmVnc2l6ZSAmJiByZWdleC0+ cGF0dGVybi5uZXdsaW5lX2FuY2hvciAmJiAhYmFja3JlZikKKyAgICAgICAgICAgIHJldHVybiAx OworICAgICAgICB9CisgICAgfQorCiAgIHJldCA9IHJlX3NlYXJjaCAoJnJlZ2V4LT5wYXR0ZXJu LCBidWYsIGJ1ZmxlbiwgYnVmX3N0YXJ0X29mZnNldCwKICAgICAgICAgICAgICAgICAgICBidWZs ZW4gLSBidWZfc3RhcnRfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIHJlZ3NpemUgPyByZWdh cnJheSA6IE5VTEwpOwpkaWZmIC0tZ2l0IGEvc2VkL3NlZC5oIGIvc2VkL3NlZC5oCmluZGV4IDM3 MTZiY2IuLjA2NWE2NzIgMTAwNjQ0Ci0tLSBhL3NlZC9zZWQuaAorKysgYi9zZWQvc2VkLmgKQEAg LTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlICJiYXNpY2RlZnMu aCIKICNpbmNsdWRlICJyZWdleC5oIgorI2luY2x1ZGUgImRmYS5oIgogI2luY2x1ZGUgPHN0ZGlv Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSAidW5sb2NrZWQtaW8uaCIKQEAgLTUx LDYgKzUyLDcgQEAgc3RydWN0IHJlZ2V4IHsKICAgcmVnZXhfdCBwYXR0ZXJuOwogICBpbnQgZmxh Z3M7CiAgIHNpemVfdCBzejsKKyAgc3RydWN0IGRmYSAqZGZhOwogICBjaGFyIHJlWzFdOwogfTsK IAotLSAKMS43LjEKCg== --------_57A497D20000000064F2_MULTIPART_MIXED_-- From debbugs-submit-bounces@debbugs.gnu.org Fri Aug 05 10:51:48 2016 Received: (at 24161) by debbugs.gnu.org; 5 Aug 2016 14:51:48 +0000 Received: from localhost ([127.0.0.1]:56776 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVgTU-0003Gp-Fv for submit@debbugs.gnu.org; Fri, 05 Aug 2016 10:51:48 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:36537) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVgTT-0003Gd-RI for 24161@debbugs.gnu.org; Fri, 05 Aug 2016 10:51:48 -0400 Received: by mail-qk0-f193.google.com with SMTP id x185so7962203qkc.3 for <24161@debbugs.gnu.org>; Fri, 05 Aug 2016 07:51:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding; bh=RpHiNkmv3dv5/nnaEdkrwyerT3fLBDOR5ypfR46XUCI=; b=aksYKP5RieJ1QweIqL7L3y5EsdIrRVJuO6QcWK9ViXVKgp7wd5xs6sX2CWgXvmlbnb dJ/viJPy8W9W6fKlWV/167h109urpkrNe1bmFTURyAJmLOTyY1RhFesCTMCiXEBGXjcJ sqhdC00t7nn4qUsWUFnZfGiXlK2IM/6p/5k8o02SjUzaK78Ze285bD17zIzUz0ItL5V6 6iWsg0M2v6SX2u2CGf/pkOlDhBFyVD0n+PtZ3p/yPNdifinmrZbI/jkvpyV3PM9ZTmef bUdp1+RNTUppkgmjenqzBGBr+3T9/K9WNiFwBLfK49Jz6ptejAason1RW3QYo/iwewk3 dSgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=RpHiNkmv3dv5/nnaEdkrwyerT3fLBDOR5ypfR46XUCI=; b=UkKSj/2y2bLQteTXz8UXM5Jj4ZYK+N7ipVLRWFEC/l5LbuOCb2alX/yT6gfYB2lyHg 8iwlxkBlHtMWpxhUDWieY2xgbg47mhrbcNulWkSZ8Z/eWq1iwozFmc9IatoPhprcmFaO 7zalbgPw5alByEHpFDC98twxnJq9YULdfAb7avda0SuYM1FGF7C4XPYSjabIyYhpGV+8 hHow0GN19a21FZTRXMlF1KpGfbDHmA3r928jpmV7wtRztwbU74CMHS3P3hUDDvFV4haB koES4Yf5NAWyMNBTpblg20+YDo0ba1RsQIvjWCyseR3Q0JXmKTz8tp0P7sFyAWK2kRVQ 9JaA== X-Gm-Message-State: AEkoouuD2oqCIinafCzh2hZPyUi70adJtyzy/ieDE8jnqDBm96XuWEBOigBhJzy/mFZ5UA== X-Received: by 10.55.185.131 with SMTP id j125mr12629223qkf.138.1470408701703; Fri, 05 Aug 2016 07:51:41 -0700 (PDT) Received: from disco.erlich.nygenome.org ([69.74.14.178]) by smtp.googlemail.com with ESMTPSA id h186sm9781918qke.49.2016.08.05.07.51.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 05 Aug 2016 07:51:41 -0700 (PDT) Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher To: Norihiro Tanaka , 24161@debbugs.gnu.org References: <20160805230325.6516.27F6AC2D@kcn.ne.jp> From: Assaf Gordon Message-ID: Date: Fri, 5 Aug 2016 10:51:40 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160805230325.6516.27F6AC2D@kcn.ne.jp> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 24161 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) Hello Norihiro, On 08/05/2016 10:03 AM, Norihiro Tanaka wrote: > We can speeds up sed by using dfa matcher brought from grep. gawk users > it, sed does not uses it yet. It will speed up matching for typical > cases. [...] > I believe that this patch can greatly improve performance of matching by > sed, however I worry about the maintenance as updates for dfa is always > done in grep. Nice improvement, thank you for the patch! Keeping up with grep should not be a problem - Jim Meyering is the maintainer of both sed and grep (and I also try to keep up-to-date with grep's changes). I wonder, if this code is used by multiple gnu projects, wouldn't it be better to include it in gnulib (instead of duplicating the code) ? I also see from a cursory look that the test coverage is low (which is expected: sed currently use the native regex code and does not test specifically for it). I'm happy to try and add more tests, but it'll take a bit of time. regards, - assaf From debbugs-submit-bounces@debbugs.gnu.org Fri Aug 05 11:12:04 2016 Received: (at 24161) by debbugs.gnu.org; 5 Aug 2016 15:12:04 +0000 Received: from localhost ([127.0.0.1]:56784 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVgn6-0003kh-GA for submit@debbugs.gnu.org; Fri, 05 Aug 2016 11:12:04 -0400 Received: from mail-oi0-f67.google.com ([209.85.218.67]:36407) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bVgn5-0003kE-06 for 24161@debbugs.gnu.org; Fri, 05 Aug 2016 11:12:03 -0400 Received: by mail-oi0-f67.google.com with SMTP id d204so29000476oig.3 for <24161@debbugs.gnu.org>; Fri, 05 Aug 2016 08:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=prIH4vcKSTZ4ZHAvQX3Y13PwYYP4T4hbbF9bPAvMn+E=; b=CpgpDDrdzLgDQOo04xYc7sbN89sJdbWG2tdsEHZ5oWk5tc54kpwgNrBqLZBZYvmetO fY0csE9q6yvgphhPc5ACs9sR7deMhHecPY95vyNlIn/r60n3lBDLKzHiVDMWQNFBfqNx ovoaA1Q+FwvGOKG7P8y7UKtwoVD7M93edKx9wg3yW7Nz5anzzecuVVtU63VdNxFPl83E cDhybVwFf5/QJuKEJL8T+I6Gp6TJrmX2SwqqDiEKOIstziisBq/pCWyDnQkDS/FBjLy0 7gYFh7W7IndNObb0MwfCMlUXVvVKZFOv0KSukz3gLaFITAjQjW+swJOA+0nSgiIg34sO gcxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=prIH4vcKSTZ4ZHAvQX3Y13PwYYP4T4hbbF9bPAvMn+E=; b=XO2whEVW16LsoFWM1fp8gylxzK2oUvgSohuue5TXFOdkF+3cWabIexFuXylCtwc9hR 8Xjg9TOr0CBPrdyTuvgaV41lfpYfzwQr/FlASG2hB22lwzhkF5l/OwwRd1y7s5c0hnDI sE9RuY/teWpsLHHNWcNb36FlmDEyQakMC/O1EzI+ZOxKGxIXsQ3okvra6BXP/2a5eeWw WOHzzaZn2Jvz+kaCrHEwxTa/JithcbYrU32BBuVh8dk2MrVKX4ITGljPDJg2if3O74sj rbwcicVX8DVrtJNSJtHPQX7oqWKcqqDRta6XYKY+008OYJY1x38RygfbRWGer2akoVqL Bdkw== X-Gm-Message-State: AEkooutEz34G31/JJtvHFJLLxCTe79f1rGOl7Epc9wMuDcouzlb2WxsuPTWZ3HE8jyKaTXZhHa7S+GHJgYScVA== X-Received: by 10.157.46.212 with SMTP id w78mr13158506ota.170.1470409916238; Fri, 05 Aug 2016 08:11:56 -0700 (PDT) MIME-Version: 1.0 Received: by 10.202.236.146 with HTTP; Fri, 5 Aug 2016 08:11:35 -0700 (PDT) In-Reply-To: References: <20160805230325.6516.27F6AC2D@kcn.ne.jp> From: Jim Meyering Date: Fri, 5 Aug 2016 08:11:35 -0700 X-Google-Sender-Auth: yaabmc65YrVATRKusfQ93UE4T7M Message-ID: Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher To: Assaf Gordon Content-Type: text/plain; charset=UTF-8 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 24161 Cc: Norihiro Tanaka , 24161@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) On Fri, Aug 5, 2016 at 7:51 AM, Assaf Gordon wrote: > Hello Norihiro, > > On 08/05/2016 10:03 AM, Norihiro Tanaka wrote: >> >> We can speeds up sed by using dfa matcher brought from grep. gawk users >> it, sed does not uses it yet. It will speed up matching for typical >> cases. > > [...] >> >> I believe that this patch can greatly improve performance of matching by >> sed, however I worry about the maintenance as updates for dfa is always >> done in grep. > > Nice improvement, thank you for the patch! Nice one, indeed. I hope to review it by this weekend. > I wonder, if this code is used by multiple gnu projects, wouldn't it be > better to include it in gnulib (instead of duplicating the code) ? Yes. However, I'm happy to move dfa.[ch] into gnulib after this patch lands. > I also see from a cursory look that the test coverage is low (which is > expected: sed currently use the native regex code and does not test > specifically for it). I'm happy to try and add more tests, but it'll take a > bit of time. Eventually, we'll want dfa's tests to reside in gnulib. From debbugs-submit-bounces@debbugs.gnu.org Sat Aug 06 20:50:46 2016 Received: (at 24161) by debbugs.gnu.org; 7 Aug 2016 00:50:46 +0000 Received: from localhost ([127.0.0.1]:58231 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWCIf-0000Kt-TS for submit@debbugs.gnu.org; Sat, 06 Aug 2016 20:50:46 -0400 Received: from mailgw06.kcn.ne.jp ([61.86.7.213]:50703) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWCIe-0000Ke-0A for 24161@debbugs.gnu.org; Sat, 06 Aug 2016 20:50:44 -0400 Received: from mxs01-s (mailgw1.kcn.ne.jp [61.86.15.233]) by mailgw06.kcn.ne.jp (Postfix) with ESMTP id 713FDE80027 for <24161@debbugs.gnu.org>; Sun, 7 Aug 2016 09:50:36 +0900 (JST) X-matriXscan-loop-detect: cc3296f4b33a8ece300934831705bbc7558b3628 Received: from mail06.kcn.ne.jp ([61.86.6.185]) by mxs01-s with ESMTP; Sun, 07 Aug 2016 09:50:33 +0900 (JST) Received: from [10.120.1.17] (i118-21-128-66.s30.a048.ap.plala.or.jp [118.21.128.66]) by mail06.kcn.ne.jp (Postfix) with ESMTPA id 98CD01BF0091; Sun, 7 Aug 2016 09:50:33 +0900 (JST) Date: Sun, 07 Aug 2016 09:50:35 +0900 From: Norihiro Tanaka To: Assaf Gordon Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher In-Reply-To: References: <20160805230325.6516.27F6AC2D@kcn.ne.jp> Message-Id: <20160807095035.749B.27F6AC2D@kcn.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.65.07 [ja] X-matriXscan-Sophos-AV: Clean X-matriXscan-Action: Approve X-matriXscan: Uncategorized X-Spam-Score: -1.2 (-) X-Debbugs-Envelope-To: 24161 Cc: 24161@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.2 (-) On Fri, 5 Aug 2016 10:51:40 -0400 Assaf Gordon wrote: > Hello Norihiro, > > On 08/05/2016 10:03 AM, Norihiro Tanaka wrote: > > We can speeds up sed by using dfa matcher brought from grep. gawk users > > it, sed does not uses it yet. It will speed up matching for typical > > cases. > [...] > > I believe that this patch can greatly improve performance of matching by > > sed, however I worry about the maintenance as updates for dfa is always > > done in grep. > > Nice improvement, thank you for the patch! > > Keeping up with grep should not be a problem - Jim Meyering is the maintainer of both sed and grep (and I also try to keep up-to-date with grep's changes). > > I wonder, if this code is used by multiple gnu projects, wouldn't it be better to include it in gnulib (instead of duplicating the code) ? > > I also see from a cursory look that the test coverage is low (which is expected: sed currently use the native regex code and does not test specifically for it). I'm happy to try and add more tests, but it'll take a bit of time. > > regards, > - assaf Hi Assaf and Jim, Thanks for considering the patch. I also think that it is better to include in gnulib. Thanks, Norihiro From debbugs-submit-bounces@debbugs.gnu.org Sat Aug 06 22:20:50 2016 Received: (at 24161) by debbugs.gnu.org; 7 Aug 2016 02:20:50 +0000 Received: from localhost ([127.0.0.1]:58251 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWDhq-0002Og-Dl for submit@debbugs.gnu.org; Sat, 06 Aug 2016 22:20:50 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:36038) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWDho-0002OU-O9 for 24161@debbugs.gnu.org; Sat, 06 Aug 2016 22:20:49 -0400 Received: by mail-oi0-f68.google.com with SMTP id a101so2601379oic.3 for <24161@debbugs.gnu.org>; Sat, 06 Aug 2016 19:20:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=2HQYUqtNynyBQElPOTDROdYG0gzWiKNGIREAxp5PuAA=; b=NOjwJ7lPK+lA8jPxeLXtTyrje7VYL4J/mJYlX8psdZpW3Vq9Uxnq8Yx4vEF9IuWKat /SGq3RluluUpZXnR3YBEbjfB+el3HAKXDZW0YDp6SooWsqowaxj/y44yKZmHCO8m7UZL 6xHEiw9HPc80cheeVQia3fEvQBhR6ULz9MI2vE+5mp//sMUGJk6cwY1mbKPVGYAY7xYj djfNepSxzYt01cPKreVQm62QA06W1hjWCU4QvxfzStJGJJbNqcOn4HEwn8/9Zi1kcG/+ lIjjnN/cBvAabMsIjM33AQKJ0EbeNXm6yQy0zOXl4dp9pWXt98kjxGLtGsXnn1C2DzHF Kx2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=2HQYUqtNynyBQElPOTDROdYG0gzWiKNGIREAxp5PuAA=; b=Xg1XsoaFlvLe8XX9v8Wps0J7pX1e2Gtvl60ZLo4X95wIYAtUoGwGbhDqCEAEsZgBry xZaYUD0mwp8XkVGUQ/qPfU11EmIvium8k4KZqZxAmYwwiGMJ+XkNUaSfntHA82avc/9w VCvrrJrst1t4em9RCRO1+pnaadbYZ75S3nQ5ly6NrV11GiCza5bbuf5bFH94/cuN7kzV D0QibOI1tzdm06j0KuNuVWIExNrZuqVnaBeUpWeFv8GTuSZsRGTFnoByaZ59x2pfIzx3 AMzGviNF5Zah4a6Tozl73c5l3U4rwlwUxUeK47scLIP/HXktIfzPjTt0iT7tAahjH7lB bZ1g== X-Gm-Message-State: AEkoousf+CxAQ83jdBrr5qTaG6HdhtmexNjSxkVvlz4BEGKt5Zun6rJxYoVvMM6ed8kgN5MYriidI3QUG29YDA== X-Received: by 10.202.182.85 with SMTP id g82mr52482578oif.58.1470536443014; Sat, 06 Aug 2016 19:20:43 -0700 (PDT) MIME-Version: 1.0 Received: by 10.202.236.146 with HTTP; Sat, 6 Aug 2016 19:20:22 -0700 (PDT) In-Reply-To: <20160807095035.749B.27F6AC2D@kcn.ne.jp> References: <20160805230325.6516.27F6AC2D@kcn.ne.jp> <20160807095035.749B.27F6AC2D@kcn.ne.jp> From: Jim Meyering Date: Sat, 6 Aug 2016 19:20:22 -0700 X-Google-Sender-Auth: epmnViqDqBVLN4yuLi2-y4-53jg Message-ID: Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher To: Norihiro Tanaka Content-Type: multipart/mixed; boundary=001a113cc7fc50d9a3053971f23d X-Debbugs-Envelope-To: 24161 Cc: Assaf Gordon , 24161@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --001a113cc7fc50d9a3053971f23d Content-Type: text/plain; charset=UTF-8 On Sat, Aug 6, 2016 at 5:50 PM, Norihiro Tanaka wrote: > > On Fri, 5 Aug 2016 10:51:40 -0400 > Assaf Gordon wrote: > >> Hello Norihiro, >> >> On 08/05/2016 10:03 AM, Norihiro Tanaka wrote: >> > We can speeds up sed by using dfa matcher brought from grep. gawk users >> > it, sed does not uses it yet. It will speed up matching for typical >> > cases. >> [...] >> > I believe that this patch can greatly improve performance of matching by >> > sed, however I worry about the maintenance as updates for dfa is always >> > done in grep. >> >> Nice improvement, thank you for the patch! Thanks again. I've revised it as follows and expect to push tomorrow: - remove the abort and comment from dfaerror -- should is not necessary, given the _Noreturn attribute. - adjusted commit log and NEWS entry, also moving the "Improvements" section to the top - sorted source file names in local.mk (they were not sorted before, either) - added the "make syntax-check"-required mention of sed/dfa.c in po/POTFILES.in --001a113cc7fc50d9a3053971f23d Content-Type: text/plain; charset=US-ASCII; name="0001-sed-use-grep-s-DFA-matcher-to-speed-up-regular-expre.diff" Content-Disposition: attachment; filename="0001-sed-use-grep-s-DFA-matcher-to-speed-up-regular-expre.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_irjze8rk0 RnJvbSBkMTkxZmRiMWU3NDZiZjRmNjMyNjhkZGE1MDQzZDNkOTc0ZTk0OTA1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOb3JpaGlybyBUYW5ha2EgPG5vcml0bmtAa2NuLm5lLmpwPgpE YXRlOiBTYXQsIDYgQXVnIDIwMTYgMTg6MzI6NDMgLTA3MDAKU3ViamVjdDogW1BBVENIXSBzZWQ6 IHVzZSBncmVwJ3MgREZBIG1hdGNoZXIgdG8gc3BlZWQgdXAgcmVndWxhciBleHByZXNzaW9uCiBt YXRjaGluZwoKV2hlbiBwb3NzaWJsZSwgc2VkIG5vdyB1c2VzIGdyZXAncyBERkEgbWF0Y2hlciB0 byBtYXRjaCByZWd1bGFyCmV4cHJlc3Npb24sIG9mdGVuIHJlc3VsdGluZyBpbiBhIDEweCBzcGVl ZC11cC4KKiBORVdTIChJbXByb3ZlbWVudHMpOiBNZW50aW9uIGl0LiAgTW92ZSB0aGlzIHNlY3Rp b24gdG8gdGhlIHRvcC4KKiBzZWQvbG9jYWwubWsgKHNlZF9zZWRfU09VUkNFUyk6IEFkZCBkZmEu YywgYW5kIHNvcnQgZmlsZSBuYW1lcy4KKG5vaW5zdF9IRUFERVJTKTogQWRkIGRmYS5oLCBhbmQg c29ydCBmaWxlIG5hbWVzLgoqIHNlZC9yZWdleHAuYyAoZGZhZXJyb3IsIGRmYXdhcm4pOiBOZXcg ZnVuY3Rpb25zLgooY29tcGlsZV9yZWdleF8xKTogQ29tcGlsZSBwYXR0ZXJuIHdpdGggZGZhLgoo bWF0Y2hfcmVnZXgpOiBVc2UgZGZhLgoqIHNlZC9zZWQuaDogSW5jbHVkZSBkZmEuaC4KKHN0cnVj dCByZWdleCk6IE5ldyBtZW1iZXIgZGZhLgoqIHNlZC9kZmEuYzogTmV3IGZpbGUsIGNvcGllZCBm cm9tIGdyZXAuCiogc2VkL2RmYS5oOiBOZXcgZmlsZSwgY29waWVkIGZyb20gZ3JlcC4KKiBwby9Q T1RGSUxFUy5pbjogQWRkIHNlZC9kZmEuYy4KLS0tCiBORVdTICAgICAgICAgICB8ICAgMTEgKy0K IHBvL1BPVEZJTEVTLmluIHwgICAgMSArCiBzZWQvZGZhLmMgICAgICB8IDQwMTAgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNlZC9kZmEu aCAgICAgIHwgIDEwMyArKwogc2VkL2xvY2FsLm1rICAgfCAgIDIyICstCiBzZWQvcmVnZXhwLmMg ICB8ICAgMzkgKwogc2VkL3NlZC5oICAgICAgfCAgICAyICsKIDcgZmlsZXMgY2hhbmdlZCwgNDE3 NSBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzZWQv ZGZhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzZWQvZGZhLmgKCmRpZmYgLS1naXQgYS9ORVdTIGIv TkVXUwppbmRleCA2YWY4YjlhLi5hYjExMDYwIDEwMDY0NAotLS0gYS9ORVdTCisrKyBiL05FV1MK QEAgLTIsNiArMiwxMyBAQCBHTlUgc2VkIE5FV1MgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAtKi0gb3V0bGluZSAtKi0KCiAqIE5vdGV3b3J0aHkgY2hhbmdlcyBpbiByZWxlYXNl ID8uPyAoPz8/Py0/Py0/PykgWz9dCgorKiogSW1wcm92ZW1lbnRzCisKKyAgc2VkJ3MgcmVndWxh ciBleHByZXNzaW9uIG1hdGNoaW5nIGlzIG5vdyB0eXBpY2FsbHkgMTB4IGZhc3RlcgorCisgIHNl ZCBub3cgdXNlcyB1bmxvY2tlZC1pbyB3aGVyZSBhdmFpbGFibGUsIHJlc3VsdGluZyBpbiBmYXN0 ZXIgSS9PCisgIG9wZXJhdGlvbnMuCisKICoqIEJ1ZyBmaXhlcwoKICAgc2VkIG5vIGxvbmdlciBh Y2NlcHRzIGEgIjoiIGNvbW1hbmQgd2l0aG91dCBhIGxhYmVsOyBiZWZvcmUsIGl0IHdvdWxkCkBA IC03NCwxMCArODEsNiBAQCBHTlUgc2VkIE5FV1MgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAtKi0gb3V0bGluZSAtKi0KICAgb25seSAudGFyLnh6IGZpbGVzIGlzIGVub3VnaC4g IEl0IGhhcyBiZWVuIGZpbmUgZm9yIGNvcmV1dGlscywgZ3JlcCwKICAgZGlmZnV0aWxzIGFuZCBw YXJ0ZWQgZm9yIGEgZmV3IHllYXJzLgoKLSoqIEltcHJvdmVtZW50cwotCi0gIHNlZCBub3cgdXNl cyB1bmxvY2tlZC1pbyB3aGVyZSBhdmFpbGFibGUsIHJlc3VsdGluZyBpbiBmYXN0ZXIgSS9PCi0g IG9wZXJhdGlvbnMuCgogKiBOb3Rld29ydGh5IGNoYW5nZXMgaW4gcmVsZWFzZSA0LjIuMiAoMjAx Mi0xMi0yMikgW3N0YWJsZV0KCmRpZmYgLS1naXQgYS9wby9QT1RGSUxFUy5pbiBiL3BvL1BPVEZJ TEVTLmluCmluZGV4IGRiNTU2NTEuLjg3MTRmYzcgMTAwNjQ0Ci0tLSBhL3BvL1BPVEZJTEVTLmlu CisrKyBiL3BvL1BPVEZJTEVTLmluCkBAIC05LDYgKzksNyBAQCBsaWIvc2V0LWFjbC5jCiBsaWIv dmVyc2lvbi1ldGMuYwogbGliL3hhbGxvYy1kaWUuYwogc2VkL2NvbXBpbGUuYworc2VkL2RmYS5j CiBzZWQvZXhlY3V0ZS5jCiBzZWQvcmVnZXhwLmMKIHNlZC9zZWQuYwpkaWZmIC0tZ2l0IGEvc2Vk L2RmYS5jIGIvc2VkL2RmYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1 ZDc0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWQvZGZhLmMKQEAgLTAsMCArMSw0MDEwIEBACisv KiBkZmEuYyAtIGRldGVybWluaXN0aWMgZXh0ZW5kZWQgcmVnZXhwIHJvdXRpbmVzIGZvciBHTlUK KyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5OCwgMjAwMCwgMjAwMiwgMjAwNC0yMDA1LCAyMDA3 LTIwMTYgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgor CisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlz IHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRp b24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN QSAgMDIxMTAtMTMwMSwgVVNBICovCisKKy8qIFdyaXR0ZW4gSnVuZSwgMTk4OCBieSBNaWtlIEhh ZXJ0ZWwKKyAgIE1vZGlmaWVkIEp1bHksIDE5ODggYnkgQXJ0aHVyIERhdmlkIE9sc29uIHRvIGFz c2lzdCBCTUcgc3BlZWR1cHMgICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUg ImRmYS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNs dWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgor I2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjZGVmaW5lIFNUUkVR KGEsIGIpIChzdHJjbXAgKGEsIGIpID09IDApCisKKy8qIElTQVNDSUlESUdJVCBkaWZmZXJzIGZy b20gaXNkaWdpdCwgYXMgZm9sbG93czoKKyAgIC0gSXRzIGFyZyBtYXkgYmUgYW55IGludCBvciB1 bnNpZ25lZCBpbnQ7IGl0IG5lZWQgbm90IGJlIGFuIHVuc2lnbmVkIGNoYXIuCisgICAtIEl0J3Mg Z3VhcmFudGVlZCB0byBldmFsdWF0ZSBpdHMgYXJndW1lbnQgZXhhY3RseSBvbmNlLgorICAgLSBJ dCdzIHR5cGljYWxseSBmYXN0ZXIuCisgICBQb3NpeCAxMDAzLjItMTk5MiBzZWN0aW9uIDIuNS4y LjEgcGFnZSA1MCBsaW5lcyAxNTU2LTE1NTggc2F5cyB0aGF0CisgICBvbmx5ICcwJyB0aHJvdWdo ICc5JyBhcmUgZGlnaXRzLiAgUHJlZmVyIElTQVNDSUlESUdJVCB0byBpc2RpZ2l0IHVubGVzcwor ICAgaXQncyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBsb2NhbGUncyBkZWZpbml0aW9uIG9mICJkaWdp dCIgZXZlbiB3aGVuIHRoZQorICAgaG9zdCBkb2VzIG5vdCBjb25mb3JtIHRvIFBvc2l4LiAgKi8K KyNkZWZpbmUgSVNBU0NJSURJR0lUKGMpICgodW5zaWduZWQpIChjKSAtICcwJyA8PSA5KQorCisj aW5jbHVkZSAiZ2V0dGV4dC5oIgorI2RlZmluZSBfKHN0cikgZ2V0dGV4dCAoc3RyKQorCisjaW5j bHVkZSA8d2NoYXIuaD4KKyNpbmNsdWRlIDx3Y3R5cGUuaD4KKworLyogSFBVWCBkZWZpbmVzIHRo ZXNlIGFzIG1hY3JvcyBpbiBzeXMvcGFyYW0uaC4gICovCisjaWZkZWYgc2V0Yml0CisjIHVuZGVm IHNldGJpdAorI2VuZGlmCisjaWZkZWYgY2xyYml0CisjIHVuZGVmIGNscmJpdAorI2VuZGlmCisK Ky8qIEZpcnN0IGludGVnZXIgdmFsdWUgdGhhdCBpcyBncmVhdGVyIHRoYW4gYW55IGNoYXJhY3Rl ciBjb2RlLiAgKi8KK2VudW0geyBOT1RDSEFSID0gMSA8PCBDSEFSX0JJVCB9OworCisvKiBUaGlz IHJlcHJlc2VudHMgcGFydCBvZiBhIGNoYXJhY3RlciBjbGFzcy4gIEl0IG11c3QgYmUgdW5zaWdu ZWQgYW5kCisgICBhdCBsZWFzdCBDSEFSQ0xBU1NfV09SRF9CSVRTIHdpZGUuICBBbnkgZXhjZXNz IGJpdHMgYXJlIHplcm8uICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgY2hhcmNsYXNzX3dvcmQ7 CisKKy8qIFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIGEgY2hhcmNsYXNzIHdvcmQuICB1dGY4 X2NsYXNzZXMgYXNzdW1lcworICAgdGhpcyBpcyBleGFjdGx5IDMyLiAgKi8KK2VudW0geyBDSEFS Q0xBU1NfV09SRF9CSVRTID0gMzIgfTsKKworLyogVGhlIG1heGltdW0gdXNlZnVsIHZhbHVlIG9m IGEgY2hhcmNsYXNzX3dvcmQ7IGFsbCB1c2VkIGJpdHMgYXJlIDEuICAqLworI2RlZmluZSBDSEFS Q0xBU1NfV09SRF9NQVNLIFwKKyAgKCgoY2hhcmNsYXNzX3dvcmQpIDEgPDwgKENIQVJDTEFTU19X T1JEX0JJVFMgLSAxKSA8PCAxKSAtIDEpCisKKy8qIE51bWJlciBvZiB3b3JkcyByZXF1aXJlZCB0 byBob2xkIGEgYml0IGZvciBldmVyeSBjaGFyYWN0ZXIuICAqLworZW51bQoreworICBDSEFSQ0xB U1NfV09SRFMgPSAoTk9UQ0hBUiArIENIQVJDTEFTU19XT1JEX0JJVFMgLSAxKSAvIENIQVJDTEFT U19XT1JEX0JJVFMKK307CisKKy8qIFNldHMgb2YgdW5zaWduZWQgY2hhcmFjdGVycyBhcmUgc3Rv cmVkIGFzIGJpdCB2ZWN0b3JzIGluIGFycmF5cyBvZiBpbnRzLiAgKi8KK3R5cGVkZWYgY2hhcmNs YXNzX3dvcmQgY2hhcmNsYXNzW0NIQVJDTEFTU19XT1JEU107CisKKy8qIENvbnZlcnQgYSBwb3Nz aWJseS1zaWduZWQgY2hhcmFjdGVyIHRvIGFuIHVuc2lnbmVkIGNoYXJhY3Rlci4gIFRoaXMgaXMK KyAgIGEgYml0IHNhZmVyIHRoYW4gY2FzdGluZyB0byB1bnNpZ25lZCBjaGFyLCBzaW5jZSBpdCBj YXRjaGVzIHNvbWUgdHlwZQorICAgZXJyb3JzIHRoYXQgdGhlIGNhc3QgZG9lc24ndC4gICovCitz dGF0aWMgdW5zaWduZWQgY2hhcgordG9fdWNoYXIgKGNoYXIgY2gpCit7CisgIHJldHVybiBjaDsK K30KKworLyogQ29udGV4dHMgdGVsbCB1cyB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIGEgbmV3bGlu ZSBvciBhIHdvcmQgY29uc3RpdHVlbnQuCisgICBXb3JkLWNvbnN0aXR1ZW50IGNoYXJhY3RlcnMg YXJlIHRob3NlIHRoYXQgc2F0aXNmeSBpc3dhbG51bSwgcGx1cyAnXycuCisgICBFYWNoIGNoYXJh Y3RlciBoYXMgYSBzaW5nbGUgQ1RYXyogdmFsdWU7IGJpdG1hc2tzIG9mIENUWF8qIHZhbHVlcyBk ZW5vdGUKKyAgIGEgcGFydGljdWxhciBjaGFyYWN0ZXIgY2xhc3MuCisKKyAgIEEgc3RhdGUgYWxz byBzdG9yZXMgYSBjb250ZXh0IHZhbHVlLCB3aGljaCBpcyBhIGJpdG1hc2sgb2YgQ1RYXyogdmFs dWVzLgorICAgQSBzdGF0ZSdzIGNvbnRleHQgcmVwcmVzZW50cyBhIHNldCBvZiBjaGFyYWN0ZXJz IHRoYXQgdGhlIHN0YXRlJ3MKKyAgIHByZWRlY2Vzc29ycyBtdXN0IG1hdGNoLiAgRm9yIGV4YW1w bGUsIGEgc3RhdGUgd2hvc2UgY29udGV4dCBkb2VzIG5vdAorICAgaW5jbHVkZSBDVFhfTEVUVEVS IHdpbGwgbmV2ZXIgaGF2ZSB0cmFuc2l0aW9ucyB3aGVyZSB0aGUgcHJldmlvdXMKKyAgIGNoYXJh Y3RlciBpcyBhIHdvcmQgY29uc3RpdHVlbnQuICBBIHN0YXRlIHdob3NlIGNvbnRleHQgaXMgQ1RY X0FOWQorICAgbWlnaHQgaGF2ZSB0cmFuc2l0aW9ucyBmcm9tIGFueSBjaGFyYWN0ZXIuICAqLwor CisjZGVmaW5lIENUWF9OT05FCTEKKyNkZWZpbmUgQ1RYX0xFVFRFUgkyCisjZGVmaW5lIENUWF9O RVdMSU5FCTQKKyNkZWZpbmUgQ1RYX0FOWQkJNworCisvKiBTb21ldGltZXMgY2hhcmFjdGVycyBj YW4gb25seSBiZSBtYXRjaGVkIGRlcGVuZGluZyBvbiB0aGUgc3Vycm91bmRpbmcKKyAgIGNvbnRl eHQuICBTdWNoIGNvbnRleHQgZGVjaXNpb25zIGRlcGVuZCBvbiB3aGF0IHRoZSBwcmV2aW91cyBj aGFyYWN0ZXIKKyAgIHdhcywgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCAobG9va2FoZWFk KSBjaGFyYWN0ZXIuICBDb250ZXh0CisgICBkZXBlbmRlbnQgY29uc3RyYWludHMgYXJlIGVuY29k ZWQgYXMgOCBiaXQgaW50ZWdlcnMuICBFYWNoIGJpdCB0aGF0CisgICBpcyBzZXQgaW5kaWNhdGVz IHRoYXQgdGhlIGNvbnN0cmFpbnQgc3VjY2VlZHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGNv bnRleHQuCisKKyAgIGJpdCA4LTExIC0gdmFsaWQgY29udGV4dHMgd2hlbiBuZXh0IGNoYXJhY3Rl ciBpcyBDVFhfTkVXTElORQorICAgYml0IDQtNyAgLSB2YWxpZCBjb250ZXh0cyB3aGVuIG5leHQg Y2hhcmFjdGVyIGlzIENUWF9MRVRURVIKKyAgIGJpdCAwLTMgIC0gdmFsaWQgY29udGV4dHMgd2hl biBuZXh0IGNoYXJhY3RlciBpcyBDVFhfTk9ORQorCisgICBUaGUgbWFjcm8gU1VDQ0VFRFNfSU5f Q09OVEVYVCBkZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBjb25zdHJhaW50CisgICBzdWNjZWVk cyBpbiBhIHBhcnRpY3VsYXIgY29udGV4dC4gIFByZXYgaXMgYSBiaXRtYXNrIG9mIHBvc3NpYmxl CisgICBjb250ZXh0IHZhbHVlcyBmb3IgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgY3VyciBpcyB0 aGUgKHNpbmdsZS1iaXQpCisgICBjb250ZXh0IHZhbHVlIGZvciB0aGUgbG9va2FoZWFkIGNoYXJh Y3Rlci4gICovCisjZGVmaW5lIE5FV0xJTkVfQ09OU1RSQUlOVChjb25zdHJhaW50KSAoKChjb25z dHJhaW50KSA+PiA4KSAmIDB4ZikKKyNkZWZpbmUgTEVUVEVSX0NPTlNUUkFJTlQoY29uc3RyYWlu dCkgICgoKGNvbnN0cmFpbnQpID4+IDQpICYgMHhmKQorI2RlZmluZSBPVEhFUl9DT05TVFJBSU5U KGNvbnN0cmFpbnQpICAgICgoY29uc3RyYWludCkgICAgICAgJiAweGYpCisKKyNkZWZpbmUgU1VD Q0VFRFNfSU5fQ09OVEVYVChjb25zdHJhaW50LCBwcmV2LCBjdXJyKSBcCisgICgoKChjdXJyKSAm IENUWF9OT05FICAgICAgPyBPVEhFUl9DT05TVFJBSU5UIChjb25zdHJhaW50KSA6IDApIFwKKyAg ICB8ICgoY3VycikgJiBDVFhfTEVUVEVSICA/IExFVFRFUl9DT05TVFJBSU5UIChjb25zdHJhaW50 KSA6IDApIFwKKyAgICB8ICgoY3VycikgJiBDVFhfTkVXTElORSA/IE5FV0xJTkVfQ09OU1RSQUlO VCAoY29uc3RyYWludCkgOiAwKSkgJiAocHJldikpCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9z IGRlc2NyaWJlIHdoYXQgYSBjb25zdHJhaW50IGRlcGVuZHMgb24uICAqLworI2RlZmluZSBQUkVW X05FV0xJTkVfQ09OU1RSQUlOVChjb25zdHJhaW50KSAoKChjb25zdHJhaW50KSA+PiAyKSAmIDB4 MTExKQorI2RlZmluZSBQUkVWX0xFVFRFUl9DT05TVFJBSU5UKGNvbnN0cmFpbnQpICAoKChjb25z dHJhaW50KSA+PiAxKSAmIDB4MTExKQorI2RlZmluZSBQUkVWX09USEVSX0NPTlNUUkFJTlQoY29u c3RyYWludCkgICAgKChjb25zdHJhaW50KSAgICAgICAmIDB4MTExKQorCisjZGVmaW5lIFBSRVZf TkVXTElORV9ERVBFTkRFTlQoY29uc3RyYWludCkgXAorICAoUFJFVl9ORVdMSU5FX0NPTlNUUkFJ TlQgKGNvbnN0cmFpbnQpICE9IFBSRVZfT1RIRVJfQ09OU1RSQUlOVCAoY29uc3RyYWludCkpCisj ZGVmaW5lIFBSRVZfTEVUVEVSX0RFUEVOREVOVChjb25zdHJhaW50KSBcCisgIChQUkVWX0xFVFRF Ul9DT05TVFJBSU5UIChjb25zdHJhaW50KSAhPSBQUkVWX09USEVSX0NPTlNUUkFJTlQgKGNvbnN0 cmFpbnQpKQorCisvKiBUb2tlbnMgdGhhdCBtYXRjaCB0aGUgZW1wdHkgc3RyaW5nIHN1YmplY3Qg dG8gc29tZSBjb25zdHJhaW50IGFjdHVhbGx5CisgICB3b3JrIGJ5IGFwcGx5aW5nIHRoYXQgY29u c3RyYWludCB0byBkZXRlcm1pbmUgd2hhdCBtYXkgZm9sbG93IHRoZW0sCisgICB0YWtpbmcgaW50 byBhY2NvdW50IHdoYXQgaGFzIGdvbmUgYmVmb3JlLiAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJl CisgICB0aGUgY29uc3RyYWludHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lhbCB0b2tlbnMg cHJldmlvdXNseSBkZWZpbmVkLiAgKi8KKyNkZWZpbmUgTk9fQ09OU1RSQUlOVCAgICAgICAgIDB4 Nzc3CisjZGVmaW5lIEJFR0xJTkVfQ09OU1RSQUlOVCAgICAweDQ0NAorI2RlZmluZSBFTkRMSU5F X0NPTlNUUkFJTlQgICAgMHg3MDAKKyNkZWZpbmUgQkVHV09SRF9DT05TVFJBSU5UICAgIDB4MDUw CisjZGVmaW5lIEVORFdPUkRfQ09OU1RSQUlOVCAgICAweDIwMgorI2RlZmluZSBMSU1XT1JEX0NP TlNUUkFJTlQgICAgMHgyNTIKKyNkZWZpbmUgTk9UTElNV09SRF9DT05TVFJBSU5UIDB4NTI1CisK Ky8qIFRoZSByZWdleHAgaXMgcGFyc2VkIGludG8gYW4gYXJyYXkgb2YgdG9rZW5zIGluIHBvc3Rm aXggZm9ybS4gIFNvbWUgdG9rZW5zCisgICBhcmUgb3BlcmF0b3JzIGFuZCBvdGhlcnMgYXJlIHRl cm1pbmFsIHN5bWJvbHMuICBNb3N0IChidXQgbm90IGFsbCkgb2YgdGhlc2UKKyAgIGNvZGVzIGFy ZSByZXR1cm5lZCBieSB0aGUgbGV4aWNhbCBhbmFseXplci4gICovCisKK3R5cGVkZWYgcHRyZGlm Zl90IHRva2VuOworCisvKiBQcmVkZWZpbmVkIHRva2VuIHZhbHVlcy4gICovCitlbnVtCit7Cisg IEVORCA9IC0xLCAgICAgICAgICAgICAgICAgICAgIC8qIEVORCBpcyBhIHRlcm1pbmFsIHN5bWJv bCB0aGF0IG1hdGNoZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVu ZCBvZiBpbnB1dDsgYW55IHZhbHVlIG9mIEVORCBvciBsZXNzIGluCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHRoZSBwYXJzZSB0cmVlIGlzIHN1Y2ggYSBzeW1ib2wuICBBY2Nl cHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzIG9mIHRoZSBE RkEgYXJlIHRob3NlIHRoYXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhIHRyYW5zaXRpb24gb24gRU5ELiAgKi8KKworICAvKiBPcmRpbmFyeSBjaGFyYWN0 ZXIgdmFsdWVzIGFyZSB0ZXJtaW5hbCBzeW1ib2xzIHRoYXQgbWF0Y2ggdGhlbXNlbHZlcy4gICov CisKKyAgRU1QVFkgPSBOT1RDSEFSLCAgICAgICAgICAgICAgLyogRU1QVFkgaXMgYSB0ZXJtaW5h bCBzeW1ib2wgdGhhdCBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHRoZSBlbXB0eSBzdHJpbmcuICAqLworCisgIEJBQ0tSRUYsICAgICAgICAgICAgICAgICAgICAg IC8qIEJBQ0tSRUYgaXMgZ2VuZXJhdGVkIGJ5IFw8ZGlnaXQ+CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG9yIGJ5IGFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgY29tcGxldGVseSBoYW5kbGVkLiAgSWYg dGhlIHNjYW5uZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0cyBh IHRyYW5zaXRpb24gb24gYmFja3JlZiwgaXQgcmV0dXJucworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhIGtpbmQgb2YgInNlbWktc3VjY2VzcyIgaW5kaWNhdGluZyB0aGF0Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCB3aWxsIGhhdmUgdG8g YmUgdmVyaWZpZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJh Y2t0cmFja2luZyBtYXRjaGVyLiAgKi8KKworICBCRUdMSU5FLCAgICAgICAgICAgICAgICAgICAg ICAvKiBCRUdMSU5FIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBiZWdpbm5p bmcgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLiAgKi8KKwor ICBFTkRMSU5FLCAgICAgICAgICAgICAgICAgICAgICAvKiBFTkRMSU5FIGlzIGEgdGVybWluYWwg c3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgb2YgYSBsaW5lLiAgKi8KKworICBCRUdXT1JELCAg ICAgICAgICAgICAgICAgICAgICAvKiBCRUdXT1JEIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQg bWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgc3Ry aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB3b3JkLiAgKi8KKworICBFTkRXT1JELCAgICAgICAgICAgICAgICAgICAgICAvKiBFTkRX T1JEIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgb2YgYSB3b3JkLiAg Ki8KKworICBMSU1XT1JELCAgICAgICAgICAgICAgICAgICAgICAvKiBMSU1XT1JEIGlzIGEgdGVy bWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB0aGUgZW1wdHkgc3RyaW5nIGF0IHRoZSBiZWdpbm5pbmcgb3IgdGhlCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBhIHdvcmQuICAqLworCisgIE5PVExJTVdP UkQsICAgICAgICAgICAgICAgICAgIC8qIE5PVExJTVdPUkQgaXMgYSB0ZXJtaW5hbCBzeW1ib2wg dGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzIHRoZSBlbXB0 eSBzdHJpbmcgbm90IGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBi ZWdpbm5pbmcgb3IgZW5kIG9mIGEgd29yZC4gICovCisKKyAgUU1BUkssICAgICAgICAgICAgICAg ICAgICAgICAgLyogUU1BUksgaXMgYW4gb3BlcmF0b3Igb2Ygb25lIGFyZ3VtZW50IHRoYXQKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyB6ZXJvIG9yIG9uZSBvY2N1 cnJlbmNlcyBvZiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1l bnQuICAqLworCisgIFNUQVIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNUQVIgaXMgYW4g b3BlcmF0b3Igb2Ygb25lIGFyZ3VtZW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbWF0Y2hlcyB0aGUgS2xlZW5lIGNsb3N1cmUgKHplcm8gb3IgbW9yZQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlcykgb2YgaXRzIGFyZ3VtZW50 LiAgKi8KKworICBQTFVTLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQTFVTIGlzIGFuIG9w ZXJhdG9yIG9mIG9uZSBhcmd1bWVudCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG1hdGNoZXMgdGhlIHBvc2l0aXZlIGNsb3N1cmUgKG9uZSBvciBtb3JlCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzKSBvZiBpdHMgYXJndW1lbnQu ICAqLworCisgIFJFUE1OLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFUE1OIGlzIGEgbGV4 aWNhbCB0b2tlbiBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRvIHRoZSB7bSxufSBjb25zdHJ1Y3QuICBSRVBNTiBuZXZlcgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhcHBlYXJzIGluIHRoZSBjb21waWxlZCB0b2tlbiB2ZWN0b3Iu ICAqLworCisgIENBVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENBVCBpcyBhbiBvcGVy YXRvciBvZiB0d28gYXJndW1lbnRzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWF0Y2hlcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpdHMKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLiAgQ0FUIGlzIG5ldmVyIHJldHVybmVkIGJ5IHRo ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhpY2FsIGFuYWx5emVyLiAg Ki8KKworICBPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPUiBpcyBhbiBvcGVyYXRv ciBvZiB0d28gYXJndW1lbnRzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWF0Y2hlcyBlaXRoZXIgb2YgaXRzIGFyZ3VtZW50cy4gICovCisKKyAgTFBBUkVOLCAgICAg ICAgICAgICAgICAgICAgICAgLyogTFBBUkVOIG5ldmVyIGFwcGVhcnMgaW4gdGhlIHBhcnNlIHRy ZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG9ubHkgYSBsZXhl bWUuICAqLworCisgIFJQQVJFTiwgICAgICAgICAgICAgICAgICAgICAgIC8qIFJQQVJFTiBuZXZl ciBhcHBlYXJzIGluIHRoZSBwYXJzZSB0cmVlLiAgKi8KKworICBBTllDSEFSLCAgICAgICAgICAg ICAgICAgICAgICAvKiBBTllDSEFSIGlzIGEgdGVybWluYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbGlkIG11bHRpYnl0ZSAob3Ig c2luZ2xlIGJ5dGUpIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgSXQgaXMgdXNlZCBvbmx5IGlmIE1CX0NVUl9NQVggPiAxLiAgKi8KKworICBNQkNTRVQsICAg ICAgICAgICAgICAgICAgICAgICAvKiBNQkNTRVQgaXMgc2ltaWxhciB0byBDU0VULCBidXQgZm9y CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJz LiAgKi8KKworICBXQ0hBUiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHJldHVybmVk IGJ5IGxleC4gIHdjdG9rIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRoZSB3aWRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbi4gICovCisKKyAgQ1NFVCAgICAg ICAgICAgICAgICAgICAgICAgICAgLyogQ1NFVCBhbmQgKGFuZCBhbnkgdmFsdWUgZ3JlYXRlcikg aXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCBzeW1ib2wg dGhhdCBtYXRjaGVzIGFueSBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNsYXNzIG9mIGNoYXJhY3RlcnMuICAqLworfTsKKworCisvKiBTdGF0ZXMgb2YgdGhlIHJlY29n bml6ZXIgY29ycmVzcG9uZCB0byBzZXRzIG9mIHBvc2l0aW9ucyBpbiB0aGUgcGFyc2UKKyAgIHRy ZWUsIHRvZ2V0aGVyIHdpdGggdGhlIGNvbnN0cmFpbnRzIHVuZGVyIHdoaWNoIHRoZXkgbWF5IGJl IG1hdGNoZWQuCisgICBTbyBhIHBvc2l0aW9uIGlzIGVuY29kZWQgYXMgYW4gaW5kZXggaW50byB0 aGUgcGFyc2UgdHJlZSB0b2dldGhlciB3aXRoCisgICBhIGNvbnN0cmFpbnQuICAqLwordHlwZWRl ZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5kZXggaW50 byB0aGUgcGFyc2UgYXJyYXkuICAqLworICB1bnNpZ25lZCBpbnQgY29uc3RyYWludDsgICAgICAv KiBDb25zdHJhaW50IGZvciBtYXRjaGluZyB0aGlzIHBvc2l0aW9uLiAgKi8KK30gcG9zaXRpb247 CisKKy8qIFNldHMgb2YgcG9zaXRpb25zIGFyZSBzdG9yZWQgYXMgYXJyYXlzLiAgKi8KK3R5cGVk ZWYgc3RydWN0Cit7CisgIHBvc2l0aW9uICplbGVtczsgICAgICAgICAgICAgIC8qIEVsZW1lbnRz IG9mIHRoaXMgcG9zaXRpb24gc2V0LiAgKi8KKyAgc2l6ZV90IG5lbGVtOyAgICAgICAgICAgICAg ICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LiAgKi8KKyAgc2l6ZV90IGFsbG9j OyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGFsbG9jYXRlZCBpbiBFTEVN Uy4gICovCit9IHBvc2l0aW9uX3NldDsKKworLyogU2V0cyBvZiBsZWF2ZXMgYXJlIGFsc28gc3Rv cmVkIGFzIGFycmF5cy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBzaXplX3QgKmVsZW1zOyAg ICAgICAgICAgICAgICAvKiBFbGVtZW50cyBvZiB0aGlzIHBvc2l0aW9uIHNldC4gICovCisgIHNp emVfdCBuZWxlbTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlz IHNldC4gICovCit9IGxlYWZfc2V0OworCisvKiBBIHN0YXRlIG9mIHRoZSBkZmEgY29uc2lzdHMg b2YgYSBzZXQgb2YgcG9zaXRpb25zLCBzb21lIGZsYWdzLAorICAgYW5kIHRoZSB0b2tlbiB2YWx1 ZSBvZiB0aGUgbG93ZXN0LW51bWJlcmVkIHBvc2l0aW9uIG9mIHRoZSBzdGF0ZSB0aGF0CisgICBj b250YWlucyBhbiBFTkQgdG9rZW4uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGhh c2g7ICAgICAgICAgICAgICAgICAgLyogSGFzaCBvZiB0aGUgcG9zaXRpb25zIG9mIHRoaXMgc3Rh dGUuICAqLworICBwb3NpdGlvbl9zZXQgZWxlbXM7ICAgICAgICAgICAvKiBQb3NpdGlvbnMgdGhp cyBzdGF0ZSBjb3VsZCBtYXRjaC4gICovCisgIHVuc2lnbmVkIGNoYXIgY29udGV4dDsgICAgICAg IC8qIENvbnRleHQgZnJvbSBwcmV2aW91cyBzdGF0ZS4gICovCisgIHVuc2lnbmVkIHNob3J0IGNv bnN0cmFpbnQ7ICAgIC8qIENvbnN0cmFpbnQgZm9yIHRoaXMgc3RhdGUgdG8gYWNjZXB0LiAgKi8K KyAgdG9rZW4gZmlyc3RfZW5kOyAgICAgICAgICAgICAgLyogVG9rZW4gdmFsdWUgb2YgdGhlIGZp cnN0IEVORCBpbiBlbGVtcy4gICovCisgIHBvc2l0aW9uX3NldCBtYnBzOyAgICAgICAgICAgIC8q IFBvc2l0aW9ucyB3aGljaCBjYW4gbWF0Y2ggbXVsdGlieXRlCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIGUuZy4sIHBlcmlvZC4KKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIE1CX0NVUl9NQVggPiAxLiAgKi8KK30g ZGZhX3N0YXRlOworCisvKiBTdGF0ZXMgYXJlIGluZGV4ZWQgYnkgc3RhdGVfbnVtIHZhbHVlcy4g IFRoZXNlIGFyZSBub3JtYWxseQorICAgbm9ubmVnYXRpdmUgYnV0IC0xIGlzIHVzZWQgYXMgYSBz cGVjaWFsIHZhbHVlLiAgKi8KK3R5cGVkZWYgcHRyZGlmZl90IHN0YXRlX251bTsKKworLyogQSBi cmFja2V0IG9wZXJhdG9yLgorICAgZS5nLiwgW2EtY10sIFtbOmFscGhhOl1dLCBldGMuICAqLwor c3RydWN0IG1iX2NoYXJfY2xhc3NlcworeworICBwdHJkaWZmX3QgY3NldDsKKyAgYm9vbCBpbnZl cnQ7CisgIHdjaGFyX3QgKmNoYXJzOyAgICAgICAgICAgICAgIC8qIE5vcm1hbCBjaGFyYWN0ZXJz LiAgKi8KKyAgc2l6ZV90IG5jaGFyczsKK307CisKKy8qIEEgY29tcGlsZWQgcmVndWxhciBleHBy ZXNzaW9uLiAgKi8KK3N0cnVjdCBkZmEKK3sKKyAgLyogRmllbGRzIGZpbGxlZCBieSB0aGUgc2Nh bm5lci4gICovCisgIGNoYXJjbGFzcyAqY2hhcmNsYXNzZXM7ICAgICAgIC8qIEFycmF5IG9mIGNo YXJhY3RlciBzZXRzIGZvciBDU0VUIHRva2Vucy4gICovCisgIHNpemVfdCBjaW5kZXg7ICAgICAg ICAgICAgICAgIC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IGNoYXJjbGFzc2VzLiAgKi8KKyAgc2l6 ZV90IGNhbGxvYzsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYXJjbGFzc2VzIGFsbG9j YXRlZC4gICovCisKKyAgLyogRmllbGRzIGZpbGxlZCBieSB0aGUgcGFyc2VyLiAgKi8KKyAgdG9r ZW4gKnRva2VuczsgICAgICAgICAgICAgICAgLyogUG9zdGZpeCBwYXJzZSBhcnJheS4gICovCisg IHNpemVfdCB0aW5kZXg7ICAgICAgICAgICAgICAgIC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IHRv a2Vucy4gICovCisgIHNpemVfdCB0YWxsb2M7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0 b2tlbnMgY3VycmVudGx5IGFsbG9jYXRlZC4gICovCisgIHNpemVfdCBkZXB0aDsgICAgICAgICAg ICAgICAgIC8qIERlcHRoIHJlcXVpcmVkIG9mIGFuIGV2YWx1YXRpb24gc3RhY2sKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZGVwdGgtZmlyc3QgdHJhdmVyc2Fs IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSB0cmVlLiAg Ki8KKyAgc2l6ZV90IG5sZWF2ZXM7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGxlYXZlcyBv biB0aGUgcGFyc2UgdHJlZS4gICovCisgIHNpemVfdCBucmVnZXhwczsgICAgICAgICAgICAgIC8q IENvdW50IG9mIHBhcmFsbGVsIHJlZ2V4cHMgYmVpbmcgYnVpbHQKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgd2l0aCBkZmFwYXJzZS4gICovCisgIGJvb2wgZmFzdDsJCQkvKiBU aGUgREZBIGlzIGZhc3QuICAqLworICBib29sIG11bHRpYnl0ZTsJCS8qIE1CX0NVUl9NQVggPiAx LiAgKi8KKyAgdG9rZW4gdXRmOF9hbnljaGFyX2NsYXNzZXNbNV07IC8qIFRvIGxvd2VyIEFOWUNI QVIgaW4gVVRGLTggbG9jYWxlcy4gICovCisgIG1ic3RhdGVfdCBtYnM7CQkvKiBNdWx0aWJ5dGUg Y29udmVyc2lvbiBzdGF0ZS4gICovCisKKyAgLyogZGZhZXhlYyBpbXBsZW1lbnRhdGlvbi4gICov CisgIGNoYXIgKigqZGZhZXhlYykgKHN0cnVjdCBkZmEgKiwgY2hhciBjb25zdCAqLCBjaGFyICos CisgICAgICAgICAgICAgICAgICAgIGJvb2wsIHNpemVfdCAqLCBib29sICopOworCisgIC8qIFRo ZSBmb2xsb3dpbmcgYXJlIHZhbGlkIG9ubHkgaWYgTUJfQ1VSX01BWCA+IDEuICAqLworCisgIC8q IFRoZSB2YWx1ZSBvZiBtdWx0aWJ5dGVfcHJvcFtpXSBpcyBkZWZpbmVkIGJ5IGZvbGxvd2luZyBy dWxlLgorICAgICBpZiB0b2tlbnNbaV0gPCBOT1RDSEFSCisgICAgIGJpdCAwIDogdG9rZW5zW2ld IGlzIHRoZSBmaXJzdCBieXRlIG9mIGEgY2hhcmFjdGVyLCBpbmNsdWRpbmcKKyAgICAgc2luZ2xl LWJ5dGUgY2hhcmFjdGVycy4KKyAgICAgYml0IDEgOiB0b2tlbnNbaV0gaXMgdGhlIGxhc3QgYnl0 ZSBvZiBhIGNoYXJhY3RlciwgaW5jbHVkaW5nCisgICAgIHNpbmdsZS1ieXRlIGNoYXJhY3RlcnMu CisKKyAgICAgaWYgdG9rZW5zW2ldID0gTUJDU0VUCisgICAgICgidGhlIGluZGV4IG9mIG1iY3Nl dHMgY29ycmVzcG9uZGluZyB0byB0aGlzIG9wZXJhdG9yIiA8PCAyKSArIDMKKworICAgICBlLmcu CisgICAgIHRva2VucworICAgICA9ICdzaW5nbGVfYnl0ZV9hJywgJ211bHRpX2J5dGVfQScsIHNp bmdsZV9ieXRlX2InCisgICAgID0gJ3NiX2EnLCAnbWJfQSgxc3QgYnl0ZSknLCAnbWJfQSgybmQg Ynl0ZSknLCAnbWJfQSgzcmQgYnl0ZSknLCAnc2JfYicKKyAgICAgbXVsdGlieXRlX3Byb3AKKyAg ICAgPSAzICAgICAsIDEgICAgICAgICAgICAgICAsICAwICAgICAgICAgICAgICAsICAyICAgICAg ICAgICAgICAsIDMKKyAgICovCisgIGludCAqbXVsdGlieXRlX3Byb3A7CisKKyAgLyogQXJyYXkg b2YgdGhlIGJyYWNrZXQgZXhwcmVzc2lvbiBpbiB0aGUgREZBLiAgKi8KKyAgc3RydWN0IG1iX2No YXJfY2xhc3NlcyAqbWJjc2V0czsKKyAgc2l6ZV90IG5tYmNzZXRzOworICBzaXplX3QgbWJjc2V0 c19hbGxvYzsKKworICAvKiBGaWVsZHMgZmlsbGVkIGJ5IHRoZSBzdXBlcnNldC4gICovCisgIHN0 cnVjdCBkZmEgKnN1cGVyc2V0OyAgICAgICAgICAgICAvKiBIaW50IG9mIHRoZSBkZmEuICAqLwor CisgIC8qIEZpZWxkcyBmaWxsZWQgYnkgdGhlIHN0YXRlIGJ1aWxkZXIuICAqLworICBkZmFfc3Rh dGUgKnN0YXRlczsgICAgICAgICAgICAvKiBTdGF0ZXMgb2YgdGhlIGRmYS4gICovCisgIHN0YXRl X251bSBzaW5kZXg7ICAgICAgICAgICAgIC8qIEluZGV4IGZvciBhZGRpbmcgbmV3IHN0YXRlcy4g ICovCisgIHNpemVfdCBzYWxsb2M7CQkvKiBOdW1iZXIgb2Ygc3RhdGVzIGN1cnJlbnRseSBhbGxv Y2F0ZWQuICAqLworCisgIC8qIEZpZWxkcyBmaWxsZWQgYnkgdGhlIHBhcnNlIHRyZWUtPk5GQSBj b252ZXJzaW9uLiAgKi8KKyAgcG9zaXRpb25fc2V0ICpmb2xsb3dzOyAgICAgICAgLyogQXJyYXkg b2YgZm9sbG93IHNldHMsIGluZGV4ZWQgYnkgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaW5kZXguICBUaGUgZm9sbG93IG9mIGEgcG9zaXRpb24gaXMgdGhlIHNl dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBwb3NpdGlvbnMgY29udGFp bmluZyBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y291bGQgY29uY2VpdmFibHkgZm9sbG93IGEgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1hdGNoaW5nIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZyB0aGUgcmVnZXhwLiAg QWxsb2NhdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhp bXVtIHBvc3NpYmxlIHBvc2l0aW9uIGluZGV4LiAgKi8KKyAgYm9vbCBzZWFyY2hmbGFnOwkJLyog V2UgYXJlIHN1cHBvc2VkIHRvIGJ1aWxkIGEgc2VhcmNoaW5nCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGFzIG9wcG9zZWQgdG8gYW4gZXhhY3QgbWF0Y2hlci4gIEEgc2VhcmNo aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIgZmluZHMgdGhl IGZpcnN0IGFuZCBzaG9ydGVzdCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWF0Y2hpbmcgYSByZWdleHAgYW55d2hlcmUgaW4gdGhlIGJ1ZmZlciwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVhcyBhbiBleGFjdCBtYXRjaGVyIGZpbmRz IHRoZSBsb25nZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBt YXRjaGluZywgYnV0IGFuY2hvcmVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gICovCisKKyAgLyogRmllbGRzIGZpbGxl ZCBieSBkZmFleGVjLiAgKi8KKyAgc3RhdGVfbnVtIHRyYWxsb2M7ICAgICAgICAgICAgLyogTnVt YmVyIG9mIHRyYW5zaXRpb24gdGFibGVzIHRoYXQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzbG90cyBzbyBmYXIsIG5vdCBjb3VudGluZyB0cmFuc1stMV0uICAqLwor ICBpbnQgdHJjb3VudDsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdHJhbnNpdGlvbiB0 YWJsZXMgdGhhdCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVh bGx5IGJlZW4gYnVpbHQuICAqLworICBpbnQgbWluX3RyY291bnQ7ICAgICAgICAgICAgICAvKiBN aW5pbXVtIG9mIG51bWJlciBvZiB0cmFuc2l0aW9uIHRhYmxlcy4KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgQWx3YXlzIGtlZXAgdGhlIG51bWJlciwgZXZlbiBhZnRlciBmcmVl aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFuc2l0aW9uIHRh Ymxlcy4gIEl0IGlzIGFsc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG51bWJlciBvZiBpbml0aWFsIHN0YXRlcy4gICovCisgIHN0YXRlX251bSAqKnRyYW5zOyAgICAg ICAgICAgIC8qIFRyYW5zaXRpb24gdGFibGVzIGZvciBzdGF0ZXMgdGhhdCBjYW4KKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgYWNjZXB0LiAgSWYgdGhlIHRyYW5zaXRp b25zIGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIGhhdmUg bm90IHlldCBiZWVuIGNvbXB1dGVkLCBvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RhdGUgY291bGQgcG9zc2libHkgYWNjZXB0LCBpdHMgZW50cnkgaW4KKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB0YWJsZSBpcyBOVUxMLiAgVGhpcyBw b2ludHMgdG8gb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3QgdGhl IHN0YXJ0IG9mIHRoZSBhbGxvY2F0ZWQgYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFuZCB0cmFuc1stMV0gaXMgYWx3YXlzIE5VTEwuICAqLworICBzdGF0ZV9udW0g KipmYWlsczsgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRhYmxlcyBhZnRlciBmYWlsaW5nIHRv IGFjY2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIHN0YXRlIHRo YXQgcG90ZW50aWFsbHkgY291bGQgZG8gc28uICAqLworICBpbnQgKnN1Y2Nlc3M7ICAgICAgICAg ICAgICAgICAvKiBUYWJsZSBvZiBhY2NlcHRhbmNlIGNvbmRpdGlvbnMgdXNlZCBpbgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmFleGVjIGFuZCBjb21wdXRlZCBpbiBidWls ZF9zdGF0ZS4gICovCisgIHN0YXRlX251bSAqbmV3bGluZXM7ICAgICAgICAgIC8qIFRyYW5zaXRp b25zIG9uIG5ld2xpbmVzLiAgVGhlIGVudHJ5IGZvciBhCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG5ld2xpbmUgaW4gYW55IHRyYW5zaXRpb24gdGFibGUgaXMgYWx3YXlzCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIHNvIHdlIGNhbiBjb3VudCBsaW5l cyB3aXRob3V0IHdhc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9v IG1hbnkgY3ljbGVzLiAgVGhlIHRyYW5zaXRpb24gZm9yIGEKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbmV3bGluZSBpcyBzdG9yZWQgc2VwYXJhdGVseSBhbmQgaGFuZGxlZAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIHNwZWNpYWwgY2FzZS4gIE5l d2xpbmUgaXMgYWxzbyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFz IGEgc2VudGluZWwgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgc3RhdGVfbnVtIGlu aXRzdGF0ZV9ub3Rib2w7ICAgLyogSW5pdGlhbCBzdGF0ZSBmb3IgQ1RYX0xFVFRFUiBhbmQgQ1RY X05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBpbiBtdWx0 aWJ5dGUgbG9jYWxlcywgaW4gd2hpY2ggd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZG8gbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlaXIgY29udGV4dHMsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIG5vdCBzdXBwb3J0ZWQgd29yZC4gICovCisg IHBvc2l0aW9uX3NldCBtYl9mb2xsb3dzOyAgICAgIC8qIEZvbGxvdyBzZXQgYWRkZWQgYnkgQU5Z Q0hBUiBhbmQvb3IgTUJDU0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9u IGRlbWFuZC4gICovCit9OworCisvKiBTb21lIG1hY3JvcyBmb3IgdXNlciBhY2Nlc3MgdG8gZGZh IGludGVybmFscy4gICovCisKKy8qIFMgY291bGQgcG9zc2libHkgYmUgYW4gYWNjZXB0aW5nIHN0 YXRlIG9mIFIuICAqLworI2RlZmluZSBBQ0NFUFRJTkcocywgcikgKChyKS5zdGF0ZXNbc10uY29u c3RyYWludCkKKworLyogU1RBVEUgYWNjZXB0cyBpbiB0aGUgc3BlY2lmaWVkIGNvbnRleHQuICAq LworI2RlZmluZSBBQ0NFUFRTX0lOX0NPTlRFWFQocHJldiwgY3Vyciwgc3RhdGUsIGRmYSkgXAor ICBTVUNDRUVEU19JTl9DT05URVhUICgoZGZhKS5zdGF0ZXNbc3RhdGVdLmNvbnN0cmFpbnQsIHBy ZXYsIGN1cnIpCisKK3N0YXRpYyB2b2lkIHJlZ2V4cCAodm9pZCk7CisKKy8qIEEgdGFibGUgaW5k ZXhlZCBieSBieXRlIHZhbHVlcyB0aGF0IGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIHdpZGUK KyAgIGNoYXJhY3RlciAoaWYgYW55KSBmb3IgdGhhdCBieXRlLiAgV0VPRiBtZWFucyB0aGUgYnl0 ZSBpcyBub3QgYQorICAgdmFsaWQgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyLiAgKi8KK3N0YXRpYyB3 aW50X3QgbWJydG93Y19jYWNoZVtOT1RDSEFSXTsKKworLyogU3RvcmUgaW50byAqUFdDIHRoZSBy ZXN1bHQgb2YgY29udmVydGluZyB0aGUgbGVhZGluZyBieXRlcyBvZiB0aGUKKyAgIG11bHRpYnl0 ZSBidWZmZXIgUyBvZiBsZW5ndGggTiBieXRlcywgdXNpbmcgdGhlIG1icnRvd2NfY2FjaGUgaW4g KkQKKyAgIGFuZCB1cGRhdGluZyB0aGUgY29udmVyc2lvbiBzdGF0ZSBpbiAqRC4gIE9uIGNvbnZl cnNpb24gZXJyb3IsCisgICBjb252ZXJ0IGp1c3QgYSBzaW5nbGUgYnl0ZSwgdG8gV0VPRi4gIFJl dHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICBjb252ZXJ0ZWQuCisKKyAgIFRoaXMgZGlmZmVy cyBmcm9tIG1icnRvd2MgKFBXQywgUywgTiwgJkQtPm1icykgYXMgZm9sbG93czoKKworICAgKiBQ V0MgcG9pbnRzIHRvIHdpbnRfdCwgbm90IHRvIHdjaGFyX3QuCisgICAqIFRoZSBsYXN0IGFyZyBp cyBhIGRmYSAqRCBpbnN0ZWFkIG9mIG1lcmVseSBhIG11bHRpYnl0ZSBjb252ZXJzaW9uCisgICAg IHN0YXRlIEQtPm1icy4gIEQgYWxzbyBjb250YWlucyBhbiBtYnJ0b3djX2NhY2hlIGZvciBzcGVl ZC4KKyAgICogTiBtdXN0IGJlIGF0IGxlYXN0IDEuCisgICAqIFNbTiAtIDFdIG11c3QgYmUgYSBz ZW50aW5lbCBieXRlLgorICAgKiBTaGlmdCBlbmNvZGluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCisg ICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIGluIHRoZSByYW5nZSAxLi5OLgorICAgKiBE LT5tYnMgaXMgYWx3YXlzIHZhbGlkIGFmdGVyd2FyZHMuCisgICAqICpQV0MgaXMgYWx3YXlzIHNl dCB0byBzb21ldGhpbmcuICAqLworc3RhdGljIHNpemVfdAorbWJzX3RvX3djaGFyICh3aW50X3Qg KnB3YywgY2hhciBjb25zdCAqcywgc2l6ZV90IG4sIHN0cnVjdCBkZmEgKmQpCit7CisgIHVuc2ln bmVkIGNoYXIgdWMgPSBzWzBdOworICB3aW50X3Qgd2MgPSBtYnJ0b3djX2NhY2hlW3VjXTsKKwor ICBpZiAod2MgPT0gV0VPRikKKyAgICB7CisgICAgICB3Y2hhcl90IHdjaDsKKyAgICAgIHNpemVf dCBuYnl0ZXMgPSBtYnJ0b3djICgmd2NoLCBzLCBuLCAmZC0+bWJzKTsKKyAgICAgIGlmICgwIDwg bmJ5dGVzICYmIG5ieXRlcyA8IChzaXplX3QpIC0yKQorICAgICAgICB7CisgICAgICAgICAgKnB3 YyA9IHdjaDsKKyAgICAgICAgICByZXR1cm4gbmJ5dGVzOworICAgICAgICB9CisgICAgICBtZW1z ZXQgKCZkLT5tYnMsIDAsIHNpemVvZiBkLT5tYnMpOworICAgIH0KKworICAqcHdjID0gd2M7Cisg IHJldHVybiAxOworfQorCisjaWZkZWYgREVCVUcKKworc3RhdGljIHZvaWQKK3BydG9rICh0b2tl biB0KQoreworICBjaGFyIGNvbnN0ICpzOworCisgIGlmICh0IDwgMCkKKyAgICBmcHJpbnRmIChz dGRlcnIsICJFTkQiKTsKKyAgZWxzZSBpZiAodCA8IE5PVENIQVIpCisgICAgeworICAgICAgdW5z aWduZWQgaW50IGNoID0gdDsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIjB4JTAyeCIsIGNoKTsK KyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKHQpCisgICAgICAgIHsKKyAgICAg ICAgY2FzZSBFTVBUWToKKyAgICAgICAgICBzID0gIkVNUFRZIjsKKyAgICAgICAgICBicmVhazsK KyAgICAgICAgY2FzZSBCQUNLUkVGOgorICAgICAgICAgIHMgPSAiQkFDS1JFRiI7CisgICAgICAg ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVHTElORToKKyAgICAgICAgICBzID0gIkJFR0xJTkUi OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVORExJTkU6CisgICAgICAgICAgcyA9 ICJFTkRMSU5FIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUdXT1JEOgorICAg ICAgICAgIHMgPSAiQkVHV09SRCI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU5E V09SRDoKKyAgICAgICAgICBzID0gIkVORFdPUkQiOworICAgICAgICAgIGJyZWFrOworICAgICAg ICBjYXNlIExJTVdPUkQ6CisgICAgICAgICAgcyA9ICJMSU1XT1JEIjsKKyAgICAgICAgICBicmVh azsKKyAgICAgICAgY2FzZSBOT1RMSU1XT1JEOgorICAgICAgICAgIHMgPSAiTk9UTElNV09SRCI7 CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUU1BUks6CisgICAgICAgICAgcyA9ICJR TUFSSyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBUjoKKyAgICAgICAgICBz ID0gIlNUQVIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBMVVM6CisgICAgICAg ICAgcyA9ICJQTFVTIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQVQ6CisgICAg ICAgICAgcyA9ICJDQVQiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9SOgorICAg ICAgICAgIHMgPSAiT1IiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExQQVJFTjoK KyAgICAgICAgICBzID0gIkxQQVJFTiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug UlBBUkVOOgorICAgICAgICAgIHMgPSAiUlBBUkVOIjsKKyAgICAgICAgICBicmVhazsKKyAgICAg ICAgY2FzZSBBTllDSEFSOgorICAgICAgICAgIHMgPSAiQU5ZQ0hBUiI7CisgICAgICAgICAgYnJl YWs7CisgICAgICAgIGNhc2UgTUJDU0VUOgorICAgICAgICAgIHMgPSAiTUJDU0VUIjsKKyAgICAg ICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzID0gIkNTRVQiOworICAg ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsIHMp OworICAgIH0KK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBTdHVmZiBwZXJ0YWluaW5nIHRv IGNoYXJjbGFzc2VzLiAgKi8KKworc3RhdGljIGJvb2wKK3RzdGJpdCAodW5zaWduZWQgaW50IGIs IGNoYXJjbGFzcyBjb25zdCBjKQoreworICByZXR1cm4gY1tiIC8gQ0hBUkNMQVNTX1dPUkRfQklU U10gPj4gYiAlIENIQVJDTEFTU19XT1JEX0JJVFMgJiAxOworfQorCitzdGF0aWMgdm9pZAorc2V0 Yml0ICh1bnNpZ25lZCBpbnQgYiwgY2hhcmNsYXNzIGMpCit7CisgIGNbYiAvIENIQVJDTEFTU19X T1JEX0JJVFNdIHw9IChjaGFyY2xhc3Nfd29yZCkgMSA8PCBiICUgQ0hBUkNMQVNTX1dPUkRfQklU UzsKK30KKworc3RhdGljIHZvaWQKK2NscmJpdCAodW5zaWduZWQgaW50IGIsIGNoYXJjbGFzcyBj KQoreworICBjW2IgLyBDSEFSQ0xBU1NfV09SRF9CSVRTXSAmPSB+KChjaGFyY2xhc3Nfd29yZCkg MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGIgJSBDSEFSQ0xBU1NfV09S RF9CSVRTKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlzZXQgKGNoYXJjbGFzcyBjb25zdCBzcmMs IGNoYXJjbGFzcyBkc3QpCit7CisgIG1lbWNweSAoZHN0LCBzcmMsIHNpemVvZiAoY2hhcmNsYXNz KSk7Cit9CisKK3N0YXRpYyB2b2lkCit6ZXJvc2V0IChjaGFyY2xhc3MgcykKK3sKKyAgbWVtc2V0 IChzLCAwLCBzaXplb2YgKGNoYXJjbGFzcykpOworfQorCitzdGF0aWMgdm9pZAorbm90c2V0IChj aGFyY2xhc3MgcykKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IENIQVJDTEFTU19X T1JEUzsgKytpKQorICAgIHNbaV0gPSBDSEFSQ0xBU1NfV09SRF9NQVNLICYgfnNbaV07Cit9CisK K3N0YXRpYyBib29sCitlcXVhbCAoY2hhcmNsYXNzIGNvbnN0IHMxLCBjaGFyY2xhc3MgY29uc3Qg czIpCit7CisgIHJldHVybiBtZW1jbXAgKHMxLCBzMiwgc2l6ZW9mIChjaGFyY2xhc3MpKSA9PSAw OworfQorCisvKiBFbnN1cmUgdGhhdCB0aGUgYXJyYXkgYWRkcmVzc2VkIGJ5IFBUUiBob2xkcyBh dCBsZWFzdCBOSVRFTVMgKworICAgKFBUUiB8fCAhTklURU1TKSBpdGVtcy4gIEVpdGhlciByZXR1 cm4gUFRSLCBvciByZWFsbG9jYXRlIHRoZSBhcnJheQorICAgYW5kIHJldHVybiBpdHMgbmV3IGFk ZHJlc3MuICBBbHRob3VnaCBQVFIgbWF5IGJlIG51bGwsIHRoZSByZXR1cm5lZAorICAgdmFsdWUg aXMgbmV2ZXIgbnVsbC4KKworICAgVGhlIGFycmF5IGhvbGRzICpOQUxMT0MgaXRlbXM7ICpOQUxM T0MgaXMgdXBkYXRlZCBvbiByZWFsbG9jYXRpb24uCisgICBJVEVNU0laRSBpcyB0aGUgc2l6ZSBv ZiBvbmUgaXRlbS4gIEF2b2lkIE8oTioqMikgYmVoYXZpb3Igb24gYXJyYXlzCisgICBncm93aW5n IGxpbmVhcmx5LiAgKi8KK3N0YXRpYyB2b2lkICoKK21heWJlX3JlYWxsb2MgKHZvaWQgKnB0ciwg c2l6ZV90IG5pdGVtcywgc2l6ZV90ICpuYWxsb2MsIHNpemVfdCBpdGVtc2l6ZSkKK3sKKyAgaWYg KG5pdGVtcyA8ICpuYWxsb2MpCisgICAgcmV0dXJuIHB0cjsKKyAgKm5hbGxvYyA9IG5pdGVtczsK KyAgcmV0dXJuIHgybnJlYWxsb2MgKHB0ciwgbmFsbG9jLCBpdGVtc2l6ZSk7Cit9CisKKy8qIElu IERGQSBELCBmaW5kIHRoZSBpbmRleCBvZiBjaGFyY2xhc3MgUywgb3IgYWxsb2NhdGUgYSBuZXcg b25lLiAgKi8KK3N0YXRpYyBzaXplX3QKK2RmYV9jaGFyY2xhc3NfaW5kZXggKHN0cnVjdCBkZmEg KmQsIGNoYXJjbGFzcyBjb25zdCBzKQoreworICBzaXplX3QgaTsKKworICBmb3IgKGkgPSAwOyBp IDwgZC0+Y2luZGV4OyArK2kpCisgICAgaWYgKGVxdWFsIChzLCBkLT5jaGFyY2xhc3Nlc1tpXSkp CisgICAgICByZXR1cm4gaTsKKyAgZC0+Y2hhcmNsYXNzZXMgPSBtYXliZV9yZWFsbG9jIChkLT5j aGFyY2xhc3NlcywgZC0+Y2luZGV4LCAmZC0+Y2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpemVvZiAqZC0+Y2hhcmNsYXNzZXMpOworICArK2QtPmNpbmRleDsKKyAg Y29weXNldCAocywgZC0+Y2hhcmNsYXNzZXNbaV0pOworICByZXR1cm4gaTsKK30KKworLyogQSBw b2ludGVyIHRvIHRoZSBjdXJyZW50IGRmYSBpcyBrZXB0IGhlcmUgZHVyaW5nIHBhcnNpbmcuICAq Lworc3RhdGljIHN0cnVjdCBkZmEgKmRmYTsKKworLyogRmluZCB0aGUgaW5kZXggb2YgY2hhcmNs YXNzIFMgaW4gdGhlIGN1cnJlbnQgREZBLCBvciBhbGxvY2F0ZSBhIG5ldyBvbmUuICAqLworc3Rh dGljIHNpemVfdAorY2hhcmNsYXNzX2luZGV4IChjaGFyY2xhc3MgY29uc3QgcykKK3sKKyAgcmV0 dXJuIGRmYV9jaGFyY2xhc3NfaW5kZXggKGRmYSwgcyk7Cit9CisKKy8qIFN5bnRheCBiaXRzIGNv bnRyb2xsaW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgbGV4aWNhbCBhbmFseXplci4gICovCitzdGF0 aWMgcmVnX3N5bnRheF90IHN5bnRheF9iaXRzOworc3RhdGljIGJvb2wgc3ludGF4X2JpdHNfc2V0 OworCisvKiBGbGFnIGZvciBjYXNlLWZvbGRpbmcgbGV0dGVycyBpbnRvIHNldHMuICAqLworc3Rh dGljIGJvb2wgY2FzZV9mb2xkOworCisvKiBFbmQtb2YtbGluZSBieXRlIGluIGRhdGEuICAqLwor c3RhdGljIHVuc2lnbmVkIGNoYXIgZW9sYnl0ZTsKKworLyogQ2FjaGUgb2YgY2hhci1jb250ZXh0 IHZhbHVlcy4gICovCitzdGF0aWMgaW50IHNiaXRbTk9UQ0hBUl07CisKKy8qIElmIG5ldmVyX3Ry YWlsW0JdLCB0aGUgYnl0ZSBCIGNhbm5vdCBiZSBhIG5vbi1pbml0aWFsIGJ5dGUgaW4gYQorICAg bXVsdGlieXRlIGNoYXJhY3Rlci4gICovCitzdGF0aWMgYm9vbCBuZXZlcl90cmFpbFtOT1RDSEFS XTsKKworLyogU2V0IG9mIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBsZXR0ZXJzLiAgKi8KK3N0YXRp YyBjaGFyY2xhc3MgbGV0dGVyczsKKworLyogU2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgbmV3 bGluZS4gICovCitzdGF0aWMgY2hhcmNsYXNzIG5ld2xpbmU7CisKK3N0YXRpYyBib29sCit1bmli eXRlX3dvcmRfY29uc3RpdHVlbnQgKHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgcmV0dXJuIG1icnRv d2NfY2FjaGVbY10gIT0gV0VPRiAmJiAoaXNhbG51bSAoYykgfHwgKGMpID09ICdfJyk7Cit9CisK K3N0YXRpYyBpbnQKK2NoYXJfY29udGV4dCAodW5zaWduZWQgY2hhciBjKQoreworICBpZiAoYyA9 PSBlb2xieXRlKQorICAgIHJldHVybiBDVFhfTkVXTElORTsKKyAgaWYgKHVuaWJ5dGVfd29yZF9j b25zdGl0dWVudCAoYykpCisgICAgcmV0dXJuIENUWF9MRVRURVI7CisgIHJldHVybiBDVFhfTk9O RTsKK30KKworLyogRW50cnkgcG9pbnQgdG8gc2V0IHN5bnRheCBvcHRpb25zLiAgKi8KK3ZvaWQK K2RmYXN5bnRheCAocmVnX3N5bnRheF90IGJpdHMsIGJvb2wgZm9sZCwgdW5zaWduZWQgY2hhciBl b2wpCit7CisgIGludCBpOworICBzeW50YXhfYml0c19zZXQgPSB0cnVlOworICBzeW50YXhfYml0 cyA9IGJpdHM7CisgIGNhc2VfZm9sZCA9IGZvbGQ7CisgIGVvbGJ5dGUgPSBlb2w7CisKKyAgZm9y IChpID0gQ0hBUl9NSU47IGkgPD0gQ0hBUl9NQVg7ICsraSkKKyAgICB7CisgICAgICBjaGFyIGMg PSBpOworICAgICAgdW5zaWduZWQgY2hhciB1YyA9IGk7CisgICAgICBtYnN0YXRlX3QgcyA9IHsg MCB9OworICAgICAgd2NoYXJfdCB3YzsKKyAgICAgIG1icnRvd2NfY2FjaGVbdWNdID0gbWJydG93 YyAoJndjLCAmYywgMSwgJnMpIDw9IDEgPyB3YyA6IFdFT0Y7CisKKyAgICAgIC8qIE5vdyB0aGF0 IG1icnRvd2NfY2FjaGVbdWNdIGlzIHNldCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSBzYml0LiAgKi8K KyAgICAgIHNiaXRbdWNdID0gY2hhcl9jb250ZXh0ICh1Yyk7CisgICAgICBzd2l0Y2ggKHNiaXRb dWNdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1RYX0xFVFRFUjoKKyAgICAgICAgICBzZXRi aXQgKHVjLCBsZXR0ZXJzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFhfTkVX TElORToKKyAgICAgICAgICBzZXRiaXQgKHVjLCBuZXdsaW5lKTsKKyAgICAgICAgICBicmVhazsK KyAgICAgICAgfQorCisgICAgICAvKiBQT1NJWCByZXF1aXJlcyB0aGF0IHRoZSBmaXZlIGJ5dGVz IGluICJcblxyLi8iIChpbmNsdWRpbmcgdGhlCisgICAgICAgICB0ZXJtaW5hdGluZyBOVUwpIGNh bm5vdCBvY2N1ciBpbnNpZGUgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAgKi8KKyAgICAgIG5ldmVy X3RyYWlsW3VjXSA9ICh1c2luZ191dGY4ICgpID8gKHVjICYgMHhjMCkgIT0gMHg4MAorICAgICAg ICAgICAgICAgICAgICAgICAgIDogc3RyY2hyICgiXG5cci4vIiwgdWMpICE9IE5VTEwpOworICAg IH0KK30KKworLyogU2V0IGEgYml0IGluIHRoZSBjaGFyY2xhc3MgZm9yIHRoZSBnaXZlbiB3Y2hh cl90LiAgRG8gbm90aGluZyBpZiBXQworICAgaXMgcmVwcmVzZW50ZWQgYnkgYSBtdWx0aS1ieXRl IHNlcXVlbmNlLiAgRXZlbiBmb3IgTUJfQ1VSX01BWCA9PSAxLAorICAgdGhpcyBtYXkgaGFwcGVu IHdoZW4gZm9sZGluZyBjYXNlIGluIHdlaXJkIFR1cmtpc2ggbG9jYWxlcyB3aGVyZQorICAgZG90 bGVzcyBpL2RvdHRlZCBJIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGNob3NlbiBjaGFyYWN0ZXIg c2V0LgorICAgUmV0dXJuIHdoZXRoZXIgYSBiaXQgd2FzIHNldCBpbiB0aGUgY2hhcmNsYXNzLiAg Ki8KK3N0YXRpYyBib29sCitzZXRiaXRfd2MgKHdpbnRfdCB3YywgY2hhcmNsYXNzIGMpCit7Cisg IGludCBiID0gd2N0b2IgKHdjKTsKKyAgaWYgKGIgPT0gRU9GKQorICAgIHJldHVybiBmYWxzZTsK KworICBzZXRiaXQgKGIsIGMpOworICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2V0IGEgYml0IGZv ciBCIGFuZCBpdHMgY2FzZSB2YXJpYW50cyBpbiB0aGUgY2hhcmNsYXNzIEMuCisgICBNQl9DVVJf TUFYIG11c3QgYmUgMS4gICovCitzdGF0aWMgdm9pZAorc2V0Yml0X2Nhc2VfZm9sZF9jIChpbnQg YiwgY2hhcmNsYXNzIGMpCit7CisgIGludCB1YiA9IHRvdXBwZXIgKGIpOworICBpbnQgaTsKKyAg Zm9yIChpID0gMDsgaSA8IE5PVENIQVI7IGkrKykKKyAgICBpZiAodG91cHBlciAoaSkgPT0gdWIp CisgICAgICBzZXRiaXQgKGksIGMpOworfQorCisKKworLyogVVRGLTggZW5jb2RpbmcgYWxsb3dz IHNvbWUgb3B0aW1pemF0aW9ucyB0aGF0IHdlIGNhbid0IG90aGVyd2lzZQorICAgYXNzdW1lIGlu IGEgbXVsdGlieXRlIGVuY29kaW5nLiAgKi8KK2Jvb2wKK3VzaW5nX3V0ZjggKHZvaWQpCit7Cisg IHN0YXRpYyBpbnQgdXRmOCA9IC0xOworICBpZiAodXRmOCA8IDApCisgICAgeworICAgICAgd2No YXJfdCB3YzsKKyAgICAgIG1ic3RhdGVfdCBtYnMgPSB7IDAgfTsKKyAgICAgIHV0ZjggPSBtYnJ0 b3djICgmd2MsICJceGM0XHg4MCIsIDIsICZtYnMpID09IDIgJiYgd2MgPT0gMHgxMDA7CisgICAg fQorICByZXR1cm4gdXRmODsKK30KKworLyogVGhlIGN1cnJlbnQgbG9jYWxlIGlzIGtub3duIHRv IGJlIGEgdW5pYnl0ZSBsb2NhbGUKKyAgIHdpdGhvdXQgbXVsdGljaGFyYWN0ZXIgY29sbGF0aW5n IHNlcXVlbmNlcyBhbmQgd2hlcmUgcmFuZ2UKKyAgIGNvbXBhcmlzb25zIHNpbXBseSB1c2UgdGhl IG5hdGl2ZSBlbmNvZGluZy4gIFRoZXNlIGxvY2FsZXMgY2FuIGJlCisgICBwcm9jZXNzZWQgbW9y ZSBlZmZpY2llbnRseS4gICovCisKK3N0YXRpYyBib29sCit1c2luZ19zaW1wbGVfbG9jYWxlICh2 b2lkKQoreworICAvKiBUaGUgbmF0aXZlIGNoYXJhY3RlciBzZXQgaXMga25vd24gdG8gYmUgY29t cGF0aWJsZSB3aXRoCisgICAgIHRoZSBDIGxvY2FsZS4gIFRoZSBmb2xsb3dpbmcgdGVzdCBpc24n dCBwZXJmZWN0LCBidXQgaXQncyBnb29kCisgICAgIGVub3VnaCBpbiBwcmFjdGljZSwgYXMgb25s eSBBU0NJSSBhbmQgRUJDRElDIGFyZSBpbiBjb21tb24gdXNlCisgICAgIGFuZCB0aGlzIHRlc3Qg Y29ycmVjdGx5IGFjY2VwdHMgQVNDSUkgYW5kIHJlamVjdHMgRUJDRElDLiAgKi8KKyAgZW51bSB7 IG5hdGl2ZV9jX2NoYXJzZXQgPQorICAgICgnXGInID09IDggJiYgJ1x0JyA9PSA5ICYmICdcbicg PT0gMTAgJiYgJ1x2JyA9PSAxMSAmJiAnXGYnID09IDEyCisgICAgICYmICdccicgPT0gMTMgJiYg JyAnID09IDMyICYmICchJyA9PSAzMyAmJiAnIicgPT0gMzQgJiYgJyMnID09IDM1CisgICAgICYm ICclJyA9PSAzNyAmJiAnJicgPT0gMzggJiYgJ1wnJyA9PSAzOSAmJiAnKCcgPT0gNDAgJiYgJykn ID09IDQxCisgICAgICYmICcqJyA9PSA0MiAmJiAnKycgPT0gNDMgJiYgJywnID09IDQ0ICYmICct JyA9PSA0NSAmJiAnLicgPT0gNDYKKyAgICAgJiYgJy8nID09IDQ3ICYmICcwJyA9PSA0OCAmJiAn OScgPT0gNTcgJiYgJzonID09IDU4ICYmICc7JyA9PSA1OQorICAgICAmJiAnPCcgPT0gNjAgJiYg Jz0nID09IDYxICYmICc+JyA9PSA2MiAmJiAnPycgPT0gNjMgJiYgJ0EnID09IDY1CisgICAgICYm ICdaJyA9PSA5MCAmJiAnWycgPT0gOTEgJiYgJ1xcJyA9PSA5MiAmJiAnXScgPT0gOTMgJiYgJ14n ID09IDk0CisgICAgICYmICdfJyA9PSA5NSAmJiAnYScgPT0gOTcgJiYgJ3onID09IDEyMiAmJiAn eycgPT0gMTIzICYmICd8JyA9PSAxMjQKKyAgICAgJiYgJ30nID09IDEyNSAmJiAnficgPT0gMTI2 KQorICB9OworCisgIGlmICghIG5hdGl2ZV9jX2NoYXJzZXQgfHwgZGZhLT5tdWx0aWJ5dGUpCisg ICAgcmV0dXJuIGZhbHNlOworICBlbHNlCisgICAgeworICAgICAgc3RhdGljIGludCB1bmlieXRl X2MgPSAtMTsKKyAgICAgIGlmICh1bmlieXRlX2MgPCAwKQorICAgICAgICB7CisgICAgICAgICAg Y2hhciBjb25zdCAqbG9jYWxlID0gc2V0bG9jYWxlIChMQ19BTEwsIE5VTEwpOworICAgICAgICAg IHVuaWJ5dGVfYyA9ICghbG9jYWxlCisgICAgICAgICAgICAgICAgICAgICAgIHx8IFNUUkVRIChs b2NhbGUsICJDIikKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgU1RSRVEgKGxvY2FsZSwgIlBP U0lYIikpOworICAgICAgICB9CisgICAgICByZXR1cm4gdW5pYnl0ZV9jOworICAgIH0KK30KKwor LyogTGV4aWNhbCBhbmFseXplci4gIEFsbCB0aGUgZHJvc3MgdGhhdCBkZWFscyB3aXRoIHRoZSBv Ym5veGlvdXMKKyAgIEdOVSBSZWdleCBzeW50YXggYml0cyBpcyBsb2NhdGVkIGhlcmUuICBUaGUg cG9vciwgc3VmZmVyaW5nCisgICByZWFkZXIgaXMgcmVmZXJyZWQgdG8gdGhlIEdOVSBSZWdleCBk b2N1bWVudGF0aW9uIGZvciB0aGUKKyAgIG1lYW5pbmcgb2YgdGhlIEAjJSFAIyVeIUAgc3ludGF4 IGJpdHMuICAqLworCitzdGF0aWMgY2hhciBjb25zdCAqbGV4cHRyOyAgICAgIC8qIFBvaW50ZXIg dG8gbmV4dCBpbnB1dCBjaGFyYWN0ZXIuICAqLworc3RhdGljIHNpemVfdCBsZXhsZWZ0OyAgICAg ICAgICAvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcuICAqLworc3RhdGljIHRva2Vu IGxhc3R0b2s7ICAgICAgICAgICAvKiBQcmV2aW91cyB0b2tlbiByZXR1cm5lZDsgaW5pdGlhbGx5 IEVORC4gICovCitzdGF0aWMgYm9vbCBsYXN0c3RhcnQ7CQkvKiBXZSdyZSBzZXBhcmF0ZWQgZnJv bSBiZWdpbm5pbmcgb3IgKCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBv bmx5IGJ5IHplcm8td2lkdGggY2hhcmFjdGVycy4gICovCitzdGF0aWMgc2l6ZV90IHBhcmVuczsg ICAgICAgICAgIC8qIENvdW50IG9mIG91dHN0YW5kaW5nIGxlZnQgcGFyZW5zLiAgKi8KK3N0YXRp YyBpbnQgbWlucmVwLCBtYXhyZXA7ICAgICAgLyogUmVwZWF0IGNvdW50cyBmb3Ige20sbn0uICAq LworCitzdGF0aWMgaW50IGN1cl9tYl9sZW4gPSAxOyAgICAgIC8qIExlbmd0aCBvZiB0aGUgbXVs dGlieXRlIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHdjdG9rLiAgKi8KKworc3RhdGljIHdpbnRfdCB3Y3RvazsJCS8qIFdpZGUgY2hhcmFjdGVy IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXIsIG9yIFdFT0YgaWYgdGhlcmUgd2FzCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVuY29kaW5nIGVycm9yLiAgVXNlZCBv bmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX0NVUl9NQVggPiAx LiAgKi8KKworCisvKiBGZXRjaCB0aGUgbmV4dCBsZXhpY2FsIGlucHV0IGNoYXJhY3Rlci4gIFNl dCBDIChvZiB0eXBlIGludCkgdG8gdGhlCisgICBuZXh0IGlucHV0IGJ5dGUsIGV4Y2VwdCBzZXQg QyB0byBFT0YgaWYgdGhlIGlucHV0IGlzIGEgbXVsdGlieXRlCisgICBjaGFyYWN0ZXIgb2YgbGVu Z3RoIGdyZWF0ZXIgdGhhbiAxLiAgU2V0IFdDIChvZiB0eXBlIHdpbnRfdCkgdG8gdGhlCisgICB2 YWx1ZSBvZiB0aGUgaW5wdXQgaWYgaXQgaXMgYSB2YWxpZCBtdWx0aWJ5dGUgY2hhcmFjdGVyIChw b3NzaWJseQorICAgb2YgbGVuZ3RoIDEpOyBvdGhlcndpc2Ugc2V0IFdDIHRvIFdFT0YuICBJZiB0 aGVyZSBpcyBubyBtb3JlIGlucHV0LAorICAgcmVwb3J0IEVPRkVSUiBpZiBFT0ZFUlIgaXMgbm90 IG51bGwsIGFuZCByZXR1cm4gbGFzdHRvayA9IEVORAorICAgb3RoZXJ3aXNlLiAgKi8KKyMgZGVm aW5lIEZFVENIX1dDKGMsIHdjLCBlb2ZlcnIpCQlcCisgIGRvIHsJCQkJCQlcCisgICAgaWYgKCEg bGV4bGVmdCkJCQkJXAorICAgICAgewkJCQkJCVwKKyAgICAgICAgaWYgKChlb2ZlcnIpICE9IDAp CQkJXAorICAgICAgICAgIGRmYWVycm9yIChlb2ZlcnIpOwkJCVwKKyAgICAgICAgZWxzZQkJCQkJ XAorICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gRU5EOwkJCVwKKyAgICAgIH0JCQkJCQlcCisg ICAgZWxzZQkJCQkJXAorICAgICAgewkJCQkJCVwKKyAgICAgICAgd2ludF90IF93YzsJCQkJXAor ICAgICAgICBzaXplX3QgbmJ5dGVzID0gbWJzX3RvX3djaGFyICgmX3djLCBsZXhwdHIsIGxleGxl ZnQsIGRmYSk7IFwKKyAgICAgICAgY3VyX21iX2xlbiA9IG5ieXRlczsJCQlcCisgICAgICAgICh3 YykgPSBfd2M7CQkJCVwKKyAgICAgICAgKGMpID0gbmJ5dGVzID09IDEgPyB0b191Y2hhciAoKmxl eHB0cikgOiBFT0Y7ICAgIFwKKyAgICAgICAgbGV4cHRyICs9IG5ieXRlczsJCQlcCisgICAgICAg IGxleGxlZnQgLT0gbmJ5dGVzOwkJCVwKKyAgICAgIH0JCQkJCQlcCisgIH0gd2hpbGUgKGZhbHNl KQorCisjaWZuZGVmIE1JTgorIyBkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChi KSkKKyNlbmRpZgorCisvKiBUaGUgc2V0IG9mIHdjaGFyX3QgdmFsdWVzIEMgc3VjaCB0aGF0IHRo ZXJlJ3MgYSB1c2VmdWwgbG9jYWxlCisgICBzb21ld2hlcmUgd2hlcmUgQyAhPSB0b3d1cHBlciAo QykgJiYgQyAhPSB0b3dsb3dlciAodG93dXBwZXIgKEMpKS4KKyAgIEZvciBleGFtcGxlLCAweDAw QjUgKFUrMDBCNSBNSUNSTyBTSUdOKSBpcyBpbiB0aGlzIHRhYmxlLCBiZWNhdXNlCisgICB0b3d1 cHBlciAoMHgwMEI1KSA9PSAweDAzOUMgKFUrMDM5QyBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVSks IGFuZAorICAgdG93bG93ZXIgKDB4MDM5QykgPT0gMHgwM0JDIChVKzAzQkMgR1JFRUsgU01BTEwg TEVUVEVSIE1VKS4gICovCitzdGF0aWMgc2hvcnQgY29uc3QgbG9uZXNvbWVfbG93ZXJbXSA9Cisg IHsKKyAgICAweDAwQjUsIDB4MDEzMSwgMHgwMTdGLCAweDAxQzUsIDB4MDFDOCwgMHgwMUNCLCAw eDAxRjIsIDB4MDM0NSwKKyAgICAweDAzQzIsIDB4MDNEMCwgMHgwM0QxLCAweDAzRDUsIDB4MDNE NiwgMHgwM0YwLCAweDAzRjEsCisKKyAgICAvKiBVKzAzRjIgR1JFRUsgTFVOQVRFIFNJR01BIFNZ TUJPTCBsYWNrcyBhIHNwZWNpZmljIHVwcGVyY2FzZQorICAgICAgIGNvdW50ZXJwYXJ0IGluIGxv Y2FsZXMgcHJlZGF0aW5nIFVuaWNvZGUgNC4wLjAgKEFwcmlsIDIwMDMpLiAgKi8KKyAgICAweDAz RjIsCisKKyAgICAweDAzRjUsIDB4MUU5QiwgMHgxRkJFLAorICB9OworCisvKiBNYXhpbXVtIG51 bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHRoZSBjYXNlLWZvbGRlZAorICAgY291bnRl cnBhcnRzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlciwgbm90IGNvdW50aW5nIHRoZSBjaGFyYWN0ZXIK KyAgIGl0c2VsZi4gIFRoaXMgaXMgMSBmb3IgdG93dXBwZXIsIDEgZm9yIHRvd2xvd2VyLCBhbmQg MSBmb3IgZWFjaAorICAgZW50cnkgaW4gTE9ORVNPTUVfTE9XRVIuICAqLworZW51bQoreyBDQVNF X0ZPTERFRF9CVUZTSVpFID0gMiArIHNpemVvZiBsb25lc29tZV9sb3dlciAvIHNpemVvZiAqbG9u ZXNvbWVfbG93ZXIgfTsKKworLyogRmluZCB0aGUgY2hhcmFjdGVycyBlcXVhbCB0byBDIGFmdGVy IGNhc2UtZm9sZGluZywgb3RoZXIgdGhhbiBDCisgICBpdHNlbGYsIGFuZCBzdG9yZSB0aGVtIGlu dG8gRk9MREVELiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgc3RvcmVkLiAg Ki8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2Nhc2VfZm9sZGVkX2NvdW50ZXJwYXJ0cyAod2NoYXJf dCBjLCB3Y2hhcl90IGZvbGRlZFtDQVNFX0ZPTERFRF9CVUZTSVpFXSkKK3sKKyAgdW5zaWduZWQg aW50IGk7CisgIHVuc2lnbmVkIGludCBuID0gMDsKKyAgd2ludF90IHVjID0gdG93dXBwZXIgKGMp OworICB3aW50X3QgbGMgPSB0b3dsb3dlciAodWMpOworICBpZiAodWMgIT0gYykKKyAgICBmb2xk ZWRbbisrXSA9IHVjOworICBpZiAobGMgIT0gdWMgJiYgbGMgIT0gYyAmJiB0b3d1cHBlciAobGMp ID09IHVjKQorICAgIGZvbGRlZFtuKytdID0gbGM7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yg bG9uZXNvbWVfbG93ZXIgLyBzaXplb2YgKmxvbmVzb21lX2xvd2VyOyBpKyspCisgICAgeworICAg ICAgd2ludF90IGxpID0gbG9uZXNvbWVfbG93ZXJbaV07CisgICAgICBpZiAobGkgIT0gbGMgJiYg bGkgIT0gdWMgJiYgbGkgIT0gYyAmJiB0b3d1cHBlciAobGkpID09IHVjKQorICAgICAgICBmb2xk ZWRbbisrXSA9IGxpOworICAgIH0KKyAgcmV0dXJuIG47Cit9CisKK3R5cGVkZWYgaW50IHByZWRp Y2F0ZSAoaW50KTsKKworLyogVGhlIGZvbGxvd2luZyBsaXN0IG1hcHMgdGhlIG5hbWVzIG9mIHRo ZSBQb3NpeCBuYW1lZCBjaGFyYWN0ZXIgY2xhc3NlcworICAgdG8gcHJlZGljYXRlIGZ1bmN0aW9u cyB0aGF0IGRldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIGluCisgICB0aGUg Y2xhc3MuICBUaGUgbGVhZGluZyBbIGhhcyBhbHJlYWR5IGJlZW4gZWF0ZW4gYnkgdGhlIGxleGlj YWwKKyAgIGFuYWx5emVyLiAgKi8KK3N0cnVjdCBkZmFfY3R5cGUKK3sKKyAgY29uc3QgY2hhciAq bmFtZTsKKyAgcHJlZGljYXRlICpmdW5jOworICBib29sIHNpbmdsZV9ieXRlX29ubHk7Cit9Owor CitzdGF0aWMgY29uc3Qgc3RydWN0IGRmYV9jdHlwZSBwcmVkbmFtZXNbXSA9IHsKKyAgeyJhbHBo YSIsIGlzYWxwaGEsIGZhbHNlfSwKKyAgeyJ1cHBlciIsIGlzdXBwZXIsIGZhbHNlfSwKKyAgeyJs b3dlciIsIGlzbG93ZXIsIGZhbHNlfSwKKyAgeyJkaWdpdCIsIGlzZGlnaXQsIHRydWV9LAorICB7 InhkaWdpdCIsIGlzeGRpZ2l0LCBmYWxzZX0sCisgIHsic3BhY2UiLCBpc3NwYWNlLCBmYWxzZX0s CisgIHsicHVuY3QiLCBpc3B1bmN0LCBmYWxzZX0sCisgIHsiYWxudW0iLCBpc2FsbnVtLCBmYWxz ZX0sCisgIHsicHJpbnQiLCBpc3ByaW50LCBmYWxzZX0sCisgIHsiZ3JhcGgiLCBpc2dyYXBoLCBm YWxzZX0sCisgIHsiY250cmwiLCBpc2NudHJsLCBmYWxzZX0sCisgIHsiYmxhbmsiLCBpc2JsYW5r LCBmYWxzZX0sCisgIHtOVUxMLCBOVUxMLCBmYWxzZX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgZGZhX2N0eXBlICpfR0xfQVRUUklCVVRFX1BVUkUKK2ZpbmRfcHJlZCAoY29uc3QgY2hhciAq c3RyKQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgZm9yIChpID0gMDsgcHJlZG5hbWVzW2ldLm5h bWU7ICsraSkKKyAgICBpZiAoU1RSRVEgKHN0ciwgcHJlZG5hbWVzW2ldLm5hbWUpKQorICAgICAg cmV0dXJuICZwcmVkbmFtZXNbaV07CisgIHJldHVybiBOVUxMOworfQorCisvKiBNdWx0aWJ5dGUg Y2hhcmFjdGVyIGhhbmRsaW5nIHN1Yi1yb3V0aW5lIGZvciBsZXguCisgICBQYXJzZSBhIGJyYWNr ZXQgZXhwcmVzc2lvbiBhbmQgYnVpbGQgYSBzdHJ1Y3QgbWJfY2hhcl9jbGFzc2VzLiAgKi8KK3N0 YXRpYyB0b2tlbgorcGFyc2VfYnJhY2tldF9leHAgKHZvaWQpCit7CisgIGJvb2wgaW52ZXJ0Owor ICBpbnQgYywgYzEsIGMyOworICBjaGFyY2xhc3MgY2NsOworCisgIC8qIFRoaXMgaXMgYSBicmFj a2V0IGV4cHJlc3Npb24gdGhhdCBkZmFleGVjIGlzIGtub3duIHRvCisgICAgIHByb2Nlc3MgY29y cmVjdGx5LiAgKi8KKyAgYm9vbCBrbm93bl9icmFja2V0X2V4cCA9IHRydWU7CisKKyAgLyogVXNl ZCB0byB3YXJuIGFib3V0IFs6c3BhY2U6XS4KKyAgICAgQml0IDAgPSBmaXJzdCBjaGFyYWN0ZXIg aXMgYSBjb2xvbi4KKyAgICAgQml0IDEgPSBsYXN0IGNoYXJhY3RlciBpcyBhIGNvbG9uLgorICAg ICBCaXQgMiA9IGluY2x1ZGVzIGFueSBvdGhlciBjaGFyYWN0ZXIgYnV0IGEgY29sb24uCisgICAg IEJpdCAzID0gaW5jbHVkZXMgcmFuZ2VzLCBjaGFyL2VxdWl2IGNsYXNzZXMgb3IgY29sbGF0aW9u IGVsZW1lbnRzLiAgKi8KKyAgaW50IGNvbG9uX3dhcm5pbmdfc3RhdGU7CisKKyAgd2ludF90IHdj OworICB3aW50X3Qgd2MyOworICB3aW50X3Qgd2MxID0gMDsKKworICAvKiBXb3JrIGFyZWEgdG8g YnVpbGQgYSBtYl9jaGFyX2NsYXNzZXMuICAqLworICBzdHJ1Y3QgbWJfY2hhcl9jbGFzc2VzICp3 b3JrX21iYzsKKyAgc2l6ZV90IGNoYXJzX2FsOworCisgIGNoYXJzX2FsID0gMDsKKyAgaWYgKGRm YS0+bXVsdGlieXRlKQorICAgIHsKKyAgICAgIGRmYS0+bWJjc2V0cyA9IG1heWJlX3JlYWxsb2Mg KGRmYS0+bWJjc2V0cywgZGZhLT5ubWJjc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICZkZmEtPm1iY3NldHNfYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzaXplb2YgKmRmYS0+bWJjc2V0cyk7CisKKyAgICAgIC8qIGRmYS0+bXVsdGli eXRlX3Byb3BbXSBob2xkIHRoZSBpbmRleCBvZiBkZmEtPm1iY3NldHMuCisgICAgICAgICBXZSB3 aWxsIHVwZGF0ZSBkZmEtPm11bHRpYnl0ZV9wcm9wW10gaW4gYWRkdG9rLCBiZWNhdXNlIHdlIGNh bid0CisgICAgICAgICBkZWNpZGUgdGhlIGluZGV4IGluIGRmYS0+dG9rZW5zW10uICAqLworCisg ICAgICAvKiBJbml0aWFsaXplIHdvcmsgYXJlYS4gICovCisgICAgICB3b3JrX21iYyA9ICYoZGZh LT5tYmNzZXRzW2RmYS0+bm1iY3NldHMrK10pOworICAgICAgbWVtc2V0ICh3b3JrX21iYywgMCwg c2l6ZW9mICp3b3JrX21iYyk7CisgICAgfQorICBlbHNlCisgICAgd29ya19tYmMgPSBOVUxMOwor CisgIG1lbXNldCAoY2NsLCAwLCBzaXplb2YgY2NsKTsKKyAgRkVUQ0hfV0MgKGMsIHdjLCBfKCJ1 bmJhbGFuY2VkIFsiKSk7CisgIGlmIChjID09ICdeJykKKyAgICB7CisgICAgICBGRVRDSF9XQyAo Yywgd2MsIF8oInVuYmFsYW5jZWQgWyIpKTsKKyAgICAgIGludmVydCA9IHRydWU7CisgICAgICBr bm93bl9icmFja2V0X2V4cCA9IHVzaW5nX3NpbXBsZV9sb2NhbGUgKCk7CisgICAgfQorICBlbHNl CisgICAgaW52ZXJ0ID0gZmFsc2U7CisKKyAgY29sb25fd2FybmluZ19zdGF0ZSA9IChjID09ICc6 Jyk7CisgIGRvCisgICAgeworICAgICAgYzEgPSBOT1RDSEFSOwkvKiBNYXJrIGMxIGFzIG5vdCBp bml0aWFsaXplZC4gICovCisgICAgICBjb2xvbl93YXJuaW5nX3N0YXRlICY9IH4yOworCisgICAg ICAvKiBOb3RlIHRoYXQgaWYgd2UncmUgbG9va2luZyBhdCBzb21lIG90aGVyIFs6Li4uOl0gY29u c3RydWN0LAorICAgICAgICAgd2UganVzdCB0cmVhdCBpdCBhcyBhIGJ1bmNoIG9mIG9yZGluYXJ5 IGNoYXJhY3RlcnMuICBXZSBjYW4gZG8KKyAgICAgICAgIHRoaXMgYmVjYXVzZSB3ZSBhc3N1bWUg cmVnZXggaGFzIGNoZWNrZWQgZm9yIHN5bnRheCBlcnJvcnMgYmVmb3JlCisgICAgICAgICBkZmEg aXMgZXZlciBjYWxsZWQuICAqLworICAgICAgaWYgKGMgPT0gJ1snKQorICAgICAgICB7CisgICAg ICAgICAgRkVUQ0hfV0MgKGMxLCB3YzEsIF8oInVuYmFsYW5jZWQgWyIpKTsKKworICAgICAgICAg IGlmICgoYzEgPT0gJzonICYmIChzeW50YXhfYml0cyAmIFJFX0NIQVJfQ0xBU1NFUykpCisgICAg ICAgICAgICAgIHx8IGMxID09ICcuJyB8fCBjMSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAg ICAgICAgICAgIGVudW0geyBNQVhfQlJBQ0tFVF9TVFJJTkdfTEVOID0gMzIgfTsKKyAgICAgICAg ICAgICAgY2hhciBzdHJbTUFYX0JSQUNLRVRfU1RSSU5HX0xFTiArIDFdOworICAgICAgICAgICAg ICBzaXplX3QgbGVuID0gMDsKKyAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQgWyIp KTsKKyAgICAgICAgICAgICAgICAgIGlmICgoYyA9PSBjMSAmJiAqbGV4cHRyID09ICddJykgfHwg bGV4bGVmdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg ICAgIGlmIChsZW4gPCBNQVhfQlJBQ0tFVF9TVFJJTkdfTEVOKQorICAgICAgICAgICAgICAgICAg ICBzdHJbbGVuKytdID0gYzsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg ICAgICAgLyogVGhpcyBpcyBpbiBhbnkgY2FzZSBhbiBpbnZhbGlkIGNsYXNzIG5hbWUuICAqLwor ICAgICAgICAgICAgICAgICAgICBzdHJbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgc3RyW2xlbl0gPSAnXDAnOworCisgICAgICAgICAgICAgIC8qIEZldGNoIGJy YWNrZXQuICAqLworICAgICAgICAgICAgICBGRVRDSF9XQyAoYywgd2MsIF8oInVuYmFsYW5jZWQg WyIpKTsKKyAgICAgICAgICAgICAgaWYgKGMxID09ICc6JykKKyAgICAgICAgICAgICAgICAvKiBC dWlsZCBjaGFyYWN0ZXIgY2xhc3MuICBQT1NJWCBhbGxvd3MgY2hhcmFjdGVyCisgICAgICAgICAg ICAgICAgICAgY2xhc3NlcyB0byBtYXRjaCBtdWx0aWNoYXJhY3RlciBjb2xsYXRpbmcgZWxlbWVu dHMsCisgICAgICAgICAgICAgICAgICAgYnV0IHRoZSByZWdleCBjb2RlIGRvZXMgbm90IHN1cHBv cnQgdGhhdCwgc28gZG8gbm90CisgICAgICAgICAgICAgICAgICAgd29ycnkgYWJvdXQgdGhhdCBw b3NzaWJpbGl0eS4gICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2hh ciBjb25zdCAqY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgPSAoY2FzZV9mb2xkICYmIChTVFJF USAoc3RyLCAidXBwZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8 IFNUUkVRIChzdHIsICJsb3dlciIpKSA/ICJhbHBoYSIgOiBzdHIpOworICAgICAgICAgICAgICAg ICAgY29uc3Qgc3RydWN0IGRmYV9jdHlwZSAqcHJlZCA9IGZpbmRfcHJlZCAoY2xhc3MpOworICAg ICAgICAgICAgICAgICAgaWYgKCFwcmVkKQorICAgICAgICAgICAgICAgICAgICBkZmFlcnJvciAo XygiaW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MiKSk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChk ZmEtPm11bHRpYnl0ZSAmJiAhcHJlZC0+c2luZ2xlX2J5dGVfb25seSkKKyAgICAgICAgICAgICAg ICAgICAga25vd25fYnJhY2tldF9leHAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGVsc2UK KyAgICAgICAgICAgICAgICAgICAgZm9yIChjMiA9IDA7IGMyIDwgTk9UQ0hBUjsgKytjMikKKyAg ICAgICAgICAgICAgICAgICAgICBpZiAocHJlZC0+ZnVuYyAoYzIpKQorICAgICAgICAgICAgICAg ICAgICAgICAgc2V0Yml0IChjMiwgY2NsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworCisg ICAgICAgICAgICAgIGNvbG9uX3dhcm5pbmdfc3RhdGUgfD0gODsKKworICAgICAgICAgICAgICAv KiBGZXRjaCBuZXcgbG9va2FoZWFkIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgIEZFVENI X1dDIChjMSwgd2MxLCBfKCJ1bmJhbGFuY2VkIFsiKSk7CisgICAgICAgICAgICAgIGNvbnRpbnVl OworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogV2UgdHJlYXQgJ1snIGFzIGEgbm9ybWFs IGNoYXJhY3RlciBoZXJlLiAgYy9jMS93Yy93YzEKKyAgICAgICAgICAgICBhcmUgYWxyZWFkeSBz ZXQgdXAuICAqLworICAgICAgICB9CisKKyAgICAgIGlmIChjID09ICdcXCcgJiYgKHN5bnRheF9i aXRzICYgUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUykpCisgICAgICAgIEZFVENIX1dDIChj LCB3YywgXygidW5iYWxhbmNlZCBbIikpOworCisgICAgICBpZiAoYzEgPT0gTk9UQ0hBUikKKyAg ICAgICAgRkVUQ0hfV0MgKGMxLCB3YzEsIF8oInVuYmFsYW5jZWQgWyIpKTsKKworICAgICAgaWYg KGMxID09ICctJykKKyAgICAgICAgLyogYnVpbGQgcmFuZ2UgY2hhcmFjdGVycy4gICovCisgICAg ICAgIHsKKyAgICAgICAgICBGRVRDSF9XQyAoYzIsIHdjMiwgXygidW5iYWxhbmNlZCBbIikpOwor CisgICAgICAgICAgLyogQSBicmFja2V0IGV4cHJlc3Npb24gbGlrZSBbYS1bLmFhLl1dIG1hdGNo ZXMgYW4gdW5rbm93biBzZXQuCisgICAgICAgICAgICAgVHJlYXQgaXQgbGlrZSBbLWFbLmFhLl1d IHdoaWxlIHBhcnNpbmcgaXQsIGFuZAorICAgICAgICAgICAgIHJlbWVtYmVyIHRoYXQgdGhlIHNl dCBpcyB1bmtub3duLiAgKi8KKyAgICAgICAgICBpZiAoYzIgPT0gJ1snICYmICpsZXhwdHIgPT0g Jy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZh bHNlOworICAgICAgICAgICAgICBjMiA9ICddJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg IGlmIChjMiA9PSAnXScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEluIHRoZSBj YXNlIFt4LV0sIHRoZSAtIGlzIGFuIG9yZGluYXJ5IGh5cGhlbiwKKyAgICAgICAgICAgICAgICAg d2hpY2ggaXMgbGVmdCBpbiBjMSwgdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXIuICAqLworICAgICAg ICAgICAgICBsZXhwdHIgLT0gY3VyX21iX2xlbjsKKyAgICAgICAgICAgICAgbGV4bGVmdCArPSBj dXJfbWJfbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgaWYgKGMyID09ICdcXCcgJiYgKHN5bnRheF9iaXRzICYgUkVfQkFDS1NM QVNIX0VTQ0FQRV9JTl9MSVNUUykpCisgICAgICAgICAgICAgICAgRkVUQ0hfV0MgKGMyLCB3YzIs IF8oInVuYmFsYW5jZWQgWyIpKTsKKworICAgICAgICAgICAgICBjb2xvbl93YXJuaW5nX3N0YXRl IHw9IDg7CisgICAgICAgICAgICAgIEZFVENIX1dDIChjMSwgd2MxLCBfKCJ1bmJhbGFuY2VkIFsi KSk7CisKKyAgICAgICAgICAgICAgLyogVHJlYXQgW3gteV0gYXMgYSByYW5nZSBpZiB4ICE9IHku ICAqLworICAgICAgICAgICAgICBpZiAod2MgIT0gd2MyIHx8IHdjID09IFdFT0YpCisgICAgICAg ICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGRmYS0+bXVsdGlieXRlKQorICAgICAg ICAgICAgICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworICAgICAgICAgICAgICAg ICAgZWxzZSBpZiAodXNpbmdfc2ltcGxlX2xvY2FsZSAoKSkKKyAgICAgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgICAgIGludCBjaTsKKyAgICAgICAgICAgICAgICAgICAgICBm b3IgKGNpID0gYzsgY2kgPD0gYzI7IGNpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRi aXQgKGNpLCBjY2wpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisgICAg ICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1YyA9 IHRvdXBwZXIgKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWMyID0gdG91cHBl ciAoYzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNpID0gMDsgY2kgPCBOT1RD SEFSOyBjaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGludCB1Y2kgPSB0b3VwcGVyIChjaSk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpZiAodWMgPD0gdWNpICYmIHVjaSA8PSB1YzIpCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNldGJpdCAoY2ksIGNjbCk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGtub3duX2Jy YWNrZXRfZXhwID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBjb2xvbl93YXJu aW5nX3N0YXRlIHw9IChjID09ICc6JykgPyAyIDogNDsKKworICAgICAgaWYgKCFkZmEtPm11bHRp Ynl0ZSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisgICAgICAgICAgICBz ZXRiaXRfY2FzZV9mb2xkX2MgKGMsIGNjbCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAg c2V0Yml0IChjLCBjY2wpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAg IGlmICh3YyA9PSBXRU9GKQorICAgICAgICBrbm93bl9icmFja2V0X2V4cCA9IGZhbHNlOworICAg ICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2NoYXJfdCBmb2xkZWRbQ0FTRV9GT0xERURf QlVGU0laRSArIDFdOworICAgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICAgIHVuc2ln bmVkIGludCBuID0gKGNhc2VfZm9sZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2Fz ZV9mb2xkZWRfY291bnRlcnBhcnRzICh3YywgZm9sZGVkICsgMSkgKyAxCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOiAxKTsKKyAgICAgICAgICBmb2xkZWRbMF0gPSB3YzsKKyAgICAgICAg ICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgaWYgKCFzZXRiaXRfd2MgKGZv bGRlZFtpXSwgY2NsKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmtfbWJj LT5jaGFycworICAgICAgICAgICAgICAgICAgPSBtYXliZV9yZWFsbG9jICh3b3JrX21iYy0+Y2hh cnMsIHdvcmtfbWJjLT5uY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZjaGFyc19hbCwgc2l6ZW9mICp3b3JrX21iYy0+Y2hhcnMpOworICAgICAgICAgICAgICAgIHdv cmtfbWJjLT5jaGFyc1t3b3JrX21iYy0+bmNoYXJzKytdID0gZm9sZGVkW2ldOworICAgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIHdoaWxlICgod2MgPSB3YzEsIChjID0gYzEpICE9 ICddJykpOworCisgIGlmIChjb2xvbl93YXJuaW5nX3N0YXRlID09IDcpCisgICAgZGZhd2FybiAo XygiY2hhcmFjdGVyIGNsYXNzIHN5bnRheCBpcyBbWzpzcGFjZTpdXSwgbm90IFs6c3BhY2U6XSIp KTsKKworICBpZiAoISBrbm93bl9icmFja2V0X2V4cCkKKyAgICByZXR1cm4gQkFDS1JFRjsKKwor ICBpZiAoZGZhLT5tdWx0aWJ5dGUpCisgICAgeworICAgICAgc3RhdGljIGNoYXJjbGFzcyBjb25z dCB6ZXJvY2xhc3M7CisgICAgICB3b3JrX21iYy0+aW52ZXJ0ID0gaW52ZXJ0OworICAgICAgd29y a19tYmMtPmNzZXQgPSBlcXVhbCAoY2NsLCB6ZXJvY2xhc3MpID8gLTEgOiBjaGFyY2xhc3NfaW5k ZXggKGNjbCk7CisgICAgICByZXR1cm4gTUJDU0VUOworICAgIH0KKworICBpZiAoaW52ZXJ0KQor ICAgIHsKKyAgICAgIGFzc2VydCAoIWRmYS0+bXVsdGlieXRlKTsKKyAgICAgIG5vdHNldCAoY2Ns KTsKKyAgICAgIGlmIChzeW50YXhfYml0cyAmIFJFX0hBVF9MSVNUU19OT1RfTkVXTElORSkKKyAg ICAgICAgY2xyYml0ICgnXG4nLCBjY2wpOworICAgIH0KKworICByZXR1cm4gQ1NFVCArIGNoYXJj bGFzc19pbmRleCAoY2NsKTsKK30KKworI2RlZmluZSBQVVNIX0xFWF9TVEFURShzKQkJCVwKKyAg ZG8JCQkJCQlcCisgICAgewkJCQkJCVwKKyAgICAgIGNoYXIgY29uc3QgKmxleHB0cl9zYXZlZCA9 IGxleHB0cjsJXAorICAgICAgc2l6ZV90IGxleGxlZnRfc2F2ZWQgPSBsZXhsZWZ0OwkJXAorICAg ICAgbGV4cHRyID0gKHMpOwkJCQlcCisgICAgICBsZXhsZWZ0ID0gc3RybGVuIChsZXhwdHIpCisK KyNkZWZpbmUgUE9QX0xFWF9TVEFURSgpCQkJCVwKKyAgICAgIGxleHB0ciA9IGxleHB0cl9zYXZl ZDsJCQlcCisgICAgICBsZXhsZWZ0ID0gbGV4bGVmdF9zYXZlZDsJCQlcCisgICAgfQkJCQkJCVwK KyAgd2hpbGUgKGZhbHNlKQorCitzdGF0aWMgdG9rZW4KK2xleCAodm9pZCkKK3sKKyAgaW50IGMs IGMyOworICBib29sIGJhY2tzbGFzaCA9IGZhbHNlOworICBjaGFyY2xhc3MgY2NsOworICBpbnQg aTsKKworICAvKiBCYXNpYyBwbGFuOiBXZSBmZXRjaCBhIGNoYXJhY3Rlci4gIElmIGl0J3MgYSBi YWNrc2xhc2gsCisgICAgIHdlIHNldCB0aGUgYmFja3NsYXNoIGZsYWcgYW5kIGdvIHRocm91Z2gg dGhlIGxvb3AgYWdhaW4uCisgICAgIE9uIHRoZSBwbHVzIHNpZGUsIHRoaXMgYXZvaWRzIGhhdmlu ZyBhIGR1cGxpY2F0ZSBvZiB0aGUKKyAgICAgbWFpbiBzd2l0Y2ggaW5zaWRlIHRoZSBiYWNrc2xh c2ggY2FzZS4gIE9uIHRoZSBtaW51cyBzaWRlLAorICAgICBpdCBtZWFucyB0aGF0IGp1c3QgYWJv dXQgZXZlcnkgY2FzZSBiZWdpbnMgd2l0aAorICAgICAiaWYgKGJhY2tzbGFzaCkgLi4uIi4gICov CisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpCisgICAgeworICAgICAgRkVUQ0hfV0MgKGMsIHdj dG9rLCBOVUxMKTsKKworICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisgICAgICAgIGNhc2Ug J1xcJzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoKQorICAgICAgICAgICAgZ290byBub3JtYWxf Y2hhcjsKKyAgICAgICAgICBpZiAobGV4bGVmdCA9PSAwKQorICAgICAgICAgICAgZGZhZXJyb3Ig KF8oInVuZmluaXNoZWQgXFwgZXNjYXBlIikpOworICAgICAgICAgIGJhY2tzbGFzaCA9IHRydWU7 CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgaWYgKGJh Y2tzbGFzaCkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKHN5 bnRheF9iaXRzICYgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCisgICAgICAgICAgICAgIHx8IGxh c3R0b2sgPT0gRU5EIHx8IGxhc3R0b2sgPT0gTFBBUkVOIHx8IGxhc3R0b2sgPT0gT1IpCisgICAg ICAgICAgICByZXR1cm4gbGFzdHRvayA9IEJFR0xJTkU7CisgICAgICAgICAgZ290byBub3JtYWxf Y2hhcjsKKworICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoKQorICAg ICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBS RV9DT05URVhUX0lOREVQX0FOQ0hPUlMKKyAgICAgICAgICAgICAgfHwgbGV4bGVmdCA9PSAwCisg ICAgICAgICAgICAgIHx8IChzeW50YXhfYml0cyAmIFJFX05PX0JLX1BBUkVOUworICAgICAgICAg ICAgICAgICAgPyBsZXhsZWZ0ID4gMCAmJiAqbGV4cHRyID09ICcpJworICAgICAgICAgICAgICAg ICAgOiBsZXhsZWZ0ID4gMSAmJiBsZXhwdHJbMF0gPT0gJ1xcJyAmJiBsZXhwdHJbMV0gPT0gJykn KQorICAgICAgICAgICAgICB8fCAoc3ludGF4X2JpdHMgJiBSRV9OT19CS19WQkFSCisgICAgICAg ICAgICAgICAgICA/IGxleGxlZnQgPiAwICYmICpsZXhwdHIgPT0gJ3wnCisgICAgICAgICAgICAg ICAgICA6IGxleGxlZnQgPiAxICYmIGxleHB0clswXSA9PSAnXFwnICYmIGxleHB0clsxXSA9PSAn fCcpCisgICAgICAgICAgICAgIHx8ICgoc3ludGF4X2JpdHMgJiBSRV9ORVdMSU5FX0FMVCkKKyAg ICAgICAgICAgICAgICAgICYmIGxleGxlZnQgPiAwICYmICpsZXhwdHIgPT0gJ1xuJykpCisgICAg ICAgICAgICByZXR1cm4gbGFzdHRvayA9IEVORExJTkU7CisgICAgICAgICAgZ290byBub3JtYWxf Y2hhcjsKKworICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgY2FzZSAnMic6CisgICAgICAgIGNh c2UgJzMnOgorICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6CisgICAgICAgIGNh c2UgJzYnOgorICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgY2FzZSAnOCc6CisgICAgICAgIGNh c2UgJzknOgorICAgICAgICAgIGlmIChiYWNrc2xhc2ggJiYgIShzeW50YXhfYml0cyAmIFJFX05P X0JLX1JFRlMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBmYWxz ZTsKKyAgICAgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBCQUNLUkVGOworICAgICAgICAgICAg fQorICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAgICAgICAgY2FzZSAnYCc6CisgICAg ICAgICAgaWYgKGJhY2tzbGFzaCAmJiAhKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisg ICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IEJFR0xJTkU7IC8qIEZJWE1FOiBzaG91bGQgYmUg YmVnaW5uaW5nIG9mIHN0cmluZyAqLworICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAg ICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgIGlmIChiYWNrc2xhc2ggJiYgIShzeW50YXhfYml0 cyAmIFJFX05PX0dOVV9PUFMpKQorICAgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBFTkRMSU5F OyAgIC8qIEZJWE1FOiBzaG91bGQgYmUgZW5kIG9mIHN0cmluZyAqLworICAgICAgICAgIGdvdG8g bm9ybWFsX2NoYXI7CisKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgaWYgKGJhY2tzbGFz aCAmJiAhKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICByZXR1cm4g bGFzdHRvayA9IEJFR1dPUkQ7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAgICAg ICBjYXNlICc+JzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoICYmICEoc3ludGF4X2JpdHMgJiBS RV9OT19HTlVfT1BTKSkKKyAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gRU5EV09SRDsKKyAg ICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworCisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAg IGlmIChiYWNrc2xhc2ggJiYgIShzeW50YXhfYml0cyAmIFJFX05PX0dOVV9PUFMpKQorICAgICAg ICAgICAgcmV0dXJuIGxhc3R0b2sgPSBMSU1XT1JEOworICAgICAgICAgIGdvdG8gbm9ybWFsX2No YXI7CisKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAmJiAhKHN5 bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9 IE5PVExJTVdPUkQ7CisgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAgICAgICBjYXNl ICc/JzoKKyAgICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9MSU1JVEVEX09QUykKKyAgICAg ICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5 bnRheF9iaXRzICYgUkVfQktfUExVU19RTSkgIT0gMCkpCisgICAgICAgICAgICBnb3RvIG5vcm1h bF9jaGFyOworICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfQ09OVEVYVF9JTkRFUF9P UFMpICYmIGxhc3RzdGFydCkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAg ICAgcmV0dXJuIGxhc3R0b2sgPSBRTUFSSzsKKworICAgICAgICBjYXNlICcqJzoKKyAgICAgICAg ICBpZiAoYmFja3NsYXNoKQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAg ICBpZiAoIShzeW50YXhfYml0cyAmIFJFX0NPTlRFWFRfSU5ERVBfT1BTKSAmJiBsYXN0c3RhcnQp CisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIHJldHVybiBsYXN0dG9r ID0gU1RBUjsKKworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICBpZiAoc3ludGF4X2JpdHMg JiBSRV9MSU1JVEVEX09QUykKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAg ICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5bnRheF9iaXRzICYgUkVfQktfUExVU19RTSkgIT0gMCkp CisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmICghKHN5bnRheF9i aXRzICYgUkVfQ09OVEVYVF9JTkRFUF9PUFMpICYmIGxhc3RzdGFydCkKKyAgICAgICAgICAgIGdv dG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBQTFVTOworCisgICAg ICAgIGNhc2UgJ3snOgorICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfSU5URVJWQUxT KSkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFz aCAhPSAoKHN5bnRheF9iaXRzICYgUkVfTk9fQktfQlJBQ0VTKSA9PSAwKSkKKyAgICAgICAgICAg IGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKCEoc3ludGF4X2JpdHMgJiBSRV9DT05U RVhUX0lOREVQX09QUykgJiYgbGFzdHN0YXJ0KQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hh cjsKKworICAgICAgICAgIC8qIENhc2VzOgorICAgICAgICAgICAgIHtNfSAtIGV4YWN0IGNvdW50 CisgICAgICAgICAgICAge00sfSAtIG1pbmltdW0gY291bnQsIG1heGltdW0gaXMgaW5maW5pdHkK KyAgICAgICAgICAgICB7LE59IC0gMCB0aHJvdWdoIE4KKyAgICAgICAgICAgICB7LH0gLSAwIHRv IGluZmluaXR5IChzYW1lIGFzICcqJykKKyAgICAgICAgICAgICB7TSxOfSAtIE0gdGhyb3VnaCBO ICovCisgICAgICAgICAgeworICAgICAgICAgICAgY2hhciBjb25zdCAqcCA9IGxleHB0cjsKKyAg ICAgICAgICAgIGNoYXIgY29uc3QgKmxpbSA9IHAgKyBsZXhsZWZ0OworICAgICAgICAgICAgbWlu cmVwID0gbWF4cmVwID0gLTE7CisgICAgICAgICAgICBmb3IgKDsgcCAhPSBsaW0gJiYgSVNBU0NJ SURJR0lUICgqcCk7IHArKykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICht aW5yZXAgPCAwKQorICAgICAgICAgICAgICAgICAgbWlucmVwID0gKnAgLSAnMCc7CisgICAgICAg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbWlucmVwID0gTUlOIChSRV9EVVBfTUFY ICsgMSwgbWlucmVwICogMTAgKyAqcCAtICcwJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIGlmIChwICE9IGxpbSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgq cCAhPSAnLCcpCisgICAgICAgICAgICAgICAgICBtYXhyZXAgPSBtaW5yZXA7CisgICAgICAgICAg ICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAo bWlucmVwIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICBtaW5yZXAgPSAwOworICAgICAgICAg ICAgICAgICAgICB3aGlsZSAoKytwICE9IGxpbSAmJiBJU0FTQ0lJRElHSVQgKCpwKSkKKyAgICAg ICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4cmVwIDwg MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4cmVwID0gKnAgLSAnMCc7CisgICAgICAg ICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHJlcCA9 IE1JTiAoUkVfRFVQX01BWCArIDEsIG1heHJlcCAqIDEwICsgKnAgLSAnMCcpOworICAgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgaWYgKCEgKCghIGJhY2tzbGFzaCB8fCAocCAhPSBsaW0gJiYgKnArKyA9PSAnXFwn KSkKKyAgICAgICAgICAgICAgICAgICAmJiBwICE9IGxpbSAmJiAqcCsrID09ICd9JworICAgICAg ICAgICAgICAgICAgICYmIDAgPD0gbWlucmVwICYmIChtYXhyZXAgPCAwIHx8IG1pbnJlcCA8PSBt YXhyZXApKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzeW50YXhfYml0 cyAmIFJFX0lOVkFMSURfSU5URVJWQUxfT1JEKQorICAgICAgICAgICAgICAgICAgZ290byBub3Jt YWxfY2hhcjsKKyAgICAgICAgICAgICAgICBkZmFlcnJvciAoXygiaW52YWxpZCBjb250ZW50IG9m IFxce1xcfSIpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFJFX0RVUF9NQVgg PCBtYXhyZXApCisgICAgICAgICAgICAgIGRmYWVycm9yIChfKCJyZWd1bGFyIGV4cHJlc3Npb24g dG9vIGJpZyIpKTsKKyAgICAgICAgICAgIGxleHB0ciA9IHA7CisgICAgICAgICAgICBsZXhsZWZ0 ID0gbGltIC0gcDsKKyAgICAgICAgICB9CisgICAgICAgICAgbGFzdHN0YXJ0ID0gZmFsc2U7Cisg ICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBSRVBNTjsKKworICAgICAgICBjYXNlICd8JzoKKyAg ICAgICAgICBpZiAoc3ludGF4X2JpdHMgJiBSRV9MSU1JVEVEX09QUykKKyAgICAgICAgICAgIGdv dG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgaWYgKGJhY2tzbGFzaCAhPSAoKHN5bnRheF9iaXRz ICYgUkVfTk9fQktfVkJBUikgPT0gMCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwor ICAgICAgICAgIGxhc3RzdGFydCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBP UjsKKworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgaWYgKHN5bnRheF9iaXRzICYgUkVf TElNSVRFRF9PUFMKKyAgICAgICAgICAgICAgfHwgYmFja3NsYXNoIHx8ICEoc3ludGF4X2JpdHMg JiBSRV9ORVdMSU5FX0FMVCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAg ICAgIGxhc3RzdGFydCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIGxhc3R0b2sgPSBPUjsKKwor ICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICBpZiAoYmFja3NsYXNoICE9ICgoc3ludGF4X2Jp dHMgJiBSRV9OT19CS19QQVJFTlMpID09IDApKQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hh cjsKKyAgICAgICAgICArK3BhcmVuczsKKyAgICAgICAgICBsYXN0c3RhcnQgPSB0cnVlOworICAg ICAgICAgIHJldHVybiBsYXN0dG9rID0gTFBBUkVOOworCisgICAgICAgIGNhc2UgJyknOgorICAg ICAgICAgIGlmIChiYWNrc2xhc2ggIT0gKChzeW50YXhfYml0cyAmIFJFX05PX0JLX1BBUkVOUykg PT0gMCkpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmIChwYXJl bnMgPT0gMCAmJiBzeW50YXhfYml0cyAmIFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCisg ICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIC0tcGFyZW5zOworICAgICAg ICAgIGxhc3RzdGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gUlBBUkVO OworCisgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgIGlmIChiYWNrc2xhc2gpCisgICAgICAg ICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlmIChkZmEtPm11bHRpYnl0ZSkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSW4gbXVsdGlieXRlIGVudmlyb25tZW50IHBl cmlvZCBtdXN0IG1hdGNoIHdpdGggYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgY2hhcmFjdGVy IG5vdCBhIGJ5dGUuICBTbyB3ZSB1c2UgQU5ZQ0hBUi4gICovCisgICAgICAgICAgICAgIGxhc3Rz dGFydCA9IGZhbHNlOworICAgICAgICAgICAgICByZXR1cm4gbGFzdHRvayA9IEFOWUNIQVI7Cisg ICAgICAgICAgICB9CisgICAgICAgICAgemVyb3NldCAoY2NsKTsKKyAgICAgICAgICBub3RzZXQg KGNjbCk7CisgICAgICAgICAgaWYgKCEoc3ludGF4X2JpdHMgJiBSRV9ET1RfTkVXTElORSkpCisg ICAgICAgICAgICBjbHJiaXQgKCdcbicsIGNjbCk7CisgICAgICAgICAgaWYgKHN5bnRheF9iaXRz ICYgUkVfRE9UX05PVF9OVUxMKQorICAgICAgICAgICAgY2xyYml0ICgnXDAnLCBjY2wpOworICAg ICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gQ1NF VCArIGNoYXJjbGFzc19pbmRleCAoY2NsKTsKKworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAg Y2FzZSAnUyc6CisgICAgICAgICAgaWYgKCFiYWNrc2xhc2ggfHwgKHN5bnRheF9iaXRzICYgUkVf Tk9fR05VX09QUykpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgIGlm ICghZGZhLT5tdWx0aWJ5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHplcm9zZXQg KGNjbCk7CisgICAgICAgICAgICAgIGZvciAoYzIgPSAwOyBjMiA8IE5PVENIQVI7ICsrYzIpCisg ICAgICAgICAgICAgICAgaWYgKGlzc3BhY2UgKGMyKSkKKyAgICAgICAgICAgICAgICAgIHNldGJp dCAoYzIsIGNjbCk7CisgICAgICAgICAgICAgIGlmIChjID09ICdTJykKKyAgICAgICAgICAgICAg ICBub3RzZXQgKGNjbCk7CisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOworICAgICAg ICAgICAgICByZXR1cm4gbGFzdHRvayA9IENTRVQgKyBjaGFyY2xhc3NfaW5kZXggKGNjbCk7Cisg ICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBGSVhNRTogc2VlIGlmIG9wdGltaXppbmcgdGhp cywgYXMgaXMgZG9uZSB3aXRoIEFOWUNIQVIgYW5kCisgICAgICAgICAgICAgYWRkX3V0ZjhfYW55 Y2hhciwgbWFrZXMgc2Vuc2UuICAqLworCisgICAgICAgICAgLyogXHMgYW5kIFxTIGFyZSBkb2N1 bWVudGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gW1s6c3BhY2U6XV0gYW5kCisgICAgICAgICAgICAg W15bOnNwYWNlOl1dIHJlc3BlY3RpdmVseSwgc28gdGVsbCB0aGUgbGV4ZXIgdG8gcHJvY2VzcyB0 aG9zZQorICAgICAgICAgICAgIHN0cmluZ3MsIGVhY2ggbWludXMgaXRzICJhbHJlYWR5IHByb2Nl c3NlZCIgJ1snLiAgKi8KKyAgICAgICAgICBQVVNIX0xFWF9TVEFURSAoYyA9PSAncycgPyAiWzpz cGFjZTpdXSIgOiAiXls6c3BhY2U6XV0iKTsKKworICAgICAgICAgIGxhc3R0b2sgPSBwYXJzZV9i cmFja2V0X2V4cCAoKTsKKworICAgICAgICAgIFBPUF9MRVhfU1RBVEUgKCk7CisKKyAgICAgICAg ICBsYXN0c3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gbGFzdHRvazsKKworICAgICAg ICBjYXNlICd3JzoKKyAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgaWYgKCFiYWNrc2xhc2gg fHwgKHN5bnRheF9iaXRzICYgUkVfTk9fR05VX09QUykpCisgICAgICAgICAgICBnb3RvIG5vcm1h bF9jaGFyOworCisgICAgICAgICAgaWYgKCFkZmEtPm11bHRpYnl0ZSkKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgemVyb3NldCAoY2NsKTsKKyAgICAgICAgICAgICAgZm9yIChjMiA9IDA7 IGMyIDwgTk9UQ0hBUjsgKytjMikKKyAgICAgICAgICAgICAgICBpZiAodW5pYnl0ZV93b3JkX2Nv bnN0aXR1ZW50IChjMikpCisgICAgICAgICAgICAgICAgICBzZXRiaXQgKGMyLCBjY2wpOworICAg ICAgICAgICAgICBpZiAoYyA9PSAnVycpCisgICAgICAgICAgICAgICAgbm90c2V0IChjY2wpOwor ICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgcmV0dXJuIGxh c3R0b2sgPSBDU0VUICsgY2hhcmNsYXNzX2luZGV4IChjY2wpOworICAgICAgICAgICAgfQorCisg ICAgICAgICAgLyogRklYTUU6IHNlZSBpZiBvcHRpbWl6aW5nIHRoaXMsIGFzIGlzIGRvbmUgd2l0 aCBBTllDSEFSIGFuZAorICAgICAgICAgICAgIGFkZF91dGY4X2FueWNoYXIsIG1ha2VzIHNlbnNl LiAgKi8KKworICAgICAgICAgIC8qIFx3IGFuZCBcVyBhcmUgZG9jdW1lbnRlZCB0byBiZSBlcXVp dmFsZW50IHRvIFtfWzphbG51bTpdXSBhbmQKKyAgICAgICAgICAgICBbXl9bOmFsbnVtOl1dIHJl c3BlY3RpdmVseSwgc28gdGVsbCB0aGUgbGV4ZXIgdG8gcHJvY2VzcyB0aG9zZQorICAgICAgICAg ICAgIHN0cmluZ3MsIGVhY2ggbWludXMgaXRzICJhbHJlYWR5IHByb2Nlc3NlZCIgJ1snLiAgKi8K KyAgICAgICAgICBQVVNIX0xFWF9TVEFURSAoYyA9PSAndycgPyAiX1s6YWxudW06XV0iIDogIl5f WzphbG51bTpdXSIpOworCisgICAgICAgICAgbGFzdHRvayA9IHBhcnNlX2JyYWNrZXRfZXhwICgp OworCisgICAgICAgICAgUE9QX0xFWF9TVEFURSAoKTsKKworICAgICAgICAgIGxhc3RzdGFydCA9 IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rOworCisgICAgICAgIGNhc2UgJ1snOgor ICAgICAgICAgIGlmIChiYWNrc2xhc2gpCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOwor ICAgICAgICAgIGxhc3RzdGFydCA9IGZhbHNlOworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0g cGFyc2VfYnJhY2tldF9leHAgKCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgbm9ybWFs X2NoYXI6CisgICAgICAgICAgbGFzdHN0YXJ0ID0gZmFsc2U7CisgICAgICAgICAgLyogRm9yIG11 bHRpYnl0ZSBjaGFyYWN0ZXIgc2V0cywgZm9sZGluZyBpcyBkb25lIGluIGF0b20uICBBbHdheXMK KyAgICAgICAgICAgICByZXR1cm4gV0NIQVIuICAqLworICAgICAgICAgIGlmIChkZmEtPm11bHRp Ynl0ZSkKKyAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gV0NIQVI7CisKKyAgICAgICAgICBp ZiAoY2FzZV9mb2xkICYmIGlzYWxwaGEgKGMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICB6ZXJvc2V0IChjY2wpOworICAgICAgICAgICAgICBzZXRiaXRfY2FzZV9mb2xkX2MgKGMsIGNj bCk7CisgICAgICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gQ1NFVCArIGNoYXJjbGFzc19pbmRl eCAoY2NsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBsYXN0dG9rID0gYzsK KyAgICAgICAgfQorICAgIH0KKworICAvKiBUaGUgYWJvdmUgbG9vcCBzaG91bGQgY29uc3VtZSBh dCBtb3N0IGEgYmFja3NsYXNoCisgICAgIGFuZCBzb21lIG90aGVyIGNoYXJhY3Rlci4gICovCisg IGFib3J0ICgpOworICByZXR1cm4gRU5EOyAgICAgICAgICAgICAgICAgICAvKiBrZWVwcyBwZWRh bnRpYyBjb21waWxlcnMgaGFwcHkuICAqLworfQorCisvKiBSZWN1cnNpdmUgZGVzY2VudCBwYXJz ZXIgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgdG9rZW4gdG9rOyAgICAg ICAgICAgICAgIC8qIExvb2thaGVhZCB0b2tlbi4gICovCitzdGF0aWMgc2l6ZV90IGRlcHRoOyAg ICAgICAgICAgIC8qIEN1cnJlbnQgZGVwdGggb2YgYSBoeXBvdGhldGljYWwgc3RhY2sKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGluZyBkZWZlcnJlZCBwcm9kdWN0aW9u cy4gIFRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBk ZXRlcm1pbmUgdGhlIGRlcHRoIHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZXF1aXJlZCBvZiB0aGUgcmVhbCBzdGFjayBsYXRlciBvbiBpbgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmFhbmFseXplLiAgKi8KKworc3RhdGljIHZv aWQKK2FkZHRva19tYiAodG9rZW4gdCwgaW50IG1icHJvcCkKK3sKKyAgaWYgKGRmYS0+dGFsbG9j ID09IGRmYS0+dGluZGV4KQorICAgIHsKKyAgICAgIGRmYS0+dG9rZW5zID0geDJucmVhbGxvYyAo ZGZhLT50b2tlbnMsICZkZmEtPnRhbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZW9mICpkZmEtPnRva2Vucyk7CisgICAgICBpZiAoZGZhLT5tdWx0aWJ5dGUpCisgICAg ICAgIGRmYS0+bXVsdGlieXRlX3Byb3AgPSB4bnJlYWxsb2MgKGRmYS0+bXVsdGlieXRlX3Byb3As IGRmYS0+dGFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aXplb2YgKmRmYS0+bXVsdGlieXRlX3Byb3ApOworICAgIH0KKyAgaWYgKGRmYS0+bXVsdGlieXRl KQorICAgIGRmYS0+bXVsdGlieXRlX3Byb3BbZGZhLT50aW5kZXhdID0gbWJwcm9wOworICBkZmEt PnRva2Vuc1tkZmEtPnRpbmRleCsrXSA9IHQ7CisKKyAgc3dpdGNoICh0KQorICAgIHsKKyAgICBj YXNlIFFNQVJLOgorICAgIGNhc2UgU1RBUjoKKyAgICBjYXNlIFBMVVM6CisgICAgICBicmVhazsK KworICAgIGNhc2UgQ0FUOgorICAgIGNhc2UgT1I6CisgICAgICAtLWRlcHRoOworICAgICAgYnJl YWs7CisKKyAgICBjYXNlIEJBQ0tSRUY6CisgICAgICBkZmEtPmZhc3QgPSBmYWxzZTsKKyAgICAg IC8qIGZhbGx0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICsrZGZhLT5ubGVhdmVzOwor ICAgICAgLyogZmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIEVNUFRZOgorICAgICAgKytkZXB0aDsK KyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKGRlcHRoID4gZGZhLT5kZXB0aCkKKyAgICBkZmEt PmRlcHRoID0gZGVwdGg7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHRva193YyAod2ludF90IHdjKTsK KworLyogQWRkIHRoZSBnaXZlbiB0b2tlbiB0byB0aGUgcGFyc2UgdHJlZSwgbWFpbnRhaW5pbmcg dGhlIGRlcHRoIGNvdW50IGFuZAorICAgdXBkYXRpbmcgdGhlIG1heGltdW0gZGVwdGggaWYgbmVj ZXNzYXJ5LiAgKi8KK3N0YXRpYyB2b2lkCithZGR0b2sgKHRva2VuIHQpCit7CisgIGlmIChkZmEt Pm11bHRpYnl0ZSAmJiB0ID09IE1CQ1NFVCkKKyAgICB7CisgICAgICBib29sIG5lZWRfb3IgPSBm YWxzZTsKKyAgICAgIHN0cnVjdCBtYl9jaGFyX2NsYXNzZXMgKndvcmtfbWJjID0gJmRmYS0+bWJj c2V0c1tkZmEtPm5tYmNzZXRzIC0gMV07CisgICAgICBzaXplX3QgaTsKKworICAgICAgLyogRXh0 cmFjdCB3aWRlIGNoYXJhY3RlcnMgaW50byBhbHRlcm5hdGlvbnMgZm9yIGJldHRlciBwZXJmb3Jt YW5jZS4KKyAgICAgICAgIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBVVEYtOC4gICovCisgICAgICBm b3IgKGkgPSAwOyBpIDwgd29ya19tYmMtPm5jaGFyczsgaSsrKQorICAgICAgICB7CisgICAgICAg ICAgYWRkdG9rX3djICh3b3JrX21iYy0+Y2hhcnNbaV0pOworICAgICAgICAgIGlmIChuZWVkX29y KQorICAgICAgICAgICAgYWRkdG9rIChPUik7CisgICAgICAgICAgbmVlZF9vciA9IHRydWU7Cisg ICAgICAgIH0KKyAgICAgIHdvcmtfbWJjLT5uY2hhcnMgPSAwOworCisgICAgICAvKiBDaGFyYWN0 ZXJzIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlLCBzbyBpdCBpcyBwb3NzaWJsZQorICAgICAgICAg dGhhdCB0aGUgbWJjc2V0IGlzIGVtcHR5IG5vdy4gIERvIG5vdGhpbmcgaW4gdGhhdCBjYXNlLiAg Ki8KKyAgICAgIGlmICh3b3JrX21iYy0+Y3NldCAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAg IGFkZHRvayAoQ1NFVCArIHdvcmtfbWJjLT5jc2V0KTsKKyAgICAgICAgICBpZiAobmVlZF9vcikK KyAgICAgICAgICAgIGFkZHRvayAoT1IpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAg eworICAgICAgYWRkdG9rX21iICh0LCAzKTsKKyAgICB9Cit9CisKKy8qIFdlIHRyZWF0IGEgbXVs dGlieXRlIGNoYXJhY3RlciBhcyBhIHNpbmdsZSBhdG9tLCBzbyB0aGF0IERGQQorICAgY2FuIHRy ZWF0IGEgbXVsdGlieXRlIGNoYXJhY3RlciBhcyBhIHNpbmdsZSBleHByZXNzaW9uLgorCisgICBl LmcuLCB3ZSBjb25zdHJ1Y3QgdGhlIGZvbGxvd2luZyB0cmVlIGZyb20gIjxtYjE+PG1iMj4iLgor ICAgPG1iMSgxc3QtYnl0ZSk+PG1iMSgybmQtYnl0ZSk+PENBVD48bWIxKDNyZC1ieXRlKT48Q0FU PgorICAgPG1iMigxc3QtYnl0ZSk+PG1iMigybmQtYnl0ZSk+PENBVD48bWIyKDNyZC1ieXRlKT48 Q0FUPjxDQVQ+ICovCitzdGF0aWMgdm9pZAorYWRkdG9rX3djICh3aW50X3Qgd2MpCit7CisgIHVu c2lnbmVkIGNoYXIgYnVmW01CX0xFTl9NQVhdOworICBtYnN0YXRlX3QgcyA9IHsgMCB9OworICBp bnQgaTsKKyAgc2l6ZV90IHN0b3JlZF9ieXRlcyA9IHdjcnRvbWIgKChjaGFyICopIGJ1Ziwgd2Ms ICZzKTsKKworICBpZiAoc3RvcmVkX2J5dGVzICE9IChzaXplX3QpIC0xKQorICAgIGN1cl9tYl9s ZW4gPSBzdG9yZWRfYnl0ZXM7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIG1lcmVs eSBzdG9wLWdhcC4gIGJ1ZlswXSBpcyB1bmRlZmluZWQsIHlldCBza2lwcGluZworICAgICAgICAg dGhlIGFkZHRva19tYiBjYWxsIGFsdG9nZXRoZXIgY2FuIGNvcnJ1cHQgdGhlIGhlYXAuICAqLwor ICAgICAgY3VyX21iX2xlbiA9IDE7CisgICAgICBidWZbMF0gPSAwOworICAgIH0KKworICBhZGR0 b2tfbWIgKGJ1ZlswXSwgY3VyX21iX2xlbiA9PSAxID8gMyA6IDEpOworICBmb3IgKGkgPSAxOyBp IDwgY3VyX21iX2xlbjsgaSsrKQorICAgIHsKKyAgICAgIGFkZHRva19tYiAoYnVmW2ldLCBpID09 IGN1cl9tYl9sZW4gLSAxID8gMiA6IDApOworICAgICAgYWRkdG9rIChDQVQpOworICAgIH0KK30K Kworc3RhdGljIHZvaWQKK2FkZF91dGY4X2FueWNoYXIgKHZvaWQpCit7CisgIHN0YXRpYyBjaGFy Y2xhc3MgY29uc3QgdXRmOF9jbGFzc2VzWzVdID0geworICAgIC8qIDgwLWJmOiBub24tbGVhZGlu ZyBieXRlcy4gICovCisgICAgezAsIDAsIDAsIDAsIENIQVJDTEFTU19XT1JEX01BU0ssIENIQVJD TEFTU19XT1JEX01BU0ssIDAsIDB9LAorCisgICAgLyogMDAtN2Y6IDEtYnl0ZSBzZXF1ZW5jZS4g ICovCisgICAge0NIQVJDTEFTU19XT1JEX01BU0ssIENIQVJDTEFTU19XT1JEX01BU0ssIENIQVJD TEFTU19XT1JEX01BU0ssCisgICAgIENIQVJDTEFTU19XT1JEX01BU0ssIDAsIDAsIDAsIDB9LAor CisgICAgLyogYzItZGY6IDItYnl0ZSBzZXF1ZW5jZS4gICovCisgICAgezAsIDAsIDAsIDAsIDAs IDAsIH4zICYgQ0hBUkNMQVNTX1dPUkRfTUFTSywgMH0sCisKKyAgICAvKiBlMC1lZjogMy1ieXRl IHNlcXVlbmNlLiAgKi8KKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMHhmZmZmfSwKKworICAg IC8qIGYwLWY3OiA0LWJ5dGUgc2VxdWVuY2UuICAqLworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAw LCAweGZmMDAwMH0KKyAgfTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSBzaXplb2YgKHV0Zjhf Y2xhc3NlcykgLyBzaXplb2YgKHV0ZjhfY2xhc3Nlc1swXSk7CisgIHVuc2lnbmVkIGludCBpOwor CisgIC8qIERlZmluZSB0aGUgZml2ZSBjaGFyYWN0ZXIgY2xhc3NlcyB0aGF0IGFyZSBuZWVkZWQg YmVsb3cuICAqLworICBpZiAoZGZhLT51dGY4X2FueWNoYXJfY2xhc3Nlc1swXSA9PSAwKQorICAg IGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICB7CisgICAgICAgIGNoYXJjbGFzcyBjOwor ICAgICAgICBjb3B5c2V0ICh1dGY4X2NsYXNzZXNbaV0sIGMpOworICAgICAgICBpZiAoaSA9PSAx KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKHN5bnRheF9iaXRzICYgUkVfRE9UX05F V0xJTkUpKQorICAgICAgICAgICAgICBjbHJiaXQgKCdcbicsIGMpOworICAgICAgICAgICAgaWYg KHN5bnRheF9iaXRzICYgUkVfRE9UX05PVF9OVUxMKQorICAgICAgICAgICAgICBjbHJiaXQgKCdc MCcsIGMpOworICAgICAgICAgIH0KKyAgICAgICAgZGZhLT51dGY4X2FueWNoYXJfY2xhc3Nlc1tp XSA9IENTRVQgKyBjaGFyY2xhc3NfaW5kZXggKGMpOworICAgICAgfQorCisgIC8qIEEgdmFsaWQg VVRGLTggY2hhcmFjdGVyIGlzCisKKyAgICAgKFsweDAwLTB4N2ZdCisgICAgIHxbMHhjMi0weGRm XVsweDgwLTB4YmZdCisgICAgIHxbMHhlMC0weGVmWzB4ODAtMHhiZl1bMHg4MC0weGJmXQorICAg ICB8WzB4ZjAtZjddWzB4ODAtMHhiZl1bMHg4MC0weGJmXVsweDgwLTB4YmZdKQorCisgICAgIHdo aWNoIEknbGwgd3JpdGUgbW9yZSBjb25jaXNlbHkgIkJ8Q0F8REFBfEVBQUEiLiAgRmFjdG9yIHRo ZSBbMHgwMC0weDdmXQorICAgICBhbmQgeW91IGdldCAiQnwoQ3woRHxFQSlBKUEiLiAgQW5kIHNp bmNlIHRoZSB0b2tlbiBidWZmZXIgaXMgaW4gcmV2ZXJzZQorICAgICBQb2xpc2ggbm90YXRpb24s IHlvdSBnZXQgIkIgQyBEIEUgQSBDQVQgT1IgQSBDQVQgT1IgQSBDQVQgT1IiLiAgKi8KKyAgZm9y IChpID0gMTsgaSA8IG47IGkrKykKKyAgICBhZGR0b2sgKGRmYS0+dXRmOF9hbnljaGFyX2NsYXNz ZXNbaV0pOworICB3aGlsZSAoLS1pID4gMSkKKyAgICB7CisgICAgICBhZGR0b2sgKGRmYS0+dXRm OF9hbnljaGFyX2NsYXNzZXNbMF0pOworICAgICAgYWRkdG9rIChDQVQpOworICAgICAgYWRkdG9r IChPUik7CisgICAgfQorfQorCisvKiBUaGUgZ3JhbW1hciB1bmRlcnN0b29kIGJ5IHRoZSBwYXJz ZXIgaXMgYXMgZm9sbG93cy4KKworICAgcmVnZXhwOgorICAgICByZWdleHAgT1IgYnJhbmNoCisg ICAgIGJyYW5jaAorCisgICBicmFuY2g6CisgICAgIGJyYW5jaCBjbG9zdXJlCisgICAgIGNsb3N1 cmUKKworICAgY2xvc3VyZToKKyAgICAgY2xvc3VyZSBRTUFSSworICAgICBjbG9zdXJlIFNUQVIK KyAgICAgY2xvc3VyZSBQTFVTCisgICAgIGNsb3N1cmUgUkVQTU4KKyAgICAgYXRvbQorCisgICBh dG9tOgorICAgICA8bm9ybWFsIGNoYXJhY3Rlcj4KKyAgICAgPG11bHRpYnl0ZSBjaGFyYWN0ZXI+ CisgICAgIEFOWUNIQVIKKyAgICAgTUJDU0VUCisgICAgIENTRVQKKyAgICAgQkFDS1JFRgorICAg ICBCRUdMSU5FCisgICAgIEVORExJTkUKKyAgICAgQkVHV09SRAorICAgICBFTkRXT1JECisgICAg IExJTVdPUkQKKyAgICAgTk9UTElNV09SRAorICAgICBMUEFSRU4gcmVnZXhwIFJQQVJFTgorICAg ICA8ZW1wdHk+CisKKyAgIFRoZSBwYXJzZXIgYnVpbGRzIGEgcGFyc2UgdHJlZSBpbiBwb3N0Zml4 IGZvcm0gaW4gYW4gYXJyYXkgb2YgdG9rZW5zLiAgKi8KKworc3RhdGljIHZvaWQKK2F0b20gKHZv aWQpCit7CisgIGlmICh0b2sgPT0gV0NIQVIpCisgICAgeworICAgICAgaWYgKHdjdG9rID09IFdF T0YpCisgICAgICAgIGFkZHRvayAoQkFDS1JFRik7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAg ICAgICAgICBhZGR0b2tfd2MgKHdjdG9rKTsKKworICAgICAgICAgIGlmIChjYXNlX2ZvbGQpCisg ICAgICAgICAgICB7CisgICAgICAgICAgICAgIHdjaGFyX3QgZm9sZGVkW0NBU0VfRk9MREVEX0JV RlNJWkVdOworICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaSwgbiA9IGNhc2VfZm9sZGVkX2Nv dW50ZXJwYXJ0cyAod2N0b2ssIGZvbGRlZCk7CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkg PCBuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWRkdG9rX3dj IChmb2xkZWRbaV0pOworICAgICAgICAgICAgICAgICAgYWRkdG9rIChPUik7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHRvayA9IGxleCAoKTsK KyAgICB9CisgIGVsc2UgaWYgKHRvayA9PSBBTllDSEFSICYmIHVzaW5nX3V0ZjggKCkpCisgICAg eworICAgICAgLyogRm9yIFVURi04IGV4cGFuZCB0aGUgcGVyaW9kIHRvIGEgc2VyaWVzIG9mIENT RVRzIHRoYXQgZGVmaW5lIGEgdmFsaWQKKyAgICAgICAgIFVURi04IGNoYXJhY3Rlci4gIFRoaXMg YXZvaWRzIHVzaW5nIHRoZSBzbG93IG11bHRpYnl0ZSBwYXRoLiAgSSdtCisgICAgICAgICBwcmV0 dHkgc3VyZSBpdCB3b3VsZCBiZSBib3RoIHByb2ZpdGFibGUgYW5kIGNvcnJlY3QgdG8gZG8gaXQg Zm9yCisgICAgICAgICBhbnkgZW5jb2Rpbmc7IGhvd2V2ZXIsIHRoZSBvcHRpbWl6YXRpb24gbXVz dCBiZSBkb25lIG1hbnVhbGx5IGFzCisgICAgICAgICBpdCBpcyBkb25lIGFib3ZlIGluIGFkZF91 dGY4X2FueWNoYXIuICBTbywgbGV0J3Mgc3RhcnQgd2l0aAorICAgICAgICAgVVRGLTg6IGl0IGlz IHRoZSBtb3N0IHVzZWQsIGFuZCB0aGUgc3RydWN0dXJlIG9mIHRoZSBlbmNvZGluZworICAgICAg ICAgbWFrZXMgdGhlIGNvcnJlY3RuZXNzIG1vcmUgb2J2aW91cy4gICovCisgICAgICBhZGRfdXRm OF9hbnljaGFyICgpOworICAgICAgdG9rID0gbGV4ICgpOworICAgIH0KKyAgZWxzZSBpZiAoKHRv ayA+PSAwICYmIHRvayA8IE5PVENIQVIpIHx8IHRvayA+PSBDU0VUIHx8IHRvayA9PSBCQUNLUkVG CisgICAgICAgICAgIHx8IHRvayA9PSBCRUdMSU5FIHx8IHRvayA9PSBFTkRMSU5FIHx8IHRvayA9 PSBCRUdXT1JECisgICAgICAgICAgIHx8IHRvayA9PSBBTllDSEFSIHx8IHRvayA9PSBNQkNTRVQK KyAgICAgICAgICAgfHwgdG9rID09IEVORFdPUkQgfHwgdG9rID09IExJTVdPUkQgfHwgdG9rID09 IE5PVExJTVdPUkQpCisgICAgeworICAgICAgYWRkdG9rICh0b2spOworICAgICAgdG9rID0gbGV4 ICgpOworICAgIH0KKyAgZWxzZSBpZiAodG9rID09IExQQVJFTikKKyAgICB7CisgICAgICB0b2sg PSBsZXggKCk7CisgICAgICByZWdleHAgKCk7CisgICAgICBpZiAodG9rICE9IFJQQVJFTikKKyAg ICAgICAgZGZhZXJyb3IgKF8oInVuYmFsYW5jZWQgKCIpKTsKKyAgICAgIHRvayA9IGxleCAoKTsK KyAgICB9CisgIGVsc2UKKyAgICBhZGR0b2sgKEVNUFRZKTsKK30KKworLyogUmV0dXJuIHRoZSBu dW1iZXIgb2YgdG9rZW5zIGluIHRoZSBnaXZlbiBzdWJleHByZXNzaW9uLiAgKi8KK3N0YXRpYyBz aXplX3QgX0dMX0FUVFJJQlVURV9QVVJFCituc3VidG9rcyAoc2l6ZV90IHRpbmRleCkKK3sKKyAg c2l6ZV90IG50b2tzMTsKKworICBzd2l0Y2ggKGRmYS0+dG9rZW5zW3RpbmRleCAtIDFdKQorICAg IHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBRTUFSSzoKKyAgICBj YXNlIFNUQVI6CisgICAgY2FzZSBQTFVTOgorICAgICAgcmV0dXJuIDEgKyBuc3VidG9rcyAodGlu ZGV4IC0gMSk7CisgICAgY2FzZSBDQVQ6CisgICAgY2FzZSBPUjoKKyAgICAgIG50b2tzMSA9IG5z dWJ0b2tzICh0aW5kZXggLSAxKTsKKyAgICAgIHJldHVybiAxICsgbnRva3MxICsgbnN1YnRva3Mg KHRpbmRleCAtIDEgLSBudG9rczEpOworICAgIH0KK30KKworLyogQ29weSB0aGUgZ2l2ZW4gc3Vi ZXhwcmVzc2lvbiB0byB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgKi8KK3N0YXRpYyB2b2lkCitjb3B5 dG9rcyAoc2l6ZV90IHRpbmRleCwgc2l6ZV90IG50b2tlbnMpCit7CisgIHNpemVfdCBpOworCisg IGlmIChkZmEtPm11bHRpYnl0ZSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRva2VuczsgKytpKQor ICAgICAgYWRkdG9rX21iIChkZmEtPnRva2Vuc1t0aW5kZXggKyBpXSwgZGZhLT5tdWx0aWJ5dGVf cHJvcFt0aW5kZXggKyBpXSk7CisgIGVsc2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRva2Vuczsg KytpKQorICAgICAgYWRkdG9rX21iIChkZmEtPnRva2Vuc1t0aW5kZXggKyBpXSwgMyk7Cit9CisK K3N0YXRpYyB2b2lkCitjbG9zdXJlICh2b2lkKQoreworICBpbnQgaTsKKyAgc2l6ZV90IHRpbmRl eCwgbnRva2VuczsKKworICBhdG9tICgpOworICB3aGlsZSAodG9rID09IFFNQVJLIHx8IHRvayA9 PSBTVEFSIHx8IHRvayA9PSBQTFVTIHx8IHRvayA9PSBSRVBNTikKKyAgICBpZiAodG9rID09IFJF UE1OICYmIChtaW5yZXAgfHwgbWF4cmVwKSkKKyAgICAgIHsKKyAgICAgICAgbnRva2VucyA9IG5z dWJ0b2tzIChkZmEtPnRpbmRleCk7CisgICAgICAgIHRpbmRleCA9IGRmYS0+dGluZGV4IC0gbnRv a2VuczsKKyAgICAgICAgaWYgKG1heHJlcCA8IDApCisgICAgICAgICAgYWRkdG9rIChQTFVTKTsK KyAgICAgICAgaWYgKG1pbnJlcCA9PSAwKQorICAgICAgICAgIGFkZHRvayAoUU1BUkspOworICAg ICAgICBmb3IgKGkgPSAxOyBpIDwgbWlucmVwOyArK2kpCisgICAgICAgICAgeworICAgICAgICAg ICAgY29weXRva3MgKHRpbmRleCwgbnRva2Vucyk7CisgICAgICAgICAgICBhZGR0b2sgKENBVCk7 CisgICAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IG1heHJlcDsgKytpKQorICAgICAgICAg IHsKKyAgICAgICAgICAgIGNvcHl0b2tzICh0aW5kZXgsIG50b2tlbnMpOworICAgICAgICAgICAg YWRkdG9rIChRTUFSSyk7CisgICAgICAgICAgICBhZGR0b2sgKENBVCk7CisgICAgICAgICAgfQor ICAgICAgICB0b2sgPSBsZXggKCk7CisgICAgICB9CisgICAgZWxzZSBpZiAodG9rID09IFJFUE1O KQorICAgICAgeworICAgICAgICBkZmEtPnRpbmRleCAtPSBuc3VidG9rcyAoZGZhLT50aW5kZXgp OworICAgICAgICB0b2sgPSBsZXggKCk7CisgICAgICAgIGNsb3N1cmUgKCk7CisgICAgICB9Cisg ICAgZWxzZQorICAgICAgeworICAgICAgICBhZGR0b2sgKHRvayk7CisgICAgICAgIHRvayA9IGxl eCAoKTsKKyAgICAgIH0KK30KKworc3RhdGljIHZvaWQKK2JyYW5jaCAodm9pZCkKK3sKKyAgY2xv c3VyZSAoKTsKKyAgd2hpbGUgKHRvayAhPSBSUEFSRU4gJiYgdG9rICE9IE9SICYmIHRvayA+PSAw KQorICAgIHsKKyAgICAgIGNsb3N1cmUgKCk7CisgICAgICBhZGR0b2sgKENBVCk7CisgICAgfQor fQorCitzdGF0aWMgdm9pZAorcmVnZXhwICh2b2lkKQoreworICBicmFuY2ggKCk7CisgIHdoaWxl ICh0b2sgPT0gT1IpCisgICAgeworICAgICAgdG9rID0gbGV4ICgpOworICAgICAgYnJhbmNoICgp OworICAgICAgYWRkdG9rIChPUik7CisgICAgfQorfQorCisvKiBNYWluIGVudHJ5IHBvaW50IGZv ciB0aGUgcGFyc2VyLiAgUyBpcyBhIHN0cmluZyB0byBiZSBwYXJzZWQsIGxlbiBpcyB0aGUKKyAg IGxlbmd0aCBvZiB0aGUgc3RyaW5nLCBzbyBzIGNhbiBpbmNsdWRlIE5VTCBjaGFyYWN0ZXJzLiAg RCBpcyBhIHBvaW50ZXIgdG8KKyAgIHRoZSBzdHJ1Y3QgZGZhIHRvIHBhcnNlIGludG8uICAqLwor c3RhdGljIHZvaWQKK2RmYXBhcnNlIChjaGFyIGNvbnN0ICpzLCBzaXplX3QgbGVuLCBzdHJ1Y3Qg ZGZhICpkKQoreworICBkZmEgPSBkOworICBsZXhwdHIgPSBzOworICBsZXhsZWZ0ID0gbGVuOwor ICBsYXN0dG9rID0gRU5EOworICBsYXN0c3RhcnQgPSB0cnVlOworICBwYXJlbnMgPSAwOworICBp ZiAoZGZhLT5tdWx0aWJ5dGUpCisgICAgeworICAgICAgY3VyX21iX2xlbiA9IDA7CisgICAgICBt ZW1zZXQgKCZkLT5tYnMsIDAsIHNpemVvZiBkLT5tYnMpOworICAgIH0KKworICBpZiAoIXN5bnRh eF9iaXRzX3NldCkKKyAgICBkZmFlcnJvciAoXygibm8gc3ludGF4IHNwZWNpZmllZCIpKTsKKwor ICB0b2sgPSBsZXggKCk7CisgIGRlcHRoID0gZC0+ZGVwdGg7CisKKyAgcmVnZXhwICgpOworCisg IGlmICh0b2sgIT0gRU5EKQorICAgIGRmYWVycm9yIChfKCJ1bmJhbGFuY2VkICkiKSk7CisKKyAg YWRkdG9rIChFTkQgLSBkLT5ucmVnZXhwcyk7CisgIGFkZHRvayAoQ0FUKTsKKworICBpZiAoZC0+ bnJlZ2V4cHMpCisgICAgYWRkdG9rIChPUik7CisKKyAgKytkLT5ucmVnZXhwczsKK30KKworLyog U29tZSBwcmltaXRpdmVzIGZvciBvcGVyYXRpbmcgb24gc2V0cyBvZiBwb3NpdGlvbnMuICAqLwor CisvKiBDb3B5IG9uZSBzZXQgdG8gYW5vdGhlci4gICovCitzdGF0aWMgdm9pZAorY29weSAocG9z aXRpb25fc2V0IGNvbnN0ICpzcmMsIHBvc2l0aW9uX3NldCAqZHN0KQoreworICBpZiAoZHN0LT5h bGxvYyA8IHNyYy0+bmVsZW0pCisgICAgeworICAgICAgZnJlZSAoZHN0LT5lbGVtcyk7CisgICAg ICBkc3QtPmFsbG9jID0gc3JjLT5uZWxlbTsKKyAgICAgIGRzdC0+ZWxlbXMgPSB4Mm5yZWFsbG9j IChOVUxMLCAmZHN0LT5hbGxvYywgc2l6ZW9mICpkc3QtPmVsZW1zKTsKKyAgICB9CisgIG1lbWNw eSAoZHN0LT5lbGVtcywgc3JjLT5lbGVtcywgc3JjLT5uZWxlbSAqIHNpemVvZiAqZHN0LT5lbGVt cyk7CisgIGRzdC0+bmVsZW0gPSBzcmMtPm5lbGVtOworfQorCitzdGF0aWMgdm9pZAorYWxsb2Nf cG9zaXRpb25fc2V0IChwb3NpdGlvbl9zZXQgKnMsIHNpemVfdCBzaXplKQoreworICBzLT5lbGVt cyA9IHhubWFsbG9jIChzaXplLCBzaXplb2YgKnMtPmVsZW1zKTsKKyAgcy0+YWxsb2MgPSBzaXpl OworICBzLT5uZWxlbSA9IDA7Cit9CisKKy8qIEluc2VydCBwb3NpdGlvbiBQIGluIHNldCBTLiAg UyBpcyBtYWludGFpbmVkIGluIHNvcnRlZCBvcmRlciBvbgorICAgZGVjcmVhc2luZyBpbmRleC4g IElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZW50cnkgaW4gUyB3aXRoIFAuaW5kZXgKKyAgIHRoZW4g bWVyZ2UgKGxvZ2ljYWxseS1PUikgUCdzIGNvbnN0cmFpbnRzIGludG8gdGhlIG9uZSBpbiBTLgor ICAgUy0+ZWxlbXMgbXVzdCBwb2ludCB0byBhbiBhcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0 aGUgcmVzdWx0aW5nIHNldC4gICovCitzdGF0aWMgdm9pZAoraW5zZXJ0IChwb3NpdGlvbiBwLCBw b3NpdGlvbl9zZXQgKnMpCit7CisgIHNpemVfdCBjb3VudCA9IHMtPm5lbGVtOworICBzaXplX3Qg bG8gPSAwLCBoaSA9IGNvdW50OworICBzaXplX3QgaTsKKyAgd2hpbGUgKGxvIDwgaGkpCisgICAg eworICAgICAgc2l6ZV90IG1pZCA9IChsbyArIGhpKSA+PiAxOworICAgICAgaWYgKHMtPmVsZW1z W21pZF0uaW5kZXggPiBwLmluZGV4KQorICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgICBlbHNl CisgICAgICAgIGhpID0gbWlkOworICAgIH0KKworICBpZiAobG8gPCBjb3VudCAmJiBwLmluZGV4 ID09IHMtPmVsZW1zW2xvXS5pbmRleCkKKyAgICB7CisgICAgICBzLT5lbGVtc1tsb10uY29uc3Ry YWludCB8PSBwLmNvbnN0cmFpbnQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHMtPmVsZW1z ID0gbWF5YmVfcmVhbGxvYyAocy0+ZWxlbXMsIGNvdW50LCAmcy0+YWxsb2MsIHNpemVvZiAqcy0+ ZWxlbXMpOworICBmb3IgKGkgPSBjb3VudDsgaSA+IGxvOyBpLS0pCisgICAgcy0+ZWxlbXNbaV0g PSBzLT5lbGVtc1tpIC0gMV07CisgIHMtPmVsZW1zW2xvXSA9IHA7CisgICsrcy0+bmVsZW07Cit9 CisKKy8qIE1lcmdlIHR3byBzZXRzIG9mIHBvc2l0aW9ucyBpbnRvIGEgdGhpcmQuICBUaGUgcmVz dWx0IGlzIGV4YWN0bHkgYXMgaWYKKyAgIHRoZSBwb3NpdGlvbnMgb2YgYm90aCBzZXRzIHdlcmUg aW5zZXJ0ZWQgaW50byBhbiBpbml0aWFsbHkgZW1wdHkgc2V0LiAgKi8KK3N0YXRpYyB2b2lkCitt ZXJnZSAocG9zaXRpb25fc2V0IGNvbnN0ICpzMSwgcG9zaXRpb25fc2V0IGNvbnN0ICpzMiwgcG9z aXRpb25fc2V0ICptKQoreworICBzaXplX3QgaSA9IDAsIGogPSAwOworCisgIGlmIChtLT5hbGxv YyA8IHMxLT5uZWxlbSArIHMyLT5uZWxlbSkKKyAgICB7CisgICAgICBmcmVlIChtLT5lbGVtcyk7 CisgICAgICBtLT5lbGVtcyA9IG1heWJlX3JlYWxsb2MgKE5VTEwsIHMxLT5uZWxlbSArIHMyLT5u ZWxlbSwgJm0tPmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yg Km0tPmVsZW1zKTsKKyAgICB9CisgIG0tPm5lbGVtID0gMDsKKyAgd2hpbGUgKGkgPCBzMS0+bmVs ZW0gJiYgaiA8IHMyLT5uZWxlbSkKKyAgICBpZiAoczEtPmVsZW1zW2ldLmluZGV4ID4gczItPmVs ZW1zW2pdLmluZGV4KQorICAgICAgbS0+ZWxlbXNbbS0+bmVsZW0rK10gPSBzMS0+ZWxlbXNbaSsr XTsKKyAgICBlbHNlIGlmIChzMS0+ZWxlbXNbaV0uaW5kZXggPCBzMi0+ZWxlbXNbal0uaW5kZXgp CisgICAgICBtLT5lbGVtc1ttLT5uZWxlbSsrXSA9IHMyLT5lbGVtc1tqKytdOworICAgIGVsc2UK KyAgICAgIHsKKyAgICAgICAgbS0+ZWxlbXNbbS0+bmVsZW1dID0gczEtPmVsZW1zW2krK107Cisg ICAgICAgIG0tPmVsZW1zW20tPm5lbGVtKytdLmNvbnN0cmFpbnQgfD0gczItPmVsZW1zW2orK10u Y29uc3RyYWludDsKKyAgICAgIH0KKyAgd2hpbGUgKGkgPCBzMS0+bmVsZW0pCisgICAgbS0+ZWxl bXNbbS0+bmVsZW0rK10gPSBzMS0+ZWxlbXNbaSsrXTsKKyAgd2hpbGUgKGogPCBzMi0+bmVsZW0p CisgICAgbS0+ZWxlbXNbbS0+bmVsZW0rK10gPSBzMi0+ZWxlbXNbaisrXTsKK30KKworLyogRGVs ZXRlIGEgcG9zaXRpb24gZnJvbSBhIHNldC4gICovCitzdGF0aWMgdm9pZAorZGVsZXRlIChwb3Np dGlvbiBwLCBwb3NpdGlvbl9zZXQgKnMpCit7CisgIHNpemVfdCBpOworCisgIGZvciAoaSA9IDA7 IGkgPCBzLT5uZWxlbTsgKytpKQorICAgIGlmIChwLmluZGV4ID09IHMtPmVsZW1zW2ldLmluZGV4 KQorICAgICAgYnJlYWs7CisgIGlmIChpIDwgcy0+bmVsZW0pCisgICAgZm9yICgtLXMtPm5lbGVt OyBpIDwgcy0+bmVsZW07ICsraSkKKyAgICAgIHMtPmVsZW1zW2ldID0gcy0+ZWxlbXNbaSArIDFd OworfQorCisvKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byB0 aGUgZ2l2ZW4gcG9zaXRpb24gc2V0IHdpdGgKKyAgIHRoZSBnaXZlbiBwcmVjZWRpbmcgY29udGV4 dCwgb3IgY3JlYXRlIGEgbmV3IHN0YXRlIGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyAgIHN0YXRlLiAg Q29udGV4dCB0ZWxscyB3aGV0aGVyIHdlIGdvdCBoZXJlIG9uIGEgbmV3bGluZSBvciBsZXR0ZXIu ICAqLworc3RhdGljIHN0YXRlX251bQorc3RhdGVfaW5kZXggKHN0cnVjdCBkZmEgKmQsIHBvc2l0 aW9uX3NldCBjb25zdCAqcywgaW50IGNvbnRleHQpCit7CisgIHNpemVfdCBoYXNoID0gMDsKKyAg aW50IGNvbnN0cmFpbnQ7CisgIHN0YXRlX251bSBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBz LT5uZWxlbTsgKytpKQorICAgIGhhc2ggXj0gcy0+ZWxlbXNbaV0uaW5kZXggKyBzLT5lbGVtc1tp XS5jb25zdHJhaW50OworCisgIC8qIFRyeSB0byBmaW5kIGEgc3RhdGUgdGhhdCBleGFjdGx5IG1h dGNoZXMgdGhlIHByb3Bvc2VkIG9uZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zaW5kZXg7 ICsraSkKKyAgICB7CisgICAgICBpZiAoaGFzaCAhPSBkLT5zdGF0ZXNbaV0uaGFzaCB8fCBzLT5u ZWxlbSAhPSBkLT5zdGF0ZXNbaV0uZWxlbXMubmVsZW0KKyAgICAgICAgICB8fCBjb250ZXh0ICE9 IGQtPnN0YXRlc1tpXS5jb250ZXh0KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGZvciAoaiA9 IDA7IGogPCBzLT5uZWxlbTsgKytqKQorICAgICAgICBpZiAocy0+ZWxlbXNbal0uY29uc3RyYWlu dAorICAgICAgICAgICAgIT0gZC0+c3RhdGVzW2ldLmVsZW1zLmVsZW1zW2pdLmNvbnN0cmFpbnQK KyAgICAgICAgICAgIHx8IHMtPmVsZW1zW2pdLmluZGV4ICE9IGQtPnN0YXRlc1tpXS5lbGVtcy5l bGVtc1tqXS5pbmRleCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChqID09IHMtPm5lbGVt KQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChz dGRlcnIsICJuZXcgc3RhdGUgJXpkXG4gbmV4dHBvczoiLCBpKTsKKyAgZm9yIChqID0gMDsgaiA8 IHMtPm5lbGVtOyArK2opCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBz LT5lbGVtc1tqXS5pbmRleCk7CisgICAgICBwcnRvayAoZC0+dG9rZW5zW3MtPmVsZW1zW2pdLmlu ZGV4XSk7CisgICAgfQorICBmcHJpbnRmIChzdGRlcnIsICJcbiBjb250ZXh0OiIpOworICBpZiAo Y29udGV4dCBeIENUWF9BTlkpCisgICAgeworICAgICAgaWYgKGNvbnRleHQgJiBDVFhfTk9ORSkK KyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIENUWF9OT05FIik7CisgICAgICBpZiAoY29udGV4 dCAmIENUWF9MRVRURVIpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBDVFhfTEVUVEVSIik7 CisgICAgICBpZiAoY29udGV4dCAmIENUWF9ORVdMSU5FKQorICAgICAgICBmcHJpbnRmIChzdGRl cnIsICIgQ1RYX05FV0xJTkUiKTsKKyAgICB9CisgIGVsc2UKKyAgICBmcHJpbnRmIChzdGRlcnIs ICIgQ1RYX0FOWSIpOworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgLyog V2UnbGwgaGF2ZSB0byBjcmVhdGUgYSBuZXcgc3RhdGUuICAqLworICBkLT5zdGF0ZXMgPSBtYXli ZV9yZWFsbG9jIChkLT5zdGF0ZXMsIGQtPnNpbmRleCwgJmQtPnNhbGxvYywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2l6ZW9mICpkLT5zdGF0ZXMpOworICBkLT5zdGF0ZXNbaV0uaGFz aCA9IGhhc2g7CisgIGFsbG9jX3Bvc2l0aW9uX3NldCAoJmQtPnN0YXRlc1tpXS5lbGVtcywgcy0+ bmVsZW0pOworICBjb3B5IChzLCAmZC0+c3RhdGVzW2ldLmVsZW1zKTsKKyAgZC0+c3RhdGVzW2ld LmNvbnRleHQgPSBjb250ZXh0OworICBkLT5zdGF0ZXNbaV0uY29uc3RyYWludCA9IDA7CisgIGQt PnN0YXRlc1tpXS5maXJzdF9lbmQgPSAwOworICBkLT5zdGF0ZXNbaV0ubWJwcy5uZWxlbSA9IDA7 CisgIGQtPnN0YXRlc1tpXS5tYnBzLmVsZW1zID0gTlVMTDsKKworICBmb3IgKGogPSAwOyBqIDwg cy0+bmVsZW07ICsraikKKyAgICBpZiAoZC0+dG9rZW5zW3MtPmVsZW1zW2pdLmluZGV4XSA8IDAp CisgICAgICB7CisgICAgICAgIGNvbnN0cmFpbnQgPSBzLT5lbGVtc1tqXS5jb25zdHJhaW50Owor ICAgICAgICBpZiAoU1VDQ0VFRFNfSU5fQ09OVEVYVCAoY29uc3RyYWludCwgY29udGV4dCwgQ1RY X0FOWSkpCisgICAgICAgICAgZC0+c3RhdGVzW2ldLmNvbnN0cmFpbnQgfD0gY29uc3RyYWludDsK KyAgICAgICAgaWYgKCFkLT5zdGF0ZXNbaV0uZmlyc3RfZW5kKQorICAgICAgICAgIGQtPnN0YXRl c1tpXS5maXJzdF9lbmQgPSBkLT50b2tlbnNbcy0+ZWxlbXNbal0uaW5kZXhdOworICAgICAgfQor ICAgIGVsc2UgaWYgKGQtPnRva2Vuc1tzLT5lbGVtc1tqXS5pbmRleF0gPT0gQkFDS1JFRikKKyAg ICAgIGQtPnN0YXRlc1tpXS5jb25zdHJhaW50ID0gTk9fQ09OU1RSQUlOVDsKKworICArK2QtPnNp bmRleDsKKworICByZXR1cm4gaTsKK30KKworLyogRmluZCB0aGUgZXBzaWxvbiBjbG9zdXJlIG9m IGEgc2V0IG9mIHBvc2l0aW9ucy4gIElmIGFueSBwb3NpdGlvbiBvZiB0aGUgc2V0CisgICBjb250 YWlucyBhIHN5bWJvbCB0aGF0IG1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZyBpbiBzb21lIGNvbnRl eHQsIHJlcGxhY2UKKyAgIHRoYXQgcG9zaXRpb24gd2l0aCB0aGUgZWxlbWVudHMgb2YgaXRzIGZv bGxvdyBsYWJlbGVkIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAgIGNvbnN0cmFpbnQuICBSZXBlYXQg ZXhoYXVzdGl2ZWx5IHVudGlsIG5vIGZ1bm55IHBvc2l0aW9ucyBhcmUgbGVmdC4KKyAgIFMtPmVs ZW1zIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdC4gICovCitzdGF0aWMg dm9pZAorZXBzY2xvc3VyZSAocG9zaXRpb25fc2V0ICpzLCBzdHJ1Y3QgZGZhIGNvbnN0ICpkLCBj aGFyICp2aXNpdGVkKQoreworICBzaXplX3QgaSwgajsKKyAgcG9zaXRpb24gcCwgb2xkOworICBi b29sIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IHMtPm5lbGVtOyAr K2kpCisgICAgaWYgKGQtPnRva2Vuc1tzLT5lbGVtc1tpXS5pbmRleF0gPj0gTk9UQ0hBUgorICAg ICAgICAmJiBkLT50b2tlbnNbcy0+ZWxlbXNbaV0uaW5kZXhdICE9IEJBQ0tSRUYKKyAgICAgICAg JiYgZC0+dG9rZW5zW3MtPmVsZW1zW2ldLmluZGV4XSAhPSBBTllDSEFSCisgICAgICAgICYmIGQt PnRva2Vuc1tzLT5lbGVtc1tpXS5pbmRleF0gIT0gTUJDU0VUCisgICAgICAgICYmIGQtPnRva2Vu c1tzLT5lbGVtc1tpXS5pbmRleF0gPCBDU0VUKQorICAgICAgeworICAgICAgICBpZiAoIWluaXRp YWxpemVkKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCAodmlzaXRlZCwgMCwgZC0+ dGluZGV4ICogc2l6ZW9mICgqdmlzaXRlZCkpOworICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0 cnVlOworICAgICAgICAgIH0KKyAgICAgICAgb2xkID0gcy0+ZWxlbXNbaV07CisgICAgICAgIHAu Y29uc3RyYWludCA9IG9sZC5jb25zdHJhaW50OworICAgICAgICBkZWxldGUgKHMtPmVsZW1zW2ld LCBzKTsKKyAgICAgICAgaWYgKHZpc2l0ZWRbb2xkLmluZGV4XSkKKyAgICAgICAgICB7CisgICAg ICAgICAgICAtLWk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAg IHZpc2l0ZWRbb2xkLmluZGV4XSA9IDE7CisgICAgICAgIHN3aXRjaCAoZC0+dG9rZW5zW29sZC5p bmRleF0pCisgICAgICAgICAgeworICAgICAgICAgIGNhc2UgQkVHTElORToKKyAgICAgICAgICAg IHAuY29uc3RyYWludCAmPSBCRUdMSU5FX0NPTlNUUkFJTlQ7CisgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICBjYXNlIEVORExJTkU6CisgICAgICAgICAgICBwLmNvbnN0cmFpbnQgJj0gRU5E TElORV9DT05TVFJBSU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBCRUdX T1JEOgorICAgICAgICAgICAgcC5jb25zdHJhaW50ICY9IEJFR1dPUkRfQ09OU1RSQUlOVDsKKyAg ICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgICAgIHAu Y29uc3RyYWludCAmPSBFTkRXT1JEX0NPTlNUUkFJTlQ7CisgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgICBjYXNlIExJTVdPUkQ6CisgICAgICAgICAgICBwLmNvbnN0cmFpbnQgJj0gTElNV09S RF9DT05TVFJBSU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBOT1RMSU1X T1JEOgorICAgICAgICAgICAgcC5jb25zdHJhaW50ICY9IE5PVExJTVdPUkRfQ09OU1RSQUlOVDsK KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5mb2xsb3dzW29sZC5p bmRleF0ubmVsZW07ICsraikKKyAgICAgICAgICB7CisgICAgICAgICAgICBwLmluZGV4ID0gZC0+ Zm9sbG93c1tvbGQuaW5kZXhdLmVsZW1zW2pdLmluZGV4OworICAgICAgICAgICAgaW5zZXJ0IChw LCBzKTsKKyAgICAgICAgICB9CisgICAgICAgIC8qIEZvcmNlIHJlc2NhbiB0byBzdGFydCBhdCB0 aGUgYmVnaW5uaW5nLiAgKi8KKyAgICAgICAgaSA9IC0xOworICAgICAgfQorfQorCisvKiBSZXR1 cm5zIHRoZSBzZXQgb2YgY29udGV4dHMgZm9yIHdoaWNoIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQor ICAgY2hhcmFjdGVyIGluY2x1ZGVkIGluIEMuICAqLworCitzdGF0aWMgaW50CitjaGFyY2xhc3Nf Y29udGV4dCAoY2hhcmNsYXNzIGMpCit7CisgIGludCBjb250ZXh0ID0gMDsKKyAgdW5zaWduZWQg aW50IGo7CisKKyAgaWYgKHRzdGJpdCAoZW9sYnl0ZSwgYykpCisgICAgY29udGV4dCB8PSBDVFhf TkVXTElORTsKKworICBmb3IgKGogPSAwOyBqIDwgQ0hBUkNMQVNTX1dPUkRTOyArK2opCisgICAg eworICAgICAgaWYgKGNbal0gJiBsZXR0ZXJzW2pdKQorICAgICAgICBjb250ZXh0IHw9IENUWF9M RVRURVI7CisgICAgICBpZiAoY1tqXSAmIH4obGV0dGVyc1tqXSB8IG5ld2xpbmVbal0pKQorICAg ICAgICBjb250ZXh0IHw9IENUWF9OT05FOworICAgIH0KKworICByZXR1cm4gY29udGV4dDsKK30K KworLyogUmV0dXJucyB0aGUgY29udGV4dHMgb24gd2hpY2ggdGhlIHBvc2l0aW9uIHNldCBTIGRl cGVuZHMuICBFYWNoIGNvbnRleHQKKyAgIGluIHRoZSBzZXQgb2YgcmV0dXJuZWQgY29udGV4dHMg KGxldCdzIGNhbGwgaXQgU0MpIG1heSBoYXZlIGEgZGlmZmVyZW50CisgICBmb2xsb3cgc2V0IHRo YW4gb3RoZXIgY29udGV4dHMgaW4gU0MsIGFuZCBhbHNvIGRpZmZlcmVudCBmcm9tIHRoZQorICAg Zm9sbG93IHNldCBvZiB0aGUgY29tcGxlbWVudCBzZXQgKHNjIF4gQ1RYX0FOWSkuICBIb3dldmVy LCBhbGwgY29udGV4dHMKKyAgIGluIHRoZSBjb21wbGVtZW50IHNldCB3aWxsIGhhdmUgdGhlIHNh bWUgZm9sbG93IHNldC4gICovCisKK3N0YXRpYyBpbnQgX0dMX0FUVFJJQlVURV9QVVJFCitzdGF0 ZV9zZXBhcmF0ZV9jb250ZXh0cyAocG9zaXRpb25fc2V0IGNvbnN0ICpzKQoreworICBpbnQgc2Vw YXJhdGVfY29udGV4dHMgPSAwOworICBzaXplX3QgajsKKworICBmb3IgKGogPSAwOyBqIDwgcy0+ bmVsZW07ICsraikKKyAgICB7CisgICAgICBpZiAoUFJFVl9ORVdMSU5FX0RFUEVOREVOVCAocy0+ ZWxlbXNbal0uY29uc3RyYWludCkpCisgICAgICAgIHNlcGFyYXRlX2NvbnRleHRzIHw9IENUWF9O RVdMSU5FOworICAgICAgaWYgKFBSRVZfTEVUVEVSX0RFUEVOREVOVCAocy0+ZWxlbXNbal0uY29u c3RyYWludCkpCisgICAgICAgIHNlcGFyYXRlX2NvbnRleHRzIHw9IENUWF9MRVRURVI7CisgICAg fQorCisgIHJldHVybiBzZXBhcmF0ZV9jb250ZXh0czsKK30KKworCisvKiBQZXJmb3JtIGJvdHRv bS11cCBhbmFseXNpcyBvbiB0aGUgcGFyc2UgdHJlZSwgY29tcHV0aW5nIHZhcmlvdXMgZnVuY3Rp b25zLgorICAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQsIHdlJ3JlIHByZXRlbmRpbmcgY29uc3Ry dWN0cyBsaWtlIFw8IGFyZSByZWFsCisgICBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIGNvbnN0cmFp bnRzIG9uIHdoYXQgY2FuIGZvbGxvdyB0aGVtLgorCisgICBOdWxsYWJsZTogIEEgbm9kZSBpcyBu dWxsYWJsZSBpZiBpdCBpcyBhdCB0aGUgcm9vdCBvZiBhIHJlZ2V4cCB0aGF0IGNhbgorICAgbWF0 Y2ggdGhlIGVtcHR5IHN0cmluZy4KKyAgICogIEVNUFRZIGxlYXZlcyBhcmUgbnVsbGFibGUuCisg ICAqIE5vIG90aGVyIGxlYWYgaXMgbnVsbGFibGUuCisgICAqIEEgUU1BUksgb3IgU1RBUiBub2Rl IGlzIG51bGxhYmxlLgorICAgKiBBIFBMVVMgbm9kZSBpcyBudWxsYWJsZSBpZiBpdHMgYXJndW1l bnQgaXMgbnVsbGFibGUuCisgICAqIEEgQ0FUIG5vZGUgaXMgbnVsbGFibGUgaWYgYm90aCBpdHMg YXJndW1lbnRzIGFyZSBudWxsYWJsZS4KKyAgICogQW4gT1Igbm9kZSBpcyBudWxsYWJsZSBpZiBl aXRoZXIgYXJndW1lbnQgaXMgbnVsbGFibGUuCisKKyAgIEZpcnN0cG9zOiAgVGhlIGZpcnN0cG9z IG9mIGEgbm9kZSBpcyB0aGUgc2V0IG9mIHBvc2l0aW9ucyAobm9uZW1wdHkgbGVhdmVzKQorICAg dGhhdCBjb3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcg bWF0Y2hpbmcgdGhlCisgICByZWdleHAgcm9vdGVkIGF0IHRoZSBnaXZlbiBub2RlLgorICAgKiBF TVBUWSBsZWF2ZXMgaGF2ZSBlbXB0eSBmaXJzdHBvcy4KKyAgICogVGhlIGZpcnN0cG9zIG9mIGEg bm9uZW1wdHkgbGVhZiBpcyB0aGF0IGxlYWYgaXRzZWxmLgorICAgKiBUaGUgZmlyc3Rwb3Mgb2Yg YSBRTUFSSywgU1RBUiwgb3IgUExVUyBub2RlIGlzIHRoZSBmaXJzdHBvcyBvZiBpdHMKKyAgICAg YXJndW1lbnQuCisgICAqIFRoZSBmaXJzdHBvcyBvZiBhIENBVCBub2RlIGlzIHRoZSBmaXJzdHBv cyBvZiB0aGUgbGVmdCBhcmd1bWVudCwgdW5pb24KKyAgICAgdGhlIGZpcnN0cG9zIG9mIHRoZSBy aWdodCBpZiB0aGUgbGVmdCBhcmd1bWVudCBpcyBudWxsYWJsZS4KKyAgICogVGhlIGZpcnN0cG9z IG9mIGFuIE9SIG5vZGUgaXMgdGhlIHVuaW9uIG9mIGZpcnN0cG9zIG9mIGVhY2ggYXJndW1lbnQu CisKKyAgIExhc3Rwb3M6ICBUaGUgbGFzdHBvcyBvZiBhIG5vZGUgaXMgdGhlIHNldCBvZiBwb3Np dGlvbnMgdGhhdCBjb3VsZAorICAgY29ycmVzcG9uZCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Yg YSBzdHJpbmcgbWF0Y2hpbmcgdGhlIHJlZ2V4cCBhdAorICAgdGhlIGdpdmVuIG5vZGUuCisgICAq IEVNUFRZIGxlYXZlcyBoYXZlIGVtcHR5IGxhc3Rwb3MuCisgICAqIFRoZSBsYXN0cG9zIG9mIGEg bm9uZW1wdHkgbGVhZiBpcyB0aGF0IGxlYWYgaXRzZWxmLgorICAgKiBUaGUgbGFzdHBvcyBvZiBh IFFNQVJLLCBTVEFSLCBvciBQTFVTIG5vZGUgaXMgdGhlIGxhc3Rwb3Mgb2YgaXRzCisgICAgIGFy Z3VtZW50LgorICAgKiBUaGUgbGFzdHBvcyBvZiBhIENBVCBub2RlIGlzIHRoZSBsYXN0cG9zIG9m IGl0cyByaWdodCBhcmd1bWVudCwgdW5pb24KKyAgICAgdGhlIGxhc3Rwb3Mgb2YgdGhlIGxlZnQg aWYgdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIG51bGxhYmxlLgorICAgKiBUaGUgbGFzdHBvcyBvZiBh biBPUiBub2RlIGlzIHRoZSB1bmlvbiBvZiB0aGUgbGFzdHBvcyBvZiBlYWNoIGFyZ3VtZW50Lgor CisgICBGb2xsb3c6ICBUaGUgZm9sbG93IG9mIGEgcG9zaXRpb24gaXMgdGhlIHNldCBvZiBwb3Np dGlvbnMgdGhhdCBjb3VsZAorICAgY29ycmVzcG9uZCB0byB0aGUgY2hhcmFjdGVyIGZvbGxvd2lu ZyBhIGNoYXJhY3RlciBtYXRjaGluZyB0aGUgbm9kZSBpbgorICAgYSBzdHJpbmcgbWF0Y2hpbmcg dGhlIHJlZ2V4cC4gIEF0IHRoaXMgcG9pbnQgd2UgY29uc2lkZXIgc3BlY2lhbCBzeW1ib2xzCisg ICB0aGF0IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcgaW4gc29tZSBjb250ZXh0IHRvIGJlIGp1c3Qg bm9ybWFsIGNoYXJhY3RlcnMuCisgICBMYXRlciwgaWYgd2UgZmluZCB0aGF0IGEgc3BlY2lhbCBz eW1ib2wgaXMgaW4gYSBmb2xsb3cgc2V0LCB3ZSB3aWxsCisgICByZXBsYWNlIGl0IHdpdGggdGhl IGVsZW1lbnRzIG9mIGl0cyBmb2xsb3csIGxhYmVsZWQgd2l0aCBhbiBhcHByb3ByaWF0ZQorICAg Y29uc3RyYWludC4KKyAgICogRXZlcnkgbm9kZSBpbiB0aGUgZmlyc3Rwb3Mgb2YgdGhlIGFyZ3Vt ZW50IG9mIGEgU1RBUiBvciBQTFVTIG5vZGUgaXMgaW4KKyAgICAgdGhlIGZvbGxvdyBvZiBldmVy eSBub2RlIGluIHRoZSBsYXN0cG9zLgorICAgKiBFdmVyeSBub2RlIGluIHRoZSBmaXJzdHBvcyBv ZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGEgQ0FUIG5vZGUgaXMgaW4KKyAgICAgdGhlIGZvbGxv dyBvZiBldmVyeSBub2RlIGluIHRoZSBsYXN0cG9zIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKwor ICAgQmVjYXVzZSBvZiB0aGUgcG9zdGZpeCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyc2UgdHJl ZSwgdGhlIGRlcHRoLWZpcnN0CisgICBhbmFseXNpcyBpcyBjb252ZW5pZW50bHkgZG9uZSBieSBh IGxpbmVhciBzY2FuIHdpdGggdGhlIGFpZCBvZiBhIHN0YWNrLgorICAgU2V0cyBhcmUgc3RvcmVk IGFzIGFycmF5cyBvZiB0aGUgZWxlbWVudHMsIG9iZXlpbmcgYSBzdGFjay1saWtlIGFsbG9jYXRp b24KKyAgIHNjaGVtZTsgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBlYWNoIHNldCBkZWVwZXIg aW4gdGhlIHN0YWNrIGNhbiBiZQorICAgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2Yg YSBwYXJ0aWN1bGFyIHNldCdzIGFycmF5LiAgKi8KK3N0YXRpYyB2b2lkCitkZmFhbmFseXplIChz dHJ1Y3QgZGZhICpkLCBib29sIHNlYXJjaGZsYWcpCit7CisgIC8qIEFycmF5IGFsbG9jYXRlZCB0 byBob2xkIHBvc2l0aW9uIHNldHMuICAqLworICBwb3NpdGlvbiAqcG9zYWxsb2MgPSB4bm1hbGxv YyAoZC0+bmxlYXZlcywgMiAqIHNpemVvZiAqcG9zYWxsb2MpOworICAvKiBGaXJzdHBvcyBhbmQg bGFzdHBvcyBlbGVtZW50cy4gICovCisgIHBvc2l0aW9uICpmaXJzdHBvcyA9IHBvc2FsbG9jICsg ZC0+bmxlYXZlczsKKyAgcG9zaXRpb24gKmxhc3Rwb3MgPSBmaXJzdHBvcyArIGQtPm5sZWF2ZXM7 CisKKyAgLyogU3RhY2sgZm9yIGVsZW1lbnQgY291bnRzIGFuZCBudWxsYWJsZSBmbGFncy4gICov CisgIHN0cnVjdAorICB7CisgICAgLyogV2hldGhlciB0aGUgZW50cnkgaXMgbnVsbGFibGUuICAq LworICAgIGJvb2wgbnVsbGFibGU7CisKKyAgICAvKiBDb3VudHMgb2YgZmlyc3Rwb3MgYW5kIGxh c3Rwb3Mgc2V0cy4gICovCisgICAgc2l6ZV90IG5maXJzdHBvczsKKyAgICBzaXplX3Qgbmxhc3Rw b3M7CisgIH0gKnN0a2FsbG9jID0geG5tYWxsb2MgKGQtPmRlcHRoLCBzaXplb2YgKnN0a2FsbG9j KSwgKnN0ayA9IHN0a2FsbG9jOworCisgIHBvc2l0aW9uX3NldCB0bXA7ICAgICAgICAgICAgIC8q IFRlbXBvcmFyeSBzZXQgZm9yIG1lcmdpbmcgc2V0cy4gICovCisgIHBvc2l0aW9uX3NldCBtZXJn ZWQ7ICAgICAgICAgIC8qIFJlc3VsdCBvZiBtZXJnaW5nIHNldHMuICAqLworICBpbnQgc2VwYXJh dGVfY29udGV4dHM7ICAgICAgICAvKiBDb250ZXh0IHdhbnRlZCBieSBzb21lIHBvc2l0aW9uLiAg Ki8KKyAgc2l6ZV90IGksIGo7CisgIHBvc2l0aW9uICpwb3M7CisgIGNoYXIgKnZpc2l0ZWQgPSB4 bm1hbGxvYyAoZC0+dGluZGV4LCBzaXplb2YgKnZpc2l0ZWQpOworCisjaWZkZWYgREVCVUcKKyAg ZnByaW50ZiAoc3RkZXJyLCAiZGZhYW5hbHl6ZTpcbiIpOworICBmb3IgKGkgPSAwOyBpIDwgZC0+ dGluZGV4OyArK2kpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBpKTsK KyAgICAgIHBydG9rIChkLT50b2tlbnNbaV0pOworICAgIH0KKyAgcHV0YyAoJ1xuJywgc3RkZXJy KTsKKyNlbmRpZgorCisgIGQtPnNlYXJjaGZsYWcgPSBzZWFyY2hmbGFnOworICBhbGxvY19wb3Np dGlvbl9zZXQgKCZtZXJnZWQsIGQtPm5sZWF2ZXMpOworICBkLT5mb2xsb3dzID0geGNhbGxvYyAo ZC0+dGluZGV4LCBzaXplb2YgKmQtPmZvbGxvd3MpOworCisgIGZvciAoaSA9IDA7IGkgPCBkLT50 aW5kZXg7ICsraSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGQtPnRva2Vuc1tpXSkKKyAgICAgICAg eworICAgICAgICBjYXNlIEVNUFRZOgorICAgICAgICAgIC8qIFRoZSBlbXB0eSBzZXQgaXMgbnVs bGFibGUuICAqLworICAgICAgICAgIHN0ay0+bnVsbGFibGUgPSB0cnVlOworCisgICAgICAgICAg LyogVGhlIGZpcnN0cG9zIGFuZCBsYXN0cG9zIG9mIHRoZSBlbXB0eSBsZWFmIGFyZSBib3RoIGVt cHR5LiAgKi8KKyAgICAgICAgICBzdGstPm5maXJzdHBvcyA9IHN0ay0+bmxhc3Rwb3MgPSAwOwor ICAgICAgICAgIHN0aysrOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBUjoK KyAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgIC8qIEV2ZXJ5IGVsZW1lbnQgaW4gdGhlIGZp cnN0cG9zIG9mIHRoZSBhcmd1bWVudCBpcyBpbiB0aGUgZm9sbG93CisgICAgICAgICAgICAgb2Yg ZXZlcnkgZWxlbWVudCBpbiB0aGUgbGFzdHBvcy4gICovCisgICAgICAgICAgdG1wLm5lbGVtID0g c3RrWy0xXS5uZmlyc3Rwb3M7CisgICAgICAgICAgdG1wLmVsZW1zID0gZmlyc3Rwb3M7CisgICAg ICAgICAgcG9zID0gbGFzdHBvczsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3RrWy0xXS5u bGFzdHBvczsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtZXJnZSAoJnRtcCwg JmQtPmZvbGxvd3NbcG9zW2pdLmluZGV4XSwgJm1lcmdlZCk7CisgICAgICAgICAgICAgIGNvcHkg KCZtZXJnZWQsICZkLT5mb2xsb3dzW3Bvc1tqXS5pbmRleF0pOworICAgICAgICAgICAgfQorICAg ICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisKKyAgICAgICAgY2FzZSBRTUFSSzoKKyAgICAgICAg ICAvKiBBIFFNQVJLIG9yIFNUQVIgbm9kZSBpcyBhdXRvbWF0aWNhbGx5IG51bGxhYmxlLiAgKi8K KyAgICAgICAgICBpZiAoZC0+dG9rZW5zW2ldICE9IFBMVVMpCisgICAgICAgICAgICBzdGtbLTFd Lm51bGxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENBVDoK KyAgICAgICAgICAvKiBFdmVyeSBlbGVtZW50IGluIHRoZSBmaXJzdHBvcyBvZiB0aGUgc2Vjb25k IGFyZ3VtZW50IGlzIGluIHRoZQorICAgICAgICAgICAgIGZvbGxvdyBvZiBldmVyeSBlbGVtZW50 IGluIHRoZSBsYXN0cG9zIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4gICovCisgICAgICAgICAgdG1w Lm5lbGVtID0gc3RrWy0xXS5uZmlyc3Rwb3M7CisgICAgICAgICAgdG1wLmVsZW1zID0gZmlyc3Rw b3M7CisgICAgICAgICAgcG9zID0gbGFzdHBvcyArIHN0a1stMV0ubmxhc3Rwb3M7CisgICAgICAg ICAgZm9yIChqID0gMDsgaiA8IHN0a1stMl0ubmxhc3Rwb3M7ICsraikKKyAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgbWVyZ2UgKCZ0bXAsICZkLT5mb2xsb3dzW3Bvc1tqXS5pbmRleF0sICZt ZXJnZWQpOworICAgICAgICAgICAgICBjb3B5ICgmbWVyZ2VkLCAmZC0+Zm9sbG93c1twb3Nbal0u aW5kZXhdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRoZSBmaXJzdHBvcyBvZiBh IENBVCBub2RlIGlzIHRoZSBmaXJzdHBvcyBvZiB0aGUgZmlyc3QgYXJndW1lbnQsCisgICAgICAg ICAgICAgdW5pb24gdGhhdCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIHRoZSBmaXJzdCBpcyBu dWxsYWJsZS4gICovCisgICAgICAgICAgaWYgKHN0a1stMl0ubnVsbGFibGUpCisgICAgICAgICAg ICBzdGtbLTJdLm5maXJzdHBvcyArPSBzdGtbLTFdLm5maXJzdHBvczsKKyAgICAgICAgICBlbHNl CisgICAgICAgICAgICBmaXJzdHBvcyArPSBzdGtbLTFdLm5maXJzdHBvczsKKworICAgICAgICAg IC8qIFRoZSBsYXN0cG9zIG9mIGEgQ0FUIG5vZGUgaXMgdGhlIGxhc3Rwb3Mgb2YgdGhlIHNlY29u ZCBhcmd1bWVudCwKKyAgICAgICAgICAgICB1bmlvbiB0aGF0IG9mIHRoZSBmaXJzdCBhcmd1bWVu dCBpZiB0aGUgc2Vjb25kIGlzIG51bGxhYmxlLiAgKi8KKyAgICAgICAgICBpZiAoc3RrWy0xXS5u dWxsYWJsZSkKKyAgICAgICAgICAgIHN0a1stMl0ubmxhc3Rwb3MgKz0gc3RrWy0xXS5ubGFzdHBv czsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBvcyA9IGxh c3Rwb3MgKyBzdGtbLTJdLm5sYXN0cG9zOworICAgICAgICAgICAgICBmb3IgKGogPSBzdGtbLTFd Lm5sYXN0cG9zOyBqLS0gPiAwOykKKyAgICAgICAgICAgICAgICBwb3Nbal0gPSBsYXN0cG9zW2pd OworICAgICAgICAgICAgICBsYXN0cG9zICs9IHN0a1stMl0ubmxhc3Rwb3M7CisgICAgICAgICAg ICAgIHN0a1stMl0ubmxhc3Rwb3MgPSBzdGtbLTFdLm5sYXN0cG9zOworICAgICAgICAgICAgfQor CisgICAgICAgICAgLyogQSBDQVQgbm9kZSBpcyBudWxsYWJsZSBpZiBib3RoIGFyZ3VtZW50cyBh cmUgbnVsbGFibGUuICAqLworICAgICAgICAgIHN0a1stMl0ubnVsbGFibGUgJj0gc3RrWy0xXS5u dWxsYWJsZTsKKyAgICAgICAgICBzdGstLTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBj YXNlIE9SOgorICAgICAgICAgIC8qIFRoZSBmaXJzdHBvcyBpcyB0aGUgdW5pb24gb2YgdGhlIGZp cnN0cG9zIG9mIGVhY2ggYXJndW1lbnQuICAqLworICAgICAgICAgIHN0a1stMl0ubmZpcnN0cG9z ICs9IHN0a1stMV0ubmZpcnN0cG9zOworCisgICAgICAgICAgLyogVGhlIGxhc3Rwb3MgaXMgdGhl IHVuaW9uIG9mIHRoZSBsYXN0cG9zIG9mIGVhY2ggYXJndW1lbnQuICAqLworICAgICAgICAgIHN0 a1stMl0ubmxhc3Rwb3MgKz0gc3RrWy0xXS5ubGFzdHBvczsKKworICAgICAgICAgIC8qIEFuIE9S IG5vZGUgaXMgbnVsbGFibGUgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIG51bGxhYmxlLiAgKi8KKyAg ICAgICAgICBzdGtbLTJdLm51bGxhYmxlIHw9IHN0a1stMV0ubnVsbGFibGU7CisgICAgICAgICAg c3RrLS07CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAv KiBBbnl0aGluZyBlbHNlIGlzIGEgbm9uZW1wdHkgcG9zaXRpb24uICAoTm90ZSB0aGF0IHNwZWNp YWwKKyAgICAgICAgICAgICBjb25zdHJ1Y3RzIGxpa2UgXDwgYXJlIHRyZWF0ZWQgYXMgbm9uZW1w dHkgc3RyaW5ncyBoZXJlOworICAgICAgICAgICAgIGFuICJlcHNpbG9uIGNsb3N1cmUiIGVmZmVj dGl2ZWx5IG1ha2VzIHRoZW0gbnVsbGFibGUgbGF0ZXIuCisgICAgICAgICAgICAgQmFja3JlZmVy ZW5jZXMgaGF2ZSB0byBnZXQgYSByZWFsIHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3QKKyAgICAg ICAgICAgICB0cmFuc2l0aW9ucyBvbiB0aGVtIGxhdGVyLiAgQnV0IHRoZXkgYXJlIG51bGxhYmxl LiAgKi8KKyAgICAgICAgICBzdGstPm51bGxhYmxlID0gZC0+dG9rZW5zW2ldID09IEJBQ0tSRUY7 CisKKyAgICAgICAgICAvKiBUaGlzIHBvc2l0aW9uIGlzIGluIGl0cyBvd24gZmlyc3Rwb3MgYW5k IGxhc3Rwb3MuICAqLworICAgICAgICAgIHN0ay0+bmZpcnN0cG9zID0gc3RrLT5ubGFzdHBvcyA9 IDE7CisgICAgICAgICAgc3RrKys7CisKKyAgICAgICAgICAtLWZpcnN0cG9zLCAtLWxhc3Rwb3M7 CisgICAgICAgICAgZmlyc3Rwb3MtPmluZGV4ID0gbGFzdHBvcy0+aW5kZXggPSBpOworICAgICAg ICAgIGZpcnN0cG9zLT5jb25zdHJhaW50ID0gbGFzdHBvcy0+Y29uc3RyYWludCA9IE5PX0NPTlNU UkFJTlQ7CisKKyAgICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgZm9sbG93IHNldCBmb3IgdGhpcyBw b3NpdGlvbi4gICovCisgICAgICAgICAgYWxsb2NfcG9zaXRpb25fc2V0ICgmZC0+Zm9sbG93c1tp XSwgMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAg LyogLi4uIGJhbGFuY2UgdGhlIGFib3ZlIG5vbnN5bnRhY3RpYyAjaWZkZWYgZ29vLi4uICAqLwor ICAgICAgZnByaW50ZiAoc3RkZXJyLCAibm9kZSAlenU6IiwgaSk7CisgICAgICBwcnRvayAoZC0+ dG9rZW5zW2ldKTsKKyAgICAgIHB1dGMgKCdcbicsIHN0ZGVycik7CisgICAgICBmcHJpbnRmIChz dGRlcnIsCisgICAgICAgICAgICAgICBzdGtbLTFdLm51bGxhYmxlID8gIiBudWxsYWJsZTogeWVz XG4iIDogIiBudWxsYWJsZTogbm9cbiIpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGZpcnN0 cG9zOiIpOworICAgICAgZm9yIChqID0gc3RrWy0xXS5uZmlyc3Rwb3M7IGotLSA+IDA7KQorICAg ICAgICB7CisgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICV6dToiLCBmaXJzdHBvc1tqXS5p bmRleCk7CisgICAgICAgICAgcHJ0b2sgKGQtPnRva2Vuc1tmaXJzdHBvc1tqXS5pbmRleF0pOwor ICAgICAgICB9CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiBsYXN0cG9zOiIpOworICAgICAg Zm9yIChqID0gc3RrWy0xXS5ubGFzdHBvczsgai0tID4gMDspCisgICAgICAgIHsKKyAgICAgICAg ICBmcHJpbnRmIChzdGRlcnIsICIgJXp1OiIsIGxhc3Rwb3Nbal0uaW5kZXgpOworICAgICAgICAg IHBydG9rIChkLT50b2tlbnNbbGFzdHBvc1tqXS5pbmRleF0pOworICAgICAgICB9CisgICAgICBw dXRjICgnXG4nLCBzdGRlcnIpOworI2VuZGlmCisgICAgfQorCisgIC8qIEZvciBlYWNoIGZvbGxv dyBzZXQgdGhhdCBpcyB0aGUgZm9sbG93IHNldCBvZiBhIHJlYWwgcG9zaXRpb24sIHJlcGxhY2UK KyAgICAgaXQgd2l0aCBpdHMgZXBzaWxvbiBjbG9zdXJlLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8 IGQtPnRpbmRleDsgKytpKQorICAgIGlmIChkLT50b2tlbnNbaV0gPCBOT1RDSEFSIHx8IGQtPnRv a2Vuc1tpXSA9PSBCQUNLUkVGCisgICAgICAgIHx8IGQtPnRva2Vuc1tpXSA9PSBBTllDSEFSIHx8 IGQtPnRva2Vuc1tpXSA9PSBNQkNTRVQKKyAgICAgICAgfHwgZC0+dG9rZW5zW2ldID49IENTRVQp CisgICAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9sbG93 cyglenU6IiwgaSk7CisgICAgICAgIHBydG9rIChkLT50b2tlbnNbaV0pOworICAgICAgICBmcHJp bnRmIChzdGRlcnIsICIpOiIpOworICAgICAgICBmb3IgKGogPSBkLT5mb2xsb3dzW2ldLm5lbGVt OyBqLS0gPiAwOykKKyAgICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIg JXp1OiIsIGQtPmZvbGxvd3NbaV0uZWxlbXNbal0uaW5kZXgpOworICAgICAgICAgICAgcHJ0b2sg KGQtPnRva2Vuc1tkLT5mb2xsb3dzW2ldLmVsZW1zW2pdLmluZGV4XSk7CisgICAgICAgICAgfQor ICAgICAgICBwdXRjICgnXG4nLCBzdGRlcnIpOworI2VuZGlmCisgICAgICAgIGNvcHkgKCZkLT5m b2xsb3dzW2ldLCAmbWVyZ2VkKTsKKyAgICAgICAgZXBzY2xvc3VyZSAoJm1lcmdlZCwgZCwgdmlz aXRlZCk7CisgICAgICAgIGNvcHkgKCZtZXJnZWQsICZkLT5mb2xsb3dzW2ldKTsKKyAgICAgIH0K KworICAvKiBHZXQgdGhlIGVwc2lsb24gY2xvc3VyZSBvZiB0aGUgZmlyc3Rwb3Mgb2YgdGhlIHJl Z2V4cC4gIFRoZSByZXN1bHQgd2lsbAorICAgICBiZSB0aGUgc2V0IG9mIHBvc2l0aW9ucyBvZiBz dGF0ZSAwLiAgKi8KKyAgbWVyZ2VkLm5lbGVtID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHN0a1st MV0ubmZpcnN0cG9zOyArK2kpCisgICAgaW5zZXJ0IChmaXJzdHBvc1tpXSwgJm1lcmdlZCk7Cisg IGVwc2Nsb3N1cmUgKCZtZXJnZWQsIGQsIHZpc2l0ZWQpOworCisgIC8qIEJ1aWxkIHRoZSBpbml0 aWFsIHN0YXRlLiAgKi8KKyAgc2VwYXJhdGVfY29udGV4dHMgPSBzdGF0ZV9zZXBhcmF0ZV9jb250 ZXh0cyAoJm1lcmdlZCk7CisgIGlmIChzZXBhcmF0ZV9jb250ZXh0cyAmIENUWF9ORVdMSU5FKQor ICAgIHN0YXRlX2luZGV4IChkLCAmbWVyZ2VkLCBDVFhfTkVXTElORSk7CisgIGQtPmluaXRzdGF0 ZV9ub3Rib2wgPSBkLT5taW5fdHJjb3VudAorICAgID0gc3RhdGVfaW5kZXggKGQsICZtZXJnZWQs IHNlcGFyYXRlX2NvbnRleHRzIF4gQ1RYX0FOWSk7CisgIGlmIChzZXBhcmF0ZV9jb250ZXh0cyAm IENUWF9MRVRURVIpCisgICAgZC0+bWluX3RyY291bnQgPSBzdGF0ZV9pbmRleCAoZCwgJm1lcmdl ZCwgQ1RYX0xFVFRFUik7CisgIGQtPm1pbl90cmNvdW50Kys7CisKKyAgZnJlZSAocG9zYWxsb2Mp OworICBmcmVlIChzdGthbGxvYyk7CisgIGZyZWUgKG1lcmdlZC5lbGVtcyk7CisgIGZyZWUgKHZp c2l0ZWQpOworfQorCisKKy8qIEZpbmQsIGZvciBlYWNoIGNoYXJhY3RlciwgdGhlIHRyYW5zaXRp b24gb3V0IG9mIHN0YXRlIHMgb2YgZCwgYW5kIHN0b3JlCisgICBpdCBpbiB0aGUgYXBwcm9wcmlh dGUgc2xvdCBvZiB0cmFucy4KKworICAgV2UgZGl2aWRlIHRoZSBwb3NpdGlvbnMgb2YgcyBpbnRv IGdyb3VwcyAocG9zaXRpb25zIGNhbiBhcHBlYXIgaW4gbW9yZQorICAgdGhhbiBvbmUgZ3JvdXAp LiAgRWFjaCBncm91cCBpcyBsYWJlbGVkIHdpdGggYSBzZXQgb2YgY2hhcmFjdGVycyB0aGF0Cisg ICBldmVyeSBwb3NpdGlvbiBpbiB0aGUgZ3JvdXAgbWF0Y2hlcyAodGFraW5nIGludG8gYWNjb3Vu dCwgaWYgbmVjZXNzYXJ5LAorICAgcHJlY2VkaW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcyku ICBGb3IgZWFjaCBncm91cCwgZmluZCB0aGUgdW5pb24KKyAgIG9mIHRoZSBpdHMgZWxlbWVudHMn IGZvbGxvd3MuICBUaGlzIHNldCBpcyB0aGUgc2V0IG9mIHBvc2l0aW9ucyBvZiB0aGUKKyAgIG5l dyBzdGF0ZS4gIEZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgZ3JvdXAncyBsYWJlbCwgc2V0IHRo ZSB0cmFuc2l0aW9uCisgICBvbiB0aGlzIGNoYXJhY3RlciB0byBiZSB0byBhIHN0YXRlIGNvcnJl c3BvbmRpbmcgdG8gdGhlIHNldCdzIHBvc2l0aW9ucywKKyAgIGFuZCBpdHMgYXNzb2NpYXRlZCBi YWNrd2FyZCBjb250ZXh0IGluZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuCisKKyAgIElmIHdlIGFy ZSBidWlsZGluZyBhIHNlYXJjaGluZyBtYXRjaGVyLCB3ZSBpbmNsdWRlIHRoZSBwb3NpdGlvbnMg b2Ygc3RhdGUKKyAgIDAgaW4gZXZlcnkgc3RhdGUuCisKKyAgIFRoZSBjb2xsZWN0aW9uIG9mIGdy b3VwcyBpcyBjb25zdHJ1Y3RlZCBieSBidWlsZGluZyBhbiBlcXVpdmFsZW5jZS1jbGFzcworICAg cGFydGl0aW9uIG9mIHRoZSBwb3NpdGlvbnMgb2Ygcy4KKworICAgRm9yIGVhY2ggcG9zaXRpb24s IGZpbmQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIEMgdGhhdCBpdCBtYXRjaGVzLiAgRWxpbWluYXRl CisgICBhbnkgY2hhcmFjdGVycyBmcm9tIEMgdGhhdCBmYWlsIG9uIGdyb3VuZHMgb2YgYmFja3dh cmQgY29udGV4dC4KKworICAgU2VhcmNoIHRocm91Z2ggdGhlIGdyb3VwcywgbG9va2luZyBmb3Ig YSBncm91cCB3aG9zZSBsYWJlbCBMIGhhcyBub25lbXB0eQorICAgaW50ZXJzZWN0aW9uIHdpdGgg Qy4gIElmIEwgLSBDIGlzIG5vbmVtcHR5LCBjcmVhdGUgYSBuZXcgZ3JvdXAgbGFiZWxlZAorICAg TCAtIEMgYW5kIGhhdmluZyB0aGUgc2FtZSBwb3NpdGlvbnMgYXMgdGhlIGN1cnJlbnQgZ3JvdXAs IGFuZCBzZXQgTCB0bworICAgdGhlIGludGVyc2VjdGlvbiBvZiBMIGFuZCBDLiAgSW5zZXJ0IHRo ZSBwb3NpdGlvbiBpbiB0aGlzIGdyb3VwLCBzZXQKKyAgIEMgPSBDIC0gTCwgYW5kIHJlc3VtZSBz Y2FubmluZy4KKworICAgSWYgYWZ0ZXIgY29tcGFyaW5nIHdpdGggZXZlcnkgZ3JvdXAgdGhlcmUg YXJlIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIEMsCisgICBjcmVhdGUgYSBuZXcgZ3JvdXAgbGFi ZWxlZCB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIEMgYW5kIGluc2VydCB0aGlzCisgICBwb3NpdGlv biBpbiB0aGF0IGdyb3VwLiAgKi8KK3N0YXRpYyB2b2lkCitkZmFzdGF0ZSAoc3RhdGVfbnVtIHMs IHN0cnVjdCBkZmEgKmQsIHN0YXRlX251bSB0cmFuc1tdKQoreworICBsZWFmX3NldCBncnBzW05P VENIQVJdOyAgICAgICAvKiBBcyBtYW55IGFzIHdpbGwgZXZlciBiZSBuZWVkZWQuICAqLworICBj aGFyY2xhc3MgbGFiZWxzW05PVENIQVJdOyAgICAvKiBMYWJlbHMgY29ycmVzcG9uZGluZyB0byB0 aGUgZ3JvdXBzLiAgKi8KKyAgc2l6ZV90IG5ncnBzID0gMDsgICAgICAgICAgICAgLyogTnVtYmVy IG9mIGdyb3VwcyBhY3R1YWxseSB1c2VkLiAgKi8KKyAgcG9zaXRpb24gcG9zOyAgICAgICAgICAg ICAgICAgLyogQ3VycmVudCBwb3NpdGlvbiBiZWluZyBjb25zaWRlcmVkLiAgKi8KKyAgY2hhcmNs YXNzIG1hdGNoZXM7ICAgICAgICAgICAgLyogU2V0IG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuICAq LworICBjaGFyY2xhc3Nfd29yZCBtYXRjaGVzZjsJLyogTm9uemVybyBpZiBtYXRjaGVzIGlzIG5v bmVtcHR5LiAgKi8KKyAgY2hhcmNsYXNzIGludGVyc2VjdDsgICAgICAgICAgLyogSW50ZXJzZWN0 aW9uIHdpdGggc29tZSBsYWJlbCBzZXQuICAqLworICBjaGFyY2xhc3Nfd29yZCBpbnRlcnNlY3Rm OwkvKiBOb256ZXJvIGlmIGludGVyc2VjdCBpcyBub25lbXB0eS4gICovCisgIGNoYXJjbGFzcyBs ZWZ0b3ZlcnM7ICAgICAgICAgIC8qIFN0dWZmIGluIHRoZSBsYWJlbCB0aGF0IGRpZG4ndCBtYXRj aC4gICovCisgIGNoYXJjbGFzc193b3JkIGxlZnRvdmVyc2Y7CS8qIE5vbnplcm8gaWYgbGVmdG92 ZXJzIGlzIG5vbmVtcHR5LiAgKi8KKyAgcG9zaXRpb25fc2V0IGZvbGxvd3M7ICAgICAgICAgLyog VW5pb24gb2YgdGhlIGZvbGxvd3Mgb2Ygc29tZSBncm91cC4gICovCisgIHBvc2l0aW9uX3NldCB0 bXA7ICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBzcGFjZSBmb3IgbWVyZ2luZyBzZXRzLiAgKi8K KyAgaW50IHBvc3NpYmxlX2NvbnRleHRzOyAgICAgICAgLyogQ29udGV4dHMgdGhhdCB0aGlzIGdy b3VwIGNhbiBtYXRjaC4gICovCisgIGludCBzZXBhcmF0ZV9jb250ZXh0czsgICAgICAgIC8qIENv bnRleHQgdGhhdCBuZXcgc3RhdGUgd2FudHMgdG8ga25vdy4gICovCisgIHN0YXRlX251bSBzdGF0 ZTsgICAgICAgICAgICAgIC8qIE5ldyBzdGF0ZS4gICovCisgIHN0YXRlX251bSBzdGF0ZV9uZXds aW5lOyAgICAgIC8qIE5ldyBzdGF0ZSBvbiBhIG5ld2xpbmUgdHJhbnNpdGlvbi4gICovCisgIHN0 YXRlX251bSBzdGF0ZV9sZXR0ZXI7ICAgICAgIC8qIE5ldyBzdGF0ZSBvbiBhIGxldHRlciB0cmFu c2l0aW9uLiAgKi8KKyAgYm9vbCBuZXh0X2lzbnRfMXN0X2J5dGUgPSBmYWxzZTsgLyogV2UgY2Fu J3QgYWRkIHN0YXRlMC4gICovCisgIHNpemVfdCBpLCBqLCBrOworCisjaWZkZWYgREVCVUcKKyAg ZnByaW50ZiAoc3RkZXJyLCAiYnVpbGQgc3RhdGUgJXRkXG4iLCBzKTsKKyNlbmRpZgorCisgIHpl cm9zZXQgKG1hdGNoZXMpOworCisgIGZvciAoaSA9IDA7IGkgPCBkLT5zdGF0ZXNbc10uZWxlbXMu bmVsZW07ICsraSkKKyAgICB7CisgICAgICBwb3MgPSBkLT5zdGF0ZXNbc10uZWxlbXMuZWxlbXNb aV07CisgICAgICBpZiAoZC0+dG9rZW5zW3Bvcy5pbmRleF0gPj0gMCAmJiBkLT50b2tlbnNbcG9z LmluZGV4XSA8IE5PVENIQVIpCisgICAgICAgIHNldGJpdCAoZC0+dG9rZW5zW3Bvcy5pbmRleF0s IG1hdGNoZXMpOworICAgICAgZWxzZSBpZiAoZC0+dG9rZW5zW3Bvcy5pbmRleF0gPj0gQ1NFVCkK KyAgICAgICAgY29weXNldCAoZC0+Y2hhcmNsYXNzZXNbZC0+dG9rZW5zW3Bvcy5pbmRleF0gLSBD U0VUXSwgbWF0Y2hlcyk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoZC0+ dG9rZW5zW3Bvcy5pbmRleF0gPT0gTUJDU0VUCisgICAgICAgICAgICAgIHx8IGQtPnRva2Vuc1tw b3MuaW5kZXhdID09IEFOWUNIQVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEFO WUNIQVIgYW5kIE1CQ1NFVCBtdXN0IG1hdGNoIHdpdGggYSBzaW5nbGUgY2hhcmFjdGVyLCBzbyB3 ZQorICAgICAgICAgICAgICAgICBtdXN0IHB1dCBpdCB0byBkLT5zdGF0ZXNbc10ubWJwcywgd2hp Y2ggY29udGFpbnMgdGhlIHBvc2l0aW9ucworICAgICAgICAgICAgICAgICB3aGljaCBjYW4gbWF0 Y2ggd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgbm90IGEgYnl0ZS4gICovCisgICAgICAgICAgICAg IGlmIChkLT5zdGF0ZXNbc10ubWJwcy5uZWxlbSA9PSAwKQorICAgICAgICAgICAgICAgIGFsbG9j X3Bvc2l0aW9uX3NldCAoJmQtPnN0YXRlc1tzXS5tYnBzLCAxKTsKKyAgICAgICAgICAgICAgaW5z ZXJ0IChwb3MsICYoZC0+c3RhdGVzW3NdLm1icHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg ICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAvKiBTb21lIGNoYXJhY3RlcnMgbWF5IG5l ZWQgdG8gYmUgZWxpbWluYXRlZCBmcm9tIG1hdGNoZXMgYmVjYXVzZQorICAgICAgICAgdGhleSBm YWlsIGluIHRoZSBjdXJyZW50IGNvbnRleHQuICAqLworICAgICAgaWYgKHBvcy5jb25zdHJhaW50 ICE9IE5PX0NPTlNUUkFJTlQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIVNVQ0NFRURTX0lO X0NPTlRFWFQgKHBvcy5jb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZC0+c3RhdGVzW3NdLmNvbnRleHQsIENUWF9ORVdMSU5FKSkKKyAgICAgICAgICAgIGZv ciAoaiA9IDA7IGogPCBDSEFSQ0xBU1NfV09SRFM7ICsraikKKyAgICAgICAgICAgICAgbWF0Y2hl c1tqXSAmPSB+bmV3bGluZVtqXTsKKyAgICAgICAgICBpZiAoIVNVQ0NFRURTX0lOX0NPTlRFWFQg KHBvcy5jb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ c3RhdGVzW3NdLmNvbnRleHQsIENUWF9MRVRURVIpKQorICAgICAgICAgICAgZm9yIChqID0gMDsg aiA8IENIQVJDTEFTU19XT1JEUzsgKytqKQorICAgICAgICAgICAgICBtYXRjaGVzW2pdICY9IH5s ZXR0ZXJzW2pdOworICAgICAgICAgIGlmICghU1VDQ0VFRFNfSU5fQ09OVEVYVCAocG9zLmNvbnN0 cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5zdGF0ZXNbc10u Y29udGV4dCwgQ1RYX05PTkUpKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENIQVJDTEFT U19XT1JEUzsgKytqKQorICAgICAgICAgICAgICBtYXRjaGVzW2pdICY9IGxldHRlcnNbal0gfCBu ZXdsaW5lW2pdOworCisgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgbGVm dCwgdGhlcmUncyBubyBwb2ludCBpbiBnb2luZyBvbi4gICovCisgICAgICAgICAgZm9yIChqID0g MDsgaiA8IENIQVJDTEFTU19XT1JEUyAmJiAhbWF0Y2hlc1tqXTsgKytqKQorICAgICAgICAgICAg Y29udGludWU7CisgICAgICAgICAgaWYgKGogPT0gQ0hBUkNMQVNTX1dPUkRTKQorICAgICAgICAg ICAgY29udGludWU7CisgICAgICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgICBmcHJpbnRmIChz dGRlcnIsICIgbmV4dHBvcyAlenU6IiwgcG9zLmluZGV4KTsKKyAgICAgIHBydG9rIChkLT50b2tl bnNbcG9zLmluZGV4XSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIgb2YiKTsKKyAgICAgIGZv ciAoaiA9IDA7IGogPCBOT1RDSEFSOyBqKyspCisgICAgICAgIGlmICh0c3RiaXQgKGosIG1hdGNo ZXMpKQorICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAweCUwMnp4Iiwgaik7CisgICAgICBm cHJpbnRmIChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBu Z3JwczsgKytqKQorICAgICAgICB7CisgICAgICAgICAgLyogSWYgbWF0Y2hlcyBjb250YWlucyBh IHNpbmdsZSBjaGFyYWN0ZXIgb25seSwgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgZ3Jv dXAncyBsYWJlbCBkb2Vzbid0IGNvbnRhaW4gdGhhdCBjaGFyYWN0ZXIsIGdvIG9uIHRvIHRoZQor ICAgICAgICAgICAgIG5leHQgZ3JvdXAuICAqLworICAgICAgICAgIGlmIChkLT50b2tlbnNbcG9z LmluZGV4XSA+PSAwICYmIGQtPnRva2Vuc1twb3MuaW5kZXhdIDwgTk9UQ0hBUgorICAgICAgICAg ICAgICAmJiAhdHN0Yml0IChkLT50b2tlbnNbcG9zLmluZGV4XSwgbGFiZWxzW2pdKSkKKyAgICAg ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBncm91cCdzIGxh YmVsIGhhcyBhIG5vbmVtcHR5IGludGVyc2VjdGlvbiB3aXRoCisgICAgICAgICAgICAgbWF0Y2hl cy4gICovCisgICAgICAgICAgaW50ZXJzZWN0ZiA9IDA7CisgICAgICAgICAgZm9yIChrID0gMDsg ayA8IENIQVJDTEFTU19XT1JEUzsgKytrKQorICAgICAgICAgICAgaW50ZXJzZWN0ZiB8PSBpbnRl cnNlY3Rba10gPSBtYXRjaGVzW2tdICYgbGFiZWxzW2pdW2tdOworICAgICAgICAgIGlmICghaW50 ZXJzZWN0ZikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLyogSXQgZG9lczsg bm93IGZpbmQgdGhlIHNldCBkaWZmZXJlbmNlcyBib3RoIHdheXMuICAqLworICAgICAgICAgIGxl ZnRvdmVyc2YgPSBtYXRjaGVzZiA9IDA7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IENIQVJD TEFTU19XT1JEUzsgKytrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBFdmVuIGFu IG9wdGltaXppbmcgY29tcGlsZXIgY2FuJ3Qga25vdyB0aGlzIGZvciBzdXJlLiAgKi8KKyAgICAg ICAgICAgICAgY2hhcmNsYXNzX3dvcmQgbWF0Y2ggPSBtYXRjaGVzW2tdLCBsYWJlbCA9IGxhYmVs c1tqXVtrXTsKKworICAgICAgICAgICAgICBsZWZ0b3ZlcnNmIHw9IGxlZnRvdmVyc1trXSA9IH5t YXRjaCAmIGxhYmVsOworICAgICAgICAgICAgICBtYXRjaGVzZiB8PSBtYXRjaGVzW2tdID0gbWF0 Y2ggJiB+bGFiZWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBJZiB0aGVyZSB3ZXJl IGxlZnRvdmVycywgY3JlYXRlIGEgbmV3IGdyb3VwIGxhYmVsZWQgd2l0aCB0aGVtLiAgKi8KKyAg ICAgICAgICBpZiAobGVmdG92ZXJzZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29w eXNldCAobGVmdG92ZXJzLCBsYWJlbHNbbmdycHNdKTsKKyAgICAgICAgICAgICAgY29weXNldCAo aW50ZXJzZWN0LCBsYWJlbHNbal0pOworICAgICAgICAgICAgICBncnBzW25ncnBzXS5lbGVtcyA9 IHhubWFsbG9jIChkLT5ubGVhdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzaXplb2YgKmdycHNbbmdycHNdLmVsZW1zKTsKKyAgICAgICAgICAgICAgbWVt Y3B5IChncnBzW25ncnBzXS5lbGVtcywgZ3Jwc1tqXS5lbGVtcywKKyAgICAgICAgICAgICAgICAg ICAgICBzaXplb2YgKGdycHNbal0uZWxlbXNbMF0pICogZ3Jwc1tqXS5uZWxlbSk7CisgICAgICAg ICAgICAgIGdycHNbbmdycHNdLm5lbGVtID0gZ3Jwc1tqXS5uZWxlbTsKKyAgICAgICAgICAgICAg KytuZ3JwczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFB1dCB0aGUgcG9zaXRpb24g aW4gdGhlIGN1cnJlbnQgZ3JvdXAuICBUaGUgY29uc3RyYWludCBpcworICAgICAgICAgICAgIGly cmVsZXZhbnQgaGVyZS4gICovCisgICAgICAgICAgZ3Jwc1tqXS5lbGVtc1tncnBzW2pdLm5lbGVt KytdID0gcG9zLmluZGV4OworCisgICAgICAgICAgLyogSWYgZXZlcnkgY2hhcmFjdGVyIG1hdGNo aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIGhhcyBiZWVuCisgICAgICAgICAgICAgYWNjb3VudGVk IGZvciwgd2UncmUgZG9uZS4gICovCisgICAgICAgICAgaWYgKCFtYXRjaGVzZikKKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIC8qIElmIHdlJ3ZlIHBhc3NlZCB0aGUgbGFz dCBncm91cCwgYW5kIHRoZXJlIGFyZSBzdGlsbCBjaGFyYWN0ZXJzCisgICAgICAgICB1bmFjY291 bnRlZCBmb3IsIHRoZW4gd2UnbGwgaGF2ZSB0byBjcmVhdGUgYSBuZXcgZ3JvdXAuICAqLworICAg ICAgaWYgKGogPT0gbmdycHMpCisgICAgICAgIHsKKyAgICAgICAgICBjb3B5c2V0IChtYXRjaGVz LCBsYWJlbHNbbmdycHNdKTsKKyAgICAgICAgICB6ZXJvc2V0IChtYXRjaGVzKTsKKyAgICAgICAg ICBncnBzW25ncnBzXS5lbGVtcyA9IHhubWFsbG9jIChkLT5ubGVhdmVzLCBzaXplb2YgKmdycHNb bmdycHNdLmVsZW1zKTsKKyAgICAgICAgICBncnBzW25ncnBzXS5uZWxlbSA9IDE7CisgICAgICAg ICAgZ3Jwc1tuZ3Jwc10uZWxlbXNbMF0gPSBwb3MuaW5kZXg7CisgICAgICAgICAgKytuZ3JwczsK KyAgICAgICAgfQorICAgIH0KKworICBhbGxvY19wb3NpdGlvbl9zZXQgKCZmb2xsb3dzLCBkLT5u bGVhdmVzKTsKKyAgYWxsb2NfcG9zaXRpb25fc2V0ICgmdG1wLCBkLT5ubGVhdmVzKTsKKworICAv KiBJZiB3ZSBhcmUgYSBzZWFyY2hpbmcgbWF0Y2hlciwgdGhlIGRlZmF1bHQgdHJhbnNpdGlvbiBp cyB0byBhIHN0YXRlCisgICAgIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9ucyBvZiBzdGF0ZSAwLCBv dGhlcndpc2UgdGhlIGRlZmF1bHQgdHJhbnNpdGlvbgorICAgICBpcyB0byBmYWlsIG1pc2VyYWJs eS4gICovCisgIGlmIChkLT5zZWFyY2hmbGFnKQorICAgIHsKKyAgICAgIC8qIEZpbmQgdGhlIHN0 YXRlKHMpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvc2l0aW9ucyBvZiBzdGF0ZSAwLiAgKi8KKyAg ICAgIGNvcHkgKCZkLT5zdGF0ZXNbMF0uZWxlbXMsICZmb2xsb3dzKTsKKyAgICAgIHNlcGFyYXRl X2NvbnRleHRzID0gc3RhdGVfc2VwYXJhdGVfY29udGV4dHMgKCZmb2xsb3dzKTsKKyAgICAgIHN0 YXRlID0gc3RhdGVfaW5kZXggKGQsICZmb2xsb3dzLCBzZXBhcmF0ZV9jb250ZXh0cyBeIENUWF9B TlkpOworICAgICAgaWYgKHNlcGFyYXRlX2NvbnRleHRzICYgQ1RYX05FV0xJTkUpCisgICAgICAg IHN0YXRlX25ld2xpbmUgPSBzdGF0ZV9pbmRleCAoZCwgJmZvbGxvd3MsIENUWF9ORVdMSU5FKTsK KyAgICAgIGVsc2UKKyAgICAgICAgc3RhdGVfbmV3bGluZSA9IHN0YXRlOworICAgICAgaWYgKHNl cGFyYXRlX2NvbnRleHRzICYgQ1RYX0xFVFRFUikKKyAgICAgICAgc3RhdGVfbGV0dGVyID0gc3Rh dGVfaW5kZXggKGQsICZmb2xsb3dzLCBDVFhfTEVUVEVSKTsKKyAgICAgIGVsc2UKKyAgICAgICAg c3RhdGVfbGV0dGVyID0gc3RhdGU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOT1RDSEFSOyAr K2kpCisgICAgICAgIHRyYW5zW2ldID0gdW5pYnl0ZV93b3JkX2NvbnN0aXR1ZW50IChpKSA/IHN0 YXRlX2xldHRlciA6IHN0YXRlOworICAgICAgdHJhbnNbZW9sYnl0ZV0gPSBzdGF0ZV9uZXdsaW5l OworICAgIH0KKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBOT1RDSEFSOyArK2kpCisgICAg ICB0cmFuc1tpXSA9IC0xOworCisgIGZvciAoaSA9IDA7IGkgPCBuZ3JwczsgKytpKQorICAgIHsK KyAgICAgIGZvbGxvd3MubmVsZW0gPSAwOworCisgICAgICAvKiBGaW5kIHRoZSB1bmlvbiBvZiB0 aGUgZm9sbG93cyBvZiB0aGUgcG9zaXRpb25zIG9mIHRoZSBncm91cC4KKyAgICAgICAgIFRoaXMg aXMgYSBoaWRlb3VzbHkgaW5lZmZpY2llbnQgbG9vcC4gIEZpeCBpdCBzb21lZGF5LiAgKi8KKyAg ICAgIGZvciAoaiA9IDA7IGogPCBncnBzW2ldLm5lbGVtOyArK2opCisgICAgICAgIGZvciAoayA9 IDA7IGsgPCBkLT5mb2xsb3dzW2dycHNbaV0uZWxlbXNbal1dLm5lbGVtOyArK2spCisgICAgICAg ICAgaW5zZXJ0IChkLT5mb2xsb3dzW2dycHNbaV0uZWxlbXNbal1dLmVsZW1zW2tdLCAmZm9sbG93 cyk7CisKKyAgICAgIGlmIChkLT5tdWx0aWJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJ ZiBhIHRva2VuIGluIGZvbGxvd3MuZWxlbXMgaXMgbm90IDFzdCBieXRlIG9mIGEgbXVsdGlieXRl CisgICAgICAgICAgICAgY2hhcmFjdGVyLCBvciB0aGUgc3RhdGVzIG9mIGZvbGxvd3MgbXVzdCBh Y2NlcHQgdGhlIGJ5dGVzCisgICAgICAgICAgICAgd2hpY2ggYXJlIG5vdCAxc3QgYnl0ZSBvZiB0 aGUgbXVsdGlieXRlIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICBUaGVuLCBpZiBhIHN0YXRlIG9m IGZvbGxvd3MgZW5jb3VudGVyIGEgYnl0ZSwgaXQgbXVzdCBub3QgYmUKKyAgICAgICAgICAgICBh IDFzdCBieXRlIG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciBub3Igc2luZ2xlIGJ5dGUgY2hhcmFj dGVyLgorICAgICAgICAgICAgIFdlIGNhbnNlbCB0byBhZGQgc3RhdGVbMF0uZm9sbG93cyB0byBu ZXh0IHN0YXRlLCBiZWNhdXNlCisgICAgICAgICAgICAgc3RhdGVbMF0gbXVzdCBhY2NlcHQgMXN0 LWJ5dGUKKworICAgICAgICAgICAgIEZvciBleGFtcGxlLCB3ZSBhc3N1bWUgPHNiIGE+IGlzIGEg Y2VydGFpbiBzaW5nbGUgYnl0ZQorICAgICAgICAgICAgIGNoYXJhY3RlciwgPG1iIEE+IGlzIGEg Y2VydGFpbiBtdWx0aWJ5dGUgY2hhcmFjdGVyLCBhbmQgdGhlCisgICAgICAgICAgICAgY29kZXBv aW50IG9mIDxzYiBhPiBlcXVhbHMgdGhlIDJuZCBieXRlIG9mIHRoZSBjb2RlcG9pbnQgb2YKKyAg ICAgICAgICAgICA8bWIgQT4uCisgICAgICAgICAgICAgV2hlbiBzdGF0ZVswXSBhY2NlcHRzIDxz YiBhPiwgc3RhdGVbaV0gdHJhbnNpdCB0byBzdGF0ZVtpKzFdCisgICAgICAgICAgICAgYnkgYWNj ZXB0aW5nIGFjY2VwdHMgMXN0IGJ5dGUgb2YgPG1iIEE+LCBhbmQgc3RhdGVbaSsxXQorICAgICAg ICAgICAgIGFjY2VwdHMgMm5kIGJ5dGUgb2YgPG1iIEE+LCBpZiBzdGF0ZVtpKzFdIGVuY291bnRl ciB0aGUKKyAgICAgICAgICAgICBjb2RlcG9pbnQgb2YgPHNiIGE+LCBpdCBtdXN0IG5vdCBiZSA8 c2IgYT4gYnV0IDJuZCBieXRlIG9mCisgICAgICAgICAgICAgPG1iIEE+LCBzbyB3ZSBjYW5ub3Qg YWRkIHN0YXRlWzBdLiAgKi8KKworICAgICAgICAgIG5leHRfaXNudF8xc3RfYnl0ZSA9IGZhbHNl OworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmb2xsb3dzLm5lbGVtOyArK2opCisgICAgICAg ICAgICB7CisgICAgICAgICAgICAgIGlmICghKGQtPm11bHRpYnl0ZV9wcm9wW2ZvbGxvd3MuZWxl bXNbal0uaW5kZXhdICYgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAg bmV4dF9pc250XzFzdF9ieXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiBJZiB3 ZSBhcmUgYnVpbGRpbmcgYSBzZWFyY2hpbmcgbWF0Y2hlciwgdGhyb3cgaW4gdGhlIHBvc2l0aW9u cworICAgICAgICAgb2Ygc3RhdGUgMCBhcyB3ZWxsLiAgKi8KKyAgICAgIGlmIChkLT5zZWFyY2hm bGFnICYmICghZC0+bXVsdGlieXRlIHx8ICFuZXh0X2lzbnRfMXN0X2J5dGUpKQorICAgICAgICB7 CisgICAgICAgICAgbWVyZ2UgKCZkLT5zdGF0ZXNbMF0uZWxlbXMsICZmb2xsb3dzLCAmdG1wKTsK KyAgICAgICAgICBjb3B5ICgmdG1wLCAmZm9sbG93cyk7CisgICAgICAgIH0KKworICAgICAgLyog RmluZCBvdXQgaWYgdGhlIG5ldyBzdGF0ZSB3aWxsIHdhbnQgYW55IGNvbnRleHQgaW5mb3JtYXRp b24uICAqLworICAgICAgcG9zc2libGVfY29udGV4dHMgPSBjaGFyY2xhc3NfY29udGV4dCAobGFi ZWxzW2ldKTsKKyAgICAgIHNlcGFyYXRlX2NvbnRleHRzID0gc3RhdGVfc2VwYXJhdGVfY29udGV4 dHMgKCZmb2xsb3dzKTsKKworICAgICAgLyogRmluZCB0aGUgc3RhdGUocykgY29ycmVzcG9uZGlu ZyB0byB0aGUgdW5pb24gb2YgdGhlIGZvbGxvd3MuICAqLworICAgICAgaWYgKChzZXBhcmF0ZV9j b250ZXh0cyAmIHBvc3NpYmxlX2NvbnRleHRzKSAhPSBwb3NzaWJsZV9jb250ZXh0cykKKyAgICAg ICAgc3RhdGUgPSBzdGF0ZV9pbmRleCAoZCwgJmZvbGxvd3MsIHNlcGFyYXRlX2NvbnRleHRzIF4g Q1RYX0FOWSk7CisgICAgICBlbHNlCisgICAgICAgIHN0YXRlID0gLTE7CisgICAgICBpZiAoc2Vw YXJhdGVfY29udGV4dHMgJiBwb3NzaWJsZV9jb250ZXh0cyAmIENUWF9ORVdMSU5FKQorICAgICAg ICBzdGF0ZV9uZXdsaW5lID0gc3RhdGVfaW5kZXggKGQsICZmb2xsb3dzLCBDVFhfTkVXTElORSk7 CisgICAgICBlbHNlCisgICAgICAgIHN0YXRlX25ld2xpbmUgPSBzdGF0ZTsKKyAgICAgIGlmIChz ZXBhcmF0ZV9jb250ZXh0cyAmIHBvc3NpYmxlX2NvbnRleHRzICYgQ1RYX0xFVFRFUikKKyAgICAg ICAgc3RhdGVfbGV0dGVyID0gc3RhdGVfaW5kZXggKGQsICZmb2xsb3dzLCBDVFhfTEVUVEVSKTsK KyAgICAgIGVsc2UKKyAgICAgICAgc3RhdGVfbGV0dGVyID0gc3RhdGU7CisKKyNpZmRlZiBERUJV RworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZ3JvdXAgJXp1XG4gbmV4dHBvczoiLCBpKTsKKyAg ICAgIGZvciAoaiA9IDA7IGogPCBncnBzW2ldLm5lbGVtOyArK2opCisgICAgICAgIHsKKyAgICAg ICAgICBmcHJpbnRmIChzdGRlcnIsICIgJXp1OiIsIGdycHNbaV0uZWxlbXNbal0pOworICAgICAg ICAgIHBydG9rIChkLT50b2tlbnNbZ3Jwc1tpXS5lbGVtc1tqXV0pOworICAgICAgICB9CisgICAg ICBmcHJpbnRmIChzdGRlcnIsICJcbiBmb2xsb3dzOiIpOworICAgICAgZm9yIChqID0gMDsgaiA8 IGZvbGxvd3MubmVsZW07ICsraikKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVy ciwgIiAlenU6IiwgZm9sbG93cy5lbGVtc1tqXS5pbmRleCk7CisgICAgICAgICAgcHJ0b2sgKGQt PnRva2Vuc1tmb2xsb3dzLmVsZW1zW2pdLmluZGV4XSk7CisgICAgICAgIH0KKyAgICAgIGZwcmlu dGYgKHN0ZGVyciwgIlxuIHN0YXRlczoiKTsKKyAgICAgIGlmIChwb3NzaWJsZV9jb250ZXh0cyAm IENUWF9ORVdMSU5FKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RYX05FV0xJTkU6JXRk Iiwgc3RhdGVfbmV3bGluZSk7CisgICAgICBpZiAocG9zc2libGVfY29udGV4dHMgJiBDVFhfTEVU VEVSKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgQ1RYX0xFVFRFUjoldGQiLCBzdGF0ZV9s ZXR0ZXIpOworICAgICAgaWYgKHBvc3NpYmxlX2NvbnRleHRzICYgQ1RYX05PTkUpCisgICAgICAg IGZwcmludGYgKHN0ZGVyciwgIiBDVFhfTk9ORToldGQiLCBzdGF0ZSk7CisgICAgICBmcHJpbnRm IChzdGRlcnIsICJcbiIpOworI2VuZGlmCisKKyAgICAgIC8qIFNldCB0aGUgdHJhbnNpdGlvbnMg Zm9yIGVhY2ggY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IGxhYmVsLiAgKi8KKyAgICAgIGZvciAo aiA9IDA7IGogPCBDSEFSQ0xBU1NfV09SRFM7ICsraikKKyAgICAgICAgZm9yIChrID0gMDsgayA8 IENIQVJDTEFTU19XT1JEX0JJVFM7ICsraykKKyAgICAgICAgICBpZiAobGFiZWxzW2ldW2pdID4+ IGsgJiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpbnQgYyA9IGogKiBDSEFSQ0xB U1NfV09SRF9CSVRTICsgazsKKworICAgICAgICAgICAgICBpZiAoYyA9PSBlb2xieXRlKQorICAg ICAgICAgICAgICAgIHRyYW5zW2NdID0gc3RhdGVfbmV3bGluZTsKKyAgICAgICAgICAgICAgZWxz ZSBpZiAodW5pYnl0ZV93b3JkX2NvbnN0aXR1ZW50IChjKSkKKyAgICAgICAgICAgICAgICB0cmFu c1tjXSA9IHN0YXRlX2xldHRlcjsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8IE5PVENIQVIp CisgICAgICAgICAgICAgICAgdHJhbnNbY10gPSBzdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICB9 CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJ0cmFucyB0YWJsZSAldGQiLCBz KTsKKyAgZm9yIChpID0gMDsgaSA8IE5PVENIQVI7ICsraSkKKyAgICB7CisgICAgICBpZiAoIShp ICYgMHhmKSkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGZwcmludGYg KHN0ZGVyciwgIiAlMnRkIiwgdHJhbnNbaV0pOworICAgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCAi XG4iKTsKKyNlbmRpZgorCisgIGZvciAoaSA9IDA7IGkgPCBuZ3JwczsgKytpKQorICAgIGZyZWUg KGdycHNbaV0uZWxlbXMpOworICBmcmVlIChmb2xsb3dzLmVsZW1zKTsKKyAgZnJlZSAodG1wLmVs ZW1zKTsKK30KKworLyogTWFrZSBzdXJlIEQncyBzdGF0ZSBhcnJheXMgYXJlIGxhcmdlIGVub3Vn aCB0byBob2xkIE5FV19TVEFURS4gICovCitzdGF0aWMgdm9pZAorcmVhbGxvY190cmFuc19pZl9u ZWNlc3NhcnkgKHN0cnVjdCBkZmEgKmQsIHN0YXRlX251bSBuZXdfc3RhdGUpCit7CisgIHN0YXRl X251bSBvbGRhbGxvYyA9IGQtPnRyYWxsb2M7CisgIGlmIChvbGRhbGxvYyA8PSBuZXdfc3RhdGUp CisgICAgeworICAgICAgc3RhdGVfbnVtICoqcmVhbHRyYW5zID0gZC0+dHJhbnMgPyBkLT50cmFu cyAtIDEgOiBOVUxMOworICAgICAgc2l6ZV90IG5ld2FsbG9jLCBuZXdhbGxvYzE7CisgICAgICBu ZXdhbGxvYzEgPSBuZXdfc3RhdGUgKyAxOworICAgICAgcmVhbHRyYW5zID0geDJucmVhbGxvYyAo cmVhbHRyYW5zLCAmbmV3YWxsb2MxLCBzaXplb2YgKnJlYWx0cmFucyk7CisgICAgICByZWFsdHJh bnNbMF0gPSBOVUxMOworICAgICAgZC0+dHJhbnMgPSByZWFsdHJhbnMgKyAxOworICAgICAgZC0+ dHJhbGxvYyA9IG5ld2FsbG9jID0gbmV3YWxsb2MxIC0gMTsKKyAgICAgIGQtPmZhaWxzID0geG5y ZWFsbG9jIChkLT5mYWlscywgbmV3YWxsb2MsIHNpemVvZiAqZC0+ZmFpbHMpOworICAgICAgZC0+ c3VjY2VzcyA9IHhucmVhbGxvYyAoZC0+c3VjY2VzcywgbmV3YWxsb2MsIHNpemVvZiAqZC0+c3Vj Y2Vzcyk7CisgICAgICBkLT5uZXdsaW5lcyA9IHhucmVhbGxvYyAoZC0+bmV3bGluZXMsIG5ld2Fs bG9jLCBzaXplb2YgKmQtPm5ld2xpbmVzKTsKKyAgICAgIGZvciAoOyBvbGRhbGxvYyA8IG5ld2Fs bG9jOyBvbGRhbGxvYysrKQorICAgICAgICB7CisgICAgICAgICAgZC0+dHJhbnNbb2xkYWxsb2Nd ID0gTlVMTDsKKyAgICAgICAgICBkLT5mYWlsc1tvbGRhbGxvY10gPSBOVUxMOworICAgICAgICB9 CisgICAgfQorfQorCisvKiBTb21lIHJvdXRpbmVzIGZvciBtYW5pcHVsYXRpbmcgYSBjb21waWxl ZCBkZmEncyB0cmFuc2l0aW9uIHRhYmxlcy4KKyAgIEVhY2ggc3RhdGUgbWF5IG9yIG1heSBub3Qg aGF2ZSBhIHRyYW5zaXRpb24gdGFibGU7IGlmIGl0IGRvZXMsIGFuZCBpdAorICAgaXMgYSBub24t YWNjZXB0aW5nIHN0YXRlLCB0aGVuIGQtPnRyYW5zW3N0YXRlXSBwb2ludHMgdG8gaXRzIHRhYmxl LgorICAgSWYgaXQgaXMgYW4gYWNjZXB0aW5nIHN0YXRlIHRoZW4gZC0+ZmFpbHNbc3RhdGVdIHBv aW50cyB0byBpdHMgdGFibGUuCisgICBJZiBpdCBoYXMgbm8gdGFibGUgYXQgYWxsLCB0aGVuIGQt PnRyYW5zW3N0YXRlXSBpcyBOVUxMLgorICAgVE9ETzogSW1wcm92ZSB0aGlzIGNvbW1lbnQsIGdl dCByaWQgb2YgdGhlIHVubmVjZXNzYXJ5IHJlZHVuZGFuY3kuICAqLworCitzdGF0aWMgdm9pZAor YnVpbGRfc3RhdGUgKHN0YXRlX251bSBzLCBzdHJ1Y3QgZGZhICpkKQoreworICBzdGF0ZV9udW0g KnRyYW5zOyAgICAgICAgICAgICAvKiBUaGUgbmV3IHRyYW5zaXRpb24gdGFibGUuICAqLworICBz dGF0ZV9udW0gaSwgbWF4c3RhdGU7CisKKyAgLyogU2V0IGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBu dW1iZXIgb2YgdHJhbnNpdGlvbiB0YWJsZXMgdGhhdCB3aWxsIGV2ZXIKKyAgICAgZXhpc3QgYXQg b25jZS4gIDEwMjQgaXMgYXJiaXRyYXJ5LiAgVGhlIGlkZWEgaXMgdGhhdCB0aGUgZnJlcXVlbnRs eQorICAgICB1c2VkIHRyYW5zaXRpb24gdGFibGVzIHdpbGwgYmUgcXVpY2tseSByZWJ1aWx0LCB3 aGVyZWFzIHRoZSBvbmVzIHRoYXQKKyAgICAgd2VyZSBvbmx5IG5lZWRlZCBvbmNlIG9yIHR3aWNl IHdpbGwgYmUgY2xlYXJlZCBhd2F5LiAgSG93ZXZlciwgZG8gbm90CisgICAgIGNsZWFyIHRoZSBp bml0aWFsIEQtPm1pbl90cmNvdW50IHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWx3YXlzIHVzZWQu ICAqLworICBpZiAoZC0+dHJjb3VudCA+PSAxMDI0KQorICAgIHsKKyAgICAgIGZvciAoaSA9IGQt Pm1pbl90cmNvdW50OyBpIDwgZC0+dHJhbGxvYzsgKytpKQorICAgICAgICB7CisgICAgICAgICAg ZnJlZSAoZC0+dHJhbnNbaV0pOworICAgICAgICAgIGZyZWUgKGQtPmZhaWxzW2ldKTsKKyAgICAg ICAgICBkLT50cmFuc1tpXSA9IGQtPmZhaWxzW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgICAg ZC0+dHJjb3VudCA9IGQtPm1pbl90cmNvdW50OworICAgIH0KKworICArK2QtPnRyY291bnQ7CisK KyAgLyogU2V0IHVwIHRoZSBzdWNjZXNzIGJpdHMgZm9yIHRoaXMgc3RhdGUuICAqLworICBkLT5z dWNjZXNzW3NdID0gMDsKKyAgaWYgKEFDQ0VQVFNfSU5fQ09OVEVYVCAoZC0+c3RhdGVzW3NdLmNv bnRleHQsIENUWF9ORVdMSU5FLCBzLCAqZCkpCisgICAgZC0+c3VjY2Vzc1tzXSB8PSBDVFhfTkVX TElORTsKKyAgaWYgKEFDQ0VQVFNfSU5fQ09OVEVYVCAoZC0+c3RhdGVzW3NdLmNvbnRleHQsIENU WF9MRVRURVIsIHMsICpkKSkKKyAgICBkLT5zdWNjZXNzW3NdIHw9IENUWF9MRVRURVI7CisgIGlm IChBQ0NFUFRTX0lOX0NPTlRFWFQgKGQtPnN0YXRlc1tzXS5jb250ZXh0LCBDVFhfTk9ORSwgcywg KmQpKQorICAgIGQtPnN1Y2Nlc3Nbc10gfD0gQ1RYX05PTkU7CisKKyAgdHJhbnMgPSB4bWFsbG9j IChOT1RDSEFSICogc2l6ZW9mICp0cmFucyk7CisgIGRmYXN0YXRlIChzLCBkLCB0cmFucyk7CisK KyAgLyogTm93IGdvIHRocm91Z2ggdGhlIG5ldyB0cmFuc2l0aW9uIHRhYmxlLCBhbmQgbWFrZSBz dXJlIHRoYXQgdGhlIHRyYW5zCisgICAgIGFuZCBmYWlsIGFycmF5cyBhcmUgYWxsb2NhdGVkIGxh cmdlIGVub3VnaCB0byBob2xkIGEgcG9pbnRlciBmb3IgdGhlCisgICAgIGxhcmdlc3Qgc3RhdGUg bWVudGlvbmVkIGluIHRoZSB0YWJsZS4gICovCisgIG1heHN0YXRlID0gLTE7CisgIGZvciAoaSA9 IDA7IGkgPCBOT1RDSEFSOyArK2kpCisgICAgaWYgKG1heHN0YXRlIDwgdHJhbnNbaV0pCisgICAg ICBtYXhzdGF0ZSA9IHRyYW5zW2ldOworICByZWFsbG9jX3RyYW5zX2lmX25lY2Vzc2FyeSAoZCwg bWF4c3RhdGUpOworCisgIC8qIEtlZXAgdGhlIG5ld2xpbmUgdHJhbnNpdGlvbiBpbiBhIHNwZWNp YWwgcGxhY2Ugc28gd2UgY2FuIHVzZSBpdCBhcworICAgICBhIHNlbnRpbmVsLiAgKi8KKyAgZC0+ bmV3bGluZXNbc10gPSB0cmFuc1tlb2xieXRlXTsKKyAgdHJhbnNbZW9sYnl0ZV0gPSAtMTsKKwor ICBpZiAoQUNDRVBUSU5HIChzLCAqZCkpCisgICAgZC0+ZmFpbHNbc10gPSB0cmFuczsKKyAgZWxz ZQorICAgIGQtPnRyYW5zW3NdID0gdHJhbnM7Cit9CisKKy8qIE11bHRpYnl0ZSBjaGFyYWN0ZXIg aGFuZGxpbmcgc3ViLXJvdXRpbmVzIGZvciBkZmFleGVjLiAgKi8KKworLyogQ29uc3VtZSBhIHNp bmdsZSBieXRlIGFuZCB0cmFuc2l0IHN0YXRlIGZyb20gJ3MnIHRvICcqbmV4dF9zdGF0ZScuCisg ICBUaGlzIGZ1bmN0aW9uIGlzIGFsbW9zdCBzYW1lIGFzIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIHJv dXRpbiBpbiBkZmFleGVjLgorICAgQnV0IHN0YXRlIHRyYW5zaXRpb24gaXMgZG9uZSBqdXN0IG9u Y2UsIG90aGVyd2lzZSBtYXRjaGluZyBzdWNjZWVkIG9yCisgICByZWFjaCB0aGUgZW5kIG9mIHRo ZSBidWZmZXIuICAqLworc3RhdGljIHN0YXRlX251bQordHJhbnNpdF9zdGF0ZV9zaW5nbGVieXRl IChzdHJ1Y3QgZGZhICpkLCBzdGF0ZV9udW0gcywgdW5zaWduZWQgY2hhciBjb25zdCAqKnBwKQor eworICBzdGF0ZV9udW0gKnQ7CisKKyAgaWYgKCoqcHAgPT0gZW9sYnl0ZSkKKyAgICB7CisgICAg ICAvKiBTIGlzIGFsd2F5cyBhbiBpbml0aWFsIHN0YXRlIGluIHRyYW5zaXRfc3RhdGUsIHNvIHRo ZQorICAgICAgICAgdHJhbnNpdGlvbiB0YWJsZSBmb3IgdGhlIHN0YXRlIG11c3QgaGF2ZSBiZWVu IGJ1aWx0IGFscmVhZHkuICAqLworICAgICAgYXNzZXJ0IChkLT50cmFuc1tzXSB8fCBkLT5mYWls c1tzXSk7CisKKyAgICAgICsrKnBwOworICAgICAgcmV0dXJuIGQtPm5ld2xpbmVzW3NdOworICAg IH0KKworICBpZiAoZC0+dHJhbnNbc10pCisgICAgdCA9IGQtPnRyYW5zW3NdOworICBlbHNlIGlm IChkLT5mYWlsc1tzXSkKKyAgICB0ID0gZC0+ZmFpbHNbc107CisgIGVsc2UKKyAgICB7CisgICAg ICBidWlsZF9zdGF0ZSAocywgZCk7CisgICAgICBpZiAoZC0+dHJhbnNbc10pCisgICAgICAgIHQg PSBkLT50cmFuc1tzXTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHQgPSBkLT5m YWlsc1tzXTsKKyAgICAgICAgICBhc3NlcnQgKHQpOworICAgICAgICB9CisgICAgfQorCisgIHJl dHVybiB0WyooKnBwKSsrXTsKK30KKworLyogVHJhbnNpdCBzdGF0ZSBmcm9tIHMsIHRoZW4gcmV0 dXJuIG5ldyBzdGF0ZSBhbmQgdXBkYXRlIHRoZSBwb2ludGVyIG9mCisgICB0aGUgYnVmZmVyLiAg VGhpcyBmdW5jdGlvbiBpcyBmb3IgYSBwZXJpb2Qgb3BlcmF0b3Igd2hpY2ggY2FuIG1hdGNoIGEK KyAgIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAgKi8KK3N0YXRpYyBzdGF0ZV9udW0KK3RyYW5zaXRf c3RhdGUgKHN0cnVjdCBkZmEgKmQsIHN0YXRlX251bSBzLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICoq cHAsCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICplbmQpCit7CisgIHN0YXRl X251bSBzMSwgczI7CisgIHdpbnRfdCB3YzsKKyAgc2l6ZV90IGksIGo7CisgIGludCBrOworICBp bnQgc2VwYXJhdGVfY29udGV4dHM7CisKKyAgaW50IG1iY2xlbiA9IG1ic190b193Y2hhciAoJndj LCAoY2hhciBjb25zdCAqKSAqcHAsIGVuZCAtICpwcCwgZCk7CisgIGludCBjb250ZXh0ID0gd2Mg PT0gZW9sYnl0ZSA/IENUWF9ORVdMSU5FIDogQ1RYX05PTkU7CisKKyAgLyogVGhpcyBzdGF0ZSBo YXMgc29tZSBvcGVyYXRvcnMgd2hpY2ggY2FuIG1hdGNoIGEgbXVsdGlieXRlIGNoYXJhY3Rlci4g ICovCisgIGQtPm1iX2ZvbGxvd3MubmVsZW0gPSAwOworCisgIC8qIENhbGN1bGF0ZSB0aGUgc3Rh dGUgd2hpY2ggY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhdGUgJ3MnIGJ5CisgICAgIGNvbnN1 bWluZyAnbWJjbGVuJyBzaW5nbGUgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLiAgKi8KKyAgczEgPSBz OworICBmb3IgKGsgPSAwOyBrIDwgbWJjbGVuOyBrKyspCisgICAgeworICAgICAgczIgPSBzMTsK KyAgICAgIHMxID0gdHJhbnNpdF9zdGF0ZV9zaW5nbGVieXRlIChkLCBzMiwgcHApOworICAgIH0K KyAgY29weSAoJmQtPnN0YXRlc1tzMV0uZWxlbXMsICZkLT5tYl9mb2xsb3dzKTsKKworICAvKiBB ZGQgYWxsIG9mIHRoZSBwb3NpdGlvbnMgd2hpY2ggY2FuIGJlIHJlYWNoZWQgZnJvbSAncycgYnkg Y29uc3VtaW5nCisgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4gICovCisgIGZvciAoaSA9IDA7IGkg PCBkLT5zdGF0ZXNbc10ubWJwcy5uZWxlbTsgaSsrKQorICAgIHsKKyAgICAgIGlmICghU1VDQ0VF RFNfSU5fQ09OVEVYVCAoZC0+c3RhdGVzW3NdLm1icHMuZWxlbXNbaV0uY29uc3RyYWludCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c3RhdGVzW3NdLmNvbnRleHQsIGNvbnRl eHQpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5mb2xsb3dz W2QtPnN0YXRlc1tzXS5tYnBzLmVsZW1zW2ldLmluZGV4XS5uZWxlbTsgaisrKQorICAgICAgICBp bnNlcnQgKGQtPmZvbGxvd3NbZC0+c3RhdGVzW3NdLm1icHMuZWxlbXNbaV0uaW5kZXhdLmVsZW1z W2pdLAorICAgICAgICAgICAgICAgICZkLT5tYl9mb2xsb3dzKTsKKyAgICB9CisKKyAgc2VwYXJh dGVfY29udGV4dHMgPSBzdGF0ZV9zZXBhcmF0ZV9jb250ZXh0cyAoJmQtPm1iX2ZvbGxvd3MpOwor ICBpZiAoISAoY29udGV4dCA9PSBDVFhfTkVXTElORSB8fCBzZXBhcmF0ZV9jb250ZXh0cyAmIENU WF9ORVdMSU5FKSkKKyAgICBjb250ZXh0ID0gc2VwYXJhdGVfY29udGV4dHMgXiBDVFhfQU5ZOwor ICBzMSA9IHN0YXRlX2luZGV4IChkLCAmZC0+bWJfZm9sbG93cywgY29udGV4dCk7CisgIHJlYWxs b2NfdHJhbnNfaWZfbmVjZXNzYXJ5IChkLCBzMSk7CisKKyAgcmV0dXJuIHMxOworfQorCisvKiBU aGUgaW5pdGlhbCBzdGF0ZSBtYXkgZW5jb3VudGVyIGEgYnl0ZSB3aGljaCBpcyBub3QgYSBzaW5n bGUgYnl0ZSBjaGFyYWN0ZXIKKyAgIG5vciB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpYnl0ZSBj aGFyYWN0ZXIuICBCdXQgaXQgaXMgaW5jb3JyZWN0IGZvciB0aGUKKyAgIGluaXRpYWwgc3RhdGUg dG8gYWNjZXB0IHN1Y2ggYSBieXRlLiAgRm9yIGV4YW1wbGUsIGluIFNoaWZ0IEpJUyB0aGUgcmVn dWxhcgorICAgZXhwcmVzc2lvbiAiXFwiIGFjY2VwdHMgdGhlIGNvZGVwb2ludCAweDVjLCBidXQg c2hvdWxkIG5vdCBhY2NlcHQgdGhlIHNlY29uZAorICAgYnl0ZSBvZiB0aGUgY29kZXBvaW50IDB4 ODE1Yy4gIFRoZW4gdGhlIGluaXRpYWwgc3RhdGUgbXVzdCBza2lwIHRoZSBieXRlcworICAgdGhh dCBhcmUgbm90IGEgc2luZ2xlIGJ5dGUgY2hhcmFjdGVyIG5vciB0aGUgZmlyc3QgYnl0ZSBvZiBh IG11bHRpYnl0ZQorICAgY2hhcmFjdGVyLgorCisgICBHaXZlbiBERkEgc3RhdGUgZCwgdXNlIG1i c190b193Y2hhciB0byBhZHZhbmNlIE1CUCB1bnRpbCBpdCByZWFjaGVzCisgICBvciBleGNlZWRz IFAsIGFuZCByZXR1cm4gdGhlIGFkdmFuY2VkIE1CUC4gIElmIFdDUCBpcyBub24tTlVMTCBhbmQK KyAgIHRoZSByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIFAsIHNldCAqV0NQIHRvIHRoZSBmaW5hbCB3 aWRlIGNoYXJhY3RlcgorICAgcHJvY2Vzc2VkLCBvciB0byBXRU9GIGlmIG5vIHdpZGUgY2hhcmFj dGVyIGlzIHByb2Nlc3NlZC4gIE90aGVyd2lzZSwKKyAgIGlmIFdDUCBpcyBub24tTlVMTCwgKldD UCBtYXkgb3IgbWF5IG5vdCBiZSB1cGRhdGVkLgorCisgICBCb3RoIFAgYW5kIE1CUCBtdXN0IGJl IG5vIGxhcmdlciB0aGFuIEVORC4gICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb25zdCAqCitz a2lwX3JlbWFpbnNfbWIgKHN0cnVjdCBkZmEgKmQsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsCisg ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgKm1icCwgY2hhciBjb25zdCAqZW5k LCB3aW50X3QgKndjcCkKK3sKKyAgd2ludF90IHdjID0gV0VPRjsKKyAgaWYgKG5ldmVyX3RyYWls WypwXSkKKyAgICByZXR1cm4gcDsKKyAgd2hpbGUgKG1icCA8IHApCisgICAgbWJwICs9IG1ic190 b193Y2hhciAoJndjLCAoY2hhciBjb25zdCAqKSBtYnAsCisgICAgICAgICAgICAgICAgICAgICAg ICAgZW5kIC0gKGNoYXIgY29uc3QgKikgbWJwLCBkKTsKKyAgaWYgKHdjcCAhPSBOVUxMKQorICAg ICp3Y3AgPSB3YzsKKyAgcmV0dXJuIG1icDsKK30KKworLyogU2VhcmNoIHRocm91Z2ggYSBidWZm ZXIgbG9va2luZyBmb3IgYSBtYXRjaCB0byB0aGUgc3RydWN0IGRmYSAqRC4KKyAgIEZpbmQgdGhl IGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIHJlZ2V4cCBpbiB0aGUK KyAgIGJ1ZmZlciwgYW5kIHRoZSBzaG9ydGVzdCBwb3NzaWJsZSB2ZXJzaW9uIHRoZXJlb2YuICBS ZXR1cm4gYSBwb2ludGVyIHRvCisgICB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBtYXRj aCwgb3IgTlVMTCBpZiBub25lIGlzIGZvdW5kLiAgQkVHSU4KKyAgIHBvaW50cyB0byB0aGUgYmVn aW5uaW5nIG9mIHRoZSBidWZmZXIsIGFuZCBFTkQgcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlCisg ICBhZnRlciBpdHMgZW5kLiAgTm90ZSBob3dldmVyIHRoYXQgd2Ugc3RvcmUgYSBzZW50aW5lbCBi eXRlICh1c3VhbGx5CisgICBuZXdsaW5lKSBpbiAqRU5ELCBzbyB0aGUgYWN0dWFsIGJ1ZmZlciBt dXN0IGJlIG9uZSBieXRlIGxvbmdlci4KKyAgIFdoZW4gQUxMT1dfTkwsIG5ld2xpbmVzIG1heSBh cHBlYXIgaW4gdGhlIG1hdGNoaW5nIHN0cmluZy4KKyAgIElmIENPVU5UIGlzIG5vbi1OVUxMLCBp bmNyZW1lbnQgKkNPVU5UIG9uY2UgZm9yIGVhY2ggbmV3bGluZSBwcm9jZXNzZWQuCisgICBJZiBN VUxUSUJZVEUsIHRoZSBpbnB1dCBjb25zaXN0cyBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBhbmQv b3IKKyAgIGVuY29kaW5nLWVycm9yIGJ5dGVzLiAgT3RoZXJ3aXNlLCBpdCBjb25zaXN0cyBvZiBz aW5nbGUtYnl0ZSBjaGFyYWN0ZXJzLgorICAgSGVyZSBpcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyB0 aGF0IG1ha2UgdGhpcyBERkEgbWF0Y2hlciBwdW50OgorICAgIC0gW00tTl0gcmFuZ2UgaW4gbm9u LXNpbXBsZSBsb2NhbGU6IHJlZ2V4IGlzIHVwIHRvIDI1JSBmYXN0ZXIgb24gW2Etel0KKyAgICAt IFteLi4uXSBpbiBub24tc2ltcGxlIGxvY2FsZQorICAgIC0gW1s9Zm9vPV1dIG9yIFtbLmZvby5d XQorICAgIC0gW1s6YWxwaGE6XV0gZXRjLiBpbiBtdWx0aWJ5dGUgbG9jYWxlIChleGNlcHQgW1s6 ZGlnaXQ6XV0gd29ya3MgT0spCisgICAgLSBiYWNrLXJlZmVyZW5jZTogKC4pXDEKKyAgICAtIHdv cmQtZGVsaW1pdGVyIGluIG11bHRpYnl0ZSBsb2NhbGU6IFw8LCBcPiwgXGIsIFxCCisgICBTZWUg dXNpbmdfc2ltcGxlX2xvY2FsZSBmb3IgdGhlIGRlZmluaXRpb24gb2YgInNpbXBsZSBsb2NhbGUi LiAgKi8KKworc3RhdGljIGlubGluZSBjaGFyICoKK2RmYWV4ZWNfbWFpbiAoc3RydWN0IGRmYSAq ZCwgY2hhciBjb25zdCAqYmVnaW4sIGNoYXIgKmVuZCwgYm9vbCBhbGxvd19ubCwKKyAgICAgICAg ICAgICAgc2l6ZV90ICpjb3VudCwgYm9vbCBtdWx0aWJ5dGUpCit7CisgIHN0YXRlX251bSBzLCBz MTsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc3RhdGUuICAqLworICB1bnNpZ25lZCBjaGFyIGNv bnN0ICpwLCAqbWJwOyAvKiBDdXJyZW50IGlucHV0IGNoYXJhY3Rlci4gICovCisgIHN0YXRlX251 bSAqKnRyYW5zLCAqdDsgICAgICAgIC8qIENvcHkgb2YgZC0+dHJhbnMgc28gaXQgY2FuIGJlIG9w dGltaXplZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGEgcmVnaXN0 ZXIuICAqLworICB1bnNpZ25lZCBjaGFyIGVvbCA9IGVvbGJ5dGU7ICAvKiBMaWtld2lzZSBmb3Ig ZW9sYnl0ZS4gICovCisgIHVuc2lnbmVkIGNoYXIgc2F2ZWRfZW5kOworICBzaXplX3Qgbmxjb3Vu dCA9IDA7CisKKyAgaWYgKCFkLT50cmFsbG9jKQorICAgIHsKKyAgICAgIHJlYWxsb2NfdHJhbnNf aWZfbmVjZXNzYXJ5IChkLCAxKTsKKyAgICAgIGJ1aWxkX3N0YXRlICgwLCBkKTsKKyAgICB9CisK KyAgcyA9IHMxID0gMDsKKyAgcCA9IG1icCA9ICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopIGJlZ2lu OworICB0cmFucyA9IGQtPnRyYW5zOworICBzYXZlZF9lbmQgPSAqKHVuc2lnbmVkIGNoYXIgKikg ZW5kOworICAqZW5kID0gZW9sOworCisgIGlmIChtdWx0aWJ5dGUpCisgICAgeworICAgICAgbWVt c2V0ICgmZC0+bWJzLCAwLCBzaXplb2YgZC0+bWJzKTsKKyAgICAgIGlmIChkLT5tYl9mb2xsb3dz LmFsbG9jID09IDApCisgICAgICAgIGFsbG9jX3Bvc2l0aW9uX3NldCAoJmQtPm1iX2ZvbGxvd3Ms IGQtPm5sZWF2ZXMpOworICAgIH0KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChtdWx0 aWJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICB3aGlsZSAoKHQgPSB0cmFuc1tzXSkgIT0gTlVM TCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgczEgPSBzOworCisgICAgICAgICAgICAg IGlmIChzIDwgZC0+bWluX3RyY291bnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAg ICAgICAgaWYgKGQtPm1pbl90cmNvdW50ID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAg ICAgICAgICAgICAgICAgICAgICBpZiAoZC0+c3RhdGVzW3NdLm1icHMubmVsZW0gPT0gMCkKKyAg ICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB3aGlsZSAodFsqcF0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCsr OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IG1icCA9IHNraXBfcmVtYWluc19t YiAoZCwgcCwgbWJwLCBlbmQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRbKnBdID09IDApOworICAgICAgICAg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg ICAgICAgICAgICAgIHAgPSBtYnAgPSBza2lwX3JlbWFpbnNfbWIgKGQsIHAsIG1icCwgZW5kLCBO VUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAg ICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgd2ludF90IHdjOworICAg ICAgICAgICAgICAgICAgICAgIG1icCA9IHNraXBfcmVtYWluc19tYiAoZCwgcCwgbWJwLCBlbmQs ICZ3Yyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkLT5taW5fdHJjb3VudCBpcyBn cmVhdGVyIHRoYW4gMSwgbWF5YmUKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0IHRv IGFub3RoZXIgaW5pdGlhbCBzdGF0ZSBhZnRlciBza2lwLiAgKi8KKyAgICAgICAgICAgICAgICAg ICAgICBpZiAocCA8IG1icCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgLyogSXQncyBDVFhfTEVUVEVSIG9yIENUWF9OT05FLiAgQ1RYX05FV0xJ TkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGhhcHBlbiwgYXMgd2UgYXNz dW1lIHRoYXQgYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsd2F5 cyBhIHNpbmdsZSBieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAg IHMxID0gcyA9IGQtPmluaXRzdGF0ZV9ub3Rib2w7CisgICAgICAgICAgICAgICAgICAgICAgICAg IHAgPSBtYnA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGQtPnN0YXRlc1tzXS5t YnBzLm5lbGVtID09IDAgfHwgKCpwID09IGVvbCAmJiAhYWxsb3dfbmwpCisgICAgICAgICAgICAg ICAgICB8fCAoKnAgPT0gJ1xuJyAmJiAhKHN5bnRheF9iaXRzICYgUkVfRE9UX05FV0xJTkUpKQor ICAgICAgICAgICAgICAgICAgfHwgKCpwID09ICdcMCcgJiYgKHN5bnRheF9iaXRzICYgUkVfRE9U X05PVF9OVUxMKSkKKyAgICAgICAgICAgICAgICAgIHx8IChjaGFyICopIHAgPj0gZW5kKQorICAg ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIElmIGFuIGlucHV0IGNoYXJhY3Rl ciBkb2VzIG5vdCBtYXRjaCBBTllDSEFSLCBkbyBpdAorICAgICAgICAgICAgICAgICAgICAgbGlr ZSBhIHNpbmdsZS1ieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgICAgICBzID0gdFsq cCsrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg ICAgICB7CisgICAgICAgICAgICAgICAgICBzID0gdHJhbnNpdF9zdGF0ZSAoZCwgcywgJnAsICh1 bnNpZ25lZCBjaGFyICopIGVuZCk7CisgICAgICAgICAgICAgICAgICBpZiAocyA+PSAwICYmIHBb LTFdID09IGVvbCkKKyAgICAgICAgICAgICAgICAgICAgbmxjb3VudCsrOworICAgICAgICAgICAg ICAgICAgbWJwID0gcDsKKyAgICAgICAgICAgICAgICAgIHRyYW5zID0gZC0+dHJhbnM7CisgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAg ICAgIHsKKyAgICAgICAgICBpZiAocyA9PSAwICYmICh0ID0gdHJhbnNbc10pICE9IE5VTEwpCisg ICAgICAgICAgICB7CisgICAgICAgICAgICAgIHdoaWxlICh0WypwXSA9PSAwKQorICAgICAgICAg ICAgICAgIHArKzsKKyAgICAgICAgICAgICAgczEgPSAwOworICAgICAgICAgICAgICBzID0gdFsq cCsrXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHdoaWxlICgodCA9IHRyYW5zW3NdKSAh PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzMSA9IHRbKnArK107CisgICAg ICAgICAgICAgIGlmICgodCA9IHRyYW5zW3MxXSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7 CisgICAgICAgICAgICAgICAgICBzdGF0ZV9udW0gdG1wID0gczsKKyAgICAgICAgICAgICAgICAg IHMgPSBzMTsKKyAgICAgICAgICAgICAgICAgIHMxID0gdG1wOyAgICAgLyogc3dhcCAqLworICAg ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBz ID0gdFsqcCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBpZiAocyA8IDAp CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKGNoYXIgKikgcCA+IGVuZCB8fCBwWy0xXSAhPSBl b2wgfHwgZC0+bmV3bGluZXNbczFdIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg cCA9IE5VTEw7CisgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworICAg ICAgICAgIC8qIFRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZSwgY291bnQgaXQs IGFuZCBza2lwCisgICAgICAgICAgICAgY2hlY2tpbmcgb2YgbXVsdGlieXRlIGNoYXJhY3RlciBi b3VuZGFyeSB1bnRpbCBoZXJlLiAgKi8KKyAgICAgICAgICBubGNvdW50Kys7CisgICAgICAgICAg bWJwID0gcDsKKworICAgICAgICAgIHMgPSBhbGxvd19ubCA/IGQtPm5ld2xpbmVzW3MxXSA6IDA7 CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGQtPmZhaWxzW3NdKQorICAgICAgICB7CisgICAg ICAgICAgaWYgKGQtPnN1Y2Nlc3Nbc10gJiBzYml0WypwXSkKKyAgICAgICAgICAgIGdvdG8gZG9u ZTsKKworICAgICAgICAgIHMxID0gczsKKyAgICAgICAgICBpZiAoIW11bHRpYnl0ZSB8fCBkLT5z dGF0ZXNbc10ubWJwcy5uZWxlbSA9PSAwCisgICAgICAgICAgICAgIHx8ICgqcCA9PSBlb2wgJiYg IWFsbG93X25sKQorICAgICAgICAgICAgICB8fCAoKnAgPT0gJ1xuJyAmJiAhKHN5bnRheF9iaXRz ICYgUkVfRE9UX05FV0xJTkUpKQorICAgICAgICAgICAgICB8fCAoKnAgPT0gJ1wwJyAmJiAoc3lu dGF4X2JpdHMgJiBSRV9ET1RfTk9UX05VTEwpKQorICAgICAgICAgICAgICB8fCAoY2hhciAqKSBw ID49IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogSWYgYSBpbnB1dCBjaGFy YWN0ZXIgZG9lcyBub3QgbWF0Y2ggQU5ZQ0hBUiwgZG8gaXQKKyAgICAgICAgICAgICAgICAgbGlr ZSBhIHNpbmdsZS1ieXRlIGNoYXJhY3Rlci4gICovCisgICAgICAgICAgICAgIHMgPSBkLT5mYWls c1tzXVsqcCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7 CisgICAgICAgICAgICAgIHMgPSB0cmFuc2l0X3N0YXRlIChkLCBzLCAmcCwgKHVuc2lnbmVkIGNo YXIgKikgZW5kKTsKKyAgICAgICAgICAgICAgaWYgKHMgPj0gMCAmJiBwWy0xXSA9PSBlb2wpCisg ICAgICAgICAgICAgICAgbmxjb3VudCsrOworICAgICAgICAgICAgICBtYnAgPSBwOworICAgICAg ICAgICAgICB0cmFucyA9IGQtPnRyYW5zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg ICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBidWlsZF9zdGF0ZSAocywgZCk7CisgICAgICAg ICAgdHJhbnMgPSBkLT50cmFuczsKKyAgICAgICAgfQorICAgIH0KKworIGRvbmU6CisgIGlmIChj b3VudCkKKyAgICAqY291bnQgKz0gbmxjb3VudDsKKyAgKmVuZCA9IHNhdmVkX2VuZDsKKyAgcmV0 dXJuIChjaGFyICopIHA7Cit9CisKKy8qIFNwZWNpYWxpemVkIHZlcnNpb25zIG9mIGRmYWV4ZWMg Zm9yIG11bHRpYnl0ZSBhbmQgc2luZ2xlLWJ5dGUgY2FzZXMuCisgICBUaGlzIGlzIGZvciBwZXJm b3JtYW5jZSwgYXMgZGZhZXhlY19tYWluIGlzIGFuIGlubGluZSBmdW5jdGlvbi4gICovCisKK3N0 YXRpYyBjaGFyICoKK2RmYWV4ZWNfbWIgKHN0cnVjdCBkZmEgKmQsIGNoYXIgY29uc3QgKmJlZ2lu LCBjaGFyICplbmQsCisgICAgICAgICAgICBib29sIGFsbG93X25sLCBzaXplX3QgKmNvdW50LCBi b29sICpiYWNrcmVmKQoreworICByZXR1cm4gZGZhZXhlY19tYWluIChkLCBiZWdpbiwgZW5kLCBh bGxvd19ubCwgY291bnQsIHRydWUpOworfQorCitzdGF0aWMgY2hhciAqCitkZmFleGVjX3NiIChz dHJ1Y3QgZGZhICpkLCBjaGFyIGNvbnN0ICpiZWdpbiwgY2hhciAqZW5kLAorICAgICAgICAgICAg Ym9vbCBhbGxvd19ubCwgc2l6ZV90ICpjb3VudCwgYm9vbCAqYmFja3JlZikKK3sKKyAgcmV0dXJu IGRmYWV4ZWNfbWFpbiAoZCwgYmVnaW4sIGVuZCwgYWxsb3dfbmwsIGNvdW50LCBmYWxzZSk7Cit9 CisKKy8qIEFsd2F5cyBzZXQgKkJBQ0tSRUYgYW5kIHJldHVybiBCRUdJTi4gIFVzZSB0aGlzIHdy YXBwZXIgZm9yCisgICBhbnkgcmVnZXhwIHRoYXQgdXNlcyBhIGNvbnN0cnVjdCBub3Qgc3VwcG9y dGVkIGJ5IHRoaXMgY29kZS4gICovCitzdGF0aWMgY2hhciAqCitkZmFleGVjX25vb3AgKHN0cnVj dCBkZmEgKmQsIGNoYXIgY29uc3QgKmJlZ2luLCBjaGFyICplbmQsCisgICAgICAgICAgICAgIGJv b2wgYWxsb3dfbmwsIHNpemVfdCAqY291bnQsIGJvb2wgKmJhY2tyZWYpCit7CisgICpiYWNrcmVm ID0gdHJ1ZTsKKyAgcmV0dXJuIChjaGFyICopIGJlZ2luOworfQorCisvKiBMaWtlIGRmYWV4ZWNf bWFpbiAoRCwgQkVHSU4sIEVORCwgQUxMT1dfTkwsIENPVU5ULCBELT5tdWx0aWJ5dGUpLAorICAg YnV0IGZhc3RlciBhbmQgc2V0ICpCQUNLUkVGIGlmIHRoZSBERkEgY29kZSBkb2VzIG5vdCBzdXBw b3J0IHRoaXMKKyAgIHJlZ2V4cCB1c2FnZS4gICovCisKK2NoYXIgKgorZGZhZXhlYyAoc3RydWN0 IGRmYSAqZCwgY2hhciBjb25zdCAqYmVnaW4sIGNoYXIgKmVuZCwKKyAgICAgICAgIGJvb2wgYWxs b3dfbmwsIHNpemVfdCAqY291bnQsIGJvb2wgKmJhY2tyZWYpCit7CisgIHJldHVybiBkLT5kZmFl eGVjIChkLCBiZWdpbiwgZW5kLCBhbGxvd19ubCwgY291bnQsIGJhY2tyZWYpOworfQorCitzdHJ1 Y3QgZGZhICoKK2RmYXN1cGVyc2V0IChzdHJ1Y3QgZGZhIGNvbnN0ICpkKQoreworICByZXR1cm4g ZC0+c3VwZXJzZXQ7Cit9CisKK2Jvb2wKK2RmYWlzZmFzdCAoc3RydWN0IGRmYSBjb25zdCAqZCkK K3sKKyAgcmV0dXJuIGQtPmZhc3Q7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX21iZGF0YSAoc3Ry dWN0IGRmYSAqZCkKK3sKKyAgc2l6ZV90IGk7CisKKyAgZnJlZSAoZC0+bXVsdGlieXRlX3Byb3Ap OworCisgIGZvciAoaSA9IDA7IGkgPCBkLT5ubWJjc2V0czsgKytpKQorICAgIHsKKyAgICAgIHN0 cnVjdCBtYl9jaGFyX2NsYXNzZXMgKnAgPSAmKGQtPm1iY3NldHNbaV0pOworICAgICAgZnJlZSAo cC0+Y2hhcnMpOworICAgIH0KKworICBmcmVlIChkLT5tYmNzZXRzKTsKKyAgZnJlZSAoZC0+bWJf Zm9sbG93cy5lbGVtcyk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudHMgb2YgYSBk ZmEgdGhhdCB0aGUgb3RoZXIgcm91dGluZXMgZG9uJ3QKKyAgIGluaXRpYWxpemUgZm9yIHRoZW1z ZWx2ZXMuICAqLworc3RhdGljIHZvaWQKK2RmYWluaXQgKHN0cnVjdCBkZmEgKmQpCit7CisgIG1l bXNldCAoZCwgMCwgc2l6ZW9mICpkKTsKKyAgZC0+bXVsdGlieXRlID0gTUJfQ1VSX01BWCA+IDE7 CisgIGQtPmRmYWV4ZWMgPSBkLT5tdWx0aWJ5dGUgPyBkZmFleGVjX21iIDogZGZhZXhlY19zYjsK KyAgZC0+ZmFzdCA9ICFkLT5tdWx0aWJ5dGU7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIGV2ZXJ5 IGNvbnN0cnVjdCBpbiBEIGlzIHN1cHBvcnRlZCBieSB0aGlzIERGQSBtYXRjaGVyLiAgKi8KK3N0 YXRpYyBib29sIF9HTF9BVFRSSUJVVEVfUFVSRQorZGZhX3N1cHBvcnRlZCAoc3RydWN0IGRmYSBj b25zdCAqZCkKK3sKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkLT50aW5kZXg7IGkrKykKKyAg ICB7CisgICAgICBzd2l0Y2ggKGQtPnRva2Vuc1tpXSkKKyAgICAgICAgeworICAgICAgICBjYXNl IEJFR1dPUkQ6CisgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgY2FzZSBMSU1XT1JEOgor ICAgICAgICBjYXNlIE5PVExJTVdPUkQ6CisgICAgICAgICAgaWYgKCFkLT5tdWx0aWJ5dGUpCisg ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLworCisgICAg ICAgIGNhc2UgQkFDS1JFRjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgICAgcmV0dXJu IGZhbHNlOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZv aWQKK2RmYW9wdGltaXplIChzdHJ1Y3QgZGZhICpkKQoreworICBzaXplX3QgaTsKKyAgYm9vbCBo YXZlX2JhY2tyZWYgPSBmYWxzZTsKKworICBpZiAoIXVzaW5nX3V0ZjggKCkpCisgICAgcmV0dXJu OworCisgIGZvciAoaSA9IDA7IGkgPCBkLT50aW5kZXg7ICsraSkKKyAgICB7CisgICAgICBzd2l0 Y2ggKGQtPnRva2Vuc1tpXSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEFOWUNIQVI6CisgICAg ICAgICAgLyogTG93ZXJlZC4gICovCisgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgIGNhc2Ug QkFDS1JFRjoKKyAgICAgICAgICBoYXZlX2JhY2tyZWYgPSB0cnVlOworICAgICAgICAgIGJyZWFr OworICAgICAgICBjYXNlIE1CQ1NFVDoKKyAgICAgICAgICAvKiBSZXF1aXJlcyBtdWx0aS1ieXRl IGFsZ29yaXRobS4gICovCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAg ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIGlmICghaGF2ZV9iYWNrcmVmICYm IGQtPnN1cGVyc2V0KQorICAgIHsKKyAgICAgIC8qIFRoZSBzdXBlcnNldCBERkEgaXMgbm90IGxp a2VseSB0byBiZSBtdWNoIGZhc3Rlciwgc28gcmVtb3ZlIGl0LiAgKi8KKyAgICAgIGRmYWZyZWUg KGQtPnN1cGVyc2V0KTsKKyAgICAgIGZyZWUgKGQtPnN1cGVyc2V0KTsKKyAgICAgIGQtPnN1cGVy c2V0ID0gTlVMTDsKKyAgICB9CisKKyAgZnJlZV9tYmRhdGEgKGQpOworICBkLT5tdWx0aWJ5dGUg PSBmYWxzZTsKKyAgZC0+ZGZhZXhlYyA9IGRmYWV4ZWNfc2I7CisgIGQtPmZhc3QgPSB0cnVlOwor fQorCitzdGF0aWMgdm9pZAorZGZhc3NidWlsZCAoc3RydWN0IGRmYSAqZCkKK3sKKyAgc2l6ZV90 IGksIGo7CisgIGNoYXJjbGFzcyBjY2w7CisgIGJvb2wgaGF2ZV9hY2hhciA9IGZhbHNlOworICBi b29sIGhhdmVfbmNoYXIgPSBmYWxzZTsKKyAgc3RydWN0IGRmYSAqc3VwID0gZGZhYWxsb2MgKCk7 CisKKyAgKnN1cCA9ICpkOworICBzdXAtPm11bHRpYnl0ZSA9IGZhbHNlOworICBzdXAtPmRmYWV4 ZWMgPSBkZmFleGVjX3NiOworICBzdXAtPm11bHRpYnl0ZV9wcm9wID0gTlVMTDsKKyAgc3VwLT5t YmNzZXRzID0gTlVMTDsKKyAgc3VwLT5zdXBlcnNldCA9IE5VTEw7CisgIHN1cC0+c3RhdGVzID0g TlVMTDsKKyAgc3VwLT5zaW5kZXggPSAwOworICBzdXAtPmZvbGxvd3MgPSBOVUxMOworICBzdXAt PnRyYWxsb2MgPSAwOworICBzdXAtPnRyYW5zID0gTlVMTDsKKyAgc3VwLT5mYWlscyA9IE5VTEw7 CisgIHN1cC0+c3VjY2VzcyA9IE5VTEw7CisgIHN1cC0+bmV3bGluZXMgPSBOVUxMOworCisgIHN1 cC0+Y2hhcmNsYXNzZXMgPSB4bm1hbGxvYyAoc3VwLT5jYWxsb2MsIHNpemVvZiAqc3VwLT5jaGFy Y2xhc3Nlcyk7CisgIGlmIChkLT5jaW5kZXgpCisgICAgeworICAgICAgbWVtY3B5IChzdXAtPmNo YXJjbGFzc2VzLCBkLT5jaGFyY2xhc3NlcywKKyAgICAgICAgICAgICAgZC0+Y2luZGV4ICogc2l6 ZW9mICpzdXAtPmNoYXJjbGFzc2VzKTsKKyAgICB9CisKKyAgc3VwLT50b2tlbnMgPSB4bm1hbGxv YyAoZC0+dGluZGV4LCAyICogc2l6ZW9mICpzdXAtPnRva2Vucyk7CisgIHN1cC0+dGFsbG9jID0g ZC0+dGluZGV4ICogMjsKKworICBmb3IgKGkgPSBqID0gMDsgaSA8IGQtPnRpbmRleDsgaSsrKQor ICAgIHsKKyAgICAgIHN3aXRjaCAoZC0+dG9rZW5zW2ldKQorICAgICAgICB7CisgICAgICAgIGNh c2UgQU5ZQ0hBUjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgIGNhc2UgQkFDS1JFRjoK KyAgICAgICAgICB6ZXJvc2V0IChjY2wpOworICAgICAgICAgIG5vdHNldCAoY2NsKTsKKyAgICAg ICAgICBzdXAtPnRva2Vuc1tqKytdID0gQ1NFVCArIGRmYV9jaGFyY2xhc3NfaW5kZXggKHN1cCwg Y2NsKTsKKyAgICAgICAgICBzdXAtPnRva2Vuc1tqKytdID0gU1RBUjsKKyAgICAgICAgICBpZiAo ZC0+dG9rZW5zW2kgKyAxXSA9PSBRTUFSSyB8fCBkLT50b2tlbnNbaSArIDFdID09IFNUQVIKKyAg ICAgICAgICAgICAgfHwgZC0+dG9rZW5zW2kgKyAxXSA9PSBQTFVTKQorICAgICAgICAgICAgaSsr OworICAgICAgICAgIGhhdmVfYWNoYXIgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAg ICBjYXNlIEJFR1dPUkQ6CisgICAgICAgIGNhc2UgRU5EV09SRDoKKyAgICAgICAgY2FzZSBMSU1X T1JEOgorICAgICAgICBjYXNlIE5PVExJTVdPUkQ6CisgICAgICAgICAgaWYgKGQtPm11bHRpYnl0 ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhlc2UgY29uc3RyYWludHMgYXJl bid0IHN1cHBvcnRlZCBpbiBhIG11bHRpYnl0ZSBsb2NhbGUuCisgICAgICAgICAgICAgICAgIEln bm9yZSB0aGVtIGluIHRoZSBzdXBlcnNldCBERkEuICAqLworICAgICAgICAgICAgICBzdXAtPnRv a2Vuc1tqKytdID0gRU1QVFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN1cC0+dG9rZW5zW2orK10gPSBkLT50b2tlbnNb aV07CisgICAgICAgICAgaWYgKCgwIDw9IGQtPnRva2Vuc1tpXSAmJiBkLT50b2tlbnNbaV0gPCBO T1RDSEFSKQorICAgICAgICAgICAgICB8fCBkLT50b2tlbnNbaV0gPj0gQ1NFVCkKKyAgICAgICAg ICAgIGhhdmVfbmNoYXIgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg fQorICBzdXAtPnRpbmRleCA9IGo7CisKKyAgaWYgKGhhdmVfbmNoYXIgJiYgKGhhdmVfYWNoYXIg fHwgZC0+bXVsdGlieXRlKSkKKyAgICBkLT5zdXBlcnNldCA9IHN1cDsKKyAgZWxzZQorICAgIHsK KyAgICAgIGRmYWZyZWUgKHN1cCk7CisgICAgICBmcmVlIChzdXApOworICAgIH0KK30KKworLyog UGFyc2UgYW5kIGFuYWx5emUgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBnaXZlbiBsZW5ndGguICAq Lwordm9pZAorZGZhY29tcCAoY2hhciBjb25zdCAqcywgc2l6ZV90IGxlbiwgc3RydWN0IGRmYSAq ZCwgYm9vbCBzZWFyY2hmbGFnKQoreworICBkZmFpbml0IChkKTsKKyAgZGZhcGFyc2UgKHMsIGxl biwgZCk7CisgIGRmYXNzYnVpbGQgKGQpOworCisgIGlmIChkZmFfc3VwcG9ydGVkIChkKSkKKyAg ICB7CisgICAgICBkZmFvcHRpbWl6ZSAoZCk7CisgICAgICBkZmFhbmFseXplIChkLCBzZWFyY2hm bGFnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkLT5kZmFleGVjID0gZGZhZXhlY19u b29wOworICAgIH0KKworICBpZiAoZC0+c3VwZXJzZXQpCisgICAgeworICAgICAgZC0+ZmFzdCA9 IHRydWU7CisgICAgICBkZmFhbmFseXplIChkLT5zdXBlcnNldCwgc2VhcmNoZmxhZyk7CisgICAg fQorfQorCisvKiBGcmVlIHRoZSBzdG9yYWdlIGhlbGQgYnkgdGhlIGNvbXBvbmVudHMgb2YgYSBk ZmEuICAqLwordm9pZAorZGZhZnJlZSAoc3RydWN0IGRmYSAqZCkKK3sKKyAgc2l6ZV90IGk7CisK KyAgZnJlZSAoZC0+Y2hhcmNsYXNzZXMpOworICBmcmVlIChkLT50b2tlbnMpOworCisgIGlmIChk LT5tdWx0aWJ5dGUpCisgICAgZnJlZV9tYmRhdGEgKGQpOworCisgIGZvciAoaSA9IDA7IGkgPCBk LT5zaW5kZXg7ICsraSkKKyAgICB7CisgICAgICBmcmVlIChkLT5zdGF0ZXNbaV0uZWxlbXMuZWxl bXMpOworICAgICAgZnJlZSAoZC0+c3RhdGVzW2ldLm1icHMuZWxlbXMpOworICAgIH0KKyAgZnJl ZSAoZC0+c3RhdGVzKTsKKworICBpZiAoZC0+Zm9sbG93cykKKyAgICB7CisgICAgICBmb3IgKGkg PSAwOyBpIDwgZC0+dGluZGV4OyArK2kpCisgICAgICAgIGZyZWUgKGQtPmZvbGxvd3NbaV0uZWxl bXMpOworICAgICAgZnJlZSAoZC0+Zm9sbG93cyk7CisgICAgfQorCisgIGlmIChkLT50cmFucykK KyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZC0+dHJhbGxvYzsgKytpKQorICAgICAgICB7 CisgICAgICAgICAgZnJlZSAoZC0+dHJhbnNbaV0pOworICAgICAgICAgIGZyZWUgKGQtPmZhaWxz W2ldKTsKKyAgICAgICAgfQorCisgICAgICBmcmVlIChkLT50cmFucyAtIDEpOworICAgICAgZnJl ZSAoZC0+ZmFpbHMpOworICAgICAgZnJlZSAoZC0+bmV3bGluZXMpOworICAgICAgZnJlZSAoZC0+ c3VjY2Vzcyk7CisgICAgfQorCisgIGlmIChkLT5zdXBlcnNldCkKKyAgICBkZmFmcmVlIChkLT5z dXBlcnNldCk7Cit9CisKKy8qIEhhdmluZyBmb3VuZCB0aGUgcG9zdGZpeCByZXByZXNlbnRhdGlv biBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLAorICAgdHJ5IHRvIGZpbmQgYSBsb25nIHNlcXVl bmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGFwcGVhciBpbiBhbnkgbGluZQorICAgY29udGFp bmluZyB0aGUgci5lLgorICAgRmluZGluZyBhICJsb25nZXN0IiBzZXF1ZW5jZSBpcyBiZXlvbmQg dGhlIHNjb3BlIGhlcmU7CisgICB3ZSB0YWtlIGFuIGVhc3kgd2F5IG91dCBhbmQgaG9wZSBmb3Ig dGhlIGJlc3QuCisgICAoVGFrZSAiKGFifGEpYiItLXBsZWFzZS4pCisKKyAgIFdlIGRvIGEgYm90 dG9tLXVwIGNhbGN1bGF0aW9uIG9mIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBh cHBlYXIKKyAgIGluIG1hdGNoZXMgb2Ygci5lLidzIHJlcHJlc2VudGVkIGJ5IHRyZWVzIHJvb3Rl ZCBhdCB0aGUgbm9kZXMgb2YgdGhlIHBvc3RmaXgKKyAgIHJlcHJlc2VudGF0aW9uOgorICAgICAg ICBzZXF1ZW5jZXMgdGhhdCBtdXN0IGFwcGVhciBhdCB0aGUgbGVmdCBvZiB0aGUgbWF0Y2ggKCJs ZWZ0IikKKyAgICAgICAgc2VxdWVuY2VzIHRoYXQgbXVzdCBhcHBlYXIgYXQgdGhlIHJpZ2h0IG9m IHRoZSBtYXRjaCAoInJpZ2h0IikKKyAgICAgICAgbGlzdHMgb2Ygc2VxdWVuY2VzIHRoYXQgbXVz dCBhcHBlYXIgc29tZXdoZXJlIGluIHRoZSBtYXRjaCAoImluIikKKyAgICAgICAgc2VxdWVuY2Vz IHRoYXQgbXVzdCBjb25zdGl0dXRlIHRoZSBtYXRjaCAoImlzIikKKworICAgV2hlbiB3ZSBnZXQg dG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHdlIHVzZSBvbmUgb2YgdGhlIGxvbmdlc3Qgb2YgaXRz CisgICBjYWxjdWxhdGVkICJpbiIgc2VxdWVuY2VzIGFzIG91ciBhbnN3ZXIuCisKKyAgIFRoZSBz ZXF1ZW5jZXMgY2FsY3VsYXRlZCBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2Ygbm9kZSAoaW4gcHNl dWRvIEFOU0kgYykKKyAgIGFyZSBzaG93biBiZWxvdy4gICJwIiBpcyB0aGUgb3BlcmFuZCBvZiB1 bmFyeSBvcGVyYXRvcnMgKGFuZCB0aGUgbGVmdC1oYW5kCisgICBvcGVyYW5kIG9mIGJpbmFyeSBv cGVyYXRvcnMpOyAicSIgaXMgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBvZiBiaW5hcnkKKyAgIG9w ZXJhdG9ycy4KKworICAgIlpFUk8iIG1lYW5zICJhIHplcm8tbGVuZ3RoIHNlcXVlbmNlIiBiZWxv dy4KKworICAgICAgICBUeXBlCWxlZnQJCXJpZ2h0CQlpcwkJaW4KKyAgICAgICAgLS0tLQktLS0t CQktLS0tLQkJLS0JCS0tCisgICAgICAgIGNoYXIgYwkjIGMJCSMgYwkJIyBjCQkjIGMKKworICAg ICAgICBBTllDSEFSCVpFUk8JCVpFUk8JCVpFUk8JCVpFUk8KKworICAgICAgICBNQkNTRVQJWkVS TwkJWkVSTwkJWkVSTwkJWkVSTworCisgICAgICAgIENTRVQJWkVSTwkJWkVSTwkJWkVSTwkJWkVS TworCisgICAgICAgIFNUQVIJWkVSTwkJWkVSTwkJWkVSTwkJWkVSTworCisgICAgICAgIFFNQVJL CVpFUk8JCVpFUk8JCVpFUk8JCVpFUk8KKworICAgICAgICBQTFVTCXAtPmxlZnQJCXAtPnJpZ2h0 CVpFUk8JCXAtPmluCisKKyAgICAgICAgQ0FUCShwLT5pcz09WkVSTyk/CShxLT5pcz09WkVSTyk/ CShwLT5pcyE9WkVSTyAmJglwLT5pbiBwbHVzCisgICAgICAgICAgICAgICAgcC0+bGVmdCA6CXEt PnJpZ2h0IDoJcS0+aXMhPVpFUk8pID8JcS0+aW4gcGx1cworICAgICAgICAgICAgICAgIHAtPmlz IyNxLT5sZWZ0CXAtPnJpZ2h0IyNxLT5pcwlwLT5pcyMjcS0+aXMgOiBwLT5yaWdodCMjcS0+bGVm dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVSTwor CisgICAgICAgIE9SCWxvbmdlc3QgY29tbW9uCWxvbmdlc3QgY29tbW9uCShkbyBwLT5pcyBhbmQg c3Vic3RyaW5ncyBjb21tb24KKyAgICAgICAgICAgICAgICBsZWFkaW5nCQl0cmFpbGluZwl0byBx LT5pcyBoYXZlIHNhbWUgcC0+aW4gYW5kCisgICAgICAgICAgICAgICAgKHN1YilzZXF1ZW5jZQko c3ViKXNlcXVlbmNlCXEtPmluIGxlbmd0aCBhbmQgY29udGVudCkgPworICAgICAgICAgICAgICAg IG9mIHAtPmxlZnQJb2YgcC0+cmlnaHQKKyAgICAgICAgICAgICAgICBhbmQgcS0+bGVmdAlhbmQg cS0+cmlnaHQJcC0+aXMgOiBOVUxMCisKKyAgIElmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZSB3ZSBy ZWNvZ25pemUgaW4gdGhlIHRyZWUsIGFsbCBmb3VyIHNlcXVlbmNlcyBnZXQgc2V0CisgICB0byB6 ZXJvLWxlbmd0aCBzZXF1ZW5jZXMuICBJZiB0aGVyZSdzIHNvbWV0aGluZyB3ZSBkb24ndCByZWNv Z25pemUgaW4gdGhlCisgICB0cmVlLCB3ZSBqdXN0IHJldHVybiBhIHplcm8tbGVuZ3RoIHNlcXVl bmNlLgorCisgICBCcmVhayB0aWVzIGluIGZhdm9yIG9mIGluZnJlcXVlbnQgbGV0dGVycyAoY2hv b3NpbmcgJ3p6eicgaW4gcHJlZmVyZW5jZSB0bworICAgJ2FhYScpPworCisgICBBbmQgLi4uIGlz IGl0IGhlcmUgb3Igc29tZXBsYWNlIHRoYXQgd2UgbWlnaHQgcG9uZGVyICJvcHRpbWl6YXRpb25z IiBzdWNoIGFzCisgICAgICAgIGVncmVwICdwc2l8ZXBzaWxvbicJLT4JZWdyZXAgJ3BzaScKKyAg ICAgICAgZWdyZXAgJ3BlcHNpfGVwc2lsb24nCS0+CWVncmVwICdlcHNpJworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChZZXMsIHdlIG5vdyBmaW5kICJlcHNpIiBhcyBh ICJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG11 c3Qgb2NjdXIiLCBidXQgd2UgbWlnaHQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpbXBsaWZ5IHRoZSAqZW50aXJlKiByLmUuIGJlaW5nIHNvdWdodCkKKyAg ICAgICAgZ3JlcCAnW2NdJwkJLT4JZ3JlcCAnYycKKyAgICAgICAgZ3JlcCAnKGFifGEpYicJCS0+ CWdyZXAgJ2FiJworICAgICAgICBncmVwICdhYionCQktPglncmVwICdhJworICAgICAgICBncmVw ICdhKmInCQktPglncmVwICdiJworCisgICBUaGVyZSBhcmUgc2V2ZXJhbCBpc3N1ZXM6CisKKyAg IElzIG9wdGltaXphdGlvbiBlYXN5IChlbm91Z2gpPworCisgICBEb2VzIG9wdGltaXphdGlvbiBh Y3R1YWxseSBhY2NvbXBsaXNoIGFueXRoaW5nLAorICAgb3IgaXMgdGhlIGF1dG9tYXRvbiB5b3Ug Z2V0IGZyb20gInBzaXxlcHNpbG9uIiAoZm9yIGV4YW1wbGUpCisgICB0aGUgc2FtZSBhcyB0aGUg b25lIHlvdSBnZXQgZnJvbSAicHNpIiAoZm9yIGV4YW1wbGUpPworCisgICBBcmUgb3B0aW1pemFi bGUgci5lLidzIGxpa2VseSB0byBiZSB1c2VkIGluIHJlYWwtbGlmZSBzaXR1YXRpb25zCisgICAo c29tZXRoaW5nIGxpa2UgJ2FiKicgaXMgcHJvYmFibHkgdW5saWtlbHk7IHNvbWV0aGluZyBsaWtl IGlzCisgICAncHNpfGVwc2lsb24nIGlzIGxpa2VsaWVyKT8gICovCisKK3N0YXRpYyBjaGFyICoK K2ljYXRhbGxvYyAoY2hhciAqb2xkLCBjaGFyIGNvbnN0ICpuZXcpCit7CisgIGNoYXIgKnJlc3Vs dDsKKyAgc2l6ZV90IG9sZHNpemU7CisgIHNpemVfdCBuZXdzaXplID0gc3RybGVuIChuZXcpOwor ICBpZiAobmV3c2l6ZSA9PSAwKQorICAgIHJldHVybiBvbGQ7CisgIG9sZHNpemUgPSBzdHJsZW4g KG9sZCk7CisgIHJlc3VsdCA9IHhyZWFsbG9jIChvbGQsIG9sZHNpemUgKyBuZXdzaXplICsgMSk7 CisgIG1lbWNweSAocmVzdWx0ICsgb2xkc2l6ZSwgbmV3LCBuZXdzaXplICsgMSk7CisgIHJldHVy biByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlbGlzdCAoY2hhciAqKmNwcCkKK3sKKyAg d2hpbGUgKCpjcHApCisgICAgZnJlZSAoKmNwcCsrKTsKK30KKworc3RhdGljIGNoYXIgKioKK2Vu bGlzdCAoY2hhciAqKmNwcCwgY2hhciAqbmV3LCBzaXplX3QgbGVuKQoreworICBzaXplX3QgaSwg ajsKKyAgbmV3ID0gbWVtY3B5ICh4bWFsbG9jIChsZW4gKyAxKSwgbmV3LCBsZW4pOworICBuZXdb bGVuXSA9ICdcMCc7CisgIC8qIElzIHRoZXJlIGFscmVhZHkgc29tZXRoaW5nIGluIHRoZSBsaXN0 IHRoYXQncyBuZXcgKG9yIGxvbmdlcik/ICAqLworICBmb3IgKGkgPSAwOyBjcHBbaV0gIT0gTlVM TDsgKytpKQorICAgIGlmIChzdHJzdHIgKGNwcFtpXSwgbmV3KSAhPSBOVUxMKQorICAgICAgewor ICAgICAgICBmcmVlIChuZXcpOworICAgICAgICByZXR1cm4gY3BwOworICAgICAgfQorICAvKiBF bGltaW5hdGUgYW55IG9ic29sZXRlZCBzdHJpbmdzLiAgKi8KKyAgaiA9IDA7CisgIHdoaWxlIChj cHBbal0gIT0gTlVMTCkKKyAgICBpZiAoc3Ryc3RyIChuZXcsIGNwcFtqXSkgPT0gTlVMTCkKKyAg ICAgICsrajsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGZyZWUgKGNwcFtqXSk7CisgICAg ICAgIGlmICgtLWkgPT0gaikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY3BwW2pdID0gY3Bw W2ldOworICAgICAgICBjcHBbaV0gPSBOVUxMOworICAgICAgfQorICAvKiBBZGQgdGhlIG5ldyBz dHJpbmcuICAqLworICBjcHAgPSB4bnJlYWxsb2MgKGNwcCwgaSArIDIsIHNpemVvZiAqY3BwKTsK KyAgY3BwW2ldID0gbmV3OworICBjcHBbaSArIDFdID0gTlVMTDsKKyAgcmV0dXJuIGNwcDsKK30K KworLyogR2l2ZW4gcG9pbnRlcnMgdG8gdHdvIHN0cmluZ3MsIHJldHVybiBhIHBvaW50ZXIgdG8g YW4gYWxsb2NhdGVkCisgICBsaXN0IG9mIHRoZWlyIGRpc3RpbmN0IGNvbW1vbiBzdWJzdHJpbmdz LiAgKi8KK3N0YXRpYyBjaGFyICoqCitjb21zdWJzIChjaGFyICpsZWZ0LCBjaGFyIGNvbnN0ICpy aWdodCkKK3sKKyAgY2hhciAqKmNwcCA9IHh6YWxsb2MgKHNpemVvZiAqY3BwKTsKKyAgY2hhciAq bGNwOworCisgIGZvciAobGNwID0gbGVmdDsgKmxjcCAhPSAnXDAnOyArK2xjcCkKKyAgICB7Cisg ICAgICBzaXplX3QgbGVuID0gMDsKKyAgICAgIGNoYXIgKnJjcCA9IHN0cmNociAocmlnaHQsICps Y3ApOworICAgICAgd2hpbGUgKHJjcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgc2l6 ZV90IGk7CisgICAgICAgICAgZm9yIChpID0gMTsgbGNwW2ldICE9ICdcMCcgJiYgbGNwW2ldID09 IHJjcFtpXTsgKytpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgaWYgKGkgPiBs ZW4pCisgICAgICAgICAgICBsZW4gPSBpOworICAgICAgICAgIHJjcCA9IHN0cmNociAocmNwICsg MSwgKmxjcCk7CisgICAgICAgIH0KKyAgICAgIGlmIChsZW4gIT0gMCkKKyAgICAgICAgY3BwID0g ZW5saXN0IChjcHAsIGxjcCwgbGVuKTsKKyAgICB9CisgIHJldHVybiBjcHA7Cit9CisKK3N0YXRp YyBjaGFyICoqCithZGRsaXN0cyAoY2hhciAqKm9sZCwgY2hhciAqKm5ldykKK3sKKyAgZm9yICg7 ICpuZXc7IG5ldysrKQorICAgIG9sZCA9IGVubGlzdCAob2xkLCAqbmV3LCBzdHJsZW4gKCpuZXcp KTsKKyAgcmV0dXJuIG9sZDsKK30KKworLyogR2l2ZW4gdHdvIGxpc3RzIG9mIHN1YnN0cmluZ3Ms IHJldHVybiBhIG5ldyBsaXN0IGdpdmluZyBzdWJzdHJpbmdzCisgICBjb21tb24gdG8gYm90aC4g ICovCitzdGF0aWMgY2hhciAqKgoraW5ib3RoIChjaGFyICoqbGVmdCwgY2hhciAqKnJpZ2h0KQor eworICBjaGFyICoqYm90aCA9IHh6YWxsb2MgKHNpemVvZiAqYm90aCk7CisgIHNpemVfdCBsbnVt LCBybnVtOworCisgIGZvciAobG51bSA9IDA7IGxlZnRbbG51bV0gIT0gTlVMTDsgKytsbnVtKQor ICAgIHsKKyAgICAgIGZvciAocm51bSA9IDA7IHJpZ2h0W3JudW1dICE9IE5VTEw7ICsrcm51bSkK KyAgICAgICAgeworICAgICAgICAgIGNoYXIgKip0ZW1wID0gY29tc3VicyAobGVmdFtsbnVtXSwg cmlnaHRbcm51bV0pOworICAgICAgICAgIGJvdGggPSBhZGRsaXN0cyAoYm90aCwgdGVtcCk7Cisg ICAgICAgICAgZnJlZWxpc3QgKHRlbXApOworICAgICAgICAgIGZyZWUgKHRlbXApOworICAgICAg ICB9CisgICAgfQorICByZXR1cm4gYm90aDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgbXVzdCBtdXN0 OworCitzdHJ1Y3QgbXVzdAoreworICBjaGFyICoqaW47CisgIGNoYXIgKmxlZnQ7CisgIGNoYXIg KnJpZ2h0OworICBjaGFyICppczsKKyAgYm9vbCBiZWdsaW5lOworICBib29sIGVuZGxpbmU7Cisg IG11c3QgKnByZXY7Cit9OworCitzdGF0aWMgbXVzdCAqCithbGxvY211c3QgKG11c3QgKm1wLCBz aXplX3Qgc2l6ZSkKK3sKKyAgbXVzdCAqbmV3X21wID0geG1hbGxvYyAoc2l6ZW9mICpuZXdfbXAp OworICBuZXdfbXAtPmluID0geHphbGxvYyAoc2l6ZW9mICpuZXdfbXAtPmluKTsKKyAgbmV3X21w LT5sZWZ0ID0geHphbGxvYyAoc2l6ZSk7CisgIG5ld19tcC0+cmlnaHQgPSB4emFsbG9jIChzaXpl KTsKKyAgbmV3X21wLT5pcyA9IHh6YWxsb2MgKHNpemUpOworICBuZXdfbXAtPmJlZ2xpbmUgPSBm YWxzZTsKKyAgbmV3X21wLT5lbmRsaW5lID0gZmFsc2U7CisgIG5ld19tcC0+cHJldiA9IG1wOwor ICByZXR1cm4gbmV3X21wOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRtdXN0IChtdXN0ICptcCkK K3sKKyAgZnJlZWxpc3QgKG1wLT5pbik7CisgIG1wLT5pblswXSA9IE5VTEw7CisgIG1wLT5sZWZ0 WzBdID0gbXAtPnJpZ2h0WzBdID0gbXAtPmlzWzBdID0gJ1wwJzsKKyAgbXAtPmJlZ2xpbmUgPSBm YWxzZTsKKyAgbXAtPmVuZGxpbmUgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVtdXN0 IChtdXN0ICptcCkKK3sKKyAgZnJlZWxpc3QgKG1wLT5pbik7CisgIGZyZWUgKG1wLT5pbik7Cisg IGZyZWUgKG1wLT5sZWZ0KTsKKyAgZnJlZSAobXAtPnJpZ2h0KTsKKyAgZnJlZSAobXAtPmlzKTsK KyAgZnJlZSAobXApOworfQorCitzdHJ1Y3QgZGZhbXVzdCAqCitkZmFtdXN0IChzdHJ1Y3QgZGZh IGNvbnN0ICpkKQoreworICBtdXN0ICptcCA9IE5VTEw7CisgIGNoYXIgY29uc3QgKnJlc3VsdCA9 ICIiOworICBzaXplX3QgaTsKKyAgYm9vbCBleGFjdCA9IGZhbHNlOworICBib29sIGJlZ2xpbmUg PSBmYWxzZTsKKyAgYm9vbCBlbmRsaW5lID0gZmFsc2U7CisgIGJvb2wgbmVlZF9iZWdsaW5lID0g ZmFsc2U7CisgIGJvb2wgbmVlZF9lbmRsaW5lID0gZmFsc2U7CisgIGJvb2wgY2FzZV9mb2xkX3Vu aWJ5dGUgPSBjYXNlX2ZvbGQgJiYgTUJfQ1VSX01BWCA9PSAxOworCisgIGZvciAoc2l6ZV90IHJp ID0gMDsgcmkgPCBkLT50aW5kZXg7ICsrcmkpCisgICAgeworICAgICAgdG9rZW4gdCA9IGQtPnRv a2Vuc1tyaV07CisgICAgICBzd2l0Y2ggKHQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCRUdM SU5FOgorICAgICAgICAgIG1wID0gYWxsb2NtdXN0IChtcCwgMik7CisgICAgICAgICAgbXAtPmJl Z2xpbmUgPSB0cnVlOworICAgICAgICAgIG5lZWRfYmVnbGluZSA9IHRydWU7CisgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgRU5ETElORToKKyAgICAgICAgICBtcCA9IGFsbG9jbXVzdCAo bXAsIDIpOworICAgICAgICAgIG1wLT5lbmRsaW5lID0gdHJ1ZTsKKyAgICAgICAgICBuZWVkX2Vu ZGxpbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExQQVJFTjoKKyAg ICAgICAgY2FzZSBSUEFSRU46CisgICAgICAgICAgYXNzZXJ0ICghIm5laXRoZXIgTFBBUkVOIG5v ciBSUEFSRU4gbWF5IGFwcGVhciBoZXJlIik7CisKKyAgICAgICAgY2FzZSBFTVBUWToKKyAgICAg ICAgY2FzZSBCRUdXT1JEOgorICAgICAgICBjYXNlIEVORFdPUkQ6CisgICAgICAgIGNhc2UgTElN V09SRDoKKyAgICAgICAgY2FzZSBOT1RMSU1XT1JEOgorICAgICAgICBjYXNlIEJBQ0tSRUY6Cisg ICAgICAgIGNhc2UgQU5ZQ0hBUjoKKyAgICAgICAgY2FzZSBNQkNTRVQ6CisgICAgICAgICAgbXAg PSBhbGxvY211c3QgKG1wLCAyKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNU QVI6CisgICAgICAgIGNhc2UgUU1BUks6CisgICAgICAgICAgcmVzZXRtdXN0IChtcCk7CisgICAg ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUjoKKyAgICAgICAgICB7CisgICAgICAgICAg ICBjaGFyICoqbmV3OworICAgICAgICAgICAgbXVzdCAqcm1wID0gbXA7CisgICAgICAgICAgICBt dXN0ICpsbXAgPSBtcCA9IG1wLT5wcmV2OworICAgICAgICAgICAgc2l6ZV90IGosIGxuLCBybiwg bjsKKworICAgICAgICAgICAgLyogR3VhcmFudGVlZCB0byBiZS4gIFVubGlrZWx5LCBidXQgLi4u ICAqLworICAgICAgICAgICAgaWYgKFNUUkVRIChsbXAtPmlzLCBybXAtPmlzKSkKKyAgICAgICAg ICAgICAgeworICAgICAgICAgICAgICAgIGxtcC0+YmVnbGluZSAmPSBybXAtPmJlZ2xpbmU7Cisg ICAgICAgICAgICAgICAgbG1wLT5lbmRsaW5lICY9IHJtcC0+ZW5kbGluZTsKKyAgICAgICAgICAg ICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg bG1wLT5pc1swXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgbG1wLT5iZWdsaW5lID0gZmFsc2U7 CisgICAgICAgICAgICAgICAgbG1wLT5lbmRsaW5lID0gZmFsc2U7CisgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgIC8qIExlZnQgc2lkZS0tZWFzeSAqLworICAgICAgICAgICAgaSA9IDA7Cisg ICAgICAgICAgICB3aGlsZSAobG1wLT5sZWZ0W2ldICE9ICdcMCcgJiYgbG1wLT5sZWZ0W2ldID09 IHJtcC0+bGVmdFtpXSkKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgbG1wLT5sZWZ0 W2ldID0gJ1wwJzsKKyAgICAgICAgICAgIC8qIFJpZ2h0IHNpZGUgKi8KKyAgICAgICAgICAgIGxu ID0gc3RybGVuIChsbXAtPnJpZ2h0KTsKKyAgICAgICAgICAgIHJuID0gc3RybGVuIChybXAtPnJp Z2h0KTsKKyAgICAgICAgICAgIG4gPSBsbjsKKyAgICAgICAgICAgIGlmIChuID4gcm4pCisgICAg ICAgICAgICAgIG4gPSBybjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisg ICAgICAgICAgICAgIGlmIChsbXAtPnJpZ2h0W2xuIC0gaSAtIDFdICE9IHJtcC0+cmlnaHRbcm4g LSBpIC0gMV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmb3IgKGogPSAw OyBqIDwgaTsgKytqKQorICAgICAgICAgICAgICBsbXAtPnJpZ2h0W2pdID0gbG1wLT5yaWdodFso bG4gLSBpKSArIGpdOworICAgICAgICAgICAgbG1wLT5yaWdodFtqXSA9ICdcMCc7CisgICAgICAg ICAgICBuZXcgPSBpbmJvdGggKGxtcC0+aW4sIHJtcC0+aW4pOworICAgICAgICAgICAgZnJlZWxp c3QgKGxtcC0+aW4pOworICAgICAgICAgICAgZnJlZSAobG1wLT5pbik7CisgICAgICAgICAgICBs bXAtPmluID0gbmV3OworICAgICAgICAgICAgZnJlZW11c3QgKHJtcCk7CisgICAgICAgICAgfQor ICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICBtcC0+aXNb MF0gPSAnXDAnOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5EOgorICAgICAg ICAgIGFzc2VydCAoIW1wLT5wcmV2KTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBtcC0+aW5baV0g IT0gTlVMTDsgKytpKQorICAgICAgICAgICAgaWYgKHN0cmxlbiAobXAtPmluW2ldKSA+IHN0cmxl biAocmVzdWx0KSkKKyAgICAgICAgICAgICAgcmVzdWx0ID0gbXAtPmluW2ldOworICAgICAgICAg IGlmIChTVFJFUSAocmVzdWx0LCBtcC0+aXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICBpZiAoKCFuZWVkX2JlZ2xpbmUgfHwgbXAtPmJlZ2xpbmUpICYmICghbmVlZF9lbmRsaW5lCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1w LT5lbmRsaW5lKSkKKyAgICAgICAgICAgICAgICBleGFjdCA9IHRydWU7CisgICAgICAgICAgICAg IGJlZ2xpbmUgPSBtcC0+YmVnbGluZTsKKyAgICAgICAgICAgICAgZW5kbGluZSA9IG1wLT5lbmRs aW5lOworICAgICAgICAgICAgfQorICAgICAgICAgIGdvdG8gZG9uZTsKKworICAgICAgICBjYXNl IENBVDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBtdXN0ICpybXAgPSBtcDsKKyAgICAgICAg ICAgIG11c3QgKmxtcCA9IG1wID0gbXAtPnByZXY7CisKKyAgICAgICAgICAgIC8qIEluLiAgRXZl cnl0aGluZyBpbiBsZWZ0LCBwbHVzIGV2ZXJ5dGhpbmcgaW4KKyAgICAgICAgICAgICAgIHJpZ2h0 LCBwbHVzIGNvbmNhdGVuYXRpb24gb2YKKyAgICAgICAgICAgICAgIGxlZnQncyByaWdodCBhbmQg cmlnaHQncyBsZWZ0LiAgKi8KKyAgICAgICAgICAgIGxtcC0+aW4gPSBhZGRsaXN0cyAobG1wLT5p biwgcm1wLT5pbik7CisgICAgICAgICAgICBpZiAobG1wLT5yaWdodFswXSAhPSAnXDAnICYmIHJt cC0+bGVmdFswXSAhPSAnXDAnKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6 ZV90IGxybGVuID0gc3RybGVuIChsbXAtPnJpZ2h0KTsKKyAgICAgICAgICAgICAgICBzaXplX3Qg cmxsZW4gPSBzdHJsZW4gKHJtcC0+bGVmdCk7CisgICAgICAgICAgICAgICAgY2hhciAqdHAgPSB4 bWFsbG9jIChscmxlbiArIHJsbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkgKHRwLCBsbXAt PnJpZ2h0LCBscmxlbik7CisgICAgICAgICAgICAgICAgbWVtY3B5ICh0cCArIGxybGVuLCBybXAt PmxlZnQsIHJsbGVuKTsKKyAgICAgICAgICAgICAgICBsbXAtPmluID0gZW5saXN0IChsbXAtPmlu LCB0cCwgbHJsZW4gKyBybGxlbik7CisgICAgICAgICAgICAgICAgZnJlZSAodHApOworICAgICAg ICAgICAgICB9CisgICAgICAgICAgICAvKiBMZWZ0LWhhbmQgKi8KKyAgICAgICAgICAgIGlmIChs bXAtPmlzWzBdICE9ICdcMCcpCisgICAgICAgICAgICAgIGxtcC0+bGVmdCA9IGljYXRhbGxvYyAo bG1wLT5sZWZ0LCBybXAtPmxlZnQpOworICAgICAgICAgICAgLyogUmlnaHQtaGFuZCAqLworICAg ICAgICAgICAgaWYgKHJtcC0+aXNbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgbG1wLT5yaWdo dFswXSA9ICdcMCc7CisgICAgICAgICAgICBsbXAtPnJpZ2h0ID0gaWNhdGFsbG9jIChsbXAtPnJp Z2h0LCBybXAtPnJpZ2h0KTsKKyAgICAgICAgICAgIC8qIEd1YXJhbnRlZWQgdG8gYmUgKi8KKyAg ICAgICAgICAgIGlmICgobG1wLT5pc1swXSAhPSAnXDAnIHx8IGxtcC0+YmVnbGluZSkKKyAgICAg ICAgICAgICAgICAmJiAocm1wLT5pc1swXSAhPSAnXDAnIHx8IHJtcC0+ZW5kbGluZSkpCisgICAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsbXAtPmlzID0gaWNhdGFsbG9jIChsbXAtPmlz LCBybXAtPmlzKTsKKyAgICAgICAgICAgICAgICBsbXAtPmVuZGxpbmUgPSBybXAtPmVuZGxpbmU7 CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAg ICAgICAgICAgICAgIGxtcC0+aXNbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGxtcC0+YmVn bGluZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxtcC0+ZW5kbGluZSA9IGZhbHNlOworICAg ICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlbXVzdCAocm1wKTsKKyAgICAgICAgICB9Cisg ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgIC8qIE5vdCBv biAqbXkqIHNoaWZ0LiAgKi8KKyAgICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAgICAgZGVmYXVs dDoKKyAgICAgICAgICBpZiAoQ1NFVCA8PSB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAg ICAvKiBJZiBUIGlzIGEgc2luZ2xldG9uLCBvciBpZiBjYXNlLWZvbGRpbmcgaW4gYSB1bmlieXRl CisgICAgICAgICAgICAgICAgIGxvY2FsZSBhbmQgVCdzIG1lbWJlcnMgYWxsIGNhc2UtZm9sZCB0 byB0aGUgc2FtZSBjaGFyLAorICAgICAgICAgICAgICAgICBjb252ZXJ0IFQgdG8gb25lIG9mIGl0 cyBtZW1iZXJzLiAgT3RoZXJ3aXNlLCBkbworICAgICAgICAgICAgICAgICBub3RoaW5nIGZ1cnRo ZXIgd2l0aCBULiAgKi8KKyAgICAgICAgICAgICAgY2hhcmNsYXNzICpjY2wgPSAmZC0+Y2hhcmNs YXNzZXNbdCAtIENTRVRdOworICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgZm9y IChqID0gMDsgaiA8IE5PVENIQVI7IGorKykKKyAgICAgICAgICAgICAgICBpZiAodHN0Yml0IChq LCAqY2NsKSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBpZiAoISAo aiA8IE5PVENIQVIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1wID0g YWxsb2NtdXN0IChtcCwgMik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICAgIHQgPSBqOworICAgICAgICAgICAgICB3aGlsZSAoKytqIDwg Tk9UQ0hBUikKKyAgICAgICAgICAgICAgICBpZiAodHN0Yml0IChqLCAqY2NsKQorICAgICAgICAg ICAgICAgICAgICAmJiAhIChjYXNlX2ZvbGRfdW5pYnl0ZQorICAgICAgICAgICAgICAgICAgICAg ICAgICAmJiB0b3VwcGVyIChqKSA9PSB0b3VwcGVyICh0KSkpCisgICAgICAgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgICAgICAgaWYgKGogPCBOT1RDSEFSKQorICAgICAgICAgICAgICAgIHsK KyAgICAgICAgICAgICAgICAgIG1wID0gYWxsb2NtdXN0IChtcCwgMik7CisgICAgICAgICAgICAg ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAg ICBzaXplX3QgcmogPSByaSArIDI7CisgICAgICAgICAgaWYgKGQtPnRva2Vuc1tyaSArIDFdID09 IENBVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9yICg7IHJqIDwgZC0+dGluZGV4 IC0gMTsgcmogKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAo KHJqICE9IHJpICYmIChkLT50b2tlbnNbcmpdIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHx8IE5PVENIQVIgPD0gZC0+dG9rZW5zW3JqXSkpCisgICAgICAgICAgICAg ICAgICAgICAgfHwgZC0+dG9rZW5zW3JqICsgMV0gIT0gQ0FUKQorICAgICAgICAgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgbXAg PSBhbGxvY211c3QgKG1wLCAoKHJqIC0gcmkpID4+IDEpICsgMSk7CisgICAgICAgICAgbXAtPmlz WzBdID0gbXAtPmxlZnRbMF0gPSBtcC0+cmlnaHRbMF0KKyAgICAgICAgICAgID0gY2FzZV9mb2xk X3VuaWJ5dGUgPyB0b3VwcGVyICh0KSA6IHQ7CisKKyAgICAgICAgICBmb3IgKGkgPSAxOyByaSAr IDIgPCByajsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICByaSArPSAyOworICAg ICAgICAgICAgICB0ID0gZC0+dG9rZW5zW3JpXTsKKyAgICAgICAgICAgICAgbXAtPmlzW2ldID0g bXAtPmxlZnRbaV0gPSBtcC0+cmlnaHRbaV0KKyAgICAgICAgICAgICAgICA9IGNhc2VfZm9sZF91 bmlieXRlID8gdG91cHBlciAodCkgOiB0OworICAgICAgICAgICAgfQorICAgICAgICAgIG1wLT5p c1tpXSA9IG1wLT5sZWZ0W2ldID0gbXAtPnJpZ2h0W2ldID0gJ1wwJzsKKyAgICAgICAgICBtcC0+ aW4gPSBlbmxpc3QgKG1wLT5pbiwgbXAtPmlzLCBpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAg ICAgfQorICAgIH0KKyBkb25lOjsKKworICBzdHJ1Y3QgZGZhbXVzdCAqZG0gPSBOVUxMOworICBp ZiAoKnJlc3VsdCkKKyAgICB7CisgICAgICBkbSA9IHhtYWxsb2MgKHNpemVvZiAqZG0pOworICAg ICAgZG0tPmV4YWN0ID0gZXhhY3Q7CisgICAgICBkbS0+YmVnbGluZSA9IGJlZ2xpbmU7CisgICAg ICBkbS0+ZW5kbGluZSA9IGVuZGxpbmU7CisgICAgICBkbS0+bXVzdCA9IHhzdHJkdXAgKHJlc3Vs dCk7CisgICAgfQorCisgIHdoaWxlIChtcCkKKyAgICB7CisgICAgICBtdXN0ICpwcmV2ID0gbXAt PnByZXY7CisgICAgICBmcmVlbXVzdCAobXApOworICAgICAgbXAgPSBwcmV2OworICAgIH0KKwor ICByZXR1cm4gZG07Cit9CisKK3ZvaWQKK2RmYW11c3RmcmVlIChzdHJ1Y3QgZGZhbXVzdCAqZG0p Cit7CisgIGZyZWUgKGRtLT5tdXN0KTsKKyAgZnJlZSAoZG0pOworfQorCitzdHJ1Y3QgZGZhICoK K2RmYWFsbG9jICh2b2lkKQoreworICByZXR1cm4geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGZh KSk7Cit9CisKKy8qIHZpbTpzZXQgc2hpZnR3aWR0aD0yOiAqLwpkaWZmIC0tZ2l0IGEvc2VkL2Rm YS5oIGIvc2VkL2RmYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGEw ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWQvZGZhLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIGRm YS5oIC0gZGVjbGFyYXRpb25zIGZvciBHTlUgZGV0ZXJtaW5pc3RpYyByZWdleHAgY29tcGlsZXIK KyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5OCwgMjAwNywgMjAwOS0yMDE2IEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAg IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5 b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBX SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m CisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3Jp dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFu a2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBICov CisKKy8qIFdyaXR0ZW4gSnVuZSwgMTk4OCBieSBNaWtlIEhhZXJ0ZWwgKi8KKworI2luY2x1ZGUg PHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisj aW5jbHVkZSAieGFsbG9jLmgiIC8qIGZvciBfR0xfQVRUUklCVVRFX01BTExPQyAqLworCisvKiBF bGVtZW50IG9mIGEgbGlzdCBvZiBzdHJpbmdzLCBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMga25v d24gdG8KKyAgIGFwcGVhciBpbiBhbnkgUi5FLiBtYXRjaGluZyB0aGUgREZBLiAqLworc3RydWN0 IGRmYW11c3QKK3sKKyAgYm9vbCBleGFjdDsKKyAgYm9vbCBiZWdsaW5lOworICBib29sIGVuZGxp bmU7CisgIGNoYXIgKm11c3Q7Cit9OworCisvKiBUaGUgZGZhIHN0cnVjdHVyZS4gSXQgaXMgY29t cGxldGVseSBvcGFxdWUuICovCitzdHJ1Y3QgZGZhOworCisvKiBFbnRyeSBwb2ludHMuICovCisK Ky8qIEFsbG9jYXRlIGEgc3RydWN0IGRmYS4gIFRoZSBzdHJ1Y3QgZGZhIGlzIGNvbXBsZXRlbHkg b3BhcXVlLgorICAgVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIHBhc3NlZCBkaXJlY3Rs eSB0byBmcmVlKCkgYWZ0ZXIKKyAgIGNhbGxpbmcgZGZhZnJlZSgpIG9uIGl0LiAqLworZXh0ZXJu IHN0cnVjdCBkZmEgKmRmYWFsbG9jICh2b2lkKSBfR0xfQVRUUklCVVRFX01BTExPQzsKKworLyog QnVpbGQgYW5kIHJldHVybiB0aGUgc3RydWN0IGRmYW11c3QgZnJvbSB0aGUgZ2l2ZW4gc3RydWN0 IGRmYS4gKi8KK2V4dGVybiBzdHJ1Y3QgZGZhbXVzdCAqZGZhbXVzdCAoc3RydWN0IGRmYSBjb25z dCAqKTsKKworLyogRnJlZSB0aGUgc3RvcmFnZSBoZWxkIGJ5IHRoZSBjb21wb25lbnRzIG9mIGEg c3RydWN0IGRmYW11c3QuICovCitleHRlcm4gdm9pZCBkZmFtdXN0ZnJlZSAoc3RydWN0IGRmYW11 c3QgKik7CisKKy8qIGRmYXN5bnRheCgpIHRha2VzIHRocmVlIGFyZ3VtZW50czsgdGhlIGZpcnN0 IHNldHMgdGhlIHN5bnRheCBiaXRzIGRlc2NyaWJlZAorICAgZWFybGllciBpbiB0aGlzIGZpbGUs IHRoZSBzZWNvbmQgc2V0cyB0aGUgY2FzZS1mb2xkaW5nIGZsYWcsIGFuZCB0aGUKKyAgIHRoaXJk IHNwZWNpZmllcyB0aGUgbGluZSB0ZXJtaW5hdG9yLiAqLworZXh0ZXJuIHZvaWQgZGZhc3ludGF4 IChyZWdfc3ludGF4X3QsIGJvb2wsIHVuc2lnbmVkIGNoYXIpOworCisvKiBDb21waWxlIHRoZSBn aXZlbiBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aCBpbnRvIHRoZSBnaXZlbiBzdHJ1Y3QgZGZh LgorICAgRmluYWwgYXJndW1lbnQgaXMgYSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0byBidWls ZCBhIHNlYXJjaGluZyBvciBhbgorICAgZXhhY3QgbWF0Y2hlci4gKi8KK2V4dGVybiB2b2lkIGRm YWNvbXAgKGNoYXIgY29uc3QgKiwgc2l6ZV90LCBzdHJ1Y3QgZGZhICosIGJvb2wpOworCisvKiBT ZWFyY2ggdGhyb3VnaCBhIGJ1ZmZlciBsb29raW5nIGZvciBhIG1hdGNoIHRvIHRoZSBnaXZlbiBz dHJ1Y3QgZGZhLgorICAgRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBtYXRj aGluZyB0aGUgcmVnZXhwIGluIHRoZQorICAgYnVmZmVyLCBhbmQgdGhlIHNob3J0ZXN0IHBvc3Np YmxlIHZlcnNpb24gdGhlcmVvZi4gIFJldHVybiBhIHBvaW50ZXIgdG8KKyAgIHRoZSBmaXJzdCBj aGFyYWN0ZXIgYWZ0ZXIgdGhlIG1hdGNoLCBvciBOVUxMIGlmIG5vbmUgaXMgZm91bmQuICBCRUdJ TgorICAgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgYW5kIEVORCBwb2lu dHMgdG8gdGhlIGZpcnN0IGJ5dGUKKyAgIGFmdGVyIGl0cyBlbmQuICBOb3RlIGhvd2V2ZXIgdGhh dCB3ZSBzdG9yZSBhIHNlbnRpbmVsIGJ5dGUgKHVzdWFsbHkKKyAgIG5ld2xpbmUpIGluICpFTkQs IHNvIHRoZSBhY3R1YWwgYnVmZmVyIG11c3QgYmUgb25lIGJ5dGUgbG9uZ2VyLgorICAgV2hlbiBB TExPV19OTCBpcyB0cnVlLCBuZXdsaW5lcyBtYXkgYXBwZWFyIGluIHRoZSBtYXRjaGluZyBzdHJp bmcuCisgICBJZiBDT1VOVCBpcyBub24tTlVMTCwgaW5jcmVtZW50ICpDT1VOVCBvbmNlIGZvciBl YWNoIG5ld2xpbmUgcHJvY2Vzc2VkLgorICAgRmluYWxseSwgaWYgQkFDS1JFRiBpcyBub24tTlVM TCBzZXQgKkJBQ0tSRUYgdG8gaW5kaWNhdGUgd2hldGhlciB3ZQorICAgZW5jb3VudGVyZWQgYSBi YWNrLXJlZmVyZW5jZS4gIFRoZSBjYWxsZXIgY2FuIHVzZSB0aGlzIHRvIGRlY2lkZQorICAgd2hl dGhlciB0byBmYWxsIGJhY2sgb24gYSBiYWNrdHJhY2tpbmcgbWF0Y2hlci4gICovCitleHRlcm4g Y2hhciAqZGZhZXhlYyAoc3RydWN0IGRmYSAqZCwgY2hhciBjb25zdCAqYmVnaW4sIGNoYXIgKmVu ZCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X25sLCBzaXplX3QgKmNvdW50LCBi b29sICpiYWNrcmVmKTsKKworLyogUmV0dXJuIGEgc3VwZXJzZXQgZm9yIEQuICBUaGUgc3VwZXJz ZXQgbWF0Y2hlcyBldmVyeXRoaW5nIHRoYXQgRAorICAgbWF0Y2hlcywgYWxvbmcgd2l0aCBzb21l IG90aGVyIHN0cmluZ3MgKHRob3VnaCB0aGUgbGF0dGVyIHNob3VsZCBiZQorICAgcmFyZSwgZm9y IGVmZmljaWVuY3kgcmVhc29ucykuICBSZXR1cm4gYSBudWxsIHBvaW50ZXIgaWYgbm8gdXNlZnVs CisgICBzdXBlcnNldCBpcyBhdmFpbGFibGUuICAqLworZXh0ZXJuIHN0cnVjdCBkZmEgKmRmYXN1 cGVyc2V0IChzdHJ1Y3QgZGZhIGNvbnN0ICpkKSBfR0xfQVRUUklCVVRFX1BVUkU7CisKKy8qIFRo ZSBERkEgaXMgbGlrZWx5IHRvIGJlIGZhc3QuICAqLworZXh0ZXJuIGJvb2wgZGZhaXNmYXN0IChz dHJ1Y3QgZGZhIGNvbnN0ICopIF9HTF9BVFRSSUJVVEVfUFVSRTsKKworLyogRnJlZSB0aGUgc3Rv cmFnZSBoZWxkIGJ5IHRoZSBjb21wb25lbnRzIG9mIGEgc3RydWN0IGRmYS4gKi8KK2V4dGVybiB2 b2lkIGRmYWZyZWUgKHN0cnVjdCBkZmEgKik7CisKKy8qIEVycm9yIGhhbmRsaW5nLiAqLworCisv KiBkZmF3YXJuKCkgaXMgY2FsbGVkIGJ5IHRoZSByZWdleHAgcm91dGluZXMgd2hlbmV2ZXIgYSBy ZWdleCBpcyBjb21waWxlZAorICAgdGhhdCBsaWtlbHkgZG9lc24ndCBkbyB3aGF0IHRoZSB1c2Vy IHdhbnRlZC4gIEl0IHRha2VzIGEgc2luZ2xlCisgICBhcmd1bWVudCwgYSBOVUwtdGVybWluYXRl ZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2l0dWF0aW9uLiAgVGhlIHVzZXIKKyAgIG11c3Qgc3Vw cGx5IGEgZGZhd2Fybi4gICovCitleHRlcm4gdm9pZCBkZmF3YXJuIChjb25zdCBjaGFyICopOwor CisvKiBkZmFlcnJvcigpIGlzIGNhbGxlZCBieSB0aGUgcmVnZXhwIHJvdXRpbmVzIHdoZW5ldmVy IGFuIGVycm9yIG9jY3Vycy4gIEl0CisgICB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgYSBOVUwt dGVybWluYXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgICBUaGUgdXNlciBtdXN0 IHN1cHBseSBhIGRmYWVycm9yLiAgKi8KK2V4dGVybiBfTm9yZXR1cm4gdm9pZCBkZmFlcnJvciAo Y29uc3QgY2hhciAqKTsKKworZXh0ZXJuIGJvb2wgdXNpbmdfdXRmOCAodm9pZCk7CmRpZmYgLS1n aXQgYS9zZWQvbG9jYWwubWsgYi9zZWQvbG9jYWwubWsKaW5kZXggN2Y4OGZhOC4uZWYyZmIzZSAx MDA2NDQKLS0tIGEvc2VkL2xvY2FsLm1rCisrKyBiL3NlZC9sb2NhbC5tawpAQCAtMTcsMTUgKzE3 LDE5IEBAIGJpbl9QUk9HUkFNUyArPSBzZWQvc2VkCgogbG9jYWxlZGlyID0gJChkYXRhZGlyKS9s b2NhbGUKCi1zZWRfc2VkX1NPVVJDRVMgPSBzZWQvc2VkLmMgXAotICAgICAgICAgICAgICAgICAg c2VkL2NvbXBpbGUuYyBcCi0gICAgICAgICAgICAgICAgICBzZWQvZXhlY3V0ZS5jIFwKLSAgICAg ICAgICAgICAgICAgIHNlZC9yZWdleHAuYyBcCi0gICAgICAgICAgICAgICAgICBzZWQvbWJjcy5j IFwKLSAgICAgICAgICAgICAgICAgIHNlZC91dGlscy5jCi0KLW5vaW5zdF9IRUFERVJTICs9IHNl ZC9zZWQuaCBcCi0gICAgICAgICAgICAgICAgICBzZWQvdXRpbHMuaAorc2VkX3NlZF9TT1VSQ0VT ID0JXAorICBzZWQvY29tcGlsZS5jCQlcCisgIHNlZC9kZmEuYwkJXAorICBzZWQvZXhlY3V0ZS5j CQlcCisgIHNlZC9tYmNzLmMJCVwKKyAgc2VkL3JlZ2V4cC5jCQlcCisgIHNlZC9zZWQuYwkJXAor ICBzZWQvdXRpbHMuYworCitub2luc3RfSEVBREVSUyArPQlcCisgIHNlZC9kZmEuaAkJXAorICBz ZWQvc2VkLmgJCVwKKyAgc2VkL3V0aWxzLmgKCiBzZWRfc2VkX0NQUEZMQUdTID0gJChBTV9DUFBG TEFHUykgIC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIKIHNlZF9zZWRfQ0ZMQUdTID0gJChB TV9DRkxBR1MpICQoV0FSTl9DRkxBR1MpICQoV0VSUk9SX0NGTEFHUykKZGlmZiAtLWdpdCBhL3Nl ZC9yZWdleHAuYyBiL3NlZC9yZWdleHAuYwppbmRleCA5OGY5ZTYxLi42YzY5ODUzIDEwMDY0NAot LS0gYS9zZWQvcmVnZXhwLmMKKysrIGIvc2VkL3JlZ2V4cC5jCkBAIC0zOSw2ICszOSwyMSBAQCBz dGF0aWMgY29uc3QgY2hhciBlcnJvcnNbXSA9CgogDAoKK3ZvaWQKK2RmYWVycm9yIChjaGFyIGNv bnN0ICptZXNnKQoreworICBwYW5pYyAoIiVzIiwgbWVzZyk7Cit9CisKK3ZvaWQKK2RmYXdhcm4g KGNoYXIgY29uc3QgKm1lc2cpCit7CisgIGlmICghZ2V0ZW52ICgiUE9TSVhMWV9DT1JSRUNUIikp CisgICAgZGZhZXJyb3IgKG1lc2cpOworfQorCisMCisKIHN0YXRpYyB2b2lkCiBjb21waWxlX3Jl Z2V4XzEgKHN0cnVjdCByZWdleCAqbmV3X3JlZ2V4LCBpbnQgbmVlZGVkX3N1YikKIHsKQEAgLTEy Niw2ICsxNDEsMTAgQEAgY29tcGlsZV9yZWdleF8xIChzdHJ1Y3QgcmVnZXggKm5ld19yZWdleCwg aW50IG5lZWRlZF9zdWIpCiAgICAgICAgICAgICAgIG5lZWRlZF9zdWIgLSAxKTsKICAgICAgIGJh ZF9wcm9nKGJ1Zik7CiAgICAgfQorCisgIGRmYXN5bnRheCAoc3ludGF4LCAobmV3X3JlZ2V4LT5m bGFncyAmIFJFR19JQ0FTRSkgIT0gMCwgJ1xuJyk7CisgIG5ld19yZWdleC0+ZGZhID0gZGZhYWxs b2MgKCk7CisgIGRmYWNvbXAgKG5ld19yZWdleC0+cmUsIG5ld19yZWdleC0+c3osIG5ld19yZWdl eC0+ZGZhLCAxKTsKIH0KCiBzdHJ1Y3QgcmVnZXggKgpAQCAtMjM2LDYgKzI1NSwyNiBAQCBtYXRj aF9yZWdleChzdHJ1Y3QgcmVnZXggKnJlZ2V4LCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4sCgog ICByZWdleC0+cGF0dGVybi5yZWdzX2FsbG9jYXRlZCA9IFJFR1NfUkVBTExPQ0FURTsKCisgIGlm IChidWZfc3RhcnRfb2Zmc2V0ID09IDApCisgICAgeworICAgICAgc3RydWN0IGRmYSAqc3VwZXJz ZXQgPSBkZmFzdXBlcnNldCAocmVnZXgtPmRmYSk7CisKKyAgICAgIGlmIChzdXBlcnNldCAmJiAh ZGZhZXhlYyAoc3VwZXJzZXQsIGJ1ZiwgYnVmICsgYnVmbGVuLCB0cnVlLCBOVUxMLCBOVUxMKSkK KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGlmICgoIXJlZ3NpemUgJiYgcmVnZXgtPnBhdHRl cm4ubmV3bGluZV9hbmNob3IpCisgICAgICAgICAgfHwgKCFzdXBlcnNldCAmJiBkZmFpc2Zhc3Qg KHJlZ2V4LT5kZmEpKSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgYmFja3JlZiA9IGZhbHNl OworCisgICAgICAgICAgaWYgKCFkZmFleGVjIChyZWdleC0+ZGZhLCBidWYsIGJ1ZiArIGJ1Zmxl biwgdHJ1ZSwgTlVMTCwgJmJhY2tyZWYpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAg ICAgICBpZiAoIXJlZ3NpemUgJiYgcmVnZXgtPnBhdHRlcm4ubmV3bGluZV9hbmNob3IgJiYgIWJh Y2tyZWYpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKwogICByZXQg PSByZV9zZWFyY2ggKCZyZWdleC0+cGF0dGVybiwgYnVmLCBidWZsZW4sIGJ1Zl9zdGFydF9vZmZz ZXQsCiAgICAgICAgICAgICAgICAgICAgYnVmbGVuIC0gYnVmX3N0YXJ0X29mZnNldCwKICAgICAg ICAgICAgICAgICAgICByZWdzaXplID8gcmVnYXJyYXkgOiBOVUxMKTsKZGlmZiAtLWdpdCBhL3Nl ZC9zZWQuaCBiL3NlZC9zZWQuaAppbmRleCBiYmRkZDI1Li41YzI0OWNmIDEwMDY0NAotLS0gYS9z ZWQvc2VkLmgKKysrIGIvc2VkL3NlZC5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8Y29u ZmlnLmg+CiAjaW5jbHVkZSAiYmFzaWNkZWZzLmgiCiAjaW5jbHVkZSAicmVnZXguaCIKKyNpbmNs dWRlICJkZmEuaCIKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgInVubG9ja2VkLWlvLmgi CgpAQCAtNTAsNiArNTEsNyBAQCBzdHJ1Y3QgcmVnZXggewogICByZWdleF90IHBhdHRlcm47CiAg IGludCBmbGFnczsKICAgc2l6ZV90IHN6OworICBzdHJ1Y3QgZGZhICpkZmE7CiAgIGNoYXIgcmVb MV07CiB9OwoKLS0gCjIuOC4wLXJjMgoK --001a113cc7fc50d9a3053971f23d-- From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 08 19:29:55 2016 Received: (at 24161) by debbugs.gnu.org; 8 Aug 2016 23:29:55 +0000 Received: from localhost ([127.0.0.1]:60455 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWtzX-0001SQ-1e for submit@debbugs.gnu.org; Mon, 08 Aug 2016 19:29:55 -0400 Received: from mailgw04.kcn.ne.jp ([61.86.7.211]:48135) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWtzT-0001S9-3x for 24161@debbugs.gnu.org; Mon, 08 Aug 2016 19:29:53 -0400 Received: from mxs01-s (mailgw1.kcn.ne.jp [61.86.15.233]) by mailgw04.kcn.ne.jp (Postfix) with ESMTP id A4C5280604 for <24161@debbugs.gnu.org>; Tue, 9 Aug 2016 08:29:43 +0900 (JST) X-matriXscan-loop-detect: 42b83e5eea70b46334d716e3f4744d70a61883cc Received: from mail04.kcn.ne.jp ([61.86.6.183]) by mxs01-s with ESMTP; Tue, 09 Aug 2016 08:29:42 +0900 (JST) Received: from [10.120.1.17] (i118-21-128-66.s30.a048.ap.plala.or.jp [118.21.128.66]) by mail04.kcn.ne.jp (Postfix) with ESMTPA id 36A7A1290022; Tue, 9 Aug 2016 08:29:42 +0900 (JST) Date: Tue, 09 Aug 2016 08:29:42 +0900 From: Norihiro Tanaka To: Jim Meyering Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher In-Reply-To: References: <20160807095035.749B.27F6AC2D@kcn.ne.jp> Message-Id: <20160809082942.7340.27F6AC2D@kcn.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.65.07 [ja] X-matriXscan-Sophos-AV: Clean X-matriXscan-Action: Approve X-matriXscan: Uncategorized X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 24161 Cc: Assaf Gordon , 24161@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On Sat, 6 Aug 2016 19:20:22 -0700 Jim Meyering wrote: > Thanks again. > I've revised it as follows and expect to push tomorrow: > - remove the abort and comment from dfaerror -- should is not > necessary, given the _Noreturn attribute. > - adjusted commit log and NEWS entry, also moving the "Improvements" > section to the top > - sorted source file names in local.mk (they were not sorted before, either) > - added the "make syntax-check"-required mention of sed/dfa.c in > po/POTFILES.in Thanks for adjusting. I agree the all changes. From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 08 20:53:34 2016 Received: (at 24161-done) by debbugs.gnu.org; 9 Aug 2016 00:53:34 +0000 Received: from localhost ([127.0.0.1]:60480 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWvIU-0003Vd-Ay for submit@debbugs.gnu.org; Mon, 08 Aug 2016 20:53:34 -0400 Received: from mail-oi0-f51.google.com ([209.85.218.51]:34088) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWvIQ-0003VO-I4 for 24161-done@debbugs.gnu.org; Mon, 08 Aug 2016 20:53:33 -0400 Received: by mail-oi0-f51.google.com with SMTP id l203so134841459oib.1 for <24161-done@debbugs.gnu.org>; Mon, 08 Aug 2016 17:53:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=ied2LqAzAPcZx86dUDg9slFFA2bSAObH17Mg0+Q8If0=; b=WrNjxBUN3enkV9rXxphiIgXJrMp9MLoXRTntMwQgn+JRN8X463MBbxqzDCLRWnw/Li ax6S+NaaRC4Zw0JZfPnIhcDEXmJxzlRMR0wppReAbDM0FE5MfRd7Vxtl6g7Y76joLdNY 6FpE2q5+honsRMv/vjR+NGACBo6RnGq0hAit8UmHt0Fwr3wOBk+UT+vSEI4Bwm++MrBE SW1kLy2NoZy9IHRkXWnrggvlQoXq6FQ9GsnBiGO/OgDZBcgjSwK9awA2B/Trqct091wo MxCdWcFLR5LjrUlDCa/1ZGJUUi5WD2aVKutjeLEAkcP2NH+iIOJy/hKveevHwsV/U2P4 RFcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=ied2LqAzAPcZx86dUDg9slFFA2bSAObH17Mg0+Q8If0=; b=T2BnnSlPi0QknxRVsZrpk6nZuFswN1Wd/AEXrs4SYFBg2CIm/zbM0KGv7LahQcatrM XWtALYT8kjrvFUALlcvfdGKq5d61Rqy/qCOJjCPCXml5mpHzVfX4VEoFB8k9GMS+Cm7Z VkPiBlVZGi37PuwSNe0BGLZQFUO8n+qY2mZmYH13KPAnn8BgaFkLeCzdTPd94ZLNPLKH 5sr4wM3b0Jki40j7OUJYlSSUeIWyyi3XSpazeXKIh2H5pHvql708iDYI3Dh9j3o0hHro 1gz2ezqtXbw1UF5P9t6olXnj9LQg04EqB1F1XrbjvSt9djwda0E6zDbxQeCDFlmhDLFW vy4w== X-Gm-Message-State: AEkoousAT0y9r8Rw0kqh954sECH+0ibKIJsv5By3xuzcWxcvFTULdiWLRuGcbt51QLAZWT6yWiG/lFH+Z5u2ng== X-Received: by 10.202.81.214 with SMTP id f205mr4776481oib.161.1470704004850; Mon, 08 Aug 2016 17:53:24 -0700 (PDT) MIME-Version: 1.0 Received: by 10.202.236.16 with HTTP; Mon, 8 Aug 2016 17:53:04 -0700 (PDT) In-Reply-To: <20160809082942.7340.27F6AC2D@kcn.ne.jp> References: <20160807095035.749B.27F6AC2D@kcn.ne.jp> <20160809082942.7340.27F6AC2D@kcn.ne.jp> From: Jim Meyering Date: Mon, 8 Aug 2016 17:53:04 -0700 X-Google-Sender-Auth: 9pM1kkpDI_vH9puENxbzrzzKudk Message-ID: Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher To: Norihiro Tanaka Content-Type: text/plain; charset=UTF-8 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 24161-done Cc: 24161-done@debbugs.gnu.org, Assaf Gordon X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) On Mon, Aug 8, 2016 at 4:29 PM, Norihiro Tanaka wrote: > > On Sat, 6 Aug 2016 19:20:22 -0700 > Jim Meyering wrote: > >> Thanks again. >> I've revised it as follows and expect to push tomorrow: >> - remove the abort and comment from dfaerror -- should is not >> necessary, given the _Noreturn attribute. >> - adjusted commit log and NEWS entry, also moving the "Improvements" >> section to the top >> - sorted source file names in local.mk (they were not sorted before, either) >> - added the "make syntax-check"-required mention of sed/dfa.c in >> po/POTFILES.in > > Thanks for adjusting. I agree the all changes. Pushed. From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 08 21:33:56 2016 Received: (at 24161-done) by debbugs.gnu.org; 9 Aug 2016 01:33:56 +0000 Received: from localhost ([127.0.0.1]:60499 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWvvY-0004RY-1E for submit@debbugs.gnu.org; Mon, 08 Aug 2016 21:33:56 -0400 Received: from mail-oi0-f49.google.com ([209.85.218.49]:34206) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWvvV-0004RJ-70 for 24161-done@debbugs.gnu.org; Mon, 08 Aug 2016 21:33:54 -0400 Received: by mail-oi0-f49.google.com with SMTP id l203so77233oib.1 for <24161-done@debbugs.gnu.org>; Mon, 08 Aug 2016 18:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=mJUXUTJxg1fSwFpYSyBTd9xlY6ZiCYIAPPE6sezo42I=; b=KCnl2i2xVe0frf3gkZwZi2goxM+GRJs59tpZtILMi7XaRidZvMzE4BYCc2dVfF10qu ortlwIHKqya3pgQ/WWiujmWoSXNxykp8T6uiBG1c0A8MsjpsG3ZijWFaFNWmESlycfp0 IxiAZMFYUmhVYCKV5Yf6Mnsnzy723KI4yTaoe2gwHLu6uVqR3XyGVZqhrQ4s8SrJwUtC A5a4S0SLt7DBVMSOUAvEaOwWV7P9T4/HG/cJ0P8twF8UeqsE33msK7t8mIBPgUqDu3+S sJcrED3tjaEQ+/HsM4q4QaazJgRnHugfPJ8AxP1kZtVVnO2Ku2xYSqIqEQjPUYfqRtvi S1kQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=mJUXUTJxg1fSwFpYSyBTd9xlY6ZiCYIAPPE6sezo42I=; b=L0BKw/8hOjzFhJEZfZ6+OTXTnR8hLPeLPWiVlPeBmytzjclTW0HKBd6PKfl2qE81+L 8MfZlE5Wrr7stWvv7U3jro0AqgXk5P/idth5adsiacBZmaQEwnPSHr/RkeYaOmjL8hN9 c/dg4qz2EZjP10xsSeS8tTzwmg/j/w+5KKEmzbMVvXSvq/btYYZezDsnZbxk8QQJFmvE yp3TtChx6dE6vl4LUg9l3nb0deoKuNP+TbiGKBwIgVbkGDz9ux01O8jtefHKZ/fjuTWQ 7j0bCQadw1OhlpPP8EC4AVAGrR0267+PQqcWmWGKsMByzlhcKxBJ5zZLsIz8XwrCpUpH Dghg== X-Gm-Message-State: AEkoouu/dLZG+xZsA49KD1IefOsNqVY9c9s/xDS57dTEt6+NRJ6Pm4xx5BoYBrmOQGq8dLTtR3lphmjLaJLmbg== X-Received: by 10.157.43.240 with SMTP id u103mr18978620ota.126.1470706427523; Mon, 08 Aug 2016 18:33:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.202.236.16 with HTTP; Mon, 8 Aug 2016 18:33:26 -0700 (PDT) In-Reply-To: References: <20160807095035.749B.27F6AC2D@kcn.ne.jp> <20160809082942.7340.27F6AC2D@kcn.ne.jp> From: Jim Meyering Date: Mon, 8 Aug 2016 18:33:26 -0700 X-Google-Sender-Auth: v6Gc6LPOFE0ay_uTegC-z0D3GI0 Message-ID: Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher To: Norihiro Tanaka Content-Type: multipart/mixed; boundary=001a113cf9402edaca0539998687 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 24161-done Cc: 24161-done@debbugs.gnu.org, Assaf Gordon X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) --001a113cf9402edaca0539998687 Content-Type: text/plain; charset=UTF-8 On Mon, Aug 8, 2016 at 5:53 PM, Jim Meyering wrote: > On Mon, Aug 8, 2016 at 4:29 PM, Norihiro Tanaka wrote: ... >> Thanks for adjusting. I agree the all changes. > > Pushed. Oops. I had not run ASAN-enabled tests with this patch. Doing that exposed many test failures like this: LC_ALL=C ./sed/sed -f ./testsuite/madding.sed \ < ./testsuite/madding.inp | LC_ALL=C tr -d \\r > madding.out ================================================================= ==8797==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x622000019646 at pc 0x0000004e98ce bp 0x7ffee5d23130 sp 0x7ffee5d23128 READ of size 1 at 0x622000019646 thread T0 #0 0x4e98cd in dfaexec_main sed/dfa.c:3078 #1 0x4e98cd in dfaexec_sb sed/dfa.c:3242 #2 0x4ece9f in dfaexec sed/dfa.c:3263 #3 0x4f64ba in match_regex sed/regexp.c:270 #4 0x4f46ac in do_subst sed/execute.c:1024 #5 0x4f46ac in execute_program sed/execute.c:1510 #6 0x4f5997 in process_files sed/execute.c:1678 #7 0x4f6f64 in main sed/sed.c:363 #8 0x7fe665f89730 in __libc_start_main (/lib64/libc.so.6+0x20730) #9 0x407118 in _start (/home/j/w/co/sed/sed/sed+0x407118) which I am fixing with this patch: --001a113cf9402edaca0539998687 Content-Type: text/plain; charset=US-ASCII; name="0001-sed-avoid-one-byte-heap-buffer-overrun.diff" Content-Disposition: attachment; filename="0001-sed-avoid-one-byte-heap-buffer-overrun.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_irmsle5f0 RnJvbSA3ODYyYThhNWFhMjgyZjhmNDE0MTU3ZDU1MGQ5ZmU2NWY0MjQ4OGI5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gTWV5ZXJpbmcgPG1leWVyaW5nQGZiLmNvbT4KRGF0ZTog TW9uLCA4IEF1ZyAyMDE2IDE4OjI5OjAwIC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gc2VkOiBhdm9p ZCBvbmUtYnl0ZSBoZWFwIGJ1ZmZlciBvdmVycnVuCgoqIHNlZC9leGVjdXRlLmMgKERGQV9TTE9Q KTogRGVmaW5lLgoocmVzaXplX2xpbmUpOiBVc2UgaXQgaW4gZWFjaCBsaW5lLXJlbGF0ZWQgYWxs b2NhdGlvbi4KKGxpbmVfaW5pdCk6IExpa2V3aXNlLgoobGluZV9jb3B5KTogTGlrZXdpc2UuCi0t LQogc2VkL2V4ZWN1dGUuYyB8IDEyICsrKysrKysrLS0tLQogMSBmaWxlIGNoYW5nZWQsIDggaW5z ZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zZWQvZXhlY3V0ZS5jIGIv c2VkL2V4ZWN1dGUuYwppbmRleCAzZmUxNWNiLi5iMTA4M2E4IDEwMDY0NAotLS0gYS9zZWQvZXhl Y3V0ZS5jCisrKyBiL3NlZC9leGVjdXRlLmMKQEAgLTQ3LDcgKzQ3LDExIEBACiAjIGRlZmluZSBV TlVTRUQKICNlbmRpZgoKLQwKKy8qIFRoZSBudW1iZXIgb2YgZXh0cmEgYnl0ZXMgdGhhdCBtdXN0 IGJlIGFsbG9jYXRlZC91c2FibGUsIGJleW9uZAorICAgdGhlIGRlY2xhcmVkICJlbmQiIG9mIGVh Y2ggbGluZSBidWZmZXIgdGhhdCBtYXkgYmUgcGFzc2VkIHRvCisgICBtYXRjaF9yZWdleC4gIFRo aXMgaXMgaW1wb3NlZCBieSBpdHMgdXNlIG9mIGRmYWV4ZWMuICAqLworI2RlZmluZSBERkFfU0xP UCAxCisKIC8qIFNlZCBvcGVyYXRlcyBhIGxpbmUgYXQgYSB0aW1lLiAqLwogc3RydWN0IGxpbmUg ewogICBjaGFyICp0ZXh0OwkJLyogUG9pbnRlciB0byBsaW5lIGFsbG9jYXRlZCBieSBtYWxsb2Mu ICovCkBAIC0xNTcsNyArMTYxLDcgQEAgcmVzaXplX2xpbmUgKHN0cnVjdCBsaW5lICpsYiwgc2l6 ZV90IGxlbikKICAgaWYgKGxiLT5hbGxvYyA8IElOSVRJQUxfQlVGRkVSX1NJWkUpCiAgICAgbGIt PmFsbG9jID0gSU5JVElBTF9CVUZGRVJfU0laRTsKCi0gIGxiLT50ZXh0ID0gUkVBTExPQyhsYi0+ dGV4dCwgaW5hY3RpdmUgKyBsYi0+YWxsb2MsIGNoYXIpOworICBsYi0+dGV4dCA9IFJFQUxMT0Mo bGItPnRleHQsIGluYWN0aXZlICsgbGItPmFsbG9jICsgREZBX1NMT1AsIGNoYXIpOwogICBsYi0+ YWN0aXZlID0gbGItPnRleHQgKyBpbmFjdGl2ZTsKIH0KCkBAIC0yODUsNyArMjg5LDcgQEAgc3Ry X2FwcGVuZF9tb2RpZmllZChzdHJ1Y3QgbGluZSAqdG8sIGNvbnN0IGNoYXIgKnN0cmluZywgc2l6 ZV90IGxlbmd0aCwKIHN0YXRpYyB2b2lkCiBsaW5lX2luaXQoc3RydWN0IGxpbmUgKmJ1Ziwgc3Ry dWN0IGxpbmUgKnN0YXRlLCBzaXplX3QgaW5pdGlhbF9zaXplKQogewotICBidWYtPnRleHQgPSBN QUxMT0MoaW5pdGlhbF9zaXplLCBjaGFyKTsKKyAgYnVmLT50ZXh0ID0gTUFMTE9DKGluaXRpYWxf c2l6ZSArIERGQV9TTE9QLCBjaGFyKTsKICAgYnVmLT5hY3RpdmUgPSBidWYtPnRleHQ7CiAgIGJ1 Zi0+YWxsb2MgPSBpbml0aWFsX3NpemU7CiAgIGJ1Zi0+bGVuZ3RoID0gMDsKQEAgLTMzMyw3ICsz MzcsNyBAQCBsaW5lX2NvcHkoc3RydWN0IGxpbmUgKmZyb20sIHN0cnVjdCBsaW5lICp0bywgaW50 IHN0YXRlKQogICAgICAgLyogVXNlIGZyZWUoKStNQUxMT0MoKSBpbnN0ZWFkIG9mIFJFQUxMT0Mo KSB0bwogICAgICAgICAgYXZvaWQgdW5uZWNlc3NhcnkgY29weWluZyBvZiBvbGQgdGV4dC4gKi8K ICAgICAgIGZyZWUodG8tPnRleHQpOwotICAgICAgdG8tPnRleHQgPSBNQUxMT0ModG8tPmFsbG9j LCBjaGFyKTsKKyAgICAgIHRvLT50ZXh0ID0gTUFMTE9DKHRvLT5hbGxvYyArIERGQV9TTE9QLCBj aGFyKTsKICAgICB9CgogICB0by0+YWN0aXZlID0gdG8tPnRleHQ7Ci0tIAoyLjcuNAoK --001a113cf9402edaca0539998687-- From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 09 09:59:38 2016 Received: (at 24161-done) by debbugs.gnu.org; 9 Aug 2016 13:59:39 +0000 Received: from localhost ([127.0.0.1]:33246 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bX7ZC-0007pE-N7 for submit@debbugs.gnu.org; Tue, 09 Aug 2016 09:59:38 -0400 Received: from mailgw04.kcn.ne.jp ([61.86.7.211]:37591) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bX7ZA-0007oz-AV for 24161-done@debbugs.gnu.org; Tue, 09 Aug 2016 09:59:37 -0400 Received: from mxs02-s (mailgw2.kcn.ne.jp [61.86.15.234]) by mailgw04.kcn.ne.jp (Postfix) with ESMTP id EE6928060B for <24161-done@debbugs.gnu.org>; Tue, 9 Aug 2016 22:59:28 +0900 (JST) X-matriXscan-loop-detect: ae9eac3b9599a5d71b8918a8c8379c743317a5d1 Received: from mail04.kcn.ne.jp ([61.86.6.183]) by mxs02-s with ESMTP; Tue, 09 Aug 2016 22:59:27 +0900 (JST) Received: from [10.120.1.35] (i118-21-128-66.s30.a048.ap.plala.or.jp [118.21.128.66]) by mail04.kcn.ne.jp (Postfix) with ESMTPA id A7D601290022; Tue, 9 Aug 2016 22:59:26 +0900 (JST) Date: Tue, 09 Aug 2016 22:59:33 +0900 From: Norihiro Tanaka To: Jim Meyering Subject: Re: bug#24161: [PATCH 2/2] sed: speed up matching by reguler expression with dfa matcher In-Reply-To: References: Message-Id: <20160809225932.654C.27F6AC2D@kcn.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.65.07 [ja] X-matriXscan-Sophos-AV: Clean X-matriXscan-Action: Approve X-matriXscan: Uncategorized X-Spam-Score: -0.4 (/) X-Debbugs-Envelope-To: 24161-done Cc: 24161-done@debbugs.gnu.org, Assaf Gordon X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.4 (/) On Mon, 8 Aug 2016 18:33:26 -0700 Jim Meyering wrote: > On Mon, Aug 8, 2016 at 5:53 PM, Jim Meyering wrote: > > On Mon, Aug 8, 2016 at 4:29 PM, Norihiro Tanaka wrote: > ... > >> Thanks for adjusting. I agree the all changes. > > > > Pushed. > > Oops. I had not run ASAN-enabled tests with this patch. > Doing that exposed many test failures like this: > > LC_ALL=C ./sed/sed -f ./testsuite/madding.sed \ > < ./testsuite/madding.inp | LC_ALL=C tr -d \\r > madding.out > ================================================================= > ==8797==ERROR: AddressSanitizer: heap-buffer-overflow on address > 0x622000019646 at pc 0x0000004e98ce bp 0x7ffee5d23130 sp > 0x7ffee5d23128 > READ of size 1 at 0x622000019646 thread T0 > #0 0x4e98cd in dfaexec_main sed/dfa.c:3078 > #1 0x4e98cd in dfaexec_sb sed/dfa.c:3242 > #2 0x4ece9f in dfaexec sed/dfa.c:3263 > #3 0x4f64ba in match_regex sed/regexp.c:270 > #4 0x4f46ac in do_subst sed/execute.c:1024 > #5 0x4f46ac in execute_program sed/execute.c:1510 > #6 0x4f5997 in process_files sed/execute.c:1678 > #7 0x4f6f64 in main sed/sed.c:363 > #8 0x7fe665f89730 in __libc_start_main (/lib64/libc.so.6+0x20730) > #9 0x407118 in _start (/home/j/w/co/sed/sed/sed+0x407118) > > which I am fixing with this patch: Special thanks for catching up abd fixing heap-buffer-overflow bug. From unknown Mon Jun 16 23:48:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Wed, 07 Sep 2016 11:24:04 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator