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 1w8bGk-000hDQ-1k for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Apr 2026 09:56: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 1w8bGi-00BBfo-36 for pgsql-hackers@arkaria.postgresql.org; Fri, 03 Apr 2026 09:56:49 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w8bGi-00BBfc-1i for pgsql-hackers@lists.postgresql.org; Fri, 03 Apr 2026 09:56:49 +0000 Received: from mail-ed1-x52e.google.com ([2a00:1450:4864:20::52e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w8bGg-00000000Lzo-0NoY for pgsql-hackers@lists.postgresql.org; Fri, 03 Apr 2026 09:56:48 +0000 Received: by mail-ed1-x52e.google.com with SMTP id 4fb4d7f45d1cf-66db0cf6a4aso3291503a12.0 for ; Fri, 03 Apr 2026 02:56:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775210201; cv=none; d=google.com; s=arc-20240605; b=M14sIxhQXYX7pL0b2wufqY6v+9IbpvrV8P63RiSz0zWigVl0FilJKckyIjdQ9QTTfn SHXKXHmRKP76jTnr3wIdDZ8/M75faHUt1mCMMKaDuRUxcix8e/PY4iu5ch78aYoQrKsM yxrQdLBX/SidpTvWz8UJ4eSXti7X65CEX9qrnlh8ZDlmENmCd/z8Nh1RrNhyOtM+CEEF hl07kRshUGx1XYOFU1J2wcCb091eVsQDQl9f/bjs36B5FcvBjPvYUmnRSm7MpxxR5pxt wFGQ5S4ySZHpaQ3UtmROhW5NeejX3kjy+8zg60+J8aclGufAGgHT8XGvX16nNzK7qg7Z mifw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=YADE7v8DFRMs07fK9r02VqzaFJAaX5Q+6UQY+LX8/6I=; fh=C1+lIqWjIlktG8y34pYS2L6k4IhXDzvRou+xOGnMz2Q=; b=hmS38ISVzyyG4a4F5RqCDZzpRRUtH2XH1SC/QDR/9E9iOM4n7OYnwDvKr6zztFtkfF zjwmwbTVgaChdzcKt47LZviN4PUGiECnhXslgurLbuT/fX4WLNBDukTdmTFSj+2qabzX MInyV5souC2n3AtO+aueOsy9s5b0XqpMeXXukIS2tewcsmq7mv8BWhd7vuOXG79JzgQj XVvYRgaFdmmcQfN7imPvJOQfF5iLlzhHZ1raW8OHbSY3rSzPfDOstjrrrZXqq1YF0u/j MmAlmFI/Qe9h1LgOe28kANf3P8rs6bmt+iLF0wGwl9KeoR3bBw/Vzaz+jJmc1LcnZT0S 4L4w==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775210201; x=1775815001; 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=YADE7v8DFRMs07fK9r02VqzaFJAaX5Q+6UQY+LX8/6I=; b=j+wFT0vxfbfe3uVK21V2mmoLRESWssNCrg8xbvhRqtrX5Ww7ovUzeJ3a6AGZwgckVz bXYcZxQ/lbc3jA/KqXdhOYoYX9CpVH9ZwkG1d6cXw00l+crTAKddWR/Y5z1NDkbE095x VsuyvD6K7VDLUC+glRCXRpGAvT+j2k6IwZNWx0ckatDiwedODuBuQOTwzxMXUvwjmExL 2fg7VpIA4L6xgbvUDrWv9RobplQqhJYvlUoV/fULHtioI4ARYnThgl58wvUnUGkAXCvQ F6WRFemQxhNduDEqIgds5pFEuaHmskXPAaiXKnXDJLTxkGidkkhDPf93V7eTj5yvChix QJ6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775210201; x=1775815001; 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=YADE7v8DFRMs07fK9r02VqzaFJAaX5Q+6UQY+LX8/6I=; b=rYrNHkLYJ7z2yUiX5Y9tUEXdqbfvOl1UhN7rFg0IOKyBDmIY6z3iK9pMTXBXeIRol4 elaqKxXDpvPTTvL7zlnrR75fw2/kBSQM1BS2Ol+dQJl1EzqiK1oGC9nS1ClOsqfgN9zB t7O9G5lKVErEBhFnFSShZBwjSMh0xaMzwbfIWwq2Ru2rZ0BAptuLLKJMi6UKdhHDfdPB LyaoerPoK3PIXCaOPBsEXd5MOpXvpAfJ1hj6uwVarIgNtSwVbpT5QD9NAo3MAGvNoF29 YnIsxML29YOzH0bqlY4ylwWfWSNYtIDyibVvU/r15dtHOnIBJQAbgRXpN6NaNCoI8iI+ 7Vhg== X-Gm-Message-State: AOJu0YyqjBBFVRkXgsSzPZf0LuCUdtNuyNBSTn8zH89e9Iz7wAyhfAev FWB3jh1o4BTXRRNK26Uata+WdvzWA1/3pJaLccIKf7TECz6gCl4SUx0XKPBOowjIGWsAMR0FSoY 6+SCxiAwaQgDBDmdazvrCe0WMA/nflhuTtXKu X-Gm-Gg: AeBDietbLYr0BrBwyFQY0hKE84ia2f865g50D60LieVs/D+m+mW5uFBIHvLzfdFTxNL hophtT5ZvTdqr54VGA2Zu+LfnuyzWJXjELNmXmsNwpwn2yyep01Zau2RjJWm+CfYXXDgVMG282u eTk6EHfuPtFM706s3dFe0zw6vcFUF6i5HY4hJogvl9YjUctmyRuMYNRo4jJLTfFQwiMdnJyVzbX 8X6gRXPX5bos6aU5+N3vfw246avfVjKZN6NioXgDrlLBVFuSYiV3cJTjryJy+CDmsWyi0K2uXU5 /7oVciFMpvNC32TGRceAMtM4OHtp7HzMcLkSG4cgfSTxqKPyylPsWFO5XbpS5AoO8NqzR2tcgwB IbcnPFw8lB00XXs5ZBimsJNZTjSoXItwbdZbYNsYv8xlOpi70cW4s1FcTUsNFoWLwOcYTnqNzKA Go0eJraq5d3ndrX070nAuPRWwL/w== X-Received: by 2002:a05:6402:5107:b0:66d:d119:11bb with SMTP id 4fb4d7f45d1cf-66e3f2bc401mr1178856a12.9.1775210200188; Fri, 03 Apr 2026 02:56:40 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Florents Tselai Date: Fri, 3 Apr 2026 12:56:02 +0300 X-Gm-Features: AQROBzBxxHP09UQlorWVyMRxczH6FiwfjBW-TMySGo_lH9QnF_ZoqskI48hlsgY Message-ID: Subject: Re: Patch: Add tsmatch JSONPath operator for granular Full Text Search To: Chao Li Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000628c5c064e8b5590" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000628c5c064e8b5590 Content-Type: multipart/alternative; boundary="000000000000628c5b064e8b558e" --000000000000628c5b064e8b558e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Mar 2, 2026 at 5:44=E2=80=AFAM Chao Li wro= te: > > > > On Feb 27, 2026, at 13:59, Florents Tselai > wrote: > > > > > > > > On Thu, Feb 26, 2026 at 8:48=E2=80=AFAM Chao Li wrote: > > > > > > > On Feb 1, 2026, at 19:02, Florents Tselai > wrote: > > > > > > > > > > > > > > > On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai < > florents.tselai@gmail.com> wrote: > > > Hi, > > > > > > in real-life I work a lot with json & fts search, here's a feature > I've always wished I had, > > > but never tackle it. Until yesterday that is. > > > > > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice" = && > @.body tsmatch "performance")'); > > > > > > This patch introduces a tsmatch boolean operator to the JSONPath > engine. > > > By integrating FTS natively into path expressions, > > > this operator allows for high-precision filtering of nested JSONB > structures=E2=80=94 > > > solving issues with structural ambiguity and query complexity. > > > > > > Currently, users must choose between two suboptimal paths for FTS-ing > nested JSON: > > > - Imprecise Global Indexing > > > jsonb_to_tsvector aggregates text into a flat vector. > > > This ignores JSON boundaries, leading to false positives when the sam= e > key (e.g., "body") > > > appears in different contexts (e.g., a "Product Description" vs. a > "Customer Review"). > > > > > > - Complex SQL Workarounds > > > Achieving 100% precision requires unnesting the document via > jsonb_array_elements and LATERAL joins. > > > This leads to verbose SQL and high memory overhead from generating > intermediate heap tuples. > > > > > > One of the most significant advantages of tsmatch is its ability to > participate in multi-condition predicates > > > within the same JSON object - something jsonb_to_tsvector cannot do. > > > > > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice" = && > @.body tsmatch "performance")'); > > > > > > In a flat vector, the association between "Alice" and "performance" i= s > lost. > > > tsmatch preserves this link by evaluating the FTS predicate in-place > during path traversal. > > > > > > While the SQL/JSON standard (ISO/IEC 9075-2) does not explicitly > define an FTS operator, > > > tsmatch is architecturally modeled after the standard-defined > like_regex. > > > > > > The implementation follows the like_regex precedent: > > > it is a non-indexable predicate that relies on GIN path-matching for > pruning and heap re-checks for precision. > > > Caching is scoped to the JsonPathExecContext, > > > ensuring 'compile-once' efficiency per execution without violating th= e > stability requirements of prepared statements. > > > > > > This initial implementation uses plainto_tsquery. > > > However, the grammar is designed to support a "mode" flag (similar to > like_regex flags) > > > in future iterations to toggle between to_tsquery, > websearch_to_tsquery, and phraseto_tsquery. > > > > > > Here's a v2, that implements the tsqparser clause > > > > > > So this should now work too > > > > > > select jsonb_path_query_array('["fast car", "slow car", "fast and > furious"]', '$[*] ? (@ tsmatch "fast car" tsqparser "w") > > > > > Hi Florents, > > > > Grant pinged me about this. I can review it in coming days. Can you > please rebase it? I failed to apply to current master. Also, the CF > reported a failure test case, please take a look. > > > > Hi Evan, > > thanks for having a look. The conflict was due to the intro of > pg_fallthrough. Not related to this patch . > > > > I noticed the failure too, but I'm having a hard time reproducing it tb= h. > > This fails for Debian Trixie with Meson. The same with Autoconf passes.= .. > > > > https://github.com/Florents-Tselai/postgres/runs/65098077968 > > > > > > > > > > > > I have reviewed v3 and traced a few test cases. Here comes my review > comments: > > 1 > ``` > + string tsmatch > string > + tsconfig > string > + tsqparser > string > ``` > > For all =E2=80=9Creplaceable=E2=80=9D, instead of =E2=80=9Cstring=E2=80= =9D, would it be better to use > something more descriptive? For example: > ``` > json_string tsmatch > query > tsconfig > config_name > tsqparser > parser_mode > ``` > > 2 - jsonpath_gram.y > ``` > +static bool makeItemTsMatch(JsonPathParseItem *doc, > + JsonPathString > *tsquery, > + JsonPathString > *tsconfig, > + JsonPathString > *tsquery_parser, > + > JsonPathParseItem ** result, > + struct Node > *escontext); > ``` > > Format Nit: Looking at the existing code, the J in the second and > following lines, should be placed in the same column as the J in the firs= t > line. > > 3 - jsonpath_gram.y > ``` > + | expr TSMATCH_P STRING_P > + { > + JsonPathParseItem *jppitem; > + /* Pass NULL for tsconfig (3rd) and NULL for > tsquery_parser (4th) */ > + if (! makeItemTsMatch($1, &$3, NULL, NULL, &jppitem, > escontext)) > + YYABORT; > + $$ =3D jppitem; > + } > + | expr TSMATCH_P STRING_P TSCONFIG_P STRING_P > + { > + JsonPathParseItem *jppitem; > + /* Pass NULL for tsquery_parser (4th) */ > + if (! makeItemTsMatch($1, &$3, &$5, NULL, &jppitem, > escontext)) > + YYABORT; > + $$ =3D jppitem; > + } > + | expr TSMATCH_P STRING_P TSQUERYPARSER_P STRING_P > + { > + JsonPathParseItem *jppitem; > + /* Pass NULL for tsconfig (3rd) */ > + if (! makeItemTsMatch($1, &$3, NULL, &$5, &jppitem, > escontext)) > + YYABORT; > + $$ =3D jppitem; > + } > + | expr TSMATCH_P STRING_P TSCONFIG_P STRING_P TSQUERYPARSER_P > STRING_P > + { > + JsonPathParseItem *jppitem; > + if (! makeItemTsMatch($1, &$3, &$5, &$7, &jppitem, > escontext)) > + YYABORT; > + $$ =3D jppitem; > + } > ``` > > Feels a little redundant, repeatedly calls makeItemTsMatch. See the > attached diff for a simplification. But my version is a bit longer in ter= ms > of number of lines. So, up to you. > > 4 - jsonpath_gram.y > ``` > +static bool > +makeItemTsMatch(JsonPathParseItem *doc, > + JsonPathString *tsquery, > + JsonPathString *tsconfig, > + JsonPathString *tsquery_parser, > + JsonPathParseItem **result, > + struct Node *escontext) > ``` > > makeItemTsMatch doesn=E2=80=99t need to return a bool. Actually, now it n= ever > returns false, instead, it just ereport(ERROR). > > 5 - jsonpath.h > ``` > + struct > + { > + int32 doc; > + char *tsquery; > + uint32 tsquerylen; > + int32 tsconfig; > + char *tsqparser; > + uint32 tsqparser_len; > + } tsmatch; > > + struct > + { > + JsonPathParseItem *doc; > + char *tsquery; > + uint32 tsquerylen; > + JsonPathParseItem *tsconfig; > + char *tsqparser; > + uint32 tsqparser_len; > + } tsmatch; > } value; > ``` > > tsquerylen doesn=E2=80=99t have _ before len, and tsqparser_len, would it= be > better to make naming conventions consistent in the same structure? > > 6 - jsonpath_exec.c > ``` > #include "tsearch/ts_utils.h" > #include "tsearch/ts_cache.h" > #include "utils/regproc.h" > #include "catalog/namespace.h" > > static JsonPathBool > executeTsMatch(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg, > void *param) > ``` > > Why don=E2=80=99t put these includes to the header section together with = other > includes? > > 7 - jsonpath_exec.c > ``` > + else > + { > + /* > + * Fallback or Error for unknown flags > (should be caught by > + * parser) > + */ > + ereport(ERROR, > + > (errcode(ERRCODE_SYNTAX_ERROR), > + errmsg("unrecognized > tsqparser flag"))); > + } > ``` > > This =E2=80=9Celse=E2=80=9D should never be entered as the same check has= been done by > makeItemTsMatch. So, maybe just use an Assert here, or pg_unreachable(). > > 8 - jsonpath_exec.c > ``` > + /* Setup Context (Run ONLY once per predicate) */ > + if (!cxt->initialized) > ``` > > While tracing this SQL: > ``` > evantest=3D# SELECT '{"tags": ["running", "jogging"]}'::jsonb > evantest-# @@ '$.tags[*] ? (@ tsmatch "run" tsconfig "english")'; > ?column? > ---------- > > (1 row) > ``` > > I noticed that, when process =E2=80=9Cjogging=E2=80=9D, cxt->initialized = is still false, > meaning that, the cxt is not reused across array items. Given the same > tsconfig should apply to all array items, I think cxt should be reused. > > 9 - jsonpath_exec.c > ``` > + /* Select Parser and Compile Query */ > + parser_mode =3D jsp->content.tsmatch.tsqparser; > + parser_len =3D jsp->content.tsmatch.tsqparser_len; > + > + if (parser_len > 0) > + { > + /* Dispatch based on flag */ > + if (pg_strncasecmp(parser_mode, "pl", parser_len) > =3D=3D 0) > ``` > > Nit: parser_mode is only used inside if (parser_len > 0), it can be > defined inside the =E2=80=9Cif=E2=80=9D. > > 10 - jsonpath_gram.y > ``` > + ereport(ERROR, > + (errcode(ERRCODE_SYNTAX_ERROR), > + errmsg("invalid tsquery_parser > value: \"%s\"", tsquery_parser->val), > + errhint("Valid values are > \"pl\", \"ph\", and \"w\"."))); > ``` > > When tested a case with an invalid parser, I got: > ``` > evantest=3D# SELECT '{"tags": ["running", "jogging"]}'::jsonb > > @? '$.tags[*] ? (@ tsmatch "run" tsconfig "english" tsqparser > "pss")'; > ERROR: invalid tsquery_parser value: "pss @" > LINE 2: @? '$.tags[*] ? (@ tsmatch "run" tsconfig "english" tsqpar... > ^ > HINT: Valid values are "pl", "ph", and "w". > ``` > > You can see the it shows a bad looking invalid value. I think that=E2=80= =99s > because tsquery_parser->val is not NULL terminated. I fixed this problem > with: > ``` > errmsg("invalid tsquery_parser value: \"%.*s\"", (int) > tsquery_parser->len, tsquery_parser->val), > ``` > > This change is also included in the attached diff file. > > 11 - jsonpath.c > ``` > + if (printBracketes) > + appendStringInfoChar(buf, ')'); > + break; > + > if (printBracketes) > appendStringInfoChar(buf, ')'); > ``` > > Duplicate code. Looks like a copy-pasto. > > 12 - jsonpath.c > ``` > + /* Write the Main Query String */ > + appendBinaryStringInfo(buf, > + > &item->value.tsmatch.tsquerylen, > + > sizeof(item->value.tsmatch.tsquerylen)); > + appendBinaryStringInfo(buf, > + > item->value.tsmatch.tsquery, > + > item->value.tsmatch.tsquerylen); > + appendStringInfoChar(buf, '\0'); > ``` > > I don=E2=80=99t think we need to manually append =E2=80=98\0=E2=80=99 aft= er > appendBinaryStringInfo. Looking at the header comment of > appendBinaryStringInfo, it says that a trailing null will be added. > ``` > /* > * appendBinaryStringInfo > * > * Append arbitrary binary data to a StringInfo, allocating more space > * if necessary. Ensures that a trailing null byte is present. > */ > void > appendBinaryStringInfo(StringInfo str, const void *data, int datalen) > ``` > Here's a v4 which incorporates most of Evan's comments & feedback - shifted tsquery compilation logic to use persistent cache within JsonPathExecContext - Fixed a binary serialization alignment issue which caused Dixie to fail earlier - I've refactor and simplified the grammar per Evan's input by adding a tsmatch_opts rule. - Also updated the docs per Evan's comments --000000000000628c5b064e8b558e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable



<= div class=3D"gmail_quote gmail_quote_container">
On Mon, Mar 2, 2026 at 5:44=E2=80=AFAM Chao Li <li.evan.chao@gmail.com> wrote:


> On Feb 27, 2026, at 13:59, Florents Tselai <florents.tselai@gmail.com> w= rote:
>
>
>
> On Thu, Feb 26, 2026 at 8:48=E2=80=AFAM Chao Li <li.evan.chao@gmail.com> wr= ote:
>
>
> > On Feb 1, 2026, at 19:02, Florents Tselai <florents.tselai@gmail.com&g= t; wrote:
> >
> >
> >
> >
> > On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai <florents.tselai@g= mail.com> wrote:
> > Hi,
> >
> > in real-life I work a lot with json & fts search, here's = a feature I've always wished I had,
> > but never tackle it. Until yesterday that is.
> >
> > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D = "Alice" && @.body tsmatch "performance")');=
> >
> > This patch introduces a tsmatch boolean operator to the JSONPath = engine.
> > By integrating FTS natively into path expressions,
> > this operator allows for high-precision filtering of nested JSONB= structures=E2=80=94
> > solving issues with structural ambiguity and query complexity. > >
> > Currently, users must choose between two suboptimal paths for FTS= -ing nested JSON:
> > - Imprecise Global Indexing
> > jsonb_to_tsvector aggregates text into a flat vector.
> > This ignores JSON boundaries, leading to false positives when the= same key (e.g., "body")
> > appears in different contexts (e.g., a "Product Description&= quot; vs. a "Customer Review").
> >
> > - Complex SQL Workarounds
> > Achieving 100% precision requires unnesting the document via json= b_array_elements and LATERAL joins.
> > This leads to verbose SQL and high memory overhead from generatin= g intermediate heap tuples.
> >
> > One of the most significant advantages of tsmatch is its ability = to participate in multi-condition predicates
> > within the same JSON object - something jsonb_to_tsvector cannot = do.
> >
> > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D = "Alice" && @.body tsmatch "performance")');=
> >
> > In a flat vector, the association between "Alice" and &= quot;performance" is lost.
> > tsmatch preserves this link by evaluating the FTS predicate in-pl= ace during path traversal.
> >
> > While the SQL/JSON standard (ISO/IEC 9075-2) does not explicitly = define an FTS operator,
> > tsmatch is architecturally modeled after the standard-defined lik= e_regex.
> >
> > The implementation follows the like_regex precedent:
> > it is a non-indexable predicate that relies on GIN path-matching = for pruning and heap re-checks for precision.
> > Caching is scoped to the JsonPathExecContext,
> > ensuring 'compile-once' efficiency per execution without = violating the stability requirements of prepared statements.
> >
> > This initial implementation uses plainto_tsquery.
> > However, the grammar is designed to support a "mode" fl= ag (similar to like_regex flags)
> > in future iterations to toggle between to_tsquery, websearch_to_t= squery, and phraseto_tsquery.
> >
> > Here's a v2, that implements the tsqparser clause
> >
> > So this should now work too
> >
> > select jsonb_path_query_array('["fast car", "s= low car", "fast and furious"]', '$[*] ? (@ tsmatch &= quot;fast car" tsqparser "w") <v2-0001-Add-tsmatch-JSONPa= th-operator-for-granular-Full-T.patch>
>
> Hi Florents,
>
> Grant pinged me about this. I can review it in coming days. Can you pl= ease rebase it? I failed to apply to current master. Also, the CF reported = a failure test case, please take a look.
>
>=C2=A0 Hi Evan,
> thanks for having a look. The conflict was due to the intro of pg_fall= through. Not related to this patch .
>
> I noticed the failure too, but I'm having a hard time reproducing = it tbh.
> This fails for Debian Trixie with Meson. The same with Autoconf passes= ...
>
> https://github.com/Florents-Tselai/= postgres/runs/65098077968
>
>
>
>
> <v3-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch>= ;

I have reviewed v3 and traced a few test cases. Here comes my review commen= ts:

1
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 <replaceable>string</replaceable> = <literal>tsmatch</literal> <replaceable>string</replac= eable>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 <optional> <literal>tsconfig</l= iteral> <replaceable>string</replaceable> </optional><= br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 <optional> <literal>tsqparser</= literal> <replaceable>string</replaceable> </optional>=
```

For all =E2=80=9Creplaceable=E2=80=9D, instead of =E2=80=9Cstring=E2=80=9D,= would it be better to use something more descriptive? For example:
```
<replaceable>json_string</replaceable> <literal>tsmatch&l= t;/literal> <replaceable>query</replaceable>
<optional> <literal>tsconfig</literal> <replaceable>= ;config_name</replaceable> </optional>
<optional> <literal>tsqparser</literal> <replaceable&g= t;parser_mode</replaceable> </optional>
```

2 - jsonpath_gram.y
```
+static bool makeItemTsMatch(JsonPathParseItem *doc,
+=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 =C2=A0 =C2=A0 =C2=A0JsonPathString *tsqu= ery,
+=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 =C2=A0 =C2=A0 =C2=A0JsonPathString *tsco= nfig,
+=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 =C2=A0 =C2=A0 =C2=A0JsonPathString *tsqu= ery_parser,
+=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 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem **= result,
+=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 =C2=A0 =C2=A0 =C2=A0struct Node *esconte= xt);
```

Format Nit: Looking at the existing code, the J in the second and following= lines, should be placed in the same column as the J in the first line.

3 - jsonpath_gram.y
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= config (3rd) and NULL for tsquery_parser (4th) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, NULL, NULL, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSCONFIG_P STRING_P +=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= query_parser (4th) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, &$5, NULL, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSQUERYPARSER_P STRIN= G_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Pass NULL for ts= config (3rd) */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, NULL, &$5, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0| expr TSMATCH_P STRING_P TSCONFIG_P STRING_P T= SQUERYPARSER_P STRING_P
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0JsonPathParseItem *= jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (! makeItemTsMat= ch($1, &$3, &$5, &$7, &jppitem, escontext))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 YYABORT; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0$$ =3D jppitem;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
```

Feels a little redundant, repeatedly calls makeItemTsMatch. See the attache= d diff for a simplification. But my version is a bit longer in terms of num= ber of lines. So, up to you.

4 - jsonpath_gram.y
```
+static bool
+makeItemTsMatch(JsonPathParseItem *doc,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsquery,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsconfig,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathString *tsquery_parser,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 JsonPathParseItem **result,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 struct Node *escontext)
```

makeItemTsMatch doesn=E2=80=99t need to return a bool. Actually, now it nev= er returns false, instead, it just ereport(ERROR).

5 - jsonpath.h
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct
+=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=A0int32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0doc;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsquery;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsquerylen;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0int32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tsconfig;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsqparser_len;
+=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=A0tsmatch;<= br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0struct
+=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=A0JsonPathParseItem *doc;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsquery;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsquerylen;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0JsonPathParseItem *tsconfig;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0char=C2=A0 =C2=A0 =C2=A0 =C2=A0*tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uint32=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tsqparser_len;
+=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=A0tsmatch;<= br> =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=A0value;
```

tsquerylen doesn=E2=80=99t have _ before len, and tsqparser_len, would it b= e better to make naming conventions consistent in the same structure?

6 - jsonpath_exec.c
```
#include "tsearch/ts_utils.h"
#include "tsearch/ts_cache.h"
#include "utils/regproc.h"
#include "catalog/namespace.h"

static JsonPathBool
executeTsMatch(JsonPathItem *jsp, JsonbValue *str, JsonbValue *rarg,
void *param)
```

Why don=E2=80=99t put these includes to the header section together with ot= her includes?

7 - jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0else
+=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 =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 * Fallback or Error for unknown flag= s (should be caught by
+=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 * parser)
+=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 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ereport(ERROR,
+=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(errcode(ERRCODE_SYNTAX_ERROR),
+=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 errmsg("unrecognized tsqparser flag")));
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0}
```

This =E2=80=9Celse=E2=80=9D should never be entered as the same check has b= een done by makeItemTsMatch. So, maybe just use an Assert here, or pg_unrea= chable().

8 -=C2=A0 jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0/* Setup Context (Run ONLY once per predicate) = */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!cxt->initialized)
```

