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 1weWUJ-004qdb-0C for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 11:18:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1weWUH-007o2x-1E for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 11:18:45 +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 1weWUG-007o2p-2C for pgsql-hackers@lists.postgresql.org; Tue, 30 Jun 2026 11:18:45 +0000 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1weWUD-00000000uIW-19Pq for pgsql-hackers@lists.postgresql.org; Tue, 30 Jun 2026 11:18:43 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-698823a9881so422720a12.2 for ; Tue, 30 Jun 2026 04:18:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782818319; cv=none; d=google.com; s=arc-20260327; b=il1Bd6KHLnTAGQCiVAkgom9+T4enemXyLtI9SMmoXyJAe+I+TYqNCEehCQKAX3/NAr BFa1++9BnP1XFOPOqHXL0Vj+V65umblzFqWzkNPswtTLoiRdh37IrCOpYeR4DRh/7tZb vjKITrTslnqG5wTMzp8y3CS+0y8u4Go6kK93LU9tXnjOQq9vzfnvRiWvocmp3yu9RyMR pBr3kImTJ+Q6ew5b7i+KzgpPEE4qRrxRXLBJw+cX67uPWOygYsa+b6bKJA9VbaVDpZHg t7Q8hCUD86mvPZz6AX4m5C7oFIzyi+dYz0U85n4jW5p8B27Rw9j5t6Uhr3Mrta9jIeHs /1jA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=YKp2/pEyI6wgHYnp8bylZCHI7p8BqGqieeMEWKZq2cM=; fh=GPUT5foBG+PE9k7dCNRBRwd8TAKoBgqqfTNIvTX8nu0=; b=UtXuBWj+g0OnbofIGJZ4uaTLZHGjFxBBFqvWOymPVM025cX7UUcyum4GAMmCexuEQT yExjlEnBiZpPXlAZBkQD8Gcs/WqhZDqB6z0oXfS7cdaEsSPgoL5F3L7f2jZKuor63Ild MxzD67zvkUR8pcdOHorvScsdphFBTxmUNaIL9HxCjwN88J9OtUGIzilerMCqFpIWmaxL 2wxsGUFLY1piYISayV1iD3PrSW7OYq/dWZTS1cAK2twBbZH5GZcaRGe/Bzf6wEzRk/Ku 4qdgDcVjhcTJo/EqgLtDZq6Tp1gLTL9gNnllX0db82Pb/DLxB3N2tV676ym7CRim0LMm ZBjg==; 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=enterprisedb.com; s=google; t=1782818319; x=1783423119; 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=YKp2/pEyI6wgHYnp8bylZCHI7p8BqGqieeMEWKZq2cM=; b=Xp//i783cCSHHhycScg/Ln/nvmT9W7ztOzJW0jOZ89qgsdWJRPLmNmEn0CjxT7dH/x BG4VBqSK1lo6MXCCxsx5Ir2FNcjK/w+btpMmRqwYXMgPHLlnfq4PFQxTydkc2wCMfYYe EJXksGHSDOaqI6tHiFo3ACgZajvsLz2iBLde3UudRFxA78/MEb97pHQ5YGzt44jlL96j f1DgguUx60QymDXgfRlBu7CBOUWMwdx4ToRK3bTsmB75IPG02tt+//1JiYzbPA66P4+M xXtZdQg1TzYO/AobPDoxnGrjmCbL6sucxm5oqWXu1troCqhDqXKLZga5fGIt+KSAk1Xt qUrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782818319; x=1783423119; 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=YKp2/pEyI6wgHYnp8bylZCHI7p8BqGqieeMEWKZq2cM=; b=oYpeDgAlrbqgLVHKYH1A+RUVAZRYLW5L5z1Qar/42LxPoIW2nanA79niTcNT1DTKyQ ahMGFJ6rC0WfvLbEbXk4K44larNjvmMVKKKw/2+uR5DF1Xfa4vSKitv4UXROGt9kvUla GT/OHo6SRse8hjPVRE/ljSTAqvbT7IIfq4I/aHlO81bPbqa49fp/p7J64ZtLaq/CKCv2 /5cqJiGigN04C8ww/BrrNmGB2Uvo/E0M5EhN2C3Fz4lM7pzku1oOFvLLECYhJVnaqsRL +JgR8WOOmyqrkZ8Z0QOhKc6sWtmbRSsLS/6Lmimxu7bsxZJbuBcK4M9cWJyTKUDXdVm1 5d9Q== X-Forwarded-Encrypted: i=1; AHgh+Rp8XSiFF80P4J401CUWMaVep/5KwTtG4e/TpHN3P/wxOfQ/WCqNjW9COZkg/qsZDX4+HvY2KyUrq/YgYyzy@lists.postgresql.org X-Gm-Message-State: AOJu0Yyv9EPy4EC9lQuTd4LUbRxLzQqjjAxPRAoH8R5oUAwWWBvTebyX x3oOQuZeVmJHmsRVJ3+NCibk8UnTCv/rb6ljXNaf0vX7Jarf2FTpJzsK2CmG43QJxV3Jr6g1qEj PUOdcF0bnoSX9TUax631nf9bTuyfibOKnOyq7NvUi X-Gm-Gg: AfdE7clAHmj3plSpVrwaaVPRMs1AoGQZLihmsKzWj5yw3jPDLs/nLDHsN2GBXTwVEH7 vji5Xs8ie9BlbzlB4l3grB2m45+LRgEpOo7IA2Tps+eTn81C21hUQzAbkWRCKaSsqhPXspFkXNF Ly2u3+z+Nq/mPc5dVQNbkbPqfgFtYSHWPz9OeuUDDIj4EtZK9pFs8T0spBi6e8cTVr/u/MLa//S YqCbXDtot1bIOauuHh5WhYWDeDd21pAS475Mcb536ZG/o7TPewOo0x73pXDllebVcym7gYqhg== X-Received: by 2002:a17:906:514d:20b0:c12:8e66:cf58 with SMTP id a640c23a62f3a-c1297fafae5mr1441966b.30.1782818319466; Tue, 30 Jun 2026 04:18:39 -0700 (PDT) MIME-Version: 1.0 References: <177997571870.313758.10720313850275742354.pgcf@coridan.postgresql.org> In-Reply-To: From: Akshay Joshi Date: Tue, 30 Jun 2026 16:48:26 +0530 X-Gm-Features: AVVi8Cfs3U55l5RL5KDI59DWNQRSJ9Z9OsgccfZE_V9FC1wn7DQ37EkyXVZ8OxY Message-ID: Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement To: solai v Cc: Ilmar Y , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000a1d47d065576bc23" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a1d47d065576bc23 Content-Type: multipart/alternative; boundary="000000000000a1d47a065576bc21" --000000000000a1d47a065576bc21 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable All, I've updated the patch to align with the interface change introduced by commit *d6ed87d1989* (Andrew Dunstan, 2026-06-26 "Use named boolean parameters for pg_get_*_ddl option arguments"). That commit replaced the VARIADIC text[] alternating key/value option interface with typed named boolean parameters across pg_get_role_ddl(), pg_get_tablespace_ddl(), and pg_get_database_ddl(), removing the DdlOption/parse_ddl_options() machinery in favour of direct PG_GETARG_BOOL() calls. Updated patch v14 is ready for review/commit. On Mon, Jun 29, 2026 at 7:12=E2=80=AFPM Akshay Joshi wrote: > Rebased *v13* patch is now ready for review and commit. > > On Mon, Jun 22, 2026 at 6:49=E2=80=AFPM Akshay Joshi < > akshay.joshi@enterprisedb.com> wrote: > >> *Chao Li* found an issue in my other patch for *pg_get_table_ddl.* Speci= fically, >> the existing pattern in pg_proc.dat for variadic-text functions (e.g., >> jsonb_delete, json_extract_path) uses *_text* instead of *text* at the >> variadic position in both proargtypes and proallargtypes, with provariad= ic >> =3D> 'text'. This is the convention documented by the sanity check in >> src/test/regress/sql/opr_sanity.sql. >> >> I realized the same issue was present in this patch as well, so I have >> fixed it and added corresponding test cases. >> >> The v12 patch is now ready for review and commit. >> >> On Mon, Jun 22, 2026 at 6:34=E2=80=AFPM Akshay Joshi < >> akshay.joshi@enterprisedb.com> wrote: >> >>> >>> >>> On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v w= rote: >>> >>>> Hi all, >>>> >>>> >>>> On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li = wrote: >>>> > >>>> > On Fri, 29 May 2026 at 12:20, Akshay Joshi < >>>> akshay.joshi@enterprisedb.com> wrote: >>>> > > Thanks for the reviews. >>>> > > >>>> > > My original patch (v9) was actually correct. After considering >>>> Japin's review comment, I initially thought the extra >>>> > > parentheses weren't necessary, but they are indeed required for >>>> handling boolean values properly in non-pretty mode too, >>>> > > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. >>>> > > >>>> > >>>> > My bad! I had not considered this situation. >>>> > >>>> > > `pg_get_expr()` only adds outer parentheses for composite >>>> expressions (via the deparsers for `OpExpr`, `BoolExpr`, etc.). >>>> > > For atomic top-level nodes like `Const`, `Var`, `current_user`, >>>> `NULL`, etc. >>>> > > For example: >>>> > > >>>> > > CREATE POLICY p ON t USING (true); >>>> > > SELECT pg_get_policy_ddl('t', 'p'); -- previously: ... USING >>>> true; (syntax error) >>>> > > >>>> > > This is exactly why `pg_dump` always wraps the expression >>>> unconditionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477: >>>> > > >>>> > > if (polinfo->polqual !=3D NULL) >>>> > > appendPQExpBuffer(query, " USING (%s)", polinfo->polqual); >>>> > > if (polinfo->polwithcheck !=3D NULL) >>>> > > appendPQExpBuffer(query, " WITH CHECK (%s)", >>>> polinfo->polwithcheck); >>>> > > >>>> > > I've also added a round-trip regression test with `USING (true)` / >>>> `WITH CHECK (false)` that captures the generated DDL, >>>> > > drops the policies, re-executes the DDL, and verifies the policies >>>> are recreated. >>>> > > >>>> > > v11 Patch attached for review. >>>> > > >>>> > > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y >>>> wrote: >>>> > > >>>> > > The following review has been posted through the commitfest >>>> application: >>>> > > make installcheck-world: not tested >>>> > > Implements feature: tested, failed >>>> > > Spec compliant: not tested >>>> > > Documentation: not tested >>>> > > >>>> > > Hi, >>>> > > >>>> > > I looked at v10, focused on whether the generated CREATE POLICY >>>> statement >>>> > > can be executed again. >>>> > > >>>> > > The patch applies cleanly on current master at >>>> > > 8a86aa313a714adc56c74e4b08793e4e6102b5ca. >>>> > > >>>> > > git diff --check reports no issues. >>>> > > >>>> > > I built with: >>>> > > >>>> > > ./configure --prefix=3D"$PWD/pg-install" --without-readline >>>> --without-zlib --without-icu >>>> > > make -s -j8 >>>> > > make -s install >>>> > > >>>> > > make -C src/test/regress check TESTS=3Drowsecurity >>>> > > >>>> > > ended up running the full parallel_schedule in this makefile; all >>>> 245 tests >>>> > > passed, including rowsecurity. >>>> > > >>>> > > I found one correctness issue in the generated non-pretty DDL. >>>> The code >>>> > > assumes that pg_get_expr_ext(..., false) already returns the >>>> parentheses >>>> > > required by CREATE POLICY syntax, but that is not true for simple >>>> boolean >>>> > > constants. >>>> > > >>>> > > For example: >>>> > > >>>> > > CREATE TABLE t(a int); >>>> > > CREATE POLICY p_true ON t USING (true); >>>> > > SELECT ddl FROM pg_get_policy_ddl('t', 'p_true', 'pretty', >>>> 'false') AS ddl; >>>> > > >>>> > > returns: >>>> > > >>>> > > CREATE POLICY p_true ON public.t USING true; >>>> > > >>>> > > If I drop the policy and execute that generated statement, it >>>> fails: >>>> > > >>>> > > ERROR: syntax error at or near "true" >>>> > > LINE 1: CREATE POLICY p_true ON public.t USING true; >>>> > > ^ >>>> > > >>>> > > The same issue reproduces for WITH CHECK: >>>> > > >>>> > > CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); >>>> > > >>>> > > is reconstructed as: >>>> > > >>>> > > CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK false; >>>> > > >>>> > > and executing it fails at "false". >>>> > > >>>> > > So I think USING and WITH CHECK need to be parenthesized in >>>> non-pretty mode >>>> > > too, or the tests should include a round-trip execution check for >>>> generated >>>> > > DDL with simple boolean expressions. >>>> > > >>>> > > I used two small SQL reproducers for the manual checks; the >>>> complete repro is >>>> > > included above. >>>> > > >>>> > > I have not reviewed the broader pg_get_*_ddl API design or every >>>> possible >>>> > > policy expression form. >>>> > > >>>> > > Regards, >>>> > > Ilmar Yunusov >>>> > > >>>> > > The new status of this patch is: Waiting on Author >>>> > >>>> >>>> >>>> I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified >>>> the basic functionality by creating various row-level security >>>> policies and checking the reconstructed DDL returned by >>>> pg_get_policy_ddl(). The function correctly reconstructed policies for >>>> different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE >>>> and RESTRICTIVE policies, multiple role lists, quoted identifiers, >>>> USING clauses, and WITH CHECK clauses. >>>> I also tested more complex cases involving subqueries. Policies >>>> containing EXISTS subqueries in both USING and WITH CHECK clauses were >>>> reconstructed successfully. Nested subqueries were also handled >>>> correctly, and I did not encounter any issues related to expression >>>> reconstruction or variable handling. I verified NULL input handling as >>>> well. Passing NULL values for the table name or policy name returned >>>> no rows as expected. Invalid relation names resulted in the expected >>>> regclass resolution error. One observation from testing is that the >>>> generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For >>>> example, a policy created with FOR ALL TO PUBLIC is reconstructed >>>> without those clauses, while still producing semantically equivalent >>>> DDL. I'm not sure whether this is intentional or if the function is >>>> expected to reproduce all clauses explicitly, but it may be worth >>>> discussing. >>>> Overall, the patch worked as expected in all scenarios I tested, and I >>>> did not find any functional issues. >>>> >>> >>> Thanks for the review. The omission of FOR ALL and TO PUBLIC is >>> intentional and matches the long-standing convention used by >>> pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc.: emit a cla= use >>> only when it differs from the parser's default. The result is semantica= lly >>> equivalent to the CREATE POLICY DDL. >>> >>>> >>>> >>>> Regards, >>>> Solai >>>> >>> --000000000000a1d47a065576bc21 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
All,=C2=A0

