Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzyVI-001Uhy-0Z for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Mar 2026 14:56:13 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vzyVG-0045Iz-1g for pgsql-hackers@arkaria.postgresql.org; Tue, 10 Mar 2026 14:56:11 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vzyVF-0045IZ-2d for pgsql-hackers@lists.postgresql.org; Tue, 10 Mar 2026 14:56:10 +0000 Received: from forward501d.mail.yandex.net ([178.154.239.209]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vzyV8-00000001Sqj-2JOH for pgsql-hackers@lists.postgresql.org; Tue, 10 Mar 2026 14:56:09 +0000 Received: from mail-nwsmtp-smtp-production-main-76.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-76.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:5f11:0:640:6821:0]) by forward501d.mail.yandex.net (Yandex) with ESMTPS id 33F0B81CF0; Tue, 10 Mar 2026 17:55:59 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-76.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id wtG82VmG5uQ0-YXwG563R; Tue, 10 Mar 2026 17:55:58 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1773154558; bh=dIKaTSqAvsp4CiDCLkEEKNq2+T6CcE6+53oHItOmvfI=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=WXlRAR36wcxSVhzzvSTtRaqL4ThukHfe/4Z124U7sQ7IfeOJPYxCfVqLI89j0TMQh nQO7QXdVHUkBydhDRPwJCtpAUaZHbqMvpXjRQ+TVz3L/aYwhaXAaU2OIOOMTMMC3SY yNFKT0ccsJZqfawG2iTVv7Sj5zG8NHt+tgjcAu5Y= Authentication-Results: mail-nwsmtp-smtp-production-main-76.iva.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------G10OE900fBaI2oia0thkS9aQ" Message-ID: <8375f8b5-1f21-401e-bbc3-a749302b76c7@tantorlabs.com> Date: Tue, 10 Mar 2026 17:55:57 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Hash-based MCV matching for large IN-lists To: Zsolt Parragi Cc: David Geier , Chengpeng Yan , Tatsuya Kawata , "pgsql-hackers@lists.postgresql.org" References: <7db341e0-fbc6-4ec5-922c-11fdafe7be12@tantorlabs.com> <988e3168-6096-488a-bb42-787e1e8c21a4@tantorlabs.com> <21FF6A0B-886F-4132-B6A6-0F4E934B4CEE@Outlook.com> <8ee9d903-bb13-434c-8145-b3769bf2b3cb@tantorlabs.com> <9e3054ae-1c5d-46dd-9b6a-7fb67764b076@tantorlabs.com> <9067a807-f130-4631-8df4-076c6d7e43b6@tantorlabs.com> <03aa576f-13bb-4ed1-bee4-0ee69ad8813c@tantorlabs.com> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------G10OE900fBaI2oia0thkS9aQ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit In the thread discussing ALL semantics and NULL [0], the question was raised about adding a new regression test that checks selectivity estimation. If the change gets committed, it would make sense to add tests for this case as well. Regarding the idea of optimizing the loop when all per-element selectivities are the same: I ran some quick tests to see how much the change in the v7-0002 patch affects planning time. Even without that patch, iterating over an array with 50k elements takes about 30 ms. ``` CREATE TABLE t (val bytea PRIMARY KEY); INSERT INTO t SELECT int4send(i) FROM generate_series(1,50000) AS i; ANALYZE t; SELECT n_distinct FROM pg_stats WHERE tablename = 't';  n_distinct ------------          -1 (1 row) SELECT string_agg(format('int4send(%s)', i), ',') FROM generate_series(1,50000) AS i \gset EXPLAIN (SUMMARY) SELECT * FROM t WHERE val = ANY (ARRAY[:string_agg]::bytea[]); ..........  Planning Time: 32.816 ms (3 rows) ``` Given that, I don't see much benefit in adding additional logic here just to avoid the loop. It would likely introduce extra code complexity without a manful gain. If there is interest in optimization this case further, I can revisit it and add the additional patch. The patch v8 can still be reviewed as-is, and if the selectivity regression test gets committed [0], I will add corresponding tests for this change as well. [0]: https://www.postgresql.org/message-id/390a46f3-dbc4-4dc1-b49d-5cc61dd36026%40tantorlabs.com -- Best regards, Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------G10OE900fBaI2oia0thkS9aQ Content-Type: text/x-patch; charset=UTF-8; name="v8-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.patch" Content-Disposition: attachment; filename*0="v8-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAyMmJlMzdmYzYyNTkyMWRiYjE3MjJhMThkZGU2YjZlOWRhMDA4OTBhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogVHVlLCAxMCBNYXIgMjAyNiAxNzoxMToxNiArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjhdIFVzZSBoYXNoLWJhc2VkIE1DViBtYXRjaGluZyBmb3IgU2Nh bGFyQXJyYXlPcEV4cHIKIHNlbGVjdGl2aXR5CgpXaGVuIGVzdGltYXRpbmcgc2VsZWN0aXZp dHkgZm9yIFNjYWxhckFycmF5T3BFeHByIChJTiAvIEFOWSAvIEFMTCkgd2l0aAphdmFpbGFi bGUgTUNWIHN0YXRpc3RpY3MsIHRoZSBwbGFubmVyIGN1cnJlbnRseSBtYXRjaGVzIElOLWxp c3QgZWxlbWVudHMKYWdhaW5zdCB0aGUgTUNWIGFycmF5IHVzaW5nIG5lc3RlZCBsb29wcy4g Rm9yIGxhcmdlIElOLWxpc3RzIGFuZC9vciBsYXJnZQpNQ1YgbGlzdHMgdGhpcyBsZWFkcyB0 byBPKE4qTSkgcGxhbm5pbmctdGltZSBiZWhhdmlvci4KClRoaXMgcGF0Y2ggYWRkcyBhIGhh c2gtYmFzZWQgbWF0Y2hpbmcgc3RyYXRlZ3ksIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkCmlu IGpvaW4gc2VsZWN0aXZpdHkgZXN0aW1hdGlvbi4gV2hlbiBNQ1Ygc3RhdGlzdGljcyBhcmUg YXZhaWxhYmxlIGFuZCB0aGUKb3BlcmF0b3Igc3VwcG9ydHMgaGFzaGluZywgdGhlIHNtYWxs ZXIgb2YgdGhlIHR3byBpbnB1dHMgKE1DViBsaXN0IG9yCklOLWxpc3QgY29uc3RhbnQgZWxl bWVudHMpIGlzIGNob3NlbiBhcyB0aGUgaGFzaCB0YWJsZSBidWlsZCBzaWRlLCBhbmQKdGhl IG90aGVyIHNpZGUgaXMgc2Nhbm5lZCBvbmNlLCByZWR1Y2luZyBjb21wbGV4aXR5IHRvIE8o TitNKS4KClRoZSBoYXNoLWJhc2VkIHBhdGggaXMgcmVzdHJpY3RlZCB0byBlcXVhbGl0eSBh bmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMKdGhhdCB1c2UgZXFzZWwoKS9uZXFzZWwoKSwgYW5k IGlzIGFwcGxpZWQgb25seSB3aGVuIHN1aXRhYmxlIGhhc2gKZnVuY3Rpb25zIGFuZCBNQ1Yg c3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlLgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jIHwgNTE4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmls ZSBjaGFuZ2VkLCA1MTMgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IGQ0ZGEwZThkZWE5Li42NmMzZTMxZWFhNSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTE0NiwyMyArMTQ2LDI3IEBACiAvKgog ICogSW4gcHJvZHVjdGlvbiBidWlsZHMsIHN3aXRjaCB0byBoYXNoLWJhc2VkIE1DViBtYXRj aGluZyB3aGVuIHRoZSBsaXN0cyBhcmUKICAqIGxhcmdlIGVub3VnaCB0byBhbW9ydGl6ZSBo YXNoIHNldHVwIGNvc3QuICAoVGhpcyB0aHJlc2hvbGQgaXMgY29tcGFyZWQgdG8KLSAqIHRo ZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIHR3byBNQ1YgbGlzdHMuICBUaGlzIGlzIHNp bXBsaXN0aWMgYnV0IHNlZW1zCisgKiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSB0 d28gbGlzdHMuICBUaGlzIGlzIHNpbXBsaXN0aWMgYnV0IHNlZW1zCiAgKiB0byB3b3JrIHdl bGwgZW5vdWdoLikgIEluIGRlYnVnIGJ1aWxkcywgd2UgdXNlIGEgc21hbGxlciB0aHJlc2hv bGQgc28gdGhhdAogICogdGhlIHJlZ3Jlc3Npb24gdGVzdHMgY292ZXIgYm90aCBwYXRocyB3 ZWxsLgogICovCiAjaWZuZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKLSNkZWZpbmUgRVFKT0lO U0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMDAKKyNkZWZpbmUgTUNWX0hBU0hfVEhSRVNIT0xE IDIwMAogI2Vsc2UKLSNkZWZpbmUgRVFKT0lOU0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMAor I2RlZmluZSBNQ1ZfSEFTSF9USFJFU0hPTEQgMjAKICNlbmRpZgogCi0vKiBFbnRyaWVzIGlu IHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgdXNlZCBieSBlcWpvaW5zZWxfZmluZF9tYXRj aGVzICovCisvKgorICogRW50cmllcyBpbiB0aGUgc2ltcGxlaGFzaCBoYXNoIHRhYmxlIHVz ZWQgYnkKKyAqIGVxam9pbnNlbF9maW5kX21hdGNoZXMgYW5kIHNjYWxhcmFycmF5X21jdl9o YXNoX21hdGNoCisgKi8KIHR5cGVkZWYgc3RydWN0IE1DVkhhc2hFbnRyeQogewogCURhdHVt CQl2YWx1ZTsJCQkvKiB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSAqLwog CWludAkJCWluZGV4OwkJCS8qIGl0cyBpbmRleCBpbiB0aGUgcmVsZXZhbnQgQXR0U3RhdHNT bG90ICovCiAJdWludDMyCQloYXNoOwkJCS8qIGhhc2ggY29kZSBmb3IgdGhlIERhdHVtICov CiAJY2hhcgkJc3RhdHVzOwkJCS8qIHN0YXR1cyBjb2RlIHVzZWQgYnkgc2ltcGxlaGFzaC5o ICovCisJaW50CQkJY291bnQ7CQkJLyogbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGN1cnJl bnQgdmFsdWUgaW4gKi8KIH0gTUNWSGFzaEVudHJ5OwogCiAvKiBwcml2YXRlX2RhdGEgZm9y IHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgKi8KQEAgLTE4NCw2ICsxODgsMTYgQEAgZ2V0 X3JlbGF0aW9uX3N0YXRzX2hvb2tfdHlwZSBnZXRfcmVsYXRpb25fc3RhdHNfaG9vayA9IE5V TEw7CiBnZXRfaW5kZXhfc3RhdHNfaG9va190eXBlIGdldF9pbmRleF9zdGF0c19ob29rID0g TlVMTDsKIAogc3RhdGljIGRvdWJsZSBlcXNlbF9pbnRlcm5hbChQR19GVU5DVElPTl9BUkdT LCBib29sIG5lZ2F0ZSk7CitzdGF0aWMgZG91YmxlIHNjYWxhcmFycmF5X21jdl9oYXNoX21h dGNoKFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcGVyYXRvciwKKwkJCQkJCQkJ CQkgT2lkIGNvbGxhdGlvbiwgU2VsZWN0aXZpdHkgczIsCisJCQkJCQkJCQkJIERhdHVtICpl bGVtX3ZhbHVlcywgYm9vbCAqZWxlbV9udWxscywKKwkJCQkJCQkJCQkgaW50IG51bV9lbGVt cywgYm9vbCAqZWxlbV9jb25zdCwKKwkJCQkJCQkJCQkgT2lkIG5vbWluYWxfZWxlbWVudF90 eXBlLCBib29sIHVzZU9yLAorCQkJCQkJCQkJCSBib29sIGlzRXF1YWxpdHksIGJvb2wgaXNJ bmVxdWFsaXR5KTsKK3N0YXRpYyB2b2lkIGFjY3VtX3NjYWxhcmFycmF5X3Byb2IoZG91Ymxl IGluZGl2aWR1YWxfcywgaW50IGNvdW50LAorCQkJCQkJCQkgICBib29sIHVzZU9yLCBib29s IGlzRXF1YWxpdHksCisJCQkJCQkJCSAgIGJvb2wgaXNJbmVxdWFsaXR5LCBkb3VibGUgbnVs bGZyYWMsCisJCQkJCQkJCSAgIGRvdWJsZSAqc2VsZWMsIGRvdWJsZSAqczFkaXNqb2ludCk7 CiBzdGF0aWMgZG91YmxlIGVxam9pbnNlbF9pbm5lcihGbWdySW5mbyAqZXFwcm9jLCBPaWQg Y29sbGF0aW9uLAogCQkJCQkJCSAgT2lkIGhhc2hMZWZ0LCBPaWQgaGFzaFJpZ2h0LAogCQkJ CQkJCSAgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YTEsIFZhcmlhYmxlU3RhdERhdGEgKnZh cmRhdGEyLApAQCAtMTg5Myw2ICsxOTA3LDM2IEBAIHN0cmlwX2FycmF5X2NvZXJjaW9uKE5v ZGUgKm5vZGUpCiAJcmV0dXJuIG5vZGU7CiB9CiAKKy8qCisgKiBBY2N1bXVsYXRlIHRoZSBz ZWxlY3Rpdml0eSBjb250cmlidXRpb24gb2YgYSBzaW5nbGUgYXJyYXkgZWxlbWVudAorICog aW50byB0aGUgcnVubmluZyBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBlc3RpbWF0 ZS4KKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX3NjYWxhcmFycmF5X3Byb2IoZG91YmxlIGlu ZGl2aWR1YWxfcywgaW50IGNvdW50LCBib29sIHVzZU9yLCBib29sIGlzRXF1YWxpdHksCisJ CQkJCSAgIGJvb2wgaXNJbmVxdWFsaXR5LCBkb3VibGUgbnVsbGZyYWMsIGRvdWJsZSAqc2Vs ZWMsIGRvdWJsZSAqczFkaXNqb2ludCkKK3sKKwlpZiAoY291bnQgPD0gMCkKKwkJcmV0dXJu OworCisJaWYgKGlzSW5lcXVhbGl0eSkKKwkJaW5kaXZpZHVhbF9zID0gMS4wIC0gaW5kaXZp ZHVhbF9zIC0gbnVsbGZyYWM7CisKKwlDTEFNUF9QUk9CQUJJTElUWShpbmRpdmlkdWFsX3Mp OworCisJaWYgKHVzZU9yKQorCXsKKwkJKnNlbGVjID0gMS4wIC0gKDEuMCAtICpzZWxlYykg KiBwb3coMS4wIC0gaW5kaXZpZHVhbF9zLCBjb3VudCk7CisJCWlmIChpc0VxdWFsaXR5KQor CQkJKnMxZGlzam9pbnQgKz0gaW5kaXZpZHVhbF9zICogY291bnQ7CisJfQorCWVsc2UKKwl7 CisJCSpzZWxlYyA9ICgqc2VsZWMpICogcG93KGluZGl2aWR1YWxfcywgY291bnQpOworCQlp ZiAoaXNJbmVxdWFsaXR5KQorCQkJKnMxZGlzam9pbnQgKz0gY291bnQgKiAoaW5kaXZpZHVh bF9zIC0gMS4wKTsKKwl9Cit9CisKIC8qCiAgKgkJc2NhbGFyYXJyYXlzZWwJCS0gU2VsZWN0 aXZpdHkgb2YgU2NhbGFyQXJyYXlPcEV4cHIgTm9kZS4KICAqLwpAQCAtMjAyNSw2ICsyMDY5 LDM2IEBAIHNjYWxhcmFycmF5c2VsKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJICBlbG1s ZW4sIGVsbWJ5dmFsLCBlbG1hbGlnbiwKIAkJCQkJCSAgJmVsZW1fdmFsdWVzLCAmZWxlbV9u dWxscywgJm51bV9lbGVtcyk7CiAKKwkJLyogVHJ5IHRvIGF2b2lkIE8oTl4yKSBzZWxlY3Rp dml0eSBjYWxjdWxhdGlvbiBmb3IgU2NhbGFyQXJyYXlPcEV4cHIgKi8KKwkJaWYgKChpc0Vx dWFsaXR5IHx8IGlzSW5lcXVhbGl0eSkgJiYgIWlzX2pvaW5fY2xhdXNlKQorCQl7CisJCQlW YXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CisJCQlOb2RlCSAgICpvdGhlcl9vcCA9IE5VTEw7 CisJCQlib29sCQl2YXJfb25fbGVmdDsKKwkJCWJvb2wJICAgKmVsZW1fY29uc3QgPSBOVUxM OworCisJCQkvKgorCQkJICogSWYgdGhlIGNsYXVzZSBpcyBvZiB0aGUgZm9ybSAidmFyIE9Q IHNvbWV0aGluZyIgb3IgInNvbWV0aGluZworCQkJICogT1AgdmFyIiwgZXh0cmFjdCBzdGF0 aXN0aWNzIGZvciB0aGUgdmFyaWFibGUuIE90aGVyd2lzZSwgZmFsbAorCQkJICogYmFjayB0 byBhIGRlZmF1bHQgcGVyLWVsZW1lbnQgZXN0aW1hdGUuCisJCQkgKi8KKwkJCWlmIChnZXRf cmVzdHJpY3Rpb25fdmFyaWFibGUocm9vdCwgY2xhdXNlLT5hcmdzLCB2YXJSZWxpZCwKKwkJ CQkJCQkJCQkgJnZhcmRhdGEsICZvdGhlcl9vcCwgJnZhcl9vbl9sZWZ0KSkKKwkJCXsKKwkJ CQlzMSA9IHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNoKCZ2YXJkYXRhLCBvcGVyYXRvciwK KwkJCQkJCQkJCQkJCWNsYXVzZS0+aW5wdXRjb2xsaWQsIC0xLjAsCisJCQkJCQkJCQkJCQll bGVtX3ZhbHVlcywgZWxlbV9udWxscywKKwkJCQkJCQkJCQkJCW51bV9lbGVtcywgZWxlbV9j b25zdCwKKwkJCQkJCQkJCQkJCW5vbWluYWxfZWxlbWVudF90eXBlLCB1c2VPciwKKwkJCQkJ CQkJCQkJCWlzRXF1YWxpdHksIGlzSW5lcXVhbGl0eSk7CisKKwkJCQlSZWxlYXNlVmFyaWFi bGVTdGF0cyh2YXJkYXRhKTsKKworCQkJCWlmIChzMSA+PSAwLjApCisJCQkJCXJldHVybiBz MTsKKwkJCX0KKwkJfQorCiAJCS8qCiAJCSAqIEZvciBnZW5lcmljIG9wZXJhdG9ycywgd2Ug YXNzdW1lIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIGlzCiAJCSAqIGluZGVwZW5kZW50 IGZvciBlYWNoIGFycmF5IGVsZW1lbnQuICBCdXQgZm9yICI9IEFOWSIgb3IgIjw+IEFMTCIs CkBAIC0yMTAwLDYgKzIxNzQsMTAwIEBAIHNjYWxhcmFycmF5c2VsKFBsYW5uZXJJbmZvICpy b290LAogCQlnZXRfdHlwbGVuYnl2YWwoYXJyYXlleHByLT5lbGVtZW50X3R5cGVpZCwKIAkJ CQkJCSZlbG1sZW4sICZlbG1ieXZhbCk7CiAKKwkJLyogVHJ5IHRvIGF2b2lkIE8oTl4yKSBz ZWxlY3Rpdml0eSBjYWxjdWxhdGlvbiBmb3IgU2NhbGFyQXJyYXlPcEV4cHIgKi8KKwkJaWYg KChpc0VxdWFsaXR5IHx8IGlzSW5lcXVhbGl0eSkgJiYgIWlzX2pvaW5fY2xhdXNlKQorCQl7 CisJCQlWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CisJCQlOb2RlCSAgICpvdGhlcl9vcCA9 IE5VTEw7CisJCQlib29sCQl2YXJfb25fbGVmdDsKKwkJCWludAkJCW51bV9lbGVtcyA9IGxp c3RfbGVuZ3RoKGFycmF5ZXhwci0+ZWxlbWVudHMpOworCisJCQkvKgorCQkJICogSWYgZXhw cmVzc2lvbiBpcyBub3QgdmFyaWFibGUgPSBzb21ldGhpbmcgb3Igc29tZXRoaW5nID0KKwkJ CSAqIHZhcmlhYmxlLCB0aGVuIGZhbGwgYmFjayB0byBkZWZhdWx0IGNvZGUgcGF0aCB0byBj b21wdXRlCisJCQkgKiBkZWZhdWx0IHNlbGVjdGl2aXR5LgorCQkJICovCisJCQlpZiAoZ2V0 X3Jlc3RyaWN0aW9uX3ZhcmlhYmxlKHJvb3QsIGNsYXVzZS0+YXJncywgdmFyUmVsaWQsCisJ CQkJCQkJCQkJICZ2YXJkYXRhLCAmb3RoZXJfb3AsICZ2YXJfb25fbGVmdCkpCisJCQl7CisJ CQkJU2VsZWN0aXZpdHkgbm9uY29uc3Rfc2VsOworCQkJCURhdHVtCSAgICplbGVtX3ZhbHVl czsKKwkJCQlib29sCSAgICplbGVtX251bGxzOworCQkJCWJvb2wJICAgKmVsZW1fY29uc3Q7 CisJCQkJTGlzdENlbGwgICAqbGM7CisKKwkJCQkvKgorCQkJCSAqIEJ1aWxkIGFycmF5cyBk ZXNjcmliaW5nIEFSUkFZW10gZWxlbWVudHM6IC0gZWxlbV92YWx1ZXM6CisJCQkJICogRGF0 dW0gdmFsdWUgZm9yIENvbnN0IGVsZW1lbnRzIC0gZWxlbV9udWxsczogd2hldGhlcgorCQkJ CSAqIGVsZW1lbnQgaXMgTlVMTCAtIGVsZW1fY29uc3Q6IHdoZXRoZXIgZWxlbWVudCBpcyBh IENvbnN0CisJCQkJICogbm9kZQorCQkJCSAqLworCQkJCWVsZW1fdmFsdWVzID0gcGFsbG9j X2FycmF5KERhdHVtLCBudW1fZWxlbXMpOworCQkJCWVsZW1fbnVsbHMgPSBwYWxsb2MwX2Fy cmF5KGJvb2wsIG51bV9lbGVtcyk7CisJCQkJZWxlbV9jb25zdCA9IHBhbGxvYzBfYXJyYXko Ym9vbCwgbnVtX2VsZW1zKTsKKworCQkJCWZvcmVhY2gobGMsIGFycmF5ZXhwci0+ZWxlbWVu dHMpCisJCQkJeworCQkJCQlOb2RlCSAgICplbGVtX3ZhbHVlID0gKE5vZGUgKikgbGZpcnN0 KGxjKTsKKwkJCQkJaW50CQkJaSA9IGZvcmVhY2hfY3VycmVudF9pbmRleChsYyk7CisKKwkJ CQkJaWYgKElzQShlbGVtX3ZhbHVlLCBDb25zdCkpCisJCQkJCXsKKwkJCQkJCWVsZW1fdmFs dWVzW2ldID0gKChDb25zdCAqKSBlbGVtX3ZhbHVlKS0+Y29uc3R2YWx1ZTsKKwkJCQkJCWVs ZW1fbnVsbHNbaV0gPSAoKENvbnN0ICopIGVsZW1fdmFsdWUpLT5jb25zdGlzbnVsbDsKKwkJ CQkJCWVsZW1fY29uc3RbaV0gPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJewor CQkJCQkJZWxlbV9udWxsc1tpXSA9IGZhbHNlOworCQkJCQkJZWxlbV9jb25zdFtpXSA9IGZh bHNlOworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogRm9yIEFMTCBzZW1hbnRpY3MsIGlm IHRoZSBhcnJheSBjb250YWlucyBOVUxMLCBhc3N1bWUKKwkJCQkJICogb3BlcmF0b3IgaXMg c3RyaWN0LiBUaGUgU2NhbGFyQXJyYXlPcEV4cHIgY2Fubm90CisJCQkJCSAqIGV2YWx1YXRl IHRvIFRSVUUsIHNvIHJldHVybiB6ZXJvLgorCQkJCQkgKi8KKwkJCQkJaWYgKCF1c2VPciAm JiBlbGVtX251bGxzW2ldKQorCQkJCQl7CisJCQkJCQlwZnJlZShlbGVtX3ZhbHVlcyk7CisJ CQkJCQlwZnJlZShlbGVtX251bGxzKTsKKwkJCQkJCXBmcmVlKGVsZW1fY29uc3QpOworCisJ CQkJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKworCQkJCQkJcmV0dXJuIChT ZWxlY3Rpdml0eSkgMC4wOworCQkJCQl9CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBDb21w dXRlIHBlci1lbGVtZW50IHNlbGVjdGl2aXR5IHZpYSBlcXNlbCgpL25lcXNlbAorCQkJCSAq IHNlbWFudGljcy4KKwkJCQkgKi8KKwkJCQlub25jb25zdF9zZWwgPSB2YXJfZXFfbm9uX2Nv bnN0KCZ2YXJkYXRhLCBvcGVyYXRvciwKKwkJCQkJCQkJCQkJCWNsYXVzZS0+aW5wdXRjb2xs aWQsCisJCQkJCQkJCQkJCQlvdGhlcl9vcCwgdmFyX29uX2xlZnQsCisJCQkJCQkJCQkJCQlp c0luZXF1YWxpdHkpOworCisJCQkJczEgPSBzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaCgm dmFyZGF0YSwgb3BlcmF0b3IsCisJCQkJCQkJCQkJCQljbGF1c2UtPmlucHV0Y29sbGlkLAor CQkJCQkJCQkJCQkJbm9uY29uc3Rfc2VsLCBlbGVtX3ZhbHVlcywKKwkJCQkJCQkJCQkJCWVs ZW1fbnVsbHMsIG51bV9lbGVtcywKKwkJCQkJCQkJCQkJCWVsZW1fY29uc3QsCisJCQkJCQkJ CQkJCQlub21pbmFsX2VsZW1lbnRfdHlwZSwgdXNlT3IsCisJCQkJCQkJCQkJCQlpc0VxdWFs aXR5LCBpc0luZXF1YWxpdHkpOworCisJCQkJcGZyZWUoZWxlbV92YWx1ZXMpOworCQkJCXBm cmVlKGVsZW1fbnVsbHMpOworCQkJCXBmcmVlKGVsZW1fY29uc3QpOworCisJCQkJUmVsZWFz ZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7CisKKwkJCQlpZiAoczEgPj0gMC4wKQorCQkJCQly ZXR1cm4gczE7CisJCQl9CisJCX0KKwogCQkvKgogCQkgKiBXZSB1c2UgdGhlIGFzc3VtcHRp b24gb2YgZGlzam9pbnQgcHJvYmFiaWxpdGllcyBoZXJlIHRvbywgYWx0aG91Z2gKIAkJICog dGhlIG9kZHMgb2YgZXF1YWwgYXJyYXkgZWxlbWVudHMgYXJlIHJhdGhlciBoaWdoZXIgaWYg dGhlIGVsZW1lbnRzCkBAIC0yMjEwLDYgKzIzNzgsMzQ2IEBAIHNjYWxhcmFycmF5c2VsKFBs YW5uZXJJbmZvICpyb290LAogCXJldHVybiBzMTsKIH0KIAorLyoKKyAqIEVzdGltYXRlIHNl bGVjdGl2aXR5IG9mIGEgU2NhbGFyQXJyYXlPcEV4cHIgKEFOWS9BTEwpIHVzaW5nIE1DViBz dGF0aXN0aWNzCisgKiB3aXRoIGhhc2gtYmFzZWQgbWF0Y2hpbmcuCisgKgorICogVGhpcyBm dW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHByb2JhYmlsaXR5IG1vZGVsIGFzIHRoZSBnZW5l cmljCisgKiBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBjb2RlIChpbmRlcGVuZGVu dCBvciBkaXNqb2ludCBwcm9iYWJpbGl0aWVzCisgKiBmb3IgT1IvQU5EIGNvbWJpbmF0aW9u cyksIGJ1dCBhdHRlbXB0cyB0byBzcGVlZCB1cCBtYXRjaGluZyBiZXR3ZWVuCisgKiBJTi1s aXN0IGVsZW1lbnRzIGFuZCB0aGUgY29sdW1uJ3MgbW9zdC1jb21tb24tdmFsdWVzIChNQ1Yp IHN0YXRpc3RpY3MgYnkKKyAqIHVzaW5nIGhhc2hpbmcgaW5zdGVhZCBvZiBuZXN0ZWQgbG9v cHMuCisgKgorICogTUNWIHN0YXRpc3RpY3MgYXJlIHVzZWQgb25seSB0byBvYnRhaW4gcGVy LXZhbHVlIHNlbGVjdGl2aXRpZXMgZm9yCisgKiBjb25zdGFudHMgdGhhdCBtYXRjaCBNQ1Yg ZW50cmllcy4gIEFsbCBwcm9iYWJpbGl0aWVzIGFyZSBjb21iaW5lZCB1c2luZworICogdGhl IHN0YW5kYXJkIEFOWS9BTEwgZm9ybXVsYXMsIGV4YWN0bHkgYXMgaW4gdGhlIGdlbmVyaWMg ZXN0aW1hdG9yLgorICoKKyAqIFRoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIC0xLjAgdG8gaW5k aWNhdGUgdGhhdCBoYXNoLWJhc2VkIE1DViBlc3RpbWF0aW9uCisgKiBpcyBub3QgYXBwbGlj YWJsZSAoZm9yIGV4YW1wbGUsIG1pc3Npbmcgc3RhdGlzdGljcywgdW5zdXBwb3J0ZWQgb3Bl cmF0b3IsCisgKiBvciB1bmF2YWlsYWJsZSBoYXNoIGZ1bmN0aW9ucyksIGluIHdoaWNoIGNh c2UgdGhlIGNhbGxlciBzaG91bGQgZmFsbCBiYWNrCisgKiB0byB0aGUgZ2VuZXJpYyBTY2Fs YXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBlc3RpbWF0aW9uLgorICoKKyAqIElucHV0czoK KyAqCXZhcmRhdGE6IHN0YXRpc3RpY3MgYW5kIG1ldGFkYXRhIGZvciB0aGUgdmFyaWFibGUg YmVpbmcgZXN0aW1hdGVkCisgKglvcGVyYXRvcjogZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBv cGVyYXRvciB0byBhcHBseQorICoJY29sbGF0aW9uOiBPSUQgb2YgY29sbGF0aW9uIHRvIHVz ZQorICogIG5vbmNvbnN0X3NlbDogc2VsZWN0aXZpdHkgb2Ygbm9uLWNvbnN0IGVsZW1lbnQK KyAqCWVsZW1fdmFsdWVzOiBhcnJheSBvZiBJTi1saXN0IGVsZW1lbnQgdmFsdWVzCisgKgll bGVtX251bGxzOiBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIElOLWxpc3QgZWxlbWVudHMgYXJl IE5VTEwKKyAqCWVsZW1fY29uc3Q6IGFycmF5IGluZGljYXRpbmcgd2hpY2ggSU4tbGlzdCBl bGVtZW50cyBhcmUgQ29uc3Qgbm9kZXMuCisgKiAgICAgICAgICAgICAgYXJyYXkgaXMgTlVM TCBpZiBhbGwgZWxlbW5ldHMgYXJlIGNvbnN0LgorICoJbnVtX2VsZW1zOiBudW1iZXIgb2Yg SU4tbGlzdCBlbGVtZW50cworICoJbm9taW5hbF9lbGVtZW50X3R5cGU6IHR5cGUgb2YgSU4t bGlzdCBlbGVtZW50cworICoJdXNlT3I6IHRydWUgaWYgZWxlbWVudHMgYXJlIGNvbWJpbmVk IHVzaW5nIE9SIHNlbWFudGljcywgZmFsc2UgZm9yIEFORAorICoJaXNFcXVhbGl0eTogdHJ1 ZSBpZiB0aGUgb3BlcmF0b3IgYmVoYXZlcyBsaWtlIGVxdWFsaXR5CisgKglpc0luZXF1YWxp dHk6IHRydWUgaWYgdGhlIG9wZXJhdG9yIGJlaGF2ZXMgbGlrZSBpbmVxdWFsaXR5CisgKgor ICogUmVzdWx0OgorICoJU2VsZWN0aXZpdHkgZXN0aW1hdGUgaW4gdGhlIHJhbmdlIFswLjAs IDEuMF0sIG9yIC0xLjAgaWYgbm8gZXN0aW1hdGUKKyAqCWNvdWxkIGJlIHByb2R1Y2VkIGJ5 IHRoaXMgZnVuY3Rpb24uCisgKgorICogTm90ZToKKyAqCVRoaXMgZnVuY3Rpb24gYXNzdW1l cyB0aGF0IHRoZSBvcGVyYXRvcuKAmXMgc2VsZWN0aXZpdHkgYmVoYXZpb3IgbWF0Y2hlcwor ICoJZXFzZWwoKS9uZXFzZWwgc2VtYW50aWNzLiAgSXQgbXVzdCBub3QgYmUgdXNlZCBmb3Ig b3BlcmF0b3JzIHdpdGggY3VzdG9tCisgKglvciBub24tc3RhbmRhcmQgc2VsZWN0aXZpdHkg YmVoYXZpb3IuCisgKi8KK3N0YXRpYyBkb3VibGUKK3NjYWxhcmFycmF5X21jdl9oYXNoX21h dGNoKFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcGVyYXRvciwKKwkJCQkJCSAg IE9pZCBjb2xsYXRpb24sIFNlbGVjdGl2aXR5IG5vbmNvbnN0X3NlbCwKKwkJCQkJCSAgIERh dHVtICplbGVtX3ZhbHVlcywgYm9vbCAqZWxlbV9udWxscywgaW50IG51bV9lbGVtcywKKwkJ CQkJCSAgIGJvb2wgKmVsZW1fY29uc3QsIE9pZCBub21pbmFsX2VsZW1lbnRfdHlwZSwKKwkJ CQkJCSAgIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwgYm9vbCBpc0luZXF1YWxpdHkp Cit7CisJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CisJQXR0U3RhdHNTbG90IHNzbG90Owor CUZtZ3JJbmZvCWVxcHJvYzsKKwlkb3VibGUJCXNlbGVjID0gLTEuMCwKKwkJCQlzMWRpc2pv aW50LAorCQkJCW51bGxmcmFjID0gMC4wOworCU9pZAkJCWhhc2hMZWZ0ID0gSW52YWxpZE9p ZCwKKwkJCQloYXNoUmlnaHQgPSBJbnZhbGlkT2lkLAorCQkJCW9wZnVuY29pZDsKKwlib29s CQloYXZlX21jdnMgPSBmYWxzZTsKKworCS8qCisJICogSWYgdGhlIHZhcmlhYmxlIGlzIGtu b3duIHRvIGJlIHVuaXF1ZSwgTUNWIHN0YXRpc3RpY3MgZG8gbm90IHJlcHJlc2VudAorCSAq IGEgbWVhbmluZ2Z1bCBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uLCBzbyBza2lwIE1DVi1iYXNl ZCBlc3RpbWF0aW9uLgorCSAqLworCWlmICh2YXJkYXRhLT5pc3VuaXF1ZSAmJiB2YXJkYXRh LT5yZWwgJiYgdmFyZGF0YS0+cmVsLT50dXBsZXMgPj0gMS4wKQorCQlyZXR1cm4gLTEuMDsK KworCS8qCisJICogRm9yIGluZXF1YWxpdHkgKDw+LCBBTEwpLCB3ZSBjb21wdXRlIHByb2Jh YmlsaXRpZXMgdXNpbmcgdGhlIG5lZ2F0ZWQKKwkgKiBlcXVhbGl0eSBvcGVyYXRvciBhbmQg bGF0ZXIgdHJhbnNmb3JtIHRoZW0gYXMKKwkgKgorCSAqIHAoeCA8PiBjKSA9IDEgLSBwKHgg PSBjKSAtIG51bGxmcmFjCisJICovCisJaWYgKGlzSW5lcXVhbGl0eSkKKwl7CisJCW9wZXJh dG9yID0gZ2V0X25lZ2F0b3Iob3BlcmF0b3IpOworCQlpZiAoIU9pZElzVmFsaWQob3BlcmF0 b3IpKQorCQkJcmV0dXJuIC0xLjA7CisJfQorCisJb3BmdW5jb2lkID0gZ2V0X29wY29kZShv cGVyYXRvcik7CisJbWVtc2V0KCZzc2xvdCwgMCwgc2l6ZW9mKHNzbG90KSk7CisKKwlpZiAo SGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKKwl7CisJCWlmIChzdGF0 aXN0aWNfcHJvY19zZWN1cml0eV9jaGVjayh2YXJkYXRhLCBvcGZ1bmNvaWQpKQorCQkJaGF2 ZV9tY3ZzID0gZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEtPnN0YXRzVHVwbGUs CisJCQkJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKKwkJCQkJCQkJ CQkgQVRUU1RBVFNTTE9UX1ZBTFVFUyB8IEFUVFNUQVRTU0xPVF9OVU1CRVJTKTsKKwl9CisK KwlpZiAoaGF2ZV9tY3ZzKQorCXsKKwkJLyoKKwkJICogSWYgdGhlIE1DViBsaXN0IGFuZCBJ Ti1saXN0IGFyZSBsYXJnZSBlbm91Z2gsIGFuZCB0aGUgb3BlcmF0b3IKKwkJICogc3VwcG9y dHMgaGFzaGluZywgYXR0ZW1wdCB0byB1c2UgaGFzaCBmdW5jdGlvbnMgc28gdGhhdCBNQ1bi gJNJTgorCQkgKiBtYXRjaGluZyBjYW4gYmUgZG9uZSBpbiBPKE4rTSkgaW5zdGVhZCBvZiBP KE7Dl00pLgorCQkgKi8KKwkJaWYgKHNzbG90Lm52YWx1ZXMgKyBudW1fZWxlbXMgPj0gTUNW X0hBU0hfVEhSRVNIT0xEKQorCQl7CisJCQlmbWdyX2luZm8ob3BmdW5jb2lkLCAmZXFwcm9j KTsKKwkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMob3BlcmF0b3IsICZoYXNoTGVm dCwgJmhhc2hSaWdodCk7CisJCX0KKwl9CisKKwlpZiAoaGF2ZV9tY3ZzICYmIE9pZElzVmFs aWQoaGFzaExlZnQpICYmIE9pZElzVmFsaWQoaGFzaFJpZ2h0KSkKKwl7CisJCS8qIFVzZSBh IGhhc2ggdGFibGUgdG8gc3BlZWQgdXAgdGhlIG1hdGNoaW5nICovCisJCUxPQ0FMX0ZDSU5G TyhmY2luZm8sIDIpOworCQlMT0NBTF9GQ0lORk8oaGFzaF9mY2luZm8sIDEpOworCQlNQ1ZI YXNoVGFibGVfaGFzaCAqaGFzaFRhYmxlOworCQlGbWdySW5mbwloYXNoX3Byb2M7CisJCU1D Vkhhc2hDb250ZXh0IGhhc2hDb250ZXh0OworCQlkb3VibGUJCXN1bWFsbGNvbW1vbiA9IDAu MCwKKwkJCQkJbm9ubWN2X3NlbGVjID0gMC4wOworCQlib29sCQlpc2RlZmF1bHQ7CisJCWJv b2wJCWhhc2hfbWN2OworCQlkb3VibGUJCW90aGVyZGlzdGluY3Q7CisJCURhdHVtCSAgICph cnJheUhhc2g7CisJCURhdHVtCSAgICphcnJheVByb2JlOworCQlpbnQJCQludmFsdWVzSGFz aDsKKwkJaW50CQkJbnZhbHVlc1Byb2JlOworCQlpbnQJCQlub25tY3ZfY250ID0gbnVtX2Vs ZW1zOworCQlpbnQJCQlub25jb25zdF9jbnQgPSAwOworCisJCS8qIEdyYWIgdGhlIG51bGxm cmFjIGZvciB1c2UgYmVsb3cuICovCisJCXN0YXRzID0gKEZvcm1fcGdfc3RhdGlzdGljKSBH RVRTVFJVQ1QodmFyZGF0YS0+c3RhdHNUdXBsZSk7CisJCW51bGxmcmFjID0gc3RhdHMtPnN0 YW51bGxmcmFjOworCisJCXNlbGVjID0gczFkaXNqb2ludCA9ICh1c2VPciA/IDAuMCA6IDEu MCk7CisKKwkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpmY2luZm8sICZlcXByb2MsIDIs IGNvbGxhdGlvbiwKKwkJCQkJCQkJIE5VTEwsIE5VTEwpOworCQlmY2luZm8tPmFyZ3NbMF0u aXNudWxsID0gZmFsc2U7CisJCWZjaW5mby0+YXJnc1sxXS5pc251bGwgPSBmYWxzZTsKKwor CQlmb3IgKGludCBpID0gMDsgaSA8IHNzbG90Lm52YWx1ZXM7IGkrKykKKwkJCXN1bWFsbGNv bW1vbiArPSBzc2xvdC5udW1iZXJzW2ldOworCisJCS8qCisJCSAqIENvbXB1dGUgdGhlIHRv dGFsIHByb2JhYmlsaXR5IG1hc3Mgb2YgYWxsIG5vbi1NQ1YgdmFsdWVzLiBUaGlzIGlzCisJ CSAqIHRoZSBwYXJ0IG9mIHRoZSBjb2x1bW4gZGlzdHJpYnV0aW9uIG5vdCBjb3ZlcmVkIGJ5 IE1DVnMuCisJCSAqLworCQlub25tY3Zfc2VsZWMgPSAxLjAgLSBzdW1hbGxjb21tb24gLSBu dWxsZnJhYzsKKwkJQ0xBTVBfUFJPQkFCSUxJVFkobm9ubWN2X3NlbGVjKTsKKworCQkvKgor CQkgKiBBcHByb3hpbWF0ZSB0aGUgcGVyLXZhbHVlIHByb2JhYmlsaXR5IG9mIGEgbm9uLU1D ViBjb25zdGFudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVtYWluaW5nIHByb2JhYmlsaXR5 IG1hc3MgYnkgdGhlIG51bWJlciBvZiBvdGhlcgorCQkgKiBkaXN0aW5jdCB2YWx1ZXMuCisJ CSAqLworCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3ZhcmlhYmxlX251bWRpc3RpbmN0KHZhcmRh dGEsICZpc2RlZmF1bHQpIC0gc3Nsb3Qubm51bWJlcnM7CisJCWlmIChvdGhlcmRpc3RpbmN0 ID4gMSkKKwkJCW5vbm1jdl9zZWxlYyAvPSBvdGhlcmRpc3RpbmN0OworCisJCWlmIChzc2xv dC5ubnVtYmVycyA+IDAgJiYKKwkJCW5vbm1jdl9zZWxlYyA+IHNzbG90Lm51bWJlcnNbc3Ns b3Qubm51bWJlcnMgLSAxXSkKKwkJeworCQkJbm9ubWN2X3NlbGVjID0gc3Nsb3QubnVtYmVy c1tzc2xvdC5ubnVtYmVycyAtIDFdOworCQl9CisKKwkJLyogTWFrZSBzdXJlIHdlIGJ1aWxk IHRoZSBoYXNoIHRhYmxlIG9uIHRoZSBzbWFsbGVyIGFycmF5LiAqLworCQlpZiAoc3Nsb3Qu bnZhbHVlcyA8PSBudW1fZWxlbXMpCisJCXsKKwkJCWhhc2hfbWN2ID0gdHJ1ZTsKKwkJCW52 YWx1ZXNIYXNoID0gc3Nsb3QubnZhbHVlczsKKwkJCW52YWx1ZXNQcm9iZSA9IG51bV9lbGVt czsKKwkJCWFycmF5SGFzaCA9IHNzbG90LnZhbHVlczsKKwkJCWFycmF5UHJvYmUgPSBlbGVt X3ZhbHVlczsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhhc2hfbWN2ID0gZmFsc2U7CisJCQlu dmFsdWVzSGFzaCA9IG51bV9lbGVtczsKKwkJCW52YWx1ZXNQcm9iZSA9IHNzbG90Lm52YWx1 ZXM7CisJCQlhcnJheUhhc2ggPSBlbGVtX3ZhbHVlczsKKwkJCWFycmF5UHJvYmUgPSBzc2xv dC52YWx1ZXM7CisJCX0KKworCQlmbWdyX2luZm8oaGFzaF9tY3YgPyBoYXNoTGVmdCA6IGhh c2hSaWdodCwgJmhhc2hfcHJvYyk7CisJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqaGFz aF9mY2luZm8sICZoYXNoX3Byb2MsIDEsIGNvbGxhdGlvbiwKKwkJCQkJCQkJIE5VTEwsIE5V TEwpOworCQloYXNoX2ZjaW5mby0+YXJnc1swXS5pc251bGwgPSBmYWxzZTsKKworCQloYXNo Q29udGV4dC5lcXVhbF9mY2luZm8gPSBmY2luZm87CisJCWhhc2hDb250ZXh0Lmhhc2hfZmNp bmZvID0gaGFzaF9mY2luZm87CisJCWhhc2hDb250ZXh0Lm9wX2lzX3JldmVyc2VkID0gaGFz aF9tY3Y7CisJCWhhc2hDb250ZXh0Lmluc2VydF9tb2RlID0gdHJ1ZTsKKworCQlnZXRfdHlw bGVuYnl2YWwoaGFzaF9tY3YgPyBzc2xvdC52YWx1ZXR5cGUgOiBub21pbmFsX2VsZW1lbnRf dHlwZSwKKwkJCQkJCSZoYXNoQ29udGV4dC5oYXNoX3R5cGxlbiwKKwkJCQkJCSZoYXNoQ29u dGV4dC5oYXNoX3R5cGJ5dmFsKTsKKworCQloYXNoVGFibGUgPSBNQ1ZIYXNoVGFibGVfY3Jl YXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LAorCQkJCQkJCQkJCW52YWx1ZXNIYXNoLAorCQkJ CQkJCQkJCSZoYXNoQ29udGV4dCk7CisKKwkJLyogQnVpbGQgYSBoYXNoIHRhYmxlIG92ZXIg dGhlIHNtYWxsZXIgaW5wdXQgc2lkZS4gKi8KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudmFs dWVzSGFzaDsgaSsrKQorCQl7CisJCQlib29sCQlmb3VuZCA9IGZhbHNlOworCQkJTUNWSGFz aEVudHJ5ICplbnRyeTsKKworCQkJLyoKKwkJCSAqIFdoZW4gaGFzaGluZyBJTi1saXN0IHZh bHVlcyAoaGFzaF9tY3YgPT0gZmFsc2UpLCB3ZSBvbmx5IGluc2VydAorCQkJICogY29uc3Rh bnQsIG5vbi1OVUxMIGVsZW1lbnRzLiAgTlVMTCBhbmQgbm9uLUNvbnN0IGVsZW1lbnRzIGFy ZQorCQkJICogY291bnRlZCBzZXBhcmF0ZWx5LCBiZWNhdXNlIHRoZXkgY2Fubm90IHBhcnRp Y2lwYXRlIGluIE1DVgorCQkJICogbWF0Y2hpbmcgYW5kIG11c3QgYmUgaGFuZGxlZCBsYXRl ciB1c2luZyBnZW5lcmljIHNlbGVjdGl2aXR5CisJCQkgKiBlc3RpbWF0aW9uLgorCQkJICov CisJCQlpZiAoIWhhc2hfbWN2KQorCQkJeworCQkJCWlmIChlbGVtX251bGxzW2ldKQorCQkJ CXsKKwkJCQkJbm9ubWN2X2NudC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlp ZiAoZWxlbV9jb25zdCAhPSBOVUxMICYmICFlbGVtX2NvbnN0W2ldKQorCQkJCXsKKwkJCQkJ bm9ubWN2X2NudC0tOworCQkJCQlub25jb25zdF9jbnQrKzsKKwkJCQkJY29udGludWU7CisJ CQkJfQorCQkJfQorCisJCQllbnRyeSA9IE1DVkhhc2hUYWJsZV9pbnNlcnQoaGFzaFRhYmxl LCBhcnJheUhhc2hbaV0sICZmb3VuZCk7CisKKwkJCS8qCisJCQkgKiBlbnRyeS0+Y291bnQg dHJhY2tzIGhvdyBtYW55IHRpbWVzIHRoZSBzYW1lIHZhbHVlIGFwcGVhcnMsIHNvCisJCQkg KiB0aGF0IGR1cGxpY2F0ZSBJTi1saXN0IGVsZW1lbnRzIGNhbiBiZSBmb2xkZWQgaW50byB0 aGUKKwkJCSAqIHByb2JhYmlsaXR5IGNhbGN1bGF0aW9uLgorCQkJICovCisJCQlpZiAobGlr ZWx5KCFmb3VuZCkpCisJCQl7CisJCQkJZW50cnktPmluZGV4ID0gaTsKKwkJCQllbnRyeS0+ Y291bnQgPSAxOworCQkJfQorCQkJZWxzZQorCQkJCWVudHJ5LT5jb3VudCsrOworCQl9CisK KwkJaGFzaENvbnRleHQuaW5zZXJ0X21vZGUgPSBmYWxzZTsKKwkJaWYgKGhhc2hMZWZ0ICE9 IGhhc2hSaWdodCkKKwkJeworCQkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFzaFJpZ2h0IDog aGFzaExlZnQsICZoYXNoX3Byb2MpOworCQkJLyogUmVzZXR0aW5nIGhhc2hfZmNpbmZvIGlz IHByb2JhYmx5IHVubmVjZXNzYXJ5LCBidXQgYmUgc2FmZSAqLworCQkJSW5pdEZ1bmN0aW9u Q2FsbEluZm9EYXRhKCpoYXNoX2ZjaW5mbywgJmhhc2hfcHJvYywgMSwgY29sbGF0aW9uLAor CQkJCQkJCQkJIE5VTEwsIE5VTEwpOworCQkJaGFzaF9mY2luZm8tPmFyZ3NbMF0uaXNudWxs ID0gZmFsc2U7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXNQcm9iZTsg aSsrKQorCQl7CisJCQlNQ1ZIYXNoRW50cnkgKmVudHJ5OworCQkJU2VsZWN0aXZpdHkgczE7 CisJCQlpbnQJCQludmFsdWVzbWN2OworCisJCQkvKgorCQkJICogV2hlbiBwcm9iaW5nIHdp dGggSU4tbGlzdCBlbGVtZW50cywgaWdub3JlIE5VTExzIGFuZCBub24tQ29uc3QKKwkJCSAq IGV4cHJlc3Npb25zOiB0aGV5IGNhbm5vdCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcyBhbmQg d2lsbCBiZQorCQkJICogYWNjb3VudGVkIGZvciBsYXRlciBieSBnZW5lcmljIGVzdGltYXRp b24uCisJCQkgKi8KKwkJCWlmIChoYXNoX21jdikKKwkJCXsKKwkJCQlpZiAoZWxlbV9udWxs c1tpXSkKKwkJCQl7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJY29udGludWU7CisJCQkJ fQorCisJCQkJaWYgKGVsZW1fY29uc3QgIT0gTlVMTCAmJiAhZWxlbV9jb25zdFtpXSkKKwkJ CQl7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJbm9uY29uc3RfY250Kys7CisJCQkJCWNv bnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJZW50cnkgPSBNQ1ZIYXNoVGFibGVfbG9va3Vw KGhhc2hUYWJsZSwgYXJyYXlQcm9iZVtpXSk7CisKKwkJCS8qCisJCQkgKiBJZiBmb3VuZCwg b2J0YWluIGl0cyBNQ1YgZnJlcXVlbmN5IGFuZCByZW1lbWJlciBob3cgbWFueSB2YWx1ZXMK KwkJCSAqIG9uIHRoZSBoYXNoZWQgc2lkZSBtYXAgdG8gdGhpcyBlbnRyeS4KKwkJCSAqLwor CQkJaWYgKGVudHJ5ICE9IE5VTEwpCisJCQl7CisJCQkJczEgPSBoYXNoX21jdiA/IHNzbG90 Lm51bWJlcnNbZW50cnktPmluZGV4XQorCQkJCQk6IHNzbG90Lm51bWJlcnNbaV07CisKKwkJ CQludmFsdWVzbWN2ID0gZW50cnktPmNvdW50OworCisJCQkJYWNjdW1fc2NhbGFyYXJyYXlf cHJvYihzMSwgbnZhbHVlc21jdiwgdXNlT3IsIGlzRXF1YWxpdHksCisJCQkJCQkJCQkgICBp c0luZXF1YWxpdHksIG51bGxmcmFjLCAmc2VsZWMsCisJCQkJCQkJCQkgICAmczFkaXNqb2lu dCk7CisKKwkJCQkvKiBNYXRjaGVkIHZhbHVlcyBhcmUgbm8gbG9uZ2VyIGNvbnNpZGVyZWQg bm9uLU1DViAqLworCQkJCW5vbm1jdl9jbnQgLT0gbnZhbHVlc21jdjsKKwkJCX0KKwkJfQor CisJCS8qCisJCSAqIEFjY291bnQgZm9yIGNvbnN0YW50IElOLWxpc3QgdmFsdWVzIHRoYXQg ZGlkIG5vdCBtYXRjaCBhbnkgTUNWLgorCQkgKgorCQkgKiBFYWNoIHN1Y2ggdmFsdWUgaXMg YXNzdW1lZCB0byBoYXZlIHByb2JhYmlsaXR5ID0gbm9ubWN2X3NlbGVjLAorCQkgKiBkZXJp dmVkIGZyb20gdGhlIHJlbWFpbmluZyAobm9uLU1DVikgcHJvYmFiaWxpdHkgbWFzcy4KKwkJ ICovCisJCWFjY3VtX3NjYWxhcmFycmF5X3Byb2Iobm9ubWN2X3NlbGVjLCBub25tY3ZfY250 LCB1c2VPciwgaXNFcXVhbGl0eSwKKwkJCQkJCQkgICBpc0luZXF1YWxpdHksIG51bGxmcmFj LCAmc2VsZWMsICZzMWRpc2pvaW50KTsKKworCQkvKgorCQkgKiBBY2NvdW50IGZvciBub24t Q29uc3QgSU4tbGlzdCBlbGVtZW50cy4KKwkJICoKKwkJICogVGhlc2UgdmFsdWVzIGNhbm5v dCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcywgc28gd2UgcmVseSBvbiB0aGUKKwkJICogb3Bl cmF0b3IncyBnZW5lcmljIHNlbGVjdGl2aXR5IGVzdGltYXRvciBmb3IgZWFjaCBvZiB0aGVt LgorCQkgKi8KKwkJYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihub25jb25zdF9zZWwsIG5vbmNv bnN0X2NudCwgdXNlT3IsIGlzRXF1YWxpdHksCisJCQkJCQkJICAgaXNJbmVxdWFsaXR5LCBu dWxsZnJhYywgJnNlbGVjLCAmczFkaXNqb2ludCk7CisKKwkJLyoKKwkJICogRm9yID0gQU5Z IG9yIDw+IEFMTCwgaWYgdGhlIElOLWxpc3QgZWxlbWVudHMgYXJlIGFzc3VtZWQgZGlzdGlu Y3QsCisJCSAqIHRoZSBldmVudHMgYXJlIGRpc2pvaW50IGFuZCB0aGUgdG90YWwgcHJvYmFi aWxpdHkgaXMgdGhlIHN1bSBvZgorCQkgKiBpbmRpdmlkdWFsIHByb2JhYmlsaXRpZXMuICBV c2UgdGhhdCBlc3RpbWF0ZSBpZiBpdCBsaWVzIGluIFswLDFdLgorCQkgKi8KKwkJaWYgKCh1 c2VPciA/IGlzRXF1YWxpdHkgOiBpc0luZXF1YWxpdHkpICYmCisJCQlzMWRpc2pvaW50ID49 IDAuMCAmJiBzMWRpc2pvaW50IDw9IDEuMCkKKwkJCXNlbGVjID0gczFkaXNqb2ludDsKKwor CQlDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CisKKwkJTUNWSGFzaFRhYmxlX2Rlc3Ryb3ko aGFzaFRhYmxlKTsKKwl9CisKKwlpZiAoaGF2ZV9tY3ZzKQorCQlmcmVlX2F0dHN0YXRzc2xv dCgmc3Nsb3QpOworCisJcmV0dXJuIHNlbGVjOworfQorCiAvKgogICogRXN0aW1hdGUgbnVt YmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSB5aWVsZGVkIGJ5IGFuIGV4cHJlc3Npb24u CiAgKgpAQCAtMjQ0Niw3ICsyOTU0LDcgQEAgZXFqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1Mp CiAJCSAqIElmIHRoZSBNQ1YgbGlzdHMgYXJlIGxvbmcgZW5vdWdoIHRvIGp1c3RpZnkgaGFz aGluZywgdHJ5IHRvIGxvb2sgdXAKIAkJICogaGFzaCBmdW5jdGlvbnMgZm9yIHRoZSBqb2lu IG9wZXJhdG9yLgogCQkgKi8KLQkJaWYgKChzc2xvdDEubnZhbHVlcyArIHNzbG90Mi5udmFs dWVzKSA+PSBFUUpPSU5TRUxfTUNWX0hBU0hfVEhSRVNIT0xEKQorCQlpZiAoKHNzbG90MS5u dmFsdWVzICsgc3Nsb3QyLm52YWx1ZXMpID49IE1DVl9IQVNIX1RIUkVTSE9MRCkKIAkJCSh2 b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMob3BlcmF0b3IsICZoYXNoTGVmdCwgJmhhc2hS aWdodCk7CiAJfQogCWVsc2UKLS0gCjIuMzQuMQoK --------------G10OE900fBaI2oia0thkS9aQ--