While tracing this SQL:
```
evantest=3D# SELECT '{"tags": ["running", "jog= ging"]}'::jsonb
evantest-#=C2=A0 =C2=A0@@ '$.tags[*] ? (@ tsmatch "run" tscon= fig "english")';
=C2=A0?column?
----------

(1 row)
```

I noticed that, when process =E2=80=9Cjogging=E2=80=9D, cxt->initialized= is still false, meaning that, the cxt is not reused across array items. Gi= ven the same tsconfig should apply to all array items, I think cxt should b= e reused.

9 -=C2=A0 jsonpath_exec.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Select Parser an= d Compile Query */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0parser_mode =3D jsp= ->content.tsmatch.tsqparser;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0parser_len =3D jsp-= >content.tsmatch.tsqparser_len;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (parser_len >= 0)
+=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/* Dispatch based on flag */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (pg_strncasecmp(parser_mode, "pl", parser_len) =3D= =3D 0)
```

Nit: parser_mode is only used inside if (parser_len > 0), it can be defi= ned inside the =E2=80=9Cif=E2=80=9D.

10 - jsonpath_gram.y
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 ereport(ERROR,
+=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 (errcode= (ERRCODE_SYNTAX_ERROR),
+=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=A0er= rmsg("invalid tsquery_parser value: \"%s\"", tsquery_pa= rser->val),
+=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=A0er= rhint("Valid values are \"pl\", \"ph\", and \"= ;w\".")));
```