I've updated the patch to align= with the interface change introduced by commit d6ed87d1989 (Andrew = Dunstan, 2026-06-26 "Use named boolean parameters for pg_get_*_ddl opt= ion arguments").

That commit replaced the VAR= IADIC text[] alternating key/value option interface with typed named boolea= n parameters across pg_get_role_ddl(), pg_get_tablespace_ddl(), and pg_get_= database_ddl(), removing=C2=A0the DdlOption/parse_ddl_options() machinery i= n favour of direct PG_GETARG_BOOL() calls.

Updated patch v14 is ready for review/commit.

On Mon, Jun 29, 2026 at 7:12=E2=80=AFPM Akshay Joshi &l= t;akshay.joshi@enterprised= b.com> wrote:
Rebased v13 patch is now ready for review and = commit.

On Mon, Jun 22, 2026 at 6:49=E2=80=AFPM Akshay Joshi <akshay.joshi@enterp= risedb.com> wrote:
Chao Li found an issue in my other patch= for pg_get_table_ddl.=C2=A0Specifically, the existing pattern in pg= _proc.dat for variadic-text functions (e.g., jsonb_delete, json_extract_pat= h) uses _text=C2=A0instead of text at the variadic position i= n both proargtypes and proallargtypes, with provariadic =3D> 'text&#= 39;. This is the convention documented by the sanity check in src/test/regr= ess/sql/opr_sanity.sql.

I realized the same issue was present in thi= s patch as well, so I have fixed it and added corresponding test cases.
=
The v12 patch is now ready for review and commit.

On Mon, Jun 22, 2026= at 6:34=E2=80=AFPM Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
=


On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v <solai.cdac@gmail.com= > wrote:
= Hi all,


