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 1vzZdo-00181j-2i for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Mar 2026 12:23:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vzZdn-00FvCR-17 for pgsql-hackers@arkaria.postgresql.org; Mon, 09 Mar 2026 12:23:19 +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 1vzZdm-00FvCF-2q for pgsql-hackers@lists.postgresql.org; Mon, 09 Mar 2026 12:23:19 +0000 Received: from mail-qt1-x841.google.com ([2607:f8b0:4864:20::841]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vzZdk-00000001nJx-2OOt for pgsql-hackers@postgresql.org; Mon, 09 Mar 2026 12:23:19 +0000 Received: by mail-qt1-x841.google.com with SMTP id d75a77b69052e-509149ab7d7so11627821cf.2 for ; Mon, 09 Mar 2026 05:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dunslane-net.20230601.gappssmtp.com; s=20230601; t=1773058995; x=1773663795; darn=postgresql.org; h=in-reply-to:autocrypt:content-language:from:references:cc:to :subject:user-agent:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; bh=YWB72bumjTC+p13FpdcpXsXcJK5riE8khE47Zn6rVGE=; b=QUkHVlWRADhfvUiuHtLvifqzTE5ysl+Ht0uchkBI2jhrZThnZ30ATOgzUhiAW4vHqJ G2JALCe/uPB3vE9NTpZi3xZM6Q6ocO1DVID7OELynQI6HNvO7ut5Pu7gM3bsxpJOM7FM KESZTNl8KIckQqJEhPB81bbgbJ7KKmWlhHiq3bY6lgrY2WimU52F5iumNjT3iF3fYpNf A9C7D8b/l72R2WoRbWcwXA+vrWjOWFPxmvjjgDqahqUEz+q2DG9ozcnA8NIpS78Vzp5F Vm6cPsNx+E8J4xBy0jjaWPE0EHppZ5mYryCICNVV3XugKX5+fWR0cAHXfMbXKKvgoc5f rApg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773058995; x=1773663795; h=in-reply-to:autocrypt:content-language:from:references:cc:to :subject:user-agent:mime-version:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YWB72bumjTC+p13FpdcpXsXcJK5riE8khE47Zn6rVGE=; b=PZCQS7NS6PFcO90hrz15zpe2RYTLWpX5utCSEs+ArpJDJUNAHdNvVnbx0uvTTtJtGg rJXTzF8huUZvtlxUqv86tGLk4/phqOgelBkiLO2qyPjAF4Kx8N1iO8SniAGzfwvMcr7X ScPL88+osVjnEa/3QqvyH0nzmg6kY3vEpbhMx83Gir6K6eVEkMAFOd+maI1ETDfQcaz6 sQ2/uyUAj0S7OqfsXL09kXDIQ16/TGLRg9857n5htCMauG6GMCwJu7gp2RZ1m+l9e8Zo VsIvIYYxyY1gmVn1SPCbqPwLpByxFLhkA2DVic2lGuO1MnCKO3KgW2KrOkEQfHQ4vMDQ 4Vqg== X-Forwarded-Encrypted: i=1; AJvYcCW/GSuANMiA3s/VK8Md7BHcizWwdc93GW7emPN5qwmFr4JDLKc1pnrRR4h3mJaJTwGUInkp1tZaDDIDEq0i@postgresql.org X-Gm-Message-State: AOJu0YxNdMA908TOTQnkeLZBjwFk8G1LwBdAj0E/UGND0SruhWNDVq8H 6bl8hGQJ3Eeh6cCCye4BPzBR+dvUSG6Iq2nivesEYqLQom92dDEGNmb9pFq/IGVDxF8= X-Gm-Gg: ATEYQzzM+ViAI4WCW0RJPjTJ0JOhrQLFuEPz7wXBEADQ+bTHtSXtAYGa9AdE1HXqZc5 ULRkdx0ZHrWOs30GzDYbpao9JgtCPap6RS20V8TUY1sTxS7eLyyUfX/4B2Vxv4bMabLZM8gvKfE xTmgfybpyycGdwwdsxNyI8hlSflh1JhC/9cUi42DnlIDGe/uLLOxPO8wXFxJ25tjjhXIBQTOUsR rZaPiBuAmxZwEZYS2AmkwE+Eph/kr+EbHshOnTQmyoX1jCGp3Z2s6+veet7LnbVkvUMeVgL0MeD oaAaRgbD4Fmh8veFNMeY6dIM/QahNmxpkUVLB889GlD2zoz219ILshOHVKX20oGgG5ucMRwAtbQ zkX40BiOVFRFR2Drt+gAAGE+FMjqTMSm9xrGGxtz+n6Vzu+DEwYJiAj6VO8CyB+VoucuJmj0XA3 wLhxp619HJAuvS+My5IG6alwhzy1+9sw== X-Received: by 2002:ac8:7e8c:0:b0:501:3b93:bb37 with SMTP id d75a77b69052e-508f4943033mr142661221cf.39.1773058994652; Mon, 09 Mar 2026 05:23:14 -0700 (PDT) Received: from ?IPV6:2605:a601:a6b0:500::1cb? ([2605:a601:a6b0:500::1cb]) by smtp.googlemail.com with ESMTPSA id d75a77b69052e-509009ad4basm48112391cf.11.2026.03.09.05.23.11 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 09 Mar 2026 05:23:14 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------OUika0P6NhRwb00GD8wdZtk8" Message-ID: <5d279aa8-d9c0-4c52-b5ff-a97fd12d3f34@dunslane.net> Date: Mon, 9 Mar 2026 08:23:09 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Emitting JSON to file using COPY TO To: jian he Cc: Joe Conway , Junwang Zhao , Florents Tselai , "Andrey M. Borodin" , Dean Rasheed , Daniel Verite , Davin Shearer , PostgreSQL-development References: <74d3b4e2-d201-489d-9b9a-1a6d0eb492a6@dunslane.net> <6cbbf7f3-da4a-4201-98a6-4347a3c35db0@joeconway.com> <8154f8e2-7d9c-442f-a7cb-a5caf38f6a12@dunslane.net> <57db4b6e-51ba-4984-9343-bc62a3ee0b7c@dunslane.net> From: Andrew Dunstan Content-Language: en-US Autocrypt: addr=andrew@dunslane.net; keydata= xsBNBE7KWFkBCAClridxur2AIc7eW2AR7izbfp3EnNefie2HbLF0izW5Ik5UjX2HBXBx4syI gY6b0ugohXrr274+baoAlvSbq6cAoQuEVrk5IZFzt20b1Xkx65FwGSEj526yiKLocqkJceSq Xr9xcA5SGY+FZv441chh5SU92v4q6z+6LPpoHOh97ptAVXZYNTtU0LevyvD5lja0TzbvJm6C eFXitJfnm1pLEr0DGJCR/iUOl/N62Kh4855zZC7NHIjQHPOvV5Stz/l5ilDhvGVk+xkXFPys SjZoUr1rXhYLpiyi5sR0X9FHXT0KnGuz1F5ERO7ZTLSSQ6fJwPj6gOk9K+vvoKvoeql5ABEB AAHNJEFuZHJldyBEdW5zdGFuIDxhbmRyZXdAZHVuc2xhbmUubmV0PsLAlwQTAQgAQQIbAwIX gAIZAQULCQgHAwUVCgkICwUWAgMBAAIeBRYhBOQ+WEYd/Hy/RGkVpZn6f8tZ/DuBBQJoGNGd BQkdEO8nAAoJEJn6f8tZ/DuBq74H/jkTR4Zi3stbw+xC7v2u3QozssK7MYPL2AsVfh7OealS h182fiWXpfvmmAB7WUHbhk9GC2RAOnHI/2d2jgKaMLAHsGYOT0YopTVIwRY43fCw/mK67yxc wmDcX+zyKfLaivNbf5A7QPLNwda98bEAMSJ8Sn652Uc6cA8t3uKGsVzbRBQOoYzjgvBCfSrE 9ql3PDNg0l4BfAqabd2f70ZUm9VAMEPrgv/v2xI7M2XiL4g5BVmqLCOwxLM8RMCotCuoweUr VO43DeBCIDwLxotMJKvGWDjBzQYlU1NPUAtNcz/gN9ITUe1VUGjyvGj4u1lxBOcQQUw7l1+T 5moZ4iZxXzvOwE0ETspYWQEIANGc4zQULOxhbqO2dyD51YhqCNRmm9oKWaqf+wmW4tpDe/VV cxAnNizd4LWCHfzpb5cHAtGkOPePMfzWVf6nvdF7d3eglbtf59+zG7O7llV0xSSoFiieQBsr GvqDInXYX/4mRRXMtyhM353/tixC9RWLs1oofyYmCPPXXY7h9R7en3B8BoVrRFcdzlIY/NFN hFGW/9dkEiGjgna2Rk6e15kln4ZvFBWUg23p93w/pqXcxY6+k/8TEk+C4R+M6w7o2PLGOjdZ +kPiUcw5H85zf/yZJwQXzisXaNduwWB6Vads9YC9dj6kPR1c4VGRqAaYL++LAEOqrlvm2Tvq QqZRtnEAEQEAAcLAfAQYAQgAJgIbDBYhBOQ+WEYd/Hy/RGkVpZn6f8tZ/DuBBQJoGNI2BQkd EODdAAoJEJn6f8tZ/DuBfw0IAKTsfD40teP/pp+bsLLMSxPXUYrrprTj7WFB5v61p6dkpSr/ qXmMlyahdxQFaPmfVgVirB1Vk/kHiWNnnGjfUV9nB2Zg9LI0Xb9/ts3LsUiRWXzG3tkMY6XL vsVOxW4XFRND9l2q+WW93aZ1DZl+fqWfYgMvsusFRhmGFOKTRfKPta2Pkv+AhA24N4+PrR5p bU4k2MO8PAGiK8eaYKGFG1bHKuAvoDoF7WXJ3FHxuWqLnKEt4dfOLm5pAe3zq1Lt6q8azT9i QWGpSAK5vQUWQHBHpiDjdPeqKZ6HiAXIIKfSmb+jrvXBqoP+D6/K7rUjG2aXiRtTIAXms9sm VRu7cmw= In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------OUika0P6NhRwb00GD8wdZtk8 Content-Type: multipart/alternative; boundary="------------LrxeCVnU4NTiNJggb5uyTiS3" --------------LrxeCVnU4NTiNJggb5uyTiS3 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 2026-03-08 Su 11:48 PM, jian he wrote: > On Mon, Mar 9, 2026 at 3:44 AM Andrew Dunstan wrote: >> Hmm. But should we be scribbling on slot->tts_tupleDescriptor like that? >> How about something like this?: >> >> - * Full table or query without column list. Ensure the slot uses >> - * cstate->tupDesc so that the datum is stamped with the right type; >> - * for queries output type is RECORDOID this must be the blessed >> - * descriptor so that composite_to_json can look it up via >> - * lookup_rowtype_tupdesc. >> + * Full table or query without column list. For queries, the slot's >> + * TupleDesc may carry RECORDOID, which is not registered in the >> type >> + * cache and would cause composite_to_json's lookup_rowtype_tupdesc >> + * call to fail. Build a HeapTuple stamped with the blessed >> + * descriptor so the type can be looked up correctly. >> */ >> if (!cstate->rel && slot->tts_tupleDescriptor->tdtypeid == >> RECORDOID) >> - slot->tts_tupleDescriptor = cstate->queryDesc->tupDesc; >> + { >> + HeapTuple tup; >> >> - rowdata = ExecFetchSlotHeapTupleDatum(slot); >> + tup = heap_form_tuple(cstate->tupDesc, >> + slot->tts_values, >> + slot->tts_isnull); >> + rowdata = HeapTupleGetDatum(tup); >> + } >> + else >> + { >> + rowdata = ExecFetchSlotHeapTupleDatum(slot); >> + } >> > This is better. I've tried to get rid of json_projvalues and json_projnulls. > Just using heap_form_tuple, but it won't work. > > I incorporated the v28-0004 COPY column list into v9-0002. > With this patch set, we added four fields to the struct CopyToStateData. > > + StringInfo json_buf; /* reusable buffer for JSON output, > + * initialized in BeginCopyTo */ > + TupleDesc tupDesc; /* Descriptor for JSON output; for a column > + * list this is a projected descriptor */ > + Datum *json_projvalues; /* pre-allocated projection values, or > + * NULL */ > + bool *json_projnulls; /* pre-allocated projection nulls, or NULL */ > > Using the script in > https://www.postgresql.org/message-id/CACJufxFFZqxC3p4WjpTEi4riaJm%3DpADX%2Bpy0yQ0%3DRWTn5cqK3Q%40mail.gmail.com > I tested it again on macOS and Linux, and there are no regressions for > COPY TO with the TEXT and CSV formats. > OK, I think we're really close now. Here is a tiny fixup patch that fixes an error message and a comment, and adds a missing test case. cheers andrew -- Andrew Dunstan EDB:https://www.enterprisedb.com --------------LrxeCVnU4NTiNJggb5uyTiS3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit


On 2026-03-08 Su 11:48 PM, jian he wrote:
On Mon, Mar 9, 2026 at 3:44 AM Andrew Dunstan <andrew@dunslane.net> wrote:
Hmm. But should we be scribbling on slot->tts_tupleDescriptor like that?
How about something like this?:

-        * Full table or query without column list.  Ensure the slot uses
-        * cstate->tupDesc so that the datum is stamped with the right type;
-        * for queries output type is RECORDOID this must be the blessed
-        * descriptor so that composite_to_json can look it up via
-        * lookup_rowtype_tupdesc.
+        * Full table or query without column list.  For queries, the slot's
+        * TupleDesc may carry RECORDOID, which is not registered in the
type
+        * cache and would cause composite_to_json's lookup_rowtype_tupdesc
+        * call to fail.  Build a HeapTuple stamped with the blessed
+        * descriptor so the type can be looked up correctly.
          */
         if (!cstate->rel && slot->tts_tupleDescriptor->tdtypeid ==
RECORDOID)
-           slot->tts_tupleDescriptor = cstate->queryDesc->tupDesc;
+       {
+           HeapTuple   tup;

-       rowdata = ExecFetchSlotHeapTupleDatum(slot);
+           tup = heap_form_tuple(cstate->tupDesc,
+                                 slot->tts_values,
+                                 slot->tts_isnull);
+           rowdata = HeapTupleGetDatum(tup);
+       }
+       else
+       {
+           rowdata = ExecFetchSlotHeapTupleDatum(slot);
+       }

This is better. I've tried to get rid of json_projvalues and json_projnulls.
Just using heap_form_tuple, but it won't work.

I incorporated the v28-0004 COPY column list into v9-0002.
With this patch set, we added four fields to the struct CopyToStateData.

+    StringInfo    json_buf;        /* reusable buffer for JSON output,
+                                 * initialized in BeginCopyTo */
+    TupleDesc    tupDesc;        /* Descriptor for JSON output; for a column
+                                 * list this is a projected descriptor */
+    Datum       *json_projvalues;    /* pre-allocated projection values, or
+                                     * NULL */
+    bool       *json_projnulls; /* pre-allocated projection nulls, or NULL */

Using the script in
https://www.postgresql.org/message-id/CACJufxFFZqxC3p4WjpTEi4riaJm%3DpADX%2Bpy0yQ0%3DRWTn5cqK3Q%40mail.gmail.com
I tested it again on macOS and Linux, and there are no regressions for
COPY TO with the TEXT and CSV formats.


OK, I think we're really close now. Here is a tiny fixup patch that fixes an error message and a comment, and adds a missing test case.


cheers


andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com
--------------LrxeCVnU4NTiNJggb5uyTiS3-- --------------OUika0P6NhRwb00GD8wdZtk8 Content-Type: text/plain; charset=UTF-8; name="copy-json-fixes.patch.nocfbot" Content-Disposition: attachment; filename="copy-json-fixes.patch.nocfbot" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHkuYwppbmRleCA4NDI1NGQ0NmE2Ny4uYzExYzJlYjQ4ZmEgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYworKysgYi9zcmMvYmFja2VuZC9j b21tYW5kcy9jb3B5LmMKQEAgLTk3Miw4ICs5NzIsOCBAQCBQcm9jZXNzQ29weU9wdGlvbnMo UGFyc2VTdGF0ZSAqcHN0YXRlLAogCS8qIENoZWNrIGpzb24gZm9ybWF0ICovCiAJaWYgKG9w dHNfb3V0LT5mb3JtYXQgPT0gQ09QWV9GT1JNQVRfSlNPTiAmJiBpc19mcm9tKQogCQllcmVw b3J0KEVSUk9SLAotCQkJCWVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxV RSksCi0JCQkJZXJybXNnKCJDT1BZICVzIG1vZGUgY2Fubm90IGJlIHVzZWQgd2l0aCAlcyIs ICJKU09OIiwgIkNPUFkgRlJPTSIpKTsKKwkJCQllcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKKwkJCQllcnJtc2coIkNPUFkgJXMgaXMgbm90IHN1cHBvcnRlZCBm b3IgJXMiLCAiRk9STUFUIEpTT04iLCAiQ09QWSBGUk9NIikpOwogCiAJaWYgKG9wdHNfb3V0 LT5mb3JtYXQgIT0gQ09QWV9GT1JNQVRfSlNPTiAmJiBvcHRzX291dC0+Zm9yY2VfYXJyYXkp CiAJCWVyZXBvcnQoRVJST1IsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9j b3B5dG8uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCmluZGV4IDg1Y2E3Yzk0 N2YzLi5kZTI4MGFkODYxMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29w eXRvLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKQEAgLTEwNjEsOCAr MTA2MSw4IEBAIEJlZ2luQ29weVRvKFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCWNzdGF0ZS0+ dHVwRGVzYyA9IEJsZXNzVHVwbGVEZXNjKHJlc3VsdERlc2MpOwogCiAJCQkvKgotCQkJICog KiBQcmUtYWxsb2NhdGUgYXJyYXlzIGZvciBwcm9qZWN0aW5nIHNlbGVjdGVkIGNvbHVtbiB2 YWx1ZXMKLQkJCSAqIGludG8gIHNlcXVlbnRpYWwgcG9zaXRpb25zIG1hdGNoaW5nIHRoZSBj dXN0b20gVHVwbGVEZXNjLgorCQkJICogUHJlLWFsbG9jYXRlIGFycmF5cyBmb3IgcHJvamVj dGluZyBzZWxlY3RlZCBjb2x1bW4gdmFsdWVzIGludG8KKwkJCSAqIHNlcXVlbnRpYWwgcG9z aXRpb25zIG1hdGNoaW5nIHRoZSBjdXN0b20gVHVwbGVEZXNjLgogCQkJICovCiAJCQljc3Rh dGUtPmpzb25fcHJvanZhbHVlcyA9IHBhbGxvY19hcnJheShEYXR1bSwgbmF0dHMpOwogCQkJ Y3N0YXRlLT5qc29uX3Byb2pudWxscyA9IHBhbGxvY19hcnJheShib29sLCBuYXR0cyk7CmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvcHkub3V0IGIvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dAppbmRleCBiY2Y0NTg0NWI2MS4uM2U1NjZi OTYxODMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29weS5vdXQK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dApAQCAtMTM2LDcgKzEz Niw3IEBAIExJTkUgMTogY29weSBjb3B5dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29uLCBv bl9lcnJvciBpZ25vcmUpOwogY29weSBjb3B5dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29u LCByZWplY3RfbGltaXQgMSk7CiBFUlJPUjogIENPUFkgUkVKRUNUX0xJTUlUIHJlcXVpcmVz IE9OX0VSUk9SIHRvIGJlIHNldCB0byBJR05PUkUKIGNvcHkgY29weXRlc3QgZnJvbSBzdGRp bihmb3JtYXQganNvbik7Ci1FUlJPUjogIENPUFkgSlNPTiBtb2RlIGNhbm5vdCBiZSB1c2Vk IHdpdGggQ09QWSBGUk9NCitFUlJPUjogIENPUFkgRk9STUFUIEpTT04gaXMgbm90IHN1cHBv cnRlZCBmb3IgQ09QWSBGUk9NCiAtLSBhbGwgb2YgdGhlIGFib3ZlIHNob3VsZCB5aWVsZCBl cnJvcgogLS0gY29sdW1uIGxpc3Qgd2l0aCBqc29uIGZvcm1hdAogY29weSBjb3B5dGVzdCAo c3R5bGUsIHRlc3QsIGZpbGxlcikgdG8gc3Rkb3V0IChmb3JtYXQganNvbik7CkBAIC0xNjcs NiArMTY3LDEwIEBAIGNvcHkgY29weXRlc3QgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9y Y2VfYXJyYXkgZmFsc2UpOwogeyJzdHlsZSI6IlVuaXgiLCJ0ZXN0IjoiYWJjXG5kZWYiLCJm aWxsZXIiOjJ9CiB7InN0eWxlIjoiTWFjIiwidGVzdCI6ImFiY1xyZGVmIiwiZmlsbGVyIjoz fQogeyJzdHlsZSI6ImVzY1xcYXBlIiwidGVzdCI6ImFcXHJcXFxyXFxcblxcbmIiLCJmaWxs ZXIiOjR9CistLSBlbXB0eSByZXN1bHQgc2V0IHdpdGggZm9yY2VfYXJyYXkKK2NvcHkgKHNl bGVjdCAxIHdoZXJlIGZhbHNlKSB0byBzdGRvdXQgKGZvcm1hdCBqc29uLCBmb3JjZV9hcnJh eSB0cnVlKTsKK1sKK10KIC0tIGNvbHVtbiBsaXN0IHdpdGggZGl2ZXJzZSBkYXRhIHR5cGVz CiBjcmVhdGUgdGVtcCB0YWJsZSBjb3B5anNvbnRlc3RfdHlwZXMgKAogICAgIGlkIGludCwK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvY29weS5zcWwKaW5kZXggYmMxMmFjODc5ZWYuLjUyMDkzNDI3MWVjIDEw MDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb3B5LnNxbAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL3NxbC9jb3B5LnNxbApAQCAtMTE5LDYgKzExOSw5IEBAIGNvcHkgY29weXRl c3QgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkpOwogY29weSBjb3B5dGVz dChzdHlsZSwgdGVzdCkgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkgdHJ1 ZSk7CiBjb3B5IGNvcHl0ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpzb24sIGZvcmNlX2FycmF5 IGZhbHNlKTsKIAorLS0gZW1wdHkgcmVzdWx0IHNldCB3aXRoIGZvcmNlX2FycmF5Citjb3B5 IChzZWxlY3QgMSB3aGVyZSBmYWxzZSkgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9yY2Vf YXJyYXkgdHJ1ZSk7CisKIC0tIGNvbHVtbiBsaXN0IHdpdGggZGl2ZXJzZSBkYXRhIHR5cGVz CiBjcmVhdGUgdGVtcCB0YWJsZSBjb3B5anNvbnRlc3RfdHlwZXMgKAogICAgIGlkIGludCwK --------------OUika0P6NhRwb00GD8wdZtk8--