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 8E0293858412 for ; Wed, 24 Nov 2021 14:14:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8E0293858412 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 79FD71FD2F; Wed, 24 Nov 2021 14:14:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1637763283; 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=ESEQcuTfnJrowlnKqNKgcId9Ajn8PDyM5ZCBLTtvat8=; b=EM5ufh/1HWJfIGg36FR6r6qrnMlSE6gzHQthmUBQHCQoBY83ALPPSaQpEW6+kjIRYM7T2i AKZa4Hxj0dR8aOjtEesFOeHsEcSmUhH1me9X0x2SanhLBNTcBsiqGAsWS0sILnj3wbgrAA uAf0BA92pEqrbrHasQU+XNZe1P3xx9U= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1637763283; 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=ESEQcuTfnJrowlnKqNKgcId9Ajn8PDyM5ZCBLTtvat8=; b=bJXEodJop0YKsAe2ZRTZ7KqFHg6IOSmYdyqpE37IgYg65/AfBzT7vfNgPNe5etVi0uTukl Y9k/2V9arYrFhnAw== 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 5D29B13F26; Wed, 24 Nov 2021 14:14:43 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id wXGZFdNInmHfXQAAMHmgww (envelope-from ); Wed, 24 Nov 2021 14:14:43 +0000 Content-Type: multipart/mixed; boundary="------------GuDMenYiWCeul8cQSkTEcJ8c" Message-ID: <7bcc368c-3f26-4503-aec1-a3d6378e33ec@suse.cz> Date: Wed, 24 Nov 2021 15:14:42 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.3.0 Subject: Re: [PATCH] Loop unswitching: support gswitch statements. Content-Language: en-US To: Richard Biener Cc: Aldy Hernandez , GCC Patches References: <5c6c91d4-ed8b-8d98-2cd9-bafc84e6f2a4@suse.cz> <8da24825-19ec-56a6-a68c-5c37c7acc3e1@redhat.com> <59763e1a-8432-5f23-c399-a9b4dd6c6dff@suse.cz> <0db1d9e8-f097-e766-a9fa-1a98c47b8115@suse.cz> <3a07ef98-d05f-dc07-2e36-a2b4ffd52936@suse.cz> From: =?UTF-8?Q?Martin_Li=c5=a1ka?= In-Reply-To: X-Spam-Status: No, score=-13.6 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: Wed, 24 Nov 2021 14:14:47 -0000 This is a multi-part message in MIME format. --------------GuDMenYiWCeul8cQSkTEcJ8c Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/24/21 13:48, Richard Biener wrote: > Yup. You did have a branch, right? Maybe I'll poke at it a bit as well. Well, I rebase quite a bit as it's under heavy development now. Do you want me creating a devel/* branch? Anyway, I've got a proof-of-concept patch that does: - unswitch_predicates are first discovered before top-level tree_unswitch_single_loop is called and they live in a shared cache based on gimple::uid. - finding candidates in a loop is easy -> uses unswitch_predicates from the previous step - note I allow multiple unswitch_predicates for a BB, it's because gswitch that can emit > 2 for a switch - evaluate_loop_insns_for_predicate does not fold any statements - folding happens right before a recursive tree_unswitch_single_loop happens - costing is not resolved yet, but should be easy - combine_range can intersect all iranges for a given index variable (gimple_cond_lhs for now). It likely miscompiles gcc.dg/loop-unswitch-5.c, working on that.. Thoughts? Cheers, Martin --------------GuDMenYiWCeul8cQSkTEcJ8c Content-Type: text/x-patch; charset=UTF-8; name="loop-unswitch-candidate.patch" Content-Disposition: attachment; filename="loop-unswitch-candidate.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9kYmdjbnQuZGVmIGIvZ2NjL2RiZ2NudC5kZWYKaW5kZXggZjhh MTVmM2QxZDEuLjI3OGZiMTExMmIzIDEwMDY0NAotLS0gYS9nY2MvZGJnY250LmRlZgorKysg Yi9nY2MvZGJnY250LmRlZgpAQCAtMTg3LDYgKzE4Nyw3IEBAIERFQlVHX0NPVU5URVIgKGly YV9tb3ZlKQogREVCVUdfQ09VTlRFUiAoaXZvcHRzX2xvb3ApCiBERUJVR19DT1VOVEVSIChs aW0pCiBERUJVR19DT1VOVEVSIChsb2NhbF9hbGxvY19mb3Jfc2NoZWQpCitERUJVR19DT1VO VEVSIChsb29wX3Vuc3dpdGNoKQogREVCVUdfQ09VTlRFUiAobWF0Y2gpCiBERUJVR19DT1VO VEVSIChtZXJnZWRfaXBhX2ljZikKIERFQlVHX0NPVU5URVIgKHBoaW9wdF9lZGdlX3Jhbmdl KQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC04LmMg Yi9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTguYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYWU1ZjhmMzAwZTkKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9sb29wLXVuc3dpdGNoLTguYwpAQCAtMCwwICsx LDMxIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIg LWZ1bnN3aXRjaC1sb29wcyAtZmR1bXAtdHJlZS11bnN3aXRjaC1kZXRhaWxzIiB9ICovCisK K2ludAorZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKmMsIGRvdWJsZSAqZCwg ZG91YmxlICpyLCBpbnQgc2l6ZSwgaW50IG9yZGVyKQoreworICBmb3IgKGludCBpID0gMDsg aSA8IHNpemU7IGkrKykKKyAgeworICAgIGRvdWJsZSB0bXA7CisKKyAgICBpZiAob3JkZXIg PCAzKQorICAgICAgdG1wID0gLTggKiBhW2ldOworICAgIGVsc2UKKyAgICAgIHRtcCA9IC00 ICogYltpXTsKKworICAgIGRvdWJsZSB4ID0gMyAqIHRtcCArIGRbaV0gKyB0bXA7CisKKyAg ICBpZiAoNSA+IG9yZGVyKQorICAgICAgeCArPSAyOworCisgICAgaWYgKG9yZGVyID09IDEy MzQ1KQorICAgICAgeCAqPSA1OworCisgICAgZG91YmxlIHkgPSAzLjRmICogdG1wICsgZFtp XTsKKyAgICByW2ldID0geCArIHk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyogeyBk Zy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBVbnN3aXRjaGluZyBsb29wIG9u IGNvbmRpdGlvbjogb3JkZXIiIDMgInVuc3dpdGNoIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLmRnL2xvb3AtdW5zd2l0Y2gtOS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvbG9vcC11bnN3aXRjaC05LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjlkZDYwMjNkNDlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvbG9vcC11bnN3aXRjaC05LmMKQEAgLTAsMCArMSwyNyBAQAorLyogeyBkZy1k byBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mdW5zd2l0Y2gtbG9vcHMg LWZkdW1wLXRyZWUtdW5zd2l0Y2gtZGV0YWlscyIgfSAqLworCitpbnQKK2Zvbyhkb3VibGUg KmEsIGRvdWJsZSAqYiwgZG91YmxlICpjLCBkb3VibGUgKmQsIGRvdWJsZSAqciwgaW50IHNp emUsIGludCBvcmRlcikKK3sKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisg IHsKKyAgICBkb3VibGUgdG1wOworCisgICAgaWYgKG9yZGVyID09IDEpCisgICAgICB0bXAg PSAtOCAqIGFbaV07CisgICAgZWxzZQorICAgICAgeworCWlmIChvcmRlciA9PSAyKQorCSAg dG1wID0gLTQgKiBiW2ldOworCWVsc2UKKwkgIHRtcCA9IGFbaV07CisgICAgICB9CisKKyAg ICByW2ldID0gMy40ZiAqIHRtcCArIGRbaV07CisgIH0KKworICByZXR1cm4gMDsKK30KKwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICI7OyBVbnN3aXRjaGluZyBs b29wIG9uIGNvbmRpdGlvbjogb3JkZXIiIDIgInVuc3dpdGNoIiB9IH0gKi8KZGlmZiAtLWdp dCBhL2djYy90cmVlLXNzYS1sb29wLXVuc3dpdGNoLmMgYi9nY2MvdHJlZS1zc2EtbG9vcC11 bnN3aXRjaC5jCmluZGV4IGZlNGRhY2MwODMzLi45ZGI3NThiNTE5OSAxMDA2NDQKLS0tIGEv Z2NjL3RyZWUtc3NhLWxvb3AtdW5zd2l0Y2guYworKysgYi9nY2MvdHJlZS1zc2EtbG9vcC11 bnN3aXRjaC5jCkBAIC0zNyw2ICszNywxMSBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgImdpbXBsZS1pdGVyYXRvci5o IgogI2luY2x1ZGUgImNmZ2hvb2tzLmgiCiAjaW5jbHVkZSAidHJlZS1zc2EtbG9vcC1tYW5p cC5oIgorI2luY2x1ZGUgInRyZWUtcHJldHR5LXByaW50LmgiCisjaW5jbHVkZSAiZ2ltcGxl LXJhbmdlLmgiCisjaW5jbHVkZSAiZGJnY250LmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5Pgog CiAvKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbG9vcCB1bnN3aXRjaGluZywgaS5lLiB0 cmFuc2Zvcm1hdGlvbiBvZiBsb29wcyBsaWtlCiAKQEAgLTc0LDkgKzc5LDM0IEBAIGFsb25n IHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAgICB0cmVl LXNzYS1sb29wLWltLmMgZW5zdXJlcyB0aGF0IGFsbCB0aGUgc3VpdGFibGUgY29uZGl0aW9u cyBhcmUgaW4gdGhpcwogICAgc2hhcGUuICAqLwogCisvKiBBIHR1cGxlIHRoYXQgaG9sZHMg R0lNUExFIGNvbmRpdGlvbiBhbmQgdmFsdWUgcmFuZ2UgZm9yIGFuIHVuc3dpdGNoaW5nCisg ICBwcmVkaWNhdGUuICAqLworCitzdHJ1Y3QgdW5zd2l0Y2hfcHJlZGljYXRlCit7CisgIC8q IERlZmF1bHQgY29uc3RydWN0b3IuICAqLworICB1bnN3aXRjaF9wcmVkaWNhdGUgKHRyZWUg Y29uZCwgdHJlZSBsaHNfKQorICA6IGNvbmRpdGlvbiAoY29uZCksIGxocyAobGhzXyksIHRy dWVfcmFuZ2UgKCksIGZhbHNlX3JhbmdlICgpCisgIHt9CisKKyAgdHJlZSBjb25kaXRpb247 CisgIHRyZWUgbGhzOworICBpbnRfcmFuZ2VfbWF4IHRydWVfcmFuZ2U7CisgIGludF9yYW5n ZV9tYXggZmFsc2VfcmFuZ2U7Cit9OworCitzdGF0aWMgdmVjPHZlYzx1bnN3aXRjaF9wcmVk aWNhdGUgKj4+ICpiYl9wcmVkaWNhdGVzID0gTlVMTDsKKworc3RhdGljIGdpbXBsZV9yYW5n ZXIgKnJhbmdlciA9IE5VTEw7CisKK3R5cGVkZWYgYXV0b192ZWM8c3RkOjpwYWlyPHVuc3dp dGNoX3ByZWRpY2F0ZSAqLCBib29sPj4gcHJlZGljYXRlX3ZlY3RvcjsKKwogc3RhdGljIGNs YXNzIGxvb3AgKnRyZWVfdW5zd2l0Y2hfbG9vcCAoY2xhc3MgbG9vcCAqLCBiYXNpY19ibG9j aywgdHJlZSk7Ci1zdGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChjbGFz cyBsb29wICosIGludCk7Ci1zdGF0aWMgdHJlZSB0cmVlX21heV91bnN3aXRjaF9vbiAoYmFz aWNfYmxvY2ssIGNsYXNzIGxvb3AgKik7CitzdGF0aWMgYm9vbCB0cmVlX3Vuc3dpdGNoX3Np bmdsZV9sb29wIChjbGFzcyBsb29wICosIGludCwKKwkJCQkgICAgICAgcHJlZGljYXRlX3Zl Y3RvciAmcHJlZGljYXRlX3BhdGgpOworc3RhdGljIHZvaWQKK2ZpbmRfdW5zd2l0Y2hpbmdf cHJlZGljYXRlc19mb3JfYmIgKGJhc2ljX2Jsb2NrIGJiLCBjbGFzcyBsb29wICpsb29wLAor CQkJCSAgICB2ZWM8dW5zd2l0Y2hfcHJlZGljYXRlICo+ICZjYW5kaWRhdGVzKTsKIHN0YXRp YyBib29sIHRyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAoY2xhc3MgbG9vcCAqKTsKIHN0YXRp YyBlZGdlIGZpbmRfbG9vcF9ndWFyZCAoY2xhc3MgbG9vcCAqKTsKIHN0YXRpYyBib29sIGVt cHR5X2JiX3dpdGhvdXRfZ3VhcmRfcCAoY2xhc3MgbG9vcCAqLCBiYXNpY19ibG9jayk7CkBA IC04NSw2ICsxMTUsNTUgQEAgc3RhdGljIHZvaWQgaG9pc3RfZ3VhcmQgKGNsYXNzIGxvb3Ag KiwgZWRnZSk7CiBzdGF0aWMgYm9vbCBjaGVja19leGl0X3BoaSAoY2xhc3MgbG9vcCAqKTsK IHN0YXRpYyB0cmVlIGdldF92b3BfZnJvbV9oZWFkZXIgKGNsYXNzIGxvb3AgKik7CiAKK3N0 YXRpYyB2ZWM8dW5zd2l0Y2hfcHJlZGljYXRlICo+ICYKK2dldF9wcmVkaWNhdGVzX2Zvcl9i YiAoYmFzaWNfYmxvY2sgYmIpCit7CisgIGdpbXBsZSAqbGFzdCA9IGxhc3Rfc3RtdCAoYmIp OworICByZXR1cm4gKCpiYl9wcmVkaWNhdGVzKVtsYXN0ID09IE5VTEwgPyAwIDogZ2ltcGxl X3VpZCAobGFzdCldOworfQorCitzdGF0aWMgdm9pZAorc2V0X3ByZWRpY2F0ZXNfZm9yX2Ji IChiYXNpY19ibG9jayBiYiwgdmVjPHVuc3dpdGNoX3ByZWRpY2F0ZSAqPiBwcmVkaWNhdGVz KQoreworICBnaW1wbGVfc2V0X3VpZCAobGFzdF9zdG10IChiYiksIGJiX3ByZWRpY2F0ZXMt Pmxlbmd0aCAoKSk7CisgIGJiX3ByZWRpY2F0ZXMtPnNhZmVfcHVzaCAocHJlZGljYXRlcyk7 Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2xvb3BfdW5zd2l0Y2hfaW5mbyAoY2xhc3MgbG9v cCAqbG9vcCkKK3sKKyAgLyogQ2FsY3VsYXRlIGluc3RydWN0aW9uIGNvdW50LiAgKi8KKyAg YmFzaWNfYmxvY2sgKmJicyA9IGdldF9sb29wX2JvZHkgKGxvb3ApOworICBmb3IgKHVuc2ln bmVkIGkgPSAwOyBpIDwgbG9vcC0+bnVtX25vZGVzOyBpKyspCisgICAgeworICAgICAgdW5z aWduZWQgaW5zbnMgPSAwOworICAgICAgZm9yIChnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kg PSBnc2lfc3RhcnRfYmIgKGJic1tpXSk7ICFnc2lfZW5kX3AgKGdzaSk7CisJICAgZ3NpX25l eHQgKCZnc2kpKQorCWluc25zICs9IGVzdGltYXRlX251bV9pbnNucyAoZ3NpX3N0bXQgKGdz aSksICZlbmlfc2l6ZV93ZWlnaHRzKTsKKworICAgICAgYmJzW2ldLT5hdXggPSAodm9pZCAq KShzaXplX3QpaW5zbnM7CisgICAgfQorCisgIC8qIEZpbmQgYWxsIHVuc3dpdGNoaW5nIGNh bmRpZGF0ZXMuICAqLworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGxvb3AtPm51bV9u b2RlczsgaSsrKQorICAgIHsKKyAgICAgIC8qIEZpbmQgYSBiYiB0byB1bnN3aXRjaCBvbi4g ICovCisgICAgICB2ZWM8dW5zd2l0Y2hfcHJlZGljYXRlICo+IGNhbmRpZGF0ZXM7CisgICAg ICBjYW5kaWRhdGVzLmNyZWF0ZSAoMSk7CisgICAgICBmaW5kX3Vuc3dpdGNoaW5nX3ByZWRp Y2F0ZXNfZm9yX2JiIChiYnNbaV0sIGxvb3AsIGNhbmRpZGF0ZXMpOworICAgICAgaWYgKCFj YW5kaWRhdGVzLmlzX2VtcHR5ICgpKQorCXNldF9wcmVkaWNhdGVzX2Zvcl9iYiAoYmJzW2ld LCBjYW5kaWRhdGVzKTsKKyAgICAgIGVsc2UKKwl7CisJICBnaW1wbGUgKmxhc3QgPSBsYXN0 X3N0bXQgKGJic1tpXSk7CisJICBpZiAobGFzdCAhPSBOVUxMKQorCSAgICBnaW1wbGVfc2V0 X3VpZCAobGFzdCwgMCk7CisJfQorICAgIH0KKworICBmcmVlIChiYnMpOworfQorCiAvKiBN YWluIGVudHJ5IHBvaW50LiAgUGVyZm9ybSBsb29wIHVuc3dpdGNoaW5nIG9uIGFsbCBzdWl0 YWJsZSBsb29wcy4gICovCiAKIHVuc2lnbmVkIGludApAQCAtOTIsMTYgKzE3MSwzMCBAQCB0 cmVlX3NzYV91bnN3aXRjaF9sb29wcyAodm9pZCkKIHsKICAgYm9vbCBjaGFuZ2VkID0gZmFs c2U7CiAKKyAgcmFuZ2VyID0gZW5hYmxlX3JhbmdlciAoY2Z1bik7CisKICAgLyogR28gdGhy b3VnaCBhbGwgbG9vcHMgc3RhcnRpbmcgZnJvbSBpbm5lcm1vc3QuICAqLwogICBmb3IgKGF1 dG8gbG9vcCA6IGxvb3BzX2xpc3QgKGNmdW4sIExJX0ZST01fSU5ORVJNT1NUKSkKICAgICB7 CiAgICAgICBpZiAoIWxvb3AtPmlubmVyKQotCS8qIFVuc3dpdGNoIGlubmVybW9zdCBsb29w LiAgKi8KLQljaGFuZ2VkIHw9IHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGxvb3AsIDAp OworCXsKKwkgIGJiX3ByZWRpY2F0ZXMgPSBuZXcgdmVjPHZlYzx1bnN3aXRjaF9wcmVkaWNh dGUgKj4+ICgpOworCSAgYmJfcHJlZGljYXRlcy0+c2FmZV9wdXNoICh2ZWM8dW5zd2l0Y2hf cHJlZGljYXRlICo+ICgpKTsKKworCSAgLyogVW5zd2l0Y2ggaW5uZXJtb3N0IGxvb3AuICAq LworCSAgaW5pdF9sb29wX3Vuc3dpdGNoX2luZm8gKGxvb3ApOworCSAgcHJlZGljYXRlX3Zl Y3RvciBwcmVkaWNhdGVfcGF0aDsKKwkgIGNoYW5nZWQgfD0gdHJlZV91bnN3aXRjaF9zaW5n bGVfbG9vcCAobG9vcCwgMCwgcHJlZGljYXRlX3BhdGgpOworCisJICBkZWxldGUgYmJfcHJl ZGljYXRlczsKKwkgIGJiX3ByZWRpY2F0ZXMgPSBOVUxMOworCX0KICAgICAgIGVsc2UKIAlj aGFuZ2VkIHw9IHRyZWVfdW5zd2l0Y2hfb3V0ZXJfbG9vcCAobG9vcCk7CiAgICAgfQogCisg IGRpc2FibGVfcmFuZ2VyIChjZnVuKTsKKwogICBpZiAoY2hhbmdlZCkKICAgICByZXR1cm4g VE9ET19jbGVhbnVwX2NmZzsKICAgcmV0dXJuIDA7CkBAIC0xODEsMTEgKzI3NCwxNSBAQCBp c19tYXliZV91bmRlZmluZWQgKGNvbnN0IHRyZWUgbmFtZSwgZ2ltcGxlICpzdG10LCBjbGFz cyBsb29wICpsb29wKQogICByZXR1cm4gZmFsc2U7CiB9CiAKKy8vIEZJWE1FCiAvKiBDaGVj a3Mgd2hldGhlciB3ZSBjYW4gdW5zd2l0Y2ggTE9PUCBvbiBjb25kaXRpb24gYXQgZW5kIG9m IEJCIC0tIG9uZSBvZiBpdHMKLSAgIGJhc2ljIGJsb2NrcyAoZm9yIHdoYXQgaXQgbWVhbnMg c2VlIGNvbW1lbnRzIGJlbG93KS4gICovCisgICBiYXNpYyBibG9ja3MgKGZvciB3aGF0IGl0 IG1lYW5zIHNlZSBjb21tZW50cyBiZWxvdykuCisgICBSQU5HRVIgaXMgZ2ltcGxlIHJhbmdl ciB1c2VkIGluIHRoaXMgcGFzcyBhbmQgdW5zd2l0Y2hfcHJlZGljYXRlIGlzIHJldHVybmVk CisgICBpZiB0aGVyZSBpcyBhbiBvcHBvcnR1bml0eSBmb3IgdW5zd2l0Y2hpbmcuICAqLwog Ci1zdGF0aWMgdHJlZQotdHJlZV9tYXlfdW5zd2l0Y2hfb24gKGJhc2ljX2Jsb2NrIGJiLCBj bGFzcyBsb29wICpsb29wKQorc3RhdGljIHZvaWQKK2ZpbmRfdW5zd2l0Y2hpbmdfcHJlZGlj YXRlc19mb3JfYmIgKGJhc2ljX2Jsb2NrIGJiLCBjbGFzcyBsb29wICpsb29wLAorCQkJCSAg ICB2ZWM8dW5zd2l0Y2hfcHJlZGljYXRlICo+ICZjYW5kaWRhdGVzKQogewogICBnaW1wbGUg Kmxhc3QsICpkZWY7CiAgIGdjb25kICpzdG10OwpAQCAtMTk2LDE0ICsyOTMsMTQgQEAgdHJl ZV9tYXlfdW5zd2l0Y2hfb24gKGJhc2ljX2Jsb2NrIGJiLCBjbGFzcyBsb29wICpsb29wKQog ICAvKiBCQiBtdXN0IGVuZCBpbiBhIHNpbXBsZSBjb25kaXRpb25hbCBqdW1wLiAgKi8KICAg bGFzdCA9IGxhc3Rfc3RtdCAoYmIpOwogICBpZiAoIWxhc3QgfHwgZ2ltcGxlX2NvZGUgKGxh c3QpICE9IEdJTVBMRV9DT05EKQotICAgIHJldHVybiBOVUxMX1RSRUU7CisgICAgcmV0dXJu OwogICBzdG10ID0gYXNfYSA8Z2NvbmQgKj4gKGxhc3QpOwogCiAgIC8qIFRvIGtlZXAgdGhl IHRoaW5ncyBzaW1wbGUsIHdlIGRvIG5vdCBkaXJlY3RseSByZW1vdmUgdGhlIGNvbmRpdGlv bnMsCiAgICAgIGJ1dCBqdXN0IHJlcGxhY2UgdGVzdHMgd2l0aCAwICE9IDAgcmVzcC4gMSAh PSAwLiAgUHJldmVudCB0aGUgaW5maW5pdGUKICAgICAgbG9vcCB3aGVyZSB3ZSB3b3VsZCB1 bnN3aXRjaCBhZ2FpbiBvbiBzdWNoIGEgY29uZGl0aW9uLiAgKi8KICAgaWYgKGdpbXBsZV9j b25kX3RydWVfcCAoc3RtdCkgfHwgZ2ltcGxlX2NvbmRfZmFsc2VfcCAoc3RtdCkpCi0gICAg cmV0dXJuIE5VTExfVFJFRTsKKyAgICByZXR1cm47CiAKICAgLyogQ29uZGl0aW9uIG11c3Qg YmUgaW52YXJpYW50LiAgKi8KICAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAodXNlLCBz dG10LCBpdGVyLCBTU0FfT1BfVVNFKQpAQCAtMjEyLDY0ICszMDksMjQzIEBAIHRyZWVfbWF5 X3Vuc3dpdGNoX29uIChiYXNpY19ibG9jayBiYiwgY2xhc3MgbG9vcCAqbG9vcCkKICAgICAg IGRlZl9iYiA9IGdpbXBsZV9iYiAoZGVmKTsKICAgICAgIGlmIChkZWZfYmIKIAkgICYmIGZs b3dfYmJfaW5zaWRlX2xvb3BfcCAobG9vcCwgZGVmX2JiKSkKLQlyZXR1cm4gTlVMTF9UUkVF OworCXJldHVybjsKICAgICAgIC8qIFVuc3dpdGNoaW5nIG9uIHVuZGVmaW5lZCB2YWx1ZXMg d291bGQgaW50cm9kdWNlIHVuZGVmaW5lZAogCSBiZWhhdmlvciB0aGF0IHRoZSBvcmlnaW5h bCBwcm9ncmFtIG1pZ2h0IG5ldmVyIGV4ZXJjaXNlLiAgKi8KICAgICAgIGlmIChpc19tYXli ZV91bmRlZmluZWQgKHVzZSwgc3RtdCwgbG9vcCkpCi0JcmV0dXJuIE5VTExfVFJFRTsKKwly ZXR1cm47CiAgICAgfQogCi0gIGNvbmQgPSBidWlsZDIgKGdpbXBsZV9jb25kX2NvZGUgKHN0 bXQpLCBib29sZWFuX3R5cGVfbm9kZSwKLQkJIGdpbXBsZV9jb25kX2xocyAoc3RtdCksIGdp bXBsZV9jb25kX3JocyAoc3RtdCkpOworICB0cmVlIGxocyA9IGdpbXBsZV9jb25kX2xocyAo c3RtdCk7CisgIHRyZWUgcmhzID0gZ2ltcGxlX2NvbmRfcmhzIChzdG10KTsKIAotICByZXR1 cm4gY29uZDsKKyAgY29uZCA9IGJ1aWxkMiAoZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCksIGJv b2xlYW5fdHlwZV9ub2RlLCBsaHMsIHJocyk7CisgIGVkZ2UgZWRnZV90cnVlLCBlZGdlX2Zh bHNlOworICBleHRyYWN0X3RydWVfZmFsc2VfZWRnZXNfZnJvbV9ibG9jayAoYmIsICZlZGdl X3RydWUsICZlZGdlX2ZhbHNlKTsKKworICB1bnN3aXRjaF9wcmVkaWNhdGUgKnByZWRpY2F0 ZSA9IG5ldyB1bnN3aXRjaF9wcmVkaWNhdGUgKGNvbmQsIGxocyk7CisgIGlmIChpcmFuZ2U6 OnN1cHBvcnRzX3R5cGVfcCAoVFJFRV9UWVBFIChsaHMpKSAmJiBDT05TVEFOVF9DTEFTU19Q IChyaHMpKQorICAgIHsKKyAgICAgIHJhbmdlci0+cmFuZ2Vfb25fZWRnZSAocHJlZGljYXRl LT50cnVlX3JhbmdlLCBlZGdlX3RydWUsIGxocyk7CisgICAgICBwcmVkaWNhdGUtPmZhbHNl X3JhbmdlID0gcHJlZGljYXRlLT50cnVlX3JhbmdlOworCisgICAgICBpZiAoIXByZWRpY2F0 ZS0+ZmFsc2VfcmFuZ2UudmFyeWluZ19wICgpCisJICAmJiAhcHJlZGljYXRlLT5mYWxzZV9y YW5nZS51bmRlZmluZWRfcCAoKSkKKwlwcmVkaWNhdGUtPmZhbHNlX3JhbmdlLmludmVydCAo KTsKKyAgICB9CisKKyAgY2FuZGlkYXRlcy5zYWZlX3B1c2ggKHByZWRpY2F0ZSk7Cit9CisK K3N0YXRpYyB2b2lkCitjb21iaW5lX3JhbmdlIChwcmVkaWNhdGVfdmVjdG9yICZwcmVkaWNh dGVfcGF0aCwgdHJlZSBpbmRleCwgaXJhbmdlICZwYXRoX3JhbmdlKQoreworICBib29sIGZp cnN0ID0gdHJ1ZTsKKworICBmb3IgKGF1dG8gcDogcHJlZGljYXRlX3BhdGgpCisgICAgewor ICAgICAgdW5zd2l0Y2hfcHJlZGljYXRlICpwcmVkaWNhdGUgPSBwLmZpcnN0OworICAgICAg Ym9vbCB0cnVlX2VkZ2UgPSBwLnNlY29uZDsKKworICAgICAgaWYgKG9wZXJhbmRfZXF1YWxf cCAocHJlZGljYXRlLT5saHMsIGluZGV4LCAwKSkKKwl7CisJICBpcmFuZ2UgJm90aGVyCisJ ICAgID0gdHJ1ZV9lZGdlID8gcHJlZGljYXRlLT50cnVlX3JhbmdlIDogcHJlZGljYXRlLT5m YWxzZV9yYW5nZTsKKwkgIGlmIChmaXJzdCkKKwkgICAgeworCSAgICAgIGZpcnN0ID0gZmFs c2U7CisJICAgICAgcGF0aF9yYW5nZSA9IG90aGVyOworCSAgICB9CisJICBlbHNlCisJICAg IHBhdGhfcmFuZ2UuaW50ZXJzZWN0IChvdGhlcik7CisJfQorICAgIH0KIH0KIAotLyogU2lt cGxpZmllcyBDT05EIHVzaW5nIGNoZWNrcyBpbiBmcm9udCBvZiB0aGUgZW50cnkgb2YgdGhl IExPT1AuICBKdXN0IHZlcnkKLSAgIHNpbXBsaXNoIChzdWZmaWNpZW50IHRvIHByZXZlbnQg dXMgZnJvbSBkdXBsaWNhdGluZyBsb29wIGluIHVuc3dpdGNoaW5nCi0gICB1bm5lY2Vzc2Fy aWx5KS4gICovCisvKiBTaW1wbGlmaWVzIENPTkQgdXNpbmcgY2hlY2tzIGluIGZyb250IG9m IHRoZSBlbnRyeSBvZiB0aGUgTE9PUC4KKyAgIFV0aWxpemUgYm90aCBzeW1ib2xpYyBleHBy ZXNzaW9ucyBhbmQgdmFsdWUgcmFuZ2VzIGNhbGN1bGF0ZWQgYnkgUmFuZ2VyLiAgKi8KIAog c3RhdGljIHRyZWUKLXNpbXBsaWZ5X3VzaW5nX2VudHJ5X2NoZWNrcyAoY2xhc3MgbG9vcCAq bG9vcCwgdHJlZSBjb25kKQorc2ltcGxpZnlfdXNpbmdfZW50cnlfY2hlY2tzIChnaW1wbGUg KnN0bXQsIHByZWRpY2F0ZV92ZWN0b3IgJnByZWRpY2F0ZV9wYXRoKQogewotICBlZGdlIGUg PSBsb29wX3ByZWhlYWRlcl9lZGdlIChsb29wKTsKLSAgZ2ltcGxlICpzdG10OworICBpZiAo cHJlZGljYXRlX3BhdGguaXNfZW1wdHkgKCkpCisgICAgcmV0dXJuIE5VTExfVFJFRTsKKwor ICB0cmVlIGxocyA9IGdpbXBsZV9jb25kX2xocyAoc3RtdCk7CisgIHVuc3dpdGNoX3ByZWRp Y2F0ZSAqbGFzdF9wcmVkaWNhdGUgPSBwcmVkaWNhdGVfcGF0aC5sYXN0ICgpLmZpcnN0Owor ICBib29sIHRydWVfZWRnZSA9IHByZWRpY2F0ZV9wYXRoLmxhc3QgKCkuc2Vjb25kOwogCi0g IHdoaWxlICgxKQorICBpZiAoZ2ltcGxlX2NvZGUgKHN0bXQpID09IEdJTVBMRV9DT05ECisg ICAgICAmJiBvcGVyYW5kX2VxdWFsX3AgKGxocywgbGFzdF9wcmVkaWNhdGUtPmxocywgMCkp CiAgICAgewotICAgICAgc3RtdCA9IGxhc3Rfc3RtdCAoZS0+c3JjKTsKLSAgICAgIGlmIChz dG10Ci0JICAmJiBnaW1wbGVfY29kZSAoc3RtdCkgPT0gR0lNUExFX0NPTkQKLQkgICYmIGdp bXBsZV9jb25kX2NvZGUgKHN0bXQpID09IFRSRUVfQ09ERSAoY29uZCkKLQkgICYmIG9wZXJh bmRfZXF1YWxfcCAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSwKLQkJCSAgICAgIFRSRUVfT1BF UkFORCAoY29uZCwgMCksIDApCisgICAgICBpZiAoZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCkg PT0gVFJFRV9DT0RFIChsYXN0X3ByZWRpY2F0ZS0+Y29uZGl0aW9uKQogCSAgJiYgb3BlcmFu ZF9lcXVhbF9wIChnaW1wbGVfY29uZF9yaHMgKHN0bXQpLAotCQkJICAgICAgVFJFRV9PUEVS QU5EIChjb25kLCAxKSwgMCkpCi0JcmV0dXJuIChlLT5mbGFncyAmIEVER0VfVFJVRV9WQUxV RQotCQk/IGJvb2xlYW5fdHJ1ZV9ub2RlCi0JCTogYm9vbGVhbl9mYWxzZV9ub2RlKTsKKwkJ CSAgICAgIFRSRUVfT1BFUkFORCAobGFzdF9wcmVkaWNhdGUtPmNvbmRpdGlvbiwgMSksIDAp KQorCXJldHVybiB0cnVlX2VkZ2UgPyBib29sZWFuX3RydWVfbm9kZSA6IGJvb2xlYW5fZmFs c2Vfbm9kZTsKKyAgICAgIGVsc2UgaWYgKGlyYW5nZTo6c3VwcG9ydHNfdHlwZV9wIChUUkVF X1RZUEUgKGxocykpKQorCXsKKwkgIGludF9yYW5nZV9tYXggcjsKKwkgIGludF9yYW5nZV9t YXggcGF0aF9yYW5nZTsKKwkgIGNvbWJpbmVfcmFuZ2UgKHByZWRpY2F0ZV9wYXRoLCBsaHMs IHBhdGhfcmFuZ2UpOworCSAgaWYgKCFwYXRoX3JhbmdlLnVuZGVmaW5lZF9wICgpCisJICAg ICAgJiYgZm9sZF9yYW5nZSAociwgc3RtdCwgcGF0aF9yYW5nZSkKKwkgICAgICAmJiByLnNp bmdsZXRvbl9wICgpKQorCSAgICByZXR1cm4gci56ZXJvX3AgKCkgPyBib29sZWFuX2ZhbHNl X25vZGUgOiBib29sZWFuX3RydWVfbm9kZTsKKwl9CisgICAgfQorCisgIHJldHVybiBOVUxM X1RSRUU7Cit9CisKKy8qIEZpbmQgYWxsIHVuc3dpdGNoaW5nIHByZWRpY2F0ZXMgZm9yIGEg TE9PUCB0aGF0IGNvbnRhaW5zIEJCUy4KKyAgIFRSVUVfRURHRSBkaXN0aW5ndWlzaCB3aGlj aCBQQVJFTlRfUFJFRElDQVRFIHNob3VsZCBiZSB1c2VkIHdoZW4KKyAgIGFza2luZyBSQU5H RVIgaW5mcmFzdHJ1Y3R1cmUuICBSZXR1cm4gdW5zd2l0Y2hfcHJlZGljYXRlIGluIHRoZSBw cm92aWRlZAorICAgQ0FORElEQVRFUyB2ZWN0b3IuICAqLworCitzdGF0aWMgYm9vbAorc2lt cGxpZnlfbG9vcF92ZXJzaW9uIChjbGFzcyBsb29wICpsb29wLCBwcmVkaWNhdGVfdmVjdG9y ICZwcmVkaWNhdGVfcGF0aCkKK3sKKyAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgIGJhc2lj X2Jsb2NrICpiYnMgPSBnZXRfbG9vcF9ib2R5IChsb29wKTsKKworICBmb3IgKHVuc2lnbmVk IGkgPSAwOyBpICE9IGxvb3AtPm51bV9ub2RlczsgaSsrKQorICAgIHsKKyAgICAgIC8vIEZJ WE1FOiB3b3JrcyBvbmx5IGZvciBnY29uZHMKKyAgICAgIGlmICghZ2V0X3ByZWRpY2F0ZXNf Zm9yX2JiIChiYnNbaV0pLmlzX2VtcHR5ICgpKQorCXsKKwkgIGdpbXBsZSAqc3RtdCA9IGxh c3Rfc3RtdCAoYmJzW2ldKTsKKworCSAgdHJlZSBmb2xkZWQgPSBzaW1wbGlmeV91c2luZ19l bnRyeV9jaGVja3MgKHN0bXQsIHByZWRpY2F0ZV9wYXRoKTsKKwkgIGlmIChmb2xkZWQgIT0g TlVMTF9UUkVFKQorCSAgICB7CisJICAgICAgLyogUmVtb3ZlIHBhdGguICAqLworCSAgICAg IGdjb25kICpjb25kID0gZHluX2Nhc3Q8Z2NvbmQgKj4gKHN0bXQpOworCSAgICAgIGlmIChp bnRlZ2VyX25vbnplcm9wIChmb2xkZWQpKQorCQlnaW1wbGVfY29uZF9zZXRfY29uZGl0aW9u X2Zyb21fdHJlZSAoY29uZCwgYm9vbGVhbl90cnVlX25vZGUpOworCSAgICAgIGVsc2UKKwkJ Z2ltcGxlX2NvbmRfc2V0X2NvbmRpdGlvbl9mcm9tX3RyZWUgKGNvbmQsIGJvb2xlYW5fZmFs c2Vfbm9kZSk7CisKKwkgICAgICBnaW1wbGVfc2V0X3VpZCAoY29uZCwgMCk7CisJICAgICAg dXBkYXRlX3N0bXQgKGNvbmQpOworCSAgICAgIGNoYW5nZWQgPSB0cnVlOworCSAgICB9CisJ fQorICAgIH0KKworICBmcmVlIChiYnMpOworICByZXR1cm4gY2hhbmdlZDsKK30KKworLyog RXZhbHVhdGUgaG93IG1hbnkgaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgZXhlY3V0ZWQgaWYgd2Ug dW5zd2l0Y2gKKyAgIExPT1AgKHdpdGggQkJTKSBiYXNlZCBvbiBQUkVESUNBVEUuICBUUlVF X0VER0UgZGlzdGluZ3Vpc2hlcyBpZgorICAgd2UgY2FsY3VsYXRlIHRha2VuIG9yIG5vdCB0 YWtlbiBlZGdlIHdoZW4gYXNraW5nIFJBTkdFUi4KKyAgIFJFQUNIQUJMRV9GTEFHIGlzIHVz ZWQgZm9yIG1hcmtpbmcgb2YgdGhlIGJhc2ljIGJsb2Nrcy4gICovCisKK3N0YXRpYyB1bnNp Z25lZAorZXZhbHVhdGVfaW5zbnMgKGNsYXNzIGxvb3AgKmxvb3AsICBiYXNpY19ibG9jayAq YmJzLAorCQlwcmVkaWNhdGVfdmVjdG9yICZwcmVkaWNhdGVfcGF0aCwKKwkJYXV0b19iYl9m bGFnICZyZWFjaGFibGVfZmxhZykKK3sKKyAgYXV0b192ZWM8YmFzaWNfYmxvY2s+IHdvcmts aXN0IChsb29wLT5udW1fbm9kZXMpOworICB3b3JrbGlzdC5xdWlja19wdXNoIChiYnNbMF0p OworCisgIHdoaWxlICghd29ya2xpc3QuaXNfZW1wdHkgKCkpCisgICAgeworICAgICAgZWRn ZSBlOworICAgICAgZWRnZV9pdGVyYXRvciBlaTsKKyAgICAgIGludCBmbGFncyA9IDA7Cisg ICAgICBiYXNpY19ibG9jayBiYiA9IHdvcmtsaXN0LnBvcCAoKTsKKworICAgICAgaWYgKEVE R0VfQ09VTlQgKGJiLT5zdWNjcykgPT0gMikKKwl7CisJICBnY29uZCAqY29uZCA9IGR5bl9j YXN0PGdjb25kICo+IChsYXN0X3N0bXQgKGJiKSk7CisJICBpZiAoY29uZCAhPSBOVUxMKQor CSAgICB7CisJICAgICAgaWYgKGdpbXBsZV9jb25kX3RydWVfcCAoY29uZCkpCisJCWZsYWdz ID0gRURHRV9GQUxTRV9WQUxVRTsKKwkgICAgICBlbHNlIGlmIChnaW1wbGVfY29uZF9mYWxz ZV9wIChjb25kKSkKKwkJZmxhZ3MgPSBFREdFX1RSVUVfVkFMVUU7CisJICAgICAgZWxzZQor CQl7CisJCSAgLy8gRklYTUU6IHdvcmtzIG9ubHkgZm9yIGdjb25kcworCQkgIHVuc3dpdGNo X3ByZWRpY2F0ZSAqcHJlZGljYXRlID0gTlVMTDsKKwkJICBpZiAoIWdldF9wcmVkaWNhdGVz X2Zvcl9iYiAoYmIpLmlzX2VtcHR5ICgpKQorCQkgICAgcHJlZGljYXRlID0gZ2V0X3ByZWRp Y2F0ZXNfZm9yX2JiIChiYilbMF07CisKKwkJICBpZiAocHJlZGljYXRlICE9IE5VTEwpCisJ CSAgICB7CisJCSAgICAgIHRyZWUgZm9sZGVkCisJCQk9IHNpbXBsaWZ5X3VzaW5nX2VudHJ5 X2NoZWNrcyAoY29uZCwgcHJlZGljYXRlX3BhdGgpOworCQkgICAgICBpZiAoZm9sZGVkID09 IGJvb2xlYW5fdHJ1ZV9ub2RlKQorCQkJZmxhZ3MgPSBFREdFX0ZBTFNFX1ZBTFVFOworCQkg ICAgICBlbHNlIGlmIChmb2xkZWQgPT0gYm9vbGVhbl9mYWxzZV9ub2RlKQorCQkJZmxhZ3Mg PSBFREdFX1RSVUVfVkFMVUU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KIAotICAgICAg aWYgKCFzaW5nbGVfcHJlZF9wIChlLT5zcmMpKQotCXJldHVybiBjb25kOworICAgICAgRk9S X0VBQ0hfRURHRSAoZSwgZWksIGJiLT5zdWNjcykKKwl7CisJICBiYXNpY19ibG9jayBkZXN0 ID0gZS0+ZGVzdDsKIAotICAgICAgZSA9IHNpbmdsZV9wcmVkX2VkZ2UgKGUtPnNyYyk7Ci0g ICAgICBpZiAoZS0+c3JjID09IEVOVFJZX0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4pKQotCXJl dHVybiBjb25kOworCSAgaWYgKGRlc3QtPmxvb3BfZmF0aGVyID09IGxvb3AKKwkgICAgICAm JiAhKGRlc3QtPmZsYWdzICYgcmVhY2hhYmxlX2ZsYWcpCisJICAgICAgJiYgIShlLT5mbGFn cyAmIGZsYWdzKSkKKwkgICAgeworCSAgICAgIHdvcmtsaXN0LnNhZmVfcHVzaCAoZGVzdCk7 CisJICAgICAgZGVzdC0+ZmxhZ3MgfD0gcmVhY2hhYmxlX2ZsYWc7CisJICAgIH0KKwl9CiAg ICAgfQorCisgIC8qIEV2YWx1YXRlIGluc25zLiAgKi8KKyAgdW5zaWduZWQgc2l6ZSA9IDA7 CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvb3AtPm51bV9ub2RlczsgaSsrKQor ICAgIGlmIChiYnNbaV0tPmZsYWdzICYgcmVhY2hhYmxlX2ZsYWcpCisgICAgICBzaXplICs9 IChzaXplX3QpYmJzW2ldLT5hdXg7CisKKyAgLyogQ2xlYXIgdGhlIGZsYWcgZnJvbSBiYXNp YyBibG9ja3MuICAqLworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbG9vcC0+bnVtX25v ZGVzOyBpKyspCisgICAgYmJzW2ldLT5mbGFncyAmPSB+cmVhY2hhYmxlX2ZsYWc7CisKKyAg cmV0dXJuIHNpemU7Cit9CisKKy8qIEV2YWx1YXRlIGhvdyBtYW55IGluc3RydWN0aW9uIHdp bGwgd2UgaGF2ZSBpZiB3ZSB1bnN3aXRjaCBMT09QICh3aXRoIEJCUykKKyAgIGJhc2VkIG9u IENBTkRJREFURSBwcmVkaWNhdGUgKHVzaW5nIFJBTkdFUiBpbmZyYXN0cnVjdHVyZSkuICAq LworCitzdGF0aWMgdW5zaWduZWQKK2V2YWx1YXRlX2xvb3BfaW5zbnNfZm9yX3ByZWRpY2F0 ZSAoY2xhc3MgbG9vcCAqbG9vcCwgYmFzaWNfYmxvY2sgKmJicywKKwkJCQkgICBwcmVkaWNh dGVfdmVjdG9yICZwcmVkaWNhdGVfcGF0aCwKKwkJCQkgICB1bnN3aXRjaF9wcmVkaWNhdGUg KnByZWRpY2F0ZSkKK3sKKyAgYXV0b19iYl9mbGFnIHJlYWNoYWJsZV9mbGFnIChjZnVuKTsK KworICBwcmVkaWNhdGVfcGF0aC5zYWZlX3B1c2ggKHN0ZDo6bWFrZV9wYWlyIChwcmVkaWNh dGUsIHRydWUpKTsKKyAgdW5zaWduZWQgdHJ1ZV9sb29wX2Nvc3QgPSBldmFsdWF0ZV9pbnNu cyAobG9vcCwgYmJzLCBwcmVkaWNhdGVfcGF0aCwKKwkJCQkJICAgIHJlYWNoYWJsZV9mbGFn KTsKKyAgcHJlZGljYXRlX3BhdGgucG9wICgpOworCisgIHByZWRpY2F0ZV9wYXRoLnNhZmVf cHVzaCAoc3RkOjptYWtlX3BhaXIgKHByZWRpY2F0ZSwgZmFsc2UpKTsKKyAgdW5zaWduZWQg ZmFsc2VfbG9vcF9jb3N0ID0gZXZhbHVhdGVfaW5zbnMgKGxvb3AsIGJicywgcHJlZGljYXRl X3BhdGgsCisJCQkJCSAgICAgcmVhY2hhYmxlX2ZsYWcpOworICBwcmVkaWNhdGVfcGF0aC5w b3AgKCk7CisKKyAgcmV0dXJuIHRydWVfbG9vcF9jb3N0ICsgZmFsc2VfbG9vcF9jb3N0Owog fQogCiAvKiBVbnN3aXRjaCBzaW5nbGUgTE9PUC4gIE5VTSBpcyBudW1iZXIgb2YgdW5zd2l0 Y2hpbmdzIGRvbmU7IHdlIGRvIG5vdCBhbGxvdwogICAgaXQgdG8gZ3JvdyB0b28gbXVjaCwg aXQgaXMgdG9vIGVhc3kgdG8gY3JlYXRlIGV4YW1wbGUgb24gdGhhdCB0aGUgY29kZSB3b3Vs ZAotICAgZ3JvdyBleHBvbmVudGlhbGx5LiAgKi8KKyAgIGdyb3cgZXhwb25lbnRpYWxseS4g IFJBTkdFUiBpcyBnaW1wbGUgcmFuZ2VyIHVzZWQgaW4gdGhpcyBwYXNzLiAgKi8KIAogc3Rh dGljIGJvb2wKLXRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGNsYXNzIGxvb3AgKmxvb3As IGludCBudW0pCit0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChjbGFzcyBsb29wICpsb29w LCBpbnQgbnVtLAorCQkJICAgcHJlZGljYXRlX3ZlY3RvciAmcHJlZGljYXRlX3BhdGgpCiB7 Ci0gIGJhc2ljX2Jsb2NrICpiYnM7CisgIGJhc2ljX2Jsb2NrICpiYnMgPSBOVUxMOwogICBj bGFzcyBsb29wICpubG9vcDsKLSAgdW5zaWduZWQgaSwgZm91bmQ7Ci0gIHRyZWUgY29uZCA9 IE5VTExfVFJFRTsKLSAgZ2ltcGxlICpzdG10OwogICBib29sIGNoYW5nZWQgPSBmYWxzZTsK ICAgSE9TVF9XSURFX0lOVCBpdGVyYXRpb25zOwogCkBAIC0yODQsMTUgKzU2MCw2IEBAIHRy ZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGNsYXNzIGxvb3AgKmxvb3AsIGludCBudW0pCiAJ ICByZXR1cm4gZmFsc2U7CiAJfQogCi0gICAgICAvKiBUaGUgbG9vcCBzaG91bGQgbm90IGJl IHRvbyBsYXJnZSwgdG8gbGltaXQgY29kZSBncm93dGguICovCi0gICAgICBpZiAodHJlZV9u dW1fbG9vcF9pbnNucyAobG9vcCwgJmVuaV9zaXplX3dlaWdodHMpCi0JICA+ICh1bnNpZ25l ZCkgcGFyYW1fbWF4X3Vuc3dpdGNoX2luc25zKQotCXsKLQkgIGlmIChkdW1wX2ZpbGUgJiYg KGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JICAgIGZwcmludGYgKGR1bXBfZmlsZSwg Ijs7IE5vdCB1bnN3aXRjaGluZywgbG9vcCB0b28gYmlnXG4iKTsKLQkgIHJldHVybiBmYWxz ZTsKLQl9Ci0KICAgICAgIC8qIElmIHRoZSBsb29wIGlzIG5vdCBleHBlY3RlZCB0byBpdGVy YXRlLCB0aGVyZSBpcyBubyBuZWVkCiAJIGZvciB1bnN3aXRjaGluZy4gICovCiAgICAgICBp dGVyYXRpb25zID0gZXN0aW1hdGVkX2xvb3BfaXRlcmF0aW9uc19pbnQgKGxvb3ApOwpAQCAt MzA3LDE2NiArNTc0LDk0IEBAIHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGNsYXNzIGxv b3AgKmxvb3AsIGludCBudW0pCiAJfQogICAgIH0KIAotICBpID0gMDsKKyAgdW5zd2l0Y2hf cHJlZGljYXRlICpwcmVkaWNhdGUgPSBOVUxMOworICBiYXNpY19ibG9jayBiYiA9IE5VTEw7 CisgIGlmIChudW0gPiBwYXJhbV9tYXhfdW5zd2l0Y2hfbGV2ZWwpCisgICAgeworICAgICAg aWYgKGR1bXBfZmlsZQorCSAgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJZnBy aW50ZiAoZHVtcF9maWxlLCAiOzsgTm90IHVuc3dpdGNoaW5nIGFueW1vcmUsIGhpdCBtYXgg bGV2ZWxcbiIpOworICAgICAgZ290byBleGl0OworICAgIH0KKwogICBiYnMgPSBnZXRfbG9v cF9ib2R5IChsb29wKTsKLSAgZm91bmQgPSBsb29wLT5udW1fbm9kZXM7CiAKLSAgd2hpbGUg KDEpCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsb29wLT5udW1fbm9kZXM7IGkrKykK ICAgICB7Ci0gICAgICAvKiBGaW5kIGEgYmIgdG8gdW5zd2l0Y2ggb24uICAqLwotICAgICAg Zm9yICg7IGkgPCBsb29wLT5udW1fbm9kZXM7IGkrKykKLQlpZiAoKGNvbmQgPSB0cmVlX21h eV91bnN3aXRjaF9vbiAoYmJzW2ldLCBsb29wKSkpCi0JICBicmVhazsKLQotICAgICAgaWYg KGkgPT0gbG9vcC0+bnVtX25vZGVzKQorICAgICAgdmVjPHVuc3dpdGNoX3ByZWRpY2F0ZSAq PiAmcHJlZHMgPSBnZXRfcHJlZGljYXRlc19mb3JfYmIgKGJic1tpXSk7CisgICAgICBmb3Ig KGF1dG8gcHJlZDogcHJlZHMpCiAJewotCSAgaWYgKGR1bXBfZmlsZQotCSAgICAgICYmIG51 bSA+IHBhcmFtX21heF91bnN3aXRjaF9sZXZlbAotCSAgICAgICYmIChkdW1wX2ZsYWdzICYg VERGX0RFVEFJTFMpKQotCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBOb3QgdW5zd2l0 Y2hpbmcgYW55bW9yZSwgaGl0IG1heCBsZXZlbFxuIik7Ci0KLQkgIGlmIChmb3VuZCA9PSBs b29wLT5udW1fbm9kZXMpCisJICAvLyBGSVhNRTogdXBkYXRlIGJhZGdldCBjb3N0aW5nCisJ ICB1bnNpZ25lZCBjb3N0CisJICAgID0gZXZhbHVhdGVfbG9vcF9pbnNuc19mb3JfcHJlZGlj YXRlIChsb29wLCBiYnMsIHByZWRpY2F0ZV9wYXRoLAorCQkJCQkJIHByZWQpOworCisJICAv KiBGSVhNRTogcmlnaHQgbm93IHdlIHNlbGVjdCBmaXJzdCBjYW5kaWRhdGUsIGJ1dCB3ZSBj YW4gY2hvb3NlCisJICAgICBhIGNoZWFwZXN0IChiZXN0KSBvbmUuICAqLworCSAgaWYgKGNv c3QgPD0gKHVuc2lnbmVkKXBhcmFtX21heF91bnN3aXRjaF9pbnNucykKIAkgICAgewotCSAg ICAgIGZyZWUgKGJicyk7Ci0JICAgICAgcmV0dXJuIGNoYW5nZWQ7CisJICAgICAgcHJlZGlj YXRlID0gcHJlZDsKKwkgICAgICBiYiA9IGJic1tpXTsKKwkgICAgICBicmVhazsKKwkgICAg fQorCSAgZWxzZSBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMp KQorCSAgICB7CisJICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiOzsgTm90IHVuc3dpdGNo aW5nIGNvbmRpdGlvbiwgY29zdCB0b28gYmlnICIKKwkJICAgICAgICIoJWQgaW5zbnMpOiAi LCBjb3N0KTsKKwkgICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1bXBfZmlsZSwgcHJlZC0+ Y29uZGl0aW9uKTsKKwkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwogCSAgICB9 Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGNvbmQgPSBzaW1wbGlmeV91c2luZ19lbnRyeV9j aGVja3MgKGxvb3AsIGNvbmQpOwotICAgICAgc3RtdCA9IGxhc3Rfc3RtdCAoYmJzW2ldKTsK LSAgICAgIGlmIChpbnRlZ2VyX25vbnplcm9wIChjb25kKSkKLQl7Ci0JICAvKiBSZW1vdmUg ZmFsc2UgcGF0aC4gICovCi0JICBnaW1wbGVfY29uZF9zZXRfY29uZGl0aW9uX2Zyb21fdHJl ZSAoYXNfYSA8Z2NvbmQgKj4gKHN0bXQpLAotCQkJCQkgICAgICAgYm9vbGVhbl90cnVlX25v ZGUpOwotCSAgY2hhbmdlZCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZWdlcl96 ZXJvcCAoY29uZCkpCi0JewotCSAgLyogUmVtb3ZlIHRydWUgcGF0aC4gICovCi0JICBnaW1w bGVfY29uZF9zZXRfY29uZGl0aW9uX2Zyb21fdHJlZSAoYXNfYSA8Z2NvbmQgKj4gKHN0bXQp LAotCQkJCQkgICAgICAgYm9vbGVhbl9mYWxzZV9ub2RlKTsKLQkgIGNoYW5nZWQgPSB0cnVl OwotCX0KLSAgICAgIC8qIERvIG5vdCB1bnN3aXRjaCB0b28gbXVjaC4gICovCi0gICAgICBl bHNlIGlmIChudW0gPiBwYXJhbV9tYXhfdW5zd2l0Y2hfbGV2ZWwpCi0JewotCSAgaSsrOwot CSAgY29udGludWU7Ci0JfQotICAgICAgLyogSW4gbmVzdGVkIHRyZWVfdW5zd2l0Y2hfc2lu Z2xlX2xvb3AgZmlyc3Qgb3B0aW1pemUgYWxsIGNvbmRpdGlvbnMKLQkgdXNpbmcgZW50cnkg Y2hlY2tzLCB0aGVuIGRpc2NvdmVyIHN0aWxsIHJlYWNoYWJsZSBibG9ja3MgaW4gdGhlCi0J IGxvb3AgYW5kIGZpbmQgdGhlIGNvbmRpdGlvbiBvbmx5IGFtb25nIHRob3NlIHN0aWxsIHJl YWNoYWJsZSBiYnMuICAqLwotICAgICAgZWxzZSBpZiAobnVtICE9IDApCi0JewotCSAgaWYg KGZvdW5kID09IGxvb3AtPm51bV9ub2RlcykKLQkgICAgZm91bmQgPSBpOwotCSAgaSsrOwot CSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvdW5kID0gaTsKLQkgIGJy ZWFrOwogCX0KLQotICAgICAgdXBkYXRlX3N0bXQgKHN0bXQpOwotICAgICAgaSsrOwogICAg IH0KIAotICBpZiAobnVtICE9IDApCisgIGlmIChwcmVkaWNhdGUgIT0gTlVMTCkKICAgICB7 Ci0gICAgICBiYXNpY19ibG9jayAqdG9zLCAqd29ya2xpc3Q7Ci0KLSAgICAgIC8qIFdoZW4g Y2FsbGVkIHJlY3Vyc2l2ZWx5LCBmaXJzdCBkbyBhIHF1aWNrIGRpc2NvdmVyeQotCSBvZiBy ZWFjaGFibGUgYmJzIGFmdGVyIHRoZSBhYm92ZSBjaGFuZ2VzIGFuZCBvbmx5Ci0JIGNvbnNp ZGVyIGNvbmRpdGlvbnMgaW4gc3RpbGwgcmVhY2hhYmxlIGJicy4gICovCi0gICAgICB0b3Mg PSB3b3JrbGlzdCA9IFhORVdWRUMgKGJhc2ljX2Jsb2NrLCBsb29wLT5udW1fbm9kZXMpOwot Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbG9vcC0+bnVtX25vZGVzOyBpKyspCi0JYmJzW2ld LT5mbGFncyAmPSB+QkJfUkVBQ0hBQkxFOworICAgICAgaWYgKCFkYmdfY250IChsb29wX3Vu c3dpdGNoKSkKKwlnb3RvIGV4aXQ7CiAKLSAgICAgIC8qIFN0YXJ0IHdpdGggbWFya2luZyBo ZWFkZXIuICAqLwotICAgICAgKnRvcysrID0gYmJzWzBdOwotICAgICAgYmJzWzBdLT5mbGFn cyB8PSBCQl9SRUFDSEFCTEU7Ci0KLSAgICAgIC8qIEl0ZXJhdGU6IGZpbmQgZXZlcnl0aGlu ZyByZWFjaGFibGUgZnJvbSB3aGF0IHdlJ3ZlIGFscmVhZHkgc2VlbgotCSB3aXRoaW4gdGhl IHNhbWUgaW5uZXJtb3N0IGxvb3AuICBEb24ndCBsb29rIHRocm91Z2ggZmFsc2UgZWRnZXMK LQkgaWYgY29uZGl0aW9uIGlzIGFsd2F5cyB0cnVlIG9yIHRydWUgZWRnZXMgaWYgY29uZGl0 aW9uIGlzCi0JIGFsd2F5cyBmYWxzZS4gICovCi0gICAgICB3aGlsZSAodG9zICE9IHdvcmts aXN0KQorICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxT KSkKIAl7Ci0JICBiYXNpY19ibG9jayBiID0gKi0tdG9zOwotCSAgZWRnZSBlOwotCSAgZWRn ZV9pdGVyYXRvciBlaTsKLQkgIGludCBmbGFncyA9IDA7Ci0KLQkgIGlmIChFREdFX0NPVU5U IChiLT5zdWNjcykgPT0gMikKLQkgICAgewotCSAgICAgIGdpbXBsZSAqc3RtdCA9IGxhc3Rf c3RtdCAoYik7Ci0JICAgICAgaWYgKHN0bXQKLQkJICAmJiBnaW1wbGVfY29kZSAoc3RtdCkg PT0gR0lNUExFX0NPTkQpCi0JCXsKLQkJICBnY29uZCAqY29uZF9zdG10ID0gYXNfYSA8Z2Nv bmQgKj4gKHN0bXQpOwotCQkgIGlmIChnaW1wbGVfY29uZF90cnVlX3AgKGNvbmRfc3RtdCkp Ci0JCSAgICBmbGFncyA9IEVER0VfRkFMU0VfVkFMVUU7Ci0JCSAgZWxzZSBpZiAoZ2ltcGxl X2NvbmRfZmFsc2VfcCAoY29uZF9zdG10KSkKLQkJICAgIGZsYWdzID0gRURHRV9UUlVFX1ZB TFVFOwotCQl9Ci0JICAgIH0KLQotCSAgRk9SX0VBQ0hfRURHRSAoZSwgZWksIGItPnN1Y2Nz KQotCSAgICB7Ci0JICAgICAgYmFzaWNfYmxvY2sgZGVzdCA9IGUtPmRlc3Q7Ci0KLQkgICAg ICBpZiAoZGVzdC0+bG9vcF9mYXRoZXIgPT0gbG9vcAotCQkgICYmICEoZGVzdC0+ZmxhZ3Mg JiBCQl9SRUFDSEFCTEUpCi0JCSAgJiYgIShlLT5mbGFncyAmIGZsYWdzKSkKLQkJewotCQkg ICp0b3MrKyA9IGRlc3Q7Ci0JCSAgZGVzdC0+ZmxhZ3MgfD0gQkJfUkVBQ0hBQkxFOwotCQl9 Ci0JICAgIH0KKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIjs7IFVuc3dpdGNoaW5nIGxvb3Ag b24gY29uZGl0aW9uOiAiKTsKKwkgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCBw cmVkaWNhdGUtPmNvbmRpdGlvbik7CisJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcbiIpOwog CX0KIAotICAgICAgZnJlZSAod29ya2xpc3QpOwotCi0gICAgICAvKiBGaW5kIGEgYmIgdG8g dW5zd2l0Y2ggb24uICAqLwotICAgICAgZm9yICg7IGZvdW5kIDwgbG9vcC0+bnVtX25vZGVz OyBmb3VuZCsrKQotCWlmICgoYmJzW2ZvdW5kXS0+ZmxhZ3MgJiBCQl9SRUFDSEFCTEUpCi0J ICAgICYmIChjb25kID0gdHJlZV9tYXlfdW5zd2l0Y2hfb24gKGJic1tmb3VuZF0sIGxvb3Ap KSkKLQkgIGJyZWFrOwotCi0gICAgICBpZiAoZm91bmQgPT0gbG9vcC0+bnVtX25vZGVzKQor ICAgICAgaW5pdGlhbGl6ZV9vcmlnaW5hbF9jb3B5X3RhYmxlcyAoKTsKKyAgICAgIC8qIFVu c3dpdGNoIHRoZSBsb29wIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KKyAgICAgIG5sb29wID0g dHJlZV91bnN3aXRjaF9sb29wIChsb29wLCBiYiwgcHJlZGljYXRlLT5jb25kaXRpb24pOwor ICAgICAgaWYgKCFubG9vcCkKIAl7Ci0JICBmcmVlIChiYnMpOwotCSAgcmV0dXJuIGNoYW5n ZWQ7CisJICBmcmVlX29yaWdpbmFsX2NvcHlfdGFibGVzICgpOworCSAgZ290byBleGl0Owog CX0KLSAgICB9CiAKLSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRB SUxTKSkKLSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICI7OyBVbnN3aXRjaGluZyBsb29wXG4i KTsKKyAgICAgIC8qIENvcHkgQkIgY29zdHMuICAqLworICAgICAgYmFzaWNfYmxvY2sgKmJi czIgPSBnZXRfbG9vcF9ib2R5IChubG9vcCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw OyBpIDwgbmxvb3AtPm51bV9ub2RlczsgaSsrKQorCWJiczJbaV0tPmF1eCA9IGdldF9iYl9v cmlnaW5hbCAoYmJzMltpXSktPmF1eDsKIAotICBpbml0aWFsaXplX29yaWdpbmFsX2NvcHlf dGFibGVzICgpOwotICAvKiBVbnN3aXRjaCB0aGUgbG9vcCBvbiB0aGlzIGNvbmRpdGlvbi4g ICovCi0gIG5sb29wID0gdHJlZV91bnN3aXRjaF9sb29wIChsb29wLCBiYnNbZm91bmRdLCBj b25kKTsKLSAgaWYgKCFubG9vcCkKLSAgICB7CisgICAgICBmcmVlIChiYnMyKTsKKworICAg ICAgLyogVXBkYXRlIHRoZSBTU0EgZm9ybSBhZnRlciB1bnN3aXRjaGluZy4gICovCisgICAg ICB1cGRhdGVfc3NhIChUT0RPX3VwZGF0ZV9zc2EpOwogICAgICAgZnJlZV9vcmlnaW5hbF9j b3B5X3RhYmxlcyAoKTsKLSAgICAgIGZyZWUgKGJicyk7Ci0gICAgICByZXR1cm4gY2hhbmdl ZDsKLSAgICB9CiAKLSAgLyogVXBkYXRlIHRoZSBTU0EgZm9ybSBhZnRlciB1bnN3aXRjaGlu Zy4gICovCi0gIHVwZGF0ZV9zc2EgKFRPRE9fdXBkYXRlX3NzYSk7Ci0gIGZyZWVfb3JpZ2lu YWxfY29weV90YWJsZXMgKCk7CisgICAgICAvKiBJbnZva2UgaXRzZWxmIG9uIG1vZGlmaWVk IGxvb3BzLiAgKi8KKyAgICAgIHByZWRpY2F0ZV9wYXRoLnNhZmVfcHVzaCAoc3RkOjptYWtl X3BhaXIgKHByZWRpY2F0ZSwgdHJ1ZSkpOworICAgICAgY2hhbmdlZCB8PSBzaW1wbGlmeV9s b29wX3ZlcnNpb24gKG5sb29wLCBwcmVkaWNhdGVfcGF0aCk7CisgICAgICB0cmVlX3Vuc3dp dGNoX3NpbmdsZV9sb29wIChubG9vcCwgbnVtICsgMSwgcHJlZGljYXRlX3BhdGgpOworICAg ICAgcHJlZGljYXRlX3BhdGgucG9wICgpOwogCi0gIC8qIEludm9rZSBpdHNlbGYgb24gbW9k aWZpZWQgbG9vcHMuICAqLwotICB0cmVlX3Vuc3dpdGNoX3NpbmdsZV9sb29wIChubG9vcCwg bnVtICsgMSk7Ci0gIHRyZWVfdW5zd2l0Y2hfc2luZ2xlX2xvb3AgKGxvb3AsIG51bSArIDEp OworICAgICAgcHJlZGljYXRlX3BhdGguc2FmZV9wdXNoIChzdGQ6Om1ha2VfcGFpciAocHJl ZGljYXRlLCBmYWxzZSkpOworICAgICAgY2hhbmdlZCB8PSBzaW1wbGlmeV9sb29wX3ZlcnNp b24gKGxvb3AsIHByZWRpY2F0ZV9wYXRoKTsKKyAgICAgIHRyZWVfdW5zd2l0Y2hfc2luZ2xl X2xvb3AgKGxvb3AsIG51bSArIDEsIHByZWRpY2F0ZV9wYXRoKTsKKyAgICAgIHByZWRpY2F0 ZV9wYXRoLnBvcCAoKTsKKyAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKworZXhpdDoK ICAgZnJlZSAoYmJzKTsKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBjaGFuZ2VkOwogfQog CiAvKiBVbnN3aXRjaCBhIExPT1Agdy5yLiB0byBnaXZlbiBiYXNpYyBibG9jayBVTlNXSVRD SF9PTi4gIFdlIG9ubHkgc3VwcG9ydAo= --------------GuDMenYiWCeul8cQSkTEcJ8c--