When tested a case with an invalid parser, I got:
```
evantest=3D# SELECT '{"tags": ["running", "jog= ging"]}'::jsonb=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 =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 @? '$.tags[*] ? (@ tsmatch "run" tsconfig "= ;english" tsqparser "pss")';
ERROR:=C2=A0 invalid tsquery_parser value: "pss=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@"
LINE 2:=C2=A0 =C2=A0@? '$.tags[*] ? (@ tsmatch "run" tsconfig= "english" tsqpar...
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^
HINT:=C2=A0 Valid values are "pl", "ph", and "w&qu= ot;.
```

You can see the it shows a bad looking invalid value. I think that=E2=80=99= s because tsquery_parser->val is not NULL terminated. I fixed this probl= em with:
```
errmsg("invalid tsquery_parser value: \"%.*s\"", (int) = tsquery_parser->len, tsquery_parser->val),
```

This change is also included in the attached diff file.

11 - jsonpath.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0if (printBracketes)
+=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=A0appendStringInfoChar(buf, ')'= );
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;
+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 if (printBracketes)
=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 appendStringInfoChar(buf, ')'= ;);
```

Duplicate code. Looks like a copy-pasto.

12 - jsonpath.c
```
+=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/* Write the Main Query String */
+=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=A0appendBinaryStringInfo(buf,
+=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &item->value.tsmatch.tsqueryl= en,
+=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sizeof(item->value.tsmatch.tsquer= ylen));
+=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=A0appendBinaryStringInfo(buf,
+=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 item->value.tsmatch.tsquery,
+=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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 item->value.tsmatch.tsquerylen);<= br> +=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=A0appendStringInfoChar(buf, '\0'= ;);
```

I don=E2=80=99t think we need to manually append =E2=80=98\0=E2=80=99 after= appendBinaryStringInfo. Looking at the header comment of appendBinaryStrin= gInfo, it says that a trailing null will be added.
```
/*
* appendBinaryStringInfo
*
* Append arbitrary binary data to a StringInfo, allocating more space
* if necessary. Ensures that a trailing null byte is present.
*/
void
appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
```

Here's a v4 which incorporates = most of Evan's comments & feedback
- shifted tsquery comp= ilation logic to use persistent cache within JsonPathExecContext
= - Fixed a binary serialization alignment issue which caused Dixie to fail e= arlier
- I've refactor and simplified the grammar per Evan= 9;s input by adding a tsmatch_opts rule.
- Also updated the docs = per Evan's comments=C2=A0


--000000000000628c5b064e8b558e-- --000000000000628c5c064e8b5590 Content-Type: application/octet-stream; name="v4-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Disposition: attachment; filename="v4-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mniqaap20 RnJvbSAxMjE5ZmZlZWZiNTA3YTc1YTVmYzRiN2ZhZTc4MjBmZGI4OWQyOWJkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGbG9yZW50cyBUc2VsYWkgPGZsb3JlbnRzLnRzZWxhaUBnbWFp bC5jb20+CkRhdGU6IEZyaSwgMyBBcHIgMjAyNiAxMjo1MDo0MCArMDMwMApTdWJqZWN0OiBbUEFU Q0ggdjRdIEFkZCB0c21hdGNoIEpTT05QYXRoIG9wZXJhdG9yIGZvciBncmFudWxhciBGdWxsIFRl eHQKIFNlYXJjaApNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNo YXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhpcyBwYXRjaCBp bnRyb2R1Y2VzIHRoZSB0c21hdGNoIGJvb2xlYW4gb3BlcmF0b3IgdG8gdGhlIEpTT05QYXRoIGVu Z2luZS4KIEJ5IGludGVncmF0aW5nIEZUUyBuYXRpdmVseSBpbnRvIHBhdGggZXhwcmVzc2lvbnMs IHRoaXMgb3BlcmF0b3IgYWxsb3dzCiBmb3IgaGlnaC1wcmVjaXNpb24gZmlsdGVyaW5nIG9mIG5l c3RlZCBKU09OQiBzdHJ1Y3R1cmVz4oCUc29sdmluZyBpc3N1ZXMKIHdpdGggc3RydWN0dXJhbCBh bWJpZ3VpdHkgYW5kIHF1ZXJ5IGNvbXBsZXhpdHkuCgogQ3VycmVudGx5LCB1c2VycyBtdXN0IGNo b29zZSBiZXR3ZWVuIHR3byBzdWJvcHRpbWFsIHBhdGhzIGZvciBzZWFyY2hpbmcKIG5lc3RlZCBK U09OOgoKIDEuIEltcHJlY2lzZSBHbG9iYWwgSW5kZXhpbmcKICAgIGpzb25iX3RvX3RzdmVjdG9y IGFnZ3JlZ2F0ZXMgdGV4dCBpbnRvIGEgZmxhdCB2ZWN0b3IuIFRoaXMgaWdub3JlcwogICAgSlNP TiBib3VuZGFyaWVzLCBsZWFkaW5nIHRvIGZhbHNlIHBvc2l0aXZlcyB3aGVuIHRoZSBzYW1lIGtl eQogICAgKGUuZy4sICJib2R5IikgYXBwZWFycyBpbiBkaWZmZXJlbnQgY29udGV4dHMgKGUuZy4s IGEgIlByb2R1Y3QKICAgIERlc2NyaXB0aW9uIiB2cy4gYSAiQ3VzdG9tZXIgUmV2aWV3IikuCgog Mi4gQ29tcGxleCBTUUwgV29ya2Fyb3VuZHMKICAgIEFjaGlldmluZyAxMDAlIHByZWNpc2lvbiBy ZXF1aXJlcyAiZXhwbG9kaW5nIiB0aGUgZG9jdW1lbnQgdmlhCiAgICBqc29uYl9hcnJheV9lbGVt ZW50cyBhbmQgTEFURVJBTCBqb2lucy4gVGhpcyBsZWFkcyB0byB2ZXJib3NlIFNRTAogICAgYW5k IGhpZ2ggbWVtb3J5IG92ZXJoZWFkIGZyb20gZ2VuZXJhdGluZyBpbnRlcm1lZGlhdGUgaGVhcCB0 dXBsZXMuCgogT25lIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGFkdmFudGFnZXMgb2YgdHNtYXRj aCBpcyBpdHMgYWJpbGl0eSB0bwogcGFydGljaXBhdGUgaW4gbXVsdGktY29uZGl0aW9uIHByZWRp Y2F0ZXMgd2l0aGluIHRoZSBzYW1lIEpTT04gb2JqZWN04oCUCiBzb21ldGhpbmcganNvbmJfdG9f dHN2ZWN0b3IgY2Fubm90IGRvLgoKICAgU0VMRUNUIGpzb25iX3BhdGhfcXVlcnkoZG9jLCAnJC5j b21tZW50c1sqXSA/IChALnVzZXIgPT0gIkFsaWNlIiAmJiBALmJvZHkgdHNtYXRjaCAicGVyZm9y bWFuY2UiKScpOwoKIEluIGEgZmxhdCB2ZWN0b3IsIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuICJB bGljZSIgYW5kICJwZXJmb3JtYW5jZSIgaXMKIGxvc3QuIHRzbWF0Y2ggcHJlc2VydmVzIHRoaXMg bGluayBieSBldmFsdWF0aW5nIHRoZSBGVFMgcHJlZGljYXRlCiBpbi1wbGFjZSBkdXJpbmcgcGF0 aCB0cmF2ZXJzYWwuCgogV2hpbGUgdGhlIFNRTC9KU09OIHN0YW5kYXJkIChJU08vSUVDIDkwNzUt MikgZG9lcyBub3QgZXhwbGljaXRseSBkZWZpbmUKIGFuIEZUUyBvcGVyYXRvciwgdHNtYXRjaCBp cyBhcmNoaXRlY3R1cmFsbHkgbW9kZWxlZCBhZnRlciB0aGUKIHN0YW5kYXJkLWRlZmluZWQgbGlr ZV9yZWdleC4KCiBUaGUgb3BlcmF0b3Igc3VwcG9ydHMgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBm b3IgYm90aCB0aGUgZGljdGlvbmFyeSBhbmQKIHRoZSBxdWVyeSBwYXJzZXI6CgogICBAIHRzbWF0 Y2ggInF1ZXJ5IiBbIHRzY29uZmlnICJyZWdjb25maWciIF0gWyB0c3FwYXJzZXIgIm1vZGUiIF0K CiBTdXBwb3J0ZWQgcGFyc2VyIG1vZGVzIGFyZToKICAtICJwbCI6IHBsYWludG9fdHNxdWVyeSAo bm8gb3BlcmF0b3JzIHJlcXVpcmVkKQogIC0gInBoIjogcGhyYXNldG9fdHNxdWVyeQogIC0gInci OiAgd2Vic2VhcmNoX3RvX3RzcXVlcnkKICAtIE9taXR0ZWQ6IERlZmF1bHRzIHRvIHRvX3RzcXVl cnkgKHN0cmljdCBtb2RlKQoKIFRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gR0lOIHBhdGgt bWF0Y2hpbmcgZm9yIGluZGV4IHBydW5pbmcgYW5kCiBoZWFwIHJlLWNoZWNrcyBmb3IgcHJlY2lz aW9uLiBDYWNoaW5nIGlzIHNjb3BlZCB0byB0aGUKIEpzb25QYXRoRXhlY0NvbnRleHQsIGVuc3Vy aW5nICdjb21waWxlLW9uY2UnIGVmZmljaWVuY3kgZm9yIHRoZQogdHNxdWVyeSBhbmQgT0lEIGxv b2t1cCBwZXIgZXhlY3V0aW9uLCByZXNwZWN0aW5nIHRoZSBzdGFiaWxpdHkKIHJlcXVpcmVtZW50 cyBvZiBwcmVwYXJlZCBzdGF0ZW1lbnRzLgotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNv bi5zZ21sICAgICAgICAgICAgIHwgIDM0ICsrKysrCiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNv bnBhdGguYyAgICAgICAgICAgICB8IDEzMSArKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jICAgICAgICB8IDE1MyArKysrKysrKysrKysrKysrKyst CiBzcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55ICAgICAgICB8IDExNSArKysr KysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX3NjYW4ubCAgICAgICAg fCAgIDMgKwogc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGguaCAgICAgICAgICAgICAgICAgfCAg MTkgKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25iX2pzb25wYXRoLm91dCB8ICA1 OCArKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25wYXRoLm91dCAgICAgICB8 ICA2MCArKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbmJfanNvbnBhdGguc3FsICAg ICAgfCAgMTMgKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25wYXRoLnNxbCAgICAgICAgICAg IHwgIDE5ICsrKwogMTAgZmlsZXMgY2hhbmdlZCwgNjAxIGluc2VydGlvbnMoKyksIDQgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwgYi9k b2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWpzb24uc2dtbAppbmRleCA0Y2QzMzhmZTZlMy4uZWRmNjdm YzY5NGUgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCisrKyBi L2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCkBAIC0zMjQ3LDYgKzMyNDcsNDAgQEAg RVJST1I6ICBqc29ucGF0aCBtZW1iZXIgYWNjZXNzb3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBh biBvYmplY3QKICAgICAgICAgPHJldHVybnZhbHVlPltdPC9yZXR1cm52YWx1ZT4KICAgICAgICA8 L3BhcmE+PC9lbnRyeT4KICAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKyAgICAgICA8ZW50cnkg cm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAg ICAgICA8cmVwbGFjZWFibGU+anNvbl9zdHJpbmc8L3JlcGxhY2VhYmxlPiA8bGl0ZXJhbD50c21h dGNoPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+cXVlcnk8L3JlcGxhY2VhYmxlPgorICAgICAgICA8 b3B0aW9uYWw+IDxsaXRlcmFsPnRzY29uZmlnPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+Y29uZmln X25hbWU8L3JlcGxhY2VhYmxlPiA8L29wdGlvbmFsPgorICAgICAgICA8b3B0aW9uYWw+IDxsaXRl cmFsPnRzcXBhcnNlcjwvbGl0ZXJhbD4gPHJlcGxhY2VhYmxlPnBhcnNlcl9tb2RlPC9yZXBsYWNl YWJsZT4gPC9vcHRpb25hbD4KKyAgICAgICAgPHJldHVybnZhbHVlPmJvb2xlYW48L3JldHVybnZh bHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBUZXN0cyB3aGV0 aGVyIHRoZSBKU09OIHN0cmluZyAoZmlyc3Qgb3BlcmFuZCkgbWF0Y2hlcyB0aGUgZnVsbC10ZXh0 IHNlYXJjaCBxdWVyeQorICAgICAgICAgKHNlY29uZCBvcGVyYW5kKS4gVGhlIG1hdGNoaW5nIGJl aGF2aW9yIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBvcHRpb25hbAorICAgICAgICAgPGxp dGVyYWw+dHNjb25maWc8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD50c3FwYXJzZXI8L2xpdGVyYWw+ IGNsYXVzZXMuCisgICAgICAgICBJZiA8bGl0ZXJhbD50c2NvbmZpZzwvbGl0ZXJhbD4gaXMgb21p dHRlZCwgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGRlZmF1bHQgdGV4dCBzZWFyY2ggY29uZmlndXJh dGlvbgorICAgICAgICAgaXMgdXNlZCAoc2VlIDx4cmVmIGxpbmtlbmQ9Imd1Yy1kZWZhdWx0LXRl eHQtc2VhcmNoLWNvbmZpZyIvPikuCisgICAgICAgICBUaGUgPGxpdGVyYWw+dHNxcGFyc2VyPC9s aXRlcmFsPiBjbGF1c2UgZGV0ZXJtaW5lcyBob3cgdGhlIHF1ZXJ5IHN0cmluZyBpcyBwYXJzZWQK KyAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0idGV4dHNlYXJjaC1wYXJzaW5nLXF1ZXJpZXMi Lz4pLgorICAgICAgICAgVmFsaWQgb3B0aW9ucyBhcmUgPGxpdGVyYWw+InBsIjwvbGl0ZXJhbD4g KDxmdW5jdGlvbj5wbGFpbnRvX3RzcXVlcnk8L2Z1bmN0aW9uPiksCisgICAgICAgICA8bGl0ZXJh bD4icGgiPC9saXRlcmFsPiAoPGZ1bmN0aW9uPnBocmFzZXRvX3RzcXVlcnk8L2Z1bmN0aW9uPiks IGFuZAorICAgICAgICAgPGxpdGVyYWw+InciPC9saXRlcmFsPiAoPGZ1bmN0aW9uPndlYnNlYXJj aF90b190c3F1ZXJ5PC9mdW5jdGlvbj4pLgorICAgICAgICAgSWYgPGxpdGVyYWw+dHNxcGFyc2Vy PC9saXRlcmFsPiBpcyBvbWl0dGVkLCB0aGUgcXVlcnkgaXMgcGFyc2VkIHVzaW5nIDxmdW5jdGlv bj50b190c3F1ZXJ5PC9mdW5jdGlvbj4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+ CisgICAgICAgICA8bGl0ZXJhbD5qc29uYl9wYXRoX3F1ZXJ5X2FycmF5KCdbInJ1bm5pbmciLCAi cnVucyIsICJyYW4iLCAiam9nZ2luZyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29u ZmlnICJlbmdsaXNoIiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1ZT5bInJ1bm5p bmciLCAicnVucyJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFy YT4KKyAgICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1siZmFzdCBjYXIi LCAic2xvdyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJm YXN0ICZhbXA7IGNhciIpJyk8L2xpdGVyYWw+CisgICAgICAgICA8cmV0dXJudmFsdWU+WyJmYXN0 IGNhciJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAg ICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1siZmFzdCBjYXIiLCAic2xv dyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJmYXN0IGNh ciIgdHNxcGFyc2VyICJ3IiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1ZT5bImZh c3QgY2FyIl08L3JldHVybnZhbHVlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgPC9lbnRyeT4K KyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5PgogICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aC5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2pzb25wYXRoLmMKaW5kZXggN2JmYzE4Yzk4ODguLjVhYmI2ZjQzM2Y3IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGguYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9hZHQvanNvbnBhdGguYwpAQCAtMzUxLDYgKzM1MSw1NSBAQCBmbGF0dGVuSnNv blBhdGhQYXJzZUl0ZW0oU3RyaW5nSW5mbyBidWYsIGludCAqcmVzdWx0LCBzdHJ1Y3QgTm9kZSAq ZXNjb250ZXh0LAogCQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIG9mZnMpID0gY2hsZCAtIHBv czsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIGpwaVRzTWF0Y2g6CisJCQl7CisJCQkJaW50MzIJ CWV4cHJfb2ZmOworCQkJCWludDMyCQl0c2NvbmZpZ19vZmY7CisJCQkJdWludDMyCQl0c3FwYXJz ZXJfbGVuX3ZhbCA9IGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyID8gaXRlbS0+dmFsdWUu dHNtYXRjaC50c3FwYXJzZXJfbGVuIDogMDsKKworCQkJCWV4cHJfb2ZmID0gcmVzZXJ2ZVNwYWNl Rm9ySXRlbVBvaW50ZXIoYnVmKTsKKwkJCQl0c2NvbmZpZ19vZmYgPSByZXNlcnZlU3BhY2VGb3JJ dGVtUG9pbnRlcihidWYpOworCisJCQkJLyoKKwkJCQkgKiBXcml0ZSBhbGwgaW50ZWdlcnMgRklS U1Qgc28gdGhleSBhcmUgbmF0dXJhbGx5IDQtYnl0ZQorCQkJCSAqIGFsaWduZWQKKwkJCQkgKi8K KwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1ZiwgJml0ZW0tPnZhbHVlLnRzbWF0Y2gudHNx dWVyeV9sZW4sIHNpemVvZih1aW50MzIpKTsKKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1 ZiwgJnRzcXBhcnNlcl9sZW5fdmFsLCBzaXplb2YodWludDMyKSk7CisKKwkJCQkvKiBOb3cgYXBw ZW5kIHRoZSBzdHJpbmdzIGF0IHRoZSBlbmQgKi8KKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZv KGJ1ZiwgaXRlbS0+dmFsdWUudHNtYXRjaC50c3F1ZXJ5LCBpdGVtLT52YWx1ZS50c21hdGNoLnRz cXVlcnlfbGVuKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICdcMCcpOworCisJCQkJ aWYgKGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyKQorCQkJCXsKKwkJCQkJYXBwZW5kQmlu YXJ5U3RyaW5nSW5mbyhidWYsIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2VyLCB0c3FwYXJz ZXJfbGVuX3ZhbCk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1wwJyk7CisJCQkJ fQorCisJCQkJaWYgKCFmbGF0dGVuSnNvblBhdGhQYXJzZUl0ZW0oYnVmLCAmY2hsZCwgZXNjb250 ZXh0LAorCQkJCQkJCQkJCQkgIGl0ZW0tPnZhbHVlLnRzbWF0Y2guZG9jLAorCQkJCQkJCQkJCQkg IG5lc3RpbmdMZXZlbCwKKwkJCQkJCQkJCQkJICBpbnNpZGVBcnJheVN1YnNjcmlwdCkpCisJCQkJ CXJldHVybiBmYWxzZTsKKwkJCQkqKGludDMyICopIChidWYtPmRhdGEgKyBleHByX29mZikgPSBj aGxkIC0gcG9zOworCisJCQkJLyogVFNDb25maWcgKE9wdGlvbmFsKSAqLworCQkJCWlmIChpdGVt LT52YWx1ZS50c21hdGNoLnRzY29uZmlnKQorCQkJCXsKKwkJCQkJaWYgKCFmbGF0dGVuSnNvblBh dGhQYXJzZUl0ZW0oYnVmLCAmY2hsZCwgZXNjb250ZXh0LAorCQkJCQkJCQkJCQkJICBpdGVtLT52 YWx1ZS50c21hdGNoLnRzY29uZmlnLAorCQkJCQkJCQkJCQkJICBuZXN0aW5nTGV2ZWwsCisJCQkJ CQkJCQkJCQkgIGluc2lkZUFycmF5U3Vic2NyaXB0KSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJ CQkJKihpbnQzMiAqKSAoYnVmLT5kYXRhICsgdHNjb25maWdfb2ZmKSA9IGNobGQgLSBwb3M7CisJ CQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIHRzY29u ZmlnX29mZikgPSAwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIGpwaUZpbHRlcjoK IAkJCWFyZ05lc3RpbmdMZXZlbCsrOwogCQkJcGdfZmFsbHRocm91Z2g7CkBAIC03NjcsNiArODE2 LDU4IEBAIHByaW50SnNvblBhdGhJdGVtKFN0cmluZ0luZm8gYnVmLCBKc29uUGF0aEl0ZW0gKnYs IGJvb2wgaW5LZXksCiAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnIicpOwogCQkJfQog CisJCQlpZiAocHJpbnRCcmFja2V0ZXMpCisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAn KScpOworCQkJYnJlYWs7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCWlmIChwcmludEJyYWNrZXRl cykKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcoJyk7CisKKwkJCWpzcEluaXRCeUJ1 ZmZlcigmZWxlbSwgdi0+YmFzZSwgdi0+Y29udGVudC50c21hdGNoLmRvYyk7CisJCQlwcmludEpz b25QYXRoSXRlbShidWYsICZlbGVtLCBmYWxzZSwKKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5 KGVsZW0udHlwZSkgPD0KKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5KHYtPnR5cGUpKTsKKwor CQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgdHNtYXRjaCAiKTsKKworCQkJZXNjYXBl X2pzb25fd2l0aF9sZW4oYnVmLAorCQkJCQkJCQkgdi0+Y29udGVudC50c21hdGNoLnRzcXVlcnks CisJCQkJCQkJCSB2LT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeV9sZW4pOworCisJCQkvKiBQcmlu dCBUU0NvbmZpZyBpZiBwcmVzZW50ICovCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRzY29u ZmlnKQorCQkJeworCQkJCUpzb25QYXRoSXRlbSBjb25maWdfaXRlbTsKKwkJCQlpbnQzMgkJY29u ZmlnX2xlbjsKKwkJCQljaGFyCSAgICpjb25maWdfc3RyOworCisJCQkJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgdHNjb25maWcgIik7CisJCQkJanNwSW5pdEJ5QnVmZmVyKCZjb25maWdf aXRlbSwgdi0+YmFzZSwgdi0+Y29udGVudC50c21hdGNoLnRzY29uZmlnKTsKKwkJCQljb25maWdf c3RyID0ganNwR2V0U3RyaW5nKCZjb25maWdfaXRlbSwgJmNvbmZpZ19sZW4pOworCQkJCWFwcGVu ZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyInKTsKKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1 ZiwgY29uZmlnX3N0ciwgY29uZmlnX2xlbik7CisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVm LCAnIicpOworCQkJfQorCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9sZW4g PiAwKQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIHRzcXBhcnNlciAi KTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICciJyk7CisKKwkJCQkvKgorCQkJCSAq IFVzZSBzaW1wbGUgYmluYXJ5IGFwcGVuZCBzaW5jZSBmbGFncyBsaWtlICJwbCIgZG9uJ3QgbmVl ZAorCQkJCSAqIEpTT04gZXNjYXBpbmcKKwkJCQkgKi8KKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJ bmZvKGJ1ZiwKKwkJCQkJCQkJCSAgIHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXIsCisJCQkJ CQkJCQkgICB2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbik7CisJCQkJYXBwZW5kU3Ry aW5nSW5mb0NoYXIoYnVmLCAnIicpOworCQkJfQorCisJCQlpZiAocHJpbnRCcmFja2V0ZXMpCisJ CQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCQkJYnJlYWs7CisKIAkJCWlmIChw cmludEJyYWNrZXRlcykKIAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CiAJCQli cmVhazsKQEAgLTk3Niw2ICsxMDc3LDggQEAganNwT3BlcmF0aW9uTmFtZShKc29uUGF0aEl0ZW1U eXBlIHR5cGUpCiAJCQlyZXR1cm4gInRpbWVzdGFtcCI7CiAJCWNhc2UganBpVGltZXN0YW1wVHo6 CiAJCQlyZXR1cm4gInRpbWVzdGFtcF90eiI7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCXJldHVy biAidHNtYXRjaCI7CiAJCWNhc2UganBpU3RyUmVwbGFjZToKIAkJCXJldHVybiAicmVwbGFjZSI7 CiAJCWNhc2UganBpU3RyTG93ZXI6CkBAIC0xMTU4LDYgKzEyNjEsMjcgQEAganNwSW5pdEJ5QnVm ZmVyKEpzb25QYXRoSXRlbSAqdiwgY2hhciAqYmFzZSwgaW50MzIgcG9zKQogCQkJcmVhZF9pbnQz Mih2LT5jb250ZW50Lmxpa2VfcmVnZXgucGF0dGVybmxlbiwgYmFzZSwgcG9zKTsKIAkJCXYtPmNv bnRlbnQubGlrZV9yZWdleC5wYXR0ZXJuID0gYmFzZSArIHBvczsKIAkJCWJyZWFrOworCQljYXNl IGpwaVRzTWF0Y2g6CisJCQkvKiBGSVg6IFJlYWQgYWxsIGludGVnZXJzIGZpcnN0ICovCisJCQly ZWFkX2ludDMyKHYtPmNvbnRlbnQudHNtYXRjaC5kb2MsIGJhc2UsIHBvcyk7CisJCQlyZWFkX2lu dDMyKHYtPmNvbnRlbnQudHNtYXRjaC50c2NvbmZpZywgYmFzZSwgcG9zKTsKKwkJCXJlYWRfaW50 MzIodi0+Y29udGVudC50c21hdGNoLnRzcXVlcnlfbGVuLCBiYXNlLCBwb3MpOworCQkJcmVhZF9p bnQzMih2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbiwgYmFzZSwgcG9zKTsKKworCQkJ LyogU2V0IHBvaW50ZXJzIHRvIHRoZSBzdHJpbmdzIGluIHRoZSBidWZmZXIgKi8KKwkJCXYtPmNv bnRlbnQudHNtYXRjaC50c3F1ZXJ5ID0gYmFzZSArIHBvczsKKwkJCXBvcyArPSB2LT5jb250ZW50 LnRzbWF0Y2gudHNxdWVyeV9sZW4gKyAxOworCisJCQlpZiAodi0+Y29udGVudC50c21hdGNoLnRz cXBhcnNlcl9sZW4gPiAwKQorCQkJeworCQkJCXYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXIg PSBiYXNlICsgcG9zOworCQkJCXBvcyArPSB2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xl biArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdi0+Y29udGVudC50c21hdGNoLnRzcXBh cnNlciA9IE5VTEw7CisJCQl9CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1Is ICJ1bnJlY29nbml6ZWQganNvbnBhdGggaXRlbSB0eXBlOiAlZCIsIHYtPnR5cGUpOwogCX0KQEAg LTEyMzEsNiArMTM1NSw3IEBAIGpzcEdldE5leHQoSnNvblBhdGhJdGVtICp2LCBKc29uUGF0aEl0 ZW0gKmEpCiAJCQkgICB2LT50eXBlID09IGpwaUxhc3QgfHwKIAkJCSAgIHYtPnR5cGUgPT0ganBp U3RhcnRzV2l0aCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlMaWtlUmVnZXggfHwKKwkJCSAgIHYt PnR5cGUgPT0ganBpVHNNYXRjaCB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlCaWdpbnQgfHwKIAkJ CSAgIHYtPnR5cGUgPT0ganBpQm9vbGVhbiB8fAogCQkJICAgdi0+dHlwZSA9PSBqcGlEYXRlIHx8 CkBAIC0xNTc1LDcgKzE3MDAsMTEgQEAganNwSXNNdXRhYmxlV2Fsa2VyKEpzb25QYXRoSXRlbSAq anBpLCBzdHJ1Y3QgSnNvblBhdGhNdXRhYmxlQ29udGV4dCAqY3h0KQogCQkJCWpzcEluaXRCeUJ1 ZmZlcigmYXJnLCBqcGktPmJhc2UsIGpwaS0+Y29udGVudC5saWtlX3JlZ2V4LmV4cHIpOwogCQkJ CWpzcElzTXV0YWJsZVdhbGtlcigmYXJnLCBjeHQpOwogCQkJCWJyZWFrOwotCisJCQljYXNlIGpw aVRzTWF0Y2g6CisJCQkJQXNzZXJ0KHN0YXR1cyA9PSBqcGRzTm9uRGF0ZVRpbWUpOworCQkJCWpz cEluaXRCeUJ1ZmZlcigmYXJnLCBqcGktPmJhc2UsIGpwaS0+Y29udGVudC50c21hdGNoLmRvYyk7 CisJCQkJanNwSXNNdXRhYmxlV2Fsa2VyKCZhcmcsIGN4dCk7CisJCQkJYnJlYWs7CiAJCQkJLyog bGl0ZXJhbHMgKi8KIAkJCWNhc2UganBpTnVsbDoKIAkJCWNhc2UganBpU3RyaW5nOgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2V4ZWMuYyBiL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMKaW5kZXggNzcwODQwYTA2MTEuLmI5NWVlNjMwZjJh IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jCisrKyBi L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMKQEAgLTY1LDYgKzY1LDcgQEAK ICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJub2Rlcy9taXNjbm9kZXMuaCIKICNp bmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKKyNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCiAj aW5jbHVkZSAicmVnZXgvcmVnZXguaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2lu Y2x1ZGUgInV0aWxzL2RhdGUuaCIKQEAgLTExNCw2ICsxMTUsNyBAQCB0eXBlZGVmIHN0cnVjdCBK c29uUGF0aEV4ZWNDb250ZXh0CiAJYm9vbAkJdGhyb3dFcnJvcnM7CS8qIHdpdGggImZhbHNlIiBh bGwgc3VwcHJlc3NpYmxlIGVycm9ycyBhcmUKIAkJCQkJCQkJICogc3VwcHJlc3NlZCAqLwogCWJv b2wJCXVzZVR6OworCUxpc3QJICAgKnRzbWF0Y2hfY2FjaGU7CS8qIFBlcnNpc3RzIGNvbXBpbGVk IEZUUyBxdWVyaWVzICovCiB9IEpzb25QYXRoRXhlY0NvbnRleHQ7CiAKIC8qIENvbnRleHQgZm9y IExJS0VfUkVHRVggZXhlY3V0aW9uLiAqLwpAQCAtMTIzLDYgKzEyNSwyMCBAQCB0eXBlZGVmIHN0 cnVjdCBKc29uTGlrZVJlZ2V4Q29udGV4dAogCWludAkJCWNmbGFnczsKIH0gSnNvbkxpa2VSZWdl eENvbnRleHQ7CiAKK3R5cGVkZWYgc3RydWN0IEpzb25Uc01hdGNoQ29udGV4dAoreworCURhdHVt CQlxdWVyeURhdHVtOwkJLyogQ2FjaGUgdGhlIGNvbXBpbGVkIGJpbmFyeSBUU1F1ZXJ5ICovCisJ T2lkCQkJdHNjb25maWdJZDsJCS8qIENhY2hlIHRoZSBkaWN0aW9uYXJ5IE9JRCAqLworCWJvb2wJ CWluaXRpYWxpemVkOwkvKiBGbGFnIHRvIHJ1biBzZXR1cCBvbmx5IG9uY2UgKi8KK30JCQlKc29u VHNNYXRjaENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEpzb25Uc01hdGNoQ2FjaGVFbnRyeQor eworCXZvaWQJICAgKmpzcF9wdHI7CQkvKiBDYWNoZSBrZXk6IHBvaW50ZXIgdG8gdGhlIEFTVCBu b2RlICovCisJRGF0dW0JCXF1ZXJ5RGF0dW07CQkvKiBDYWNoZWQgY29tcGlsZWQgcXVlcnkgKi8K KwlPaWQJCQl0c2NvbmZpZ0lkOwkJLyogQ2FjaGVkIGRpY3Rpb25hcnkgT0lEICovCit9CQkJSnNv blRzTWF0Y2hDYWNoZUVudHJ5OworCiAvKiBSZXN1bHQgb2YganNvbnBhdGggcHJlZGljYXRlIGV2 YWx1YXRpb24gKi8KIHR5cGVkZWYgZW51bSBKc29uUGF0aEJvb2wKIHsKQEAgLTMzNSw2ICszNTEs NyBAQCBzdGF0aWMgSnNvblBhdGhFeGVjUmVzdWx0IGV4ZWN1dGVLZXlWYWx1ZU1ldGhvZChKc29u UGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJCQkJCQkJCQkJCQlKc29uUGF0aEl0ZW0gKmpzcCwgSnNv bmJWYWx1ZSAqamIsIEpzb25WYWx1ZUxpc3QgKmZvdW5kKTsKIHN0YXRpYyBKc29uUGF0aEV4ZWNS ZXN1bHQgYXBwZW5kQm9vbFJlc3VsdChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsCiAJCQkJCQkJ CQkJICAgSnNvblBhdGhJdGVtICpqc3AsIEpzb25WYWx1ZUxpc3QgKmZvdW5kLCBKc29uUGF0aEJv b2wgcmVzKTsKK3N0YXRpYyBKc29uUGF0aEJvb2wgZXhlY3V0ZVRzTWF0Y2goSnNvblBhdGhJdGVt ICpqc3AsIEpzb25iVmFsdWUgKnN0ciwgSnNvbmJWYWx1ZSAqcmFyZywgdm9pZCAqcGFyYW0pOwog c3RhdGljIHZvaWQgZ2V0SnNvblBhdGhJdGVtKEpzb25QYXRoRXhlY0NvbnRleHQgKmN4dCwgSnNv blBhdGhJdGVtICppdGVtLAogCQkJCQkJCUpzb25iVmFsdWUgKnZhbHVlKTsKIHN0YXRpYyBKc29u YlZhbHVlICpHZXRKc29uUGF0aFZhcih2b2lkICpjeHQsIGNoYXIgKnZhck5hbWUsIGludCB2YXJO YW1lTGVuLApAQCAtNzQwLDYgKzc1Nyw3IEBAIGV4ZWN1dGVKc29uUGF0aChKc29uUGF0aCAqcGF0 aCwgdm9pZCAqdmFycywgSnNvblBhdGhHZXRWYXJDYWxsYmFjayBnZXRWYXIsCiAJY3h0LmlubmVy bW9zdEFycmF5U2l6ZSA9IC0xOwogCWN4dC50aHJvd0Vycm9ycyA9IHRocm93RXJyb3JzOwogCWN4 dC51c2VUeiA9IHVzZVR6OworCWN4dC50c21hdGNoX2NhY2hlID0gTklMOwogCiAJaWYgKGpzcFN0 cmljdEFic2VuY2VPZkVycm9ycygmY3h0KSAmJiAhcmVzdWx0KQogCXsKQEAgLTg0MCw2ICs4NTgs NyBAQCBleGVjdXRlSXRlbU9wdFVud3JhcFRhcmdldChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQs IEpzb25QYXRoSXRlbSAqanNwLAogCQljYXNlIGpwaUV4aXN0czoKIAkJY2FzZSBqcGlTdGFydHNX aXRoOgogCQljYXNlIGpwaUxpa2VSZWdleDoKKwkJY2FzZSBqcGlUc01hdGNoOgogCQkJewogCQkJ CUpzb25QYXRoQm9vbCBzdCA9IGV4ZWN1dGVCb29sSXRlbShjeHQsIGpzcCwgamIsIHRydWUpOwog CkBAIC0xOTE0LDYgKzE5MzMsMTggQEAgZXhlY3V0ZUJvb2xJdGVtKEpzb25QYXRoRXhlY0NvbnRl eHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAJCQkJcmV0dXJuIGV4ZWN1dGVQcmVkaWNhdGUo Y3h0LCBqc3AsICZsYXJnLCBOVUxMLCBqYiwgZmFsc2UsCiAJCQkJCQkJCQkJZXhlY3V0ZUxpa2VS ZWdleCwgJmxyY3h0KTsKIAkJCX0KKwkJY2FzZSBqcGlUc01hdGNoOgorCQkJeworCQkJCWpzcElu aXRCeUJ1ZmZlcigmbGFyZywganNwLT5iYXNlLAorCQkJCQkJCQlqc3AtPmNvbnRlbnQudHNtYXRj aC5kb2MpOworCisJCQkJLyoKKwkJCQkgKiBQYXNzICdjeHQnIGFzIHRoZSBwYXJhbSBzbyBleGVj dXRlVHNNYXRjaCBjYW4gYWNjZXNzIHRoZQorCQkJCSAqIGNhY2hlIGxpc3QKKwkJCQkgKi8KKwkJ CQlyZXR1cm4gZXhlY3V0ZVByZWRpY2F0ZShjeHQsIGpzcCwgJmxhcmcsIE5VTEwsIGpiLCBmYWxz ZSwKKwkJCQkJCQkJCQlleGVjdXRlVHNNYXRjaCwgY3h0KTsKKwkJCX0KIAogCQljYXNlIGpwaUV4 aXN0czoKIAkJCWpzcEdldEFyZyhqc3AsICZsYXJnKTsKQEAgLTE5NTIsNyArMTk4Myw2IEBAIGV4 ZWN1dGVCb29sSXRlbShKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsIEpzb25QYXRoSXRlbSAqanNw LAogCiAJCQkJcmV0dXJuIHJlcyA9PSBqcGVyT2sgPyBqcGJUcnVlIDoganBiRmFsc2U7CiAJCQl9 Ci0KIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1IsICJpbnZhbGlkIGJvb2xlYW4ganNvbnBhdGgg aXRlbSB0eXBlOiAlZCIsIGpzcC0+dHlwZSk7CiAJCQlyZXR1cm4ganBiVW5rbm93bjsKQEAgLTMx ODUsNiArMzIxNSwxMjcgQEAgZXhlY3V0ZUtleVZhbHVlTWV0aG9kKEpzb25QYXRoRXhlY0NvbnRl eHQgKmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAKIAlyZXR1cm4gcmVzOwogfQorI2luY2x1ZGUg InRzZWFyY2gvdHNfdXRpbHMuaCIKKyNpbmNsdWRlICJ0c2VhcmNoL3RzX2NhY2hlLmgiCisjaW5j bHVkZSAidXRpbHMvcmVncHJvYy5oIgorI2luY2x1ZGUgImNhdGFsb2cvbmFtZXNwYWNlLmgiCisK K3N0YXRpYyBKc29uUGF0aEJvb2wKK2V4ZWN1dGVUc01hdGNoKEpzb25QYXRoSXRlbSAqanNwLCBK c29uYlZhbHVlICpzdHIsIEpzb25iVmFsdWUgKnJhcmcsCisJCQkgICB2b2lkICpwYXJhbSkKK3sK KwlKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQgPSAoSnNvblBhdGhFeGVjQ29udGV4dCAqKSBwYXJh bTsKKwlKc29uVHNNYXRjaENhY2hlRW50cnkgKmNhY2hlID0gTlVMTDsKKwlMaXN0Q2VsbCAgICps YzsKKwl0ZXh0CSAgICpkb2NfdGV4dDsKKwlEYXR1bQkJdHN2ZWN0b3JfZGF0dW07CisJYm9vbAkJ bWF0Y2g7CisKKwlpZiAoIShzdHIgPSBnZXRTY2FsYXIoc3RyLCBqYnZTdHJpbmcpKSkKKwkJcmV0 dXJuIGpwYlVua25vd247CisKKwkvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGNvbXBpbGVkIHRoZSBx dWVyeSBmb3IgdGhpcyBzcGVjaWZpYyBBU1Qgbm9kZSAqLworCWZvcmVhY2gobGMsIGN4dC0+dHNt YXRjaF9jYWNoZSkKKwl7CisJCUpzb25Uc01hdGNoQ2FjaGVFbnRyeSAqZW50cnkgPSAoSnNvblRz TWF0Y2hDYWNoZUVudHJ5ICopIGxmaXJzdChsYyk7CisKKwkJaWYgKGVudHJ5LT5qc3BfcHRyID09 ICh2b2lkICopIGpzcCkKKwkJeworCQkJY2FjaGUgPSBlbnRyeTsKKwkJCWJyZWFrOworCQl9CisJ fQorCisJLyogSWYgbm90IGZvdW5kLCBwYXJzZSwgY29tcGlsZSwgYW5kIGNhY2hlIGl0ICovCisJ aWYgKGNhY2hlID09IE5VTEwpCisJeworCQl0ZXh0CSAgICpxdWVyeV90ZXh0OworCQljaGFyCSAg ICpwYXJzZXJfbW9kZTsKKwkJdWludDMyCQlwYXJzZXJfbGVuOworCisJCS8qIEFsbG9jYXRlIG5l dyBjYWNoZSBlbnRyeSBpbiB0aGUgZXhlY3V0aW9uIG1lbW9yeSBjb250ZXh0ICovCisJCWNhY2hl ID0gcGFsbG9jMChzaXplb2YoSnNvblRzTWF0Y2hDYWNoZUVudHJ5KSk7CisJCWNhY2hlLT5qc3Bf cHRyID0gKHZvaWQgKikganNwOworCisJCWlmIChqc3AtPmNvbnRlbnQudHNtYXRjaC50c2NvbmZp ZyAhPSAwKQorCQl7CisJCQlKc29uUGF0aEl0ZW0gY29uZmlnX2l0ZW07CisJCQlpbnQzMgkJY29u ZmlnX2xlbjsKKwkJCWNoYXIJICAgKmNvbmZpZ19zdHI7CisJCQljaGFyCSAgICpzYWZlX2NvbmZp Z19zdHI7CisKKwkJCWpzcEluaXRCeUJ1ZmZlcigmY29uZmlnX2l0ZW0sIGpzcC0+YmFzZSwganNw LT5jb250ZW50LnRzbWF0Y2gudHNjb25maWcpOworCQkJY29uZmlnX3N0ciA9IGpzcEdldFN0cmlu ZygmY29uZmlnX2l0ZW0sICZjb25maWdfbGVuKTsKKworCQkJLyogTnVsbC10ZXJtaW5hdGUgZm9y IHNhZmUgY2F0YWxvZyBsb29rdXAgKi8KKwkJCXNhZmVfY29uZmlnX3N0ciA9IHBuc3RyZHVwKGNv bmZpZ19zdHIsIGNvbmZpZ19sZW4pOworCQkJY2FjaGUtPnRzY29uZmlnSWQgPSBnZXRfdHNfY29u ZmlnX29pZChzdHJpbmdUb1F1YWxpZmllZE5hbWVMaXN0KHNhZmVfY29uZmlnX3N0ciwgTlVMTCks IHRydWUpOworCQkJcGZyZWUoc2FmZV9jb25maWdfc3RyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJ CWNhY2hlLT50c2NvbmZpZ0lkID0gZ2V0VFNDdXJyZW50Q29uZmlnKHRydWUpOworCQl9CisKKwkJ LyogUHJlcGFyZSBRdWVyeSBUZXh0ICovCisJCXF1ZXJ5X3RleHQgPSBjc3RyaW5nX3RvX3RleHRf d2l0aF9sZW4oanNwLT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeSwKKwkJCQkJCQkJCQkJICBqc3At PmNvbnRlbnQudHNtYXRjaC50c3F1ZXJ5X2xlbik7CisKKwkJLyogU2VsZWN0IFBhcnNlciBhbmQg Q29tcGlsZSBRdWVyeSAqLworCQlwYXJzZXJfbW9kZSA9IGpzcC0+Y29udGVudC50c21hdGNoLnRz cXBhcnNlcjsKKwkJcGFyc2VyX2xlbiA9IGpzcC0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9s ZW47CisKKwkJaWYgKHBhcnNlcl9sZW4gPiAwKQorCQl7CisJCQlpZiAocGdfc3RybmNhc2VjbXAo cGFyc2VyX21vZGUsICJwbCIsIHBhcnNlcl9sZW4pID09IDApCisJCQl7CisJCQkJY2FjaGUtPnF1 ZXJ5RGF0dW0gPSBEaXJlY3RGdW5jdGlvbkNhbGwyKHBsYWludG9fdHNxdWVyeV9ieWlkLAorCQkJ CQkJCQkJCQkJCQlPYmplY3RJZEdldERhdHVtKGNhY2hlLT50c2NvbmZpZ0lkKSwKKwkJCQkJCQkJ CQkJCQkJUG9pbnRlckdldERhdHVtKHF1ZXJ5X3RleHQpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBn X3N0cm5jYXNlY21wKHBhcnNlcl9tb2RlLCAicGgiLCBwYXJzZXJfbGVuKSA9PSAwKQorCQkJewor CQkJCWNhY2hlLT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMihwaHJhc2V0b190c3F1 ZXJ5X2J5aWQsCisJCQkJCQkJCQkJCQkJCU9iamVjdElkR2V0RGF0dW0oY2FjaGUtPnRzY29uZmln SWQpLAorCQkJCQkJCQkJCQkJCQlQb2ludGVyR2V0RGF0dW0ocXVlcnlfdGV4dCkpOworCQkJfQor CQkJZWxzZSBpZiAocGdfc3RybmNhc2VjbXAocGFyc2VyX21vZGUsICJ3IiwgcGFyc2VyX2xlbikg PT0gMCkKKwkJCXsKKwkJCQljYWNoZS0+cXVlcnlEYXR1bSA9IERpcmVjdEZ1bmN0aW9uQ2FsbDIo d2Vic2VhcmNoX3RvX3RzcXVlcnlfYnlpZCwKKwkJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1 bShjYWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkJCVBvaW50ZXJHZXREYXR1bShxdWVy eV90ZXh0KSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcGdfdW5yZWFjaGFibGUoKTsKKwkJ CX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNhY2hlLT5xdWVyeURhdHVtID0gRGlyZWN0RnVuY3Rp b25DYWxsMih0b190c3F1ZXJ5X2J5aWQsCisJCQkJCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShj YWNoZS0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkJUG9pbnRlckdldERhdHVtKHF1ZXJ5X3Rl eHQpKTsKKwkJfQorCisJCS8qIEFwcGVuZCB0aGUgbmV3bHkgY29tcGlsZWQgY2FjaGUgZW50cnkg dG8gdGhlIGNvbnRleHQncyBsaXN0ICovCisJCWN4dC0+dHNtYXRjaF9jYWNoZSA9IGxhcHBlbmQo Y3h0LT50c21hdGNoX2NhY2hlLCBjYWNoZSk7CisJfQorCisJLyogUnVudGltZSBFeGVjdXRpb24g KFVzaW5nIHRoZSBjYWNoZWQgcXVlcnkpICovCisJZG9jX3RleHQgPSBjc3RyaW5nX3RvX3RleHRf d2l0aF9sZW4oc3RyLT52YWwuc3RyaW5nLnZhbCwKKwkJCQkJCQkJCQlzdHItPnZhbC5zdHJpbmcu bGVuKTsKKworCXRzdmVjdG9yX2RhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMih0b190c3ZlY3Rv cl9ieWlkLAorCQkJCQkJCQkJCSBPYmplY3RJZEdldERhdHVtKGNhY2hlLT50c2NvbmZpZ0lkKSwK KwkJCQkJCQkJCQkgUG9pbnRlckdldERhdHVtKGRvY190ZXh0KSk7CisKKwltYXRjaCA9IERhdHVt R2V0Qm9vbChEaXJlY3RGdW5jdGlvbkNhbGwyKHRzX21hdGNoX3ZxLAorCQkJCQkJCQkJCQkgdHN2 ZWN0b3JfZGF0dW0sCisJCQkJCQkJCQkJCSBjYWNoZS0+cXVlcnlEYXR1bSkpOworCisJcmV0dXJu IG1hdGNoID8ganBiVHJ1ZSA6IGpwYkZhbHNlOworfQorCiAKIC8qCiAgKiBDb252ZXJ0IGJvb2xl YW4gZXhlY3V0aW9uIHN0YXR1cyAncmVzJyB0byBhIGJvb2xlYW4gSlNPTiBpdGVtIGFuZCBleGVj dXRlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZ3JhbS55IGIv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dyYW0ueQppbmRleCBmODI2Njk3ZDA5OC4u NDdmNjIwOGQ5MzMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9n cmFtLnkKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dyYW0ueQpAQCAtNDMs NyArNDMsMTIgQEAgc3RhdGljIGJvb2wgbWFrZUl0ZW1MaWtlUmVnZXgoSnNvblBhdGhQYXJzZUl0 ZW0gKmV4cHIsCiAJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqZmxhZ3MsCiAJCQkJCQkJICBKc29u UGF0aFBhcnNlSXRlbSAqKiByZXN1bHQsCiAJCQkJCQkJICBzdHJ1Y3QgTm9kZSAqZXNjb250ZXh0 KTsKLQorc3RhdGljIGJvb2wgbWFrZUl0ZW1Uc01hdGNoKEpzb25QYXRoUGFyc2VJdGVtICpkb2Ms CisJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqdHNxdWVyeSwKKwkJCQkJCQkgIEpzb25QYXRoU3Ry aW5nICp0c2NvbmZpZywKKwkJCQkJCQkgIEpzb25QYXRoU3RyaW5nICp0c3F1ZXJ5X3BhcnNlciwK KwkJCQkJCQkgIEpzb25QYXRoUGFyc2VJdGVtICoqIHJlc3VsdCwKKwkJCQkJCQkgIHN0cnVjdCBO b2RlICplc2NvbnRleHQpOwogLyoKICAqIEJpc29uIGRvZXNuJ3QgYWxsb2NhdGUgYW55dGhpbmcg dGhhdCBuZWVkcyB0byBsaXZlIGFjcm9zcyBwYXJzZXIgY2FsbHMsCiAgKiBzbyB3ZSBjYW4gZWFz aWx5IGhhdmUgaXQgdXNlIHBhbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4gIFRoaXMgcHJldmVudHMK QEAgLTczLDYgKzc4LDEzIEBAIHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRo UGFyc2VJdGVtICpleHByLAogCUpzb25QYXRoUGFyc2VJdGVtICAqdmFsdWU7CiAJSnNvblBhdGhQ YXJzZVJlc3VsdCAqcmVzdWx0OwogCUpzb25QYXRoSXRlbVR5cGUJb3B0eXBlOworCXN0cnVjdAor CXsKKwkJYm9vbCAgICAgICAgICAgIGhhc190c2NvbmZpZzsKKwkJSnNvblBhdGhTdHJpbmcgIHRz Y29uZmlnOworCQlib29sICAgICAgICAgICAgaGFzX3RzcXBhcnNlcjsKKwkJSnNvblBhdGhTdHJp bmcgIHRzcXBhcnNlcjsKKwl9ICAgICAgICAgICAgICAgdHNtYXRjaF9vcHRzOwogCWJvb2wJCQkJ Ym9vbGVhbjsKIAlpbnQJCQkJCWludGVnZXI7CiB9CkBAIC04MSw3ICs5Myw3IEBAIHN0YXRpYyBi b29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25QYXRoUGFyc2VJdGVtICpleHByLAogJXRva2VuCTxz dHI+CQlJREVOVF9QIFNUUklOR19QIE5VTUVSSUNfUCBJTlRfUCBWQVJJQUJMRV9QCiAldG9rZW4J PHN0cj4JCU9SX1AgQU5EX1AgTk9UX1AKICV0b2tlbgk8c3RyPgkJTEVTU19QIExFU1NFUVVBTF9Q IEVRVUFMX1AgTk9URVFVQUxfUCBHUkVBVEVSRVFVQUxfUCBHUkVBVEVSX1AKLSV0b2tlbgk8c3Ry PgkJQU5ZX1AgU1RSSUNUX1AgTEFYX1AgTEFTVF9QIFNUQVJUU19QIFdJVEhfUCBMSUtFX1JFR0VY X1AgRkxBR19QCisldG9rZW4JPHN0cj4JCUFOWV9QIFNUUklDVF9QIExBWF9QIExBU1RfUCBTVEFS VFNfUCBXSVRIX1AgTElLRV9SRUdFWF9QIEZMQUdfUCBUU01BVENIX1AgVFNDT05GSUdfUCBUU1FV RVJZUEFSU0VSX1AKICV0b2tlbgk8c3RyPgkJQUJTX1AgU0laRV9QIFRZUEVfUCBGTE9PUl9QIERP VUJMRV9QIENFSUxJTkdfUCBLRVlWQUxVRV9QCiAldG9rZW4JPHN0cj4JCURBVEVUSU1FX1AKICV0 b2tlbgk8c3RyPgkJQklHSU5UX1AgQk9PTEVBTl9QIERBVEVfUCBERUNJTUFMX1AgSU5URUdFUl9Q IE5VTUJFUl9QCkBAIC0xMDksNiArMTIxLDggQEAgc3RhdGljIGJvb2wgbWFrZUl0ZW1MaWtlUmVn ZXgoSnNvblBhdGhQYXJzZUl0ZW0gKmV4cHIsCiAKICV0eXBlCTxpbnRlZ2VyPglhbnlfbGV2ZWwK IAorJXR5cGUgIDx0c21hdGNoX29wdHM+ICB0c21hdGNoX29wdHMKKwogJWxlZnQJT1JfUAogJWxl ZnQJQU5EX1AKICVyaWdodAlOT1RfUApAQCAtMTg5LDcgKzIwMyw0NCBAQCBwcmVkaWNhdGU6CiAJ CQlZWUFCT1JUOwogCQkkJCA9IGpwcGl0ZW07CiAJfQorCXwgZXhwciBUU01BVENIX1AgU1RSSU5H X1AgdHNtYXRjaF9vcHRzCisgICAgICAgeworICAgICAgICAgIEpzb25QYXRoUGFyc2VJdGVtICpq cHBpdGVtOworCisgICAgICAgICAgbWFrZUl0ZW1Uc01hdGNoKCQxLCAmJDMsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICQ0Lmhhc190c2NvbmZpZyA/ICYkNC50c2NvbmZpZyA6IE5VTEwsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICQ0Lmhhc190c3FwYXJzZXIgPyAmJDQudHNxcGFyc2Vy IDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmpwcGl0ZW0sIGVzY29udGV4dCk7 CisKKyAgICAgICAgICAkJCA9IGpwcGl0ZW07CisgICAgICAgfQogCTsKKwl0c21hdGNoX29wdHM6 CisgICAgICAgIC8qIEVNUFRZICovCisgICAgICAgIHsKKyAgICAgICAgICAgICQkLmhhc190c2Nv bmZpZyA9IGZhbHNlOworICAgICAgICAgICAgJCQuaGFzX3RzcXBhcnNlciA9IGZhbHNlOworICAg ICAgICB9CisgICAgICAgIHwgVFNDT05GSUdfUCBTVFJJTkdfUAorICAgICAgICB7CisgICAgICAg ICAgICAkJC5oYXNfdHNjb25maWcgPSB0cnVlOworICAgICAgICAgICAgJCQudHNjb25maWcgPSAk MjsKKyAgICAgICAgICAgICQkLmhhc190c3FwYXJzZXIgPSBmYWxzZTsKKyAgICAgICAgfQorICAg ICAgICB8IFRTUVVFUllQQVJTRVJfUCBTVFJJTkdfUAorICAgICAgICB7CisgICAgICAgICAgICAk JC5oYXNfdHNjb25maWcgPSBmYWxzZTsKKyAgICAgICAgICAgICQkLmhhc190c3FwYXJzZXIgPSB0 cnVlOworICAgICAgICAgICAgJCQudHNxcGFyc2VyID0gJDI7CisgICAgICAgIH0KKyAgICAgICAg fCBUU0NPTkZJR19QIFNUUklOR19QIFRTUVVFUllQQVJTRVJfUCBTVFJJTkdfUAorICAgICAgICB7 CisgICAgICAgICAgICAkJC5oYXNfdHNjb25maWcgPSB0cnVlOworICAgICAgICAgICAgJCQudHNj b25maWcgPSAkMjsKKyAgICAgICAgICAgICQkLmhhc190c3FwYXJzZXIgPSB0cnVlOworICAgICAg ICAgICAgJCQudHNxcGFyc2VyID0gJDQ7CisgICAgICAgIH0KKyAgICAgICAgOwogCiBzdGFydHNf d2l0aF9pbml0aWFsOgogCVNUUklOR19QCQkJCQkJeyAkJCA9IG1ha2VJdGVtU3RyaW5nKCYkMSk7 IH0KQEAgLTM3Nyw2ICs0MjgsOSBAQCBrZXlfbmFtZToKIAl8IFRJTUVfVFpfUAogCXwgVElNRVNU QU1QX1AKIAl8IFRJTUVTVEFNUF9UWl9QCisJfCBUU0NPTkZJR19QCisgICAgfCBUU01BVENIX1AK KyAgICB8IFRTUVVFUllQQVJTRVJfUAogCXwgU1RSX0xPV0VSX1AKIAl8IFNUUl9VUFBFUl9QCiAJ fCBTVFJfSU5JVENBUF9QCkBAIC03MTUsMyArNzY5LDYwIEBAIGpzcENvbnZlcnRSZWdleEZsYWdz KHVpbnQzMiB4ZmxhZ3MsIGludCAqcmVzdWx0LCBzdHJ1Y3QgTm9kZSAqZXNjb250ZXh0KQogCiAJ cmV0dXJuIHRydWU7CiB9CisKK3N0YXRpYyBib29sCittYWtlSXRlbVRzTWF0Y2goSnNvblBhdGhQ YXJzZUl0ZW0gKmRvYywKKwkJCSBKc29uUGF0aFN0cmluZyAqdHNxdWVyeSwKKwkJCSBKc29uUGF0 aFN0cmluZyAqdHNjb25maWcsCisJCQkgSnNvblBhdGhTdHJpbmcgKnRzcXVlcnlfcGFyc2VyLAor CQkJIEpzb25QYXRoUGFyc2VJdGVtICoqcmVzdWx0LAorCQkJIHN0cnVjdCBOb2RlICplc2NvbnRl eHQpCit7CisJSnNvblBhdGhQYXJzZUl0ZW0gKnYgPSBtYWtlSXRlbVR5cGUoanBpVHNNYXRjaCk7 CisKKwl2LT52YWx1ZS50c21hdGNoLmRvYyA9IGRvYzsKKworCXYtPnZhbHVlLnRzbWF0Y2gudHNx dWVyeSA9IHRzcXVlcnktPnZhbDsKKwl2LT52YWx1ZS50c21hdGNoLnRzcXVlcnlfbGVuID0gdHNx dWVyeS0+bGVuOworCisJLyogSGFuZGxlIHRoZSBDb25maWd1cmF0aW9uIChTdG9yZWQgYXMgYSBO b2RlKSAqLworCWlmICh0c2NvbmZpZykKKwl7CisJICAgSnNvblBhdGhQYXJzZUl0ZW0gKmNvbmYg PSBtYWtlSXRlbVR5cGUoanBpU3RyaW5nKTsKKwkgICBjb25mLT52YWx1ZS5zdHJpbmcudmFsID0g dHNjb25maWctPnZhbDsKKwkgICBjb25mLT52YWx1ZS5zdHJpbmcubGVuID0gdHNjb25maWctPmxl bjsKKwkgICB2LT52YWx1ZS50c21hdGNoLnRzY29uZmlnID0gY29uZjsKKwl9CisJZWxzZQorCXsK KwkgICB2LT52YWx1ZS50c21hdGNoLnRzY29uZmlnID0gTlVMTDsKKwl9CisKKwkvKiBIYW5kbGUg dGhlIFRTUXVlcnkgUGFyc2VyIEZsYWcgKi8KKwlpZiAodHNxdWVyeV9wYXJzZXIpCisJeworCQkv KiBDaGVjayBmb3IgInBsIiwgInBoIiwgInciIGhlcmUgdG8gdGhyb3cgYSBzeW50YXggZXJyb3Ig aW1tZWRpYXRlbHkgKi8KKwkJaWYgKHBnX3N0cm5jYXNlY21wKHRzcXVlcnlfcGFyc2VyLT52YWws ICJwbCIsIHRzcXVlcnlfcGFyc2VyLT5sZW4pICE9IDAgJiYKKwkJCXBnX3N0cm5jYXNlY21wKHRz cXVlcnlfcGFyc2VyLT52YWwsICJwaCIsIHRzcXVlcnlfcGFyc2VyLT5sZW4pICE9IDAgJiYKKwkJ CXBnX3N0cm5jYXNlY21wKHRzcXVlcnlfcGFyc2VyLT52YWwsICJ3IiwgIHRzcXVlcnlfcGFyc2Vy LT5sZW4pICE9IDApCisJCXsKKwkJCSBlcmVwb3J0KEVSUk9SLAorCQkJCQkgKGVycmNvZGUoRVJS Q09ERV9TWU5UQVhfRVJST1IpLAorCQkJCQkgIGVycm1zZygiaW52YWxpZCB0c3F1ZXJ5X3BhcnNl ciB2YWx1ZTogXCIlLipzXCIiLAorCQkJCQkgIAkJKGludCkgdHNxdWVyeV9wYXJzZXItPmxlbiwg dHNxdWVyeV9wYXJzZXItPnZhbCksCisJCQkJCSAgZXJyaGludCgiVmFsaWQgdmFsdWVzIGFyZSBc InBsXCIsIFwicGhcIiwgYW5kIFwid1wiLiIpKSk7CisJCX0KKworCQl2LT52YWx1ZS50c21hdGNo LnRzcXBhcnNlciA9IHRzcXVlcnlfcGFyc2VyLT52YWw7CisJCXYtPnZhbHVlLnRzbWF0Y2gudHNx cGFyc2VyX2xlbiA9IHRzcXVlcnlfcGFyc2VyLT5sZW47CisJfQorCWVsc2UKKwl7CisJCXYtPnZh bHVlLnRzbWF0Y2gudHNxcGFyc2VyID0gTlVMTDsKKwkJdi0+dmFsdWUudHNtYXRjaC50c3FwYXJz ZXJfbGVuID0gMDsKKwl9CisKKwkvKiBTdWNjZXNzICovCisJKnJlc3VsdCA9IHY7CisJcmV0dXJu IHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfc2Nh bi5sIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX3NjYW4ubAppbmRleCBlNGZhZGNj MmU2OS4uOTJiM2U5YmU5MjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29u cGF0aF9zY2FuLmwKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX3NjYW4ubApA QCAtNDM0LDEwICs0MzQsMTMgQEAgc3RhdGljIGNvbnN0IEpzb25QYXRoS2V5d29yZCBrZXl3b3Jk c1tdID0gewogCXs3LCBmYWxzZSwgSU5URUdFUl9QLCAiaW50ZWdlciJ9LAogCXs3LCBmYWxzZSwg U1RSX1JFUExBQ0VfUCwgInJlcGxhY2UifSwKIAl7NywgZmFsc2UsIFRJTUVfVFpfUCwgInRpbWVf dHoifSwKKwl7NywgZmFsc2UsIFRTTUFUQ0hfUCwgInRzbWF0Y2gifSwKIAl7NywgZmFsc2UsIFVO S05PV05fUCwgInVua25vd24ifSwKIAl7OCwgZmFsc2UsIERBVEVUSU1FX1AsICJkYXRldGltZSJ9 LAogCXs4LCBmYWxzZSwgS0VZVkFMVUVfUCwgImtleXZhbHVlIn0sCisJezgsIGZhbHNlLCBUU0NP TkZJR19QLCAidHNjb25maWcifSwKIAl7OSwgZmFsc2UsIFRJTUVTVEFNUF9QLCAidGltZXN0YW1w In0sCisJezksIGZhbHNlLCBUU1FVRVJZUEFSU0VSX1AsICJ0c3FwYXJzZXIifSwKIAl7MTAsIGZh bHNlLCBMSUtFX1JFR0VYX1AsICJsaWtlX3JlZ2V4In0sCiAJezEwLCBmYWxzZSwgU1RSX1NQTElU X1BBUlRfUCwgInNwbGl0X3BhcnQifSwKIAl7MTIsIGZhbHNlLCBUSU1FU1RBTVBfVFpfUCwgInRp bWVzdGFtcF90eiJ9LApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGguaCBi L3NyYy9pbmNsdWRlL3V0aWxzL2pzb25wYXRoLmgKaW5kZXggOGQyNzIwNmUyNDIuLjg5NzUzYmY4 YmM3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9qc29ucGF0aC5oCisrKyBiL3NyYy9p bmNsdWRlL3V0aWxzL2pzb25wYXRoLmgKQEAgLTEwNCw2ICsxMDQsNyBAQCB0eXBlZGVmIGVudW0g SnNvblBhdGhJdGVtVHlwZQogCWpwaUxhc3QsCQkJCQkvKiBMQVNUIGFycmF5IHN1YnNjcmlwdCAq LwogCWpwaVN0YXJ0c1dpdGgsCQkJCS8qIFNUQVJUUyBXSVRIIHByZWRpY2F0ZSAqLwogCWpwaUxp a2VSZWdleCwJCQkJLyogTElLRV9SRUdFWCBwcmVkaWNhdGUgKi8KKwlqcGlUc01hdGNoLAkJCQkJ LyogVFNNQVRDSCBwcmVkaWNhdGUgKi8KIAlqcGlCaWdpbnQsCQkJCQkvKiAuYmlnaW50KCkgaXRl bSBtZXRob2QgKi8KIAlqcGlCb29sZWFuLAkJCQkJLyogLmJvb2xlYW4oKSBpdGVtIG1ldGhvZCAq LwogCWpwaURhdGUsCQkJCQkvKiAuZGF0ZSgpIGl0ZW0gbWV0aG9kICovCkBAIC0xOTYsNiArMTk3 LDE1IEBAIHR5cGVkZWYgc3RydWN0IEpzb25QYXRoSXRlbQogCQkJaW50MzIJCXBhdHRlcm5sZW47 CiAJCQl1aW50MzIJCWZsYWdzOwogCQl9CQkJbGlrZV9yZWdleDsKKwkJc3RydWN0CisJCXsKKwkJ CWludDMyCQlkb2M7CisJCQljaGFyCSAgICp0c3F1ZXJ5OworCQkJdWludDMyCQl0c3F1ZXJ5X2xl bjsKKwkJCWludDMyCQl0c2NvbmZpZzsKKwkJCWNoYXIJICAgKnRzcXBhcnNlcjsKKwkJCXVpbnQz MgkJdHNxcGFyc2VyX2xlbjsKKwkJfQkJCXRzbWF0Y2g7CiAJfQkJCWNvbnRlbnQ7CiB9IEpzb25Q YXRoSXRlbTsKIApAQCAtMjc0LDYgKzI4NCwxNSBAQCBzdHJ1Y3QgSnNvblBhdGhQYXJzZUl0ZW0K IAkJCXVpbnQzMgkJbGVuOwogCQkJY2hhcgkgICAqdmFsOwkvKiBjb3VsZCBub3QgYmUgbm90IG51 bGwtdGVybWluYXRlZCAqLwogCQl9CQkJc3RyaW5nOworCQlzdHJ1Y3QKKwkJeworCQkJSnNvblBh dGhQYXJzZUl0ZW0gKmRvYzsKKwkJCWNoYXIJICAgKnRzcXVlcnk7CisJCQl1aW50MzIJCXRzcXVl cnlfbGVuOworCQkJSnNvblBhdGhQYXJzZUl0ZW0gKnRzY29uZmlnOworCQkJY2hhcgkgICAqdHNx cGFyc2VyOworCQkJdWludDMyCQl0c3FwYXJzZXJfbGVuOworCQl9CQkJdHNtYXRjaDsKIAl9CQkJ dmFsdWU7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25i X2pzb25wYXRoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbmJfanNvbnBhdGgu b3V0CmluZGV4IGFmYTZjNGNiNTI5Li5hYzc4YmVjYzMwNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQKQEAgLTQ4OTEsMyArNDg5MSw2MSBAQCBPUkRF UiBCWSBzMS5udW0sIHMyLm51bTsKICB7InMiOiAiQiJ9ICAgIHwgeyJzIjogIkIifSAgICB8IGZh bHNlIHwgdHJ1ZSAgfCB0cnVlICB8IHRydWUgIHwgZmFsc2UKICgxNDQgcm93cykKIAorc2VsZWN0 IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAicnVubmluZyIsICJydW5zIiwgInJhbiIsICJy dW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZseSIg dHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0t LS0tLS0KKygwIHJvd3MpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgInJ1 bm5pbmciLCAicnVucyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5nIl0nLCAnbGF4 ICRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29uZmlnICJlbmdsaXNoIiknKTsKKyBqc29uYl9w YXRoX3F1ZXJ5IAorLS0tLS0tLS0tLS0tLS0tLS0tCisgInJ1bm5pbmciCisgInJ1bnMiCisgInJ1 biIKKygzIHJvd3MpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgInJ1bm5p bmciLCAicnVucyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIsICJqb2dnaW5nIl0nLCAnbGF4ICRb Kl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29uZmlnICJzaW1wbGUiKScpOworIGpzb25iX3BhdGhf cXVlcnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAicnVuIgorKDEgcm93KQorCitzZWxlY3QganNv bmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJQb3N0Z3JlU1FMIiwgInBvc3RncmVzIiwgIlBPU1RH UkVTIiwgImRhdGFiYXNlIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJQb3N0Z3JlcyIgdHNj b25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0t LS0KKyAicG9zdGdyZXMiCisgIlBPU1RHUkVTIgorKDIgcm93cykKKworc2VsZWN0IGpzb25iX3Bh dGhfcXVlcnkoJ1tudWxsLCAxLCAiUG9zdGdyZVNRTCIsICJwb3N0Z3JlcyIsICJQT1NUR1JFUyIs ICJkYXRhYmFzZSJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiUG9zdGdyZXMiIHRzY29uZmln ICJzaW1wbGUiKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAi cG9zdGdyZXMiCisgIlBPU1RHUkVTIgorKDIgcm93cykKKworLS0gaW4gdGhlIGRlZmF1bHQgdHNx cGFyc2VyICh0b190c3F1ZXJ5KSBzcGFjZXMgYXJlIG5vdCBhbGxvd2VkLCBzbyB0aGlzIHNob3Vs ZCBmYWlsIGZvciBzeW50YXgKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbImZhc3QgY2FyIiwg InN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlvdXMiLCAic2xvdyBjYXIiXScsICdsYXgg JFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitFUlJP UjogIHN5bnRheCBlcnJvciBpbiB0c3F1ZXJ5OiAiZmFzdCBjYXIiCistLSBpZiB3ZSBzcGVjaWZ5 ICJ3IiBob3dldmVyIGl0IHNob3VsZCBiZSBvaworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1si ZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNh ciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmFzdCBjYXIiIHRzY29uZmlnICJlbmdsaXNo IiB0c3FwYXJzZXIgInciKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0t LS0KKyAiZmFzdCBjYXIiCisgInN1cGVyIGZhc3QgY2FyIgorKDIgcm93cykKKworLS0gaXQgc2hv dWxkIGFsc28gYmUgb2sgaWYgd2UgY2hhbmdlIHRvIGEgdmFsaWQgdG9fdHNxdWVyeQorc2VsZWN0 IGpzb25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIiLCAiZmFzdCBh bmQgZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmFzdCAm IGNhciIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0t LS0tLS0tLS0tLS0KKyAiZmFzdCBjYXIiCisgInN1cGVyIGZhc3QgY2FyIgorKDIgcm93cykKKwor c2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmF0IGNhdCIsICJjYXQgZmF0IiwgImZhdCByYXRz Il0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXQgJiByYXQiIHRzY29uZmlnICJlbmdsaXNo IiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0tLS0tLS0tLS0tLS0tLS0tCisgImZhdCByYXRz IgorKDEgcm93KQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pzb25w YXRoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbnBhdGgub3V0CmluZGV4IGVh OTcxZTc5ODU0Li42MDBjZjU3MmYwOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9qc29ucGF0aC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29ucGF0 aC5vdXQKQEAgLTE0ODAsMyArMTQ4MCw2MyBAQCBGUk9NIHVubmVzdChBUlJBWVsnJCA/IChAIGxp a2VfcmVnZXggInBhdHRlcm4iIGZsYWcgInNtaXhxIiknOjp0ZXh0LAogIDFhICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZiAgfCA0MjYwMSAgICAgICAgICB8IHRyYWls aW5nIGp1bmsgYWZ0ZXIgbnVtZXJpYyBsaXRlcmFsIGF0IG9yIG5lYXIgIjFhIiBvZiBqc29ucGF0 aCBpbnB1dCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgCiAoNSByb3dzKQogCistLSB0c21hdGNoIChGdWxsIFRleHQgU2VhcmNoKQor LS0gYmFzaWMgc3VjY2Vzcworc2VsZWN0ICckID8gKEAgdHNtYXRjaCAic2ltcGxlIiknOjpqc29u cGF0aDsKKyAgICAgICAganNvbnBhdGggICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgJD8oQCB0c21hdGNoICJzaW1wbGUiKQorKDEgcm93KQorCitzZWxlY3QgJyQgPyAoQCB0c21h dGNoICJydW5uaW5nIiB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNvbnBhdGg7CisgICAgICAgICAg ICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2ggInJ1bm5pbmciIHRzY29uZmln ICJlbmdsaXNoIikKKygxIHJvdykKKworLS0gdy9vdXQgdHNjb25maWcgYW5kIHRzcXBhcnNlcgor c2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUi KSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgICAganNvbnBhdGggICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgJD8oQCB0c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIpCiso MSByb3cpCisKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c2NvbmZp ZyAic2ltcGxlIiB0c3FwYXJzZXIgInciKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGpzb25wYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor ICQ/KEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmlnICJzaW1wbGUiIHRzcXBhcnNl ciAidyIpCisoMSByb3cpCisKKy0tIHRzY29uZmlnIG11c3QgYmUgc3BlY2lmaWVkIGZpcnN0IGFu ZCB0aGVuIHRzcXBhcnNlcgorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMi IHRzcXBhcnNlciAidyIgdHNjb25maWcgInNpbXBsZSIgKSc6Ompzb25wYXRoOworRVJST1I6ICBz eW50YXggZXJyb3IgYXQgb3IgbmVhciAiICIgb2YganNvbnBhdGggaW5wdXQKK0xJTkUgMTogc2Vs ZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIgdHNjb25m Li4uCisgICAgICAgICAgICAgICBeCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJmYXN0ICYgZnVy aW91cyIgdHNxcGFyc2VyICJ3IiknOjpqc29ucGF0aDsKKyAgICAgICAgICAgICAgICAgICBqc29u cGF0aCAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2ggImZhc3QgJiBmdXJpb3VzIiB0c3FwYXJzZXIg InciKQorKDEgcm93KQorCitzZWxlY3QgJyRbKl0gPyAoQC50aXRsZSB0c21hdGNoICJnb2QiICYm IEAucmF0aW5nID4gNSknOjpqc29ucGF0aDsKKyAgICAgICAgICAgICAgICAgICAgIGpzb25wYXRo ICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICRbKl0/KEAuInRpdGxlIiB0c21hdGNoICJnb2QiICYmIEAuInJh dGluZyIgPiA1KQorKDEgcm93KQorCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICRwYXR0ZXJuKSc6 Ompzb25wYXRoOworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3IgbmVhciAiJHBhdHRlcm4iIG9m IGpzb25wYXRoIGlucHV0CitMSU5FIDE6IHNlbGVjdCAnJCA/IChAIHRzbWF0Y2ggJHBhdHRlcm4p Jzo6anNvbnBhdGg7CisgICAgICAgICAgICAgICBeCistLSBvbmx5IHN0cmluZyBsaXRlcmFscyAo bm8gdmFyaWFibGVzKSBhcmUgYWxsb3dlZCBmb3IgdHNxdWVyeQorc2VsZWN0ICckID8gKEAgdHNt YXRjaCAkdmFyIHRzY29uZmlnICJlbmdsaXNoIiknOjpqc29ucGF0aDsKK0VSUk9SOiAgc3ludGF4 IGVycm9yIGF0IG9yIG5lYXIgIiR2YXIiIG9mIGpzb25wYXRoIGlucHV0CitMSU5FIDE6IHNlbGVj dCAnJCA/IChAIHRzbWF0Y2ggJHZhciB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNvbnBhdGg7Cisg ICAgICAgICAgICAgICBeCistLSBpZiBhIHRzY29uZmlnIGRvZXNuJ3QgZXhpc3QgaXQgc2hvdWxk IHBhcnNlIG5vbmV0aGVsZXNzIChleGVjdXRvciB3aWxsIGZhaWwgaXQpCitzZWxlY3QgJyQgPyAo QCB0c21hdGNoICJydW5uaW5nIiB0c2NvbmZpZyAid3Jvbmdjb25maWciKSc6Ompzb25wYXRoOwor ICAgICAgICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2gg InJ1bm5pbmciIHRzY29uZmlnICJ3cm9uZ2NvbmZpZyIpCisoMSByb3cpCisKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iX2pzb25wYXRoLnNxbCBiL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL2pzb25iX2pzb25wYXRoLnNxbAppbmRleCBkM2EzOGM1Nzc5MS4uODY5ODAyMWJhMmIg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iX2pzb25wYXRoLnNxbAorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29ucGF0aC5zcWwKQEAgLTEyNTMsMyArMTI1 MywxNiBAQCBTRUxFQ1QKIAlqc29uYl9wYXRoX3F1ZXJ5X2ZpcnN0KHMxLmosICckLnMgPiAkcycs IHZhcnMgPT4gczIuaikgZ3QKIEZST00gc3RyIHMxLCBzdHIgczIKIE9SREVSIEJZIHMxLm51bSwg czIubnVtOworCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJydW5uaW5nIiwg InJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9nZ2luZyJdJywgJ2xheCAkWypdID8g KEAgdHNtYXRjaCAiZmx5IiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0 aF9xdWVyeSgnW251bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5u ZXIiLCAiam9nZ2luZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAicnVuIiB0c2NvbmZpZyAi ZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJydW5uaW5n IiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9nZ2luZyJdJywgJ2xheCAkWypd ID8gKEAgdHNtYXRjaCAicnVuIiB0c2NvbmZpZyAic2ltcGxlIiknKTsKK3NlbGVjdCBqc29uYl9w YXRoX3F1ZXJ5KCdbbnVsbCwgMSwgIlBvc3RncmVTUUwiLCAicG9zdGdyZXMiLCAiUE9TVEdSRVMi LCAiZGF0YWJhc2UiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggIlBvc3RncmVzIiB0c2NvbmZp ZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJQb3N0 Z3JlU1FMIiwgInBvc3RncmVzIiwgIlBPU1RHUkVTIiwgImRhdGFiYXNlIl0nLCAnbGF4ICRbKl0g PyAoQCB0c21hdGNoICJQb3N0Z3JlcyIgdHNjb25maWcgInNpbXBsZSIpJyk7CistLSBpbiB0aGUg ZGVmYXVsdCB0c3FwYXJzZXIgKHRvX3RzcXVlcnkpIHNwYWNlcyBhcmUgbm90IGFsbG93ZWQsIHNv IHRoaXMgc2hvdWxkIGZhaWwgZm9yIHN5bnRheAorc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1si ZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNh ciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmFzdCBjYXIiIHRzY29uZmlnICJlbmdsaXNo IiknKTsKKy0tIGlmIHdlIHNwZWNpZnkgInciIGhvd2V2ZXIgaXQgc2hvdWxkIGJlIG9rCitzZWxl Y3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJzdXBlciBmYXN0IGNhciIsICJmYXN0 IGFuZCBmdXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXN0 IGNhciIgdHNjb25maWcgImVuZ2xpc2giIHRzcXBhcnNlciAidyIpJyk7CistLSBpdCBzaG91bGQg YWxzbyBiZSBvayBpZiB3ZSBjaGFuZ2UgdG8gYSB2YWxpZCB0b190c3F1ZXJ5CitzZWxlY3QganNv bmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJzdXBlciBmYXN0IGNhciIsICJmYXN0IGFuZCBm dXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXN0ICYgY2Fy IiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXQg Y2F0IiwgImNhdCBmYXQiLCAiZmF0IHJhdHMiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZh dCAmIHJhdCIgdHNjb25maWcgImVuZ2xpc2giKScpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvanNvbnBhdGguc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbnBhdGguc3Fs CmluZGV4IDQ0MTc4ZDhiNDVhLi5kYzQyOGZmZTU5YiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvanNvbnBhdGguc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25wYXRo LnNxbApAQCAtMzA2LDMgKzMwNiwyMiBAQCBGUk9NIHVubmVzdChBUlJBWVsnJCA/IChAIGxpa2Vf cmVnZXggInBhdHRlcm4iIGZsYWcgInNtaXhxIiknOjp0ZXh0LAogICAgICAgICAgICAgICAgICAg JzAwJywKICAgICAgICAgICAgICAgICAgICcxYSddKSBzdHIsCiAgICAgIExBVEVSQUwgcGdfaW5w dXRfZXJyb3JfaW5mbyhzdHIsICdqc29ucGF0aCcpIGFzIGVycmluZm87CisKKy0tIHRzbWF0Y2gg KEZ1bGwgVGV4dCBTZWFyY2gpCisKKy0tIGJhc2ljIHN1Y2Nlc3MKK3NlbGVjdCAnJCA/IChAIHRz bWF0Y2ggInNpbXBsZSIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJydW5u aW5nIiB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNvbnBhdGg7CistLSB3L291dCB0c2NvbmZpZyBh bmQgdHNxcGFyc2VyCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNj b25maWcgInNpbXBsZSIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJmYXN0 ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIgdHNxcGFyc2VyICJ3IiknOjpqc29ucGF0aDsK Ky0tIHRzY29uZmlnIG11c3QgYmUgc3BlY2lmaWVkIGZpcnN0IGFuZCB0aGVuIHRzcXBhcnNlcgor c2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIgdHNj b25maWcgInNpbXBsZSIgKSc6Ompzb25wYXRoOworc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFz dCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyRbKl0gPyAo QC50aXRsZSB0c21hdGNoICJnb2QiICYmIEAucmF0aW5nID4gNSknOjpqc29ucGF0aDsKK3NlbGVj dCAnJCA/IChAIHRzbWF0Y2ggJHBhdHRlcm4pJzo6anNvbnBhdGg7CisKKy0tIG9ubHkgc3RyaW5n IGxpdGVyYWxzIChubyB2YXJpYWJsZXMpIGFyZSBhbGxvd2VkIGZvciB0c3F1ZXJ5CitzZWxlY3Qg JyQgPyAoQCB0c21hdGNoICR2YXIgdHNjb25maWcgImVuZ2xpc2giKSc6Ompzb25wYXRoOworLS0g aWYgYSB0c2NvbmZpZyBkb2Vzbid0IGV4aXN0IGl0IHNob3VsZCBwYXJzZSBub25ldGhlbGVzcyAo ZXhlY3V0b3Igd2lsbCBmYWlsIGl0KQorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAicnVubmluZyIg dHNjb25maWcgIndyb25nY29uZmlnIiknOjpqc29ucGF0aDsKLS0gCjIuNTMuMAoK --000000000000628c5c064e8b5590--