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 1w49HD-001uOE-29 for pgsql-hackers@arkaria.postgresql.org; Sun, 22 Mar 2026 03:14:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w49HB-00CLcr-2g for pgsql-hackers@arkaria.postgresql.org; Sun, 22 Mar 2026 03:14:54 +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 1w49HB-00CLcj-0p for pgsql-hackers@lists.postgresql.org; Sun, 22 Mar 2026 03:14:53 +0000 Received: from mail-ot1-x32a.google.com ([2607:f8b0:4864:20::32a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w49H8-00000000Pbp-0nKA for pgsql-hackers@postgresql.org; Sun, 22 Mar 2026 03:14:51 +0000 Received: by mail-ot1-x32a.google.com with SMTP id 46e09a7af769-7d74dbfe84cso2171754a34.1 for ; Sat, 21 Mar 2026 20:14:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774149289; cv=none; d=google.com; s=arc-20240605; b=XY8fIPRNZVlMY3VnTxl0pJGmMPub0rbzENT4FRmzQ4o+7DDi2pMRZ0mohdr96zJAu/ xvXENRwsv2/Y8VAIlhvpHgxmZwaVq2e7JK+ZPHFGN02QGRV+y6mB4RlW+o3/oc75SGpH tLhZuaXzZGnjB5K3K/qrn/0BfLM8LMrtot3PufgSH5eR6dDPHRKH11zV2oLlSRR+hi6c F+Xapi+vow1GtZO0OL9+MA7OhOCmW+q+HJZ8ACnjY0/G9kxP+eibl8JAtN+jXPpMos3Y 6jSJBqhOQXGFgvgD6d7Y2h1lJ8dMRWzRdjE+ONL058YyH5ax827iPbkqZzUakWafSiJU w/1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=SC0k1AdySNYvvWt8ltPrnstmmLxRYgVq6gFnC5vx07I=; fh=Wy5UbF1MA0P0Fv8tLejt3M4w9Fu0jkQPmpHD6bonU2o=; b=kjCdVm3R5yQU1KWn85BAXKQ6/2vEXBbuHLyJz6pu/metRiwUJjYmlKwrekG2kDyICq CS4/6WIam4PycBX91CAnMok5ug8Yh3ibNt0HQRslhKoSw9b1kbrdOaRscMqESjllPCSV 0VHPtwalZrvfm1DQLnLPeEtsquX/tpFtzBncMb8lJA8IOmvs089xmefTyKKNqC1/QBM+ h66ZBJNNChbQ/idMTerpK29n9u5/H5KTZ0/MaNU+gjxZFeYkklUYrPauYnffIn8+qO5H x63vuIa5qhCVsW355Ydr8P4ptGEWYa3ifrMPQ5bs1cDzssvWt2QOm7+5a5ujERAf2rCZ Y/7g==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1774149289; x=1774754089; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=SC0k1AdySNYvvWt8ltPrnstmmLxRYgVq6gFnC5vx07I=; b=FPi8G4efZZjYGNknmmtuVS6cAkn0i+k+6wblKrxif9NQ/WafJvt+UweMQE1UcoWn50 +3oYHtn13HGSic2Ed6b9+KWaVjf//UjxGtL9RWhrFMdysi8JwXPoPREJ2TIyswZCN3hk lAfgJLCYsdJMBDJun4trUzYTwkKEnBTNG7KQipnYZ6atd1uQt4jhIGa1F+c+o8OXmRQ6 AHaSbRSJId/r1hYN4ANYYBYUHhRTWdaRl+VwLRrOA0/5ZwqcJaYK9T+yHeNwUqkrMpkn jGKPjv2XmtX04i+x4lN50rsYdn8iisqfyRZRxErLkoFrmum5CyFNaZrdrPd3sEa2x7/k 3KXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774149289; x=1774754089; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=SC0k1AdySNYvvWt8ltPrnstmmLxRYgVq6gFnC5vx07I=; b=p+IGaYYC2mQ9kEFXfusdB0Nd4MGaQUY0xaJYUS5tFfB2gFcqY7g9adeXp0N/wGgMfj MwWvTWFP32dwHhR22XuS3Gexgikv+679UptfZQUgr470GxaLqwNB2qcN9QltitLWS1Hl 1kHijdZGDCYuSKbv2wD1lNqDUnA9woxl/6QKlNt9tzTqrfwG71SgxNhUFqYqUBlz3NuP Yn2AxSfkyoZnteGVFZnyrAxLHxlm5j86iR+5UoaYCdyPf5Zyrm97wm4vNGEaPtzYvkEe kHwSaMHqel67v9ZQCBQx/BfEV4GTRfBHW2ySAKrErrbFrVIAEDNJfDPIOm1KI5oiq7kS DgjQ== X-Forwarded-Encrypted: i=1; AJvYcCVlV11X3YUAe4eYNc0IDHOfiINhf/qXhBHB3FTru9Fm+o2seQyi0FMDQ/zONpzeKVx5YRgIBuxm1DSgbzU7@postgresql.org X-Gm-Message-State: AOJu0Yzy4OZshkuUm2tRR06kZvtpexWvTBI6+3Wtt/Qyk9yzEGY5miEB yKjC0Vanxw52zLXd8cu3zMrqkV9j/rLFHId90O8PqMFPmfYhKCH+4sRunrRwFhWIyRY+Il0kOEm G9L5ZJq/pDP00AmZdCbvtxRjJKv6AJCShmefzJcEyoMs0K3yHJJK/3Q== X-Gm-Gg: ATEYQzxyfqj5yubnXKfkw9+OHgTrmQOaUAEFRDpVKQgQDik+dVXIn0NpsMtgUbbPAuw idBhCA1KrM6Mj0tUo/bhLjzv2CKQ1As4Sv0JCrsREf6GKro5rGNmCV4Zk1a+5CVy0LrpTz2uljM vBo7960lyheMrSOQn3yzCY+xUq8Lmo6C2Ygz0UOj70rZCmCxQHkS69fhUH9UzXhRexI0qrD8Alg ka7AG4gnDzK06b4CuMCf64L8FKRxv3y2SebeDl917igEu/bacfkBOK7FMGWfwSPOFKB3YrVCKvI +aQIgwb/kQ== X-Received: by 2002:a05:6830:710b:b0:7d9:92f0:556b with SMTP id 46e09a7af769-7d992f061a0mr1895733a34.32.1774149289293; Sat, 21 Mar 2026 20:14:49 -0700 (PDT) MIME-Version: 1.0 References: <0a4f41b84efa5d821aba166658fb845f1ab97f03.camel@j-davis.com> In-Reply-To: <0a4f41b84efa5d821aba166658fb845f1ab97f03.camel@j-davis.com> From: Mark Dilger Date: Sat, 21 Mar 2026 20:14:37 -0700 X-Gm-Features: AaiRm51D_hzE-bJ8iSjoXFicAnRUW3EUShvZCemd3T0lizqWb0PVR079bJRR2dU Message-ID: Subject: Re: Use CASEFOLD() internally rather than LOWER() To: Jeff Davis Cc: Daniel Verite , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000002ade60064d945248" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002ade60064d945248 Content-Type: multipart/alternative; boundary="0000000000002ade5f064d945246" --0000000000002ade5f064d945246 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Mar 3, 2026 at 1:01=E2=80=AFPM Jeff Davis wrote= : > On Sat, 2026-02-28 at 14:27 +0100, Daniel Verite wrote: > > I tried 0001 with a non-UTF8 database and got quickly stuck: > > Attached new versions. I moved the encoding check into the SQL-callable > casefold() function, and other callers use str_casefold(). That > slightly simplifies what happens in ILIKE, also. > > I removed the citext changes. citext has somewhat of a legacy status, I > think, so I'm not sure it makes sense to try to modernize or change it. > Also, some SQL-language functions in citext use LOWER(), so the changes > aren't enough: we'd need to make the SQL CASEFOLD function callable in > other encodings, and also run a citext upgrade script to change the > definitions. > > Note that these changes affect the result of some expressions (e.g. > ILIKE), so could theoretically make an expression index or predicate > index inconsistent. > Thanks for the patches! After v2-0001, ILIKE uses str_casefold() for matching, but pg_trgm still uses str_tolower() for trigram extraction (trgm_op.c:352 and :948). With builtin collations, these produce different results. --0000000000002ade5f064d945246 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

On Tue, Mar 3, 2026= at 1:01=E2=80=AFPM Jeff Davis <pgs= ql@j-davis.com> wrote:
On Sat, 2026-02-28 = at 14:27 +0100, Daniel Verite wrote:
> I tried 0001 with a non-UTF8 database and got quickly stuck:

Attached new versions. I moved the encoding check into the SQL-callable
casefold() function, and other callers use str_casefold(). That
slightly simplifies what happens in ILIKE, also.

I removed the citext changes. citext has somewhat of a legacy status, I
think, so I'm not sure it makes sense to try to modernize or change it.=
Also, some SQL-language functions in citext use LOWER(), so the changes
aren't enough: we'd need to make the SQL CASEFOLD function callable= in
other encodings, and also run a citext upgrade script to change the
definitions.

Note that these changes affect the result of some expressions (e.g.
ILIKE), so could theoretically make an expression index or predicate
index inconsistent.

Thanks for the patc= hes!

After v2-0001, ILIKE uses str_casefold() for = matching, but pg_trgm still
uses str_tolower() for trigram extraction (t= rgm_op.c:352 and :948).
With builtin collations, these produce different= results.

--0000000000002ade5f064d945246-- --0000000000002ade60064d945248 Content-Type: application/octet-stream; name="WIP-v3-0001-Demonstrate-inconsistency-in-gin-index-vs-seq-sca.patch-WIP" Content-Disposition: attachment; filename="WIP-v3-0001-Demonstrate-inconsistency-in-gin-index-vs-seq-sca.patch-WIP" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn16nugu0 RnJvbSBkNjI2OGQwM2MzZDhjYmQzNDBiYTRhOGZiZjU4OGE5NGI4MmQ0YWQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJrIERpbGdlciA8bWFyay5kaWxnZXJAZW50ZXJwcmlzZWRi LmNvbT4KRGF0ZTogU2F0LCAyMSBNYXIgMjAyNiAyMDoxMToyNiAtMDcwMApTdWJqZWN0OiBbUEFU Q0ggdjNdIERlbW9uc3RyYXRlIGluY29uc2lzdGVuY3kgaW4gZ2luIGluZGV4IHZzIHNlcSBzY2Fu Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYt OApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CgpBZnRlciAwMDAxLCBJTElLRSB1c2Vz IHN0cl9jYXNlZm9sZCgpIGZvciBtYXRjaGluZywgYnV0IHBnX3RyZ20gc3RpbGwKdXNlcyBzdHJf dG9sb3dlcigpIGZvciB0cmlncmFtIGV4dHJhY3Rpb24gKHRyZ21fb3AuYzozNTIgYW5kIDo5NDgp LgpXaXRoIGJ1aWx0aW4gY29sbGF0aW9ucywgdGhlc2UgcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0 czoKCiAgICBzdHJfY2FzZWZvbGQoJ8+CJykgPSAnz4MnICAgKEdyZWVrIGZpbmFsIHNpZ21hIGZv bGRzIHRvIHJlZ3VsYXIgc2lnbWEpCiAgICBzdHJfdG9sb3dlcignz4InKSAgPSAnz4InICAgKGFs cmVhZHkgbG93ZXJjYXNlLCBubyBjaGFuZ2UpCgpUaGUgR0lOIGNvbnNpc3RlbnQgZnVuY3Rpb24g KHRyZ21fZ2luLmM6MjI4LTIzNikgcmVxdWlyZXMgQUxMIHBhdHRlcm4KdHJpZ3JhbXMgdG8gYmUg cHJlc2VudCBpbiB0aGUgaW5kZXguICBXaGVuIHRoZSBkYXRhIGNvbnRhaW5zICfPgicgYnV0IHRo ZQpwYXR0ZXJuIGNvbnRhaW5zICfPgycgKG9yIHZpY2UgdmVyc2EpLCB0aGUgdHJpZ3JhbXMgZXh0 cmFjdGVkIGJ5CnN0cl90b2xvd2VyIHdvbid0IG1hdGNoLCBzbyB0aGUgR0lOIGZpbHRlciByZWpl Y3RzIHRoZSByb3cgYmVmb3JlCnJlY2hlY2sgcnVucy4gIFNlcXVlbnRpYWwgc2NhbiBmaW5kcyBp dDsgaW5kZXggc2NhbiBkb2VzIG5vdC4KLS0tCiBjb250cmliL3BnX3RyZ20vTWFrZWZpbGUgICAg ICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIC4uLi9leHBlY3RlZC9wZ190cmdtX2lsaWtlX2Zh bHNlX25lZ2F0aXZlLm91dCB8IDEzNSArKysrKysrKysrKysrKysrKysKIGNvbnRyaWIvcGdfdHJn bS9tZXNvbi5idWlsZCAgICAgICAgICAgICAgICAgICB8ICAgMSArCiAuLi4vc3FsL3BnX3RyZ21f aWxpa2VfZmFsc2VfbmVnYXRpdmUuc3FsICAgICAgfCAxMTggKysrKysrKysrKysrKysrCiA0IGZp bGVzIGNoYW5nZWQsIDI1NSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9k ZSAxMDA2NDQgY29udHJpYi9wZ190cmdtL2V4cGVjdGVkL3BnX3RyZ21faWxpa2VfZmFsc2VfbmVn YXRpdmUub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgY29udHJpYi9wZ190cmdtL3NxbC9wZ190cmdt X2lsaWtlX2ZhbHNlX25lZ2F0aXZlLnNxbAoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfdHJnbS9N YWtlZmlsZSBiL2NvbnRyaWIvcGdfdHJnbS9NYWtlZmlsZQppbmRleCBjMTc1Njk5M2VjNy4uYjBl NjgyMjhmMDAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfdHJnbS9NYWtlZmlsZQorKysgYi9jb250 cmliL3BnX3RyZ20vTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAgREFUQSA9IHBnX3RyZ20tLTEu NS0tMS42LnNxbCBwZ190cmdtLS0xLjQtLTEuNS5zcWwgcGdfdHJnbS0tMS4zLS0xLjQuc3FsIFwK IAlwZ190cmdtLS0xLjAtLTEuMS5zcWwKIFBHRklMRURFU0MgPSAicGdfdHJnbSAtIHRyaWdyYW0g bWF0Y2hpbmciCiAKLVJFR1JFU1MgPSBwZ190cmdtIHBnX3V0ZjhfdHJnbSBwZ193b3JkX3RyZ20g cGdfc3RyaWN0X3dvcmRfdHJnbQorUkVHUkVTUyA9IHBnX3RyZ20gcGdfdXRmOF90cmdtIHBnX3dv cmRfdHJnbSBwZ19zdHJpY3Rfd29yZF90cmdtIHBnX3RyZ21faWxpa2VfZmFsc2VfbmVnYXRpdmUK IAogaWZkZWYgVVNFX1BHWFMKIFBHX0NPTkZJRyA9IHBnX2NvbmZpZwpkaWZmIC0tZ2l0IGEvY29u dHJpYi9wZ190cmdtL2V4cGVjdGVkL3BnX3RyZ21faWxpa2VfZmFsc2VfbmVnYXRpdmUub3V0IGIv Y29udHJpYi9wZ190cmdtL2V4cGVjdGVkL3BnX3RyZ21faWxpa2VfZmFsc2VfbmVnYXRpdmUub3V0 Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40Y2QyYjY1OWE4OQotLS0g L2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdfdHJnbS9leHBlY3RlZC9wZ190cmdtX2lsaWtlX2Zh bHNlX25lZ2F0aXZlLm91dApAQCAtMCwwICsxLDEzNSBAQAorLS0KKy0tIERlbW9uc3RyYXRpb24g dGhhdCBwZ190cmdtIEdJTiBpbmRleGVzIGNhbiBwcm9kdWNlIGZhbHNlIG5lZ2F0aXZlcworLS0g d2l0aCBJTElLRSBhZnRlciBJTElLRSBzd2l0Y2hlcyBmcm9tIHN0cl90b2xvd2VyIHRvIHN0cl9j YXNlZm9sZC4KKy0tCistLSBwZ190cmdtIGV4dHJhY3RzIHRyaWdyYW1zIHVzaW5nIHN0cl90b2xv d2VyIHdpdGggREVGQVVMVF9DT0xMQVRJT05fT0lECistLSAodHJnbV9vcC5jOjM1MiwgOjk0OCku ICBBZnRlciB0aGUgcGF0Y2gsIElMSUtFIG1hdGNoZXMgdXNpbmcKKy0tIHN0cl9jYXNlZm9sZCB3 aXRoIERFRkFVTFRfQ09MTEFUSU9OX09JRC4gIEZvciBidWlsdGluIGNvbGxhdGlvbnMsCistLSBj YXNlZm9sZCgnz4InKSA9ICfPgycgYnV0IHRvbG93ZXIoJ8+CJykgPSAnz4InLiAgVGhlIEdJTiBj b25zaXN0ZW50CistLSBmdW5jdGlvbiByZXF1aXJlcyBBTEwgcGF0dGVybiB0cmlncmFtcyB0byBi ZSBwcmVzZW50LCBzbyBhbnkKKy0tIG1pc21hdGNoZWQgdHJpZ3JhbSBjYXVzZXMgdGhlIHJvdyB0 byBiZSByZWplY3RlZCBiZWZvcmUgcmVjaGVjay4KKy0tCistLSBUaGlzIHJlcXVpcmVzIGEgZGF0 YWJhc2Ugd2hvc2UgZGVmYXVsdCBjb2xsYXRpb24gdXNlcyB0aGUgYnVpbHRpbgorLS0gcHJvdmlk ZXIuICBXZSBjcmVhdGUgb25lIHdpdGhpbiB0aGUgdGVzdC4KKy0tCistLSBza2lwIGlmIG5vdCBV VEY4CitTRUxFQ1QgZ2V0ZGF0YWJhc2VlbmNvZGluZygpIDw+ICdVVEY4JyBBUyBza2lwX3Rlc3Qg XGdzZXQKK1xpZiA6c2tpcF90ZXN0CitccXVpdAorXGVuZGlmCitDUkVBVEUgREFUQUJBU0UgdGVz dF90cmdtX2J1aWx0aW4KKyAgTE9DQUxFX1BST1ZJREVSPWJ1aWx0aW4KKyAgQlVJTFRJTl9MT0NB TEU9J0MuVVRGLTgnCisgIEVOQ09ESU5HPSdVVEY4JworICBURU1QTEFURT10ZW1wbGF0ZTA7Citc YyB0ZXN0X3RyZ21fYnVpbHRpbgorQ1JFQVRFIEVYVEVOU0lPTiBwZ190cmdtOworU0VUIGNsaWVu dF9lbmNvZGluZyBUTyBVVEY4OworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBTZXR1cDogdGFibGUgd2l0aCBHcmVlayBz aWdtYSB2YXJpYW50cyBwbHVzIGZpbGxlciByb3dzCistLSB0byBlbnN1cmUgdGhlIHBsYW5uZXIg cHJlZmVycyB0aGUgR0lOIGluZGV4LgorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDUkVBVEUgVEFCTEUgdGVzdF90cmdtX3Np Z21hICh0IHRleHQpOworSU5TRVJUIElOVE8gdGVzdF90cmdtX3NpZ21hIFZBTFVFUyAoJ2FiY8+C ZGVmZ2gnKTsgICAtLSBmaW5hbCBzaWdtYSBVKzAzQzIKK0lOU0VSVCBJTlRPIHRlc3RfdHJnbV9z aWdtYSBWQUxVRVMgKCdhYmPPg2RlZmdoJyk7ICAgLS0gcmVndWxhciBzaWdtYSBVKzAzQzMKK0lO U0VSVCBJTlRPIHRlc3RfdHJnbV9zaWdtYQorICBTRUxFQ1QgJ3JvdycgfHwgZyB8fCByZXBlYXQo J3gnLCAyMCkKKyAgICBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwKSBnOworQ1JFQVRFIElO REVYIHRlc3RfdHJnbV9zaWdtYV9naW4gT04gdGVzdF90cmdtX3NpZ21hIFVTSU5HIGdpbiAodCBn aW5fdHJnbV9vcHMpOworQU5BTFlaRSB0ZXN0X3RyZ21fc2lnbWE7CistLSA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIFZlcmlm eSB0aGUgcGxhbm5lciB1c2VzIHRoZSBHSU4gaW5kZXggKG5vIENPTExBVEUgb3ZlcnJpZGUsCist LSBzbyB0aGUgZGVmYXVsdCBidWlsdGluIGNvbGxhdGlvbiBpcyB1c2VkIHRocm91Z2hvdXQpLgor LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CitTRVQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CitFWFBMQUlOIChDT1NUUyBPRkYpCitT RUxFQ1QgdCBGUk9NIHRlc3RfdHJnbV9zaWdtYSBXSEVSRSB0IElMSUtFICclYWJjz4NkZWZnaCUn OworICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEJpdG1hcCBI ZWFwIFNjYW4gb24gdGVzdF90cmdtX3NpZ21hCisgICBSZWNoZWNrIENvbmQ6ICh0IH5+KiAnJWFi Y8+DZGVmZ2glJzo6dGV4dCkKKyAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZXN0X3RyZ21f c2lnbWFfZ2luCisgICAgICAgICBJbmRleCBDb25kOiAodCB+fiogJyVhYmPPg2RlZmdoJSc6OnRl eHQpCisoNCByb3dzKQorCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIFRlc3QgMTogU2VxdWVudGlhbCBzY2FuLgorLS0K Ky0tIHN0cl9jYXNlZm9sZCB3aXRoIHRoZSBidWlsdGluIGRlZmF1bHQgY29sbGF0aW9uIG1hcHMg z4LihpLPgywKKy0tIHNvICdhYmPPgmRlZmdoJyBtYXRjaGVzIHBhdHRlcm4gJyVhYmPPg2RlZmdo JScuCistLSBCb3RoIHNpZ21hIHJvd3Mgc2hvdWxkIGJlIHJldHVybmVkLgorLS0gPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTRVQg ZW5hYmxlX3NlcXNjYW4gPSBvbjsKK1NFVCBlbmFibGVfaW5kZXhzY2FuID0gb2ZmOworU0VUIGVu YWJsZV9iaXRtYXBzY2FuID0gb2ZmOworU0VMRUNUIHQgRlJPTSB0ZXN0X3RyZ21fc2lnbWEgV0hF UkUgdCBJTElLRSAnJWFiY8+DZGVmZ2glJyBPUkRFUiBCWSB0OworICAgICB0ICAgICAKKy0tLS0t LS0tLS0tCisgYWJjz4JkZWZnaAorIGFiY8+DZGVmZ2gKKygyIHJvd3MpCisKKy0tID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0g VGVzdCAyOiBHSU4gaW5kZXggc2Nhbi4KKy0tCistLSBwZ190cmdtJ3MgdHJpZ3JhbXMgZm9yIGRh dGEgJ2FiY8+CZGVmZ2gnIHdlcmUgZXh0cmFjdGVkIHZpYQorLS0gc3RyX3RvbG93ZXIoREVGQVVM VF9DT0xMQVRJT05fT0lEKS4gIFdpdGggdGhlIGJ1aWx0aW4gY29sbGF0aW9uLAorLS0gdG9sb3dl cignz4InKSA9ICfPgicsIHByb2R1Y2luZyB0cmlncmFtcyAnYmPPgicsJ2PPgmQnLCfPgmRlJy4K Ky0tIFRoZSBwYXR0ZXJuIHRyaWdyYW1zIGFyZSBleHRyYWN0ZWQgdmlhIHN0cl90b2xvd2VyKCdh YmPPg2RlZmdoJyksCistLSBwcm9kdWNpbmcgJ2Jjz4MnLCdjz4NkJywnz4NkZScuICBUaGVzZSBk b24ndCBtYXRjaCB0aGUgz4ItYmFzZWQKKy0tIHRyaWdyYW1zIGluIHRoZSBpbmRleCwgc28gdGhl IEdJTiBmaWx0ZXIgcmVqZWN0cyB0aGUgz4Igcm93LgorLS0KKy0tIElmIHRoaXMgcmV0dXJucyBm ZXdlciByb3dzIHRoYW4gVGVzdCAxLCB0aGF0J3MgYSBmYWxzZSBuZWdhdGl2ZToKKy0tIHRoZSBp bmRleCBzY2FuIG1pc3NlZCBhIHJvdyB0aGUgb3BlcmF0b3Igd291bGQgaGF2ZSBtYXRjaGVkLgor LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CitTRVQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CitTRVQgZW5hYmxlX2luZGV4c2NhbiA9 IG9uOworU0VUIGVuYWJsZV9iaXRtYXBzY2FuID0gb247CitTRUxFQ1QgdCBGUk9NIHRlc3RfdHJn bV9zaWdtYSBXSEVSRSB0IElMSUtFICclYWJjz4NkZWZnaCUnIE9SREVSIEJZIHQ7CisgICAgIHQg ICAgIAorLS0tLS0tLS0tLS0KKyBhYmPPg2RlZmdoCisoMSByb3cpCisKKy0tID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gVGVz dCAzOiBSZXZlcnNlIOKAlCBmaW5hbCBzaWdtYSAoz4IpIGluIHBhdHRlcm4uCistLSBTYW1lIGlz c3VlLCBvcHBvc2l0ZSBkaXJlY3Rpb24uCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1NFVCBlbmFibGVfc2Vxc2NhbiA9IG9u OworU0VUIGVuYWJsZV9pbmRleHNjYW4gPSBvZmY7CitTRVQgZW5hYmxlX2JpdG1hcHNjYW4gPSBv ZmY7CitTRUxFQ1QgdCBGUk9NIHRlc3RfdHJnbV9zaWdtYSBXSEVSRSB0IElMSUtFICclYWJjz4Jk ZWZnaCUnIE9SREVSIEJZIHQ7CisgICAgIHQgICAgIAorLS0tLS0tLS0tLS0KKyBhYmPPgmRlZmdo CisgYWJjz4NkZWZnaAorKDIgcm93cykKKworU0VUIGVuYWJsZV9zZXFzY2FuID0gb2ZmOworU0VU IGVuYWJsZV9pbmRleHNjYW4gPSBvbjsKK1NFVCBlbmFibGVfYml0bWFwc2NhbiA9IG9uOworU0VM RUNUIHQgRlJPTSB0ZXN0X3RyZ21fc2lnbWEgV0hFUkUgdCBJTElLRSAnJWFiY8+CZGVmZ2glJyBP UkRFUiBCWSB0OworICAgICB0ICAgICAKKy0tLS0tLS0tLS0tCisgYWJjz4JkZWZnaAorKDEgcm93 KQorCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KKy0tIFNhbml0eSBjaGVjazogQVNDSUkgSUxJS0Ugd2l0aCBHSU4gd29ya3Mg Y29ycmVjdGx5LgorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09CitTRUxFQ1QgdCBGUk9NIHRlc3RfdHJnbV9zaWdtYSBXSEVSRSB0 IElMSUtFICclREVGR0glJyBPUkRFUiBCWSB0OworICAgICB0ICAgICAKKy0tLS0tLS0tLS0tCisg YWJjz4JkZWZnaAorIGFiY8+DZGVmZ2gKKygyIHJvd3MpCisKKy0tID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gQ2xlYW51cAor LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CitSRVNFVCBlbmFibGVfc2Vxc2NhbjsKK1JFU0VUIGVuYWJsZV9pbmRleHNjYW47CitS RVNFVCBlbmFibGVfYml0bWFwc2NhbjsKK0RST1AgVEFCTEUgdGVzdF90cmdtX3NpZ21hOworXGMg Y29udHJpYl9yZWdyZXNzaW9uCitEUk9QIERBVEFCQVNFIHRlc3RfdHJnbV9idWlsdGluOwpkaWZm IC0tZ2l0IGEvY29udHJpYi9wZ190cmdtL21lc29uLmJ1aWxkIGIvY29udHJpYi9wZ190cmdtL21l c29uLmJ1aWxkCmluZGV4IDNlY2Y5NWJhODYyLi44MDhmYTViZDBhZCAxMDA2NDQKLS0tIGEvY29u dHJpYi9wZ190cmdtL21lc29uLmJ1aWxkCisrKyBiL2NvbnRyaWIvcGdfdHJnbS9tZXNvbi5idWls ZApAQCAtNDIsNiArNDIsNyBAQCB0ZXN0cyArPSB7CiAgICAgICAncGdfdXRmOF90cmdtJywKICAg ICAgICdwZ193b3JkX3RyZ20nLAogICAgICAgJ3BnX3N0cmljdF93b3JkX3RyZ20nLAorICAgICAg J3BnX3RyZ21faWxpa2VfZmFsc2VfbmVnYXRpdmUnLAogICAgIF0sCiAgIH0sCiB9CmRpZmYgLS1n aXQgYS9jb250cmliL3BnX3RyZ20vc3FsL3BnX3RyZ21faWxpa2VfZmFsc2VfbmVnYXRpdmUuc3Fs IGIvY29udHJpYi9wZ190cmdtL3NxbC9wZ190cmdtX2lsaWtlX2ZhbHNlX25lZ2F0aXZlLnNxbApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYTBiZjIyYzBkZDQKLS0tIC9k ZXYvbnVsbAorKysgYi9jb250cmliL3BnX3RyZ20vc3FsL3BnX3RyZ21faWxpa2VfZmFsc2VfbmVn YXRpdmUuc3FsCkBAIC0wLDAgKzEsMTE4IEBACistLQorLS0gRGVtb25zdHJhdGlvbiB0aGF0IHBn X3RyZ20gR0lOIGluZGV4ZXMgY2FuIHByb2R1Y2UgZmFsc2UgbmVnYXRpdmVzCistLSB3aXRoIElM SUtFIGFmdGVyIElMSUtFIHN3aXRjaGVzIGZyb20gc3RyX3RvbG93ZXIgdG8gc3RyX2Nhc2Vmb2xk LgorLS0KKy0tIHBnX3RyZ20gZXh0cmFjdHMgdHJpZ3JhbXMgdXNpbmcgc3RyX3RvbG93ZXIgd2l0 aCBERUZBVUxUX0NPTExBVElPTl9PSUQKKy0tICh0cmdtX29wLmM6MzUyLCA6OTQ4KS4gIEFmdGVy IHRoZSBwYXRjaCwgSUxJS0UgbWF0Y2hlcyB1c2luZworLS0gc3RyX2Nhc2Vmb2xkIHdpdGggREVG QVVMVF9DT0xMQVRJT05fT0lELiAgRm9yIGJ1aWx0aW4gY29sbGF0aW9ucywKKy0tIGNhc2Vmb2xk KCfPgicpID0gJ8+DJyBidXQgdG9sb3dlcignz4InKSA9ICfPgicuICBUaGUgR0lOIGNvbnNpc3Rl bnQKKy0tIGZ1bmN0aW9uIHJlcXVpcmVzIEFMTCBwYXR0ZXJuIHRyaWdyYW1zIHRvIGJlIHByZXNl bnQsIHNvIGFueQorLS0gbWlzbWF0Y2hlZCB0cmlncmFtIGNhdXNlcyB0aGUgcm93IHRvIGJlIHJl amVjdGVkIGJlZm9yZSByZWNoZWNrLgorLS0KKy0tIFRoaXMgcmVxdWlyZXMgYSBkYXRhYmFzZSB3 aG9zZSBkZWZhdWx0IGNvbGxhdGlvbiB1c2VzIHRoZSBidWlsdGluCistLSBwcm92aWRlci4gIFdl IGNyZWF0ZSBvbmUgd2l0aGluIHRoZSB0ZXN0LgorLS0KKworLS0gc2tpcCBpZiBub3QgVVRGOAor U0VMRUNUIGdldGRhdGFiYXNlZW5jb2RpbmcoKSA8PiAnVVRGOCcgQVMgc2tpcF90ZXN0IFxnc2V0 CitcaWYgOnNraXBfdGVzdAorXHF1aXQKK1xlbmRpZgorCitDUkVBVEUgREFUQUJBU0UgdGVzdF90 cmdtX2J1aWx0aW4KKyAgTE9DQUxFX1BST1ZJREVSPWJ1aWx0aW4KKyAgQlVJTFRJTl9MT0NBTEU9 J0MuVVRGLTgnCisgIEVOQ09ESU5HPSdVVEY4JworICBURU1QTEFURT10ZW1wbGF0ZTA7CisKK1xj IHRlc3RfdHJnbV9idWlsdGluCisKK0NSRUFURSBFWFRFTlNJT04gcGdfdHJnbTsKKworU0VUIGNs aWVudF9lbmNvZGluZyBUTyBVVEY4OworCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIFNldHVwOiB0YWJsZSB3aXRoIEdy ZWVrIHNpZ21hIHZhcmlhbnRzIHBsdXMgZmlsbGVyIHJvd3MKKy0tIHRvIGVuc3VyZSB0aGUgcGxh bm5lciBwcmVmZXJzIHRoZSBHSU4gaW5kZXguCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NSRUFURSBUQUJMRSB0ZXN0X3Ry Z21fc2lnbWEgKHQgdGV4dCk7CitJTlNFUlQgSU5UTyB0ZXN0X3RyZ21fc2lnbWEgVkFMVUVTICgn YWJjz4JkZWZnaCcpOyAgIC0tIGZpbmFsIHNpZ21hIFUrMDNDMgorSU5TRVJUIElOVE8gdGVzdF90 cmdtX3NpZ21hIFZBTFVFUyAoJ2FiY8+DZGVmZ2gnKTsgICAtLSByZWd1bGFyIHNpZ21hIFUrMDND MworSU5TRVJUIElOVE8gdGVzdF90cmdtX3NpZ21hCisgIFNFTEVDVCAncm93JyB8fCBnIHx8IHJl cGVhdCgneCcsIDIwKQorICAgIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDApIGc7CitDUkVB VEUgSU5ERVggdGVzdF90cmdtX3NpZ21hX2dpbiBPTiB0ZXN0X3RyZ21fc2lnbWEgVVNJTkcgZ2lu ICh0IGdpbl90cmdtX29wcyk7CitBTkFMWVpFIHRlc3RfdHJnbV9zaWdtYTsKKworLS0gPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSBWZXJpZnkgdGhlIHBsYW5uZXIgdXNlcyB0aGUgR0lOIGluZGV4IChubyBDT0xMQVRFIG92ZXJy aWRlLAorLS0gc28gdGhlIGRlZmF1bHQgYnVpbHRpbiBjb2xsYXRpb24gaXMgdXNlZCB0aHJvdWdo b3V0KS4KKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQorU0VUIGVuYWJsZV9zZXFzY2FuID0gb2ZmOworCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgdCBGUk9NIHRlc3RfdHJnbV9zaWdtYSBXSEVSRSB0IElMSUtFICclYWJj z4NkZWZnaCUnOworCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKy0tIFRlc3QgMTogU2VxdWVudGlhbCBzY2FuLgorLS0KKy0t IHN0cl9jYXNlZm9sZCB3aXRoIHRoZSBidWlsdGluIGRlZmF1bHQgY29sbGF0aW9uIG1hcHMgz4Li hpLPgywKKy0tIHNvICdhYmPPgmRlZmdoJyBtYXRjaGVzIHBhdHRlcm4gJyVhYmPPg2RlZmdoJScu CistLSBCb3RoIHNpZ21hIHJvd3Mgc2hvdWxkIGJlIHJldHVybmVkLgorLS0gPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTRVQgZW5h YmxlX3NlcXNjYW4gPSBvbjsKK1NFVCBlbmFibGVfaW5kZXhzY2FuID0gb2ZmOworU0VUIGVuYWJs ZV9iaXRtYXBzY2FuID0gb2ZmOworCitTRUxFQ1QgdCBGUk9NIHRlc3RfdHJnbV9zaWdtYSBXSEVS RSB0IElMSUtFICclYWJjz4NkZWZnaCUnIE9SREVSIEJZIHQ7CisKKy0tID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gVGVzdCAy OiBHSU4gaW5kZXggc2Nhbi4KKy0tCistLSBwZ190cmdtJ3MgdHJpZ3JhbXMgZm9yIGRhdGEgJ2Fi Y8+CZGVmZ2gnIHdlcmUgZXh0cmFjdGVkIHZpYQorLS0gc3RyX3RvbG93ZXIoREVGQVVMVF9DT0xM QVRJT05fT0lEKS4gIFdpdGggdGhlIGJ1aWx0aW4gY29sbGF0aW9uLAorLS0gdG9sb3dlcignz4In KSA9ICfPgicsIHByb2R1Y2luZyB0cmlncmFtcyAnYmPPgicsJ2PPgmQnLCfPgmRlJy4KKy0tIFRo ZSBwYXR0ZXJuIHRyaWdyYW1zIGFyZSBleHRyYWN0ZWQgdmlhIHN0cl90b2xvd2VyKCdhYmPPg2Rl ZmdoJyksCistLSBwcm9kdWNpbmcgJ2Jjz4MnLCdjz4NkJywnz4NkZScuICBUaGVzZSBkb24ndCBt YXRjaCB0aGUgz4ItYmFzZWQKKy0tIHRyaWdyYW1zIGluIHRoZSBpbmRleCwgc28gdGhlIEdJTiBm aWx0ZXIgcmVqZWN0cyB0aGUgz4Igcm93LgorLS0KKy0tIElmIHRoaXMgcmV0dXJucyBmZXdlciBy b3dzIHRoYW4gVGVzdCAxLCB0aGF0J3MgYSBmYWxzZSBuZWdhdGl2ZToKKy0tIHRoZSBpbmRleCBz Y2FuIG1pc3NlZCBhIHJvdyB0aGUgb3BlcmF0b3Igd291bGQgaGF2ZSBtYXRjaGVkLgorLS0gPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CitTRVQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CitTRVQgZW5hYmxlX2luZGV4c2NhbiA9IG9uOwor U0VUIGVuYWJsZV9iaXRtYXBzY2FuID0gb247CisKK1NFTEVDVCB0IEZST00gdGVzdF90cmdtX3Np Z21hIFdIRVJFIHQgSUxJS0UgJyVhYmPPg2RlZmdoJScgT1JERVIgQlkgdDsKKworLS0gPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSBUZXN0IDM6IFJldmVyc2Ug4oCUIGZpbmFsIHNpZ21hICjPgikgaW4gcGF0dGVybi4KKy0tIFNh bWUgaXNzdWUsIG9wcG9zaXRlIGRpcmVjdGlvbi4KKy0tID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorU0VUIGVuYWJsZV9zZXFzY2Fu ID0gb247CitTRVQgZW5hYmxlX2luZGV4c2NhbiA9IG9mZjsKK1NFVCBlbmFibGVfYml0bWFwc2Nh biA9IG9mZjsKKworU0VMRUNUIHQgRlJPTSB0ZXN0X3RyZ21fc2lnbWEgV0hFUkUgdCBJTElLRSAn JWFiY8+CZGVmZ2glJyBPUkRFUiBCWSB0OworCitTRVQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CitT RVQgZW5hYmxlX2luZGV4c2NhbiA9IG9uOworU0VUIGVuYWJsZV9iaXRtYXBzY2FuID0gb247CisK K1NFTEVDVCB0IEZST00gdGVzdF90cmdtX3NpZ21hIFdIRVJFIHQgSUxJS0UgJyVhYmPPgmRlZmdo JScgT1JERVIgQlkgdDsKKworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CistLSBTYW5pdHkgY2hlY2s6IEFTQ0lJIElMSUtFIHdp dGggR0lOIHdvcmtzIGNvcnJlY3RseS4KKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorU0VMRUNUIHQgRlJPTSB0ZXN0X3RyZ21f c2lnbWEgV0hFUkUgdCBJTElLRSAnJURFRkdIJScgT1JERVIgQlkgdDsKKworLS0gPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBD bGVhbnVwCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KK1JFU0VUIGVuYWJsZV9zZXFzY2FuOworUkVTRVQgZW5hYmxlX2luZGV4 c2NhbjsKK1JFU0VUIGVuYWJsZV9iaXRtYXBzY2FuOworRFJPUCBUQUJMRSB0ZXN0X3RyZ21fc2ln bWE7CisKK1xjIGNvbnRyaWJfcmVncmVzc2lvbgorRFJPUCBEQVRBQkFTRSB0ZXN0X3RyZ21fYnVp bHRpbjsKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --0000000000002ade60064d945248--