On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li <japinli@hotmail.com> wrote:
>
> On Fri, 29 May 2026 at 12:20, Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
> > Thanks for the reviews.
> >
> > My original patch (v9) was actually correct. After considering Ja= pin's review comment, I initially thought the extra
> > parentheses weren't necessary, but they are indeed required f= or handling boolean values properly in non-pretty mode too,
> > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. > >
>
> My bad!=C2=A0 I had not considered this situation.
>
> > `pg_get_expr()` only adds outer parentheses for composite express= ions (via the deparsers for `OpExpr`, `BoolExpr`, etc.).
> > For atomic top-level nodes like `Const`, `Var`, `current_user`, `= NULL`, etc.
> > For example:
> >
> >=C2=A0 =C2=A0 =C2=A0CREATE POLICY p ON t USING (true);
> >=C2=A0 =C2=A0 =C2=A0SELECT pg_get_policy_ddl('t', 'p&#= 39;);=C2=A0 -- previously: ... USING true;=C2=A0 (syntax error)
> >
> > This is exactly why `pg_dump` always wraps the expression uncondi= tionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477:
> >
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polqual !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = USING (%s)", polinfo->polqual);
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polwithcheck !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = WITH CHECK (%s)", polinfo->polwithcheck);
> >
> > I've also added a round-trip regression test with `USING (tru= e)` / `WITH CHECK (false)` that captures the generated DDL,
> > drops the policies, re-executes the DDL, and verifies the policie= s are recreated.
> >
> > v11 Patch attached for review.
> >
> > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y <
tanswis42@gmail.com> wro= te:
> >
> >=C2=A0 The following review has been posted through the commitfest= application:
> >=C2=A0 make installcheck-world:=C2=A0 not tested
> >=C2=A0 Implements feature:=C2=A0 =C2=A0 =C2=A0 =C2=A0tested, faile= d
> >=C2=A0 Spec compliant:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0not= tested
> >=C2=A0 Documentation:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 not= tested
> >
> >=C2=A0 Hi,
> >
> >=C2=A0 I looked at v10, focused on whether the generated CREATE PO= LICY statement
> >=C2=A0 can be executed again.
> >
> >=C2=A0 The patch applies cleanly on current master at
> >=C2=A0 8a86aa313a714adc56c74e4b08793e4e6102b5ca.
> >
> >=C2=A0 git diff --check reports no issues.
> >
> >=C2=A0 I built with:
> >
> >=C2=A0 ./configure --prefix=3D"$PWD/pg-install" --withou= t-readline --without-zlib --without-icu
> >=C2=A0 make -s -j8
> >=C2=A0 make -s install
> >
> >=C2=A0 make -C src/test/regress check TESTS=3Drowsecurity
> >
> >=C2=A0 ended up running the full parallel_schedule in this makefil= e; all 245 tests
> >=C2=A0 passed, including rowsecurity.
> >
> >=C2=A0 I found one correctness issue in the generated non-pretty D= DL.=C2=A0 The code
> >=C2=A0 assumes that pg_get_expr_ext(..., false) already returns th= e parentheses
> >=C2=A0 required by CREATE POLICY syntax, but that is not true for = simple boolean
> >=C2=A0 constants.
> >
> >=C2=A0 For example:
> >
> >=C2=A0 CREATE TABLE t(a int);
> >=C2=A0 CREATE POLICY p_true ON t USING (true);
> >=C2=A0 SELECT ddl FROM pg_get_policy_ddl('t', 'p_true&= #39;, 'pretty', 'false') AS ddl;
> >
> >=C2=A0 returns:
> >
> >=C2=A0 CREATE POLICY p_true ON public.t USING true;
> >
> >=C2=A0 If I drop the policy and execute that generated statement, = it fails:
> >
> >=C2=A0 ERROR:=C2=A0 syntax error at or near "true"
> >=C2=A0 LINE 1: CREATE POLICY p_true ON public.t USING true;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^
> >
> >=C2=A0 The same issue reproduces for WITH CHECK:
> >
> >=C2=A0 CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); > >
> >=C2=A0 is reconstructed as:
> >
> >=C2=A0 CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK fal= se;
> >
> >=C2=A0 and executing it fails at "false".
> >
> >=C2=A0 So I think USING and WITH CHECK need to be parenthesized in= non-pretty mode
> >=C2=A0 too, or the tests should include a round-trip execution che= ck for generated
> >=C2=A0 DDL with simple boolean expressions.
> >
> >=C2=A0 I used two small SQL reproducers for the manual checks; the= complete repro is
> >=C2=A0 included above.
> >
> >=C2=A0 I have not reviewed the broader pg_get_*_ddl API design or = every possible
> >=C2=A0 policy expression form.
> >
> >=C2=A0 Regards,
> >=C2=A0 Ilmar Yunusov
> >
> >=C2=A0 The new status of this patch is: Waiting on Author
>


I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified
the basic functionality by creating various row-level security
policies and checking the reconstructed DDL returned by
pg_get_policy_ddl(). The function correctly reconstructed policies for
different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE
and RESTRICTIVE policies, multiple role lists, quoted identifiers,
USING clauses, and WITH CHECK clauses.
I also tested more complex cases involving subqueries. Policies
containing EXISTS subqueries in both USING and WITH CHECK clauses were
reconstructed successfully. Nested subqueries were also handled
correctly, and I did not encounter any issues related to expression
reconstruction or variable handling. I verified NULL input handling as
well. Passing NULL values for the table name or policy name returned
no rows as expected. Invalid relation names resulted in the expected
regclass resolution error. One observation from testing is that the
generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For
example, a policy created with FOR ALL TO PUBLIC is reconstructed
without those clauses, while still producing semantically equivalent
DDL. I'm not sure whether this is intentional or if the function is
expected to reproduce all clauses explicitly, but it may be worth
discussing.
Overall, the patch worked as expected in all scenarios I tested, and I
did not find any functional issues.

Thanks for the review. The omissi= on of FOR ALL and TO PUBLIC is intentional and matches the long-standing co= nvention used by pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc= .: emit a clause only when it differs from the parser's default. The re= sult is semantically equivalent to the CREATE POLICY DDL.=C2=A0


Regards,
Solai
--000000000000a1d47a065576bc21-- --000000000000a1d47d065576bc23 Content-Type: application/octet-stream; name="v14-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v14-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mr0jzd2o0 RnJvbSA5YjJkNGUyMjA2MGI4MGVhZDBhYzMzY2JmODEyMjQ2M2JhOTcyNTczIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDIyIE1heSAyMDI2IDE4OjE4OjA3ICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2MTRdIEFkZCBwZ19nZXRfcG9saWN5X2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBQ T0xJQ1kKIHN0YXRlbWVudHMKCiAgcGdfZ2V0X3BvbGljeV9kZGwodGFibGUgcmVnY2xhc3MsCiAg ICAgICAgICAgICAgICAgICAgcG9saWN5bmFtZSBuYW1lLAogICAgICAgICAgICAgICAgICAgIHBy ZXR0eSBib29sIERFRkFVTFQgZmFsc2UpCiAgUkVUVVJOUyBTRVRPRiB0ZXh0CgpyZWNvbnN0cnVj dHMgdGhlIENSRUFURSBQT0xJQ1kgc3RhdGVtZW50IGZvciB0aGUgbmFtZWQgcm93LWxldmVsCnNl Y3VyaXR5IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlLiAgQWx0aG91Z2ggYSBzaW5nbGUg c3RhdGVtZW50IGlzCnByb2R1Y2VkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIFNFVE9GIHRleHQg cmVzdWx0IHNvIGl0cyBjYWxsaW5nCmNvbnZlbnRpb24gbWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUg cGdfZ2V0XypfZGRsIGZhbWlseS4KClRoZSByZWNvbnN0cnVjdGVkIERETCBpbmNsdWRlcyBhbGwg Y2xhdXNlcyBvZiB0aGUgQ1JFQVRFIFBPTElDWSBzeW50YXg6CnRoZSBwb2xpY3kncyBwZXJtaXNz aXZlbmVzcyAoQVMgUkVTVFJJQ1RJVkUpLCBjb21tYW5kIHR5cGUgKEZPUgpTRUxFQ1QvSU5TRVJU L1VQREFURS9ERUxFVEUpLCByb2xlIGxpc3QgKFRPIDxyb2xlcz4pLCBVU0lORwpxdWFsaWZpY2F0 aW9uLCBhbmQgV0lUSCBDSEVDSyBleHByZXNzaW9uLiAgQ2xhdXNlcyB3aG9zZSB2YWx1ZSBlcXVh bHMKdGhlIHBhcnNlcidzIGRlZmF1bHQgLS0gUEVSTUlTU0lWRSwgRk9SIEFMTCwgYW5kIFRPIFBV QkxJQyAtLSBhcmUKb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQsIG1hdGNoaW5nIHRoZSBjb252ZW50 aW9uIHVzZWQgYnkgcGdfZ2V0X2luZGV4ZGVmLApwZ19nZXRfY29uc3RyYWludGRlZiwgcGdfZ2V0 X3ZpZXdkZWYsIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucy4gIFRoZSByZXN1bHQKaXMgdGhlcmVmb3Jl IHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBEREwsIG5vdCBsZXhpY2Fs bHkKaWRlbnRpY2FsLgoKVGhlIHByZXR0eSBwYXJhbWV0ZXIgY29udHJvbHMgb3V0cHV0IGZvcm1h dHRpbmcgYW5kIGRlZmF1bHRzIHRvIGZhbHNlLApmb2xsb3dpbmcgdGhlIHNhbWUgY29udmVudGlv biBhcyBwZ19nZXRfcm9sZV9kZGwsIHBnX2dldF90YWJsZXNwYWNlX2RkbCwKYW5kIHBnX2dldF9k YXRhYmFzZV9kZGwuICBOVUxMIHBhc3NlZCBleHBsaWNpdGx5IGZvciBwcmV0dHkgaXMgdHJlYXRl ZAphcyBmYWxzZS4KCk5VTEwgaW5wdXRzIGZvciB0aGUgdGFibGUgb3IgcG9saWN5IG5hbWUgeWll bGQgbm8gcm93cy4gIEFuIGludmFsaWQKcmVsYXRpb24gbmFtZSBzdXJmYWNlcyB0aGUgcmVnY2xh c3MgcmVzb2x1dGlvbiBlcnJvcjsgYSBub24tZXhpc3RlbnQKcG9saWN5IHJhaXNlcyBhbiBleHBs aWNpdCAicG9saWN5IC4uLiBkb2VzIG5vdCBleGlzdCIgZXJyb3IuCgpVc2FnZSBleGFtcGxlczoK CiAgLS0gY29tcGFjdCBmb3JtIChkZWZhdWx0KQogIFNFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YWJsZScsICdwb2wxJyk7CiAgU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgxNjU2NCwgJ3BvbDEnKTsKCiAgLS0gcHJldHR5LXByaW50ZWQgZm9ybQogIFNFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YWJsZScsICdwb2wxJywgdHJ1ZSk7CgpSZWdy ZXNzaW9uIGNvdmVyYWdlIGlzIGFkZGVkIHRvIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3NlY3Vy aXR5LnNxbAphbmQgZXhlcmNpc2VzIGFsbCB2YWxpZCBjb21iaW5hdGlvbnMgb2YgdGhlIENSRUFU RSBQT0xJQ1kgc3ludGF4OgpQRVJNSVNTSVZFL1JFU1RSSUNUSVZFLCBhbGwgRk9SIGNvbW1hbmQg dmFyaWFudHMgKEFMTC9TRUxFQ1QvSU5TRVJULwpVUERBVEUvREVMRVRFKSwgbXVsdGktcm9sZSBU TyBsaXN0cywgVVNJTkctb25seSwgV0lUSCBDSEVDSy1vbmx5LCBhbmQKVVNJTkcrV0lUSCBDSEVD SyBwb2xpY2llcyBmb3IgYm90aCBBTEwgYW5kIFVQREFURSBjb21tYW5kcyAodGhlIG9ubHkKdHdv IHRoYXQgYWNjZXB0IGJvdGgpLCBSRVNUUklDVElWRSBvbiBhIHNwZWNpZmljIGNvbW1hbmQgdHlw ZSwKc3VicXVlcnkgZXhwcmVzc2lvbnMsIHByZXR0eSBhbmQgbm9uLXByZXR0eSBvdXRwdXQsIGFs bCBib29sZWFuCnJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIHByZXR0eSBhcmd1bWVudCAodHJ1ZS9m YWxzZSwgb24vb2ZmLCAxLzApLApOVUxMIGFuZCBlcnJvciBwYXRocywgYW5kIGEgcm91bmQtdHJp cCB0ZXN0IHRoYXQgZHJvcHMgYW5kIHJlLWV4ZWN1dGVzCnRoZSBnZW5lcmF0ZWQgRERMLgoKQXV0 aG9yOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNlZGIuY29tPgotLS0KIGRv Yy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sICAgICAgICAgIHwgIDE5ICsrCiBzcmMvYmFj a2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYyAgICAgICAgICB8IDI1OSArKysrKysrKysrKysrKysr KysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICB8ICAgNiArCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jvd3NlY3VyaXR5Lm91dCB8IDI5MSArKysrKysrKysr KysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgICAgICB8 IDEyOCArKysrKysrKysrCiA1IGZpbGVzIGNoYW5nZWQsIDcwMyBpbnNlcnRpb25zKCspCgpkaWZm IC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwgYi9kb2Mvc3JjL3NnbWwv ZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCA2OWVmMzg1N2NmYS4uODU4ZWE0NjA5YTYgMTAwNjQ0 Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCisrKyBiL2RvYy9zcmMvc2dt bC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0zOTYwLDYgKzM5NjAsMjUgQEAgYWNsICAgICAgfCB7 cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIvcG9zdGdyZXN9CiAgICAgICAgIGlzIGZh bHNlLCB0aGUgPGxpdGVyYWw+T1dORVI8L2xpdGVyYWw+IGNsYXVzZSBpcyBvbWl0dGVkLgogICAg ICAgIDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxl bnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+ CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcG9saWN5X2Rk bDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ19n ZXRfcG9saWN5X2RkbDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFy YW1ldGVyPiA8dHlwZT5yZWdjbGFzczwvdHlwZT4sCisgICAgICAgIDxwYXJhbWV0ZXI+cG9saWN5 X25hbWU8L3BhcmFtZXRlcj4gPHR5cGU+bmFtZTwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFsPiwg PHBhcmFtZXRlcj5wcmV0dHk8L3BhcmFtZXRlcj4gPHR5cGU+Ym9vbGVhbjwvdHlwZT4KKyAgICAg ICAgPC9vcHRpb25hbD4gKQorICAgICAgICA8cmV0dXJudmFsdWU+c2V0b2YgdGV4dDwvcmV0dXJu dmFsdWU+CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBSZWNvbnN0cnVj dHMgdGhlIDxjb21tYW5kPkNSRUFURSBQT0xJQ1k8L2NvbW1hbmQ+IHN0YXRlbWVudCBmb3IgdGhl CisgICAgICAgIG5hbWVkIHJvdy1sZXZlbCBzZWN1cml0eSBwb2xpY3kgb24gdGhlIHNwZWNpZmll ZCB0YWJsZS4gIFRoZSByZXN1bHQKKyAgICAgICAgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgcm93 LiAgSWYgPHBhcmFtZXRlcj5wcmV0dHk8L3BhcmFtZXRlcj4gaXMKKyAgICAgICAgdHJ1ZSwgdGhl IG91dHB1dCBpcyBmb3JtYXR0ZWQgZm9yIHJlYWRhYmlsaXR5OyB0aGUgZGVmYXVsdCBpcyBmYWxz ZS4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5Pgog ICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9kZGx1dGlscy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKaW5kZXgg YTcwZjFjMjg2NTUuLmNmN2I1OTYwODVmIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvZGRsdXRpbHMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYwpAQCAt MjYsNiArMjYsNyBAQAogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29sbGF0aW9uLmgiCiAjaW5jbHVk ZSAiY2F0YWxvZy9wZ19kYXRhYmFzZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGJfcm9sZV9z ZXR0aW5nLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19wb2xpY3kuaCIKICNpbmNsdWRlICJjYXRh bG9nL3BnX3RhYmxlc3BhY2UuaCIKICNpbmNsdWRlICJjb21tYW5kcy90YWJsZXNwYWNlLmgiCiAj aW5jbHVkZSAiY29tbW9uL3JlbHBhdGguaCIKQEAgLTU2LDYgKzU3LDkgQEAgc3RhdGljIExpc3Qg KnBnX2dldF90YWJsZXNwYWNlX2RkbF9pbnRlcm5hbChPaWQgdHNpZCwgYm9vbCBwcmV0dHksIGJv b2wgbm9fb3duZXIKIHN0YXRpYyBEYXR1bSBwZ19nZXRfdGFibGVzcGFjZV9kZGxfc3JmKEZ1bmN0 aW9uQ2FsbEluZm8gZmNpbmZvLCBPaWQgdHNpZCk7CiBzdGF0aWMgTGlzdCAqcGdfZ2V0X2RhdGFi YXNlX2RkbF9pbnRlcm5hbChPaWQgZGJpZCwgYm9vbCBwcmV0dHksCiAJCQkJCQkJCQkJICBib29s IG5vX293bmVyLCBib29sIG5vX3RhYmxlc3BhY2UpOworc3RhdGljIExpc3QgKnBnX2dldF9wb2xp Y3lfZGRsX2ludGVybmFsKE9pZCB0YWJsZUlELCBjb25zdCBjaGFyICpwb2xpY3lOYW1lLAorCQkJ CQkJCQkJCWJvb2wgcHJldHR5KTsKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfcG9saWN5X2NtZF9u YW1lKGNoYXIgY21kKTsKIAogCiAvKgpAQCAtOTc1LDMgKzk3OSwyNTggQEAgcGdfZ2V0X2RhdGFi YXNlX2RkbChQR19GVU5DVElPTl9BUkdTKQogCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CiAJ fQogfQorCisvKgorICogZ2V0X3BvbGljeV9jbWRfbmFtZQorICoJCU1hcCBhIG5vbi1BTEwgcGdf cG9saWN5LnBvbGNtZCBjaGFyIHRvIGl0cyBTUUwga2V5d29yZC4KKyAqCisgKiBDYWxsZXJzIG11 c3QgZ3VhcmQgYWdhaW5zdCAnKicgKEFMTCkgdGhlbXNlbHZlczsgaXQgaXMgbm90IHBhc3NlZCBo ZXJlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfcG9saWN5X2NtZF9uYW1lKGNoYXIg Y21kKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBBQ0xfU0VMRUNUX0NIUjoKKwkJCXJl dHVybiAiU0VMRUNUIjsKKwkJY2FzZSBBQ0xfSU5TRVJUX0NIUjoKKwkJCXJldHVybiAiSU5TRVJU IjsKKwkJY2FzZSBBQ0xfVVBEQVRFX0NIUjoKKwkJCXJldHVybiAiVVBEQVRFIjsKKwkJY2FzZSBB Q0xfREVMRVRFX0NIUjoKKwkJCXJldHVybiAiREVMRVRFIjsKKwkJZGVmYXVsdDoKKwkJCWVsb2co RVJST1IsICJ1bnJlY29nbml6ZWQgcG9saWN5IGNvbW1hbmQ6ICVkIiwgKGludCkgY21kKTsKKwkJ CXJldHVybiBOVUxMOwkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLworCX0KK30KKworLyoKKyAq IHBnX2dldF9wb2xpY3lfZGRsX2ludGVybmFsCisgKgkJR2VuZXJhdGUgdGhlIERETCBzdGF0ZW1l bnQgdG8gcmVjcmVhdGUgYSByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWN5LgorICoKKyAqIFJldHVy bnMgYSBMaXN0IGNvbnRhaW5pbmcgYSBzaW5nbGUgcGFsbG9jJ2Qgc3RyaW5nIHdpdGggdGhlIENS RUFURSBQT0xJQ1kKKyAqIHN0YXRlbWVudC4gIFJldHVybmluZyBhIExpc3Qga2VlcHMgdGhlIGNh bGxpbmcgY29udmVudGlvbiBjb25zaXN0ZW50IHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBwZ19n ZXRfKl9kZGwgZmFtaWx5IGV2ZW4gdGhvdWdoIG9ubHkgb25lIHJvdyBpcyBwcm9kdWNlZC4KKyAq Lworc3RhdGljIExpc3QgKgorcGdfZ2V0X3BvbGljeV9kZGxfaW50ZXJuYWwoT2lkIHRhYmxlSUQs IGNvbnN0IGNoYXIgKnBvbGljeU5hbWUsIGJvb2wgcHJldHR5KQoreworCVJlbGF0aW9uCXBnUG9s aWN5UmVsOworCUhlYXBUdXBsZQl0dXBsZVBvbGljeTsKKwlGb3JtX3BnX3BvbGljeSBwb2xpY3lG b3JtOworCVNjYW5LZXlEYXRhIHNrZXlbMl07CisJU3lzU2NhbkRlc2Mgc3NjYW47CisJU3RyaW5n SW5mb0RhdGEgYnVmOworCURhdHVtCQl2YWx1ZURhdHVtOworCWJvb2wJCWF0dHJJc051bGw7CisJ Y2hhcgkgICAqcmVsbmFtZTsKKwljaGFyCSAgICpuc3BuYW1lOworCWNoYXIJICAgKnRhcmdldFRh YmxlOworCUxpc3QJICAgKnN0YXRlbWVudHMgPSBOSUw7CisKKwkvKiBWYWxpZGF0ZSB0aGF0IHRo ZSByZWxhdGlvbiBleGlzdHMgYW5kIGJ1aWxkIGl0cyBxdWFsaWZpZWQgbmFtZS4gKi8KKwlyZWxu YW1lID0gZ2V0X3JlbF9uYW1lKHRhYmxlSUQpOworCWlmIChyZWxuYW1lID09IE5VTEwpCisJCWVy ZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURfVEFCTEUpLAorCQkJ CSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwgdGFibGVJRCkp KTsKKworCW5zcG5hbWUgPSBnZXRfbmFtZXNwYWNlX25hbWUoZ2V0X3JlbF9uYW1lc3BhY2UodGFi bGVJRCkpOworCWlmIChuc3BuYW1lID09IE5VTEwpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVy cmNvZGUoRVJSQ09ERV9VTkRFRklORURfU0NIRU1BKSwKKwkJCQkgZXJybXNnKCJzY2hlbWEgZm9y IHJlbGF0aW9uIHdpdGggT0lEICV1IGRvZXMgbm90IGV4aXN0IiwKKwkJCQkJCXRhYmxlSUQpKSk7 CisKKwl0YXJnZXRUYWJsZSA9IHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKG5zcG5hbWUsIHJl bG5hbWUpOworCXBmcmVlKHJlbG5hbWUpOworCXBmcmVlKG5zcG5hbWUpOworCisJcGdQb2xpY3lS ZWwgPSB0YWJsZV9vcGVuKFBvbGljeVJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwkv KiBTZXQga2V5IC0gcG9saWN5J3MgcmVsYXRpb24gaWQuICovCisJU2NhbktleUluaXQoJnNrZXlb MF0sCisJCQkJQW51bV9wZ19wb2xpY3lfcG9scmVsaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVt YmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0odGFibGVJRCkpOworCisJLyogU2V0 IGtleSAtIHBvbGljeSdzIG5hbWUuICovCisJU2NhbktleUluaXQoJnNrZXlbMV0sCisJCQkJQW51 bV9wZ19wb2xpY3lfcG9sbmFtZSwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfTkFNRUVR LAorCQkJCUNTdHJpbmdHZXREYXR1bShwb2xpY3lOYW1lKSk7CisKKwlzc2NhbiA9IHN5c3RhYmxl X2JlZ2luc2NhbihwZ1BvbGljeVJlbCwKKwkJCQkJCQkgICBQb2xpY3lQb2xyZWxpZFBvbG5hbWVJ bmRleElkLCB0cnVlLCBOVUxMLCAyLAorCQkJCQkJCSAgIHNrZXkpOworCisJdHVwbGVQb2xpY3kg PSBzeXN0YWJsZV9nZXRuZXh0KHNzY2FuKTsKKwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodHVwbGVQ b2xpY3kpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVE X09CSkVDVCksCisJCQkJIGVycm1zZygicG9saWN5IFwiJXNcIiBmb3IgdGFibGUgXCIlc1wiIGRv ZXMgbm90IGV4aXN0IiwKKwkJCQkJCXBvbGljeU5hbWUsIHRhcmdldFRhYmxlKSkpOworCisJcG9s aWN5Rm9ybSA9IChGb3JtX3BnX3BvbGljeSkgR0VUU1RSVUNUKHR1cGxlUG9saWN5KTsKKworCWlu aXRTdHJpbmdJbmZvKCZidWYpOworCisJLyogQnVpbGQgdGhlIENSRUFURSBQT0xJQ1kgc3RhdGVt ZW50ICovCisJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiQ1JFQVRFIFBPTElDWSAlcyBPTiAlcyIs CisJCQkJCSBxdW90ZV9pZGVudGlmaWVyKHBvbGljeU5hbWUpLAorCQkJCQkgdGFyZ2V0VGFibGUp OworCXBmcmVlKHRhcmdldFRhYmxlKTsKKworCS8qCisJICogRW1pdCBBUyBSRVNUUklDVElWRSBv bmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0IChQRVJNSVNTSVZFKS4KKwkgKi8K KwlpZiAoIXBvbGljeUZvcm0tPnBvbHBlcm1pc3NpdmUpCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZi dWYsIHByZXR0eSwgNCwgIkFTIFJFU1RSSUNUSVZFIik7CisKKwkvKgorCSAqIEVtaXQgRk9SIDxj bWQ+IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQgKEFMTCwgZW5jb2RlZCBh cworCSAqICcqJykuCisJICovCisJaWYgKHBvbGljeUZvcm0tPnBvbGNtZCAhPSAnKicpCisJCWFw cGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIkZPUiAlcyIsCisJCQkJCQkgIGdldF9w b2xpY3lfY21kX25hbWUocG9saWN5Rm9ybS0+cG9sY21kKSk7CisKKwkvKgorCSAqIEVtaXQgVE8g PHJvbGVzPiBvbmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0IChQVUJMSUMpLiAg UFVCTElDCisJICogaXMgZW5jb2RlZCBpbiBwb2xyb2xlcyBhcyBhIHNpbmdsZSBJbnZhbGlkT2lk IGVsZW1lbnQsIHNvIHdlIG9taXQgdGhlCisJICogY2xhdXNlIHdoZW5ldmVyIGV2ZXJ5IGVudHJ5 IGlzIEludmFsaWRPaWQuICBwb2xyb2xlcyBpcyBhbHdheXMgbm9uLU5VTEwuCisJICovCisJdmFs dWVEYXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZVBvbGljeSwKKwkJCQkJCQkgIEFudW1fcGdfcG9s aWN5X3BvbHJvbGVzLAorCQkJCQkJCSAgUmVsYXRpb25HZXREZXNjcihwZ1BvbGljeVJlbCksCisJ CQkJCQkJICAmYXR0cklzTnVsbCk7CisJQXNzZXJ0KCFhdHRySXNOdWxsKTsKKwl7CisJCUFycmF5 VHlwZSAgKnBvbGljeV9yb2xlcyA9IERhdHVtR2V0QXJyYXlUeXBlUCh2YWx1ZURhdHVtKTsKKwkJ aW50CQkJbml0ZW1zID0gQVJSX0RJTVMocG9saWN5X3JvbGVzKVswXTsKKwkJT2lkCQkgICAqcm9s ZXMgPSAoT2lkICopIEFSUl9EQVRBX1BUUihwb2xpY3lfcm9sZXMpOworCQlTdHJpbmdJbmZvRGF0 YSByb2xlX25hbWVzOworCisJCWluaXRTdHJpbmdJbmZvKCZyb2xlX25hbWVzKTsKKworCQlmb3Ig KGludCBpID0gMDsgaSA8IG5pdGVtczsgaSsrKQorCQl7CisJCQlpZiAoT2lkSXNWYWxpZChyb2xl c1tpXSkpCisJCQl7CisJCQkJY2hhcgkgICAqcm9sZW5hbWUgPSBHZXRVc2VyTmFtZUZyb21JZChy b2xlc1tpXSwgZmFsc2UpOworCisJCQkJaWYgKHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCQkJYXBw ZW5kU3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1lcywgIiwgIik7CisJCQkJYXBwZW5kU3RyaW5n SW5mb1N0cmluZygmcm9sZV9uYW1lcywgcXVvdGVfaWRlbnRpZmllcihyb2xlbmFtZSkpOworCQkJ CXBmcmVlKHJvbGVuYW1lKTsKKwkJCX0KKwkJfQorCisJCWlmIChyb2xlX25hbWVzLmxlbiA+IDAp CisJCQlhcHBlbmRfZGRsX29wdGlvbigmYnVmLCBwcmV0dHksIDQsICJUTyAlcyIsIHJvbGVfbmFt ZXMuZGF0YSk7CisKKwkJcGZyZWUocm9sZV9uYW1lcy5kYXRhKTsKKwl9CisKKwkvKiBVU0lORyBl eHByZXNzaW9uICovCisJdmFsdWVEYXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZVBvbGljeSwKKwkJ CQkJCQkgIEFudW1fcGdfcG9saWN5X3BvbHF1YWwsCisJCQkJCQkJICBSZWxhdGlvbkdldERlc2Ny KHBnUG9saWN5UmVsKSwKKwkJCQkJCQkgICZhdHRySXNOdWxsKTsKKwlpZiAoIWF0dHJJc051bGwp CisJeworCQlEYXR1bQkJZXhwcjsKKworCQlleHByID0gRGlyZWN0RnVuY3Rpb25DYWxsMyhwZ19n ZXRfZXhwcl9leHQsCisJCQkJCQkJCSAgIHZhbHVlRGF0dW0sCisJCQkJCQkJCSAgIE9iamVjdElk R2V0RGF0dW0ocG9saWN5Rm9ybS0+cG9scmVsaWQpLAorCQkJCQkJCQkgICBCb29sR2V0RGF0dW0o cHJldHR5KSk7CisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIlVTSU5HICgl cykiLAorCQkJCQkJICBUZXh0RGF0dW1HZXRDU3RyaW5nKGV4cHIpKTsKKwl9CisKKwkvKiBXSVRI IENIRUNLIGV4cHJlc3Npb24gKi8KKwl2YWx1ZURhdHVtID0gaGVhcF9nZXRhdHRyKHR1cGxlUG9s aWN5LAorCQkJCQkJCSAgQW51bV9wZ19wb2xpY3lfcG9sd2l0aGNoZWNrLAorCQkJCQkJCSAgUmVs YXRpb25HZXREZXNjcihwZ1BvbGljeVJlbCksCisJCQkJCQkJICAmYXR0cklzTnVsbCk7CisJaWYg KCFhdHRySXNOdWxsKQorCXsKKwkJRGF0dW0JCWV4cHI7CisKKwkJZXhwciA9IERpcmVjdEZ1bmN0 aW9uQ2FsbDMocGdfZ2V0X2V4cHJfZXh0LAorCQkJCQkJCQkgICB2YWx1ZURhdHVtLAorCQkJCQkJ CQkgICBPYmplY3RJZEdldERhdHVtKHBvbGljeUZvcm0tPnBvbHJlbGlkKSwKKwkJCQkJCQkJICAg Qm9vbEdldERhdHVtKHByZXR0eSkpOworCQlhcHBlbmRfZGRsX29wdGlvbigmYnVmLCBwcmV0dHks IDQsICJXSVRIIENIRUNLICglcykiLAorCQkJCQkJICBUZXh0RGF0dW1HZXRDU3RyaW5nKGV4cHIp KTsKKwl9CisKKwlhcHBlbmRTdHJpbmdJbmZvQ2hhcigmYnVmLCAnOycpOworCisJc3RhdGVtZW50 cyA9IGxhcHBlbmQoc3RhdGVtZW50cywgcHN0cmR1cChidWYuZGF0YSkpOworCisJc3lzdGFibGVf ZW5kc2Nhbihzc2Nhbik7CisJdGFibGVfY2xvc2UocGdQb2xpY3lSZWwsIEFjY2Vzc1NoYXJlTG9j ayk7CisJcGZyZWUoYnVmLmRhdGEpOworCisJcmV0dXJuIHN0YXRlbWVudHM7Cit9CisKKy8qCisg KiBwZ19nZXRfcG9saWN5X2RkbAorICoJCVJldHVybiBEREwgdG8gcmVjcmVhdGUgYSByb3ctbGV2 ZWwgc2VjdXJpdHkgcG9saWN5IGFzIGEgc2luZ2xlIHRleHQgcm93LgorICovCitEYXR1bQorcGdf Z2V0X3BvbGljeV9kZGwoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlGdW5jQ2FsbENvbnRleHQgKmZ1 bmNjdHg7CisJTGlzdAkgICAqc3RhdGVtZW50czsKKworCWlmIChTUkZfSVNfRklSU1RDQUxMKCkp CisJeworCQlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CisJCU9pZAkJCXRhYmxlSUQ7CisJCU5h bWUJCXBvbGljeU5hbWU7CisJCWJvb2wJCXByZXR0eTsKKworCQlmdW5jY3R4ID0gU1JGX0ZJUlNU Q0FMTF9JTklUKCk7CisJCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0 eC0+bXVsdGlfY2FsbF9tZW1vcnlfY3R4KTsKKworCQlpZiAoUEdfQVJHSVNOVUxMKDApIHx8IFBH X0FSR0lTTlVMTCgxKSkKKwkJeworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp OworCQkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOworCQl9CisKKwkJdGFibGVJRCA9IFBHX0dF VEFSR19PSUQoMCk7CisJCXBvbGljeU5hbWUgPSBQR19HRVRBUkdfTkFNRSgxKTsKKwkJcHJldHR5 ID0gIVBHX0FSR0lTTlVMTCgyKSAmJiBQR19HRVRBUkdfQk9PTCgyKTsKKworCQlzdGF0ZW1lbnRz ID0gcGdfZ2V0X3BvbGljeV9kZGxfaW50ZXJuYWwodGFibGVJRCwKKwkJCQkJCQkJCQkJCU5hbWVT dHIoKnBvbGljeU5hbWUpLAorCQkJCQkJCQkJCQkJcHJldHR5KTsKKwkJZnVuY2N0eC0+dXNlcl9m Y3R4ID0gc3RhdGVtZW50czsKKwkJZnVuY2N0eC0+bWF4X2NhbGxzID0gbGlzdF9sZW5ndGgoc3Rh dGVtZW50cyk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCX0KKwor CWZ1bmNjdHggPSBTUkZfUEVSQ0FMTF9TRVRVUCgpOworCXN0YXRlbWVudHMgPSAoTGlzdCAqKSBm dW5jY3R4LT51c2VyX2ZjdHg7CisKKwlpZiAoZnVuY2N0eC0+Y2FsbF9jbnRyIDwgZnVuY2N0eC0+ bWF4X2NhbGxzKQorCXsKKwkJY2hhcgkgICAqc3RtdDsKKworCQlzdG10ID0gbGlzdF9udGgoc3Rh dGVtZW50cywgZnVuY2N0eC0+Y2FsbF9jbnRyKTsKKworCQlTUkZfUkVUVVJOX05FWFQoZnVuY2N0 eCwgQ1N0cmluZ0dldFRleHREYXR1bShzdG10KSk7CisJfQorCWVsc2UKKwl7CisJCWxpc3RfZnJl ZV9kZWVwKHN0YXRlbWVudHMpOworCQlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CisJfQorfQpk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggNzNiYjdmYmI0MzAuLjljNDZmMzY3NmRlIDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTg2MjAsNiArODYyMCwxMiBAQAogICBwcm9hcmd0eXBl cyA9PiAncmVnZGF0YWJhc2UgYm9vbCBib29sIGJvb2wnLAogICBwcm9hcmduYW1lcyA9PiAne2Rh dGFiYXNlLHByZXR0eSxvd25lcix0YWJsZXNwYWNlfScsCiAgIHByb2FyZ2RlZmF1bHRzID0+ICd7 ZmFsc2UsdHJ1ZSx0cnVlfScsIHByb3NyYyA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcgfSwKK3sg b2lkID0+ICc2NTE3JywgZGVzY3IgPT4gJ2dldCBEREwgdG8gcmVjcmVhdGUgYSByb3ctbGV2ZWwg c2VjdXJpdHkgcG9saWN5JywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X3BvbGljeV9kZGwnLCBwcm9y b3dzID0+ICcxJywgcHJvaXNzdHJpY3QgPT4gJ2YnLAorICBwcm9yZXRzZXQgPT4gJ3QnLCBwcm92 b2xhdGlsZSA9PiAncycsIHByb25hcmdkZWZhdWx0cyA9PiAnMScsCisgIHByb3JldHR5cGUgPT4g J3RleHQnLCBwcm9hcmd0eXBlcyA9PiAncmVnY2xhc3MgbmFtZSBib29sJywKKyAgcHJvYXJnbmFt ZXMgPT4gJ3t0YWJsZSxwb2xpY3luYW1lLHByZXR0eX0nLCBwcm9hcmdkZWZhdWx0cyA9PiAne2Zh bHNlfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X3BvbGljeV9kZGwnIH0sCiB7IG9pZCA9PiAnMjUw OScsCiAgIGRlc2NyID0+ICdkZXBhcnNlIGFuIGVuY29kZWQgZXhwcmVzc2lvbiB3aXRoIHByZXR0 eS1wcmludCBvcHRpb24nLAogICBwcm9uYW1lID0+ICdwZ19nZXRfZXhwcicsIHByb3ZvbGF0aWxl ID0+ICdzJywgcHJvcmV0dHlwZSA9PiAndGV4dCcsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3Jvd3NlY3VyaXR5Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv cm93c2VjdXJpdHkub3V0CmluZGV4IDNhNWU4MmMzNWJkLi5iZjU0ZjY2MzM5ZiAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yb3dzZWN1cml0eS5vdXQKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9yb3dzZWN1cml0eS5vdXQKQEAgLTUxOTUsNiArNTE5NSwyOTcg QEAgcmVzZXQgcmxzX3Rlc3QuYmxhaDsKIGRyb3AgZnVuY3Rpb24gcmxzX2YodGV4dCk7CiBkcm9w IHRhYmxlIHJsc190LCB0ZXN0X3Q7CiAtLQorLS0gVGVzdCBmb3IgcGdfZ2V0X3BvbGljeV9kZGwo dGFibGUsIHBvbGljeV9uYW1lWywgcHJldHR5XSkgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxF IHJsc190YmxfMSAoCisgICAgZGlkICAgICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAg ICAgICAgIGludCwKKyAgICBkbGV2ZWwgICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAg ICAgbmFtZSwKKyAgICBkdGl0bGUgICAgICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190Ymxf MSBUTyBwdWJsaWM7CitDUkVBVEUgVEFCTEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBu YW1lIHByaW1hcnkga2V5LAorICAgIHNlY2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBP TiBybHNfdGJsXzIgVE8gcHVibGljOworLS0gVGVzdCBQRVJNSVNTSVZFIGFuZCBSRVNUUklDVElW RQorQ1JFQVRFIFBPTElDWSBybHNfcDEgT04gcmxzX3RibF8xIEFTIFBFUk1JU1NJVkUKKyAgICBV U0lORyAoZGxldmVsIDw9IChTRUxFQ1Qgc2VjbHYgRlJPTSBybHNfdGJsXzIgV0hFUkUgcGd1c2Vy ID0gY3VycmVudF91c2VyKSk7CitDUkVBVEUgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzEgQVMg UkVTVFJJQ1RJVkUgVVNJTkcgKGNpZCA8PiA0NCBBTkQgY2lkIDwgNTApOworLS0gVGVzdCBGT1Ig QUxMIHwgU0VMRUNUIHwgSU5TRVJUIHwgVVBEQVRFIHwgREVMRVRFCitDUkVBVEUgUE9MSUNZIHJs c19wMyBPTiBybHNfdGJsXzEgRk9SIEFMTCBVU0lORyAoZGF1dGhvciA9IGN1cnJlbnRfdXNlcik7 CitDUkVBVEUgUE9MSUNZIHJsc19wNCBPTiBybHNfdGJsXzEgRk9SIFNFTEVDVCBVU0lORyAoY2lk ICUgMiA9IDApOworQ1JFQVRFIFBPTElDWSBybHNfcDUgT04gcmxzX3RibF8xIEZPUiBJTlNFUlQg V0lUSCBDSEVDSyAoY2lkICUgMiA9IDEpOworQ1JFQVRFIFBPTElDWSBybHNfcDYgT04gcmxzX3Ri bF8xIEZPUiBVUERBVEUgVVNJTkcgKGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A3 IE9OIHJsc190YmxfMSBGT1IgREVMRVRFIFVTSU5HIChjaWQgPCA4KTsKKy0tIFRlc3QgVE8geyBy b2xlX25hbWUgLi4uIH0KK0NSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBUTyByZWdy ZXNzX3Jsc19kYXZlLCByZWdyZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9M SUNZIHJsc19wOSBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBD SEVDSyAoY2lkID0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMikpOworLS0gVGVzdCBVUERB VEUgcG9saWN5IHdpdGggYm90aCBVU0lORyBhbmQgV0lUSCBDSEVDSworQ1JFQVRFIFBPTElDWSBy bHNfcDEwIE9OIHJsc190YmxfMSBGT1IgVVBEQVRFCisgICAgVVNJTkcgKGRsZXZlbCA+IDApIFdJ VEggQ0hFQ0sgKGRsZXZlbCA8IDEwMCk7CistLSBUZXN0IEFMTCBwb2xpY3kgd2l0aCBib3RoIFVT SU5HIGFuZCBXSVRIIENIRUNLIChBUyBQRVJNSVNTSVZFIGFuZCBGT1IgQUxMIGFyZSBkZWZhdWx0 cywgb21pdHRlZCkKK0NSRUFURSBQT0xJQ1kgcmxzX3AxMSBPTiBybHNfdGJsXzEKKyAgICBVU0lO RyAoZGxldmVsID49IDEpIFdJVEggQ0hFQ0sgKGRsZXZlbCA8PSA5OSk7CistLSBUZXN0IFJFU1RS SUNUSVZFIG9uIGEgc3BlY2lmaWMgY29tbWFuZAorQ1JFQVRFIFBPTElDWSBybHNfcDEyIE9OIHJs c190YmxfMSBBUyBSRVNUUklDVElWRSBGT1IgU0VMRUNUCisgICAgVVNJTkcgKGNpZCA+IDApOwor LS0gTlVMTCBpbnB1dHMgc2hvdWxkIHJldHVybiBubyByb3dzCitTRUxFQ1QgY291bnQoKikgRlJP TSBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCAncmxzX3AxJyk7CisgY291bnQgCistLS0tLS0tCisg ICAgIDAKKygxIHJvdykKKworU0VMRUNUIGNvdW50KCopIEZST00gcGdfZ2V0X3BvbGljeV9kZGwo J3Jsc190YmxfMScsIE5VTEwpOworIGNvdW50IAorLS0tLS0tLQorICAgICAwCisoMSByb3cpCisK K1NFTEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsIE5VTEwpOworIGNv dW50IAorLS0tLS0tLQorICAgICAwCisoMSByb3cpCisKKy0tIFRhYmxlIGRvZXMgbm90IGV4aXN0 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdub25leGlzdGVudF90YmwnLCAncmxz X3AxJyk7CitFUlJPUjogIHJlbGF0aW9uICJub25leGlzdGVudF90YmwiIGRvZXMgbm90IGV4aXN0 CitMSU5FIDE6IFNFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ25vbmV4aXN0ZW50X3Ri bCcsICdybHNfcDEnKS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IF4KKy0tIFBvbGljeSBkb2VzIG5vdCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ25vbmV4aXN0ZW50X3BvbCcpOworRVJST1I6ICBwb2xpY3kgIm5v bmV4aXN0ZW50X3BvbCIgZm9yIHRhYmxlICJyZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIiBk b2VzIG5vdCBleGlzdAorLS0gV2l0aG91dCBwcmV0dHkgZm9ybWF0dGluZyAoZGVmYXVsdCk7IGFs c28gdmVyaWZ5IGV4cGxpY2l0IGZhbHNlIGVxdWFscyBkZWZhdWx0CitTRUxFQ1QgKiBGUk9NIHBn X2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJyk7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDEgT04gcmVncmVzc19ybHNfc2NoZW1hLnJs c190YmxfMSBVU0lORyAoKGRsZXZlbCA8PSAoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYrCisgICAg RlJPTSBybHNfdGJsXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICBXSEVSRSAocmxzX3RibF8y LnBndXNlciA9IENVUlJFTlRfVVNFUikpKSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJl Z3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgQVMgUkVTVFJJQ1RJVkUgVVNJTkcgKCgoY2lkIDw+ IDQ0KSBBTkQgKGNpZCA8IDUwKSkpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AzJyk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElD WSBybHNfcDMgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBVU0lORyAoKGRhdXRob3Ig PSBDVVJSRU5UX1VTRVIpKTsKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZ IHJsc19wNCBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEZPUiBTRUxFQ1QgVVNJTkcg KCgoY2lkICUgMikgPSAwKSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENS RUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgRk9SIElO U0VSVCBXSVRIIENIRUNLICgoKGNpZCAlIDIpID0gMSkpOworKDEgcm93KQorCitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A2Jyk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIENSRUFURSBQT0xJQ1kgcmxzX3A2IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEg Rk9SIFVQREFURSBVU0lORyAoKChjaWQgJSAyKSA9IDApKTsKKygxIHJvdykKKworU0VMRUNUICog RlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNycpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUg UE9MSUNZIHJsc19wNyBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEZPUiBERUxFVEUg VVNJTkcgKChjaWQgPCA4KSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDgnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJlZ3Jlc3Nfcmxz X3NjaGVtYS5ybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZGF2ZSwgcmVncmVzc19ybHNfYWxpY2Ug VVNJTkcgKHRydWUpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRs KCdybHNfdGJsXzEnLCAncmxzX3A5Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgUE9MSUNZIHJsc19wOSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIFRPIHJlZ3Jl c3NfcmxzX2V4ZW1wdF91c2VyIFdJVEggQ0hFQ0sgKChjaWQgPSAoIFNFTEVDVCBybHNfdGJsXzIu c2VjbHYrCisgICAgRlJPTSBybHNfdGJsXzIpKSk7CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00g cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEwJyk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVB VEUgUE9MSUNZIHJsc19wMTAgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgVVBE QVRFIFVTSU5HICgoZGxldmVsID4gMCkpIFdJVEggQ0hFQ0sgKChkbGV2ZWwgPCAxMDApKTsKKygx IHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Js c19wMTEnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf Z2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBD UkVBVEUgUE9MSUNZIHJsc19wMTEgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBVU0lO RyAoKGRsZXZlbCA+PSAxKSkgV0lUSCBDSEVDSyAoKGRsZXZlbCA8PSA5OSkpOworKDEgcm93KQor CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMicp OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5 X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3Ax MiBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEFTIFJFU1RSSUNUSVZFIEZPUiBTRUxF Q1QgVVNJTkcgKChjaWQgPiAwKSk7CisoMSByb3cpCisKKy0tIEV4cGxpY2l0IGZhbHNlIG11c3Qg bWF0Y2ggb21pdHRpbmcgdGhlIGFyZ3VtZW50CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lf ZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMCcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJ Q1kgcmxzX3AxMCBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIEZPUiBVUERBVEUgVVNJ TkcgKChkbGV2ZWwgPiAwKSkgV0lUSCBDSEVDSyAoKGRsZXZlbCA8IDEwMCkpOworKDEgcm93KQor CistLSBOVUxMIHByZXR0eSBtdXN0IGFsc28gZGVmYXVsdCB0byBub24tcHJldHR5CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMCcsIE5VTEwpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9w b2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDEwIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf dGJsXzEgRk9SIFVQREFURSBVU0lORyAoKGRsZXZlbCA+IDApKSBXSVRIIENIRUNLICgoZGxldmVs IDwgMTAwKSk7CisoMSByb3cpCisKKy0tIHByZXR0eSBhY2NlcHRzIGFsbCBzdGFuZGFyZCBib29s ZWFuIHJlcHJlc2VudGF0aW9uczogdHJ1ZS9mYWxzZSwgb24vb2ZmLCAxLzAKK1xwc2V0IGZvcm1h dCB1bmFsaWduZWQKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScs ICdybHNfcDMnLCAnb24nOjpib29sKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZ IHJsc19wMyBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVVNJTkcgKGRhdXRo b3IgPSBDVVJSRU5UX1VTRVIpOworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsICcxJzo6Ym9vbCk7CitwZ19nZXRfcG9saWN5X2Rk bAorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQor ICAgIFVTSU5HIChkYXV0aG9yID0gQ1VSUkVOVF9VU0VSKTsKKygxIHJvdykKK1NFTEVDVCAqIEZS T00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCAnb2ZmJzo6Ym9vbCk7 CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmVncmVzc19ybHNf c2NoZW1hLnJsc190YmxfMSBVU0lORyAoKGRhdXRob3IgPSBDVVJSRU5UX1VTRVIpKTsKKygxIHJv dykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMn LCAnMCc6OmJvb2wpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AzIE9O IHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgVVNJTkcgKChkYXV0aG9yID0gQ1VSUkVOVF9V U0VSKSk7CisoMSByb3cpCitccHNldCBmb3JtYXQgYWxpZ25lZAorLS0gV2l0aCBwcmV0dHkgZm9y bWF0dGluZworXHBzZXQgZm9ybWF0IHVuYWxpZ25lZAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsIHRydWUpOworcGdfZ2V0X3BvbGljeV9kZGwK K0NSRUFURSBQT0xJQ1kgcmxzX3AxIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAg ICBVU0lORyAoZGxldmVsIDw9ICgoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYKKyAgIEZST00gcmxz X3RibF8yCisgIFdIRVJFIHJsc190YmxfMi5wZ3VzZXIgPSBDVVJSRU5UX1VTRVIpKSk7CisoMSBy b3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3Ay JywgdHJ1ZSk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDIgT04gcmVn cmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEFTIFJFU1RSSUNUSVZFCisgICAgVVNJTkcg KGNpZCA8PiA0NCBBTkQgY2lkIDwgNTApOworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRf cG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsIHRydWUpOworcGdfZ2V0X3BvbGljeV9k ZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AzIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEK KyAgICBVU0lORyAoZGF1dGhvciA9IENVUlJFTlRfVVNFUik7CisoMSByb3cpCitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0JywgdHJ1ZSk7CitwZ19n ZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDQgT04gcmVncmVzc19ybHNfc2NoZW1h LnJsc190YmxfMQorICAgIEZPUiBTRUxFQ1QKKyAgICBVU0lORyAoKGNpZCAlIDIpID0gMCk7Ciso MSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxz X3A1JywgdHJ1ZSk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDUgT04g cmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEZPUiBJTlNFUlQKKyAgICBXSVRIIENI RUNLICgoY2lkICUgMikgPSAxKTsKKygxIHJvdykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDYnLCB0cnVlKTsKK3BnX2dldF9wb2xpY3lfZGRsCitD UkVBVEUgUE9MSUNZIHJsc19wNiBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAg Rk9SIFVQREFURQorICAgIFVTSU5HICgoY2lkICUgMikgPSAwKTsKKygxIHJvdykKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCB0cnVlKTsKK3Bn X2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiByZWdyZXNzX3Jsc19zY2hl bWEucmxzX3RibF8xCisgICAgRk9SIERFTEVURQorICAgIFVTSU5HIChjaWQgPCA4KTsKKygxIHJv dykKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDgn LCB0cnVlKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wOCBPTiByZWdy ZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVE8gcmVncmVzc19ybHNfZGF2ZSwgcmVncmVz c19ybHNfYWxpY2UKKyAgICBVU0lORyAodHJ1ZSk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBn X2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgdHJ1ZSk7CitwZ19nZXRfcG9s aWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDkgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190 YmxfMQorICAgIFRPIHJlZ3Jlc3NfcmxzX2V4ZW1wdF91c2VyCisgICAgV0lUSCBDSEVDSyAoY2lk ID0gKCggU0VMRUNUIHJsc190YmxfMi5zZWNsdgorICAgRlJPTSBybHNfdGJsXzIpKSk7CisoMSBy b3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3Ax MCcsIHRydWUpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AxMCBPTiBy ZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgRk9SIFVQREFURQorICAgIFVTSU5HIChk bGV2ZWwgPiAwKQorICAgIFdJVEggQ0hFQ0sgKGRsZXZlbCA8IDEwMCk7CisoMSByb3cpCitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMScsIHRydWUp OworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AxMSBPTiByZWdyZXNzX3Js c19zY2hlbWEucmxzX3RibF8xCisgICAgVVNJTkcgKGRsZXZlbCA+PSAxKQorICAgIFdJVEggQ0hF Q0sgKGRsZXZlbCA8PSA5OSk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lf ZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMicsIHRydWUpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NS RUFURSBQT0xJQ1kgcmxzX3AxMiBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAg QVMgUkVTVFJJQ1RJVkUKKyAgICBGT1IgU0VMRUNUCisgICAgVVNJTkcgKGNpZCA+IDApOworKDEg cm93KQorXHBzZXQgZm9ybWF0IGFsaWduZWQKKy0tIFJvdW5kLXRyaXA6IHRoZSBnZW5lcmF0ZWQg RERMIG11c3QgYmUgcmUtZXhlY3V0YWJsZSwgaW5jbHVkaW5nIGZvciBhdG9taWMKKy0tIGJvb2xl YW4gZXhwcmVzc2lvbnMgdGhhdCBwZ19nZXRfZXhwcigpIGRvZXMgbm90IHBhcmVudGhlc2l6ZS4K K0NSRUFURSBUQUJMRSBybHNfcnQgKGEgaW50KTsKK0NSRUFURSBQT0xJQ1kgcnRfdHJ1ZSBPTiBy bHNfcnQgVVNJTkcgKHRydWUpOworQ1JFQVRFIFBPTElDWSBydF9mYWxzZSBPTiBybHNfcnQgRk9S IElOU0VSVCBXSVRIIENIRUNLIChmYWxzZSk7CitDUkVBVEUgVEVNUCBUQUJMRSBydF9kZGwgQVMK KyAgICBTRUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc19ydCcsICdydF90cnVlJykgQVMgZGRs CisgICAgVU5JT04gQUxMCisgICAgU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfcnQnLCAn cnRfZmFsc2UnKTsKK0RST1AgUE9MSUNZIHJ0X3RydWUgT04gcmxzX3J0OworRFJPUCBQT0xJQ1kg cnRfZmFsc2UgT04gcmxzX3J0OworU0VMRUNUIGRkbCBGUk9NIHJ0X2RkbCBPUkRFUiBCWSBkZGwg XGdleGVjCitDUkVBVEUgUE9MSUNZIHJ0X2ZhbHNlIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf cnQgRk9SIElOU0VSVCBXSVRIIENIRUNLIChmYWxzZSk7CitDUkVBVEUgUE9MSUNZIHJ0X3RydWUg T04gcmVncmVzc19ybHNfc2NoZW1hLnJsc19ydCBVU0lORyAodHJ1ZSk7CitTRUxFQ1QgcG9sbmFt ZSBGUk9NIHBnX3BvbGljeSBXSEVSRSBwb2xyZWxpZCA9ICdybHNfcnQnOjpyZWdjbGFzcyBPUkRF UiBCWSBwb2xuYW1lOworIHBvbG5hbWUgIAorLS0tLS0tLS0tLQorIHJ0X2ZhbHNlCisgcnRfdHJ1 ZQorKDIgcm93cykKKworRFJPUCBUQUJMRSBybHNfcnQ7CistLSBDbGVhbiB1cCBvYmplY3RzIGNy ZWF0ZWQgZm9yIHRlc3RpbmcgcGdfZ2V0X3BvbGljeV9kZGwgZnVuY3Rpb24uCitEUk9QIFBPTElD WSBybHNfcDEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMTsK K0RST1AgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDQgT04g cmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZ IHJsc19wNiBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDcgT04gcmxzX3RibF8xOwor RFJPUCBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wOSBPTiBy bHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDEwIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZ IHJsc19wMTEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AxMiBPTiBybHNfdGJsXzE7 CitEUk9QIFRBQkxFIHJsc190YmxfMTsKK0RST1AgVEFCTEUgcmxzX3RibF8yOworLS0KIC0tIENs ZWFuIHVwIG9iamVjdHMKIC0tCiBSRVNFVCBTRVNTSU9OIEFVVEhPUklaQVRJT047CmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwKaW5kZXggNmIzNTY2MjcxZGYuLmU0ZDY0ODEzZTY1IDEw MDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcm93c2VjdXJpdHkuc3FsCkBAIC0yNTk4LDYgKzI1OTgsMTM0IEBA IHJlc2V0IHJsc190ZXN0LmJsYWg7CiBkcm9wIGZ1bmN0aW9uIHJsc19mKHRleHQpOwogZHJvcCB0 YWJsZSBybHNfdCwgdGVzdF90OwogCistLQorLS0gVGVzdCBmb3IgcGdfZ2V0X3BvbGljeV9kZGwo dGFibGUsIHBvbGljeV9uYW1lWywgcHJldHR5XSkgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxF IHJsc190YmxfMSAoCisgICAgZGlkICAgICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAg ICAgICAgIGludCwKKyAgICBkbGV2ZWwgICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAg ICAgbmFtZSwKKyAgICBkdGl0bGUgICAgICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190Ymxf MSBUTyBwdWJsaWM7CitDUkVBVEUgVEFCTEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBu YW1lIHByaW1hcnkga2V5LAorICAgIHNlY2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBP TiBybHNfdGJsXzIgVE8gcHVibGljOworCistLSBUZXN0IFBFUk1JU1NJVkUgYW5kIFJFU1RSSUNU SVZFCitDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzEgQVMgUEVSTUlTU0lWRQorICAg IFVTSU5HIChkbGV2ZWwgPD0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMiBXSEVSRSBwZ3Vz ZXIgPSBjdXJyZW50X3VzZXIpKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMSBB UyBSRVNUUklDVElWRSBVU0lORyAoY2lkIDw+IDQ0IEFORCBjaWQgPCA1MCk7CisKKy0tIFRlc3Qg Rk9SIEFMTCB8IFNFTEVDVCB8IElOU0VSVCB8IFVQREFURSB8IERFTEVURQorQ1JFQVRFIFBPTElD WSBybHNfcDMgT04gcmxzX3RibF8xIEZPUiBBTEwgVVNJTkcgKGRhdXRob3IgPSBjdXJyZW50X3Vz ZXIpOworQ1JFQVRFIFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xIEZPUiBTRUxFQ1QgVVNJTkcg KGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMSBGT1IgSU5T RVJUIFdJVEggQ0hFQ0sgKGNpZCAlIDIgPSAxKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A2IE9OIHJs c190YmxfMSBGT1IgVVBEQVRFIFVTSU5HIChjaWQgJSAyID0gMCk7CitDUkVBVEUgUE9MSUNZIHJs c19wNyBPTiBybHNfdGJsXzEgRk9SIERFTEVURSBVU0lORyAoY2lkIDwgOCk7CisKKy0tIFRlc3Qg VE8geyByb2xlX25hbWUgLi4uIH0KK0NSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBU TyByZWdyZXNzX3Jsc19kYXZlLCByZWdyZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVB VEUgUE9MSUNZIHJsc19wOSBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIg V0lUSCBDSEVDSyAoY2lkID0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMikpOworCistLSBU ZXN0IFVQREFURSBwb2xpY3kgd2l0aCBib3RoIFVTSU5HIGFuZCBXSVRIIENIRUNLCitDUkVBVEUg UE9MSUNZIHJsc19wMTAgT04gcmxzX3RibF8xIEZPUiBVUERBVEUKKyAgICBVU0lORyAoZGxldmVs ID4gMCkgV0lUSCBDSEVDSyAoZGxldmVsIDwgMTAwKTsKKworLS0gVGVzdCBBTEwgcG9saWN5IHdp dGggYm90aCBVU0lORyBhbmQgV0lUSCBDSEVDSyAoQVMgUEVSTUlTU0lWRSBhbmQgRk9SIEFMTCBh cmUgZGVmYXVsdHMsIG9taXR0ZWQpCitDUkVBVEUgUE9MSUNZIHJsc19wMTEgT04gcmxzX3RibF8x CisgICAgVVNJTkcgKGRsZXZlbCA+PSAxKSBXSVRIIENIRUNLIChkbGV2ZWwgPD0gOTkpOworCist LSBUZXN0IFJFU1RSSUNUSVZFIG9uIGEgc3BlY2lmaWMgY29tbWFuZAorQ1JFQVRFIFBPTElDWSBy bHNfcDEyIE9OIHJsc190YmxfMSBBUyBSRVNUUklDVElWRSBGT1IgU0VMRUNUCisgICAgVVNJTkcg KGNpZCA+IDApOworCistLSBOVUxMIGlucHV0cyBzaG91bGQgcmV0dXJuIG5vIHJvd3MKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsICdybHNfcDEnKTsKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCBOVUxMKTsKK1NF TEVDVCBjb3VudCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsIE5VTEwpOworCistLSBU YWJsZSBkb2VzIG5vdCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgnbm9u ZXhpc3RlbnRfdGJsJywgJ3Jsc19wMScpOworLS0gUG9saWN5IGRvZXMgbm90IGV4aXN0CitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAnbm9uZXhpc3RlbnRfcG9s Jyk7CisKKy0tIFdpdGhvdXQgcHJldHR5IGZvcm1hdHRpbmcgKGRlZmF1bHQpOyBhbHNvIHZlcmlm eSBleHBsaWNpdCBmYWxzZSBlcXVhbHMgZGVmYXVsdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMicpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNCcpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNicpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNycpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOCcpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMTAnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDExJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMicpOworLS0gRXhwbGljaXQgZmFsc2UgbXVz dCBtYXRjaCBvbWl0dGluZyB0aGUgYXJndW1lbnQKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEwJywgZmFsc2UpOworLS0gTlVMTCBwcmV0dHkgbXVz dCBhbHNvIGRlZmF1bHQgdG8gbm9uLXByZXR0eQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMTAnLCBOVUxMKTsKKworLS0gcHJldHR5IGFjY2VwdHMg YWxsIHN0YW5kYXJkIGJvb2xlYW4gcmVwcmVzZW50YXRpb25zOiB0cnVlL2ZhbHNlLCBvbi9vZmYs IDEvMAorXHBzZXQgZm9ybWF0IHVuYWxpZ25lZAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5 X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsICdvbic6OmJvb2wpOworU0VMRUNUICogRlJPTSBw Z19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsICcxJzo6Ym9vbCk7CitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AzJywgJ29mZic6 OmJvb2wpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Js c19wMycsICcwJzo6Ym9vbCk7CitccHNldCBmb3JtYXQgYWxpZ25lZAorCistLSBXaXRoIHByZXR0 eSBmb3JtYXR0aW5nCitccHNldCBmb3JtYXQgdW5hbGlnbmVkCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9N IHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AyJywgdHJ1ZSk7CitTRUxFQ1Qg KiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AzJywgdHJ1ZSk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0JywgdHJ1 ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A1 JywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAn cmxzX3A2JywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJs XzEnLCAncmxzX3A3JywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdy bHNfdGJsXzEnLCAncmxzX3A4JywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lf ZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgdHJ1ZSk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxMCcsIHRydWUpOworU0VMRUNUICogRlJPTSBw Z19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMTEnLCB0cnVlKTsKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEyJywgdHJ1ZSk7Citc cHNldCBmb3JtYXQgYWxpZ25lZAorCistLSBSb3VuZC10cmlwOiB0aGUgZ2VuZXJhdGVkIERETCBt dXN0IGJlIHJlLWV4ZWN1dGFibGUsIGluY2x1ZGluZyBmb3IgYXRvbWljCistLSBib29sZWFuIGV4 cHJlc3Npb25zIHRoYXQgcGdfZ2V0X2V4cHIoKSBkb2VzIG5vdCBwYXJlbnRoZXNpemUuCitDUkVB VEUgVEFCTEUgcmxzX3J0IChhIGludCk7CitDUkVBVEUgUE9MSUNZIHJ0X3RydWUgT04gcmxzX3J0 IFVTSU5HICh0cnVlKTsKK0NSRUFURSBQT0xJQ1kgcnRfZmFsc2UgT04gcmxzX3J0IEZPUiBJTlNF UlQgV0lUSCBDSEVDSyAoZmFsc2UpOworQ1JFQVRFIFRFTVAgVEFCTEUgcnRfZGRsIEFTCisgICAg U0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfcnQnLCAncnRfdHJ1ZScpIEFTIGRkbAorICAg IFVOSU9OIEFMTAorICAgIFNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3J0JywgJ3J0X2Zh bHNlJyk7CitEUk9QIFBPTElDWSBydF90cnVlIE9OIHJsc19ydDsKK0RST1AgUE9MSUNZIHJ0X2Zh bHNlIE9OIHJsc19ydDsKK1NFTEVDVCBkZGwgRlJPTSBydF9kZGwgT1JERVIgQlkgZGRsIFxnZXhl YworU0VMRUNUIHBvbG5hbWUgRlJPTSBwZ19wb2xpY3kgV0hFUkUgcG9scmVsaWQgPSAncmxzX3J0 Jzo6cmVnY2xhc3MgT1JERVIgQlkgcG9sbmFtZTsKK0RST1AgVEFCTEUgcmxzX3J0OworCistLSBD bGVhbiB1cCBvYmplY3RzIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcGdfZ2V0X3BvbGljeV9kZGwgZnVu Y3Rpb24uCitEUk9QIFBPTElDWSBybHNfcDEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxz X3AyIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzE7CitEUk9Q IFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A1IE9OIHJsc190 YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNf cDcgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMTsKK0RST1Ag UE9MSUNZIHJsc19wOSBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDEwIE9OIHJsc190 YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wMTEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxz X3AxMiBPTiBybHNfdGJsXzE7CitEUk9QIFRBQkxFIHJsc190YmxfMTsKK0RST1AgVEFCTEUgcmxz X3RibF8yOworCiAtLQogLS0gQ2xlYW4gdXAgb2JqZWN0cwogLS0KLS0gCjIuNTEuMAoK --000000000000a1d47d065576bc23--