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 1vrKua-00FfoE-0t for pgsql-bugs@arkaria.postgresql.org; Sat, 14 Feb 2026 19:02:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vrKuX-0004jU-0q for pgsql-bugs@arkaria.postgresql.org; Sat, 14 Feb 2026 19:02:33 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vrKuW-0004jF-2s for pgsql-bugs@lists.postgresql.org; Sat, 14 Feb 2026 19:02:32 +0000 Received: from mail-dl1-x1230.google.com ([2607:f8b0:4864:20::1230]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vrKuT-00000000gJh-3tX8 for pgsql-bugs@lists.postgresql.org; Sat, 14 Feb 2026 19:02:32 +0000 Received: by mail-dl1-x1230.google.com with SMTP id a92af1059eb24-1273c690e5bso86309c88.2 for ; Sat, 14 Feb 2026 11:02:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771095747; cv=none; d=google.com; s=arc-20240605; b=d6I+1+6li/eFAipSgaEKVye9T8W+dHqnIcCMqF7V0x6MeZgLV7HbgTdlpr57+r/DTx V8QW1GX0Fq05vNp4Evc3HXcjBeEqXcInN+1A6loj4ezTJpSm/dvqfTWHIeWMBIvkLaxD 5sN8A+5Cuek2FlT3Uw4urSZKCu139g+0HYzCQ8kPKIil7aC38pATQh/gD7YixQfsmGxr oLy4bqHEzICkCjrE2mw+Gpw+Ft8CexYK7n0qfcIHQexA6F3QAlGDJktftVW/nE5Yk3fg yyWClqvVrMkeo4G/zk6eLCFyuUXyT7xl8qLXKgzi2SgYLavtu5Sy3YP0seIflqCwgiy0 6d5Q== 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=AbqS235nyKtldopxjEgz6sG1EclNiYwRIduMq1BFi98=; fh=bFJjCe2J7O66xErRb02ZJHl47mrPGy7nSRwM8HGfxl0=; b=ZsSNMByP5x87AqpOOxTXfiFDl+/u/uocemTARGftGsFVcFbuxp3uJ8x3QFKQMzZZzF HYAsiLG+7h5uo3WStl6+Aa3uCC5LIBcqHSQb7gFkrGRczlyyqq69P3kmXAV9Rr5x0g38 qhbQgONZAeM3qSDsuQ6cI7w6cxgaM78B9eNF7jb1k4xHwTLhjWc1Ct6TrPTfjulizdGz k0XeAMEPvjSG+te9QGGp77aHknsvcdyz+p4qGVE7kmcbFLBEjKsb1LJ3n6ysERCE0lvE rKTtrSPPbAS4S/VLCT5EnaBdiOdui/yKTUKsvdgE6L2OfxMxqeVhlZmxDBa+SPUGQvjW 6UgA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771095747; x=1771700547; darn=lists.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=AbqS235nyKtldopxjEgz6sG1EclNiYwRIduMq1BFi98=; b=ZmBIS4r9u2hYHW9UhHCtawW8f+pg5i+8HncqrP60e1LC3a6Vt0Z+dQPoEof2neGqCi 8SLugpi1LolJK02PCvUmHs4SC9hWMTtgeNTHzK/c71nJ9oA/cFkVhF5YD0dgPtNF2+Cx 8xFDiKtZQJN0NSjB2B5k9uoJG6NfWRQzpIBXatk4ZX22j72hlkzORYBE5ZQXCM6+D7GR sOr3fhAzI10sZqxbmj5s3HUANtNlGYeITRYdH9JbQOGFlkDazRLMn3ASO7xgSXiQdvbw aOvf/OmPhNIGctx0NJphnzqhCzCI2JDKTFjFuDJva+h3vnfNg88sFsM56xhaCLLh2xcN O71g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771095747; x=1771700547; 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=AbqS235nyKtldopxjEgz6sG1EclNiYwRIduMq1BFi98=; b=stfKMsRYCGjy6ez5d9hatdYpfNqq+qeFgHhzRRbxbFiozyDCjBxGQ7c6M1WEAA3Jxe zst0cy/ZYNWC3RFcvkKqPqWyqhg+sMmw50IBEWK58fQl9YV1oYrO8CUq9Q+dnBisQINx jel5MMIx2zvby9MqsyJBAv6ZxlwIiVA0eHrgJ/2v35usM8x/vAljEHE9g8kmjK/b/cRP qn3CGi/NmrGvVeHU/f3+JGKeMJA5vaFlzx4CjzRvKzev0B9FPWqBlBIB6Xmgbe7j4lce zFgqhIZ+f2rDKvfJfo5x4OLGcOZQ9l1CIPsHuHczjXwGck+kNzosPs9Epkz53R+M8UfV O/xA== X-Forwarded-Encrypted: i=1; AJvYcCV7CAbZ0z0CVtJgDgKEg//AzuT83WsKH+6g+W1VUC8PXDEKdlAL7j1Qukw5oMCEaOQz+Q7kn6nIURkP@lists.postgresql.org X-Gm-Message-State: AOJu0Yw/Z/785nA2wUVLdx+ofhzOfWl8mrCA6wCCqv5uL95YgEtyBroi gl9QVKsJvAv7yVlrn/aAfTYYpW8fr1T6VV4ES3cXEUa2MVIPZMh34YMGXHzXvSNedw3ZrVfA8hN CcQANJDaxbdgjIDhqAt6K+5GlkCxTDC4= X-Gm-Gg: AZuq6aIcO0oqfQoigkA9yATnAhPkC2nUz6NQ+IajnVJZGWzw4RIJ4zNnnmqmf7z16/1 FUCRLOxrl7Wbylodzpv6H4EVjqHbN1CFYhjF8+xZZrwlQSq0aVR6j2JXOmahhffR7aGU/m/QNrE KyHjO/hPcZjCLjHpyBEkGGoaclln2SKsilejTUgeoJu1LMfK32mKGUw0FfwDGNhQ3etqj7PyY7s 4YtwAKVxAxK3ILGq9gMbax4jvbFutQxxb7VxGlZgsW2Nv5Hu0h5lgs8RmSJQlk6Rgskd1gc1tan oxIHqBUWJHBELzh/ncvjqFZSJypjMVEOr2os7WgT01s3DB1KR6IlFu4YQd0SclU2ng== X-Received: by 2002:a05:7300:ef82:b0:2ba:7013:2b94 with SMTP id 5a478bee46e88-2baba0d9f2amr1562167eec.4.1771095747192; Sat, 14 Feb 2026 11:02:27 -0800 (PST) MIME-Version: 1.0 References: <19406-9867fddddd724fca@postgresql.org> <20260213172702.71@rfd.leadboat.com> <20260213224804.2c@rfd.leadboat.com> <20260214002113.1f.noahmisch@microsoft.com> <20260214053821.fa.noahmisch@microsoft.com> In-Reply-To: From: Thomas Munro Date: Sun, 15 Feb 2026 08:07:22 +1300 X-Gm-Features: AaiRm538joSRWkZnQQDefUNeK84y8CS2hku4pnkeR3nqJqIEjUWdtxzBYjWXBSQ Message-ID: Subject: Re: BUG #19406: substring(text) fails on valid UTF-8 toasted value in PostgreSQL 15.16 To: Noah Misch Cc: ranvis@gmail.com, pgsql-bugs@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000e06d86064acd5c40" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e06d86064acd5c40 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Feb 14, 2026 at 9:15=E2=80=AFPM Thomas Munro wrote: > On Sat, Feb 14, 2026 at 6:38=E2=80=AFPM Noah Misch wr= ote: > > [mblen-valgrind-after-report-v1.patch] > > LGTM. The new valgrind check should clearly be after the new non-local e= xit. > > Studying the other patch... /* - * Total slice size in bytes can't be any longer than the start - * position plus substring length times the encoding max length. - * If that overflows, we can just use -1. + * Total slice size in bytes can't be any longer than the + * inclusive end position times the encoding max length. If that + * overflows, we can just use -1. */ - if (pg_mul_s32_overflow(E, eml, &slice_size)) + if (pg_mul_s32_overflow(E - 1, eml, &slice_size)) slice_size =3D -1; Isn't it still conceptually "exclusive", but adjusted to be zero-indexed? /* Now we can get the actual length of the slice in MB characters */ - slice_strlen =3D pg_mbstrlen_with_len(VARDATA_ANY(slice), - slice_len); + slice_strlen =3D + (slice_size =3D=3D -1 ? + pg_mbstrlen_with_len(VARDATA_ANY(slice), slice_len= ) : + pg_mbcharcliplen_chars(VARDATA_ANY(slice), slice_len, E - 1)); Comment presumably needs adjustment to say that we only count as far as we need to, and why. There is something a bit strange about all this, though. pg_mbstrlen_with_len(..., -1) returns 0, so if you ask for characters that really exist past 2^29 (~500 million), you must get an empty string, right? That's hard to reach, pre-existing and out of scope for the immediate problem report, except ... now we're contorting the code even further to keep it. The outline I had come up with before seeing your patch was: let's just delete it. The position search can check bounds incrementally, following our general approach. This avoids the reported problem by ditching the pre-flight scan through the slice (up to 4x more pg_mblen_XXX calls and memory access than we strictly need), and also the special cases for empty strings since they already fall out of the general behaviour (am I missing something?), not leaving much code behind. As far as I can see so far, the only user-visible side-effect requires corruption: substring() moves from the internal-NUL-is-terminator category to internal-NUL-is-character category, but that's an implementation detail. When I saw your patch yesterday, I initially abandoned the thought, thinking that your idea looked more conservative, but after sleeping on it and reflecting again on these oddities, I have merged my draft implementation with your tests, ancient detoasting fence post observation and commit message, just to see if you think this approach might be worth considering further. --000000000000e06d86064acd5c40 Content-Type: application/x-patch; name="v2tm-0001-Fix-SUBSTRING-for-toasted-multibyte-characters.patch" Content-Disposition: attachment; filename="v2tm-0001-Fix-SUBSTRING-for-toasted-multibyte-characters.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlmon5dn0 RnJvbSA5ZjAzZTRkMjMzNTZlODAxMmU4YTE5MGJkZGQ4MTA1OWRjODg0NzFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOb2FoIE1pc2NoIDxub2FoQGxlYWRib2F0LmNvbT4KRGF0ZTog U2F0LCAxNCBGZWIgMjAyNiAyMTowNzozOCArMTMwMApTdWJqZWN0OiBbUEFUQ0ggdjJ0bSAxLzJd IEZpeCBTVUJTVFJJTkcoKSBmb3IgdG9hc3RlZCBtdWx0aWJ5dGUgY2hhcmFjdGVycy4KTUlNRS1W ZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKCkNvbW1pdCAxZTdmZTA2YzEwYzBhOGRhOWRkNjI2 MWE2YmU4ZDQwNWRjMTdjNzI4IGNoYW5nZWQKcGdfbWJzdHJsZW5fd2l0aF9sZW4oKSB0byBlcmVw b3J0KEVSUk9SKSBpZiB0aGUgaW5wdXQgZW5kcyBpbiBhbgppbmNvbXBsZXRlIGNoYXJhY3Rlci4g IE1vc3QgY2FsbGVycyB3YW50IHRoYXQuICB0ZXh0X3N1YnN0cmluZygpIGRpZApub3QuICBJdCBk ZXRvYXN0cyB0aGUgbW9zdCBieXRlcyBpdCBjb3VsZCBwb3NzaWJseSBuZWVkIHRvIGdldCB0aGUK cmVxdWVzdGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIHRvIGV4dHJhY3Qg dXAgdG8gMiBjaGFycwpmcm9tIFVURjgsIGl0IG5lZWRzIHRvIGRldG9hc3QgOCBieXRlcy4gIElu IGEgc3RyaW5nIG9mIDMtYnl0ZSBVVEY4CmNoYXJzLCA4IGJ5dGVzIHNwYW5zIDIgY29tcGxldGUg Y2hhcnMgYW5kIDEgcGFydGlhbCBjaGFyLgoKRml4IGJ5IHJlbW92aW5nIHRoZSBwZ19tYnN0cmxl bl93aXRoX2xlbigpIGNhbGwuICBBbiBlbmNvZGluZyBlcnJvciBpcwpzdGlsbCByYWlzZWQgaWYg aW5wdXQgcnVucyBvdXQgaW4gdGhlIG1pZGRsZSBvZiBhIG11bHRpLWJ5dGUgc2VxdWVuY2UKdGhh dCBpcyBuZWVkZWQgZm9yIHRoZSByZXN1bHQsIGJ1dCB0aGF0IGNhbiBiZSBkZXRlY3RlZCBpbmNy ZW1lbnRhbGx5LgoKVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGdlbmVyYWwgcGhpbG9zb3Bo eSBvZiB0aGUgYWJvdmUgY29tbWl0LAp3aGljaCB3YXMgdG8gcmFpc2UgZXJyb3JzIG9uIGEganVz dC1pbi10aW1lIGJhc2lzLiAgQmVmb3JlIHRoZSBhYm92ZQpjb21taXQsIFNVQlNUUklORygpIG5l dmVyIHJhaXNlZCBhbiBlbmNvZGluZyBlcnJvci4KClNVQlNUUklORygpIGhhcyBsb25nIGJlZW4g ZGV0b2FzdGluZyBlbm91Z2ggZm9yIG9uZSBtb3JlIGNoYXIgdGhhbgpuZWVkZWQsIGJlY2F1c2Ug aXQgZGlkIG5vdCBkaXN0aW5ndWlzaCBleGNsdXNpdmUgYW5kIGluY2x1c2l2ZSBlbmQKcG9zaXRp b24uICBGb3IgYXZvaWRhbmNlIG9mIGRvdWJ0LCBzdG9wIGRldG9hc3RpbmcgZXh0cmEuCgpBIGxv bmcgc3RhbmRpbmcgb3ZlcmZsb3cgYnVnIGFmZmVjdGluZyBwb3NpdGlvbnMgZXhjZWVkaW5nIDJe MjkgaXMgYWxzbwphZGRyZXNzZWQsIHRob3VnaCBzdWNoIGxhcmdlIG51bWJlcnMgd291bGQgYmUg dW5saWtlbHkgdG8gYmUgdXNlZCBpbgpyZWFsIGFwcGxpY2F0aW9ucy4KCkJhY2stcGF0Y2ggdG8g djE0LCBsaWtlIHRoZSBhYm92ZSBjb21taXQuICBGb3IgYXBwbGljYXRpb25zIHVzaW5nClNVQlNU UklORygpIG9uIG5vbi1BU0NJSSBjb2x1bW4gdmFsdWVzLCBjb25zaWRlciBhcHBseWluZyB0aGlz IHRvIHlvdXIKY29weSBvZiBhbnkgb2YgdGhlIEZlYnJ1YXJ5IDEyLCAyMDI2IHJlbGVhc2VzLgoK UmVwb3J0ZWQtYnk6IFNBVMWMIEtlbnRhcsWNIDxyYW52aXNAZ21haWwuY29tPgpSZXZpZXdlZC1i eTogRklYTUUKQnVnOiAjMTk0MDYKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS8xOTQw Ni05ODY3ZmRkZGRkNzI0ZmNhQHBvc3RncmVzcWwub3JnCkJhY2twYXRjaC10aHJvdWdoOiAxNAot LS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC92YXJsZW5hLmMgICAgICAgIHwgMTAzICsrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZW5jb2Rpbmcub3V0 IHwgIDcyICsrKysrKysrKysrKy0tLS0tCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9lbmNvZGluZy5z cWwgICAgICB8ICAyNiArKysrKy0tCiAzIGZpbGVzIGNoYW5nZWQsIDEwMiBpbnNlcnRpb25zKCsp LCA5OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvdmFy bGVuYS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3ZhcmxlbmEuYwppbmRleCBkYmVjZDcxNjBk Ni4uNWUzOTUxYWIwZTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC92YXJsZW5h LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3ZhcmxlbmEuYwpAQCAtNTg2LDcgKzU4Niw3 IEBAIHRleHRfc3Vic3RyaW5nKERhdHVtIHN0ciwgaW50MzIgc3RhcnQsIGludDMyIGxlbmd0aCwg Ym9vbCBsZW5ndGhfbm90X3NwZWNpZmllZCkKIAlpbnQzMgkJUyA9IHN0YXJ0OwkJLyogc3RhcnQg cG9zaXRpb24gKi8KIAlpbnQzMgkJUzE7CQkJCS8qIGFkanVzdGVkIHN0YXJ0IHBvc2l0aW9uICov CiAJaW50MzIJCUwxOwkJCQkvKiBhZGp1c3RlZCBzdWJzdHJpbmcgbGVuZ3RoICovCi0JaW50MzIJ CUU7CQkJCS8qIGVuZCBwb3NpdGlvbiAqLworCWludDMyCQlFOwkJCQkvKiBlbmQgcG9zaXRpb24s IGV4Y2x1c2l2ZSAqLwogCiAJLyoKIAkgKiBTUUw5OSBzYXlzIFMgY2FuIGJlIHplcm8gb3IgbmVn YXRpdmUgKHdoaWNoIHdlIGRvbid0IGRvY3VtZW50KSwgYnV0IHdlCkBAIC02NDQsMzQgKzY0NCwy NyBAQCB0ZXh0X3N1YnN0cmluZyhEYXR1bSBzdHIsIGludDMyIHN0YXJ0LCBpbnQzMiBsZW5ndGgs IGJvb2wgbGVuZ3RoX25vdF9zcGVjaWZpZWQpCiAJCSAqIGRldG9hc3RpbmcsIHNvIHdlJ2xsIGdy YWIgYSBjb25zZXJ2YXRpdmVseSBsYXJnZSBzbGljZSBub3cgYW5kIGdvCiAJCSAqIGJhY2sgbGF0 ZXIgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nCiAJCSAqLwotCQlpbnQzMgkJc2xpY2Vfc3RhcnQ7CiAJ CWludDMyCQlzbGljZV9zaXplOwotCQlpbnQzMgkJc2xpY2Vfc3RybGVuOwotCQlpbnQzMgkJc2xp Y2VfbGVuOworCQljb25zdCBjaGFyICpzbGljZV9lbmQ7CiAJCXRleHQJICAgKnNsaWNlOwotCQlp bnQzMgkJRTE7CiAJCWludDMyCQlpOwogCQljaGFyCSAgICpwOwogCQljaGFyCSAgICpzOwogCQl0 ZXh0CSAgICpyZXQ7CiAKLQkJLyoKLQkJICogV2UgbmVlZCB0byBzdGFydCBhdCBwb3NpdGlvbiB6 ZXJvIGJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cKLQkJICogaW4gYWR2YW5jZSB3aGlj aCBieXRlIG9mZnNldCBjb3JyZXNwb25kcyB0byB0aGUgc3VwcGxpZWQgc3RhcnQKLQkJICogcG9z aXRpb24uCi0JCSAqLwotCQlzbGljZV9zdGFydCA9IDA7Ci0KLQkJaWYgKGxlbmd0aF9ub3Rfc3Bl Y2lmaWVkKQkvKiBzcGVjaWFsIGNhc2UgLSBnZXQgbGVuZ3RoIHRvIGVuZCBvZgotCQkJCQkJCQkJ ICogc3RyaW5nICovCi0JCQlzbGljZV9zaXplID0gTDEgPSAtMTsKKwkJaWYgKGxlbmd0aF9ub3Rf c3BlY2lmaWVkKQkvKiBzcGVjaWFsIGNhc2UgLSBnZXQgd2hvbGUgc3RyaW5nICovCisJCXsKKwkJ CXNsaWNlX3NpemUgPSAtMTsKKwkJCUUgPSBQR19JTlQzMl9NQVg7CisJCX0KIAkJZWxzZSBpZiAo bGVuZ3RoIDwgMCkKIAkJewogCQkJLyogU1FMOTkgc2F5cyB0byB0aHJvdyBhbiBlcnJvciBmb3Ig RSA8IFMsIGkuZS4sIG5lZ2F0aXZlIGxlbmd0aCAqLwogCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJ KGVycmNvZGUoRVJSQ09ERV9TVUJTVFJJTkdfRVJST1IpLAogCQkJCQkgZXJybXNnKCJuZWdhdGl2 ZSBzdWJzdHJpbmcgbGVuZ3RoIG5vdCBhbGxvd2VkIikpKTsKLQkJCXNsaWNlX3NpemUgPSBMMSA9 IC0xOwkvKiBzaWxlbmNlIHN0dXBpZGVyIGNvbXBpbGVycyAqLworCQkJc2xpY2Vfc2l6ZSA9IC0x OwkvKiBzaWxlbmNlIHN0dXBpZGVyIGNvbXBpbGVycyAqLworCQkJRSA9IFBHX0lOVDMyX01BWDsK IAkJfQogCQllbHNlIGlmIChwZ19hZGRfczMyX292ZXJmbG93KFMsIGxlbmd0aCwgJkUpKQogCQl7 CkBAIC02NzksMzAgKzY3MiwxNyBAQCB0ZXh0X3N1YnN0cmluZyhEYXR1bSBzdHIsIGludDMyIHN0 YXJ0LCBpbnQzMiBsZW5ndGgsIGJvb2wgbGVuZ3RoX25vdF9zcGVjaWZpZWQpCiAJCQkgKiBMIGNv dWxkIGJlIGxhcmdlIGVub3VnaCBmb3IgUyArIEwgdG8gb3ZlcmZsb3csIGluIHdoaWNoIGNhc2UK IAkJCSAqIHRoZSBzdWJzdHJpbmcgbXVzdCBydW4gdG8gZW5kIG9mIHN0cmluZy4KIAkJCSAqLwot CQkJc2xpY2Vfc2l6ZSA9IEwxID0gLTE7CisJCQlzbGljZV9zaXplID0gLTE7CisJCQlFID0gUEdf SU5UMzJfTUFYOwogCQl9CiAJCWVsc2UKIAkJewogCQkJLyoKLQkJCSAqIEEgemVybyBvciBuZWdh dGl2ZSB2YWx1ZSBmb3IgdGhlIGVuZCBwb3NpdGlvbiBjYW4gaGFwcGVuIGlmIHRoZQotCQkJICog c3RhcnQgd2FzIG5lZ2F0aXZlIG9yIG9uZS4gU1FMOTkgc2F5cyB0byByZXR1cm4gYSB6ZXJvLWxl bmd0aAotCQkJICogc3RyaW5nLgotCQkJICovCi0JCQlpZiAoRSA8IDEpCi0JCQkJcmV0dXJuIGNz dHJpbmdfdG9fdGV4dCgiIik7Ci0KLQkJCS8qCi0JCQkgKiBpZiBFIGlzIHBhc3QgdGhlIGVuZCBv ZiB0aGUgc3RyaW5nLCB0aGUgdHVwbGUgdG9hc3RlciB3aWxsCi0JCQkgKiB0cnVuY2F0ZSB0aGUg bGVuZ3RoIGZvciB1cworCQkJICogVG90YWwgc2xpY2Ugc2l6ZSBpbiBieXRlcyBjYW4ndCBiZSBh bnkgbG9uZ2VyIHRoYW4gdGhlIGVuZAorCQkJICogcG9zaXRpb24gKG1hZGUgemVyby1iYXNlZCkg dGltZXMgdGhlIGVuY29kaW5nIG1heCBsZW5ndGguIElmCisJCQkgKiB0aGF0IG92ZXJmbG93cywg d2UgY2FuIGp1c3QgdXNlIC0xLgogCQkJICovCi0JCQlMMSA9IEUgLSBTMTsKLQotCQkJLyoKLQkJ CSAqIFRvdGFsIHNsaWNlIHNpemUgaW4gYnl0ZXMgY2FuJ3QgYmUgYW55IGxvbmdlciB0aGFuIHRo ZSBzdGFydAotCQkJICogcG9zaXRpb24gcGx1cyBzdWJzdHJpbmcgbGVuZ3RoIHRpbWVzIHRoZSBl bmNvZGluZyBtYXggbGVuZ3RoLgotCQkJICogSWYgdGhhdCBvdmVyZmxvd3MsIHdlIGNhbiBqdXN0 IHVzZSAtMS4KLQkJCSAqLwotCQkJaWYgKHBnX211bF9zMzJfb3ZlcmZsb3coRSwgZW1sLCAmc2xp Y2Vfc2l6ZSkpCisJCQlpZiAocGdfbXVsX3MzMl9vdmVyZmxvdyhFIC0gMSwgZW1sLCAmc2xpY2Vf c2l6ZSkpCiAJCQkJc2xpY2Vfc2l6ZSA9IC0xOwogCQl9CiAKQEAgLTcxMiw2MyArNjkyLDM0IEBA IHRleHRfc3Vic3RyaW5nKERhdHVtIHN0ciwgaW50MzIgc3RhcnQsIGludDMyIGxlbmd0aCwgYm9v bCBsZW5ndGhfbm90X3NwZWNpZmllZCkKIAkJICovCiAJCWlmIChWQVJBVFRfSVNfQ09NUFJFU1NF RChEYXR1bUdldFBvaW50ZXIoc3RyKSkgfHwKIAkJCVZBUkFUVF9JU19FWFRFUk5BTChEYXR1bUdl dFBvaW50ZXIoc3RyKSkpCi0JCQlzbGljZSA9IERhdHVtR2V0VGV4dFBTbGljZShzdHIsIHNsaWNl X3N0YXJ0LCBzbGljZV9zaXplKTsKKwkJCXNsaWNlID0gRGF0dW1HZXRUZXh0UFNsaWNlKHN0ciwg MCwgc2xpY2Vfc2l6ZSk7CiAJCWVsc2UKIAkJCXNsaWNlID0gKHRleHQgKikgRGF0dW1HZXRQb2lu dGVyKHN0cik7CiAKLQkJLyogc2VlIGlmIHdlIGdvdCBiYWNrIGFuIGVtcHR5IHN0cmluZyAqLwot CQlzbGljZV9sZW4gPSBWQVJTSVpFX0FOWV9FWEhEUihzbGljZSk7Ci0JCWlmIChzbGljZV9sZW4g PT0gMCkKLQkJewotCQkJaWYgKHNsaWNlICE9ICh0ZXh0ICopIERhdHVtR2V0UG9pbnRlcihzdHIp KQotCQkJCXBmcmVlKHNsaWNlKTsKLQkJCXJldHVybiBjc3RyaW5nX3RvX3RleHQoIiIpOwotCQl9 Ci0KLQkJLyogTm93IHdlIGNhbiBnZXQgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHNsaWNlIGlu IE1CIGNoYXJhY3RlcnMgKi8KLQkJc2xpY2Vfc3RybGVuID0gcGdfbWJzdHJsZW5fd2l0aF9sZW4o VkFSREFUQV9BTlkoc2xpY2UpLAotCQkJCQkJCQkJCQlzbGljZV9sZW4pOwotCi0JCS8qCi0JCSAq IENoZWNrIHRoYXQgdGhlIHN0YXJ0IHBvc2l0aW9uIHdhc24ndCA+IHNsaWNlX3N0cmxlbi4gSWYg c28sIFNRTDk5Ci0JCSAqIHNheXMgdG8gcmV0dXJuIGEgemVyby1sZW5ndGggc3RyaW5nLgotCQkg Ki8KLQkJaWYgKFMxID4gc2xpY2Vfc3RybGVuKQotCQl7Ci0JCQlpZiAoc2xpY2UgIT0gKHRleHQg KikgRGF0dW1HZXRQb2ludGVyKHN0cikpCi0JCQkJcGZyZWUoc2xpY2UpOwotCQkJcmV0dXJuIGNz dHJpbmdfdG9fdGV4dCgiIik7Ci0JCX0KLQotCQkvKgotCQkgKiBBZGp1c3QgTDEgYW5kIEUxIG5v dyB0aGF0IHdlIGtub3cgdGhlIHNsaWNlIHN0cmluZyBsZW5ndGguIEFnYWluCi0JCSAqIHJlbWVt YmVyIHRoYXQgUzEgaXMgb25lIGJhc2VkLCBhbmQgc2xpY2Vfc3RhcnQgaXMgemVybyBiYXNlZC4K LQkJICovCi0JCWlmIChMMSA+IC0xKQotCQkJRTEgPSBNaW4oUzEgKyBMMSwgc2xpY2Vfc3RhcnQg KyAxICsgc2xpY2Vfc3RybGVuKTsKLQkJZWxzZQotCQkJRTEgPSBzbGljZV9zdGFydCArIDEgKyBz bGljZV9zdHJsZW47CisJCXAgPSBWQVJEQVRBX0FOWShzbGljZSk7CisJCXNsaWNlX2VuZCA9IHAg KyBWQVJTSVpFX0FOWV9FWEhEUihzbGljZSk7CiAKIAkJLyoKLQkJICogRmluZCB0aGUgc3RhcnQg cG9zaXRpb24gaW4gdGhlIHNsaWNlOyByZW1lbWJlciBTMSBpcyBub3QgemVybyBiYXNlZAorCQkg KiBGaW5kIHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgc2xpY2U7IHJlbWVtYmVyIFMxIGlzIG5v dCB6ZXJvCisJCSAqIGJhc2VkLiBJZiB3ZSBydW4gb3V0IG9mIGlucHV0IGZpcnN0LCB3ZSdsbCBy ZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgogCQkgKi8KLQkJcCA9IFZBUkRBVEFfQU5ZKHNsaWNlKTsK LQkJZm9yIChpID0gMDsgaSA8IFMxIC0gMTsgaSsrKQotCQkJcCArPSBwZ19tYmxlbl91bmJvdW5k ZWQocCk7CisJCWZvciAoaSA9IDE7IGkgPCBTMSAmJiBwIDwgc2xpY2VfZW5kOyBpKyspCisJCQlw ICs9IHBnX21ibGVuX3JhbmdlKHAsIHNsaWNlX2VuZCk7CiAKIAkJLyogaGFuZyBvbnRvIGEgcG9p bnRlciB0byBvdXIgc3RhcnQgcG9zaXRpb24gKi8KIAkJcyA9IHA7CiAKIAkJLyoKIAkJICogQ291 bnQgdGhlIGFjdHVhbCBieXRlcyB1c2VkIGJ5IHRoZSBzdWJzdHJpbmcgb2YgdGhlIHJlcXVlc3Rl ZAotCQkgKiBsZW5ndGguCisJCSAqIGxlbmd0aCwgYWdhaW4gZ2l2aW5nIHVwIGlmIHdlIHJ1biBv dXQgb2YgaW5wdXQuCiAJCSAqLwotCQlmb3IgKGkgPSBTMTsgaSA8IEUxOyBpKyspCi0JCQlwICs9 IHBnX21ibGVuX3VuYm91bmRlZChwKTsKKwkJZm9yIChpID0gUzE7IGkgPCBFICYmIHAgPCBzbGlj ZV9lbmQ7IGkrKykKKwkJCXAgKz0gcGdfbWJsZW5fcmFuZ2UocCwgc2xpY2VfZW5kKTsKIAogCQly ZXQgPSAodGV4dCAqKSBwYWxsb2MoVkFSSERSU1ogKyAocCAtIHMpKTsKIAkJU0VUX1ZBUlNJWkUo cmV0LCBWQVJIRFJTWiArIChwIC0gcykpOwotCQltZW1jcHkoVkFSREFUQShyZXQpLCBzLCAocCAt IHMpKTsKKwkJaWYgKHMgPCBwKQorCQkJbWVtY3B5KFZBUkRBVEEocmV0KSwgcywgKHAgLSBzKSk7 CiAKIAkJaWYgKHNsaWNlICE9ICh0ZXh0ICopIERhdHVtR2V0UG9pbnRlcihzdHIpKQogCQkJcGZy ZWUoc2xpY2UpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lbmNvZGlu Zy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VuY29kaW5nLm91dAppbmRleCBlYTFm MzhjZmY0MS4uZWVjODc5YjA1ZWMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvZW5jb2Rpbmcub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZW5jb2Rpbmcu b3V0CkBAIC02Myw3ICs2MywxMyBAQCBTRUxFQ1QgcmV2ZXJzZShnb29kKSBGUk9NIHJlZ3Jlc3Nf ZW5jb2Rpbmc7CiAtLSBpbnZhbGlkIHNob3J0IG1iIGNoYXJhY3RlciA9IGVycm9yCiBTRUxFQ1Qg bGVuZ3RoKHRydW5jYXRlZCkgRlJPTSByZWdyZXNzX2VuY29kaW5nOwogRVJST1I6ICBpbnZhbGlk IGJ5dGUgc2VxdWVuY2UgZm9yIGVuY29kaW5nICJVVEY4IjogMHhjMwotU0VMRUNUIHN1YnN0cmlu Zyh0cnVuY2F0ZWQsIDEsIDEpIEZST00gcmVncmVzc19lbmNvZGluZzsKK1NFTEVDVCBzdWJzdHJp bmcodHJ1bmNhdGVkLCAxLCAzKSBGUk9NIHJlZ3Jlc3NfZW5jb2Rpbmc7Cisgc3Vic3RyaW5nIAor LS0tLS0tLS0tLS0KKyBjYWYKKygxIHJvdykKKworU0VMRUNUIHN1YnN0cmluZyh0cnVuY2F0ZWQs IDEsIDQpIEZST00gcmVncmVzc19lbmNvZGluZzsKIEVSUk9SOiAgaW52YWxpZCBieXRlIHNlcXVl bmNlIGZvciBlbmNvZGluZyAiVVRGOCI6IDB4YzMKIFNFTEVDVCByZXZlcnNlKHRydW5jYXRlZCkg RlJPTSByZWdyZXNzX2VuY29kaW5nOwogRVJST1I6ICBpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgZm9y IGVuY29kaW5nICJVVEY4IjogMHhjMwpAQCAtODQsNiArOTAsMTMgQEAgU0VMRUNUIGxlbmd0aCh3 aXRoX251bCkgRlJPTSByZWdyZXNzX2VuY29kaW5nOwogICAgICAgNAogKDEgcm93KQogCitTRUxF Q1QgcmVnZXhwX3JlcGxhY2Uod2l0aF9udWwsICdeY2FmKC4pJCcsICdcMScpIEZST00gcmVncmVz c19lbmNvZGluZzsKKyByZWdleHBfcmVwbGFjZSAKKy0tLS0tLS0tLS0tLS0tLS0KKyDDqQorKDEg cm93KQorCistLSBOVUwgPSBjaGFyYWN0ZXIKIFNFTEVDVCBzdWJzdHJpbmcod2l0aF9udWwsIDMs IDEpIEZST00gcmVncmVzc19lbmNvZGluZzsKICBzdWJzdHJpbmcgCiAtLS0tLS0tLS0tLQpAQCAt OTYsMjUgKzEwOSwxMiBAQCBTRUxFQ1Qgc3Vic3RyaW5nKHdpdGhfbnVsLCA0LCAxKSBGUk9NIHJl Z3Jlc3NfZW5jb2Rpbmc7CiAgw6kKICgxIHJvdykKIAotU0VMRUNUIHN1YnN0cmluZyh3aXRoX251 bCwgNSwgMSkgRlJPTSByZWdyZXNzX2VuY29kaW5nOwotIHN1YnN0cmluZyAKLS0tLS0tLS0tLS0t Ci0gCi0oMSByb3cpCi0KLVNFTEVDVCBjb252ZXJ0X3RvKHN1YnN0cmluZyh3aXRoX251bCwgNSwg MSksICdVVEY4JykgRlJPTSByZWdyZXNzX2VuY29kaW5nOwotIGNvbnZlcnRfdG8gCi0tLS0tLS0t LS0tLS0KLSBceAotKDEgcm93KQotCi1TRUxFQ1QgcmVnZXhwX3JlcGxhY2Uod2l0aF9udWwsICde Y2FmKC4pJCcsICdcMScpIEZST00gcmVncmVzc19lbmNvZGluZzsKLSByZWdleHBfcmVwbGFjZSAK LS0tLS0tLS0tLS0tLS0tLS0KLSDDqQorU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgNSwgMSkg PSB0ZXN0X2J5dGVhX3RvX3RleHQoJ1x4MDAnKSBGUk9NIHJlZ3Jlc3NfZW5jb2Rpbmc7CisgP2Nv bHVtbj8gCistLS0tLS0tLS0tCisgdAogKDEgcm93KQogCi0tLSBOVUwgPSBjaGFyYWN0ZXIKIFNF TEVDVCB3aXRoX251bCwgcmV2ZXJzZSh3aXRoX251bCksIHJldmVyc2UocmV2ZXJzZSh3aXRoX251 bCkpIEZST00gcmVncmVzc19lbmNvZGluZzsKICB3aXRoX251bCB8IHJldmVyc2UgfCByZXZlcnNl IAogLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tCkBAIC0zNzUsNyArMzc1LDQzIEBAIE5P VElDRTogIE1VTEVfSU5URVJOQUwgTEMyOiAgICAgICAgICAgXHg5MDgyODMgLT4gezk0NzA1OTV9 IC0+IFx4OTA4MjgzID0gT0sKICB0CiAoMSByb3cpCiAKKy0tIHN1YnN0cmluZyBmZXRjaGVzIGEg c2xpY2Ugb2YgYSB0b2FzdGVkIHZhbHVlOyB1bnVzZWQgdGFpbCBvZiB0aGF0IHNsaWNlIGlzCist LSBhbiBpbmNvbXBsZXRlIGNoYXIgKGJ1ZyAjMTk0MDYpCitDUkVBVEUgVEFCTEUgdG9hc3RfM2Jf dXRmOCAoYyB0ZXh0KTsKK0lOU0VSVCBJTlRPIHRvYXN0XzNiX3V0ZjggVkFMVUVTIChyZXBlYXQo VSYnXDIwMjYnLCA0MDAwKSk7CitTRUxFQ1QgU1VCU1RSSU5HKGMgRlJPTSAxIEZPUiAxKSBGUk9N IHRvYXN0XzNiX3V0Zjg7Cisgc3Vic3RyaW5nIAorLS0tLS0tLS0tLS0KKyDigKYKKygxIHJvdykK KworU0VMRUNUIFNVQlNUUklORyhjIEZST00gNDAwMSBGT1IgMSkgRlJPTSB0b2FzdF8zYl91dGY4 OworIHN1YnN0cmluZyAKKy0tLS0tLS0tLS0tCisgCisoMSByb3cpCisKKy0tIGRpYWdub3NlIGlu Y29tcGxldGUgY2hhciBpZmYgd2l0aGluIHRoZSBzdWJzdHJpbmcKK1VQREFURSB0b2FzdF8zYl91 dGY4IFNFVCBjID0gYyB8fCB0ZXN0X2J5dGVhX3RvX3RleHQoJ1x4ZTI4MCcpOworU0VMRUNUIFNV QlNUUklORyhjIEZST00gNDAwMCBGT1IgMSkgRlJPTSB0b2FzdF8zYl91dGY4OworIHN1YnN0cmlu ZyAKKy0tLS0tLS0tLS0tCisg4oCmCisoMSByb3cpCisKK1NFTEVDVCBTVUJTVFJJTkcoYyBGUk9N IDQwMDEgRk9SIDEpIEZST00gdG9hc3RfM2JfdXRmODsKK0VSUk9SOiAgaW52YWxpZCBieXRlIHNl cXVlbmNlIGZvciBlbmNvZGluZyAiVVRGOCI6IDB4ZTIgMHg4MAorLS0gc3Vic3RyaW5nIG5lZWRp bmcgbGFzdCBieXRlIG9mIGl0cyBzbGljZV9zaXplCitBTFRFUiBUQUJMRSB0b2FzdF8zYl91dGY4 IFJFTkFNRSBUTyB0b2FzdF80Yl91dGY4OworVVBEQVRFIHRvYXN0XzRiX3V0ZjggU0VUIGMgPSBy ZXBlYXQoVSYnXCswMUY2ODAnLCAzMDAwKTsKK1NFTEVDVCBTVUJTVFJJTkcoYyBGUk9NIDMwMDAg Rk9SIDEpIEZST00gdG9hc3RfNGJfdXRmODsKKyBzdWJzdHJpbmcgCistLS0tLS0tLS0tLQorIPCf moAKKygxIHJvdykKKwogRFJPUCBUQUJMRSBlbmNvZGluZ190ZXN0czsKK0RST1AgVEFCTEUgdG9h c3RfNGJfdXRmODsKIERST1AgRlVOQ1RJT04gdGVzdF9lbmNvZGluZzsKIERST1AgRlVOQ1RJT04g dGVzdF90ZXh0X3RvX3djaGFyczsKIERST1AgRlVOQ1RJT04gdGVzdF9tYmxlbl9mdW5jOwpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZW5jb2Rpbmcuc3FsIGIvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvZW5jb2Rpbmcuc3FsCmluZGV4IGI5NTQzYzBjYjMyLi43ZGU5NWY0OTk0NyAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZW5jb2Rpbmcuc3FsCisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2VuY29kaW5nLnNxbApAQCAtNDAsNyArNDAsOCBAQCBTRUxFQ1QgcmV2ZXJz ZShnb29kKSBGUk9NIHJlZ3Jlc3NfZW5jb2Rpbmc7CiAKIC0tIGludmFsaWQgc2hvcnQgbWIgY2hh cmFjdGVyID0gZXJyb3IKIFNFTEVDVCBsZW5ndGgodHJ1bmNhdGVkKSBGUk9NIHJlZ3Jlc3NfZW5j b2Rpbmc7Ci1TRUxFQ1Qgc3Vic3RyaW5nKHRydW5jYXRlZCwgMSwgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOworU0VMRUNUIHN1YnN0cmluZyh0cnVuY2F0ZWQsIDEsIDMpIEZST00gcmVncmVzc19l bmNvZGluZzsKK1NFTEVDVCBzdWJzdHJpbmcodHJ1bmNhdGVkLCAxLCA0KSBGUk9NIHJlZ3Jlc3Nf ZW5jb2Rpbmc7CiBTRUxFQ1QgcmV2ZXJzZSh0cnVuY2F0ZWQpIEZST00gcmVncmVzc19lbmNvZGlu ZzsKIC0tIGludmFsaWQgc2hvcnQgbWIgY2hhcmFjdGVyID0gc2lsZW50bHkgZHJvcHBlZAogU0VM RUNUIHJlZ2V4cF9yZXBsYWNlKHRydW5jYXRlZCwgJ15jYWYoLikkJywgJ1wxJykgRlJPTSByZWdy ZXNzX2VuY29kaW5nOwpAQCAtNTEsMTIgKzUyLDExIEBAIFNFTEVDVCByZWdleHBfcmVwbGFjZSh0 cnVuY2F0ZWQsICdeY2FmKC4pJCcsICdcMScpIEZST00gcmVncmVzc19lbmNvZGluZzsKIAogLS0g TlVMID0gdGVybWluYXRvcgogU0VMRUNUIGxlbmd0aCh3aXRoX251bCkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOwotU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgMywgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOwotU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgNCwgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOwotU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgNSwgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOwotU0VMRUNUIGNvbnZlcnRfdG8oc3Vic3RyaW5nKHdpdGhfbnVsLCA1LCAxKSwgJ1VU RjgnKSBGUk9NIHJlZ3Jlc3NfZW5jb2Rpbmc7CiBTRUxFQ1QgcmVnZXhwX3JlcGxhY2Uod2l0aF9u dWwsICdeY2FmKC4pJCcsICdcMScpIEZST00gcmVncmVzc19lbmNvZGluZzsKIC0tIE5VTCA9IGNo YXJhY3RlcgorU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgMywgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOworU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgNCwgMSkgRlJPTSByZWdyZXNzX2Vu Y29kaW5nOworU0VMRUNUIHN1YnN0cmluZyh3aXRoX251bCwgNSwgMSkgPSB0ZXN0X2J5dGVhX3Rv X3RleHQoJ1x4MDAnKSBGUk9NIHJlZ3Jlc3NfZW5jb2Rpbmc7CiBTRUxFQ1Qgd2l0aF9udWwsIHJl dmVyc2Uod2l0aF9udWwpLCByZXZlcnNlKHJldmVyc2Uod2l0aF9udWwpKSBGUk9NIHJlZ3Jlc3Nf ZW5jb2Rpbmc7CiAKIC0tIElmIGEgY29ycnVwdGVkIHN0cmluZyBjb250YWlucyBOVUwgaW4gdGhl IHRhaWwgYnl0ZXMgb2YgYSBtdWx0aWJ5dGUKQEAgLTIxMiw3ICsyMTIsMjMgQEAgSU5TRVJUIElO VE8gZW5jb2RpbmdfdGVzdHMgVkFMVUVTCiBTRUxFQ1QgQ09VTlQodGVzdF9lbmNvZGluZyhlbmNv ZGluZywgZGVzY3JpcHRpb24sIGlucHV0KSkgPiAwCiBGUk9NIGVuY29kaW5nX3Rlc3RzOwogCist LSBzdWJzdHJpbmcgZmV0Y2hlcyBhIHNsaWNlIG9mIGEgdG9hc3RlZCB2YWx1ZTsgdW51c2VkIHRh aWwgb2YgdGhhdCBzbGljZSBpcworLS0gYW4gaW5jb21wbGV0ZSBjaGFyIChidWcgIzE5NDA2KQor Q1JFQVRFIFRBQkxFIHRvYXN0XzNiX3V0ZjggKGMgdGV4dCk7CitJTlNFUlQgSU5UTyB0b2FzdF8z Yl91dGY4IFZBTFVFUyAocmVwZWF0KFUmJ1wyMDI2JywgNDAwMCkpOworU0VMRUNUIFNVQlNUUklO RyhjIEZST00gMSBGT1IgMSkgRlJPTSB0b2FzdF8zYl91dGY4OworU0VMRUNUIFNVQlNUUklORyhj IEZST00gNDAwMSBGT1IgMSkgRlJPTSB0b2FzdF8zYl91dGY4OworLS0gZGlhZ25vc2UgaW5jb21w bGV0ZSBjaGFyIGlmZiB3aXRoaW4gdGhlIHN1YnN0cmluZworVVBEQVRFIHRvYXN0XzNiX3V0Zjgg U0VUIGMgPSBjIHx8IHRlc3RfYnl0ZWFfdG9fdGV4dCgnXHhlMjgwJyk7CitTRUxFQ1QgU1VCU1RS SU5HKGMgRlJPTSA0MDAwIEZPUiAxKSBGUk9NIHRvYXN0XzNiX3V0Zjg7CitTRUxFQ1QgU1VCU1RS SU5HKGMgRlJPTSA0MDAxIEZPUiAxKSBGUk9NIHRvYXN0XzNiX3V0Zjg7CistLSBzdWJzdHJpbmcg bmVlZGluZyBsYXN0IGJ5dGUgb2YgaXRzIHNsaWNlX3NpemUKK0FMVEVSIFRBQkxFIHRvYXN0XzNi X3V0ZjggUkVOQU1FIFRPIHRvYXN0XzRiX3V0Zjg7CitVUERBVEUgdG9hc3RfNGJfdXRmOCBTRVQg YyA9IHJlcGVhdChVJidcKzAxRjY4MCcsIDMwMDApOworU0VMRUNUIFNVQlNUUklORyhjIEZST00g MzAwMCBGT1IgMSkgRlJPTSB0b2FzdF80Yl91dGY4OworCiBEUk9QIFRBQkxFIGVuY29kaW5nX3Rl c3RzOworRFJPUCBUQUJMRSB0b2FzdF80Yl91dGY4OwogRFJPUCBGVU5DVElPTiB0ZXN0X2VuY29k aW5nOwogRFJPUCBGVU5DVElPTiB0ZXN0X3RleHRfdG9fd2NoYXJzOwogRFJPUCBGVU5DVElPTiB0 ZXN0X21ibGVuX2Z1bmM7Ci0tIAoyLjQ3LjMKCg== --000000000000e06d86064acd5c40--