X-Loop: help-debbugs@HIDDEN Subject: bug#16472: PD: gzip - tree overflow protection algorithm doubt/suggestion Resent-From: "Krzysztof Rybak" <krzysztofrybak6@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: bug-gzip@HIDDEN Resent-Date: Thu, 16 Jan 2014 23:52:02 +0000 Resent-Message-ID: <handler.16472.B.138991629913234 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: report 16472 X-GNU-PR-Package: gzip X-GNU-PR-Keywords: To: 16472 <at> debbugs.gnu.org X-Debbugs-Original-To: bug-gzip@HIDDEN Received: via spool by submit <at> debbugs.gnu.org id=B.138991629913234 (code B ref -1); Thu, 16 Jan 2014 23:52:02 +0000 Received: (at submit) by debbugs.gnu.org; 16 Jan 2014 23:51:39 +0000 Received: from localhost ([127.0.0.1]:54198 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1W3wim-0003RG-64 for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:51:38 -0500 Received: from eggs.gnu.org ([208.118.235.92]:47842) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZx-00030T-Ei for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZq-0005Co-6W for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:29 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:38418) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZq-0005Ck-2W for submit <at> debbugs.gnu.org; Thu, 16 Jan 2014 18:42:22 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49550) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZj-0003w0-PC for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZd-0005BV-La for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:15 -0500 Received: from mx3.wp.pl ([212.77.101.7]:60584) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <krzysztofrybak6@HIDDEN>) id 1W3wZc-0005B6-RL for bug-gzip@HIDDEN; Thu, 16 Jan 2014 18:42:09 -0500 Received: (wp-smtpd smtp.wp.pl 22258 invoked from network); 16 Jan 2014 22:55:26 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wp.pl; s=1024a; t=1389909326; bh=MKNIhoFDQL10QkUBa8P81rTVKejLIfcM4ht8i7kZ+uI=; h=From:To:Subject; b=Hy4M0yOHaoDZLTBVjT0vg6OA4EyBuonOjNP8qRHJKWwzxp/sFpTICXnbEm7aHOpEc Cr2UQwx2Y4DXOxIkDUN3y2GKmYm49uVhRvBMHUZ7NGcA2rQbIOoEkOVUrU5Kzpg+A/ G1MB3eQPmHk/Bl44ivkgAy5+hrO0OE3apYCU2w2k= Received: from out.poczta.wp.pl ([212.77.101.240]) (envelope-sender <krzysztofrybak6@HIDDEN>) by smtp.wp.pl (WP-SMTPD) with SMTP for <bug-gzip@HIDDEN>; 16 Jan 2014 22:55:26 +0100 Date: Thu, 16 Jan 2014 22:55:25 +0100 From: "Krzysztof Rybak" <krzysztofrybak6@HIDDEN> Message-ID: <52d8554de71410.11082928@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="part52d8554de70428.92881097" X-Mailer: Interfejs WWW nowej poczty Wirtualnej Polski X-User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0 Organization: Poznaj Poczte WP http://poczta.wp.pl/info-start.html X-WP-IP: 79.190.160.34 X-WP-AV: skaner antywirusowy poczty Wirtualnej Polski S. A. X-WP-SPAM: NO 0000000 [ASMk] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.8 (---) X-Mailman-Approved-At: Thu, 16 Jan 2014 18:51:34 -0500 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.8 (---) This is a multi-part message in MIME format. --part52d8554de70428.92881097 Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: 8bit Content-Disposition: inline Hi, I sent a message to the author of gzip but without response. Maybe You can help me with my doubts. best regards, Krzysztof Dnia Czwartek, 2 Stycznia 2014 22:41 Krzysztof Rybak <krzysztofrybak6@HIDDEN> napisał(a) > Hello Jean-loup, > I'm preparing my own algorithm based on Huffman compression method and deflate format. > > I have doubts if method implemented in gzip program is 100% correct. > I mean tree overflow protection: > just to remind: in deflate (RFC1951) and therefore in gzip there is creating tree for lit/len, dist (maximum length of codes is 15 bits) and code table (maximum length is 7 bits). In case of too long code word, there is tree modification implemented in gen_bitlen(desc) function (trees.c): > > do { > bits = max_length-1; > while (bl_count[bits] == 0) bits--; > bl_count[bits]--; /* move one leaf down the tree */ > bl_count[bits+1] += 2; /* move one overflow item as its brother */ > bl_count[max_length]--; > overflow -= 2; > } while (overflow > 0); > > I'm not sure if this method is correct for original code length greater than 8 ( for maximum 7 ) and than 16 ( for maximum 15): even not every time. I couldn't obtain such symbol distribution to generate so long codes on real files indeed as such situation is extremely rare but generated it by modifying software: > > just before mentioned above overflow protection I changed bl_count histogram to one as for Fibonacci numbers (which is the worst for Huffman overflow - the longest codes, please refer to attached image): in my case I modified tree when maximum length is 7 bits (max_length = 7 is for code book compression): > bl_count[0] = 1; > bl_count[1] = 1; > bl_count[2] = 1; > bl_count[3] = 1; > bl_count[4] = 1; > bl_count[5] = 1; > bl_count[6] = 1; > bl_count[7] = 1; > bl_count[8] = 1; > bl_count[9] = 1; > bl_count[10] = 2; > overflow = 4; > > in fact in gzip there is setting length = 7 when it's longer than 7: > if (bits > max_length){ > bits = max_length; > overflow++; > } > > ,so my histogram looks like: > bl_count[0] = 1; > bl_count[1] = 1; > bl_count[2] = 1; > bl_count[3] = 1; > bl_count[4] = 1; > bl_count[5] = 1; > bl_count[6] = 1; > bl_count[7] = 5; > bl_count[8] = 0; > bl_count[9] = 0; > overflow = 4; > and after overflow protection method from gzip: > bl_count[0] = 1 > bl_count[1] = 1 > bl_count[2] = 1 > bl_count[3] = 1 > bl_count[4] = 1 > bl_count[5] = 0 > bl_count[6] = 2 > bl_count[7] = 5 > , which is incorrect Huffman tree: too many elements. > > trees.c with my modification and printf() function is attached. I compress obj2 from Calgary corpus. > I know my description may look unclear, but I hope You will help me/clarify my doubts. > > best regards, > Krzysztof Rybak --part52d8554de70428.92881097 Content-Type: image/png; name="=?iso-8859-2?B?Rmlib25hY2NpLnBuZw==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?iso-8859-2?B?Rmlib25hY2NpLnBuZw==?=" iVBORw0KGgoAAAANSUhEUgAABQAAAAMgCAYAAAB8mM/7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3gECFAYUJCZOkwAAIABJREFUeNrs3T1y4trahmH1Vw53 zJAIGcCOiE7EcIh2RNQDIGRIxCfXF5yDj0xjI4F+1np0XVWustsC26s6uut9pV9t27YNAAAAABDp /xwBAAAAAOQSAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAA AIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAE AAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBM AAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAA EEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAA AAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmA AAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACC CYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAA AIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAA AAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDAB EAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABA MAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAA AEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgAC AAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgm AAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAA CCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAA AAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRA AAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADB BEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAA AMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgA AAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgA CAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAg mAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAA ACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwAB AAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQT AAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAA BBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAA AAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAECwD0cAAPW7Xq8OAZjEZrNxCABQOROAAAAA ABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAA 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 wQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAA AADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmnQKalAAAELklEQVSAAAAAABBMAAQAAACAYAIgAAAA AAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAA AAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGAC IAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACA YAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAA AIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAE AAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBM AAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAA EEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAA AAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmA AAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACC CYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAA AIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAA gP9vxw5kAAAAAAb5W9/jK4wAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgTgAAAAAAwJgABAAAAYEwAAgAAAMCYAAQAAACAMQEIAAAAAGMC EAAAAADGBCAAAAAAjAlAAAAAABgLpvtOWv0JxzcAAAAASUVORK5CYII= --part52d8554de70428.92881097 Content-Type: text/x-csrc; name="=?iso-8859-2?B?dHJlZXMuYw==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?iso-8859-2?B?dHJlZXMuYw==?=" LyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZwog KiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CiAqIFRoaXMgaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRl ciB0aGUKICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhl IGZpbGUgQ09QWUlORy4KICovCgovKgogKiAgUFVSUE9TRQogKgogKiAgICAgIEVuY29kZSB2YXJp b3VzIHNldHMgb2Ygc291cmNlIHZhbHVlcyB1c2luZyB2YXJpYWJsZS1sZW5ndGgKICogICAgICBi aW5hcnkgY29kZSB0cmVlcy4KICoKICogIERJU0NVU1NJT04KICoKICogICAgICBUaGUgUEtaSVAg ImRlZmxhdGlvbiIgcHJvY2VzcyB1c2VzIHNldmVyYWwgSHVmZm1hbiB0cmVlcy4gVGhlIG1vcmUK ICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBi aXQgc2VxdWVuY2VzLgogKgogKiAgICAgIEVhY2ggY29kZSB0cmVlIGlzIHN0b3JlZCBpbiB0aGUg WklQIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm0KICogICAgICB3aGljaCBpcyBpdHNlbGYgYSBI dWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mCiAqICAgICAgYWxsIHRoZSBjb2RlIHN0 cmluZ3MgKGluIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4KICogICAgICBUaGUg YWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsZW5ndGhzIGlu CiAqICAgICAgdGhlIFVOWklQIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiB0aGUgImFwcGxpY2F0 aW9uIG5vdGUiCiAqICAgICAgKEFQUE5PVEUuVFhUKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIFBL V0FSRSdzIFBLWklQIHByb2dyYW0uCiAqCiAqICBSRUZFUkVOQ0VTCiAqCiAqICAgICAgTHluY2gs IFRob21hcyBKLgogKiAgICAgICAgICBEYXRhIENvbXByZXNzaW9uOiAgVGVjaG5pcXVlcyBhbmQg QXBwbGljYXRpb25zLCBwcC4gNTMtNTUuCiAqICAgICAgICAgIExpZmV0aW1lIExlYXJuaW5nIFB1 YmxpY2F0aW9ucywgMTk4NS4gIElTQk4gMC01MzQtMDM0MTgtNy4KICoKICogICAgICBTdG9yZXIs IEphbWVzIEEuCiAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVv cnksIHBwLiA0OS01MC4KICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4g IElTQk4gMC03MTY3LTgxNTYtNS4KICoKICogICAgICBTZWRnZXdpY2ssIFIuCiAqICAgICAgICAg IEFsZ29yaXRobXMsIHAyOTAuCiAqICAgICAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTgzLiBJU0JO IDAtMjAxLTA2NjcyLTYuCiAqCiAqICBJTlRFUkZBQ0UKICoKICogICAgICB2b2lkIGN0X2luaXQg KHVzaCAqYXR0ciwgaW50ICptZXRob2RwKQogKiAgICAgICAgICBBbGxvY2F0ZSB0aGUgbWF0Y2gg YnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZQogKiAgICAgICAg ICB0aGUgbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5h cnkpIGFuZAogKiAgICAgICAgICBtZXRob2QgKERFRkxBVEUvU1RPUkUpCiAqCiAqICAgICAgdm9p ZCBjdF90YWxseSAoaW50IGRpc3QsIGludCBsYyk7CiAqICAgICAgICAgIFNhdmUgdGhlIG1hdGNo IGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLgogKgogKiAgICAgIGxvbmcgZmx1 c2hfYmxvY2sgKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpCiAqICAgICAgICAg IERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFt aWMgdHJlZXMsCiAqICAgICAgICAgIHN0YXRpYyB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0 aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwCiAqICAgICAgICAgIGZpbGUuIFJldHVybnMgdGhl IHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBmYXIuCiAqCiAqLwoKI2lu Y2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAidGFpbG9yLmgiCiNpbmNsdWRlICJnemlwLmgiCgoj aWZkZWYgUkNTSUQKc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHRyZWVzLmMsdiAwLjEyIDE5 OTMvMDYvMTAgMTM6Mjc6NTQgamxvdXAgRXhwICQiOwojZW5kaWYKCi8qID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQogKiBDb25zdGFudHMKICovCgojZGVmaW5lIE1BWF9CSVRTIDE1Ci8qIEFsbCBjb2RlcyBt dXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLwoKI2RlZmluZSBNQVhfQkxfQklUUyA3Ci8q IEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KCiNk ZWZpbmUgTEVOR1RIX0NPREVTIDI5Ci8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3Vu dGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLwoKI2RlZmluZSBMSVRFUkFMUyAgMjU2 Ci8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLwoKI2RlZmluZSBFTkRfQkxPQ0sg MjU2Ci8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KCiNkZWZpbmUgTF9DT0RFUyAoTElU RVJBTFMrMStMRU5HVEhfQ09ERVMpCi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2Rl cywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwoKI2RlZmluZSBEX0NPREVTICAgMzAK LyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCgojZGVmaW5lIEJMX0NPREVTICAxOQovKiBu dW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KCgpsb2Nh bCBpbnQgbmVhciBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVh Y2ggbGVuZ3RoIGNvZGUgKi8KICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwz LDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKCmxvY2FsIGludCBuZWFyIGV4dHJhX2RiaXRzW0Rf Q09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLwogICA9IHswLDAs MCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEy LDEzLDEzfTsKCmxvY2FsIGludCBuZWFyIGV4dHJhX2JsYml0c1tCTF9DT0RFU10vKiBleHRyYSBi aXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLwogICA9IHswLDAsMCwwLDAsMCwwLDAsMCww LDAsMCwwLDAsMCwwLDIsMyw3fTsKCiNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKI2RlZmluZSBTVEFU SUNfVFJFRVMgMQojZGVmaW5lIERZTl9UUkVFUyAgICAyCi8qIFRoZSB0aHJlZSBraW5kcyBvZiBi bG9jayB0eXBlICovCgojaWZuZGVmIExJVF9CVUZTSVpFCiMgIGlmZGVmIFNNQUxMX01FTQojICAg IGRlZmluZSBMSVRfQlVGU0laRSAgMHgyMDAwCiMgIGVsc2UKIyAgaWZkZWYgTUVESVVNX01FTQoj ICAgIGRlZmluZSBMSVRfQlVGU0laRSAgMHg0MDAwCiMgIGVsc2UKIyAgICBkZWZpbmUgTElUX0JV RlNJWkUgIDB4ODAwMAojICBlbmRpZgojICBlbmRpZgojZW5kaWYKI2lmbmRlZiBESVNUX0JVRlNJ WkUKIyAgZGVmaW5lIERJU1RfQlVGU0laRSAgTElUX0JVRlNJWkUKI2VuZGlmCi8qIFNpemVzIG9m IG1hdGNoIGJ1ZmZlcnMgZm9yIGxpdGVyYWxzL2xlbmd0aHMgYW5kIGRpc3RhbmNlcy4gIFRoZXJl IGFyZQogKiA0IHJlYXNvbnMgZm9yIGxpbWl0aW5nIExJVF9CVUZTSVpFIHRvIDY0SzoKICogICAt IGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycwogKiAgIC0gaWYgY29t cHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0 IGRhdGEgaXMKICogICAgIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQg YSBzdG9yZWQgYmxvY2sgZXZlbiB3aGVuIGlucHV0CiAqICAgICBjb21lcyBmcm9tIHN0YW5kYXJk IGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IgYWxsIGJsb2NrcyBpZgogKiAgICAg TElUX0JVRlNJWkUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQogKiAgIC0gaWYgY29tcHJlc3Np b24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4K ICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sg KHNhdmluZyA1IGJ5dGVzKS4KICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3Mg ZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAogKiAgICAgYWRhcHRhdGlvbiB0byBjaGFu Z2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgogKiAgICAgZXhhbXBs ZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5 CiAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZm ZXIgc2l6ZXMgZ2l2ZQogKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0 aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nIHRyZWVzCiAqICAgICBtb3JlIGZyZXF1ZW50bHku CiAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKICogVGhlIGN1cnJlbnQgY29kZSBpcyBnZW5l cmFsIGFuZCBhbGxvd3MgRElTVF9CVUZTSVpFIDwgTElUX0JVRlNJWkUgKHRvIHNhdmUKICogbWVt b3J5IGF0IHRoZSBleHBlbnNlIG9mIGNvbXByZXNzaW9uKS4gU29tZSBvcHRpbWl6YXRpb25zIHdv dWxkIGJlIHBvc3NpYmxlCiAqIGlmIHdlIHJlbHkgb24gRElTVF9CVUZTSVpFID09IExJVF9CVUZT SVpFLgogKi8KI2lmIExJVF9CVUZTSVpFID4gSU5CVUZTSVoKICAgIGVycm9yIGNhbm5vdCBvdmVy bGF5IGxfYnVmIGFuZCBpbmJ1ZgojZW5kaWYKCiNkZWZpbmUgUkVQXzNfNiAgICAgIDE2Ci8qIHJl cGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3Vu dCkgKi8KCiNkZWZpbmUgUkVQWl8zXzEwICAgIDE3Ci8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMt MTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLwoKI2RlZmluZSBSRVBaXzExXzEz OCAgMTgKLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJl cGVhdCBjb3VudCkgKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMb2NhbCBkYXRhCiAqLwoK LyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUg c3RyaW5nLiAqLwp0eXBlZGVmIHN0cnVjdCBjdF9kYXRhIHsKICAgIHVuaW9uIHsKICAgICAgICB1 c2ggIGZyZXE7ICAgICAgIC8qIGZyZXF1ZW5jeSBjb3VudCAqLwogICAgICAgIHVzaCAgY29kZTsg ICAgICAgLyogYml0IHN0cmluZyAqLwogICAgfSBmYzsKICAgIHVuaW9uIHsKICAgICAgICB1c2gg IGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLwogICAgICAgIHVz aCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KICAgIH0gZGw7Cn0gY3Rf ZGF0YTsKCiNkZWZpbmUgRnJlcSBmYy5mcmVxCiNkZWZpbmUgQ29kZSBmYy5jb2RlCiNkZWZpbmUg RGFkICBkbC5kYWQKI2RlZmluZSBMZW4gIGRsLmxlbgoKI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9D T0RFUysxKQovKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLwoKbG9jYWwgY3RfZGF0YSBuZWFyIGR5bl9s dHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCmxvY2FsIGN0 X2RhdGEgbmVhciBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCgps b2NhbCBjdF9kYXRhIG5lYXIgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl07Ci8qIFRoZSBzdGF0aWMg bGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlz IG5vCiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAg Y29uc3RydWN0aW9uLiBIb3dldmVyCiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVk IHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBjdF9pbml0CiAqIGJlbG93KS4KICovCgps b2NhbCBjdF9kYXRhIG5lYXIgc3RhdGljX2R0cmVlW0RfQ09ERVNdOwovKiBUaGUgc3RhdGljIGRp c3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNl CiAqIDUgYml0cy4pCiAqLwoKbG9jYWwgY3RfZGF0YSBuZWFyIGJsX3RyZWVbMipCTF9DT0RFUysx XTsKLyogSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgKi8KCnR5cGVkZWYgc3RydWN0 IHRyZWVfZGVzYyB7CiAgICBjdF9kYXRhIG5lYXIgKmR5bl90cmVlOyAgICAgIC8qIHRoZSBkeW5h bWljIHRyZWUgKi8KICAgIGN0X2RhdGEgbmVhciAqc3RhdGljX3RyZWU7ICAgLyogY29ycmVzcG9u ZGluZyBzdGF0aWMgdHJlZSBvciBOVUxMICovCiAgICBpbnQgICAgIG5lYXIgKmV4dHJhX2JpdHM7 ICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCiAgICBpbnQgICAgIGV4 dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KICAgIGlu dCAgICAgZWxlbXM7ICAgICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0 aGUgdHJlZSAqLwogICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxl bmd0aCBmb3IgdGhlIGNvZGVzICovCiAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8q IGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwp9IHRyZWVfZGVzYzsKCmxv Y2FsIHRyZWVfZGVzYyBuZWFyIGxfZGVzYyA9CntkeW5fbHRyZWUsIHN0YXRpY19sdHJlZSwgZXh0 cmFfbGJpdHMsIExJVEVSQUxTKzEsIExfQ09ERVMsIE1BWF9CSVRTLCAwfTsKCmxvY2FsIHRyZWVf ZGVzYyBuZWFyIGRfZGVzYyA9CntkeW5fZHRyZWUsIHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMs IDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTLCAwfTsKCmxvY2FsIHRyZWVfZGVzYyBuZWFy IGJsX2Rlc2MgPQp7YmxfdHJlZSwgKGN0X2RhdGEgbmVhciAqKTAsIGV4dHJhX2JsYml0cywgMCwg ICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMsIDB9OwoKCmxvY2FsIHVzaCBuZWFyIGJsX2NvdW50 W01BWF9CSVRTKzFdOwovKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBh biBvcHRpbWFsIHRyZWUgKi8KCmxvY2FsIHVjaCBuZWFyIGJsX29yZGVyW0JMX0NPREVTXQogICA9 IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKLyogVGhl IGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVj cmVhc2luZwogKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhz IGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KICovCgpsb2NhbCBpbnQgbmVhciBoZWFwWzIq TF9DT0RFUysxXTsgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCmxv Y2FsIGludCBoZWFwX2xlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4g dGhlIGhlYXAgKi8KbG9jYWwgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQg b2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsy Km5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KICogVGhlIHNhbWUgaGVh cCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KICovCgpsb2NhbCB1Y2ggbmVhciBk ZXB0aFsyKkxfQ09ERVMrMV07Ci8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBi cmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kgKi8KCmxvY2FsIHVjaCBsZW5ndGhf Y29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOwovKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3Jt YWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovCgpsb2NhbCB1Y2ggZGlzdF9j b2RlWzUxMl07Ci8qIGRpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNw b25kIHRvIHRoZSBkaXN0YW5jZXMKICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29y cmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgogKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KICov Cgpsb2NhbCBpbnQgbmVhciBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOwovKiBGaXJzdCBub3Jt YWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLwoKbG9jYWwgaW50 IG5lYXIgYmFzZV9kaXN0W0RfQ09ERVNdOwovKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZv ciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLwoKI2RlZmluZSBsX2J1ZiBpbmJ1Zgov KiBERUNMQVJFKHVjaCwgbF9idWYsIExJVF9CVUZTSVpFKTsgIGJ1ZmZlciBmb3IgbGl0ZXJhbHMg b3IgbGVuZ3RocyAqLwoKLyogREVDTEFSRSh1c2gsIGRfYnVmLCBESVNUX0JVRlNJWkUpOyBidWZm ZXIgZm9yIGRpc3RhbmNlcyAqLwoKbG9jYWwgdWNoIG5lYXIgZmxhZ19idWZbKExJVF9CVUZTSVpF LzgpXTsKLyogZmxhZ19idWYgaXMgYSBiaXQgYXJyYXkgZGlzdGluZ3Vpc2hpbmcgbGl0ZXJhbHMg ZnJvbSBsZW5ndGhzIGluCiAqIGxfYnVmLCB0aHVzIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9y IGFic2VuY2Ugb2YgYSBkaXN0YW5jZS4KICovCgpsb2NhbCB1bnNpZ25lZCBsYXN0X2xpdDsgICAg LyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLwpsb2NhbCB1bnNpZ25lZCBsYXN0X2Rpc3Q7ICAg LyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLwpsb2NhbCB1bnNpZ25lZCBsYXN0X2ZsYWdzOyAg LyogcnVubmluZyBpbmRleCBpbiBmbGFnX2J1ZiAqLwpsb2NhbCB1Y2ggZmxhZ3M7ICAgICAgICAg ICAgLyogY3VycmVudCBmbGFncyBub3QgeWV0IHNhdmVkIGluIGZsYWdfYnVmICovCmxvY2FsIHVj aCBmbGFnX2JpdDsgICAgICAgICAvKiBjdXJyZW50IGJpdCB1c2VkIGluIGZsYWdzICovCi8qIGJp dHMgYXJlIGZpbGxlZCBpbiBmbGFncyBzdGFydGluZyBhdCBiaXQgMCAobGVhc3Qgc2lnbmlmaWNh bnQpLgogKiBOb3RlOiB0aGVzZSBmbGFncyBhcmUgb3ZlcmtpbGwgaW4gdGhlIGN1cnJlbnQgY29k ZSBzaW5jZSB3ZSBkb24ndAogKiB0YWtlIGFkdmFudGFnZSBvZiBESVNUX0JVRlNJWkUgPT0gTElU X0JVRlNJWkUuCiAqLwoKbG9jYWwgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9m IGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCmxvY2FsIHVsZyBzdGF0aWNfbGVu OyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICov Cgpsb2NhbCB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJl c3NlZCBmaWxlICovCgpsb2NhbCB1bGcgaW5wdXRfbGVuOyAgICAgIC8qIHRvdGFsIGJ5dGUgbGVu Z3RoIG9mIGlucHV0IGZpbGUgKi8KLyogaW5wdXRfbGVuIGlzIGZvciBkZWJ1Z2dpbmcgb25seSBz aW5jZSB3ZSBjYW4gZ2V0IGl0IGJ5IG90aGVyIG1lYW5zLiAqLwoKdXNoICpmaWxlX3R5cGU7ICAg ICAgICAvKiBwb2ludGVyIHRvIFVOS05PV04sIEJJTkFSWSBvciBBU0NJSSAqLwppbnQgKmZpbGVf bWV0aG9kOyAgICAgIC8qIHBvaW50ZXIgdG8gREVGTEFURSBvciBTVE9SRSAqLwoKI2lmZGVmIERF QlVHCmV4dGVybiB1bGcgYml0c19zZW50OyAgLyogYml0IGxlbmd0aCBvZiB0aGUgY29tcHJlc3Nl ZCBkYXRhICovCmV4dGVybiBsb25nIGlzaXplOyAgICAgLyogYnl0ZSBsZW5ndGggb2YgaW5wdXQg ZmlsZSAqLwojZW5kaWYKCmV4dGVybiBsb25nIGJsb2NrX3N0YXJ0OyAgICAgICAvKiB3aW5kb3cg b2Zmc2V0IG9mIGN1cnJlbnQgYmxvY2sgKi8KZXh0ZXJuIHVuc2lnbmVkIG5lYXIgc3Ryc3RhcnQ7 IC8qIHdpbmRvdyBvZmZzZXQgb2YgY3VycmVudCBzdHJpbmcgKi8KCi8qID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQogKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCiAqLwoKbG9jYWwg dm9pZCBpbml0X2Jsb2NrICAgICBPRigodm9pZCkpOwpsb2NhbCB2b2lkIHBxZG93bmhlYXAgICAg IE9GKChjdF9kYXRhIG5lYXIgKnRyZWUsIGludCBrKSk7CmxvY2FsIHZvaWQgZ2VuX2JpdGxlbiAg ICAgT0YoKHRyZWVfZGVzYyBuZWFyICpkZXNjKSk7CmxvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAg T0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7CmxvY2FsIHZvaWQgYnVpbGRf dHJlZSAgICAgT0YoKHRyZWVfZGVzYyBuZWFyICpkZXNjKSk7CmxvY2FsIHZvaWQgc2Nhbl90cmVl ICAgICAgT0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7CmxvY2FsIHZvaWQg c2VuZF90cmVlICAgICAgT0YoKGN0X2RhdGEgbmVhciAqdHJlZSwgaW50IG1heF9jb2RlKSk7Cmxv Y2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKHZvaWQpKTsKbG9jYWwgdm9pZCBzZW5kX2FsbF90 cmVlcyBPRigoaW50IGxjb2RlcywgaW50IGRjb2RlcywgaW50IGJsY29kZXMpKTsKbG9jYWwgdm9p ZCBjb21wcmVzc19ibG9jayBPRigoY3RfZGF0YSBuZWFyICpsdHJlZSwgY3RfZGF0YSBuZWFyICpk dHJlZSkpOwpsb2NhbCB2b2lkIHNldF9maWxlX3R5cGUgIE9GKCh2b2lkKSk7CgoKI2lmbmRlZiBE RUJVRwojICBkZWZpbmUgc2VuZF9jb2RlKGMsIHRyZWUpIHNlbmRfYml0cyh0cmVlW2NdLkNvZGUs IHRyZWVbY10uTGVuKQogICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQg dHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLwoKI2Vsc2UgLyogREVCVUcgKi8KIyAg ZGVmaW5lIHNlbmRfY29kZShjLCB0cmVlKSBcCiAgICAgeyBpZiAodmVyYm9zZT4xKSBmcHJpbnRm KHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCiAgICAgICBzZW5kX2JpdHModHJlZVtjXS5Db2Rl LCB0cmVlW2NdLkxlbik7IH0KI2VuZGlmCgojZGVmaW5lIGRfY29kZShkaXN0KSBcCiAgICgoZGlz dCkgPCAyNTYgPyBkaXN0X2NvZGVbZGlzdF0gOiBkaXN0X2NvZGVbMjU2KygoZGlzdCk+PjcpXSkK LyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRo ZSBkaXN0YW5jZSAtIDEgYW5kCiAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBkaXN0X2Nv ZGVbMjU2XSBhbmQgZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCiAqIHVzZWQuCiAqLwoKI2RlZmlu ZSBNQVgoYSxiKSAoYSA+PSBiID8gYSA6IGIpCi8qIHRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2 ZSBzaWRlIGVmZmVjdHMgKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBBbGxvY2F0ZSB0aGUg bWF0Y2ggYnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZSB0aGUK ICogbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5hcnkp IGFuZCBtZXRob2QKICogKERFRkxBVEUvU1RPUkUpLgogKi8Kdm9pZCBjdF9pbml0KGF0dHIsIG1l dGhvZHApCiAgICB1c2ggICphdHRyOyAgIC8qIHBvaW50ZXIgdG8gaW50ZXJuYWwgZmlsZSBhdHRy aWJ1dGUgKi8KICAgIGludCAgKm1ldGhvZHA7IC8qIHBvaW50ZXIgdG8gY29tcHJlc3Npb24gbWV0 aG9kICovCnsKICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRz ICovCiAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCiAgICBpbnQgbGVuZ3RoOyAg IC8qIGxlbmd0aCB2YWx1ZSAqLwogICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCiAg ICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCgogICAgZmlsZV90eXBlID0gYXR0 cjsKICAgIGZpbGVfbWV0aG9kID0gbWV0aG9kcDsKICAgIGNvbXByZXNzZWRfbGVuID0gaW5wdXRf bGVuID0gMEw7CiAgICAgICAgCiAgICBpZiAoc3RhdGljX2R0cmVlWzBdLkxlbiAhPSAwKSByZXR1 cm47IC8qIGN0X2luaXQgYWxyZWFkeSBjYWxsZWQgKi8KCiAgICAvKiBJbml0aWFsaXplIHRoZSBt YXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCiAgICBsZW5n dGggPSAwOwogICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUy0xOyBjb2RlKysp IHsKICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKICAgICAgICBmb3IgKG4gPSAw OyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CiAgICAgICAgICAgIGxlbmd0aF9j b2RlW2xlbmd0aCsrXSA9ICh1Y2gpY29kZTsKICAgICAgICB9CiAgICB9CiAgICBBc3NlcnQgKGxl bmd0aCA9PSAyNTYsICJjdF9pbml0OiBsZW5ndGggIT0gMjU2Iik7CiAgICAvKiBOb3RlIHRoYXQg dGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAogICAg ICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwg c28gd2UKICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBl bmNvZGluZzoKICAgICAqLwogICAgbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOwoK ICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUg KDAuLjI5KSAqLwogICAgZGlzdCA9IDA7CiAgICBmb3IgKGNvZGUgPSAwIDsgY29kZSA8IDE2OyBj b2RlKyspIHsKICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OwogICAgICAgIGZvciAobiA9 IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKICAgICAgICAgICAgZGlzdF9j b2RlW2Rpc3QrK10gPSAodWNoKWNvZGU7CiAgICAgICAgfQogICAgfQogICAgQXNzZXJ0IChkaXN0 ID09IDI1NiwgImN0X2luaXQ6IGRpc3QgIT0gMjU2Iik7CiAgICBkaXN0ID4+PSA3OyAvKiBmcm9t IG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KICAgIGZvciAoIDsg Y29kZSA8IERfQ09ERVM7IGNvZGUrKykgewogICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Qg PDwgNzsKICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7 IG4rKykgewogICAgICAgICAgICBkaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsK ICAgICAgICB9CiAgICB9CiAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogMjU2K2Rp c3QgIT0gNTEyIik7CgogICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxp dGVyYWwgdHJlZSAqLwogICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysr KSBibF9jb3VudFtiaXRzXSA9IDA7CiAgICBuID0gMDsKICAgIHdoaWxlIChuIDw9IDE0Mykgc3Rh dGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKICAgIHdoaWxlIChuIDw9IDI1 NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKICAgIHdoaWxlIChu IDw9IDI3OSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gNywgYmxfY291bnRbN10rKzsKICAgIHdo aWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsK ICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVk ZSB0aGVtIGluIHRoZQogICAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2Fs IEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlCiAgICAgKiBhbGwgb25lcykKICAgICAqLwogICAg Z2VuX2NvZGVzKChjdF9kYXRhIG5lYXIgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSk7CgogICAg LyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCiAgICBmb3IgKG4gPSAw OyBuIDwgRF9DT0RFUzsgbisrKSB7CiAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CiAg ICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKG4sIDUpOwogICAgfQoKICAg IC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLwogICAg aW5pdF9ibG9jaygpOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSW5pdGlhbGl6ZSBhIG5l dyBibG9jay4KICovCmxvY2FsIHZvaWQgaW5pdF9ibG9jaygpCnsKICAgIGludCBuOyAvKiBpdGVy YXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KCiAgICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4g Ki8KICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSBkeW5fbHRyZWVbbl0uRnJlcSA9 IDA7CiAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgZHluX2R0cmVlW25dLkZyZXEg PSAwOwogICAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIGJsX3RyZWVbbl0uRnJlcSA9 IDA7CgogICAgZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CiAgICBvcHRfbGVuID0gc3Rh dGljX2xlbiA9IDBMOwogICAgbGFzdF9saXQgPSBsYXN0X2Rpc3QgPSBsYXN0X2ZsYWdzID0gMDsK ICAgIGZsYWdzID0gMDsgZmxhZ19iaXQgPSAxOwp9CgojZGVmaW5lIFNNQUxMRVNUIDEKLyogSW5k ZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1 ZmZtYW4gdHJlZSAqLwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBSZW1vdmUgdGhlIHNtYWxs ZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAogKiBv bmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgogKi8KI2RlZmluZSBw cXJlbW92ZSh0cmVlLCB0b3ApIFwKe1wKICAgIHRvcCA9IGhlYXBbU01BTExFU1RdOyBcCiAgICBo ZWFwW1NNQUxMRVNUXSA9IGhlYXBbaGVhcF9sZW4tLV07IFwKICAgIHBxZG93bmhlYXAodHJlZSwg U01BTExFU1QpOyBcCn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDb21wYXJlcyB0byBzdWJ0 cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgogKiB0aGUgc3Vi dHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNl IGxlbmd0aC4KICovCiNkZWZpbmUgc21hbGxlcih0cmVlLCBuLCBtKSBcCiAgICh0cmVlW25dLkZy ZXEgPCB0cmVlW21dLkZyZXEgfHwgXAogICAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAm JiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUmVzdG9y ZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBu b2RlIGssCiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28g c29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMg cmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKICogdHdvIHNvbnMp LgogKi8KbG9jYWwgdm9pZCBwcWRvd25oZWFwKHRyZWUsIGspCiAgICBjdF9kYXRhIG5lYXIgKnRy ZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCiAgICBpbnQgazsgICAgICAgICAgICAgICAv KiBub2RlIHRvIG1vdmUgZG93biAqLwp7CiAgICBpbnQgdiA9IGhlYXBba107CiAgICBpbnQgaiA9 IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi8KICAgIHdoaWxlIChqIDw9IGhlYXBfbGVuKSB7 CiAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KICAg ICAgICBpZiAoaiA8IGhlYXBfbGVuICYmIHNtYWxsZXIodHJlZSwgaGVhcFtqKzFdLCBoZWFwW2pd KSkgaisrOwoKICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAq LwogICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIGhlYXBbal0pKSBicmVhazsKCiAgICAgICAg LyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KICAgICAgICBoZWFwW2tdID0g aGVhcFtqXTsgIGsgPSBqOwoKICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwg c2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCiAgICAgICAgaiA8PD0gMTsKICAgIH0K ICAgIGhlYXBba10gPSB2Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ29tcHV0ZSB0aGUg b3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBs ZW5ndGgKICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVs ZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAogKiAgICBhYm92ZSBh cmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgogKiBPVVQg YXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0 aCwgdGhlCiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9y IGVhY2ggYml0IGxlbmd0aC4KICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBz dGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcwogKiAgICAgbm90IG51bGwuCiAq Lwpsb2NhbCB2b2lkIGdlbl9iaXRsZW4oZGVzYykKICAgIHRyZWVfZGVzYyBuZWFyICpkZXNjOyAv KiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCnsKICAgIGN0X2RhdGEgbmVhciAqdHJlZSAgPSBkZXNj LT5keW5fdHJlZTsKICAgIGludCBuZWFyICpleHRyYSAgICAgPSBkZXNjLT5leHRyYV9iaXRzOwog ICAgaW50IGJhc2UgICAgICAgICAgICA9IGRlc2MtPmV4dHJhX2Jhc2U7CiAgICBpbnQgbWF4X2Nv ZGUgICAgICAgID0gZGVzYy0+bWF4X2NvZGU7CiAgICBpbnQgbWF4X2xlbmd0aCAgICAgID0gZGVz Yy0+bWF4X2xlbmd0aDsKICAgIGN0X2RhdGEgbmVhciAqc3RyZWUgPSBkZXNjLT5zdGF0aWNfdHJl ZTsKICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLwogICAgaW50IG4sIG07 ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KICAgIGludCBi aXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLwogICAgaW50IHhiaXRzOyAgICAgICAgICAv KiBleHRyYSBiaXRzICovCiAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLwog ICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVu Z3RoIHRvbyBsYXJnZSAqLwoKICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJp dHMrKykgYmxfY291bnRbYml0c10gPSAwOwoKICAgIHByaW50ZigiXG5nZW5fYml0bGVuIik7CiAg ICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdo aWNoIG1heQogICAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJl ZSkuCiAgICAgKi8KICAgIHRyZWVbaGVhcFtoZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2Yg dGhlIGhlYXAgKi8KCiAgICBmb3IgKGggPSBoZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKysp IHsKICAgICAgICBuID0gaGVhcFtoXTsKICAgICAgICBiaXRzID0gdHJlZVt0cmVlW25dLkRhZF0u TGVuICsgMTsKCiAgICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKXsKICAgICAgICAJYml0cyA9 IG1heF9sZW5ndGg7CiAgICAgICAgCW92ZXJmbG93Kys7CiAgICAgICAgfQogICAgICAgIHRyZWVb bl0uTGVuID0gKHVzaCliaXRzOwogICAgICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3 aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCgogICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNv bnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KCiAgICAgICAgYmxfY291bnRbYml0c10rKzsK CiAgICAgICAgeGJpdHMgPSAwOwogICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFb bi1iYXNlXTsKICAgICAgICBmID0gdHJlZVtuXS5GcmVxOwogICAgICAgIG9wdF9sZW4gKz0gKHVs ZylmICogKGJpdHMgKyB4Yml0cyk7CiAgICAgICAgaWYgKHN0cmVlKSBzdGF0aWNfbGVuICs9ICh1 bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CiAgICB9CiAgICBpZiAob3ZlcmZsb3cgPT0g MCl7CiAgICAJcmV0dXJuOwogICAgfQoKICAgIFRyYWNlKChzdGRlcnIsIlxuYml0IGxlbmd0aCBv dmVyZmxvd1xuIikpOwogICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5k IHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KCiAgICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQg bGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLwogICAgcHJpbnRmKCJcblxuXG5nZW5fYml0 bGVuIC0gb3ZlcmZsb3ciKTsKCiAgICBvdmVyZmxvdyA9IDM7CiAgICBwcmludGYoIlxub3ZlcmZs b3cgPSAlZCIsIG92ZXJmbG93KTsKCiAgICBibF9jb3VudFswXSA9IDE7CiAgICBibF9jb3VudFsx XSA9IDE7CiAgICBibF9jb3VudFsyXSA9IDE7CiAgICBibF9jb3VudFszXSA9IDE7CiAgICBibF9j b3VudFs0XSA9IDE7CiAgICBibF9jb3VudFs1XSA9IDE7CiAgICBibF9jb3VudFs2XSA9IDE7CiAg ICBibF9jb3VudFs3XSA9IDU7CgoKICAgIHByaW50ZigiXG5iZWZvcmUiKTsKICAgIGZvciAoaD0w OyBoPD1tYXhfbGVuZ3RoOyBoKyspewogICAgCXByaW50ZigiXG5ibF9jb3VudFslZF0gPSAlZCIs IGgsIGJsX2NvdW50W2hdKTsKICAgIH0KCiAgICBkbyB7CiAgICAgICAgYml0cyA9IG1heF9sZW5n dGgtMTsKICAgICAgICB3aGlsZSAoYmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOwogICAgICAg IGJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICov CiAgICAgICAgYmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVt IGFzIGl0cyBicm90aGVyICovCiAgICAgICAgYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKICAgICAg ICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVw IHVwLAogICAgICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVu Z3RoXQogICAgICAgICAqLwogICAgICAgIG92ZXJmbG93IC09IDI7CiAgICB9IHdoaWxlIChvdmVy ZmxvdyA+IDApOwoKICAgIHByaW50ZigiXG5hZnRlciIpOwogICAgZm9yIChoPTA7IGg8PW1heF9s ZW5ndGg7IGgrKyl7CiAgICAJcHJpbnRmKCJcbmJsX2NvdW50WyVkXSA9ICVkIiwgaCwgYmxfY291 bnRbaF0pOwogICAgfQoKICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2Fu bmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KICAgICAqIGggaXMgc3RpbGwgZXF1YWwgdG8g SEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKICAgICAqIGxlbmd0 aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRh a2VuCiAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKICAgICAq LwogICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKICAgICAg ICBuID0gYmxfY291bnRbYml0c107CiAgICAgICAgd2hpbGUgKG4gIT0gMCkgewogICAgICAgICAg ICBtID0gaGVhcFstLWhdOwogICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsK ICAgICAgICAgICAgaWYgKHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgewogICAgICAg ICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVtt XS5MZW4sIGJpdHMpKTsKICAgICAgICAgICAgICAgIG9wdF9sZW4gKz0gKChsb25nKWJpdHMtKGxv bmcpdHJlZVttXS5MZW4pKihsb25nKXRyZWVbbV0uRnJlcTsKICAgICAgICAgICAgICAgIHRyZWVb bV0uTGVuID0gKHVzaCliaXRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4tLTsKICAgICAg ICB9CiAgICB9Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBHZW5lcmF0ZSB0aGUgY29kZXMg Zm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKICogb3B0 aW1hbCkuCiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBi aXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQg bGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCiAqIE9VVCBhc3NlcnRpb246IHRoZSBm aWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCiAqICAgICB6ZXJv IGNvZGUgbGVuZ3RoLgogKi8KbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlKQog ICAgY3RfZGF0YSBuZWFyICp0cmVlOyAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8K ICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6 ZXJvIGZyZXF1ZW5jeSAqLwp7CiAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0 IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLwogICAgdXNoIGNvZGUgPSAwOyAgICAg ICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovCiAgICBpbnQgYml0czsgICAgICAgICAg ICAgICAgICAvKiBiaXQgaW5kZXggKi8KICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8q IGNvZGUgaW5kZXggKi8KCiAgICBwcmludGYoIlxuZ2VuX2NvZGVzIik7CgogICAgLyogVGhlIGRp c3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFs dWVzCiAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KICAgICAqLwogICAgZm9yIChiaXRzID0g MTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CiAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0g Y29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKICAgIH0KICAgIC8qIENoZWNr IHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0 IGNvZGUKICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCiAgICAgKi8KICAgIEFzc2VydCAoY29kZSAr IGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSwKICAgICAgICAgICAgImlu Y29uc2lzdGVudCBiaXQgY291bnRzIik7CiAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6 IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CgogICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2Nv ZGU7IG4rKykgewogICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKICAgICAgICBpZiAobGVu ID09IDApIGNvbnRpbnVlOwogICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCiAgICAg ICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOwoKICAg ICAgICBUcmFjZWModHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAl MmQgYyAlNHggKCV4KSAiLAogICAgICAgICAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwg bGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTsKICAgIH0KfQoKLyogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRo ZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgogKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBs ZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBm cmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCiAqIE9VVCBhc3NlcnRpb25zOiB0aGUg ZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKICog ICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVk OyBzdGF0aWNfbGVuIGlzCiAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwu IFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCiAqLwpsb2NhbCB2b2lkIGJ1aWxkX3RyZWUoZGVz YykKICAgIHRyZWVfZGVzYyBuZWFyICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCnsK ICAgIGN0X2RhdGEgbmVhciAqdHJlZSAgID0gZGVzYy0+ZHluX3RyZWU7CiAgICBjdF9kYXRhIG5l YXIgKnN0cmVlICA9IGRlc2MtPnN0YXRpY190cmVlOwogICAgaW50IGVsZW1zICAgICAgICAgICAg PSBkZXNjLT5lbGVtczsKICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVh cCBlbGVtZW50cyAqLwogICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRo IG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwogICAgaW50IG5vZGUgPSBlbGVtczsgIC8qIG5leHQgaW50 ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLwoKICAgIHByaW50ZigiXG5idWlsZF90cmVlIik7CiAg ICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVt ZW50IGluCiAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVh cFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCiAgICAg Ki8KICAgIGhlYXBfbGVuID0gMCwgaGVhcF9tYXggPSBIRUFQX1NJWkU7CgogICAgZm9yIChuID0g MDsgbiA8IGVsZW1zOyBuKyspIHsKICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKICAg ICAgICAgICAgaGVhcFsrK2hlYXBfbGVuXSA9IG1heF9jb2RlID0gbjsKICAgICAgICAgICAgZGVw dGhbbl0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsK ICAgICAgICB9CiAgICB9CgogICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0 IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0 IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQogICAgICog cG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9y Y2UgYXQgbGVhc3QKICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCiAgICAg Ki8KICAgIHdoaWxlIChoZWFwX2xlbiA8IDIpIHsKICAgICAgICBpbnQgbmV3ID0gaGVhcFsrK2hl YXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CiAgICAgICAgdHJlZVtu ZXddLkZyZXEgPSAxOwogICAgICAgIGRlcHRoW25ld10gPSAwOwogICAgICAgIG9wdF9sZW4tLTsg aWYgKHN0cmVlKSBzdGF0aWNfbGVuIC09IHN0cmVlW25ld10uTGVuOwogICAgICAgIC8qIG5ldyBp cyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCiAgICB9CiAgICBkZXNj LT5tYXhfY29kZSA9IG1heF9jb2RlOwoKICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVu LzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKICAgICAqIGVzdGFibGlz aCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgogICAgICovCiAgICBmb3IgKG4gPSBo ZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcCh0cmVlLCBuKTsKCiAgICAvKiBDb25z dHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3Qg dHdvCiAgICAgKiBmcmVxdWVudCBub2Rlcy4KICAgICAqLwogICAgZG8gewogICAgCS8vIHR3b3J6 ZW5pZSBkcnpld2EKICAgICAgICBwcXJlbW92ZSh0cmVlLCBuKTsgICAvKiBuID0gbm9kZSBvZiBs ZWFzdCBmcmVxdWVuY3kgKi8KICAgICAgICBtID0gaGVhcFtTTUFMTEVTVF07ICAvKiBtID0gbm9k ZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLwoKICAgICAgICBoZWFwWy0taGVhcF9tYXhdID0g bjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLwogICAgICAgIGhlYXBb LS1oZWFwX21heF0gPSBtOwoKICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2Yg biBhbmQgbSAqLwogICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVb bV0uRnJlcTsKICAgICAgICBkZXB0aFtub2RlXSA9ICh1Y2gpIChNQVgoZGVwdGhbbl0sIGRlcHRo W21dKSArIDEpOwogICAgICAgIHRyZWVbbl0uRGFkID0gdHJlZVttXS5EYWQgPSAodXNoKW5vZGU7 CiNpZmRlZiBEVU1QX0JMX1RSRUUKICAgICAgICBpZiAodHJlZSA9PSBibF90cmVlKSB7CiAgICAg ICAgICAgIGZwcmludGYoc3RkZXJyLCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCki LAogICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5G cmVxLCBtLCB0cmVlW21dLkZyZXEpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgLyogYW5kIGlu c2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KICAgICAgICBoZWFwW1NNQUxMRVNUXSA9 IG5vZGUrKzsKICAgICAgICBwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsKCiAgICB9IHdoaWxl IChoZWFwX2xlbiA+PSAyKTsKCiAgICBoZWFwWy0taGVhcF9tYXhdID0gaGVhcFtTTUFMTEVTVF07 CgogICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4g V2UgY2FuIG5vdwogICAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLgogICAgICovCiAgICBn ZW5fYml0bGVuKCh0cmVlX2Rlc2MgbmVhciAqKWRlc2MpOwoKICAgIC8qIFRoZSBmaWVsZCBsZW4g aXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KICAgIGdlbl9jb2Rl cyAoKGN0X2RhdGEgbmVhciAqKXRyZWUsIG1heF9jb2RlKTsKfQoKLyogPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09CiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBm cmVxdWVuY2llcyBvZiB0aGUgY29kZXMKICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4gVXBkYXRl cyBvcHRfbGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSByZXBlYXQKICogY291bnRzLiAoVGhl IGNvbnRyaWJ1dGlvbiBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyB3aWxsIGJlIGFkZGVkIGxhdGVy CiAqIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIGJsX3RyZWUuKQogKi8KbG9jYWwgdm9pZCBz Y2FuX3RyZWUgKHRyZWUsIG1heF9jb2RlKQogICAgY3RfZGF0YSBuZWFyICp0cmVlOyAvKiB0aGUg dHJlZSB0byBiZSBzY2FubmVkICovCiAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMg bGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwp7CiAgICBpbnQgbjsgICAgICAg ICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCiAgICBp bnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCiAgICBp bnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCiAg ICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCiAg ICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJl bnQgY29kZSAqLwogICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBj b3VudCAqLwogICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3Vu dCAqLwoKICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0g MzsKICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCgog ICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CiAgICAgICAgY3VybGVuID0gbmV4 dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CiAgICAgICAgaWYgKCsrY291bnQgPCBtYXhf Y291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAg ICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewogICAgICAgICAgICBibF90cmVlW2N1 cmxlbl0uRnJlcSArPSBjb3VudDsKICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CiAg ICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgYmxfdHJlZVtjdXJsZW5dLkZyZXErKzsK ICAgICAgICAgICAgYmxfdHJlZVtSRVBfM182XS5GcmVxKys7CiAgICAgICAgfSBlbHNlIGlmIChj b3VudCA8PSAxMCkgewogICAgICAgICAgICBibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOwogICAg ICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJsX3RyZWVbUkVQWl8xMV8xMzhdLkZyZXErKzsKICAg ICAgICB9CiAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwogICAgICAgIGlmIChu ZXh0bGVuID09IDApIHsKICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAz OwogICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgbWF4 X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBt YXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OwogICAgICAgIH0KICAgIH0KfQoKLyogPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09CiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJl c3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KICogYmxfdHJlZS4KICovCmxvY2FsIHZvaWQg c2VuZF90cmVlICh0cmVlLCBtYXhfY29kZSkKICAgIGN0X2RhdGEgbmVhciAqdHJlZTsgLyogdGhl IHRyZWUgdG8gYmUgc2Nhbm5lZCAqLwogICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRz IGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KewogICAgaW50IG47ICAgICAg ICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLwogICAg aW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwogICAg aW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLwog ICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLwog ICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJy ZW50IGNvZGUgKi8KICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQg Y291bnQgKi8KICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291 bnQgKi8KCiAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxy ZWFkeSBzZXQgKi8KICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2Nv dW50ID0gMzsKCiAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKICAgICAgICBj dXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKICAgICAgICBpZiAoKytj b3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgewogICAgICAgICAgICBjb250 aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CiAgICAgICAgICAg IGRvIHsgc2VuZF9jb2RlKGN1cmxlbiwgYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7 CgogICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKICAgICAgICAgICAgaWYgKGN1cmxl biAhPSBwcmV2bGVuKSB7CiAgICAgICAgICAgICAgICBzZW5kX2NvZGUoY3VybGVuLCBibF90cmVl KTsgY291bnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAm JiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKICAgICAgICAgICAgc2VuZF9jb2RlKFJFUF8zXzYsIGJs X3RyZWUpOyBzZW5kX2JpdHMoY291bnQtMywgMik7CgogICAgICAgIH0gZWxzZSBpZiAoY291bnQg PD0gMTApIHsKICAgICAgICAgICAgc2VuZF9jb2RlKFJFUFpfM18xMCwgYmxfdHJlZSk7IHNlbmRf Yml0cyhjb3VudC0zLCAzKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2VuZF9jb2Rl KFJFUFpfMTFfMTM4LCBibF90cmVlKTsgc2VuZF9iaXRzKGNvdW50LTExLCA3KTsKICAgICAgICB9 CiAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwogICAgICAgIGlmIChuZXh0bGVu ID09IDApIHsKICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwogICAg ICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKICAgICAgICAgICAgbWF4X2NvdW50 ID0gNiwgbWluX2NvdW50ID0gMzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXhfY291 bnQgPSA3LCBtaW5fY291bnQgPSA0OwogICAgICAgIH0KICAgIH0KfQoKLyogPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CiAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMg YW5kIHJldHVybiB0aGUgaW5kZXggaW4KICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0 aCBjb2RlIHRvIHNlbmQuCiAqLwpsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZSgpCnsKICAgIGludCBt YXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJv IGZyZXEgKi8KCiAgICBwcmludGYoIlxuYnVpbGRfYmxfdHJlZSIpOwogICAgLyogRGV0ZXJtaW5l IHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVl cyAqLwogICAgc2Nhbl90cmVlKChjdF9kYXRhIG5lYXIgKilkeW5fbHRyZWUsIGxfZGVzYy5tYXhf Y29kZSk7CiAgICBzY2FuX3RyZWUoKGN0X2RhdGEgbmVhciAqKWR5bl9kdHJlZSwgZF9kZXNjLm1h eF9jb2RlKTsKCiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLwogICAgcHJpbnRm KCJcbmJ1aWxkX3RyZWUgZnJvbSBidWlsZF9ibF90cmVlIik7CiAgICBidWlsZF90cmVlKCh0cmVl X2Rlc2MgbmVhciAqKSgmYmxfZGVzYykpOwogICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhl IGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAogICAgICogdGhlIGxl bmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhl IGNvdW50cy4KICAgICAqLwoKICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5n dGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAogICAgICogcmVxdWlyZXMgdGhhdCBh dCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKICAg ICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKICAgICAqLwogICAgZm9yICht YXhfYmxpbmRleCA9IEJMX0NPREVTLTE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0p IHsKICAgICAgICBpZiAoYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBi cmVhazsKICAgIH0KICAgIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5n dGggdHJlZSBhbmQgY291bnRzICovCiAgICBvcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsg NSs1KzQ7CiAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVs ZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4pKTsKCiAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cn0KCi8q ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQogKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcg ZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKICogbGVuZ3RocyBvZiB0aGUg Yml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUu CiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0g NC4KICovCmxvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMobGNvZGVzLCBkY29kZXMsIGJsY29kZXMp CiAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3Ig ZWFjaCB0cmVlICovCnsKICAgIGludCByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXgg aW4gYmxfb3JkZXIgKi8KCiAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEg JiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOwogICAgQXNzZXJ0IChsY29kZXMg PD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLAog ICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBj b3VudHM6ICIpKTsKICAgIHNlbmRfYml0cyhsY29kZXMtMjU3LCA1KTsgLyogbm90ICsyNTUgYXMg c3RhdGVkIGluIGFwcG5vdGUudHh0ICovCiAgICBzZW5kX2JpdHMoZGNvZGVzLTEsICAgNSk7CiAg ICBzZW5kX2JpdHMoYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90 ZS50eHQgKi8KICAgIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHsKICAg ICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsK ICAgICAgICBzZW5kX2JpdHMoYmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKICAgIH0K ICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIGJpdHNfc2VudCkpOwoK ICAgIHNlbmRfdHJlZSgoY3RfZGF0YSBuZWFyICopZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIHNl bmQgdGhlIGxpdGVyYWwgdHJlZSAqLwogICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBz ZW50ICVsZCIsIGJpdHNfc2VudCkpOwoKICAgIHNlbmRfdHJlZSgoY3RfZGF0YSBuZWFyICopZHlu X2R0cmVlLCBkY29kZXMtMSk7IC8qIHNlbmQgdGhlIGRpc3RhbmNlIHRyZWUgKi8KICAgIFRyYWNl digoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgYml0c19zZW50KSk7Cn0KCi8qID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQogKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBj dXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKICogdHJlZXMgb3Igc3RvcmUsIGFu ZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLiBUaGlzIGZ1bmN0aW9u CiAqIHJldHVybnMgdGhlIHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBm YXIuCiAqLwp1bGcgZmx1c2hfYmxvY2soYnVmLCBzdG9yZWRfbGVuLCBlb2YpCiAgICBjaGFyICpi dWY7ICAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovCiAgICB1bGcg c3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KICAgIGludCBlb2Y7ICAg ICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCnsK ICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4g aW4gYnl0ZXMgKi8KICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxl bmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KCiAgICBmbGFnX2J1ZltsYXN0X2ZsYWdzXSA9 IGZsYWdzOyAvKiBTYXZlIHRoZSBmbGFncyBmb3IgdGhlIGxhc3QgOCBpdGVtcyAqLwoKICAgIHBy aW50ZigiXG5mbHVzaCBibG9jayIpOwogICAgLy9wcmludGYoIlxuc3RvcmVkX2xlbiA9ICVsdSIs IHN0b3JlZF9sZW4pOwoKICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBhc2NpaSBvciBiaW5h cnkgKi8KICAgIGlmICgqZmlsZV90eXBlID09ICh1c2gpVU5LTk9XTikgc2V0X2ZpbGVfdHlwZSgp OwoKICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KICAg IHByaW50ZigiXG5idWlsZF90cmVlIGNhbGwgZnJvbSBmbHVzaF9ibG9jayAxIik7CiAgICBidWls ZF90cmVlKCh0cmVlX2Rlc2MgbmVhciAqKSgmbF9kZXNjKSk7CiAgICBUcmFjZXYoKHN0ZGVyciwg IlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgb3B0X2xlbiwgc3RhdGljX2xlbikpOwoK ICAgIHByaW50ZigiXG5idWlsZF90cmVlIGNhbGwgZnJvbSBmbHVzaF9ibG9jayAyIik7CiAgICBi dWlsZF90cmVlKCh0cmVlX2Rlc2MgbmVhciAqKSgmZF9kZXNjKSk7CiAgICBUcmFjZXYoKHN0ZGVy ciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4p KTsKICAgIC8vcHJpbnRmKCJcbmZsdXNoX2Jsb2NrOiBvcHRfbGVuID0gJWx1ICwgc3RhdGljX2xl biA9ICVsdSIsIG9wdF9sZW4sIHN0YXRpY19sZW4pOwogICAgLyogQXQgdGhpcyBwb2ludCwgb3B0 X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mCiAgICAgKiB0 aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRp b25zLgogICAgICovCgogICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFi b3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKICAgICAqIGluIGJsX29yZGVyIG9mIHRo ZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgogICAgICovCiAgICBwcmludGYoIlxuYnVp bGRfYmxfdHJlZSBjYWxsIGZyb20gZmx1c2hfYmxvY2siKTsKICAgIG1heF9ibGluZGV4ID0gYnVp bGRfYmxfdHJlZSgpOwoKICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0 ZSBmaXJzdCB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCiAgICBvcHRfbGVuYiA9IChvcHRf bGVuKzMrNyk+PjM7CiAgICBzdGF0aWNfbGVuYiA9IChzdGF0aWNfbGVuKzMrNyk+PjM7CiAgICBp bnB1dF9sZW4gKz0gc3RvcmVkX2xlbjsgLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCgogICAgVHJh Y2UoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQg JXUgZGlzdCAldSAiLAogICAgICAgICAgICBvcHRfbGVuYiwgb3B0X2xlbiwgc3RhdGljX2xlbmIs IHN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCiAgICAgICAgICAgIGxhc3RfbGl0LCBsYXN0X2Rpc3Qp KTsKCiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xl bmI7CgogICAgLyogSWYgY29tcHJlc3Npb24gZmFpbGVkIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBh bmQgbGFzdCBibG9jaywKICAgICAqIGFuZCBpZiB0aGUgemlwIGZpbGUgY2FuIGJlIHNlZWtlZCAo dG8gcmV3cml0ZSB0aGUgbG9jYWwgaGVhZGVyKSwKICAgICAqIHRoZSB3aG9sZSBmaWxlIGlzIHRy YW5zZm9ybWVkIGludG8gYSBzdG9yZWQgZmlsZToKICAgICAqLwojaWZkZWYgRk9SQ0VfTUVUSE9E CiAgICBpZiAobGV2ZWwgPT0gMSAmJiBlb2YgJiYgY29tcHJlc3NlZF9sZW4gPT0gMEwpIHsgLyog Zm9yY2Ugc3RvcmVkIGZpbGUgKi8KI2Vsc2UKICAgIGlmIChzdG9yZWRfbGVuIDw9IG9wdF9sZW5i ICYmIGVvZiAmJiBjb21wcmVzc2VkX2xlbiA9PSAwTCAmJiBzZWVrYWJsZSgpKSB7CiNlbmRpZgog ICAgICAgIC8qIFNpbmNlIExJVF9CVUZTSVpFIDw9IDIqV1NJWkUsIHRoZSBpbnB1dCBkYXRhIG11 c3QgYmUgdGhlcmU6ICovCiAgICAgICAgaWYgKGJ1ZiA9PSAoY2hhciopMCkgZXJyb3IgKCJibG9j ayB2YW5pc2hlZCIpOwoKICAgICAgICBjb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9s ZW4sIDApOyAvKiB3aXRob3V0IGhlYWRlciAqLwogICAgICAgIGNvbXByZXNzZWRfbGVuID0gc3Rv cmVkX2xlbiA8PCAzOwogICAgICAgICpmaWxlX21ldGhvZCA9IFNUT1JFRDsKCiNpZmRlZiBGT1JD RV9NRVRIT0QKICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMiAmJiBidWYgIT0gKGNoYXIqKTApIHsg LyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCiNlbHNlCiAgICB9IGVsc2UgaWYgKHN0b3JlZF9sZW4r NCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKICAgICAgICAgICAgICAgICAgICAg ICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovCiNlbmRpZgogICAgICAgIC8qIFRo ZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJ WkUuCiAgICAgICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhh biBXU0laRSBpbnB1dCBieXRlcyBzaW5jZQogICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNo LCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAqIHN1Y2Nlc3Nm dWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bwogICAg ICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suCiAgICAgICAgICov CiAgICAgICAgc2VuZF9iaXRzKChTVE9SRURfQkxPQ0s8PDEpK2VvZiwgMyk7ICAvKiBzZW5kIGJs b2NrIHR5cGUgKi8KICAgICAgICBjb21wcmVzc2VkX2xlbiA9IChjb21wcmVzc2VkX2xlbiArIDMg KyA3KSAmIH43TDsKICAgICAgICBjb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8 IDM7CgogICAgICAgIGNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8q IHdpdGggaGVhZGVyICovCgojaWZkZWYgRk9SQ0VfTUVUSE9ECiAgICB9IGVsc2UgaWYgKGxldmVs ID09IDMpIHsgLyogZm9yY2Ugc3RhdGljIHRyZWVzICovCiNlbHNlCiAgICB9IGVsc2UgaWYgKHN0 YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CiNlbmRpZgogICAgICAgIHNlbmRfYml0cygoU1RBVElD X1RSRUVTPDwxKStlb2YsIDMpOwogICAgICAgIGNvbXByZXNzX2Jsb2NrKChjdF9kYXRhIG5lYXIg KilzdGF0aWNfbHRyZWUsIChjdF9kYXRhIG5lYXIgKilzdGF0aWNfZHRyZWUpOwogICAgICAgIGNv bXByZXNzZWRfbGVuICs9IDMgKyBzdGF0aWNfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICBzZW5k X2JpdHMoKERZTl9UUkVFUzw8MSkrZW9mLCAzKTsKICAgICAgICBzZW5kX2FsbF90cmVlcyhsX2Rl c2MubWF4X2NvZGUrMSwgZF9kZXNjLm1heF9jb2RlKzEsIG1heF9ibGluZGV4KzEpOwogICAgICAg IGNvbXByZXNzX2Jsb2NrKChjdF9kYXRhIG5lYXIgKilkeW5fbHRyZWUsIChjdF9kYXRhIG5lYXIg KilkeW5fZHRyZWUpOwogICAgICAgIGNvbXByZXNzZWRfbGVuICs9IDMgKyBvcHRfbGVuOwogICAg fQogICAgQXNzZXJ0IChjb21wcmVzc2VkX2xlbiA9PSBiaXRzX3NlbnQsICJiYWQgY29tcHJlc3Nl ZCBzaXplIik7CiAgICBpbml0X2Jsb2NrKCk7CgogICAgaWYgKGVvZikgewogICAgICAgIEFzc2Vy dCAoaW5wdXRfbGVuID09IGlzaXplLCAiYmFkIGlucHV0IHNpemUiKTsKICAgICAgICBiaV93aW5k dXAoKTsKICAgICAgICBjb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3Vu ZGFyeSAqLwogICAgfQogICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwg Y29tcHJlc3NlZF9sZW4+PjMsCiAgICAgICAgICAgY29tcHJlc3NlZF9sZW4tNyplb2YpKTsKCiAg ICAvL3ByaW50ZigiXG5mbHVzaF9ibG9jazogY29tcHJlc3NlZF9sZW4gPSAlbHUiLCBjb21wcmVz c2VkX2xlbik7CgogICAgcmV0dXJuIGNvbXByZXNzZWRfbGVuID4+IDM7Cn0KCi8qID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQogKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5 IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVz aGVkLgogKi8KaW50IGN0X3RhbGx5IChkaXN0LCBsYykKICAgIGludCBkaXN0OyAgLyogZGlzdGFu Y2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KICAgIGludCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1J Tl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi8KewogICAgbF9idWZbbGFz dF9saXQrK10gPSAodWNoKWxjOwogICAgLy9wcmludGYoImN0X3RhbGx5XG4iKTsKICAgIGlmIChk aXN0ID09IDApIHsKICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KICAgICAg ICBkeW5fbHRyZWVbbGNdLkZyZXErKzsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogSGVyZSwgbGMg aXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLwogICAgICAgIGRpc3QtLTsgICAgICAg ICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwogICAgICAgIEFzc2VydCgodXNo KWRpc3QgPCAodXNoKU1BWF9ESVNUICYmCiAgICAgICAgICAgICAgICh1c2gpbGMgPD0gKHVzaCko TUFYX01BVENILU1JTl9NQVRDSCkgJiYKICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkg PCAodXNoKURfQ09ERVMsICAiY3RfdGFsbHk6IGJhZCBtYXRjaCIpOwoKICAgICAgICBkeW5fbHRy ZWVbbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzFdLkZyZXErKzsKICAgICAgICBkeW5fZHRyZWVb ZF9jb2RlKGRpc3QpXS5GcmVxKys7CgogICAgICAgIGRfYnVmW2xhc3RfZGlzdCsrXSA9ICh1c2gp ZGlzdDsKICAgICAgICBmbGFncyB8PSBmbGFnX2JpdDsKICAgIH0KICAgIGZsYWdfYml0IDw8PSAx OwoKICAgIC8qIE91dHB1dCB0aGUgZmxhZ3MgaWYgdGhleSBmaWxsIGEgYnl0ZTogKi8KICAgIGlm ICgobGFzdF9saXQgJiA3KSA9PSAwKSB7CiAgICAgICAgZmxhZ19idWZbbGFzdF9mbGFncysrXSA9 IGZsYWdzOwogICAgICAgIGZsYWdzID0gMCwgZmxhZ19iaXQgPSAxOwogICAgfQogICAgLyogVHJ5 IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBo ZXJlICovCiAgICBpZiAobGV2ZWwgPiAyICYmIChsYXN0X2xpdCAmIDB4ZmZmKSA9PSAwKSB7CiAg ICAJcHJpbnRmKCJcbmN0X3RhbGx5IHByw7NiYSB3eXJ6dWNlbmlhIGZsdXNoID0xIik7CiAgICAg ICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICov CiAgICAgICAgdWxnIG91dF9sZW5ndGggPSAodWxnKWxhc3RfbGl0KjhMOwogICAgICAgIHVsZyBp bl9sZW5ndGggPSAodWxnKXN0cnN0YXJ0LWJsb2NrX3N0YXJ0OwogICAgICAgIGludCBkY29kZTsK ICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CiAgICAg ICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylkeW5fZHRyZWVbZGNvZGVdLkZyZXEqKDVMK2V4dHJh X2RiaXRzW2Rjb2RlXSk7CiAgICAgICAgfQogICAgICAgIG91dF9sZW5ndGggPj49IDM7CiAgICAg ICAgVHJhY2UoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgbGFzdF9kaXN0ICV1LCBpbiAlbGQsIG91 dCB+JWxkKCVsZCUlKSAiLAogICAgICAgICAgICAgICBsYXN0X2xpdCwgbGFzdF9kaXN0LCBpbl9s ZW5ndGgsIG91dF9sZW5ndGgsCiAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwv aW5fbGVuZ3RoKSk7CiAgICAgICAgaWYgKGxhc3RfZGlzdCA8IGxhc3RfbGl0LzIgJiYgb3V0X2xl bmd0aCA8IGluX2xlbmd0aC8yKSB7CiAgICAgICAgCXByaW50ZigiICB1ZGFuYS4iKTsKICAgICAg ICAJcmV0dXJuIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAJcHJpbnRmKCIgICBuaWV1ZGFu YS4iKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGxhc3RfbGl0ID09IExJVF9CVUZTSVpFLTEg fHwgbGFzdF9kaXN0ID09IERJU1RfQlVGU0laRSl7CiAgICAJcHJpbnRmKCJcbmN0X3RhbGx5OiBr b25pZWMgZnVua2NqaSBzcHJhd2R6ZW5pZSBidWZvcsOzdyBkbGEgcmV0dXJuIDEuIik7CiAgICB9 CiAgICByZXR1cm4gKGxhc3RfbGl0ID09IExJVF9CVUZTSVpFLTEgfHwgbGFzdF9kaXN0ID09IERJ U1RfQlVGU0laRSk7CiAgICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIExJVF9CVUZTSVpFIGJl Y2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQg YmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCiAgICAgKiA2NEstMSBieXRl cy4KICAgICAqLwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogU2VuZCB0aGUgYmxvY2sgZGF0 YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCiAqLwpsb2NhbCB2b2lk IGNvbXByZXNzX2Jsb2NrKGx0cmVlLCBkdHJlZSkKICAgIGN0X2RhdGEgbmVhciAqbHRyZWU7IC8q IGxpdGVyYWwgdHJlZSAqLwogICAgY3RfZGF0YSBuZWFyICpkdHJlZTsgLyogZGlzdGFuY2UgdHJl ZSAqLwp7CiAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3Ry aW5nICovCiAgICBpbnQgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNo ZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLwogICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5u aW5nIGluZGV4IGluIGxfYnVmICovCiAgICB1bnNpZ25lZCBkeCA9IDA7ICAgIC8qIHJ1bm5pbmcg aW5kZXggaW4gZF9idWYgKi8KICAgIHVuc2lnbmVkIGZ4ID0gMDsgICAgLyogcnVubmluZyBpbmRl eCBpbiBmbGFnX2J1ZiAqLwogICAgdWNoIGZsYWcgPSAwOyAgICAgICAvKiBjdXJyZW50IGZsYWdz ICovCiAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KICAgIGlu dCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLwoKICAg IGlmIChsYXN0X2xpdCAhPSAwKSBkbyB7CiAgICAgICAgaWYgKChseCAmIDcpID09IDApIGZsYWcg PSBmbGFnX2J1ZltmeCsrXTsKICAgICAgICBsYyA9IGxfYnVmW2x4KytdOwogICAgICAgIGlmICgo ZmxhZyAmIDEpID09IDApIHsKICAgICAgICAgICAgc2VuZF9jb2RlKGxjLCBsdHJlZSk7IC8qIHNl bmQgYSBsaXRlcmFsIGJ5dGUgKi8KICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0 ZGVyciwiICclYycgIiwgbGMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBIZXJl LCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCiAgICAgICAgICAgIGNvZGUg PSBsZW5ndGhfY29kZVtsY107CiAgICAgICAgICAgIHNlbmRfY29kZShjb2RlK0xJVEVSQUxTKzEs IGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi8KICAgICAgICAgICAgZXh0cmEgPSBl eHRyYV9sYml0c1tjb2RlXTsKICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKICAgICAgICAg ICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdOwogICAgICAgICAgICAgICAgc2VuZF9iaXRz KGxjLCBleHRyYSk7ICAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqLwogICAg ICAgICAgICB9CiAgICAgICAgICAgIGRpc3QgPSBkX2J1ZltkeCsrXTsKICAgICAgICAgICAgLyog SGVyZSwgZGlzdCBpcyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovCiAgICAgICAgICAgIGNvZGUg PSBkX2NvZGUoZGlzdCk7CiAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQg ZF9jb2RlIik7CgogICAgICAgICAgICBzZW5kX2NvZGUoY29kZSwgZHRyZWUpOyAgICAgICAvKiBz ZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCiAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNb Y29kZV07CiAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CiAgICAgICAgICAgICAgICBkaXN0 IC09IGJhc2VfZGlzdFtjb2RlXTsKICAgICAgICAgICAgICAgIHNlbmRfYml0cyhkaXN0LCBleHRy YSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLwogICAgICAgICAgICB9CiAg ICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLwogICAgICAgIGZsYWcgPj49IDE7 CiAgICB9IHdoaWxlIChseCA8IGxhc3RfbGl0KTsKCiAgICBzZW5kX2NvZGUoRU5EX0JMT0NLLCBs dHJlZSk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBTZXQgdGhlIGZpbGUgdHlwZSB0byBB U0NJSSBvciBCSU5BUlksIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKICogYmluYXJ5IGlm IG1vcmUgdGhhbiAyMCUgb2YgdGhlIGJ5dGVzIGFyZSA8PSA2IG9yID49IDEyOCwgYXNjaWkgb3Ro ZXJ3aXNlLgogKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBvZiBkeW5fbHRyZWUgYXJl IHNldCBhbmQgdGhlIHRvdGFsIG9mIGFsbAogKiBmcmVxdWVuY2llcyBkb2VzIG5vdCBleGNlZWQg NjRLICh0byBmaXQgaW4gYW4gaW50IG9uIDE2IGJpdCBtYWNoaW5lcykuCiAqLwpsb2NhbCB2b2lk IHNldF9maWxlX3R5cGUoKQp7CiAgICBpbnQgbiA9IDA7CiAgICB1bnNpZ25lZCBhc2NpaV9mcmVx ID0gMDsKICAgIHVuc2lnbmVkIGJpbl9mcmVxID0gMDsKICAgIHdoaWxlIChuIDwgNykgICAgICAg IGJpbl9mcmVxICs9IGR5bl9sdHJlZVtuKytdLkZyZXE7CiAgICB3aGlsZSAobiA8IDEyOCkgICAg YXNjaWlfZnJlcSArPSBkeW5fbHRyZWVbbisrXS5GcmVxOwogICAgd2hpbGUgKG4gPCBMSVRFUkFM UykgYmluX2ZyZXEgKz0gZHluX2x0cmVlW24rK10uRnJlcTsKICAgICpmaWxlX3R5cGUgPSBiaW5f ZnJlcSA+IChhc2NpaV9mcmVxID4+IDIpID8gQklOQVJZIDogQVNDSUk7CiAgICBpZiAoKmZpbGVf dHlwZSA9PSBCSU5BUlkgJiYgdHJhbnNsYXRlX2VvbCkgewogICAgICAgIHdhcm4oIi1sIHVzZWQg b24gYmluYXJ5IGZpbGUiLCAiIik7CiAgICB9Cn0K --part52d8554de70428.92881097--
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: "Krzysztof Rybak" <krzysztofrybak6@HIDDEN> Subject: bug#16472: Acknowledgement (PD: gzip - tree overflow protection algorithm doubt/suggestion) Message-ID: <handler.16472.B.138991629913234.ack <at> debbugs.gnu.org> References: <52d8554de71410.11082928@HIDDEN> X-Gnu-PR-Message: ack 16472 X-Gnu-PR-Package: gzip Reply-To: 16472 <at> debbugs.gnu.org Date: Thu, 16 Jan 2014 23:52:03 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): bug-gzip@HIDDEN If you wish to submit further information on this problem, please send it to 16472 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 16472: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D16472 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.