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 1wAW5P-00033X-22 for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 16:49:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wAW5M-000jf8-15 for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 16:49:01 +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 1wAW5L-000jet-25 for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 16:49:00 +0000 Received: from forward502b.mail.yandex.net ([178.154.239.146]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wAW5G-000000001Ui-2rHL for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 16:48:59 +0000 Received: from mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net [IPv6:2a02:6b8:c11:e97:0:640:f294:0]) by forward502b.mail.yandex.net (Yandex) with ESMTPS id AC6BF829C2; Wed, 08 Apr 2026 19:48:50 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id omITgI1RquQ0-haFsk778; Wed, 08 Apr 2026 19:48:50 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1775666930; bh=XIxM4pmgH20NGm24b8UoiFX8vI4yX70zT9XxIqrH1OQ=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=hSu1C1StrAb6BnhhN2hklSrpCU/BgRBkEpogibYzNEIrqZ+/AOtrXt8m1unWQILH9 d5iLuDURNSdfp10acQlnTraxB/ceUZE+jE9KcsDSEPYVT0jeuMtsKHg4FOxMyhIRcD VFcgN5/7WaoyiLSSYQR0F1cWkA/PPS0pglIGA6k4= Authentication-Results: mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------4R0NPPfcA7rPGVFJzVf4H5hA" Message-ID: <0988b8e7-9242-4a13-9c1d-5b3ef9dd6b5d@tantorlabs.com> Date: Wed, 8 Apr 2026 19:48:49 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Hash-based MCV matching for large IN-lists From: Ilia Evdokimov To: Zsolt Parragi , David Geier , Chengpeng Yan , Tatsuya Kawata Cc: "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> <8375f8b5-1f21-401e-bbc3-a749302b76c7@tantorlabs.com> <98f8b6e5-22ec-46ca-9d58-197c4259b65d@tantorlabs.com> Content-Language: en-US In-Reply-To: <98f8b6e5-22ec-46ca-9d58-197c4259b65d@tantorlabs.com> 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. --------------4R0NPPfcA7rPGVFJzVf4H5hA Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit I rebased the previous patch after it was marked as "Need rebase" I also initialized the 'elem_cost' array to all 'true' values to simplify the code and avoid confusion, and rewrote accum_scalararray_prob() to improve readability. -- Best regards, Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------4R0NPPfcA7rPGVFJzVf4H5hA Content-Type: text/x-patch; charset=UTF-8; name="v10-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExp.patch" Content-Disposition: attachment; filename*0="v10-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExp.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA5YjkzMWVmZGNiZTQwNWVhYjFkNThmMmEyMTVjYjI5NmFiMTQ1YTU5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogV2VkLCA4IEFwciAyMDI2IDE5OjQ1OjAwICswMzAwClN1 YmplY3Q6IFtQQVRDSCB2MTBdIFVzZSBoYXNoLWJhc2VkIE1DViBtYXRjaGluZyBmb3IgU2Nh bGFyQXJyYXlPcEV4cHIKIHNlbGVjdGl2aXR5CgpXaGVuIGVzdGltYXRpbmcgc2VsZWN0aXZp dHkgZm9yIFNjYWxhckFycmF5T3BFeHByIChJTiAvIEFOWSAvIEFMTCkgd2l0aAphdmFpbGFi bGUgTUNWIHN0YXRpc3RpY3MsIHRoZSBwbGFubmVyIGN1cnJlbnRseSBtYXRjaGVzIElOLWxp c3QgZWxlbWVudHMKYWdhaW5zdCB0aGUgTUNWIGFycmF5IHVzaW5nIG5lc3RlZCBsb29wcy4g Rm9yIGxhcmdlIElOLWxpc3RzIGFuZC9vciBsYXJnZQpNQ1YgbGlzdHMgdGhpcyBsZWFkcyB0 byBPKE4qTSkgcGxhbm5pbmctdGltZSBiZWhhdmlvci4KClRoaXMgcGF0Y2ggYWRkcyBhIGhh c2gtYmFzZWQgbWF0Y2hpbmcgc3RyYXRlZ3ksIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkCmlu IGpvaW4gc2VsZWN0aXZpdHkgZXN0aW1hdGlvbi4gV2hlbiBNQ1Ygc3RhdGlzdGljcyBhcmUg YXZhaWxhYmxlIGFuZCB0aGUKb3BlcmF0b3Igc3VwcG9ydHMgaGFzaGluZywgdGhlIHNtYWxs ZXIgb2YgdGhlIHR3byBpbnB1dHMgKE1DViBsaXN0IG9yCklOLWxpc3QgY29uc3RhbnQgZWxl bWVudHMpIGlzIGNob3NlbiBhcyB0aGUgaGFzaCB0YWJsZSBidWlsZCBzaWRlLCBhbmQKdGhl IG90aGVyIHNpZGUgaXMgc2Nhbm5lZCBvbmNlLCByZWR1Y2luZyBjb21wbGV4aXR5IHRvIE8o TitNKS4KClRoZSBoYXNoLWJhc2VkIHBhdGggaXMgcmVzdHJpY3RlZCB0byBlcXVhbGl0eSBh bmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMKdGhhdCB1c2UgZXFzZWwoKS9uZXFzZWwoKSwgYW5k IGlzIGFwcGxpZWQgb25seSB3aGVuIHN1aXRhYmxlIGhhc2gKZnVuY3Rpb25zIGFuZCBNQ1Yg c3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlLgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jIHwgNTQ3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmls ZSBjaGFuZ2VkLCA1NDIgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IDQxNjBkMmQ2ZTI0Li5hZjEyMDcxZWQwZSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTE0NiwyMyArMTQ2LDI3IEBACiAvKgog ICogSW4gcHJvZHVjdGlvbiBidWlsZHMsIHN3aXRjaCB0byBoYXNoLWJhc2VkIE1DViBtYXRj aGluZyB3aGVuIHRoZSBsaXN0cyBhcmUKICAqIGxhcmdlIGVub3VnaCB0byBhbW9ydGl6ZSBo YXNoIHNldHVwIGNvc3QuICAoVGhpcyB0aHJlc2hvbGQgaXMgY29tcGFyZWQgdG8KLSAqIHRo ZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIHR3byBNQ1YgbGlzdHMuICBUaGlzIGlzIHNp bXBsaXN0aWMgYnV0IHNlZW1zCisgKiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSB0 d28gbGlzdHMuICBUaGlzIGlzIHNpbXBsaXN0aWMgYnV0IHNlZW1zCiAgKiB0byB3b3JrIHdl bGwgZW5vdWdoLikgIEluIGRlYnVnIGJ1aWxkcywgd2UgdXNlIGEgc21hbGxlciB0aHJlc2hv bGQgc28gdGhhdAogICogdGhlIHJlZ3Jlc3Npb24gdGVzdHMgY292ZXIgYm90aCBwYXRocyB3 ZWxsLgogICovCiAjaWZuZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKLSNkZWZpbmUgRVFKT0lO U0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMDAKKyNkZWZpbmUgTUNWX0hBU0hfVEhSRVNIT0xE IDIwMAogI2Vsc2UKLSNkZWZpbmUgRVFKT0lOU0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMAor I2RlZmluZSBNQ1ZfSEFTSF9USFJFU0hPTEQgMjAKICNlbmRpZgogCi0vKiBFbnRyaWVzIGlu IHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgdXNlZCBieSBlcWpvaW5zZWxfZmluZF9tYXRj aGVzICovCisvKgorICogRW50cmllcyBpbiB0aGUgc2ltcGxlaGFzaCBoYXNoIHRhYmxlIHVz ZWQgYnkKKyAqIGVxam9pbnNlbF9maW5kX21hdGNoZXMgYW5kIHNjYWxhcmFycmF5X21jdl9o YXNoX21hdGNoCisgKi8KIHR5cGVkZWYgc3RydWN0IE1DVkhhc2hFbnRyeQogewogCURhdHVt CQl2YWx1ZTsJCQkvKiB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSAqLwog CWludAkJCWluZGV4OwkJCS8qIGl0cyBpbmRleCBpbiB0aGUgcmVsZXZhbnQgQXR0U3RhdHNT bG90ICovCiAJdWludDMyCQloYXNoOwkJCS8qIGhhc2ggY29kZSBmb3IgdGhlIERhdHVtICov CiAJY2hhcgkJc3RhdHVzOwkJCS8qIHN0YXR1cyBjb2RlIHVzZWQgYnkgc2ltcGxlaGFzaC5o ICovCisJaW50CQkJY291bnQ7CQkJLyogbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGN1cnJl bnQgdmFsdWUgKi8KIH0gTUNWSGFzaEVudHJ5OwogCiAvKiBwcml2YXRlX2RhdGEgZm9yIHRo ZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgKi8KQEAgLTE4NCw2ICsxODgsMTYgQEAgZ2V0X3Jl bGF0aW9uX3N0YXRzX2hvb2tfdHlwZSBnZXRfcmVsYXRpb25fc3RhdHNfaG9vayA9IE5VTEw7 CiBnZXRfaW5kZXhfc3RhdHNfaG9va190eXBlIGdldF9pbmRleF9zdGF0c19ob29rID0gTlVM TDsKIAogc3RhdGljIGRvdWJsZSBlcXNlbF9pbnRlcm5hbChQR19GVU5DVElPTl9BUkdTLCBi b29sIG5lZ2F0ZSk7CitzdGF0aWMgZG91YmxlIHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNo KFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcGVyYXRvciwKKwkJCQkJCQkJCQkg T2lkIGNvbGxhdGlvbiwgU2VsZWN0aXZpdHkgbm9uY29uc3Rfc2VsLAorCQkJCQkJCQkJCSBE YXR1bSAqZWxlbV92YWx1ZXMsIGJvb2wgKmVsZW1fbnVsbHMsCisJCQkJCQkJCQkJIGludCBu dW1fZWxlbXMsIGJvb2wgKmVsZW1fY29uc3QsCisJCQkJCQkJCQkJIE9pZCBub21pbmFsX2Vs ZW1lbnRfdHlwZSwgYm9vbCB1c2VPciwKKwkJCQkJCQkJCQkgYm9vbCBpc0VxdWFsaXR5LCBi b29sIGlzSW5lcXVhbGl0eSk7CitzdGF0aWMgdm9pZCBhY2N1bV9zY2FsYXJhcnJheV9wcm9i KFNlbGVjdGl2aXR5IGVsZW1fc2VsLCBpbnQgY291bnQsIGJvb2wgdXNlT3IsCisJCQkJCQkJ CSAgIGJvb2wgaXNFcXVhbGl0eSwgYm9vbCBpc0luZXF1YWxpdHksCisJCQkJCQkJCSAgIGRv dWJsZSBudWxsZnJhYywgYm9vbCBpbnZlcnQsCisJCQkJCQkJCSAgIFNlbGVjdGl2aXR5ICpw X3NlbGVjLCBTZWxlY3Rpdml0eSAqcF9zZWxlY19kaXNqb2ludCk7CiBzdGF0aWMgZG91Ymxl IGVxam9pbnNlbF9pbm5lcihGbWdySW5mbyAqZXFwcm9jLCBPaWQgY29sbGF0aW9uLAogCQkJ CQkJCSAgT2lkIGhhc2hMZWZ0LCBPaWQgaGFzaFJpZ2h0LAogCQkJCQkJCSAgVmFyaWFibGVT dGF0RGF0YSAqdmFyZGF0YTEsIFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEyLApAQCAtMTg5 Myw2ICsxOTA3LDY3IEBAIHN0cmlwX2FycmF5X2NvZXJjaW9uKE5vZGUgKm5vZGUpCiAJcmV0 dXJuIG5vZGU7CiB9CiAKKy8qCisgKiBhY2N1bV9zY2FsYXJhcnJheV9wcm9iIC0gY29tYmlu ZSBzZWxlY3Rpdml0eSBmb3IgcmVwZWF0ZWQgZWxlbWVudHMKKyAqCisgKiBVcGRhdGUgdGhl IHJ1bm5pbmcgc2VsZWN0aXZpdHkgZm9yIGEgU2NhbGFyQXJyYXlPcEV4cHIgYnkgYWRkaW5n IHRoZQorICogY29udHJpYnV0aW9uIG9mICdjb3VudCcgaWRlbnRpY2FsIGVsZW1lbnRzIHdp dGggcGVyLWVsZW1lbnQgc2VsZWN0aXZpdHkuCisgKgorICogVGhpcyBpcyBlcXVpdmFsZW50 IHRvIGFwcGx5aW5nIHRoZSBwZXItZWxlbWVudCB1cGRhdGUgJ2NvdW50JyB0aW1lczoKKyAq CisgKiAgIE9SIChBTlkpOiAgUCA9IFAgKyBzIC0gUCpzCisgKiAgIEFORCAoQUxMKTogUCA9 IFAgKiBzCisgKgorICogYnV0IHVzZXMgY2xvc2VkLWZvcm0gZm9ybXVsYXM6CisgKgorICog ICBPUjogIFAgPSAxIC0gKDEgLSBQKSAqICgxIC0gcyleY291bnQKKyAqICAgQU5EOiBQID0g UCAqIHNeY291bnQKKyAqCisgKiBUaGUgc2VsZWNfZGlzam9pbnQgYWNjdW11bGF0b3IgdHJh Y2tzIHRoZSBhbHRlcm5hdGl2ZSAiZGlzam9pbnQgZXZlbnRzIgorICogZXN0aW1hdGUgdXNl ZCBmb3IgIj0gQU5ZIiAvICI8PiBBTEwiLgorICovCitzdGF0aWMgdm9pZAorYWNjdW1fc2Nh bGFyYXJyYXlfcHJvYihTZWxlY3Rpdml0eSBlbGVtX3NlbCwgaW50IGNvdW50LCBib29sIHVz ZU9yLAorCQkJCQkgICBib29sIGlzRXF1YWxpdHksIGJvb2wgaXNJbmVxdWFsaXR5LAorCQkJ CQkgICBkb3VibGUgbnVsbGZyYWMsIGJvb2wgaW52ZXJ0LAorCQkJCQkgICBTZWxlY3Rpdml0 eSAqcF9zZWxlYywgU2VsZWN0aXZpdHkgKnBfc2VsZWNfZGlzam9pbnQpCit7CisJU2VsZWN0 aXZpdHkgc2VsZWM7CisJU2VsZWN0aXZpdHkgZGlzam9pbnQ7CisKKwlpZiAoY291bnQgPD0g MCkKKwkJcmV0dXJuOworCisJLyogQ29udmVydCB0byBpbmVxdWFsaXR5IHByb2JhYmlsaXR5 IGlmIG5lZWRlZCAqLworCWlmIChpbnZlcnQgJiYgaXNJbmVxdWFsaXR5KQorCQllbGVtX3Nl bCA9IDEuMCAtIGVsZW1fc2VsIC0gbnVsbGZyYWM7CisKKwlDTEFNUF9QUk9CQUJJTElUWShl bGVtX3NlbCk7CisKKwlzZWxlYyA9ICpwX3NlbGVjOworCWRpc2pvaW50ID0gKnBfc2VsZWNf ZGlzam9pbnQ7CisKKwlpZiAodXNlT3IpCisJeworCQkvKiBBTlkgc2VtYW50aWNzOiBwcm9i YWJpbGl0eSB0aGF0IGF0IGxlYXN0IG9uZSBlbGVtZW50IG1hdGNoZXMgKi8KKwkJc2VsZWMg PSAxLjAgLSAoMS4wIC0gc2VsZWMpICogcG93KDEuMCAtIGVsZW1fc2VsLCBjb3VudCk7CisK KwkJaWYgKGlzRXF1YWxpdHkpCisJCQlkaXNqb2ludCArPSBlbGVtX3NlbCAqIGNvdW50Owor CX0KKwllbHNlCisJeworCQkvKiBBTEwgc2VtYW50aWNzOiBwcm9iYWJpbGl0eSB0aGF0IGFs bCBlbGVtZW50cyBtYXRjaCAqLworCQlzZWxlYyAqPSBwb3coZWxlbV9zZWwsIGNvdW50KTsK KworCQlpZiAoaXNJbmVxdWFsaXR5KQorCQkJZGlzam9pbnQgKz0gY291bnQgKiAoZWxlbV9z ZWwgLSAxLjApOworCX0KKworCSpwX3NlbGVjID0gc2VsZWM7CisJKnBfc2VsZWNfZGlzam9p bnQgPSBkaXNqb2ludDsKK30KKwogLyoKICAqCQlzY2FsYXJhcnJheXNlbAkJLSBTZWxlY3Rp dml0eSBvZiBTY2FsYXJBcnJheU9wRXhwciBOb2RlLgogICovCkBAIC0yMDM0LDYgKzIxMDks NDUgQEAgc2NhbGFyYXJyYXlzZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkgIGVsbWxl biwgZWxtYnl2YWwsIGVsbWFsaWduLAogCQkJCQkJICAmZWxlbV92YWx1ZXMsICZlbGVtX251 bGxzLCAmbnVtX2VsZW1zKTsKIAorCQkvKiBUcnkgdG8gYXZvaWQgTyhOXjIpIHNlbGVjdGl2 aXR5IGNhbGN1bGF0aW9uICovCisJCWlmICgoaXNFcXVhbGl0eSB8fCBpc0luZXF1YWxpdHkp ICYmICFpc19qb2luX2NsYXVzZSkKKwkJeworCQkJVmFyaWFibGVTdGF0RGF0YSB2YXJkYXRh OworCQkJTm9kZQkgICAqb3RoZXJfb3AgPSBOVUxMOworCQkJYm9vbAkJdmFyX29uX2xlZnQ7 CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgY2xhdXNlIGlzIG9mIHRoZSBmb3JtICJ2YXIgT1Ag c29tZXRoaW5nIiBvciAic29tZXRoaW5nCisJCQkgKiBPUCB2YXIiLCBleHRyYWN0IHN0YXRp c3RpY3MgZm9yIHRoZSB2YXJpYWJsZS4gT3RoZXJ3aXNlLCBmYWxsCisJCQkgKiBiYWNrIHRv IGEgZGVmYXVsdCBwZXItZWxlbWVudCBlc3RpbWF0ZS4KKwkJCSAqLworCQkJaWYgKGdldF9y ZXN0cmljdGlvbl92YXJpYWJsZShyb290LCBjbGF1c2UtPmFyZ3MsIHZhclJlbGlkLAorCQkJ CQkJCQkJCSAmdmFyZGF0YSwgJm90aGVyX29wLCAmdmFyX29uX2xlZnQpKQorCQkJeworCQkJ CWJvb2wJICAgKmVsZW1fY29uc3QgPSBwYWxsb2NfYXJyYXkoYm9vbCwgbnVtX2VsZW1zKTsK KworCQkJCS8qCisJCQkJICogQWxsIGVsZW1lbnRzIGFyZSBjb25zdGFudHMgaGVyZSwgc2lu Y2Ugd2UgZGVjb25zdHJ1Y3RlZCBhCisJCQkJICogQ29uc3QgYXJyYXkuCisJCQkJICovCisJ CQkJbWVtc2V0KGVsZW1fY29uc3QsIHRydWUsIHNpemVvZihib29sKSAqIG51bV9lbGVtcyk7 CisKKwkJCQlzMSA9IHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNoKCZ2YXJkYXRhLCBvcGVy YXRvciwKKwkJCQkJCQkJCQkJCWNsYXVzZS0+aW5wdXRjb2xsaWQsIC0xLjAsCisJCQkJCQkJ CQkJCQllbGVtX3ZhbHVlcywgZWxlbV9udWxscywKKwkJCQkJCQkJCQkJCW51bV9lbGVtcywg ZWxlbV9jb25zdCwKKwkJCQkJCQkJCQkJCW5vbWluYWxfZWxlbWVudF90eXBlLCB1c2VPciwK KwkJCQkJCQkJCQkJCWlzRXF1YWxpdHksIGlzSW5lcXVhbGl0eSk7CisKKwkJCQlwZnJlZShl bGVtX2NvbnN0KTsKKworCQkJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCisJ CQkJaWYgKHMxID49IDAuMCkKKwkJCQkJcmV0dXJuIHMxOworCQkJfQorCQl9CisKIAkJLyoK IAkJICogRm9yIGdlbmVyaWMgb3BlcmF0b3JzLCB3ZSBhc3N1bWUgdGhlIHByb2JhYmlsaXR5 IG9mIHN1Y2Nlc3MgaXMKIAkJICogaW5kZXBlbmRlbnQgZm9yIGVhY2ggYXJyYXkgZWxlbWVu dC4gIEJ1dCBmb3IgIj0gQU5ZIiBvciAiPD4gQUxMIiwKQEAgLTIxMDksNiArMjIyMyw5NSBA QCBzY2FsYXJhcnJheXNlbChQbGFubmVySW5mbyAqcm9vdCwKIAkJZ2V0X3R5cGxlbmJ5dmFs KGFycmF5ZXhwci0+ZWxlbWVudF90eXBlaWQsCiAJCQkJCQkmZWxtbGVuLCAmZWxtYnl2YWwp OwogCisJCS8qIFRyeSB0byBhdm9pZCBPKE5eMikgc2VsZWN0aXZpdHkgY2FsY3VsYXRpb24g Ki8KKwkJaWYgKChpc0VxdWFsaXR5IHx8IGlzSW5lcXVhbGl0eSkgJiYgIWlzX2pvaW5fY2xh dXNlKQorCQl7CisJCQlWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CisJCQlOb2RlCSAgICpv dGhlcl9vcCA9IE5VTEw7CisJCQlib29sCQl2YXJfb25fbGVmdDsKKwkJCWludAkJCW51bV9l bGVtcyA9IGxpc3RfbGVuZ3RoKGFycmF5ZXhwci0+ZWxlbWVudHMpOworCisJCQkvKgorCQkJ ICogSWYgZXhwcmVzc2lvbiBpcyBub3QgdmFyaWFibGUgPSBzb21ldGhpbmcgb3Igc29tZXRo aW5nID0KKwkJCSAqIHZhcmlhYmxlLCB0aGVuIGZhbGwgYmFjayB0byBkZWZhdWx0IGNvZGUg cGF0aCB0byBjb21wdXRlCisJCQkgKiBkZWZhdWx0IHNlbGVjdGl2aXR5LgorCQkJICovCisJ CQlpZiAoZ2V0X3Jlc3RyaWN0aW9uX3ZhcmlhYmxlKHJvb3QsIGNsYXVzZS0+YXJncywgdmFy UmVsaWQsCisJCQkJCQkJCQkJICZ2YXJkYXRhLCAmb3RoZXJfb3AsICZ2YXJfb25fbGVmdCkp CisJCQl7CisJCQkJU2VsZWN0aXZpdHkgbm9uY29uc3Rfc2VsOworCQkJCURhdHVtCSAgICpl bGVtX3ZhbHVlczsKKwkJCQlib29sCSAgICplbGVtX251bGxzOworCQkJCWJvb2wJICAgKmVs ZW1fY29uc3Q7CisJCQkJTGlzdENlbGwgICAqbGM7CisKKwkJCQkvKiBCdWlsZCBhcnJheXMg ZGVzY3JpYmluZyBBUlJBWVtdIGVsZW1lbnRzICovCisJCQkJZWxlbV92YWx1ZXMgPSBwYWxs b2NfYXJyYXkoRGF0dW0sIG51bV9lbGVtcyk7CisJCQkJZWxlbV9udWxscyA9IHBhbGxvYzBf YXJyYXkoYm9vbCwgbnVtX2VsZW1zKTsKKwkJCQllbGVtX2NvbnN0ID0gcGFsbG9jMF9hcnJh eShib29sLCBudW1fZWxlbXMpOworCisJCQkJZm9yZWFjaChsYywgYXJyYXlleHByLT5lbGVt ZW50cykKKwkJCQl7CisJCQkJCU5vZGUJICAgKmVsZW1fdmFsdWUgPSAoTm9kZSAqKSBsZmly c3QobGMpOworCQkJCQlpbnQJCQlpID0gZm9yZWFjaF9jdXJyZW50X2luZGV4KGxjKTsKKwor CQkJCQlpZiAoSXNBKGVsZW1fdmFsdWUsIENvbnN0KSkKKwkJCQkJeworCQkJCQkJZWxlbV92 YWx1ZXNbaV0gPSAoKENvbnN0ICopIGVsZW1fdmFsdWUpLT5jb25zdHZhbHVlOworCQkJCQkJ ZWxlbV9udWxsc1tpXSA9ICgoQ29uc3QgKikgZWxlbV92YWx1ZSktPmNvbnN0aXNudWxsOwor CQkJCQkJZWxlbV9jb25zdFtpXSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7 CisJCQkJCQllbGVtX251bGxzW2ldID0gZmFsc2U7CisJCQkJCQllbGVtX2NvbnN0W2ldID0g ZmFsc2U7CisJCQkJCX0KKworCQkJCQkvKgorCQkJCQkgKiBXaGVuIHRoZSBhcnJheSBjb250 YWlucyBhIE5VTEwgY29uc3RhbnQsIHNhbWUgYXMKKwkJCQkJICogdmFyX2VxX2NvbnN0LCB3 ZSBhc3N1bWUgdGhlIG9wZXJhdG9yIGlzIHN0cmljdCBhbmQKKwkJCQkJICogbm90aGluZyB3 aWxsIG1hdGNoLCB0aHVzIHJldHVybiAwLjAuCisJCQkJCSAqLworCQkJCQlpZiAoIXVzZU9y ICYmIGVsZW1fbnVsbHNbaV0pCisJCQkJCXsKKwkJCQkJCXBmcmVlKGVsZW1fdmFsdWVzKTsK KwkJCQkJCXBmcmVlKGVsZW1fbnVsbHMpOworCQkJCQkJcGZyZWUoZWxlbV9jb25zdCk7CisK KwkJCQkJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCisJCQkJCQlyZXR1cm4g KFNlbGVjdGl2aXR5KSAwLjA7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIE5v bi1Db25zdCBlbGVtZW50cyBjYW5ub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IE1DViBlbnRyaWVz IHNvCisJCQkJICogZXN0aW1hdGUgdGhlaXIgc2VsZWN0aXZpdHkgc2VwYXJhdGVseSB1c2lu ZyBhIGZhbGxiYWNrLgorCQkJCSAqLworCQkJCW5vbmNvbnN0X3NlbCA9IHZhcl9lcV9ub25f Y29uc3QoJnZhcmRhdGEsIG9wZXJhdG9yLAorCQkJCQkJCQkJCQkJY2xhdXNlLT5pbnB1dGNv bGxpZCwKKwkJCQkJCQkJCQkJCW90aGVyX29wLCB2YXJfb25fbGVmdCwKKwkJCQkJCQkJCQkJ CWlzSW5lcXVhbGl0eSk7CisKKwkJCQlzMSA9IHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNo KCZ2YXJkYXRhLCBvcGVyYXRvciwKKwkJCQkJCQkJCQkJCWNsYXVzZS0+aW5wdXRjb2xsaWQs CisJCQkJCQkJCQkJCQlub25jb25zdF9zZWwsIGVsZW1fdmFsdWVzLAorCQkJCQkJCQkJCQkJ ZWxlbV9udWxscywgbnVtX2VsZW1zLAorCQkJCQkJCQkJCQkJZWxlbV9jb25zdCwKKwkJCQkJ CQkJCQkJCW5vbWluYWxfZWxlbWVudF90eXBlLCB1c2VPciwKKwkJCQkJCQkJCQkJCWlzRXF1 YWxpdHksIGlzSW5lcXVhbGl0eSk7CisKKwkJCQlwZnJlZShlbGVtX3ZhbHVlcyk7CisJCQkJ cGZyZWUoZWxlbV9udWxscyk7CisJCQkJcGZyZWUoZWxlbV9jb25zdCk7CisKKwkJCQlSZWxl YXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKworCQkJCWlmIChzMSA+PSAwLjApCisJCQkJ CXJldHVybiBzMTsKKwkJCX0KKwkJfQorCiAJCS8qCiAJCSAqIFdlIHVzZSB0aGUgYXNzdW1w dGlvbiBvZiBkaXNqb2ludCBwcm9iYWJpbGl0aWVzIGhlcmUgdG9vLCBhbHRob3VnaAogCQkg KiB0aGUgb2RkcyBvZiBlcXVhbCBhcnJheSBlbGVtZW50cyBhcmUgcmF0aGVyIGhpZ2hlciBp ZiB0aGUgZWxlbWVudHMKQEAgLTIyMjcsNiArMjQzMCwzMzkgQEAgc2NhbGFyYXJyYXlzZWwo UGxhbm5lckluZm8gKnJvb3QsCiAJcmV0dXJuIHMxOwogfQogCisvKgorICogc2NhbGFyYXJy YXlfbWN2X2hhc2hfbWF0Y2ggLSBTZWxlY3Rpdml0eSBvZiBTY2FsYXJBcnJheU9wRXhwciBi eSBPKE4rTSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1hdGNoZXMgSU4tbGlzdCBlbGVtZW50 cyBhZ2FpbnN0IE1DViBlbnRyaWVzIG9mIHRoZSB2YXJpYWJsZSwKKyAqIHVzaW5nIGVpdGhl ciBoYXNoaW5nIChPKE4rTSkpIG9yIGZhbGxiYWNrIG5lc3RlZC1sb29wIGxvZ2ljLiAgRm9y IG1hdGNoZWQKKyAqIGVsZW1lbnRzLCBzZWxlY3Rpdml0eSBpcyB0YWtlbiBmcm9tIE1DViBm cmVxdWVuY2llczsgdW5tYXRjaGVkIGVsZW1lbnRzIGFyZQorICogaGFuZGxlZCB1c2luZyBm YWxsYmFjayBlc3RpbWF0ZXMuCisgKgorICogVGhlIHJlc3VsdGluZyBwcm9iYWJpbGl0aWVz IGFyZSBjb21iaW5lZCB1c2luZyB0aGUgc3RhbmRhcmQgQU5ZL0FMTAorICogc2VsZWN0aXZp dHkgbW9kZWwgKGluZGVwZW5kZW50IG9yIGRpc2pvaW50IGV2ZW50cyksIGlkZW50aWNhbCB0 byB0aGUKKyAqIGdlbmVyaWMgZXN0aW1hdG9yLgorICoKKyAqIElucHV0czoKKyAqICAgdmFy ZGF0YTogc3RhdGlzdGljcyBmb3IgdGhlIHZhcmlhYmxlCisgKiAgIG9wZXJhdG9yOiBlcXVh bGl0eSBvciBpbmVxdWFsaXR5IG9wZXJhdG9yCisgKiAgIGNvbGxhdGlvbjogY29sbGF0aW9u IHRvIHVzZQorICogICBub25jb25zdF9zZWw6IGZhbGxiYWNrIHNlbGVjdGl2aXR5IGZvciBu b24tQ29uc3QgZWxlbWVudHMKKyAqICAgZWxlbV92YWx1ZXM6IElOLWxpc3QgZWxlbWVudCB2 YWx1ZXMKKyAqICAgZWxlbV9udWxsczogTlVMTCBmbGFncyBmb3IgZWxlbWVudHMKKyAqICAg ZWxlbV9jb25zdDogZmxhZ3MgaW5kaWNhdGluZyBDb25zdCBlbGVtZW50cworICogICBudW1f ZWxlbXM6IG51bWJlciBvZiBlbGVtZW50cworICogICBub21pbmFsX2VsZW1lbnRfdHlwZTog ZWxlbWVudCB0eXBlCisgKiAgIHVzZU9yOiBPUiAoQU5ZKSB2cyBBTkQgKEFMTCkgc2VtYW50 aWNzCisgKiAgIGlzRXF1YWxpdHk6IG9wZXJhdG9yIGJlaGF2ZXMgbGlrZSBlcXVhbGl0eQor ICogICBpc0luZXF1YWxpdHk6IG9wZXJhdG9yIGJlaGF2ZXMgbGlrZSBpbmVxdWFsaXR5Cisg KgorICogUmVzdWx0OgorICogICBTZWxlY3Rpdml0eSBpbiBbMCwxXSwgb3IgLTEuMCBpZiBN Q1YtYmFzZWQgZXN0aW1hdGlvbiBpcyBub3QgYXBwbGljYWJsZS4KKyAqCisgKiBOb3RlOgor ICogICBBc3N1bWVzIGVxc2VsKCkvbmVxc2VsIHNlbWFudGljcy4gIEVhY2ggZWxlbWVudCBp cyBhY2NvdW50ZWQgZm9yIG9uY2UsCisgKiAgIGVpdGhlciB2aWEgTUNWIG1hdGNoIG9yIGZh bGxiYWNrIGVzdGltYXRpb24uCisgKi8KK3N0YXRpYyBkb3VibGUKK3NjYWxhcmFycmF5X21j dl9oYXNoX21hdGNoKFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcGVyYXRvciwK KwkJCQkJCSAgIE9pZCBjb2xsYXRpb24sIFNlbGVjdGl2aXR5IG5vbmNvbnN0X3NlbCwKKwkJ CQkJCSAgIERhdHVtICplbGVtX3ZhbHVlcywgYm9vbCAqZWxlbV9udWxscywgaW50IG51bV9l bGVtcywKKwkJCQkJCSAgIGJvb2wgKmVsZW1fY29uc3QsIE9pZCBub21pbmFsX2VsZW1lbnRf dHlwZSwKKwkJCQkJCSAgIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwgYm9vbCBpc0lu ZXF1YWxpdHkpCit7CisJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CisJQXR0U3RhdHNTbG90 IHNzbG90OworCUZtZ3JJbmZvCWVxcHJvYzsKKwlkb3VibGUJCXNlbGVjID0gLTEuMCwKKwkJ CQlzMWRpc2pvaW50LAorCQkJCW51bGxmcmFjID0gMC4wOworCU9pZAkJCWhhc2hMZWZ0ID0g SW52YWxpZE9pZCwKKwkJCQloYXNoUmlnaHQgPSBJbnZhbGlkT2lkLAorCQkJCW9wZnVuY29p ZDsKKwlib29sCQloYXZlX21jdnMgPSBmYWxzZTsKKworCS8qCisJICogSWYgdGhlIHZhcmlh YmxlIGlzIGtub3duIHRvIGJlIHVuaXF1ZSwgTUNWIHN0YXRpc3RpY3MgZG8gbm90IHJlcHJl c2VudAorCSAqIGEgbWVhbmluZ2Z1bCBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uLCBzbyBza2lw IE1DVi1iYXNlZCBlc3RpbWF0aW9uLgorCSAqLworCWlmICh2YXJkYXRhLT5pc3VuaXF1ZSAm JiB2YXJkYXRhLT5yZWwgJiYgdmFyZGF0YS0+cmVsLT50dXBsZXMgPj0gMS4wKQorCQlyZXR1 cm4gLTEuMDsKKworCS8qCisJICogRm9yIGluZXF1YWxpdHkgKDw+LCBBTEwpLCB3ZSBjb21w dXRlIHByb2JhYmlsaXRpZXMgdXNpbmcgdGhlIG5lZ2F0ZWQKKwkgKiBlcXVhbGl0eSBvcGVy YXRvciBhbmQgbGF0ZXIgdHJhbnNmb3JtIHRoZW0gYXMKKwkgKgorCSAqIHAoeCA8PiBjKSA9 IDEgLSBwKHggPSBjKSAtIG51bGxmcmFjCisJICovCisJaWYgKGlzSW5lcXVhbGl0eSkKKwl7 CisJCW9wZXJhdG9yID0gZ2V0X25lZ2F0b3Iob3BlcmF0b3IpOworCQlpZiAoIU9pZElzVmFs aWQob3BlcmF0b3IpKQorCQkJcmV0dXJuIC0xLjA7CisJfQorCisJb3BmdW5jb2lkID0gZ2V0 X29wY29kZShvcGVyYXRvcik7CisJbWVtc2V0KCZzc2xvdCwgMCwgc2l6ZW9mKHNzbG90KSk7 CisKKwlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKKwl7CisJ CWlmIChzdGF0aXN0aWNfcHJvY19zZWN1cml0eV9jaGVjayh2YXJkYXRhLCBvcGZ1bmNvaWQp KQorCQkJaGF2ZV9tY3ZzID0gZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEtPnN0 YXRzVHVwbGUsCisJCQkJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwK KwkJCQkJCQkJCQkgQVRUU1RBVFNTTE9UX1ZBTFVFUyB8IEFUVFNUQVRTU0xPVF9OVU1CRVJT KTsKKwl9CisKKwlpZiAoaGF2ZV9tY3ZzKQorCXsKKwkJLyoKKwkJICogSWYgdGhlIE1DViBs aXN0IGFuZCBJTi1saXN0IGFyZSBsYXJnZSBlbm91Z2gsIGFuZCB0aGUgb3BlcmF0b3IKKwkJ ICogc3VwcG9ydHMgaGFzaGluZywgYXR0ZW1wdCB0byB1c2UgaGFzaCBmdW5jdGlvbnMgc28g dGhhdCBNQ1bigJNJTgorCQkgKiBtYXRjaGluZyBjYW4gYmUgZG9uZSBpbiBPKE4rTSkgaW5z dGVhZCBvZiBPKE7Dl00pLgorCQkgKi8KKwkJaWYgKHNzbG90Lm52YWx1ZXMgKyBudW1fZWxl bXMgPj0gTUNWX0hBU0hfVEhSRVNIT0xEKQorCQl7CisJCQlmbWdyX2luZm8ob3BmdW5jb2lk LCAmZXFwcm9jKTsKKwkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMob3BlcmF0b3Is ICZoYXNoTGVmdCwgJmhhc2hSaWdodCk7CisJCX0KKwl9CisKKwlpZiAoaGF2ZV9tY3ZzICYm IE9pZElzVmFsaWQoaGFzaExlZnQpICYmIE9pZElzVmFsaWQoaGFzaFJpZ2h0KSkKKwl7CisJ CS8qIFVzZSBhIGhhc2ggdGFibGUgdG8gc3BlZWQgdXAgdGhlIG1hdGNoaW5nICovCisJCUxP Q0FMX0ZDSU5GTyhmY2luZm8sIDIpOworCQlMT0NBTF9GQ0lORk8oaGFzaF9mY2luZm8sIDEp OworCQlNQ1ZIYXNoVGFibGVfaGFzaCAqaGFzaFRhYmxlOworCQlGbWdySW5mbwloYXNoX3By b2M7CisJCU1DVkhhc2hDb250ZXh0IGhhc2hDb250ZXh0OworCQlTZWxlY3Rpdml0eSBub25t Y3Zfc2VsZWMgPSAwLjA7CisJCWRvdWJsZQkJc3VtYWxsY29tbW9uID0gMC4wOworCQlib29s CQlpc2RlZmF1bHQ7CisJCWJvb2wJCWhhc2hfbWN2OworCQlkb3VibGUJCW90aGVyZGlzdGlu Y3Q7CisJCURhdHVtCSAgICphcnJheUhhc2g7CisJCURhdHVtCSAgICphcnJheVByb2JlOwor CQlpbnQJCQludmFsdWVzSGFzaDsKKwkJaW50CQkJbnZhbHVlc1Byb2JlOworCQlpbnQJCQlu b25tY3ZfY250ID0gbnVtX2VsZW1zOworCQlpbnQJCQlub25jb25zdF9jbnQgPSAwOworCisJ CS8qIEdyYWIgdGhlIG51bGxmcmFjIGZvciB1c2UgYmVsb3cuICovCisJCXN0YXRzID0gKEZv cm1fcGdfc3RhdGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0YS0+c3RhdHNUdXBsZSk7CisJCW51 bGxmcmFjID0gc3RhdHMtPnN0YW51bGxmcmFjOworCisJCXNlbGVjID0gczFkaXNqb2ludCA9 ICh1c2VPciA/IDAuMCA6IDEuMCk7CisKKwkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpm Y2luZm8sICZlcXByb2MsIDIsIGNvbGxhdGlvbiwKKwkJCQkJCQkJIE5VTEwsIE5VTEwpOwor CQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisJCWZjaW5mby0+YXJnc1sxXS5p c251bGwgPSBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHNzbG90Lm52YWx1ZXM7 IGkrKykKKwkJCXN1bWFsbGNvbW1vbiArPSBzc2xvdC5udW1iZXJzW2ldOworCisJCS8qCisJ CSAqIENvbXB1dGUgdGhlIHRvdGFsIHByb2JhYmlsaXR5IG1hc3Mgb2YgYWxsIG5vbi1NQ1Yg dmFsdWVzLiBUaGlzIGlzCisJCSAqIHRoZSBwYXJ0IG9mIHRoZSBjb2x1bW4gZGlzdHJpYnV0 aW9uIG5vdCBjb3ZlcmVkIGJ5IE1DVnMuCisJCSAqLworCQlub25tY3Zfc2VsZWMgPSAxLjAg LSBzdW1hbGxjb21tb24gLSBudWxsZnJhYzsKKwkJQ0xBTVBfUFJPQkFCSUxJVFkobm9ubWN2 X3NlbGVjKTsKKworCQkvKgorCQkgKiBBcHByb3hpbWF0ZSB0aGUgcGVyLXZhbHVlIHByb2Jh YmlsaXR5IG9mIGEgbm9uLU1DViBjb25zdGFudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVt YWluaW5nIHByb2JhYmlsaXR5IG1hc3MgYnkgdGhlIG51bWJlciBvZiBvdGhlcgorCQkgKiBk aXN0aW5jdCB2YWx1ZXMuCisJCSAqLworCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3ZhcmlhYmxl X251bWRpc3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpIC0gc3Nsb3Qubm51bWJlcnM7CisJ CWlmIChvdGhlcmRpc3RpbmN0ID4gMSkKKwkJCW5vbm1jdl9zZWxlYyAvPSBvdGhlcmRpc3Rp bmN0OworCisJCWlmIChzc2xvdC5ubnVtYmVycyA+IDAgJiYgbm9ubWN2X3NlbGVjID4gc3Ns b3QubnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdKQorCQkJbm9ubWN2X3NlbGVjID0gc3Ns b3QubnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBi dWlsZCB0aGUgaGFzaCB0YWJsZSBvbiB0aGUgc21hbGxlciBhcnJheS4gKi8KKwkJaWYgKHNz bG90Lm52YWx1ZXMgPD0gbnVtX2VsZW1zKQorCQl7CisJCQloYXNoX21jdiA9IHRydWU7CisJ CQludmFsdWVzSGFzaCA9IHNzbG90Lm52YWx1ZXM7CisJCQludmFsdWVzUHJvYmUgPSBudW1f ZWxlbXM7CisJCQlhcnJheUhhc2ggPSBzc2xvdC52YWx1ZXM7CisJCQlhcnJheVByb2JlID0g ZWxlbV92YWx1ZXM7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYXNoX21jdiA9IGZhbHNlOwor CQkJbnZhbHVlc0hhc2ggPSBudW1fZWxlbXM7CisJCQludmFsdWVzUHJvYmUgPSBzc2xvdC5u dmFsdWVzOworCQkJYXJyYXlIYXNoID0gZWxlbV92YWx1ZXM7CisJCQlhcnJheVByb2JlID0g c3Nsb3QudmFsdWVzOworCQl9CisKKwkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFzaExlZnQg OiBoYXNoUmlnaHQsICZoYXNoX3Byb2MpOworCQlJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEo Kmhhc2hfZmNpbmZvLCAmaGFzaF9wcm9jLCAxLCBjb2xsYXRpb24sCisJCQkJCQkJCSBOVUxM LCBOVUxMKTsKKwkJaGFzaF9mY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisKKwkJ aGFzaENvbnRleHQuZXF1YWxfZmNpbmZvID0gZmNpbmZvOworCQloYXNoQ29udGV4dC5oYXNo X2ZjaW5mbyA9IGhhc2hfZmNpbmZvOworCQloYXNoQ29udGV4dC5vcF9pc19yZXZlcnNlZCA9 IGhhc2hfbWN2OworCQloYXNoQ29udGV4dC5pbnNlcnRfbW9kZSA9IHRydWU7CisKKwkJZ2V0 X3R5cGxlbmJ5dmFsKGhhc2hfbWN2ID8gc3Nsb3QudmFsdWV0eXBlIDogbm9taW5hbF9lbGVt ZW50X3R5cGUsCisJCQkJCQkmaGFzaENvbnRleHQuaGFzaF90eXBsZW4sCisJCQkJCQkmaGFz aENvbnRleHQuaGFzaF90eXBieXZhbCk7CisKKwkJaGFzaFRhYmxlID0gTUNWSGFzaFRhYmxl X2NyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQludmFsdWVzSGFzaCwK KwkJCQkJCQkJCQkmaGFzaENvbnRleHQpOworCisJCS8qIEJ1aWxkIGEgaGFzaCB0YWJsZSBv dmVyIHRoZSBzbWFsbGVyIGlucHV0IHNpZGUuICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwg bnZhbHVlc0hhc2g7IGkrKykKKwkJeworCQkJYm9vbAkJZm91bmQgPSBmYWxzZTsKKwkJCU1D Vkhhc2hFbnRyeSAqZW50cnk7CisKKwkJCS8qCisJCQkgKiBXaGVuIGhhc2hpbmcgSU4tbGlz dCB2YWx1ZXMgKGhhc2hfbWN2ID09IGZhbHNlKSwgd2Ugb25seSBpbnNlcnQKKwkJCSAqIGNv bnN0YW50LCBub24tTlVMTCBlbGVtZW50cy4gIE5VTEwgYW5kIG5vbi1Db25zdCBlbGVtZW50 cyBhcmUKKwkJCSAqIGNvdW50ZWQgc2VwYXJhdGVseSwgYmVjYXVzZSB0aGV5IGNhbm5vdCBw YXJ0aWNpcGF0ZSBpbiBNQ1YKKwkJCSAqIG1hdGNoaW5nIGFuZCBtdXN0IGJlIGhhbmRsZWQg bGF0ZXIgdXNpbmcgZ2VuZXJpYyBzZWxlY3Rpdml0eQorCQkJICogZXN0aW1hdGlvbi4KKwkJ CSAqLworCQkJaWYgKCFoYXNoX21jdikKKwkJCXsKKwkJCQlpZiAoZWxlbV9udWxsc1tpXSkK KwkJCQl7CisJCQkJCUFzc2VydCh1c2VPcik7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJ Y29udGludWU7CisJCQkJfQorCisJCQkJaWYgKCFlbGVtX2NvbnN0W2ldKQorCQkJCXsKKwkJ CQkJbm9ubWN2X2NudC0tOworCQkJCQlub25jb25zdF9jbnQrKzsKKwkJCQkJY29udGludWU7 CisJCQkJfQorCQkJfQorCisJCQllbnRyeSA9IE1DVkhhc2hUYWJsZV9pbnNlcnQoaGFzaFRh YmxlLCBhcnJheUhhc2hbaV0sICZmb3VuZCk7CisKKwkJCS8qCisJCQkgKiBlbnRyeS0+Y291 bnQgdHJhY2tzIGhvdyBtYW55IHRpbWVzIHRoZSBzYW1lIHZhbHVlIGFwcGVhcnMsIHNvCisJ CQkgKiB0aGF0IGR1cGxpY2F0ZSBJTi1saXN0IGVsZW1lbnRzIGNhbiBiZSBmb2xkZWQgaW50 byB0aGUKKwkJCSAqIHByb2JhYmlsaXR5IGNhbGN1bGF0aW9uLgorCQkJICovCisJCQlpZiAo bGlrZWx5KCFmb3VuZCkpCisJCQl7CisJCQkJZW50cnktPmluZGV4ID0gaTsKKwkJCQllbnRy eS0+Y291bnQgPSAxOworCQkJfQorCQkJZWxzZQorCQkJCWVudHJ5LT5jb3VudCsrOworCQl9 CisKKwkJaGFzaENvbnRleHQuaW5zZXJ0X21vZGUgPSBmYWxzZTsKKwkJaWYgKGhhc2hMZWZ0 ICE9IGhhc2hSaWdodCkKKwkJeworCQkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFzaFJpZ2h0 IDogaGFzaExlZnQsICZoYXNoX3Byb2MpOworCQkJLyogUmVzZXR0aW5nIGhhc2hfZmNpbmZv IGlzIHByb2JhYmx5IHVubmVjZXNzYXJ5LCBidXQgYmUgc2FmZSAqLworCQkJSW5pdEZ1bmN0 aW9uQ2FsbEluZm9EYXRhKCpoYXNoX2ZjaW5mbywgJmhhc2hfcHJvYywgMSwgY29sbGF0aW9u LAorCQkJCQkJCQkJIE5VTEwsIE5VTEwpOworCQkJaGFzaF9mY2luZm8tPmFyZ3NbMF0uaXNu dWxsID0gZmFsc2U7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXNQcm9i ZTsgaSsrKQorCQl7CisJCQlNQ1ZIYXNoRW50cnkgKmVudHJ5OworCQkJU2VsZWN0aXZpdHkg czE7CisJCQlpbnQJCQludmFsdWVzbWN2OworCisJCQkvKgorCQkJICogV2hlbiBwcm9iaW5n IHdpdGggSU4tbGlzdCBlbGVtZW50cywgaWdub3JlIE5VTExzIGFuZCBub24tQ29uc3QKKwkJ CSAqIGV4cHJlc3Npb25zOiB0aGV5IGNhbm5vdCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcyBh bmQgd2lsbCBiZQorCQkJICogYWNjb3VudGVkIGZvciBsYXRlciBieSBnZW5lcmljIGVzdGlt YXRpb24uCisJCQkgKi8KKwkJCWlmIChoYXNoX21jdikKKwkJCXsKKwkJCQlpZiAoZWxlbV9u dWxsc1tpXSkKKwkJCQl7CisJCQkJCUFzc2VydCh1c2VPcik7CisJCQkJCW5vbm1jdl9jbnQt LTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKCFlbGVtX2NvbnN0W2ldKQor CQkJCXsKKwkJCQkJbm9ubWN2X2NudC0tOworCQkJCQlub25jb25zdF9jbnQrKzsKKwkJCQkJ Y29udGludWU7CisJCQkJfQorCQkJfQorCisJCQllbnRyeSA9IE1DVkhhc2hUYWJsZV9sb29r dXAoaGFzaFRhYmxlLCBhcnJheVByb2JlW2ldKTsKKworCQkJLyoKKwkJCSAqIElmIGZvdW5k LCBvYnRhaW4gaXRzIE1DViBmcmVxdWVuY3kgYW5kIHJlbWVtYmVyIGhvdyBtYW55IHZhbHVl cworCQkJICogb24gdGhlIGhhc2hlZCBzaWRlIG1hcCB0byB0aGlzIGVudHJ5LgorCQkJICov CisJCQlpZiAoZW50cnkgIT0gTlVMTCkKKwkJCXsKKwkJCQlzMSA9IGhhc2hfbWN2ID8gc3Ns b3QubnVtYmVyc1tlbnRyeS0+aW5kZXhdCisJCQkJCTogc3Nsb3QubnVtYmVyc1tpXTsKKwor CQkJCW52YWx1ZXNtY3YgPSBlbnRyeS0+Y291bnQ7CisKKwkJCQlhY2N1bV9zY2FsYXJhcnJh eV9wcm9iKHMxLCBudmFsdWVzbWN2LCB1c2VPciwgaXNFcXVhbGl0eSwKKwkJCQkJCQkJCSAg IGlzSW5lcXVhbGl0eSwgbnVsbGZyYWMsIHRydWUsICZzZWxlYywKKwkJCQkJCQkJCSAgICZz MWRpc2pvaW50KTsKKworCQkJCS8qIE1hdGNoZWQgdmFsdWVzIGFyZSBubyBsb25nZXIgY29u c2lkZXJlZCBub24tTUNWICovCisJCQkJbm9ubWN2X2NudCAtPSBudmFsdWVzbWN2OworCQkJ fQorCQl9CisKKwkJbm9ubWN2X2NudCA9IE1heChub25tY3ZfY250LCAwKTsKKworCQkvKgor CQkgKiBBY2NvdW50IGZvciBjb25zdGFudCBJTi1saXN0IHZhbHVlcyB0aGF0IGRpZCBub3Qg bWF0Y2ggYW55IE1DVi4KKwkJICoKKwkJICogRWFjaCBzdWNoIHZhbHVlIGlzIGFzc3VtZWQg dG8gaGF2ZSBwcm9iYWJpbGl0eSA9IG5vbm1jdl9zZWxlYywKKwkJICogZGVyaXZlZCBmcm9t IHRoZSByZW1haW5pbmcgKG5vbi1NQ1YpIHByb2JhYmlsaXR5IG1hc3MuCisJCSAqLworCQlh Y2N1bV9zY2FsYXJhcnJheV9wcm9iKG5vbm1jdl9zZWxlYywgbm9ubWN2X2NudCwgdXNlT3Is IGlzRXF1YWxpdHksCisJCQkJCQkJICAgaXNJbmVxdWFsaXR5LCBudWxsZnJhYywgdHJ1ZSwK KwkJCQkJCQkgICAmc2VsZWMsICZzMWRpc2pvaW50KTsKKworCQkvKgorCQkgKiBBY2NvdW50 IGZvciBub24tQ29uc3QgSU4tbGlzdCBlbGVtZW50cy4KKwkJICoKKwkJICogVGhlc2UgdmFs dWVzIGNhbm5vdCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcywgc28gd2UgcmVseSBvbiB0aGUK KwkJICogb3BlcmF0b3IncyBnZW5lcmljIHNlbGVjdGl2aXR5IGVzdGltYXRvciBmb3IgZWFj aCBvZiB0aGVtLgorCQkgKi8KKwkJYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihub25jb25zdF9z ZWwsIG5vbmNvbnN0X2NudCwgdXNlT3IsIGlzRXF1YWxpdHksCisJCQkJCQkJICAgaXNJbmVx dWFsaXR5LCBudWxsZnJhYywgZmFsc2UsCisJCQkJCQkJICAgJnNlbGVjLCAmczFkaXNqb2lu dCk7CisKKwkJLyoKKwkJICogRm9yID0gQU5ZIG9yIDw+IEFMTCwgaWYgdGhlIElOLWxpc3Qg ZWxlbWVudHMgYXJlIGFzc3VtZWQgZGlzdGluY3QsCisJCSAqIHRoZSBldmVudHMgYXJlIGRp c2pvaW50IGFuZCB0aGUgdG90YWwgcHJvYmFiaWxpdHkgaXMgdGhlIHN1bSBvZgorCQkgKiBp bmRpdmlkdWFsIHByb2JhYmlsaXRpZXMuICBVc2UgdGhhdCBlc3RpbWF0ZSBpZiBpdCBsaWVz IGluIFswLDFdLgorCQkgKi8KKwkJaWYgKCh1c2VPciA/IGlzRXF1YWxpdHkgOiBpc0luZXF1 YWxpdHkpICYmCisJCQlzMWRpc2pvaW50ID49IDAuMCAmJiBzMWRpc2pvaW50IDw9IDEuMCkK KwkJCXNlbGVjID0gczFkaXNqb2ludDsKKworCQlDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7 CisKKwkJTUNWSGFzaFRhYmxlX2Rlc3Ryb3koaGFzaFRhYmxlKTsKKwl9CisKKwlpZiAoaGF2 ZV9tY3ZzKQorCQlmcmVlX2F0dHN0YXRzc2xvdCgmc3Nsb3QpOworCisJcmV0dXJuIHNlbGVj OworfQorCiAvKgogICogRXN0aW1hdGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJh eSB5aWVsZGVkIGJ5IGFuIGV4cHJlc3Npb24uCiAgKgpAQCAtMjQ2Myw3ICsyOTk5LDcgQEAg ZXFqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCSAqIElmIHRoZSBNQ1YgbGlzdHMgYXJl IGxvbmcgZW5vdWdoIHRvIGp1c3RpZnkgaGFzaGluZywgdHJ5IHRvIGxvb2sgdXAKIAkJICog aGFzaCBmdW5jdGlvbnMgZm9yIHRoZSBqb2luIG9wZXJhdG9yLgogCQkgKi8KLQkJaWYgKChz c2xvdDEubnZhbHVlcyArIHNzbG90Mi5udmFsdWVzKSA+PSBFUUpPSU5TRUxfTUNWX0hBU0hf VEhSRVNIT0xEKQorCQlpZiAoKHNzbG90MS5udmFsdWVzICsgc3Nsb3QyLm52YWx1ZXMpID49 IE1DVl9IQVNIX1RIUkVTSE9MRCkKIAkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMo b3BlcmF0b3IsICZoYXNoTGVmdCwgJmhhc2hSaWdodCk7CiAJfQogCWVsc2UKQEAgLTMxMDMs NiArMzYzOSw3IEBAIGVxam9pbnNlbF9maW5kX21hdGNoZXMoRm1nckluZm8gKmVxcHJvYywg T2lkIGNvbGxhdGlvbiwKIAogLyoKICAqIFN1cHBvcnQgZnVuY3Rpb25zIGZvciB0aGUgaGFz aCB0YWJsZXMgdXNlZCBieSBlcWpvaW5zZWxfZmluZF9tYXRjaGVzCisgKiBhbmQgc2NhbGFy YXJyYXlfbWN2X2hhc2hfbWF0Y2gKICAqLwogc3RhdGljIHVpbnQzMgogaGFzaF9tY3YoTUNW SGFzaFRhYmxlX2hhc2ggKnRhYiwgRGF0dW0ga2V5KQotLSAKMi4zNC4xCgo= --------------4R0NPPfcA7rPGVFJzVf4H5hA--