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 1wfdq3-005YVl-0i for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Jul 2026 13:21:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wfdq0-007YGs-0j for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Jul 2026 13:21:48 +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 1wfdRZ-007XqL-06 for pgsql-hackers@lists.postgresql.org; Fri, 03 Jul 2026 12:56:33 +0000 Received: from mail-wr1-x42f.google.com ([2a00:1450:4864:20::42f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wfdRT-00000001JFX-3bFc for pgsql-hackers@lists.postgresql.org; Fri, 03 Jul 2026 12:56:32 +0000 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-47362928f65so541196f8f.2 for ; Fri, 03 Jul 2026 05:56:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783083379; x=1783688179; darn=lists.postgresql.org; h=mime-version:subject:message-id:to:from:date:from:to:cc:subject :date:message-id:reply-to; bh=J+iXt+b9Bsph6BXo6LNTueUXAZeh0vEVSWqCUHVGQr0=; b=tM9hBIbY1YOmTOnoEsCuDSC92/Jfk7X21mpBQwN0/5q7rW6OKI/1KDqV+RAwcst5ge Uz8i6l4xNRl+NSNBd+Zryz5uZyFzAKP2wOO6S9t2OcHNi6frPs37fa+I6Ws4D4a9uNIf DTCJMJR9AarwBjdTGtbbtnr8djU3Aok1cncNN4Je7GaSBrUL6MzAIquYt6mG24cnsxQi AUbyG3HyMfWY1AcrIZ9tV15p8TX0w3IJsXMPZWfcruasKeGERc/ljEe7L7dpVmlQgL6C KJmIKKcikYTIHyinXJhKE0ajimUev9YTVS8bL8oIIaYpeqPrkwKps5o/bmziH8Os7buT L0/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783083379; x=1783688179; h=mime-version:subject:message-id:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=J+iXt+b9Bsph6BXo6LNTueUXAZeh0vEVSWqCUHVGQr0=; b=Cb/iExaGZ7f00u8lo4ugjtR+DhpcJs+li0JNjSfcSgzeg/jATIjVKLiVI3N8CPO49W ZllG/j1Vuvz+kqhLx7wYY2+dbhNVs0bUPNy5LMW3cpbOAoL3e3JB3lvVD5u5KIc5rdAu KhJUmqT5+uBo1usazcHDQHXjNCWlc+zAe1nARMLdty7MMyQleHQBjFhUPQ4AUZRJg1NV lmooYw7ie9Tt4iCTOHPwhhwKJ5Pmw5KGqjL8FGCWfTc48WZ+m62W8ibGO59zZp4W1OKQ dBxIlTLKgKjPl4tYI80r/ETThzUpCmkftz24LXDZ/WpAYeMt4gAyyjHIdlH82Kbc4O2b 9k/w== X-Gm-Message-State: AOJu0YwG/YvV9E3htYEbvwLw4DntSndDqhfx40r39676WCszHjxIFyfu 2O9mrs7+6AcvekUnQqFwBziHtA1fSnNXoT0xc0/pDf5qd8QJTYro7WhXTwIu0GXE X-Gm-Gg: AfdE7ckPK0F1SLIZOBxQJUvFT6eR0wbboPotVChvDFCaWpSjSJRJGUMwaYZfsMVoarO 44F+nJ8kQBcYg7lWYkLbEsS9G1W5mpqydsAEHvxgGsV4fjfY296XY1IW8sV7TI2wZbJqZvmlr4l WUSTkOiS0YZQpJVsvEBsdUdkJ3zcqmY/x8Psmzhh0h0WLB/L8SLa3AOpcsX7y08keNU5a5jsq7/ kq4pwE3P4FbQBXIJbu0z34UsnB766nrT7VCquxjMca5Qm+KiuZomIxJcxT0d5tWLmG699MFafw5 1FPT1BWy2wRDk5WnvlTjjjRMyxFnqJ1uwXN3EGzNeL1UWmZpdhGYcMtVB96R0pKoHBvN+tQOXpE r1yXgXaYBCRCEGdkCJkvhVz7RKvEKVFum/3gQ42Z7tcXmjkXN5WGpKWDrKNdN4ZsnLBBoAVuUuW bcqjV2rDKQ8AujJ0yIrxM3vREYCbZ57MlCcj0kbJRg2rEO6BGcl+AXnQqeRsA= X-Received: by 2002:a5d:5d0a:0:b0:473:506a:e47c with SMTP id ffacd0b85a97d-4775a7cda27mr16755568f8f.26.1783083379474; Fri, 03 Jul 2026 05:56:19 -0700 (PDT) Received: from [2a00:f41:9028:3504::10:0] ([2a00:f41:9028:3504:eccc:25f9:ca2a:507f]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-477db3dbbe6sm17191603f8f.6.2026.07.03.05.56.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Jul 2026 05:56:18 -0700 (PDT) Date: Fri, 3 Jul 2026 14:56:12 +0200 From: michal.dtz@gmail.com To: pgsql-hackers@lists.postgresql.org Message-ID: <028117fa-439b-4762-b647-130bc19df89c@Spark> Subject: Schema-qualify the equality operator when deparsing NULLIF/IS DISTINCT FROM X-Readdle-Message-ID: 028117fa-439b-4762-b647-130bc19df89c@Spark MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="6a47b171_12200854_2eb5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --6a47b171_12200854_2eb5 Content-Type: multipart/alternative; boundary="6a47b171_5bd062c2_2eb5" --6a47b171_5bd062c2_2eb5 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi hackers, A view that applies NULLI=46 or IS =5BNOT=5D DISTINCT =46ROM to a value w= hose =22=3D=22 operator is not on the search=5Fpath (for example an hstore col= umn) cannot be dumped and restored. =C2=A0ruleutils.c deparses those construct= s with a bare =22=3D=22, and pg=5Fdump reloads with an empty search=5Fpath,= so the reload fails with: =C2=A0 =C2=A0ERROR: =C2=A0operator does not exist: public.hstore =3D publ= ic.hstore A plain OpExpr already avoids this by deparsing as OPERATOR(schema.=3D), but NULLI=46 and IS DISTINCT =46ROM have no syntactic slot for a qualifie= d operator name. =C2=A0This is a long-standing report: =C2=A0 =C2=A0https://stackoverflow.com/questions/23599926 =C2=A0 =C2=A0https://www.postgresql.org/message-id/53702D20.4070505=402nd= quadrant.com Proposed fix (in the deparser) ------------------------------ When the equality operator would not be found by its bare name under the current search=5Fpath -- detected via generate=5Foperator=5Fname(), which= already decides when the OPERATOR(...) decoration is required -- emit an equivalent expression that can carry the qualified operator, instead of the normal syntax: =C2=A0 =C2=A0NULLI=46(a, b) =C2=A0 =C2=A0 =C2=A0 =C2=A0-> CASE WHEN a IS NOT NULL AND b IS NOT NULL A= ND (a OPERATOR(s.=3D) b) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0THEN NULL ELSE a E= ND =C2=A0 =C2=A0a IS DISTINCT =46ROM b =C2=A0 =C2=A0 =C2=A0 =C2=A0-> ((a IS NOT NULL OR b IS NOT NULL) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0AND (a IS NULL OR b IS NULL OR N= OT (a OPERATOR(s.=3D) b))) Both reproduce the executor's semantics exactly: NULLI=46's single evaluation of null inputs (the IS NOT NULL guards make it faithful even for a non-strict =22=3D=22), and DistinctExpr yielding NULL when =22=3D=22= yields NULL for two non-null inputs. =C2=A0The DISTINCT form is always parenthes= ized so an enclosing NOT (IS NOT DISTINCT =46ROM) binds it correctly; CASE ...= END is self-delimiting. =C2=A0When no qualification is needed, the depars= ed output is unchanged. The substitute forms evaluate their inputs more than once, whereas NULLI=46 and DistinctExpr evaluate each input exactly once, so they are used only when the inputs contain no volatile functions; otherwise the original syntax is kept (it still reloads correctly whenever the operator is on the search=5Fpath). Details ------- =C2=A0* Target branch: master (the issue affects all live branches). =C2=A0* Tests: compiles cleanly; =22make check=22 is green; new regressio= n =C2=A0 =C2=A0coverage added in contrib/hstore. =C2=A0pgindent- and =C2=A0 =C2=A0=22git diff --check=22-clean. =C2=A0* Docs: none needed -- user-visible NULLI=46 / IS DISTINCT =46ROM =C2=A0 =C2=A0behaviour is unchanged; only the deparsed text differs in th= e =C2=A0 =C2=A0qualified case. =C2=A0* Performance: negligible; one extra check on a rarely-taken depars= e =C2=A0 =C2=A0path. Known limitation ---------------- A view whose *volatile* input uses an off-search-path operator still cannot be reloaded; the substitute forms are skipped there to avoid double-evaluating volatile inputs. =C2=A0=46ully handling that case would= require carrying the operator through the constructs' grammar, which this patch does not attempt. =C2=A0=46eedback welcome on whether that is = worth pursuing. v1 attached. Thanks, Micha=C5=82 Pasternak --6a47b171_5bd062c2_2eb5 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline
Hi hackers,
&=23160;
A view that applies NULLI=46 or IS =5BNOT=5D DISTINCT =46ROM to a va= lue whose
=22=3D=22 operator is not on the search=5Fpath (for example an hstore col= umn)
cannot be dumped and restored. &=23160;ruleutils.c deparses those constru= cts
with a bare =22=3D=22, and pg=5Fdump reloads with an empty search=5Fpath,= so the
reload fails with:
&=23160;
&=23160; &=23160;ERROR: &=23160;operator does not exist: public.hsto= re =3D public.hstore
&=23160;
A plain OpExpr already avoids this by deparsing as OPERATOR(schema.=3D= ),
but NULLI=46 and IS DISTINCT =46ROM have no syntactic slot for a qualifie= d
operator name. &=23160;This is a long-standing report:
&=23160;
&=23160;

Proposed fix (in the deparser)
------------------------------
When the equality operator would not be found by its bare name under the<= br /> current search=5Fpath -- detected via generate=5Foperator=5Fname(), which=
already decides when the OPERATOR(...) decoration is required -- emit an<= br /> equivalent expression that can carry the qualified operator, instead of the normal syntax:
&=23160;
&=23160; &=23160;NULLI=46(a, b)
&=23160; &=23160; &=23160; &=23160;-> CASE WHEN a IS NOT NULL AND b IS= NOT NULL AND (a OPERATOR(s.=3D) b)
&=23160; &=23160; &=23160; &=23160; &=23160; &=23160; &=23160; &=23160;TH= EN NULL ELSE a END
&=23160;
&=23160; &=23160;a IS DISTINCT =46ROM b
&=23160; &=23160; &=23160; &=23160;-> ((a IS NOT NULL OR b IS NOT NULL= )
&=23160; &=23160; &=23160; &=23160; &=23160; &=23160;AND (a IS NULL OR b = IS NULL OR NOT (a OPERATOR(s.=3D) b)))
&=23160;
Both reproduce the executor's semantics exactly: NULLI=46's single evaluation of null inputs (the IS NOT NULL guards make it faithful even for a non-strict =22=3D=22), and DistinctExpr yielding NULL when =22=3D=22= yields
NULL for two non-null inputs. &=23160;The DISTINCT form is always parenth= esized
so an enclosing NOT (IS NOT DISTINCT =46ROM) binds it correctly; CASE ...=
END is self-delimiting. &=23160;When no qualification is needed, the depa= rsed
output is unchanged.
&=23160;
The substitute forms evaluate their inputs more than once, whereas NULLI=46 and DistinctExpr evaluate each input exactly once, so they are
used only when the inputs contain no volatile functions; otherwise t= he
original syntax is kept (it still reloads correctly whenever the
operator is on the search=5Fpath).
&=23160;

Details
-------
&=23160;* Target branch: master (the issue affects all live branches). &=23160;* Tests: compiles cleanly; =22make check=22 is green; new regress= ion
&=23160; &=23160;coverage added in contrib/hstore. &=23160;pgindent- and<= br /> &=23160; &=23160;=22git diff --check=22-clean.
&=23160;* Docs: none needed -- user-visible NULLI=46 / IS DISTINCT =46ROM=
&=23160; &=23160;behaviour is unchanged; only the deparsed text differs i= n the
&=23160; &=23160;qualified case.
&=23160;* Performance: negligible; one extra check on a rarely-taken depa= rse
&=23160; &=23160;path.
&=23160;

Known limitation
----------------
A view whose *volatile* input uses an off-search-path operator still
cannot be reloaded; the substitute forms are skipped there to avoid
= double-evaluating volatile inputs. &=23160;=46ully handling that case wou= ld
require carrying the operator through the constructs' grammar, which
this patch does not attempt. &=23160;=46eedback welcome on whether that i= s worth
pursuing.
&=23160;
v1 attached.
&=23160;
Thanks,
Micha=C5=82 Pasternak
--6a47b171_5bd062c2_2eb5-- --6a47b171_12200854_2eb5 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v1-0001-Schema-qualify-the-equality-operator-when-deparsi.patch" RnJvbSBkMTA3ZmE0ZDYwZDYxYmRkYjVjMjQ5ZDI5NjQxZjY1NzI3NGY3ZmQyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/TWljaGE9QzU9ODI9MjBQYXN0ZXJuYWs/PSA8 bWljaGFsLmR0ekBnbWFpbC5jb20+CkRhdGU6IE1vbiwgMjkgSnVuIDIwMjYgMTQ6MDA6NTQgKzAy MDAKU3ViamVjdDogW1BBVENIIHYxXSBTY2hlbWEtcXVhbGlmeSB0aGUgZXF1YWxpdHkgb3BlcmF0 b3Igd2hlbiBkZXBhcnNpbmcKIE5VTExJRi9JUyBESVNUSU5DVCBGUk9NCgpUaGUgTlVMTElGIGFu ZCBJUyBESVNUSU5DVCBGUk9NIGNvbnN0cnVjdHMgdXNlIGFuIGVxdWFsaXR5IG9wZXJhdG9yIHRo YXQKdGhlaXIgU1FMIHN5bnRheCBpZGVudGlmaWVzIG9ubHkgYnkgdGhlIHVucXVhbGlmaWVkIG5h bWUgIj0iOyB0aGUgb3BlcmF0b3IKaXMgcmUtcmVzb2x2ZWQgYWdhaW5zdCB0aGUgcHJldmFpbGlu ZyBzZWFyY2hfcGF0aCB3aGVuIGEgZHVtcGVkIHJ1bGUgb3IgdmlldwpkZWZpbml0aW9uIGlzIHJl bG9hZGVkLiAgVW5saWtlIGEgcGxhaW4gT3BFeHByLCB3aGljaCBydWxldXRpbHMuYyBkZXBhcnNl cwp1c2luZyB0aGUgT1BFUkFUT1Ioc2NoZW1hLm9wKSBub3RhdGlvbiwgdGhlc2UgY29uc3RydWN0 cyBoYXZlIG5vd2hlcmUgdG8Kd3JpdGUgYSBzY2hlbWEtcXVhbGlmaWVkIG9wZXJhdG9yIG5hbWUu ICBBcyBhIHJlc3VsdCBhIHZpZXcgdGhhdCBhcHBsaWVzCk5VTExJRiBvciBJUyBbTk9UXSBESVNU SU5DVCBGUk9NIHRvIHZhbHVlcyB3aG9zZSAiPSIgb3BlcmF0b3IgaXMgbm90IG9uIHRoZQpzZWFy Y2hfcGF0aCAoZm9yIGV4YW1wbGUgYW4gaHN0b3JlIGNvbHVtbikgY291bGQgbm90IGJlIGR1bXBl ZCBhbmQgcmVsb2FkZWQ6CnBnX2R1bXAgcmVsb2FkcyB3aXRoIGFuIGVtcHR5IHNlYXJjaF9wYXRo LCBzbyB0aGUgcmVsb2FkIGZhaWxlZCB3aXRoCiJvcGVyYXRvciBkb2VzIG5vdCBleGlzdDogLi4u ID0gLi4uIi4KCkZpeCB0aGlzIGluIHRoZSBkZXBhcnNlci4gIFdoZW4gdGhlIGVxdWFsaXR5IG9w ZXJhdG9yIHdvdWxkIG5vdCBiZSBmb3VuZCBieQppdHMgYmFyZSBuYW1lIHVuZGVyIHRoZSBjdXJy ZW50IHNlYXJjaF9wYXRoIChkZXRlY3RlZCB2aWEKZ2VuZXJhdGVfb3BlcmF0b3JfbmFtZSwgd2hp Y2ggYWxyZWFkeSBkZWNpZGVzIHdoZW4gdGhlIE9QRVJBVE9SKC4uLikKZGVjb3JhdGlvbiBpcyBy ZXF1aXJlZCksIGVtaXQgYW4gZXF1aXZhbGVudCBleHByZXNzaW9uIHRoYXQgY2FuIGNhcnJ5IHRo ZQpxdWFsaWZpZWQgb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIHN5bnRheDoKCiAgTlVM TElGKGEsIGIpICAgICAgICAgIC0+ICBDQVNFIFdIRU4gYSBJUyBOT1QgTlVMTCBBTkQgYiBJUyBO T1QgTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgKGEgT1BFUkFUT1Io cy49KSBiKSBUSEVOIE5VTEwgRUxTRSBhIEVORAogIGEgSVMgRElTVElOQ1QgRlJPTSBiICAtPiAg KChhIElTIE5PVCBOVUxMIE9SIGIgSVMgTk9UIE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQU5EIChhIElTIE5VTEwgT1IgYiBJUyBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBPUiBOT1QgKGEgT1BFUkFUT1Iocy49KSBiKSkpCgpUaGUgRElTVElOQ1Qgc3Vi c3RpdHV0ZSBpcyBhbHdheXMgcGFyZW50aGVzaXplZCBzbyBhbiBlbmNsb3NpbmcgTk9UIChhcyBp bgpJUyBOT1QgRElTVElOQ1QgRlJPTSkgYmluZHMgY29ycmVjdGx5OyBDQVNFIC4uLiBFTkQgaXMg c2VsZi1kZWxpbWl0aW5nLgpCb3RoIHJlcHJvZHVjZSB0aGUgZXhlY3V0b3IncyBzZW1hbnRpY3Mg ZXhhY3RseSwgaW5jbHVkaW5nIE5VTExJRidzIHNpbmdsZQp0cmVhdG1lbnQgb2YgbnVsbCBpbnB1 dHMgYW5kIERpc3RpbmN0RXhwciB5aWVsZGluZyBOVUxMIHdoZW4gIj0iIHlpZWxkcyBOVUxMCmZv ciB0d28gbm9uLW51bGwgaW5wdXRzLgoKVGhlIHN1YnN0aXR1dGUgZm9ybXMgZXZhbHVhdGUgdGhl aXIgaW5wdXRzIG1vcmUgdGhhbiBvbmNlLCB3aGVyZWFzIE5VTExJRgphbmQgRGlzdGluY3RFeHBy IGV2YWx1YXRlIGVhY2ggaW5wdXQgZXhhY3RseSBvbmNlLCBzbyB0aGV5IGFyZSB1c2VkIG9ubHkK d2hlbiB0aGUgaW5wdXRzIGNvbnRhaW4gbm8gdm9sYXRpbGUgZnVuY3Rpb25zOyBvdGhlcndpc2Ug dGhlIG9yaWdpbmFsIHN5bnRheAppcyBrZXB0LiAgV2hlbiBubyBxdWFsaWZpY2F0aW9uIGlzIG5l ZWRlZCB0aGUgZGVwYXJzZWQgb3V0cHV0IGlzIHVuY2hhbmdlZC4KCkEgdmlldyB3aG9zZSB2b2xh dGlsZSBpbnB1dCB1c2VzIGFuIG9mZi1zZWFyY2gtcGF0aCBvcGVyYXRvciBzdGlsbCBjYW5ub3Qg YmUKcmVsb2FkZWQ7IGZ1bGx5IGhhbmRsaW5nIHRoYXQgd291bGQgcmVxdWlyZSBjYXJyeWluZyB0 aGUgb3BlcmF0b3IgdGhyb3VnaAp0aGUgY29uc3RydWN0cycgZ3JhbW1hciwgd2hpY2ggdGhpcyBw YXRjaCBkb2VzIG5vdCBhdHRlbXB0LgoKQWRkIHJlZ3Jlc3Npb24gY292ZXJhZ2UgdG8gY29udHJp Yi9oc3RvcmUuCi0tLQogY29udHJpYi9oc3RvcmUvZXhwZWN0ZWQvaHN0b3JlLm91dCB8ICA4NSAr KysrKysrKysrKysrKysrKysKIGNvbnRyaWIvaHN0b3JlL3NxbC9oc3RvcmUuc3FsICAgICAgfCAg NDAgKysrKysrKysrCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMgIHwgMTM0ICsr KysrKysrKysrKysrKysrKysrKysrKysrKy0tCiAzIGZpbGVzIGNoYW5nZWQsIDI1MCBpbnNlcnRp b25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvaHN0b3JlL2V4cGVj dGVkL2hzdG9yZS5vdXQgYi9jb250cmliL2hzdG9yZS9leHBlY3RlZC9oc3RvcmUub3V0CmluZGV4 IGFjZWE4ODAuLmI0MzNlMjMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaHN0b3JlL2V4cGVjdGVkL2hz dG9yZS5vdXQKKysrIGIvY29udHJpYi9oc3RvcmUvZXhwZWN0ZWQvaHN0b3JlLm91dApAQCAtMTYz MiwzICsxNjMyLDg4IEBAIFdIRVJFICBoc3RvcmVfaGFzaCh2KTo6Yml0KDMyKSAhPSBoc3RvcmVf aGFzaF9leHRlbmRlZCh2LCAwKTo6Yml0KDMyKQogLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tCiAoMCByb3dzKQogCistLSBWaWV3cyB1c2luZyBOVUxMSUYgb3IgSVMg W05PVF0gRElTVElOQ1QgRlJPTSBvbiBoc3RvcmUgdmFsdWVzIG11c3QgYmUKKy0tIGRlcGFyc2Vk IHdpdGggYSBzY2hlbWEtcXVhbGlmaWVkIGVxdWFsaXR5IG9wZXJhdG9yIHdoZW4gaHN0b3JlJ3Mg Ij0iCistLSBvcGVyYXRvciBpcyBub3QgcmVhY2hhYmxlIHRocm91Z2ggdGhlIHNlYXJjaF9wYXRo LCBzbyB0aGF0IHRoZSBkdW1wZWQKKy0tIGRlZmluaXRpb24gcmVsb2FkcyBjb3JyZWN0bHkgKGUu Zy4gd2l0aCB0aGUgZW1wdHkgc2VhcmNoX3BhdGggcGdfZHVtcCB1c2VzKS4KK0NSRUFURSBTQ0hF TUEgaHN0b3JlX3ZpZXdfdGVzdDsKK0NSRUFURSBUQUJMRSBoc3RvcmVfdmlld190ZXN0LnQgKGlk IGludCwgYzEgaHN0b3JlLCBjMiBoc3RvcmUpOworQ1JFQVRFIFZJRVcgaHN0b3JlX3ZpZXdfdGVz dC52X251bGxpZiBBUworICBTRUxFQ1QgaWQsIE5VTExJRihjMSwgYzIpIEFTIHIgRlJPTSBoc3Rv cmVfdmlld190ZXN0LnQ7CitDUkVBVEUgVklFVyBoc3RvcmVfdmlld190ZXN0LnZfZGlzdGluY3Qg QVMKKyAgU0VMRUNUIGlkLCBjMSBJUyBESVNUSU5DVCBGUk9NIGMyIEFTIHIgRlJPTSBoc3RvcmVf dmlld190ZXN0LnQ7CitDUkVBVEUgVklFVyBoc3RvcmVfdmlld190ZXN0LnZfbm90ZGlzdCBBUwor ICBTRUxFQ1QgaWQsIGMxIElTIE5PVCBESVNUSU5DVCBGUk9NIGMyIEFTIHIgRlJPTSBoc3RvcmVf dmlld190ZXN0LnQ7CistLSBXaXRoIGhzdG9yZSBvbiB0aGUgc2VhcmNoX3BhdGggdGhlIG5vcm1h bCwgdW5xdWFsaWZpZWQgc3ludGF4IGlzIHVzZWQuCitTRVQgc2VhcmNoX3BhdGggPSBoc3RvcmVf dmlld190ZXN0LCBwdWJsaWM7CitTRUxFQ1QgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rl c3Qudl9udWxsaWYnOjpyZWdjbGFzcywgdHJ1ZSk7CisgICAgIHBnX2dldF92aWV3ZGVmICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNFTEVDVCBpZCwgICAgICAgICAgICArCisg ICAgIE5VTExJRihjMSwgYzIpIEFTIHIrCisgICAgRlJPTSB0OworKDEgcm93KQorCitTRUxFQ1Qg cGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rlc3Qudl9kaXN0aW5jdCc6OnJlZ2NsYXNzLCB0 cnVlKTsKKyAgICAgICAgIHBnX2dldF92aWV3ZGVmICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgIFNFTEVDVCBpZCwgICAgICAgICAgICAgICAgICAgICsKKyAg ICAgYzEgSVMgRElTVElOQ1QgRlJPTSBjMiBBUyByKworICAgIEZST00gdDsKKygxIHJvdykKKwor U0VMRUNUIHBnX2dldF92aWV3ZGVmKCdoc3RvcmVfdmlld190ZXN0LnZfbm90ZGlzdCc6OnJlZ2Ns YXNzLCB0cnVlKTsKKyAgICAgICAgICAgcGdfZ2V0X3ZpZXdkZWYgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU0VMRUNUIGlkLCAgICAgICAgICAg ICAgICAgICAgICAgICsKKyAgICAgTk9UIGMxIElTIERJU1RJTkNUIEZST00gYzIgQVMgcisKKyAg ICBGUk9NIHQ7CisoMSByb3cpCisKKy0tIFdpdGggaHN0b3JlIG9mZiB0aGUgc2VhcmNoX3BhdGgg dGhlIG9wZXJhdG9yIG11c3QgYmUgc2NoZW1hLXF1YWxpZmllZC4KK1NFVCBzZWFyY2hfcGF0aCA9 IGhzdG9yZV92aWV3X3Rlc3Q7CitTRUxFQ1QgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rl c3Qudl9udWxsaWYnOjpyZWdjbGFzcywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3ZpZXdkZWYgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU0VMRUNUIGlkLCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICArCisgICAgIENBU0UgV0hFTiBjMSBJUyBOT1QgTlVMTCBBTkQgYzIgSVMg Tk9UIE5VTEwgQU5EIChjMSBPUEVSQVRPUihwdWJsaWMuPSkgYzIpIFRIRU4gTlVMTCBFTFNFIGMx IEVORCBBUyByKworICAgIEZST00gdDsKKygxIHJvdykKKworU0VMRUNUIHBnX2dldF92aWV3ZGVm KCdoc3RvcmVfdmlld190ZXN0LnZfZGlzdGluY3QnOjpyZWdjbGFzcywgdHJ1ZSk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3ZpZXdkZWYg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNFTEVD VCBpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgICgo YzEgSVMgTk9UIE5VTEwgT1IgYzIgSVMgTk9UIE5VTEwpIEFORCAoYzEgSVMgTlVMTCBPUiBjMiBJ UyBOVUxMIE9SIE5PVCAoYzEgT1BFUkFUT1IocHVibGljLj0pIGMyKSkpIEFTIHIrCisgICAgRlJP TSB0OworKDEgcm93KQorCitTRUxFQ1QgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rlc3Qu dl9ub3RkaXN0Jzo6cmVnY2xhc3MsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3ZpZXdkZWYgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNFTEVDVCBpZCwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICBOT1QgKChjMSBJ UyBOT1QgTlVMTCBPUiBjMiBJUyBOT1QgTlVMTCkgQU5EIChjMSBJUyBOVUxMIE9SIGMyIElTIE5V TEwgT1IgTk9UIChjMSBPUEVSQVRPUihwdWJsaWMuPSkgYzIpKSkgQVMgcisKKyAgICBGUk9NIHQ7 CisoMSByb3cpCisKKy0tIFRoZSBkZXBhcnNlZCBkZWZpbml0aW9ucyBtdXN0IHJlcGFyc2Ugc3Vj Y2Vzc2Z1bGx5IHVuZGVyIHRoYXQgc2FtZQorLS0gcmVzdHJpY3RlZCBzZWFyY2hfcGF0aCAodGhp cyBpcyB3aGF0IGZhaWxlZCBiZWZvcmUpLgorRE8gJCQKK0JFR0lOCisgIEVYRUNVVEUgJ0NSRUFU RSBWSUVXIGhzdG9yZV92aWV3X3Rlc3Qudl9udWxsaWZfcmVsb2FkIEFTICcKKyAgICAgICAgICB8 fCBwZ19nZXRfdmlld2RlZignaHN0b3JlX3ZpZXdfdGVzdC52X251bGxpZic6OnJlZ2NsYXNzKTsK KyAgRVhFQ1VURSAnQ1JFQVRFIFZJRVcgaHN0b3JlX3ZpZXdfdGVzdC52X2Rpc3RpbmN0X3JlbG9h ZCBBUyAnCisgICAgICAgICAgfHwgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rlc3Qudl9k aXN0aW5jdCc6OnJlZ2NsYXNzKTsKKyAgRVhFQ1VURSAnQ1JFQVRFIFZJRVcgaHN0b3JlX3ZpZXdf dGVzdC52X25vdGRpc3RfcmVsb2FkIEFTICcKKyAgICAgICAgICB8fCBwZ19nZXRfdmlld2RlZign aHN0b3JlX3ZpZXdfdGVzdC52X25vdGRpc3QnOjpyZWdjbGFzcyk7CitFTkQgJCQ7CitSRVNFVCBz ZWFyY2hfcGF0aDsKK0RST1AgU0NIRU1BIGhzdG9yZV92aWV3X3Rlc3QgQ0FTQ0FERTsKK05PVElD RTogIGRyb3AgY2FzY2FkZXMgdG8gNyBvdGhlciBvYmplY3RzCitERVRBSUw6ICBkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIGhzdG9yZV92aWV3X3Rlc3QudAorZHJvcCBjYXNjYWRlcyB0byB2aWV3IGhz dG9yZV92aWV3X3Rlc3Qudl9udWxsaWYKK2Ryb3AgY2FzY2FkZXMgdG8gdmlldyBoc3RvcmVfdmll d190ZXN0LnZfZGlzdGluY3QKK2Ryb3AgY2FzY2FkZXMgdG8gdmlldyBoc3RvcmVfdmlld190ZXN0 LnZfbm90ZGlzdAorZHJvcCBjYXNjYWRlcyB0byB2aWV3IGhzdG9yZV92aWV3X3Rlc3Qudl9udWxs aWZfcmVsb2FkCitkcm9wIGNhc2NhZGVzIHRvIHZpZXcgaHN0b3JlX3ZpZXdfdGVzdC52X2Rpc3Rp bmN0X3JlbG9hZAorZHJvcCBjYXNjYWRlcyB0byB2aWV3IGhzdG9yZV92aWV3X3Rlc3Qudl9ub3Rk aXN0X3JlbG9hZApkaWZmIC0tZ2l0IGEvY29udHJpYi9oc3RvcmUvc3FsL2hzdG9yZS5zcWwgYi9j b250cmliL2hzdG9yZS9zcWwvaHN0b3JlLnNxbAppbmRleCA4YWU5NWU4Li42MGRmNjMzIDEwMDY0 NAotLS0gYS9jb250cmliL2hzdG9yZS9zcWwvaHN0b3JlLnNxbAorKysgYi9jb250cmliL2hzdG9y ZS9zcWwvaHN0b3JlLnNxbApAQCAtMzkzLDMgKzM5Myw0MyBAQCBGUk9NICAgKFZBTFVFUyAoTlVM TDo6aHN0b3JlKSwgKCcnKSwgKCciYSBrZXkiID0+MScpLCAoJ2MgPT4gbnVsbCcpLAogICAgICAg ICgnZSA9PiAwMTIzNDUnKSwgKCdnID0+IDIuMzQ1ZSs0JykpIHgodikKIFdIRVJFICBoc3RvcmVf aGFzaCh2KTo6Yml0KDMyKSAhPSBoc3RvcmVfaGFzaF9leHRlbmRlZCh2LCAwKTo6Yml0KDMyKQog ICAgICAgIE9SIGhzdG9yZV9oYXNoKHYpOjpiaXQoMzIpID0gaHN0b3JlX2hhc2hfZXh0ZW5kZWQo diwgMSk6OmJpdCgzMik7CisKKy0tIFZpZXdzIHVzaW5nIE5VTExJRiBvciBJUyBbTk9UXSBESVNU SU5DVCBGUk9NIG9uIGhzdG9yZSB2YWx1ZXMgbXVzdCBiZQorLS0gZGVwYXJzZWQgd2l0aCBhIHNj aGVtYS1xdWFsaWZpZWQgZXF1YWxpdHkgb3BlcmF0b3Igd2hlbiBoc3RvcmUncyAiPSIKKy0tIG9w ZXJhdG9yIGlzIG5vdCByZWFjaGFibGUgdGhyb3VnaCB0aGUgc2VhcmNoX3BhdGgsIHNvIHRoYXQg dGhlIGR1bXBlZAorLS0gZGVmaW5pdGlvbiByZWxvYWRzIGNvcnJlY3RseSAoZS5nLiB3aXRoIHRo ZSBlbXB0eSBzZWFyY2hfcGF0aCBwZ19kdW1wIHVzZXMpLgorQ1JFQVRFIFNDSEVNQSBoc3RvcmVf dmlld190ZXN0OworQ1JFQVRFIFRBQkxFIGhzdG9yZV92aWV3X3Rlc3QudCAoaWQgaW50LCBjMSBo c3RvcmUsIGMyIGhzdG9yZSk7CitDUkVBVEUgVklFVyBoc3RvcmVfdmlld190ZXN0LnZfbnVsbGlm IEFTCisgIFNFTEVDVCBpZCwgTlVMTElGKGMxLCBjMikgQVMgciBGUk9NIGhzdG9yZV92aWV3X3Rl c3QudDsKK0NSRUFURSBWSUVXIGhzdG9yZV92aWV3X3Rlc3Qudl9kaXN0aW5jdCBBUworICBTRUxF Q1QgaWQsIGMxIElTIERJU1RJTkNUIEZST00gYzIgQVMgciBGUk9NIGhzdG9yZV92aWV3X3Rlc3Qu dDsKK0NSRUFURSBWSUVXIGhzdG9yZV92aWV3X3Rlc3Qudl9ub3RkaXN0IEFTCisgIFNFTEVDVCBp ZCwgYzEgSVMgTk9UIERJU1RJTkNUIEZST00gYzIgQVMgciBGUk9NIGhzdG9yZV92aWV3X3Rlc3Qu dDsKKworLS0gV2l0aCBoc3RvcmUgb24gdGhlIHNlYXJjaF9wYXRoIHRoZSBub3JtYWwsIHVucXVh bGlmaWVkIHN5bnRheCBpcyB1c2VkLgorU0VUIHNlYXJjaF9wYXRoID0gaHN0b3JlX3ZpZXdfdGVz dCwgcHVibGljOworU0VMRUNUIHBnX2dldF92aWV3ZGVmKCdoc3RvcmVfdmlld190ZXN0LnZfbnVs bGlmJzo6cmVnY2xhc3MsIHRydWUpOworU0VMRUNUIHBnX2dldF92aWV3ZGVmKCdoc3RvcmVfdmll d190ZXN0LnZfZGlzdGluY3QnOjpyZWdjbGFzcywgdHJ1ZSk7CitTRUxFQ1QgcGdfZ2V0X3ZpZXdk ZWYoJ2hzdG9yZV92aWV3X3Rlc3Qudl9ub3RkaXN0Jzo6cmVnY2xhc3MsIHRydWUpOworCistLSBX aXRoIGhzdG9yZSBvZmYgdGhlIHNlYXJjaF9wYXRoIHRoZSBvcGVyYXRvciBtdXN0IGJlIHNjaGVt YS1xdWFsaWZpZWQuCitTRVQgc2VhcmNoX3BhdGggPSBoc3RvcmVfdmlld190ZXN0OworU0VMRUNU IHBnX2dldF92aWV3ZGVmKCdoc3RvcmVfdmlld190ZXN0LnZfbnVsbGlmJzo6cmVnY2xhc3MsIHRy dWUpOworU0VMRUNUIHBnX2dldF92aWV3ZGVmKCdoc3RvcmVfdmlld190ZXN0LnZfZGlzdGluY3Qn OjpyZWdjbGFzcywgdHJ1ZSk7CitTRUxFQ1QgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rl c3Qudl9ub3RkaXN0Jzo6cmVnY2xhc3MsIHRydWUpOworCistLSBUaGUgZGVwYXJzZWQgZGVmaW5p dGlvbnMgbXVzdCByZXBhcnNlIHN1Y2Nlc3NmdWxseSB1bmRlciB0aGF0IHNhbWUKKy0tIHJlc3Ry aWN0ZWQgc2VhcmNoX3BhdGggKHRoaXMgaXMgd2hhdCBmYWlsZWQgYmVmb3JlKS4KK0RPICQkCitC RUdJTgorICBFWEVDVVRFICdDUkVBVEUgVklFVyBoc3RvcmVfdmlld190ZXN0LnZfbnVsbGlmX3Jl bG9hZCBBUyAnCisgICAgICAgICAgfHwgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rlc3Qu dl9udWxsaWYnOjpyZWdjbGFzcyk7CisgIEVYRUNVVEUgJ0NSRUFURSBWSUVXIGhzdG9yZV92aWV3 X3Rlc3Qudl9kaXN0aW5jdF9yZWxvYWQgQVMgJworICAgICAgICAgIHx8IHBnX2dldF92aWV3ZGVm KCdoc3RvcmVfdmlld190ZXN0LnZfZGlzdGluY3QnOjpyZWdjbGFzcyk7CisgIEVYRUNVVEUgJ0NS RUFURSBWSUVXIGhzdG9yZV92aWV3X3Rlc3Qudl9ub3RkaXN0X3JlbG9hZCBBUyAnCisgICAgICAg ICAgfHwgcGdfZ2V0X3ZpZXdkZWYoJ2hzdG9yZV92aWV3X3Rlc3Qudl9ub3RkaXN0Jzo6cmVnY2xh c3MpOworRU5EICQkOworCitSRVNFVCBzZWFyY2hfcGF0aDsKK0RST1AgU0NIRU1BIGhzdG9yZV92 aWV3X3Rlc3QgQ0FTQ0FERTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxl dXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYwppbmRleCA4OGRlNWMw Li4wNzU3YzQwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMK KysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1bGV1dGlscy5jCkBAIC01NDMsNiArNTQzLDgg QEAgc3RhdGljIGNoYXIgKmdlbmVyYXRlX2Z1bmN0aW9uX25hbWUoT2lkIGZ1bmNpZCwgaW50IG5h cmdzLAogCQkJCQkJCQkJYm9vbCBoYXNfdmFyaWFkaWMsIGJvb2wgKnVzZV92YXJpYWRpY19wLAog CQkJCQkJCQkJYm9vbCBpbkdyb3VwQnkpOwogc3RhdGljIGNoYXIgKmdlbmVyYXRlX29wZXJhdG9y X25hbWUoT2lkIG9wZXJpZCwgT2lkIGFyZzEsIE9pZCBhcmcyKTsKK3N0YXRpYyBib29sIG51bGxp Zl9kaXN0aW5jdF9uZWVkc19xdWFsaWZpZWRfZm9ybShPaWQgb3BubywgTm9kZSAqYXJnMSwKKwkJ CQkJCQkJCQkJCSBOb2RlICphcmcyLCBjaGFyICoqb3BuYW1lKTsKIHN0YXRpYyB2b2lkIGFkZF9j YXN0X3RvKFN0cmluZ0luZm8gYnVmLCBPaWQgdHlwaWQpOwogc3RhdGljIGNoYXIgKmdlbmVyYXRl X3F1YWxpZmllZF90eXBlX25hbWUoT2lkIHR5cGlkKTsKIHN0YXRpYyB0ZXh0ICpzdHJpbmdfdG9f dGV4dChjaGFyICpzdHIpOwpAQCAtOTgwMCw2ICs5ODAyLDUyIEBAIGdldF9qc29uX2V4cHJfb3B0 aW9ucyhKc29uRXhwciAqanNleHByLCBkZXBhcnNlX2NvbnRleHQgKmNvbnRleHQsCiAJCWdldF9q c29uX2JlaGF2aW9yKGpzZXhwci0+b25fZXJyb3IsIGNvbnRleHQsICJFUlJPUiIpOwogfQogCisv KgorICogbnVsbGlmX2Rpc3RpbmN0X25lZWRzX3F1YWxpZmllZF9mb3JtCisgKgorICogRGVjaWRl IHdoZXRoZXIgYSBOVUxMSUYgb3IgSVMgW05PVF0gRElTVElOQ1QgRlJPTSBjb25zdHJ1Y3QgaGFz IHRvIGJlCisgKiBkZXBhcnNlZCB1c2luZyBhbiBleHBsaWNpdCwgb3BlcmF0b3ItcXVhbGlmaWVk IHN1YnN0aXR1dGUgZXhwcmVzc2lvbgorICogaW5zdGVhZCBvZiBpdHMgbm9ybWFsIHN5bnRheC4K KyAqCisgKiBCb3RoIGNvbnN0cnVjdHMgZGVwZW5kIG9uIGFuIGVxdWFsaXR5IG9wZXJhdG9yIHRo YXQgaXMgd3JpdHRlbiwgaW4gdGhlaXIKKyAqIHN5bnRheCwgb25seSBhcyB0aGUgdW5xdWFsaWZp ZWQgbmFtZSAiPSIgLS0tIHRoZSBvcGVyYXRvciBpcyByZS1yZXNvbHZlZAorICogYWdhaW5zdCB0 aGUgcHJldmFpbGluZyBzZWFyY2hfcGF0aCB3aGVuIHRoZSBkdW1wZWQgZGVmaW5pdGlvbiBpcyBy ZWxvYWRlZC4KKyAqIFRoYXQgZmFpbHMgd2hlbiB0aGUgb3BlcmF0b3Igd291bGQgbm90IGJlIGZv dW5kIGJ5IGJhcmUgbmFtZSwgZm9yIGV4YW1wbGUgYW4KKyAqIGV4dGVuc2lvbidzICI9IiBvcGVy YXRvciBpbiBhIHZpZXcgZHVtcGVkIHdpdGggYW4gZW1wdHkgc2VhcmNoX3BhdGg6IHRoZQorICog TlVMTElGIC8gSVMgRElTVElOQ1QgRlJPTSBzeW50YXggaGFzIG5vd2hlcmUgdG8gd3JpdGUgYSBz Y2hlbWEtcXVhbGlmaWVkCisgKiBvcGVyYXRvciBuYW1lICh1bmxpa2UgYSBwbGFpbiBPcEV4cHIs IHdoaWNoIGNhbiB1c2UgT1BFUkFUT1Ioc2NoZW1hLj0pKS4KKyAqCisgKiBnZW5lcmF0ZV9vcGVy YXRvcl9uYW1lKCkgYWxyZWFkeSBzY2hlbWEtcXVhbGlmaWVzIGFuIG9wZXJhdG9yIChlbWl0dGlu ZyB0aGUKKyAqICJPUEVSQVRPUiguLi4pIiBkZWNvcmF0aW9uKSBleGFjdGx5IHdoZW4gdGhlIGJh cmUgbmFtZSB3b3VsZCBub3QgcmVzb2x2ZSB0bworICogdGhlIHNhbWUgb3BlcmF0b3IgdW5kZXIg dGhlIGN1cnJlbnQgc2VhcmNoX3BhdGgsIHNvIHdlIHJldXNlIGl0IGFzIHRoZSB0ZXN0LgorICog V2hlbiBxdWFsaWZpY2F0aW9uIGlzIG5lZWRlZCwgdGhlIGNhbGxlciBlbWl0cyBhbiBlcXVpdmFs ZW50IENBU0UgLyBib29sZWFuCisgKiBleHByZXNzaW9uIHRoYXQgY2FuIGNhcnJ5IHRoZSBkZWNv cmF0aW9uOyAqb3BuYW1lIHJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lCisgKiBmb3IgaXQgdG8g dXNlLiAgVGhvc2Ugc3Vic3RpdHV0ZSBmb3JtcyBldmFsdWF0ZSB0aGVpciBpbnB1dCBleHByZXNz aW9ucyBtb3JlCisgKiB0aGFuIG9uY2UsIHNvIHdlIG9ubHkgdXNlIHRoZW0gd2hlbiB0aGUgaW5w dXRzIGFyZSBmcmVlIG9mIHZvbGF0aWxlCisgKiBmdW5jdGlvbnM7IG90aGVyd2lzZSAqb3BuYW1l IGlzIHNldCB0byBOVUxMIGFuZCB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gdGhlCisgKiBzdGFu ZGFyZCBzeW50YXggKHdoaWNoIHN0aWxsIHJlbG9hZHMgY29ycmVjdGx5IHdoZW5ldmVyIHRoZSBv cGVyYXRvciBpcyBvbgorICogdGhlIHNlYXJjaF9wYXRoKS4KKyAqLworc3RhdGljIGJvb2wKK251 bGxpZl9kaXN0aW5jdF9uZWVkc19xdWFsaWZpZWRfZm9ybShPaWQgb3BubywgTm9kZSAqYXJnMSwg Tm9kZSAqYXJnMiwKKwkJCQkJCQkJCSBjaGFyICoqb3BuYW1lKQoreworCWNoYXIJICAgKm5hbWU7 CisKKwkqb3BuYW1lID0gTlVMTDsKKworCW5hbWUgPSBnZW5lcmF0ZV9vcGVyYXRvcl9uYW1lKG9w bm8sIGV4cHJUeXBlKGFyZzEpLCBleHByVHlwZShhcmcyKSk7CisJaWYgKHN0cm5jbXAobmFtZSwg Ik9QRVJBVE9SKCIsIDkpICE9IDApCisJCXJldHVybiBmYWxzZTsJCQkvKiBiYXJlICI9IiByZXNv bHZlcyBjb3JyZWN0bHk7IG5vdGhpbmcgdG8gZG8gKi8KKworCS8qIHRoZSBzdWJzdGl0dXRlIGZv cm1zIGV2YWx1YXRlIGFyZzEvYXJnMiBtb3JlIHRoYW4gb25jZSAqLworCWlmIChjb250YWluX3Zv bGF0aWxlX2Z1bmN0aW9ucyhhcmcxKSB8fCBjb250YWluX3ZvbGF0aWxlX2Z1bmN0aW9ucyhhcmcy KSkKKwkJcmV0dXJuIGZhbHNlOworCisJKm9wbmFtZSA9IG5hbWU7CisJcmV0dXJuIHRydWU7Cit9 CisKIC8qIC0tLS0tLS0tLS0KICAqIGdldF9ydWxlX2V4cHIJCQktIFBhcnNlIGJhY2sgYW4gZXhw cmVzc2lvbgogICoKQEAgLTk5NTgsMjQgKzEwMDA2LDkyIEBAIGdldF9ydWxlX2V4cHIoTm9kZSAq bm9kZSwgZGVwYXJzZV9jb250ZXh0ICpjb250ZXh0LAogCQkJCUxpc3QJICAgKmFyZ3MgPSBleHBy LT5hcmdzOwogCQkJCU5vZGUJICAgKmFyZzEgPSAoTm9kZSAqKSBsaW5pdGlhbChhcmdzKTsKIAkJ CQlOb2RlCSAgICphcmcyID0gKE5vZGUgKikgbHNlY29uZChhcmdzKTsKKwkJCQljaGFyCSAgICpv cG5hbWU7CiAKLQkJCQlpZiAoIVBSRVRUWV9QQVJFTihjb250ZXh0KSkKKwkJCQlpZiAobnVsbGlm X2Rpc3RpbmN0X25lZWRzX3F1YWxpZmllZF9mb3JtKGV4cHItPm9wbm8sCisJCQkJCQkJCQkJCQkJ CSBhcmcxLCBhcmcyLCAmb3BuYW1lKSkKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBlcXVh bGl0eSBvcGVyYXRvciBpcyBub3QgdmlzaWJsZSBieSBpdHMgYmFyZSBuYW1lCisJCQkJCSAqIHVu ZGVyIHRoZSBwcmV2YWlsaW5nIHNlYXJjaF9wYXRoLCBidXQgSVMgRElTVElOQ1QgRlJPTQorCQkJ CQkgKiBzeW50YXggY2Fubm90IGNhcnJ5IGEgcXVhbGlmaWVkIG9wZXJhdG9yIG5hbWUuICBFbWl0 CisJCQkJCSAqIGluc3RlYWQgdGhlIGVxdWl2YWxlbnQgYm9vbGVhbiBleHByZXNzaW9uICIoYSBJ UyBOT1QKKwkJCQkJICogTlVMTCBPUiBiIElTIE5PVCBOVUxMKSBBTkQgKGEgSVMgTlVMTCBPUiBi IElTIE5VTEwgT1IKKwkJCQkJICogTk9UIChhID0gYikpIiB1c2luZyBPUEVSQVRPUihzY2hlbWEu PSkuICBUaGlzCisJCQkJCSAqIHJlcHJvZHVjZXMgdGhlIGV4ZWN1dG9yJ3MgRGlzdGluY3RFeHBy IHNlbWFudGljcywKKwkJCQkJICogaW5jbHVkaW5nIHlpZWxkaW5nIE5VTEwgd2hlbiAiPSIgeWll bGRzIE5VTEwgZm9yIHR3bworCQkJCQkgKiBub24tbnVsbCBpbnB1dHMuICBUaGUgcmVzdWx0IGlz IGFsd2F5cyBwYXJlbnRoZXNpemVkIHNvCisJCQkJCSAqIHRoYXQgYW4gZW5jbG9zaW5nIE5PVCAo YXMgaW4gSVMgTk9UIERJU1RJTkNUIEZST00pCisJCQkJCSAqIGJpbmRzIGl0IGNvcnJlY3RseS4K KwkJCQkJICovCiAJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJygnKTsKLQkJCQlnZXRf cnVsZV9leHByX3BhcmVuKGFyZzEsIGNvbnRleHQsIHRydWUsIG5vZGUpOwotCQkJCWFwcGVuZFN0 cmluZ0luZm9TdHJpbmcoYnVmLCAiIElTIERJU1RJTkNUIEZST00gIik7Ci0JCQkJZ2V0X3J1bGVf ZXhwcl9wYXJlbihhcmcyLCBjb250ZXh0LCB0cnVlLCBub2RlKTsKLQkJCQlpZiAoIVBSRVRUWV9Q QVJFTihjb250ZXh0KSkKLQkJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCQkJ CQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcoJyk7CisJCQkJCWdldF9ydWxlX2V4cHJfcGFy ZW4oYXJnMSwgY29udGV4dCwgdHJ1ZSwgbm9kZSk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJp bmcoYnVmLCAiIElTIE5PVCBOVUxMIE9SICIpOworCQkJCQlnZXRfcnVsZV9leHByX3BhcmVuKGFy ZzIsIGNvbnRleHQsIHRydWUsIG5vZGUpOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1 ZiwgIiBJUyBOT1QgTlVMTCkgQU5EICgiKTsKKwkJCQkJZ2V0X3J1bGVfZXhwcl9wYXJlbihhcmcx LCBjb250ZXh0LCB0cnVlLCBub2RlKTsKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYs ICIgSVMgTlVMTCBPUiAiKTsKKwkJCQkJZ2V0X3J1bGVfZXhwcl9wYXJlbihhcmcyLCBjb250ZXh0 LCB0cnVlLCBub2RlKTsKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgSVMgTlVM TCBPUiBOT1QgKCIpOworCQkJCQlnZXRfcnVsZV9leHByX3BhcmVuKGFyZzEsIGNvbnRleHQsIHRy dWUsIG5vZGUpOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiAlcyAiLCBvcG5hbWUpOwor CQkJCQlnZXRfcnVsZV9leHByX3BhcmVuKGFyZzIsIGNvbnRleHQsIHRydWUsIG5vZGUpOworCQkJ CQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIikpKSIpOworCQkJCX0KKwkJCQllbHNlCisJ CQkJeworCQkJCQlpZiAoIVBSRVRUWV9QQVJFTihjb250ZXh0KSkKKwkJCQkJCWFwcGVuZFN0cmlu Z0luZm9DaGFyKGJ1ZiwgJygnKTsKKwkJCQkJZ2V0X3J1bGVfZXhwcl9wYXJlbihhcmcxLCBjb250 ZXh0LCB0cnVlLCBub2RlKTsKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgSVMg RElTVElOQ1QgRlJPTSAiKTsKKwkJCQkJZ2V0X3J1bGVfZXhwcl9wYXJlbihhcmcyLCBjb250ZXh0 LCB0cnVlLCBub2RlKTsKKwkJCQkJaWYgKCFQUkVUVFlfUEFSRU4oY29udGV4dCkpCisJCQkJCQlh cHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAK IAkJY2FzZSBUX051bGxJZkV4cHI6CiAJCQl7CiAJCQkJTnVsbElmRXhwciAqbnVsbGlmZXhwciA9 IChOdWxsSWZFeHByICopIG5vZGU7CisJCQkJTm9kZQkgICAqYXJnMSA9IChOb2RlICopIGxpbml0 aWFsKG51bGxpZmV4cHItPmFyZ3MpOworCQkJCU5vZGUJICAgKmFyZzIgPSAoTm9kZSAqKSBsc2Vj b25kKG51bGxpZmV4cHItPmFyZ3MpOworCQkJCWNoYXIJICAgKm9wbmFtZTsKIAotCQkJCWFwcGVu ZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiTlVMTElGKCIpOwotCQkJCWdldF9ydWxlX2V4cHIoKE5v ZGUgKikgbnVsbGlmZXhwci0+YXJncywgY29udGV4dCwgdHJ1ZSk7Ci0JCQkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKScpOworCQkJCWlmIChudWxsaWZfZGlzdGluY3RfbmVlZHNfcXVhbGlm aWVkX2Zvcm0obnVsbGlmZXhwci0+b3BubywKKwkJCQkJCQkJCQkJCQkJIGFyZzEsIGFyZzIsICZv cG5hbWUpKQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJICogVGhlIGVxdWFsaXR5IG9wZXJhdG9yIGlz IG5vdCB2aXNpYmxlIGJ5IGl0cyBiYXJlIG5hbWUKKwkJCQkJICogdW5kZXIgdGhlIHByZXZhaWxp bmcgc2VhcmNoX3BhdGgsIGJ1dCBOVUxMSUYgc3ludGF4CisJCQkJCSAqIGNhbm5vdCBjYXJyeSBh IHF1YWxpZmllZCBvcGVyYXRvciBuYW1lLiAgRW1pdCBpbnN0ZWFkCisJCQkJCSAqIHRoZSBlcXVp dmFsZW50IGV4cHJlc3Npb24gIkNBU0UgV0hFTiBhIElTIE5PVCBOVUxMIEFORAorCQkJCQkgKiBi IElTIE5PVCBOVUxMIEFORCAoYSA9IGIpIFRIRU4gTlVMTCBFTFNFIGEgRU5EIiB1c2luZworCQkJ CQkgKiBPUEVSQVRPUihzY2hlbWEuPSkuICBUaGUgSVMgTk9UIE5VTEwgZ3VhcmRzIGtlZXAgdGhl CisJCQkJCSAqIHJlc3VsdCBmYWl0aGZ1bCB0byBOVUxMSUYgZXZlbiBmb3IgYSBub24tc3RyaWN0 ICI9IgorCQkJCQkgKiBvcGVyYXRvciAoTlVMTElGIGRvZXMgbm90IGFwcGx5ICI9IiB3aGVuIGVp dGhlciBpbnB1dAorCQkJCQkgKiBpcyBudWxsKS4gIENBU0UgLi4uIEVORCBpcyBzZWxmLWRlbGlt aXRpbmcsIHNvIG5vIG91dGVyCisJCQkJCSAqIHBhcmVudGhlc2VzIGFyZSBuZWVkZWQuCisJCQkJ CSAqLworCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIkNBU0UgV0hFTiAiKTsKKwkJ CQkJZ2V0X3J1bGVfZXhwcl9wYXJlbihhcmcxLCBjb250ZXh0LCB0cnVlLCBub2RlKTsKKwkJCQkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgSVMgTk9UIE5VTEwgQU5EICIpOworCQkJCQln ZXRfcnVsZV9leHByX3BhcmVuKGFyZzIsIGNvbnRleHQsIHRydWUsIG5vZGUpOworCQkJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiBJUyBOT1QgTlVMTCBBTkQgKCIpOworCQkJCQlnZXRf cnVsZV9leHByX3BhcmVuKGFyZzEsIGNvbnRleHQsIHRydWUsIG5vZGUpOworCQkJCQlhcHBlbmRT dHJpbmdJbmZvKGJ1ZiwgIiAlcyAiLCBvcG5hbWUpOworCQkJCQlnZXRfcnVsZV9leHByX3BhcmVu KGFyZzIsIGNvbnRleHQsIHRydWUsIG5vZGUpOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIikgVEhFTiBOVUxMIEVMU0UgIik7CisJCQkJCWdldF9ydWxlX2V4cHJfcGFyZW4oYXJn MSwgY29udGV4dCwgdHJ1ZSwgbm9kZSk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVm LCAiIEVORCIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlhcHBlbmRTdHJpbmdJbmZv U3RyaW5nKGJ1ZiwgIk5VTExJRigiKTsKKwkJCQkJZ2V0X3J1bGVfZXhwcigoTm9kZSAqKSBudWxs aWZleHByLT5hcmdzLCBjb250ZXh0LCB0cnVlKTsKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIo YnVmLCAnKScpOworCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCi0tIAoyLjU0LjAKCg== --6a47b171_12200854_2eb5--