From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 85F9F3858404 for ; Tue, 9 Nov 2021 16:44:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 85F9F3858404 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 616591FD34; Tue, 9 Nov 2021 16:44:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1636476286; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=dbaFKWa8tmEirlfIMiK2I0ONR6p2VI5oe0/n/50wVXY=; b=VFo/G2qABQqaOJu6HXTh5tDmRZbwcCvrG1oY2ZP+eR/VgJr6OpkS7ypZW2VCFyjPbF2cn6 dBwzDdZvXGZtVRNPr7XofHeGaqN0DAThyccEwno2fNEjunL+BQNtyjlbRiJtkKCj1pwhMk WTItjVgyR3vv0MaXnGhlmX0+CRaG8K0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1636476286; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=dbaFKWa8tmEirlfIMiK2I0ONR6p2VI5oe0/n/50wVXY=; b=ZHKkEmotLG7+FAra9ZiolzZh/UrHolCC8oGYsLR7QttlRHMKeFPGTDUUgrrAMu2zJntb1J dVMTtCxjSbztqpBw== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4221713A6A; Tue, 9 Nov 2021 16:44:46 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id bgq6Dn6limFDPgAAMHmgww (envelope-from ); Tue, 09 Nov 2021 16:44:46 +0000 Content-Type: multipart/mixed; boundary="------------wzEX1nkEnEReo2fVXgVd2sfw" Message-ID: <59763e1a-8432-5f23-c399-a9b4dd6c6dff@suse.cz> Date: Tue, 9 Nov 2021 17:44:45 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.0 From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: Re: [PATCH] Loop unswitching: support gswitch statements. To: Richard Biener , Andrew MacLeod Cc: GCC Patches References: <7791e850-f74d-8c1c-f67c-e02f3f6e007d@redhat.com> <5c6c91d4-ed8b-8d98-2cd9-bafc84e6f2a4@suse.cz> <8da24825-19ec-56a6-a68c-5c37c7acc3e1@redhat.com> Content-Language: en-US In-Reply-To: X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Nov 2021 16:44:51 -0000 This is a multi-part message in MIME format. --------------wzEX1nkEnEReo2fVXgVd2sfw Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/9/21 14:37, Richard Biener wrote: > On Mon, Nov 8, 2021 at 8:45 PM Andrew MacLeod wrote: >> >> On 11/8/21 10:05 AM, Martin Liška wrote: >>> On 9/28/21 22:39, Andrew MacLeod wrote: >>>> In Theory, modifying the IL should be fine, it happens already in >>>> places, but its not extensively tested under those conditions yet. >>> >>> Hello Andrew. >>> >>> I've just tried using a global gimple_ranger and it crashes when loop >>> unswitching duplicates >>> some BBs. >>> >>> Please try the attached patch for: >> >> hey Martin, >> >> try using this in your tree. Since nothing else is using a growing BB >> right now, I'll let you work with it and see if everything works as >> expected before checking it in, just in case we need more tweaking. >> With this, >> >> make RUNTESTFLAGS=dg.exp=loop-unswitch*.c check-gcc >> >> runs clean. >> >> >> basically, I tried to grow it by either a factor of 10% for the current >> BB size when the grow is requested, or some double the needed extra >> size, or 128... whichever value is "maximum" That means it shoudnt be >> asking for tooo much each time, but also not a minimum amount. >> >> Im certainly open to suggestion on how much to grow it each time. >> Note the vector being grown is ONLY fo the SSA_NAme being asked for.. so >> it really an on-demand thing just for specific names, in your case, >> mostly just the switch index. >> >> Let me know how this works for you, and if you have any other issues. > > So I think in the end we shouldn't need the growing. Ideally we'd do all > the analysis before the first transform, but for that we'd need ranger to > be able to "simplify" conditions based on a known true/false predicate > that's not yet in the IL. Consider > > for (;;) > { > if (invariant < 3) // A > { > ... > } > if (invariant < 5) // B > { > ... > } > } > > unswitch analysis will run into the condition 'A' and determine the loop > can be unswitched with the condition 'invariant < 3'. To be able to > perform cost assessment and to avoid redundant unswitching we > want to determine that if we unswitch with 'invariant < 3' being > true then the condition at 'B' is true as well before actually inserting > the if (invariant < 3) outside of the loop. > > So I'm thinking of assigning a gimple_uid to each condition we want to > unswitch on and have an array indexed by the uid with meta-data on > the unswitch opportunity, the "related" conditions could be marked with > the same uid (or some other), and the folding result recorded so that > at transform time we can just do the appropriate replacement without > invoking ranger again. Calculating all this before transformation is quite ambitious based on the code we have now. Note one can have in a loop: if (a > 100) ... switch (a) case 1000: ... case 20: ... case 200: ... which means the first predicate effectively makes some cases unreachable. Moreover one can have if (a > 100 && b < 300) ... and more complex conditions. > > Now, but how do we arrange for the ranger analysis here? That's likely something we need support from ranger, yes. > > We might also somehow want to remember that on the > 'invariant < 3' == false copy of the loop there's still the > unswitching opportunity on 'invariant < 5', but not on the > 'invariant < 5' == true copy. > > Currently unswitching uses a custom simplify_using_entry_checks > which tries to do simplification only after the fact (and so costing > also is far from costing the true cost and ordering of the opportunities > to do the best first is not implemented either). I'm sending updated version of the patch where I changed: - simplify_using_entry_checks is put back for the floating point expressions - all scans utilize scan-tree-dump-times - some new tests were added - global ranger is used (I rely on the growing patch provided by Andrew) - better ranger API is used for gcond expression: ranger.range_of_stmt (r, stmt) && r.singleton_p (&result)) - auto_edge_flag is used now Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Thoughts? Martin > > Richard. > >> Andrew >> --------------wzEX1nkEnEReo2fVXgVd2sfw Content-Type: text/x-patch; charset=UTF-8; name="0001-Loop-unswitching-support-gswitch-statements.patch" Content-Disposition: attachment; filename="0001-Loop-unswitching-support-gswitch-statements.patch" Content-Transfer-Encoding: base64 RnJvbSBjZDE0YzU4NjY4NjIzYjMwMjg3NjRkOTIwOWZkNmI1NTEwOTM5ZTI5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJ0aW4gTGlza2EgPG1saXNrYUBzdXNlLmN6PgpE YXRlOiBXZWQsIDEgU2VwIDIwMjEgMTM6MDQ6MTUgKzAyMDAKU3ViamVjdDogW1BBVENIXSBM b29wIHVuc3dpdGNoaW5nOiBzdXBwb3J0IGdzd2l0Y2ggc3RhdGVtZW50cy4KClRoZSBwYXRj aCBleHRlbmRzIHRoZSBsb29wIHVuc3dpdGNoaW5nIHBhc3Mgc28gdGhhdCBnc3dpdGNoCnN0 YXRlbWVudHMgYXJlIHN1cHBvcnRlZC4gVGhlIHBhc3Mgbm93IHVzZXMgcmFuZ2VyIHdoaWNo IG1hcmtzCnN3aXRjaCBlZGdlcyB0aGF0IGFyZSBrbm93biB0byBiZSB1bnJlYWNoYWJsZSBp biBhIHZlcnNpb25lZCBsb29wLgoKZ2NjL0NoYW5nZUxvZzoKCgkqIHRyZWUtY2ZnLmMgKGdp bXBsZV9sdl9hZGRfY29uZGl0aW9uX3RvX2JiKTogU3VwcG9ydCBub24tZ2ltcGxlCglleHBy ZXNzaW9ucyB0aGF0IG5lZWRzIHRvIGJlIGdpbXBsaWZpZWQuCgkqIHRyZWUtc3NhLWxvb3At dW5zd2l0Y2guYyAodHJlZV91bnN3aXRjaF9sb29wKTogQWRkIG5ldwoJY29uZF9lZGdlIGFy Z3VtZW50LgoJKHRyZWVfbWF5X3Vuc3dpdGNoX29uKTogU3VwcG9ydCBnc3dpdGNoIHN0YXRl bWVudHMuCgkoY2xlYW5fdXBfc3dpdGNoZXMpOiBOZXcgZnVuY3Rpb24uCgkodHJlZV9zc2Ff dW5zd2l0Y2hfbG9vcHMpOiBDYWxsIGNsZWFuX3VwX3N3aXRjaGVzLgoJKHRyZWVfdW5zd2l0 Y2hfc2luZ2xlX2xvb3ApOiBDaGFuZ2UgYXNzdW1wdGlvbnMuCgpnY2MvdGVzdHN1aXRlL0No YW5nZUxvZzoKCgkqIGdjYy5kZy9sb29wLXVuc3dpdGNoLTYuYzogTmV3IHRlc3QuCgkqIGdj Yy5kZy9sb29wLXVuc3dpdGNoLTcuYzogTmV3IHRlc3QuCgkqIGdjYy5kZy9sb29wLXVuc3dp dGNoLTguYzogTmV3IHRlc3QuCgkqIGdjYy5kZy9sb29wLXVuc3dpdGNoLTkuYzogTmV3IHRl c3QuCgkqIGdjYy5kZy9sb29wLXVuc3dpdGNoLTEwLmM6IE5ldyB0ZXN0LgoJKiBnY2MuZGcv bG9vcC11bnN3aXRjaC0xMS5jOiBOZXcgdGVzdC4KCkNvLUF1dGhvcmVkLUJ5OiBSaWNoYXJk IEJpZW5lciA8cmd1ZW50aGVyQHN1c2UuZGU+Ci0tLQogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcv bG9vcC11bnN3aXRjaC0xMC5jIHwgIDI4ICsrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9v cC11bnN3aXRjaC0xMS5jIHwgIDYwICsrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9v cC11bnN3aXRjaC02LmMgIHwgIDU2ICsrKysrCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9sb29w LXVuc3dpdGNoLTcuYyAgfCAgNDUgKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11 bnN3aXRjaC04LmMgIHwgIDI4ICsrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3 aXRjaC05LmMgIHwgIDM0ICsrKwogZ2NjL3RyZWUtY2ZnLmMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICA3ICstCiBnY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jICAgICAgICAg ICAgfCAyNzIgKysrKysrKysrKysrKysrKysrKy0tLS0tCiA4IGZpbGVzIGNoYW5nZWQsIDQ3 OSBpbnNlcnRpb25zKCspLCA1MSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBn Y2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTEwLmMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTExLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTYuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtNy5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRj aC04LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVu c3dpdGNoLTkuYwoKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5z d2l0Y2gtMTAuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtMTAuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNzQ3ZGUyNzI5MzUKLS0t IC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTEw LmMKQEAgLTAsMCArMSwyOCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGct b3B0aW9ucyAiLU8yIC1mdW5zd2l0Y2gtbG9vcHMgLWZkdW1wLXRyZWUtdW5zd2l0Y2gtZGV0 YWlscyIgfSAqLworCitpbnQKK2Zvbyhkb3VibGUgKmEsIGRvdWJsZSAqYiwgZG91YmxlICpj LCBkb3VibGUgKmQsIGRvdWJsZSAqciwgaW50IHNpemUsIGZsb2F0IG9yZGVyKQoreworICBm b3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgeworICAgIGRvdWJsZSB0bXA7CisK KyAgICBpZiAob3JkZXIgPT0gMS5mKQorICAgICAgdG1wID0gLTggKiBhW2ldOworICAgIGVs c2UKKyAgICAgIHRtcCA9IC00ICogYltpXTsKKworICAgIGRvdWJsZSB4ID0gMyAqIHRtcCAr IGRbaV0gKyB0bXA7CisKKyAgICBpZiAob3JkZXIgPT0gMS5mKQorICAgICAgeCArPSAyOwor CisgICAgZG91YmxlIHkgPSAzLjRmICogdG1wICsgZFtpXTsKKyAgICByW2ldID0geCArIHk7 CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1k dW1wLXRpbWVzICI7OyBVbnN3aXRjaGluZyBsb29wIHdpdGggY29uZGl0aW9uOiBvcmRlci4q ID09IDEuMGUiIDEgInVuc3dpdGNoIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtMTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xv b3AtdW5zd2l0Y2gtMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uMzBmNGYzNDdmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5k Zy9sb29wLXVuc3dpdGNoLTExLmMKQEAgLTAsMCArMSw2MCBAQAorLyogeyBkZy1kbyBjb21w aWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mdW5zd2l0Y2gtbG9vcHMgLWZkdW1w LXRyZWUtdW5zd2l0Y2gtZGV0YWlscyAtLXBhcmFtPW1heC11bnN3aXRjaC1pbnNucz0xMDAw IC0tcGFyYW09bWF4LXVuc3dpdGNoLWxldmVsPTEwIiB9ICovCisKK2ludAorX19hdHRyaWJ1 dGVfXygobm9pcGEpKQorZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKmMsIGRv dWJsZSAqZCwgZG91YmxlICpyLCBpbnQgc2l6ZSwgaW50IG9yZGVyKQoreworICBmb3IgKGlu dCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgeworICAgIGRvdWJsZSB0bXAsIHRtcDI7CisK KyAgICBpZiAob3JkZXIgPD0gMCkKKyAgICAgIHRtcCA9IDEyMzsKKworICAgIHN3aXRjaChv cmRlcikKKyAgICB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHRtcCArPSAtOCAqIGFbaV07 CisgICAgICAgIHRtcDIgPSAyICogYltpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNl IDE6IAorICAgICAgICB0bXAgPSAzICogYVtpXSAtICAyICogYltpXTsKKyAgICAgICAgdG1w MiA9IDUgKiBiW2ldIC0gMiAqIGNbaV07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAy OgorICAgICAgICB0bXAgPSA5ICogYVtpXSArICAyICogYltpXSArIGNbaV07CisgICAgICAg IHRtcDIgPSA0ICogYltpXSArIDIgKiBjW2ldICsgOCAqIGRbaV07CisgICAgICAgIGJyZWFr OworICAgICAgY2FzZSAzOgorICAgICAgICB0bXAgPSAzICogYVtpXSArICAyICogYltpXSAt IGNbaV07CisgICAgICAgIHRtcDIgPSBiW2ldIC0gMiAqIGNbaV0gKyA4ICogZFtpXTsKKyAg ICAgICAgYnJlYWs7CisgICAgICBkZWZhdXQ6CisgICAgICAgIF9fYnVpbHRpbl91bnJlYWNo YWJsZSAoKTsKKyAgICB9CisKKyAgICBkb3VibGUgeCA9IDMgKiB0bXAgKyBkW2ldICsgdG1w OworICAgIGRvdWJsZSB5ID0gMy40ZiAqIHRtcCArIGRbaV0gKyB0bXAyOworICAgIHJbaV0g PSB4ICsgeTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisjZGVmaW5lIE4gMTYgKiAxMDI0 Citkb3VibGUgYWFbTl0sIGJiW05dLCBjY1tOXSwgZGRbTl0sIHJyW05dOworCitpbnQgbWFp bigpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwICogMTAwMDsgaSsrKQorICAgIGZv byAoYWEsIGJiLCBjYywgZGQsIHJyLCBOLCBpICUgNCk7Cit9CisKKworLyogVGVzdCB0aGF0 IHdlIGFjdHVhbGx5IHVuc3dpdGNoZWQgc29tZXRoaW5nLiAgKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiOzsgVW5zd2l0Y2hpbmcgbG9vcCB3aXRoIGNvbmRp dGlvbjogb3JkZXIuKiA8PSAwIiAxICJ1bnN3aXRjaCIgfSB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIjs7IFVuc3dpdGNoaW5nIGxvb3Agd2l0aCBjb25k aXRpb246IG9yZGVyLiogPT0gMCIgMSAidW5zd2l0Y2giIH0gfSAqLworLyogeyBkZy1maW5h bCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBVbnN3aXRjaGluZyBsb29wIHdpdGggY29u ZGl0aW9uOiBvcmRlci4qID09IDEiIDEgInVuc3dpdGNoIiB9IH0gKi8KKy8qIHsgZGctZmlu YWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiOzsgVW5zd2l0Y2hpbmcgbG9vcCB3aXRoIGNv bmRpdGlvbjogb3JkZXIuKiA9PSAyIiAxICJ1bnN3aXRjaCIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIjs7IFVuc3dpdGNoaW5nIGxvb3Agd2l0aCBj b25kaXRpb246IG9yZGVyLiogPT0gMyIgMSAidW5zd2l0Y2giIH0gfSAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC02LmMgYi9nY2MvdGVzdHN1 aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uMzE1ZDY4NTA4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVz dHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTYuYwpAQCAtMCwwICsxLDU2IEBACisvKiB7 IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLWZ1bnN3aXRjaC1s b29wcyAtZmR1bXAtdHJlZS11bnN3aXRjaC1kZXRhaWxzIC0tcGFyYW09bWF4LXVuc3dpdGNo LWluc25zPTEwMDAgLS1wYXJhbT1tYXgtdW5zd2l0Y2gtbGV2ZWw9MTAiIH0gKi8KKworaW50 CitfX2F0dHJpYnV0ZV9fKChub2lwYSkpCitmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRv dWJsZSAqYywgZG91YmxlICpkLCBkb3VibGUgKnIsIGludCBzaXplLCBpbnQgb3JkZXIpCit7 CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICB7CisgICAgZG91YmxlIHRt cCwgdG1wMjsKKworICAgIHN3aXRjaChvcmRlcikKKyAgICB7CisgICAgICBjYXNlIDA6Cisg ICAgICAgIHRtcCA9IC04ICogYVtpXTsKKyAgICAgICAgdG1wMiA9IDIgKiBiW2ldOworICAg ICAgICBicmVhazsKKyAgICAgIGNhc2UgMTogCisgICAgICAgIHRtcCA9IDMgKiBhW2ldIC0g IDIgKiBiW2ldOworICAgICAgICB0bXAyID0gNSAqIGJbaV0gLSAyICogY1tpXTsKKyAgICAg ICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHRtcCA9IDkgKiBhW2ldICsgIDIg KiBiW2ldICsgY1tpXTsKKyAgICAgICAgdG1wMiA9IDQgKiBiW2ldICsgMiAqIGNbaV0gKyA4 ICogZFtpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIHRtcCA9 IDMgKiBhW2ldICsgIDIgKiBiW2ldIC0gY1tpXTsKKyAgICAgICAgdG1wMiA9IGJbaV0gLSAy ICogY1tpXSArIDggKiBkW2ldOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1dDoKKyAg ICAgICAgX19idWlsdGluX3VucmVhY2hhYmxlICgpOworICAgIH0KKworICAgIGRvdWJsZSB4 ID0gMyAqIHRtcCArIGRbaV0gKyB0bXA7CisgICAgZG91YmxlIHkgPSAzLjRmICogdG1wICsg ZFtpXSArIHRtcDI7CisgICAgcltpXSA9IHggKyB5OworICB9CisKKyAgcmV0dXJuIDA7Cit9 CisKKyNkZWZpbmUgTiAxNiAqIDEwMjQKK2RvdWJsZSBhYVtOXSwgYmJbTl0sIGNjW05dLCBk ZFtOXSwgcnJbTl07CisKK2ludCBtYWluKCkKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAx MDAgKiAxMDAwOyBpKyspCisgICAgZm9vIChhYSwgYmIsIGNjLCBkZCwgcnIsIE4sIGkgJSA0 KTsKK30KKworCisvKiBUZXN0IHRoYXQgd2UgYWN0dWFsbHkgdW5zd2l0Y2hlZCBzb21ldGhp bmcuICAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBVbnN3 aXRjaGluZyBsb29wIHdpdGggY29uZGl0aW9uOiBvcmRlci4qID09IDAiIDEgInVuc3dpdGNo IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiOzsgVW5z d2l0Y2hpbmcgbG9vcCB3aXRoIGNvbmRpdGlvbjogb3JkZXIuKiA9PSAxIiAxICJ1bnN3aXRj aCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIjs7IFVu c3dpdGNoaW5nIGxvb3Agd2l0aCBjb25kaXRpb246IG9yZGVyLiogPT0gMiIgMSAidW5zd2l0 Y2giIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBV bnN3aXRjaGluZyBsb29wIHdpdGggY29uZGl0aW9uOiBvcmRlci4qID09IDMiIDEgInVuc3dp dGNoIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5z d2l0Y2gtNy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC03LmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmVmYWJkNTI4ODZjCi0tLSAv ZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC03LmMK QEAgLTAsMCArMSw0NSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIC1mdW5zd2l0Y2gtbG9vcHMgLWZkdW1wLXRyZWUtdW5zd2l0Y2gtZGV0YWls cyAtLXBhcmFtPW1heC11bnN3aXRjaC1pbnNucz0xMDAwIC0tcGFyYW09bWF4LXVuc3dpdGNo LWxldmVsPTEwIiB9ICovCisKK2ludAorZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3Vi bGUgKmMsIGRvdWJsZSAqZCwgZG91YmxlICpyLCBpbnQgc2l6ZSwgaW50IG9yZGVyKQorewor ICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgeworICAgIGRvdWJsZSB0bXAs IHRtcDI7CisKKyAgICBzd2l0Y2gob3JkZXIpCisgICAgeworICAgICAgY2FzZSA1IC4uLiA2 OgorICAgICAgY2FzZSA5OgorICAgICAgICB0bXAgPSAtOCAqIGFbaV07CisgICAgICAgIHRt cDIgPSAyICogYltpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOiAKKyAgICAg ICAgdG1wID0gMyAqIGFbaV0gLSAgMiAqIGJbaV07CisgICAgICAgIHRtcDIgPSA1ICogYltp XSAtIDIgKiBjW2ldOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjI6CisgICAgICAg IHRtcCA9IDkgKiBhW2ldICsgIDIgKiBiW2ldICsgY1tpXTsKKyAgICAgICAgdG1wMiA9IDQg KiBiW2ldICsgMiAqIGNbaV0gKyA4ICogZFtpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICBj YXNlIDMzOgorICAgICAgICB0bXAgPSAzICogYVtpXSArICAyICogYltpXSAtIGNbaV07Cisg ICAgICAgIHRtcDIgPSBiW2ldIC0gMiAqIGNbaV0gKyA4ICogZFtpXTsKKyAgICAgICAgYnJl YWs7CisgICAgICBkZWZhdXQ6CisgICAgICAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSAoKTsK KyAgICB9CisKKyAgICBkb3VibGUgeCA9IDMgKiB0bXAgKyBkW2ldICsgdG1wOworICAgIGRv dWJsZSB5ID0gMy40ZiAqIHRtcCArIGRbaV0gKyB0bXAyOworICAgIHJbaV0gPSB4ICsgeTsK KyAgfQorCisgIHJldHVybiAwOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtdGltZXMgIjs7IFVuc3dpdGNoaW5nIGxvb3Agd2l0aCBjb25kaXRpb246IG9yZGVyXy4q ID49IDUgJiBvcmRlcl8uKiA8PSA2IFxcfCBvcmRlcl8uKiA9PSA5IiAxICJ1bnN3aXRjaCIg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtdGltZXMgIjs7IFVuc3dp dGNoaW5nIGxvb3Agd2l0aCBjb25kaXRpb246IG9yZGVyLiogPT0gMSIgMSAidW5zd2l0Y2gi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBVbnN3 aXRjaGluZyBsb29wIHdpdGggY29uZGl0aW9uOiBvcmRlci4qID09IDIiIDEgInVuc3dpdGNo IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiOzsgVW5z d2l0Y2hpbmcgbG9vcCB3aXRoIGNvbmRpdGlvbjogb3JkZXIuKiA9PSAzIiAxICJ1bnN3aXRj aCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dp dGNoLTguYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtOC5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40Y2VjMWY1M2JjYwotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtOC5jCkBA IC0wLDAgKzEsMjggQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtZnVuc3dpdGNoLWxvb3BzIC1mZHVtcC10cmVlLXVuc3dpdGNoLWRldGFpbHMi IH0gKi8KKworaW50Citmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRvdWJsZSAqYywgZG91 YmxlICpkLCBkb3VibGUgKnIsIGludCBzaXplLCBpbnQgb3JkZXIpCit7CisgIGZvciAoaW50 IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICB7CisgICAgZG91YmxlIHRtcDsKKworICAgIGlm IChvcmRlciA9PSAxKQorICAgICAgdG1wID0gLTggKiBhW2ldOworICAgIGVsc2UKKyAgICAg IHRtcCA9IC00ICogYltpXTsKKworICAgIGRvdWJsZSB4ID0gMyAqIHRtcCArIGRbaV0gKyB0 bXA7CisKKyAgICBpZiAob3JkZXIgPT0gMSkKKyAgICAgIHggKz0gMjsKKworICAgIGRvdWJs ZSB5ID0gMy40ZiAqIHRtcCArIGRbaV07CisgICAgcltpXSA9IHggKyB5OworICB9CisKKyAg cmV0dXJuIDA7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAi OzsgVW5zd2l0Y2hpbmcgbG9vcCB3aXRoIGNvbmRpdGlvbjogb3JkZXIuKiA9PSAxIiAxICJ1 bnN3aXRjaCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29w LXVuc3dpdGNoLTkuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtOS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4zMDU4ZDRhNWIzOAot LS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gt OS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRn LW9wdGlvbnMgIi1PMiAtZnVuc3dpdGNoLWxvb3BzIC1mZHVtcC10cmVlLXVuc3dpdGNoLWRl dGFpbHMiIH0gKi8KKworaW50Citmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRvdWJsZSAq YywgZG91YmxlICpkLCBkb3VibGUgKnIsIGludCBzaXplLCB1bnNpZ25lZCBvcmRlcikKK3sK KyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgIHsKKyAgICBkb3VibGUgdG1w OworCisgICAgc3dpdGNoIChvcmRlcikKKyAgICAgIHsKKyAgICAgIGNhc2UgMCAuLi4gNDoK Kwl0bXAgPSAtOCAqIGFbaV07CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXRtcCA9IC00 ICogYltpXTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGRvdWJsZSB4ID0gMyAqIHRtcCAr IGRbaV0gKyB0bXA7CisKKyAgICAvKiBUaGlzIHNob3VsZCBub3QgYmUgdW5zd2l0Y2hlZCBh cyBpdCdzIG11dHVhbGx5IGV4Y2x1ZGVkIHdpdGggY2FzZSAwIC4uLiA0LiAgKi8KKyAgICBp ZiAob3JkZXIgPj0gNSkKKyAgICAgIHggKz0gMjsKKworICAgIGRvdWJsZSB5ID0gMy40ZiAq IHRtcCArIGRbaV07CisgICAgcltpXSA9IHggKyB5OworICB9CisKKyAgcmV0dXJuIDA7Cit9 CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAiOzsgVW5zd2l0Y2hp bmcgbG9vcCB3aXRoIGNvbmRpdGlvbjogb3JkZXIuKiA8PSA0IiAxICJ1bnN3aXRjaCIgfSB9 ICovCmRpZmYgLS1naXQgYS9nY2MvdHJlZS1jZmcuYyBiL2djYy90cmVlLWNmZy5jCmluZGV4 IDhlZDhjNjliNWIxLi43ZGI1NGYxY2RhMiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtY2ZnLmMK KysrIGIvZ2NjL3RyZWUtY2ZnLmMKQEAgLTkwNjIsMTEgKzkwNjIsMTYgQEAgZ2ltcGxlX2x2 X2FkZF9jb25kaXRpb25fdG9fYmIgKGJhc2ljX2Jsb2NrIGZpcnN0X2hlYWQgQVRUUklCVVRF X1VOVVNFRCwKICAgZWRnZSBlMDsKIAogICAvKiBCdWlsZCBuZXcgY29uZGl0aW9uYWwgZXhw ciAqLworICBnc2kgPSBnc2lfbGFzdF9iYiAoY29uZF9iYik7CisKKyAgY29uZF9leHByID0g Zm9yY2VfZ2ltcGxlX29wZXJhbmRfZ3NpXzEgKCZnc2ksIGNvbmRfZXhwciwKKwkJCQkJICBp c19naW1wbGVfY29uZGV4cHJfZm9yX2NvbmQsCisJCQkJCSAgTlVMTF9UUkVFLCBmYWxzZSwK KwkJCQkJICBHU0lfQ09OVElOVUVfTElOS0lORyk7CiAgIG5ld19jb25kX2V4cHIgPSBnaW1w bGVfYnVpbGRfY29uZF9mcm9tX3RyZWUgKGNvbmRfZXhwciwKIAkJCQkJICAgICAgIE5VTExf VFJFRSwgTlVMTF9UUkVFKTsKIAogICAvKiBBZGQgbmV3IGNvbmQgaW4gY29uZF9iYi4gICov Ci0gIGdzaSA9IGdzaV9sYXN0X2JiIChjb25kX2JiKTsKICAgZ3NpX2luc2VydF9hZnRlciAo JmdzaSwgbmV3X2NvbmRfZXhwciwgR1NJX05FV19TVE1UKTsKIAogICAvKiBBZGp1c3QgZWRn ZXMgYXBwcm9wcmlhdGVseSB0byBjb25uZWN0IG5ldyBoZWFkIHdpdGggZmlyc3QgaGVhZApk aWZmIC0tZ2l0IGEvZ2NjL3RyZWUtc3NhLWxvb3AtdW5zd2l0Y2guYyBiL2djYy90cmVlLXNz YS1sb29wLXVuc3dpdGNoLmMKaW5kZXggZmU0ZGFjYzA4MzMuLmJiNGZmNzYwMTY2IDEwMDY0 NAotLS0gYS9nY2MvdHJlZS1zc2EtbG9vcC11bnN3aXRjaC5jCisrKyBiL2djYy90cmVlLXNz YS1sb29wLXVuc3dpdGNoLmMKQEAgLTM3LDYgKzM3LDEwIEBAIGFsb25nIHdpdGggR0NDOyBz ZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAiZ2ltcGxlLWl0 ZXJhdG9yLmgiCiAjaW5jbHVkZSAiY2ZnaG9va3MuaCIKICNpbmNsdWRlICJ0cmVlLXNzYS1s b29wLW1hbmlwLmgiCisjaW5jbHVkZSAiY2ZnYW5hbC5oIgorI2luY2x1ZGUgInRyZWUtY2Zn Y2xlYW51cC5oIgorI2luY2x1ZGUgInRyZWUtcHJldHR5LXByaW50LmgiCisjaW5jbHVkZSAi Z2ltcGxlLXJhbmdlLmgiCiAKIC8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsb29wIHVu c3dpdGNoaW5nLCBpLmUuIHRyYW5zZm9ybWF0aW9uIG9mIGxvb3BzIGxpa2UKIApAQCAtNzQs OSArNzgsMTAgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElm IG5vdCBzZWUKICAgIHRyZWUtc3NhLWxvb3AtaW0uYyBlbnN1cmVzIHRoYXQgYWxsIHRoZSBz dWl0YWJsZSBjb25kaXRpb25zIGFyZSBpbiB0aGlzCiAgICBzaGFwZS4gICovCiAKLXN0YXRp YyBjbGFzcyBsb29wICp0cmVlX3Vuc3dpdGNoX2xvb3AgKGNsYXNzIGxvb3AgKiwgYmFzaWNf YmxvY2ssIHRyZWUpOwotc3RhdGljIGJvb2wgdHJlZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAo Y2xhc3MgbG9vcCAqLCBpbnQpOwotc3RhdGljIHRyZWUgdHJlZV9tYXlfdW5zd2l0Y2hfb24g KGJhc2ljX2Jsb2NrLCBjbGFzcyBsb29wICopOworc3RhdGljIGNsYXNzIGxvb3AgKnRyZWVf dW5zd2l0Y2hfbG9vcCAoY2xhc3MgbG9vcCAqLCBiYXNpY19ibG9jaywgdHJlZSwgZWRnZSk7 CitzdGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChjbGFzcyBsb29wICos IGludCwgY29uc3QgYXV0b19lZGdlX2ZsYWcgJik7CitzdGF0aWMgdHJlZSB0cmVlX21heV91 bnN3aXRjaF9vbiAoYmFzaWNfYmxvY2ssIGNsYXNzIGxvb3AgKiwgZWRnZSAqLAorCQkJCSAg Y29uc3QgYXV0b19lZGdlX2ZsYWcgJik7CiBzdGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX291 dGVyX2xvb3AgKGNsYXNzIGxvb3AgKik7CiBzdGF0aWMgZWRnZSBmaW5kX2xvb3BfZ3VhcmQg KGNsYXNzIGxvb3AgKik7CiBzdGF0aWMgYm9vbCBlbXB0eV9iYl93aXRob3V0X2d1YXJkX3Ag KGNsYXNzIGxvb3AgKiwgYmFzaWNfYmxvY2spOwpAQCAtODQsNiArODksNyBAQCBzdGF0aWMg Ym9vbCB1c2VkX291dHNpZGVfbG9vcF9wIChjbGFzcyBsb29wICosIHRyZWUpOwogc3RhdGlj IHZvaWQgaG9pc3RfZ3VhcmQgKGNsYXNzIGxvb3AgKiwgZWRnZSk7CiBzdGF0aWMgYm9vbCBj aGVja19leGl0X3BoaSAoY2xhc3MgbG9vcCAqKTsKIHN0YXRpYyB0cmVlIGdldF92b3BfZnJv bV9oZWFkZXIgKGNsYXNzIGxvb3AgKik7CitzdGF0aWMgdm9pZCBjbGVhbl91cF9zd2l0Y2hl cyAoY29uc3QgYXV0b19lZGdlX2ZsYWcgJmlnbm9yZWRfZWRnZV9mbGFnKTsKIAogLyogTWFp biBlbnRyeSBwb2ludC4gIFBlcmZvcm0gbG9vcCB1bnN3aXRjaGluZyBvbiBhbGwgc3VpdGFi bGUgbG9vcHMuICAqLwogCkBAIC05MSwxOSArOTcsMjMgQEAgdW5zaWduZWQgaW50CiB0cmVl X3NzYV91bnN3aXRjaF9sb29wcyAodm9pZCkKIHsKICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7 CisgIGF1dG9fZWRnZV9mbGFnIGlnbm9yZWRfZWRnZV9mbGFnIChjZnVuKTsKIAogICAvKiBH byB0aHJvdWdoIGFsbCBsb29wcyBzdGFydGluZyBmcm9tIGlubmVybW9zdC4gICovCiAgIGZv ciAoYXV0byBsb29wIDogbG9vcHNfbGlzdCAoY2Z1biwgTElfRlJPTV9JTk5FUk1PU1QpKQog ICAgIHsKICAgICAgIGlmICghbG9vcC0+aW5uZXIpCiAJLyogVW5zd2l0Y2ggaW5uZXJtb3N0 IGxvb3AuICAqLwotCWNoYW5nZWQgfD0gdHJlZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAobG9v cCwgMCk7CisJY2hhbmdlZCB8PSB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChsb29wLCAw LCBpZ25vcmVkX2VkZ2VfZmxhZyk7CiAgICAgICBlbHNlCiAJY2hhbmdlZCB8PSB0cmVlX3Vu c3dpdGNoX291dGVyX2xvb3AgKGxvb3ApOwogICAgIH0KIAogICBpZiAoY2hhbmdlZCkKLSAg ICByZXR1cm4gVE9ET19jbGVhbnVwX2NmZzsKKyAgICB7CisgICAgICBjbGVhbl91cF9zd2l0 Y2hlcyAoaWdub3JlZF9lZGdlX2ZsYWcpOworICAgICAgcmV0dXJuIFRPRE9fY2xlYW51cF9j Zmc7CisgICAgfQogICByZXR1cm4gMDsKIH0KIApAQCAtMTgyLDQ3ICsxOTIsMTE1IEBAIGlz X21heWJlX3VuZGVmaW5lZCAoY29uc3QgdHJlZSBuYW1lLCBnaW1wbGUgKnN0bXQsIGNsYXNz IGxvb3AgKmxvb3ApCiB9CiAKIC8qIENoZWNrcyB3aGV0aGVyIHdlIGNhbiB1bnN3aXRjaCBM T09QIG9uIGNvbmRpdGlvbiBhdCBlbmQgb2YgQkIgLS0gb25lIG9mIGl0cwotICAgYmFzaWMg YmxvY2tzIChmb3Igd2hhdCBpdCBtZWFucyBzZWUgY29tbWVudHMgYmVsb3cpLiAgKi8KKyAg IGJhc2ljIGJsb2NrcyAoZm9yIHdoYXQgaXQgbWVhbnMgc2VlIGNvbW1lbnRzIGJlbG93KS4K KyAgIFdoZW4gYSBnc3dpdGNoIGNhc2UgaXMgcmV0dXJuZWQsIGZpbGwgdXAgQ09ORF9FREdF IGZvciBpdC4gICovCiAKIHN0YXRpYyB0cmVlCi10cmVlX21heV91bnN3aXRjaF9vbiAoYmFz aWNfYmxvY2sgYmIsIGNsYXNzIGxvb3AgKmxvb3ApCit0cmVlX21heV91bnN3aXRjaF9vbiAo YmFzaWNfYmxvY2sgYmIsIGNsYXNzIGxvb3AgKmxvb3AsIGVkZ2UgKmNvbmRfZWRnZSwKKwkJ ICAgICAgY29uc3QgYXV0b19lZGdlX2ZsYWcgJmlnbm9yZWRfZWRnZV9mbGFnKQogewogICBn aW1wbGUgKmxhc3QsICpkZWY7Ci0gIGdjb25kICpzdG10OwotICB0cmVlIGNvbmQsIHVzZTsK KyAgdHJlZSB1c2U7CiAgIGJhc2ljX2Jsb2NrIGRlZl9iYjsKICAgc3NhX29wX2l0ZXIgaXRl cjsKIAogICAvKiBCQiBtdXN0IGVuZCBpbiBhIHNpbXBsZSBjb25kaXRpb25hbCBqdW1wLiAg Ki8KICAgbGFzdCA9IGxhc3Rfc3RtdCAoYmIpOwotICBpZiAoIWxhc3QgfHwgZ2ltcGxlX2Nv ZGUgKGxhc3QpICE9IEdJTVBMRV9DT05EKQotICAgIHJldHVybiBOVUxMX1RSRUU7Ci0gIHN0 bXQgPSBhc19hIDxnY29uZCAqPiAobGFzdCk7CisgIGlmIChnY29uZCAqc3RtdCA9IHNhZmVf ZHluX2Nhc3QgPGdjb25kICo+IChsYXN0KSkKKyAgICB7CisgICAgICAvKiBUbyBrZWVwIHRo ZSB0aGluZ3Mgc2ltcGxlLCB3ZSBkbyBub3QgZGlyZWN0bHkgcmVtb3ZlIHRoZSBjb25kaXRp b25zLAorCSBidXQganVzdCByZXBsYWNlIHRlc3RzIHdpdGggMCAhPSAwIHJlc3AuIDEgIT0g MC4gIFByZXZlbnQgdGhlIGluZmluaXRlCisJIGxvb3Agd2hlcmUgd2Ugd291bGQgdW5zd2l0 Y2ggYWdhaW4gb24gc3VjaCBhIGNvbmRpdGlvbi4gICovCisgICAgICBpZiAoZ2ltcGxlX2Nv bmRfdHJ1ZV9wIChzdG10KSB8fCBnaW1wbGVfY29uZF9mYWxzZV9wIChzdG10KSkKKwlyZXR1 cm4gTlVMTF9UUkVFOwogCi0gIC8qIFRvIGtlZXAgdGhlIHRoaW5ncyBzaW1wbGUsIHdlIGRv IG5vdCBkaXJlY3RseSByZW1vdmUgdGhlIGNvbmRpdGlvbnMsCi0gICAgIGJ1dCBqdXN0IHJl cGxhY2UgdGVzdHMgd2l0aCAwICE9IDAgcmVzcC4gMSAhPSAwLiAgUHJldmVudCB0aGUgaW5m aW5pdGUKLSAgICAgbG9vcCB3aGVyZSB3ZSB3b3VsZCB1bnN3aXRjaCBhZ2FpbiBvbiBzdWNo IGEgY29uZGl0aW9uLiAgKi8KLSAgaWYgKGdpbXBsZV9jb25kX3RydWVfcCAoc3RtdCkgfHwg Z2ltcGxlX2NvbmRfZmFsc2VfcCAoc3RtdCkpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKKyAg ICAgIC8qIENvbmRpdGlvbiBtdXN0IGJlIGludmFyaWFudC4gICovCisgICAgICBGT1JfRUFD SF9TU0FfVFJFRV9PUEVSQU5EICh1c2UsIHN0bXQsIGl0ZXIsIFNTQV9PUF9VU0UpCisJewor CSAgZGVmID0gU1NBX05BTUVfREVGX1NUTVQgKHVzZSk7CisJICBkZWZfYmIgPSBnaW1wbGVf YmIgKGRlZik7CisJICBpZiAoZGVmX2JiCisJICAgICAgJiYgZmxvd19iYl9pbnNpZGVfbG9v cF9wIChsb29wLCBkZWZfYmIpKQorCSAgICByZXR1cm4gTlVMTF9UUkVFOworCSAgLyogVW5z d2l0Y2hpbmcgb24gdW5kZWZpbmVkIHZhbHVlcyB3b3VsZCBpbnRyb2R1Y2UgdW5kZWZpbmVk CisJICAgICBiZWhhdmlvciB0aGF0IHRoZSBvcmlnaW5hbCBwcm9ncmFtIG1pZ2h0IG5ldmVy IGV4ZXJjaXNlLiAgKi8KKwkgIGlmIChpc19tYXliZV91bmRlZmluZWQgKHVzZSwgc3RtdCwg bG9vcCkpCisJICAgIHJldHVybiBOVUxMX1RSRUU7CisJfQogCi0gIC8qIENvbmRpdGlvbiBt dXN0IGJlIGludmFyaWFudC4gICovCi0gIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKHVz ZSwgc3RtdCwgaXRlciwgU1NBX09QX1VTRSkKKyAgICAgIGVkZ2UgZTEgPSBFREdFX1NVQ0Mg KGJiLCAwKTsKKyAgICAgIGVkZ2UgZTIgPSBFREdFX1NVQ0MgKGJiLCAxKTsKKyAgICAgICpj b25kX2VkZ2UgPSBlMS0+ZmxhZ3MgJiBFREdFX1RSVUVfVkFMVUUgPyBlMSA6IGUyOworICAg ICAgcmV0dXJuIGJ1aWxkMiAoZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCksIGJvb2xlYW5fdHlw ZV9ub2RlLAorCQkgICAgIGdpbXBsZV9jb25kX2xocyAoc3RtdCksIGdpbXBsZV9jb25kX3Jo cyAoc3RtdCkpOworICAgIH0KKyAgZWxzZSBpZiAoZ3N3aXRjaCAqc3RtdCA9IHNhZmVfZHlu X2Nhc3QgPGdzd2l0Y2ggKj4gKGxhc3QpKQogICAgIHsKLSAgICAgIGRlZiA9IFNTQV9OQU1F X0RFRl9TVE1UICh1c2UpOworICAgICAgdW5zaWduZWQgbmxhYmVscyA9IGdpbXBsZV9zd2l0 Y2hfbnVtX2xhYmVscyAoc3RtdCk7CisgICAgICB0cmVlIGlkeCA9IGdpbXBsZV9zd2l0Y2hf aW5kZXggKHN0bXQpOworICAgICAgaWYgKFRSRUVfQ09ERSAoaWR4KSAhPSBTU0FfTkFNRQor CSAgfHwgbmxhYmVscyA8IDEpCisJcmV0dXJuIE5VTExfVFJFRTsKKyAgICAgIC8qIEluZGV4 IG11c3QgYmUgaW52YXJpYW50LiAgKi8KKyAgICAgIGRlZiA9IFNTQV9OQU1FX0RFRl9TVE1U IChpZHgpOwogICAgICAgZGVmX2JiID0gZ2ltcGxlX2JiIChkZWYpOwogICAgICAgaWYgKGRl Zl9iYgogCSAgJiYgZmxvd19iYl9pbnNpZGVfbG9vcF9wIChsb29wLCBkZWZfYmIpKQogCXJl dHVybiBOVUxMX1RSRUU7CiAgICAgICAvKiBVbnN3aXRjaGluZyBvbiB1bmRlZmluZWQgdmFs dWVzIHdvdWxkIGludHJvZHVjZSB1bmRlZmluZWQKIAkgYmVoYXZpb3IgdGhhdCB0aGUgb3Jp Z2luYWwgcHJvZ3JhbSBtaWdodCBuZXZlciBleGVyY2lzZS4gICovCi0gICAgICBpZiAoaXNf bWF5YmVfdW5kZWZpbmVkICh1c2UsIHN0bXQsIGxvb3ApKQorICAgICAgaWYgKGlzX21heWJl X3VuZGVmaW5lZCAoaWR4LCBzdG10LCBsb29wKSkKIAlyZXR1cm4gTlVMTF9UUkVFOwotICAg IH0KIAotICBjb25kID0gYnVpbGQyIChnaW1wbGVfY29uZF9jb2RlIChzdG10KSwgYm9vbGVh bl90eXBlX25vZGUsCi0JCSBnaW1wbGVfY29uZF9saHMgKHN0bXQpLCBnaW1wbGVfY29uZF9y aHMgKHN0bXQpKTsKKyAgICAgIGVkZ2UgZTsKKyAgICAgIGVkZ2VfaXRlcmF0b3IgZWk7Cisg ICAgICBGT1JfRUFDSF9FREdFIChlLCBlaSwgZ2ltcGxlX2JiIChzdG10KS0+c3VjY3MpCisJ eworCSAgaWYgKCEoZS0+ZmxhZ3MgJiBpZ25vcmVkX2VkZ2VfZmxhZykpCisJICAgIHsKKwkg ICAgICAvKiBCdWlsZCBjb21wb3VuZCBleHByZXNzaW9uIGZvciBhbGwgY2FzZXMgbGVhZGlu ZworCQkgdG8gdGhpcyBlZGdlLiAgKi8KKwkgICAgICB0cmVlIGV4cHIgPSBOVUxMX1RSRUU7 CisJICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IGdpbXBsZV9zd2l0Y2hfbnVtX2xh YmVscyAoc3RtdCk7ICsraSkKKwkJeworCQkgIHRyZWUgbGFiID0gZ2ltcGxlX3N3aXRjaF9s YWJlbCAoc3RtdCwgaSk7CisJCSAgYmFzaWNfYmxvY2sgZGVzdCA9IGxhYmVsX3RvX2Jsb2Nr IChjZnVuLCBDQVNFX0xBQkVMIChsYWIpKTsKKwkJICBlZGdlIGUyID0gZmluZF9lZGdlIChn aW1wbGVfYmIgKHN0bXQpLCBkZXN0KTsKKwkJICBpZiAoZSA9PSBlMikKKwkJICAgIHsKKwkJ ICAgICAgdHJlZSBjbXA7CisJCSAgICAgIGlmIChDQVNFX0hJR0ggKGxhYikgIT0gTlVMTF9U UkVFKQorCQkJeworCQkJICB0cmVlIGNtcDEgPSBidWlsZDIgKEdFX0VYUFIsIGJvb2xlYW5f dHlwZV9ub2RlLCBpZHgsCisJCQkJCSAgICAgIENBU0VfTE9XIChsYWIpKTsKKwkJCSAgdHJl ZSBjbXAyID0gYnVpbGQyIChMRV9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwgaWR4LAorCQkJ CQkgICAgICBDQVNFX0hJR0ggKGxhYikpOworCQkJICBjbXAgPSBidWlsZDIgKEJJVF9BTkRf RVhQUiwgYm9vbGVhbl90eXBlX25vZGUsIGNtcDEsCisJCQkJCWNtcDIpOworCQkJfQorCQkg ICAgICBlbHNlCisJCQljbXAgPSBidWlsZDIgKEVRX0VYUFIsIGJvb2xlYW5fdHlwZV9ub2Rl LCBpZHgsCisJCQkJICAgICAgQ0FTRV9MT1cgKGxhYikpOworCisJCSAgICAgIC8qIENvbWJp bmUgdGhlIGV4cHJlc3Npb24gd2l0aCB0aGUgZXhpc3Rpbmcgb25lLiAgKi8KKwkJICAgICAg aWYgKGV4cHIgPT0gTlVMTF9UUkVFKQorCQkJZXhwciA9IGNtcDsKKwkJICAgICAgZWxzZQor CQkJZXhwciA9IGJ1aWxkMiAoQklUX0lPUl9FWFBSLCBib29sZWFuX3R5cGVfbm9kZSwgZXhw ciwKKwkJCQkgICAgICAgY21wKTsKKwkJICAgIH0KKwkJfQogCi0gIHJldHVybiBjb25kOwor CSAgICAgIGlmIChleHByICE9IE5VTExfVFJFRSkKKwkJeworCQkgICpjb25kX2VkZ2UgPSBl OworCQkgIHJldHVybiBleHByOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVy biBOVUxMX1RSRUU7CiB9CiAKIC8qIFNpbXBsaWZpZXMgQ09ORCB1c2luZyBjaGVja3MgaW4g ZnJvbnQgb2YgdGhlIGVudHJ5IG9mIHRoZSBMT09QLiAgSnVzdCB2ZXJ5CkBAIC0yNjMsMTIg KzM0MSwxNCBAQCBzaW1wbGlmeV91c2luZ19lbnRyeV9jaGVja3MgKGNsYXNzIGxvb3AgKmxv b3AsIHRyZWUgY29uZCkKICAgIGdyb3cgZXhwb25lbnRpYWxseS4gICovCiAKIHN0YXRpYyBi b29sCi10cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChjbGFzcyBsb29wICpsb29wLCBpbnQg bnVtKQordHJlZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAoY2xhc3MgbG9vcCAqbG9vcCwgaW50 IG51bSwKKwkJCSAgIGNvbnN0IGF1dG9fZWRnZV9mbGFnICZpZ25vcmVkX2VkZ2VfZmxhZykK IHsKICAgYmFzaWNfYmxvY2sgKmJiczsKICAgY2xhc3MgbG9vcCAqbmxvb3A7CiAgIHVuc2ln bmVkIGksIGZvdW5kOwogICB0cmVlIGNvbmQgPSBOVUxMX1RSRUU7CisgIGVkZ2UgY29uZF9l ZGdlID0gTlVMTDsKICAgZ2ltcGxlICpzdG10OwogICBib29sIGNoYW5nZWQgPSBmYWxzZTsK ICAgSE9TVF9XSURFX0lOVCBpdGVyYXRpb25zOwpAQCAtMzExLDExICszOTEsMTMgQEAgdHJl ZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAoY2xhc3MgbG9vcCAqbG9vcCwgaW50IG51bSkKICAg YmJzID0gZ2V0X2xvb3BfYm9keSAobG9vcCk7CiAgIGZvdW5kID0gbG9vcC0+bnVtX25vZGVz OwogCisgIGdpbXBsZV9yYW5nZXIgcmFuZ2VyOwogICB3aGlsZSAoMSkKICAgICB7CiAgICAg ICAvKiBGaW5kIGEgYmIgdG8gdW5zd2l0Y2ggb24uICAqLwogICAgICAgZm9yICg7IGkgPCBs b29wLT5udW1fbm9kZXM7IGkrKykKLQlpZiAoKGNvbmQgPSB0cmVlX21heV91bnN3aXRjaF9v biAoYmJzW2ldLCBsb29wKSkpCisJaWYgKChjb25kID0gdHJlZV9tYXlfdW5zd2l0Y2hfb24g KGJic1tpXSwgbG9vcCwgJmNvbmRfZWRnZSwKKwkJCQkJICBpZ25vcmVkX2VkZ2VfZmxhZykp KQogCSAgYnJlYWs7CiAKICAgICAgIGlmIChpID09IGxvb3AtPm51bV9ub2RlcykKQEAgLTMz MywyNCArNDE1LDc3IEBAIHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGNsYXNzIGxvb3Ag Kmxvb3AsIGludCBudW0pCiAJICBicmVhazsKIAl9CiAKLSAgICAgIGNvbmQgPSBzaW1wbGlm eV91c2luZ19lbnRyeV9jaGVja3MgKGxvb3AsIGNvbmQpOwogICAgICAgc3RtdCA9IGxhc3Rf c3RtdCAoYmJzW2ldKTsKLSAgICAgIGlmIChpbnRlZ2VyX25vbnplcm9wIChjb25kKSkKKyAg ICAgIGdjb25kICpjb25kaXRpb24gPSBkeW5fY2FzdDxnY29uZCAqPiAoc3RtdCk7CisgICAg ICBnc3dpdGNoICpzd3RjaCA9IGR5bl9jYXN0PGdzd2l0Y2ggKj4gKHN0bXQpOworCisgICAg ICBpZiAoY29uZGl0aW9uICE9IE5VTEwpCiAJewotCSAgLyogUmVtb3ZlIGZhbHNlIHBhdGgu ICAqLwotCSAgZ2ltcGxlX2NvbmRfc2V0X2NvbmRpdGlvbl9mcm9tX3RyZWUgKGFzX2EgPGdj b25kICo+IChzdG10KSwKLQkJCQkJICAgICAgIGJvb2xlYW5fdHJ1ZV9ub2RlKTsKLQkgIGNo YW5nZWQgPSB0cnVlOworCSAgdHJlZSByZXN1bHQ7CisJICBpbnRfcmFuZ2VfbWF4IHI7CisK KwkgIGlmIChyYW5nZXIucmFuZ2Vfb2Zfc3RtdCAociwgc3RtdCkgJiYgci5zaW5nbGV0b25f cCAoJnJlc3VsdCkpCisJICAgIHsKKwkgICAgICBnaW1wbGVfY29uZF9zZXRfY29uZGl0aW9u X2Zyb21fdHJlZSAoY29uZGl0aW9uLAorCQkJCQkJICAgcmVzdWx0KTsKKwkgICAgICB1cGRh dGVfc3RtdCAoY29uZGl0aW9uKTsKKwkgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKwkgICAgfQor CSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFJlbW92ZSBsZWdhY3kgY29kZSBm b3IgZmxvYXRpbmcgcG9pbnQgdHlwZSB0aGF0CisJCSBpcyBjdXJyZW50bHkgbm90IHN1cHBv cnRlZCBieSByYW5nZXIuICAqLworCSAgICAgIGNvbmQgPSBzaW1wbGlmeV91c2luZ19lbnRy eV9jaGVja3MgKGxvb3AsIGNvbmQpOworCSAgICAgIGlmIChpbnRlZ2VyX25vbnplcm9wIChj b25kKSkKKwkJeworCQkgIGdpbXBsZV9jb25kX3NldF9jb25kaXRpb25fZnJvbV90cmVlIChj b25kaXRpb24sCisJCQkJCQkgICAgICAgYm9vbGVhbl90cnVlX25vZGUpOworCQkgIHVwZGF0 ZV9zdG10IChjb25kaXRpb24pOworCQkgIGNoYW5nZWQgPSB0cnVlOworCQl9CisJICAgICAg ZWxzZSBpZiAoaW50ZWdlcl96ZXJvcCAoY29uZCkpCisJCXsKKwkJICAvKiBSZW1vdmUgdHJ1 ZSBwYXRoLiAgKi8KKwkJICBnaW1wbGVfY29uZF9zZXRfY29uZGl0aW9uX2Zyb21fdHJlZSAo Y29uZGl0aW9uLAorCQkJCQkJICAgICAgIGJvb2xlYW5fZmFsc2Vfbm9kZSk7CisJCSAgdXBk YXRlX3N0bXQgKGNvbmRpdGlvbik7CisJCSAgY2hhbmdlZCA9IHRydWU7CisJCX0KKwkgICAg fQogCX0KLSAgICAgIGVsc2UgaWYgKGludGVnZXJfemVyb3AgKGNvbmQpKQorICAgICAgZWxz ZSBpZiAoc3d0Y2ggIT0gTlVMTCkKIAl7Ci0JICAvKiBSZW1vdmUgdHJ1ZSBwYXRoLiAgKi8K LQkgIGdpbXBsZV9jb25kX3NldF9jb25kaXRpb25fZnJvbV90cmVlIChhc19hIDxnY29uZCAq PiAoc3RtdCksCi0JCQkJCSAgICAgICBib29sZWFuX2ZhbHNlX25vZGUpOwotCSAgY2hhbmdl ZCA9IHRydWU7CisJICBoYXNoX3NldDxlZGdlPiBpZ25vcmVkX2VkZ2VzOworCSAgdW5zaWdu ZWQgbmxhYmVscyA9IGdpbXBsZV9zd2l0Y2hfbnVtX2xhYmVscyAoc3d0Y2gpOworCSAgdHJl ZSBpbmRleF9jYW5kaWRhdGUgPSBOVUxMX1RSRUU7CisKKwkgIGZvciAodW5zaWduZWQgaSA9 IDA7IGkgPCBubGFiZWxzOyArK2kpCisJICAgIHsKKwkgICAgICB0cmVlIGxhYiA9IGdpbXBs ZV9zd2l0Y2hfbGFiZWwgKHN3dGNoLCBpKTsKKwkgICAgICBiYXNpY19ibG9jayBkZXN0ID0g bGFiZWxfdG9fYmxvY2sgKGNmdW4sIENBU0VfTEFCRUwgKGxhYikpOworCSAgICAgIGVkZ2Ug ZSA9IGZpbmRfZWRnZSAoZ2ltcGxlX2JiIChzdG10KSwgZGVzdCk7CisKKwkgICAgICBpbnRf cmFuZ2VfbWF4IHI7CisJICAgICAgaWYgKHJhbmdlci5yYW5nZV9vbl9lZGdlIChyLCBlLCBn aW1wbGVfc3dpdGNoX2luZGV4IChzd3RjaCkpCisJCSAgJiYgci51bmRlZmluZWRfcCAoKSkK KwkJeworCQkgIGUtPmZsYWdzIHw9IGlnbm9yZWRfZWRnZV9mbGFnOworCQkgIGlnbm9yZWRf ZWRnZXMuYWRkIChlKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJaW5kZXhfY2FuZGlkYXRlID0g Q0FTRV9MT1cgKGxhYik7CisJICAgIH0KKworCSAgaWYgKGluZGV4X2NhbmRpZGF0ZSAhPSBO VUxMX1RSRUUKKwkgICAgICAmJiBpZ25vcmVkX2VkZ2VzLmVsZW1lbnRzICgpID09IEVER0Vf Q09VTlQgKGJic1tpXS0+c3VjY3MpIC0gMSkKKwkgICAgeworCSAgICAgIGdpbXBsZV9zd2l0 Y2hfc2V0X2luZGV4IChzd3RjaCwgaW5kZXhfY2FuZGlkYXRlKTsKKwkgICAgICB1cGRhdGVf c3RtdCAoc3d0Y2gpOworCSAgICB9CiAJfQorCiAgICAgICAvKiBEbyBub3QgdW5zd2l0Y2gg dG9vIG11Y2guICAqLwotICAgICAgZWxzZSBpZiAobnVtID4gcGFyYW1fbWF4X3Vuc3dpdGNo X2xldmVsKQorICAgICAgaWYgKG51bSA+IHBhcmFtX21heF91bnN3aXRjaF9sZXZlbCkKIAl7 CiAJICBpKys7CiAJICBjb250aW51ZTsKQEAgLTM3MSw3ICs1MDYsNiBAQCB0cmVlX3Vuc3dp dGNoX3NpbmdsZV9sb29wIChjbGFzcyBsb29wICpsb29wLCBpbnQgbnVtKQogCSAgYnJlYWs7 CiAJfQogCi0gICAgICB1cGRhdGVfc3RtdCAoc3RtdCk7CiAgICAgICBpKys7CiAgICAgfQog CkBAIC00MzUsNyArNTY5LDggQEAgdHJlZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAoY2xhc3Mg bG9vcCAqbG9vcCwgaW50IG51bSkKICAgICAgIC8qIEZpbmQgYSBiYiB0byB1bnN3aXRjaCBv bi4gICovCiAgICAgICBmb3IgKDsgZm91bmQgPCBsb29wLT5udW1fbm9kZXM7IGZvdW5kKysp CiAJaWYgKChiYnNbZm91bmRdLT5mbGFncyAmIEJCX1JFQUNIQUJMRSkKLQkgICAgJiYgKGNv bmQgPSB0cmVlX21heV91bnN3aXRjaF9vbiAoYmJzW2ZvdW5kXSwgbG9vcCkpKQorCSAgICAm JiAoY29uZCA9IHRyZWVfbWF5X3Vuc3dpdGNoX29uIChiYnNbZm91bmRdLCBsb29wLCAmY29u ZF9lZGdlLAorCQkJCQkgICAgIGlnbm9yZWRfZWRnZV9mbGFnKSkpCiAJICBicmVhazsKIAog ICAgICAgaWYgKGZvdW5kID09IGxvb3AtPm51bV9ub2RlcykKQEAgLTQ0NiwxMSArNTgxLDE1 IEBAIHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGNsYXNzIGxvb3AgKmxvb3AsIGludCBu dW0pCiAgICAgfQogCiAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVU QUlMUykpCi0gICAgZnByaW50ZiAoZHVtcF9maWxlLCAiOzsgVW5zd2l0Y2hpbmcgbG9vcFxu Iik7CisgICAgeworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiOzsgVW5zd2l0Y2hpbmcg bG9vcCB3aXRoIGNvbmRpdGlvbjogIik7CisgICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1 bXBfZmlsZSwgY29uZCk7CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOworICAg IH0KIAogICBpbml0aWFsaXplX29yaWdpbmFsX2NvcHlfdGFibGVzICgpOwogICAvKiBVbnN3 aXRjaCB0aGUgbG9vcCBvbiB0aGlzIGNvbmRpdGlvbi4gICovCi0gIG5sb29wID0gdHJlZV91 bnN3aXRjaF9sb29wIChsb29wLCBiYnNbZm91bmRdLCBjb25kKTsKKyAgbmxvb3AgPSB0cmVl X3Vuc3dpdGNoX2xvb3AgKGxvb3AsIGJic1tmb3VuZF0sIGNvbmQsIGNvbmRfZWRnZSk7CiAg IGlmICghbmxvb3ApCiAgICAgewogICAgICAgZnJlZV9vcmlnaW5hbF9jb3B5X3RhYmxlcyAo KTsKQEAgLTQ2Myw4ICs2MDIsOCBAQCB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChjbGFz cyBsb29wICpsb29wLCBpbnQgbnVtKQogICBmcmVlX29yaWdpbmFsX2NvcHlfdGFibGVzICgp OwogCiAgIC8qIEludm9rZSBpdHNlbGYgb24gbW9kaWZpZWQgbG9vcHMuICAqLwotICB0cmVl X3Vuc3dpdGNoX3NpbmdsZV9sb29wIChubG9vcCwgbnVtICsgMSk7Ci0gIHRyZWVfdW5zd2l0 Y2hfc2luZ2xlX2xvb3AgKGxvb3AsIG51bSArIDEpOworICB0cmVlX3Vuc3dpdGNoX3Npbmds ZV9sb29wIChubG9vcCwgbnVtICsgMSwgaWdub3JlZF9lZGdlX2ZsYWcpOworICB0cmVlX3Vu c3dpdGNoX3NpbmdsZV9sb29wIChsb29wLCBudW0gKyAxLCBpZ25vcmVkX2VkZ2VfZmxhZyk7 CiAgIGZyZWUgKGJicyk7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtNDc2LDE4ICs2MTUsMTUg QEAgdHJlZV91bnN3aXRjaF9zaW5nbGVfbG9vcCAoY2xhc3MgbG9vcCAqbG9vcCwgaW50IG51 bSkKIAogc3RhdGljIGNsYXNzIGxvb3AgKgogdHJlZV91bnN3aXRjaF9sb29wIChjbGFzcyBs b29wICpsb29wLAotCQkgICAgYmFzaWNfYmxvY2sgdW5zd2l0Y2hfb24sIHRyZWUgY29uZCkK KwkJICAgIGJhc2ljX2Jsb2NrIHVuc3dpdGNoX29uLCB0cmVlIGNvbmQsIGVkZ2UgY29uZF9l ZGdlKQogewogICBwcm9maWxlX3Byb2JhYmlsaXR5IHByb2JfdHJ1ZTsKLSAgZWRnZSBlZGdl X3RydWUsIGVkZ2VfZmFsc2U7CiAKICAgLyogU29tZSBzYW5pdHkgY2hlY2tpbmcuICAqLwog ICBnY2NfYXNzZXJ0IChmbG93X2JiX2luc2lkZV9sb29wX3AgKGxvb3AsIHVuc3dpdGNoX29u KSk7Ci0gIGdjY19hc3NlcnQgKEVER0VfQ09VTlQgKHVuc3dpdGNoX29uLT5zdWNjcykgPT0g Mik7CiAgIGdjY19hc3NlcnQgKGxvb3AtPmlubmVyID09IE5VTEwpOwogCi0gIGV4dHJhY3Rf dHJ1ZV9mYWxzZV9lZGdlc19mcm9tX2Jsb2NrICh1bnN3aXRjaF9vbiwgJmVkZ2VfdHJ1ZSwg JmVkZ2VfZmFsc2UpOwotICBwcm9iX3RydWUgPSBlZGdlX3RydWUtPnByb2JhYmlsaXR5Owor ICBwcm9iX3RydWUgPSBjb25kX2VkZ2UtPnByb2JhYmlsaXR5OwogICByZXR1cm4gbG9vcF92 ZXJzaW9uIChsb29wLCB1bnNoYXJlX2V4cHIgKGNvbmQpLAogCQkgICAgICAgTlVMTCwgcHJv Yl90cnVlLAogCQkgICAgICAgcHJvYl90cnVlLmludmVydCAoKSwKQEAgLTk2NSw2ICsxMTAx LDQyIEBAIGNoZWNrX2V4aXRfcGhpIChjbGFzcyBsb29wICpsb29wKQogICByZXR1cm4gdHJ1 ZTsKIH0KIAorLyogUmVtb3ZlIGFsbCBkZWFkIGNhc2VzIGZyb20gc3dpdGNoZXMgdGhhdCBh cmUgdW5zd2l0Y2hlZC4gICovCisKK3N0YXRpYyB2b2lkCitjbGVhbl91cF9zd2l0Y2hlcyAo Y29uc3QgYXV0b19lZGdlX2ZsYWcgJmlnbm9yZWRfZWRnZV9mbGFnKQoreworICBiYXNpY19i bG9jayBiYjsKKworICBGT1JfRUFDSF9CQl9GTiAoYmIsIGNmdW4pCisgICAgeworICAgICAg Z2ltcGxlICpsYXN0ID0gbGFzdF9zdG10IChiYik7CisgICAgICBpZiAoZ3N3aXRjaCAqc3Rt dCA9IHNhZmVfZHluX2Nhc3QgPGdzd2l0Y2ggKj4gKGxhc3QpKQorCXsKKwkgIHVuc2lnbmVk IG5sYWJlbHMgPSBnaW1wbGVfc3dpdGNoX251bV9sYWJlbHMgKHN0bXQpOworCSAgdW5zaWdu ZWQgaW5kZXggPSAxOworCSAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IG5sYWJlbHM7ICsr aSkKKwkgICAgeworCSAgICAgIHRyZWUgbGFiID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3Rt dCwgaSk7CisJICAgICAgYmFzaWNfYmxvY2sgZGVzdCA9IGxhYmVsX3RvX2Jsb2NrIChjZnVu LCBDQVNFX0xBQkVMIChsYWIpKTsKKwkgICAgICBlZGdlIGUgPSBmaW5kX2VkZ2UgKGdpbXBs ZV9iYiAoc3RtdCksIGRlc3QpOworCSAgICAgIGlmIChlID09IE5VTEwpCisJCTsgLyogVGhl IGVkZ2UgaXMgYWxyZWFkeSByZW1vdmVkLiAgKi8KKwkgICAgICBlbHNlIGlmIChlLT5mbGFn cyAmIGlnbm9yZWRfZWRnZV9mbGFnKQorCQlyZW1vdmVfZWRnZSAoZSk7CisJICAgICAgZWxz ZQorCQl7CisJCSAgZ2ltcGxlX3N3aXRjaF9zZXRfbGFiZWwgKHN0bXQsIGluZGV4LCBsYWIp OworCQkgICsraW5kZXg7CisJCX0KKwkgICAgfQorCisJICBpZiAoaW5kZXggIT0gbmxhYmVs cykKKwkgICAgZ2ltcGxlX3N3aXRjaF9zZXRfbnVtX2xhYmVscyAoc3RtdCwgaW5kZXgpOwor CX0KKyAgICB9Cit9CisKIC8qIExvb3AgdW5zd2l0Y2hpbmcgcGFzcy4gICovCiAKIG5hbWVz cGFjZSB7Ci0tIAoyLjMzLjEKCg== --------------wzEX1nkEnEReo2fVXgVd2sfw--