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 1vvFMv-00AIHs-09 for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Feb 2026 13:56:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvFMt-006V4G-2l for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Feb 2026 13:55:59 +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 1vvFMt-006V41-1Z for pgsql-hackers@lists.postgresql.org; Wed, 25 Feb 2026 13:55:59 +0000 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvFMq-00000001EAI-1N0s for pgsql-hackers@lists.postgresql.org; Wed, 25 Feb 2026 13:55:59 +0000 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-b8f97c626aaso975946066b.2 for ; Wed, 25 Feb 2026 05:55:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772027756; cv=none; d=google.com; s=arc-20240605; b=FOHFCUn4Vz9tXJhw7ofBEQFPt2vGukrAN8aD80GRKSu1mPdqd+M3WRq02bEm9BfqYq Ji/tfrIJatGSPqKFvMXoFiz7SVTfkNzEUJh0kQxmWk0Vr6xn0Q0metxCJRwSYnd3vIUx l9bsC2fMJvpbsXisvvj1ZMVJ9RkE4LISJtVgan0FJMM8fWF4RrLTmrCajpeZ0f2gx5q9 jlIFqt0t9zI5+osHQrw8paDZteS+4Sfvyom4Lb9ILGcHxv9JTy19ajvp1sgwyUmBtKGb osH2Tta4iPhUqVbIcsYoIT8YKjZMsXYIipBNc+ozAs0fWJgdU2E6HQiaoKWpqltS3EED pMfw== 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=6ujrmqLz9nbDRYpHMB23MkXzjuywqgSg7o91qcngCEU=; fh=3l9l1sSX6WsrP7X4GhWETUotSPaGCrW5N3thaTJVc9Q=; b=lbUN/A0gJ+gSKX5dAj99hZA8XPm5oyG25kTZ5fMiPLbBpb/tUfnZdBD18WVMgZH4F2 wohKu8mC1ofxihqjnpv8HkMfejP410Of3u5DgrK2QeoY/ugVkjj2JJrVmMC5vtjYWlEO os9u2M1jeyjuRUnHB4kmZjfxKEpAIvU62uKCDvgr29pGc4Xbdyps7KN4+TPlLqjunW4z fqb8T2TpHiph+p9A7T1PE1fyHtSiaxZtRc3hDEifeqT5sgJ/sSWcVY9bm22leQaJTarn fF9AKkbA4zc1ef0ayRRgJ7Nqpi63sEm4tau1QbWfFhV/RXykTVU/andAStUkZfPH5xrS JWow==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772027756; x=1772632556; 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=6ujrmqLz9nbDRYpHMB23MkXzjuywqgSg7o91qcngCEU=; b=kdEjDQIOChQoRXdSApagNSarxd8EJCaNtEz2OBwaxaHx5K2q4W5N9n6LxzsZrk1UjL 7RAuNE5uu+WPtMc+BQ8jmsTU7AFT2qbXQlG7XUfuPzmkHe4cIygRaQgCdhoYk039jb8g BcZwR8PBQ25DUAN7n2/vKIVZpnBi8bgnbnaxIKHnbZkflzThTnLmxkXxUdaLVRigfKTD YP6fI0sLu6CsoRgmT3WsDRd7CuFtzJ1/DH9UIDUCbmsXDMhz53J373uEwbrBS+Vy7oNT z7dvRpVJzwoMbOAL/fRPP6ucCRyD5Wp3xYOE52cqKqEkyA6JDGtO+jciM/x7sp8XAZiB YVjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772027756; x=1772632556; 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=6ujrmqLz9nbDRYpHMB23MkXzjuywqgSg7o91qcngCEU=; b=JBkIt4JrpyGdRKOw9/g7uWtFv8DctKg6qPCKOPTs+hrvFglyrA1FacLXrqVBEj3W/7 MDgKLEyKi6Jq5bSyc9PU5A4b2GHpn75AYBEefFKDf6sad+iujT0zgTGrwvyoLe8hAoFA bSSS3dhtLugZTstsI/zp+g14hcypugB1AIN55ipQnQ2tTvvOb7gZOpFXTrFyugLir76z FVu8X9TmCHKVwUyD7ORHGFUnfiG935qgcKM9iYZGilmy5gWHR1kyM1WDOd2tRUIRaHd2 tp8lqFAwqbH2cQUar9fAsHYdCs48nWbjxGQH3UwusMJhF7Mx3fHh5h9cOWisiJ8s46n1 D2Mg== X-Forwarded-Encrypted: i=1; AJvYcCUNrkJY1bc0AvqCfZqMyrZa4qlUzrXUgnQ5jzi/dRR4rNMW7tgwK0CmNOEf+oKl4YjkuVHJq+aazBsjXE9e@lists.postgresql.org X-Gm-Message-State: AOJu0YwcD99v9f3eAFOptPVSeB9LtmfugN3uRerLMg835k67HoMIVqLt tI+jqyGOF3lf8HeSjZqBBtM7e59KkBYwwTZ3Rr/trJDJt02OJ2Nu6y0ybZIgVTGE9j/Y+H82Fn0 pz300cVdBBkCHRk0dKO2gsklXEefygW4= X-Gm-Gg: ATEYQzwCPqjhGFjgCRP84+Qr7VoIHIz4s3Ioj2jqIK8tQJrb6U07Ugkho0p08HkmOfm 2p0O7JwYkEmtK83YEY8e6vXloMks2kTsjKqwzpbnlrzmq/WkPpeJPVLH3F0FZmnhw7iqAq7dKqT Ir+q6X4CgSyWqrD/xSmtMuWXBve8qwUdzPZMKlsNxvXKpNQBMZTpVsanVEjHGKjLXvh10d4Hp2k cbtsao5Gak518ex4wK4vzgPyt/JO1WuDSSGek4CxTalJwXJlfYZFmiIDip3dxmcEYSvXUcvxvNT B+U40vb+OHnvFqacbCAHBE8jbXsBDHJQcwUAtLsS6sK1FvWQIfzlNSkkyB5YNtnPCA+r/csBAgw byATzKWRHSsQkdBELJlc4iPjgzA== X-Received: by 2002:a17:907:e158:b0:b80:117d:46e5 with SMTP id a640c23a62f3a-b9081b40d93mr697230066b.29.1772027755647; Wed, 25 Feb 2026 05:55:55 -0800 (PST) MIME-Version: 1.0 References: <202602241757.6ac3iss2u4vo@alvherre.pgsql> <9116.1772009759@localhost> In-Reply-To: <9116.1772009759@localhost> From: Srinath Reddy Sadipiralla Date: Wed, 25 Feb 2026 19:25:42 +0530 X-Gm-Features: AaiRm50j5u5B3S84EzcX94TlLbzgEiwnxvTx_9J2oOLOJvh-cD7SyseIoVylWEE Message-ID: Subject: Re: Adding REPACK [concurrently] To: =?UTF-8?Q?=C3=81lvaro_Herrera?= Cc: Mihail Nikalayeu , Pg Hackers , Robert Treat Content-Type: multipart/mixed; boundary="000000000000e8ba98064ba65cbb" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e8ba98064ba65cbb Content-Type: multipart/alternative; boundary="000000000000e8ba97064ba65cb9" --000000000000e8ba97064ba65cb9 Content-Type: text/plain; charset="UTF-8" Hello, I did stress testing on v35 patches, where I did concurrency test using pgbench with 50 concurrent clients, 4 threads with the below pgbench script (dual_chaos.sql) on the following table setup(setup.sql). I ran pgbench with 5M rows for 10 minutes and 50M for ~45 minutes multiple times. REPACK (concurrently) ran successfully except "once"(see below). I created a shadow/clone table to use for checking the correctness after doing the concurrency test.I used 4 checks to verify that data is intact and REPACK (concurrently) ran successfully. 1) table file OID(relfilenode) swapped? 2) bloat gone? victim relation size should be less than shadow relation size. 3) using FULL JOIN logic (borrowed from repack.spec, with small change) against the shadow table which goes under the same concurrent ops done on the victim table , basically doing dual writes (see dual_chaos.sql) to verify table data integrity. 4) Physical Index Integrity (amcheck) (borrowed from Mihail's tests) The concurrency test failed once. I tried to reproduce the below scenario but no luck,i think the reason the assert failure happened because after speculative insert there might be no spec CONFIRM or ABORT, thoughts? TRAP: failed Assert("!specinsert"), File: "reorderbuffer.c", Line: 2610, PID: 3956168 postgres: REPACK decoding worker for relation "stress_victim" (ExceptionalCondition+0x98)[0xaaaab1251188] postgres: REPACK decoding worker for relation "stress_victim" (+0x67b1cc)[0xaaaab0f4b1cc] postgres: REPACK decoding worker for relation "stress_victim" (+0x67b86c)[0xaaaab0f4b86c] postgres: REPACK decoding worker for relation "stress_victim" (ReorderBufferCommit+0x74)[0xaaaab0f4b8f0] postgres: REPACK decoding worker for relation "stress_victim" (+0x66229c)[0xaaaab0f3229c] postgres: REPACK decoding worker for relation "stress_victim" (xact_decode+0x1a0)[0xaaaab0f312bc] postgres: REPACK decoding worker for relation "stress_victim" (LogicalDecodingProcessRecord+0xd4)[0xaaaab0f30e60] postgres: REPACK decoding worker for relation "stress_victim" (+0x3372e4)[0xaaaab0c072e4] postgres: REPACK decoding worker for relation "stress_victim" (+0x339634)[0xaaaab0c09634] postgres: REPACK decoding worker for relation "stress_victim" (RepackWorkerMain+0x1ac)[0xaaaab0c094e8] postgres: REPACK decoding worker for relation "stress_victim" (BackgroundWorkerMain+0x2b0)[0xaaaab0efc440] postgres: REPACK decoding worker for relation "stress_victim" (postmaster_child_launch+0x1f0)[0xaaaab0f00398] postgres: REPACK decoding worker for relation "stress_victim" (+0x639ca4)[0xaaaab0f09ca4] postgres: REPACK decoding worker for relation "stress_victim" (+0x639f94)[0xaaaab0f09f94] postgres: REPACK decoding worker for relation "stress_victim" (+0x638714)[0xaaaab0f08714] postgres: REPACK decoding worker for relation "stress_victim" (+0x635978)[0xaaaab0f05978] postgres: REPACK decoding worker for relation "stress_victim" (PostmasterMain+0x160c)[0xaaaab0f050c8] postgres: REPACK decoding worker for relation "stress_victim" (main+0x3dc)[0xaaaab0d974d4] /lib/aarch64-linux-gnu/libc.so.6(+0x284c4)[0xffff867584c4] /lib/aarch64-linux-gnu/libc.so.6(__libc_start_main+0x98)[0xffff86758598] postgres: REPACK decoding worker for relation "stress_victim" (_start+0x30)[0xaaaab09bc1f0] 2026-02-19 18:20:56.088 IST [3905812] LOG: checkpoint starting: wal 2026-02-19 18:21:10.683 IST [3905808] LOG: background worker "REPACK decoding worker" (PID 3956168) was terminated by signal 6: Aborted Crash Test: i did crash test using debugger using a breakpoint inside apply_concurrent_changes to simulate a crash while concurrent changes are being done, after few concurrent changes are done , i crashed the server using "pg_ctl -m immediate stop", then restarted the server, i observed that REPACK (concurrently) didn't completed (expected), files were not swapped and data on the victim table is intact checked using FULL JOIN with shadow table, but there are some leftovers of the transient table we used for REPACK (concurrently) such as 1) transient table's relation files - these consume extra space , i think this was the case with VACUUM FULL previously, so these has to be removed manually , but I think this time we have a "leverage" which we can use to remove the extra space. 2) transient table's WALs - these are generated because of concurrent changes done while applying the logical decoded changes on the new transient table, i think this won't be a problem until they only will get recycled but if they get archived , they are of no use instead they consume more space and time during the archival process. "Leverage" Idea: i think we can re-use these transient table's relation files and WALs during crash recovery, so that user don't have to re-run the REPACK (concurrently) after server has recovered, for this we might need to write a WAL for REPACK (concurrently) to let startup process know REPACK (concurrently) occurred which sets a flag, so at the end of startup process all the WALs of the transient table are already applied so transient table perfect now , at the end we can do swapping (finish_heap_swap) after checking the flag , these are all my initial thoughts on this idea to reuse the "residue" files of the transient table. I could be totally wrong :) Please correct me if I am. i think we need to update this statement in repack.sgml regarding wal_level The wal_level configuration parameter is less than logical. because of this commit POC: enable logical decoding when wal_level = 'replica' without a server restart (67c2097) -- Thanks, Srinath Reddy Sadipiralla EDB: https://www.enterprisedb.com/ --000000000000e8ba97064ba65cb9 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,

I did stress testing on v35= patches, where I did concurrency test using
pgbench with 50 concurrent = clients, 4 threads with the below pgbench
script (dual_chaos.sql) on the= following table setup(setup.sql).
I ran pgbench with 5M rows for 10 min= utes and 50M for ~45 minutes
multiple times. REPACK (concurrently) ran s= uccessfully except "once"(see below).
I created a shadow/clone= table to use for checking the correctness after doing
the concurrency test.I used 4 checks to verify that data is intact andREPACK (concurrently) ran successfully.

1) table file OID(relfileno= de) swapped?
2) bloat gone? victim relation size should be less than
= shadow relation size.
3) using FULL JOIN logic (borrowed from repack.spe= c, with small change)
against the shadow table which = goes under the same concurrent ops
done on the victim table , basically = doing dual writes (see dual_chaos.sql) to
verify table data integrity.4)=C2=A0Physical Index Integrity (amcheck) (borrowed from Mihail's te= sts)

The concurrency test failed once. I tried to reproduce the belo= w scenario
but no luck,i think the reason the assert failure happened be= cause
after speculative insert there might be no spec CONFIRM or ABORT, = thoughts?

TRAP: failed Assert("!specinsert"), File: "= reorderbuffer.c", Line: 2610, PID: 3956168
postgres: REPACK decodin= g worker for relation "stress_victim" (ExceptionalCondition+0x98)= [0xaaaab1251188]
postgres: REPACK decoding worker for relation "str= ess_victim" (+0x67b1cc)[0xaaaab0f4b1cc]
postgres: REPACK decoding w= orker for relation "stress_victim" (+0x67b86c)[0xaaaab0f4b86c]postgres: REPACK decoding worker for relation "stress_victim" (R= eorderBufferCommit+0x74)[0xaaaab0f4b8f0]
postgres: REPACK decoding worke= r for relation "stress_victim" (+0x66229c)[0xaaaab0f3229c]
pos= tgres: REPACK decoding worker for relation "stress_victim" (xact_= decode+0x1a0)[0xaaaab0f312bc]
postgres: REPACK decoding worker for relat= ion "stress_victim" (LogicalDecodingProcessRecord+0xd4)[0xaaaab0f= 30e60]
postgres: REPACK decoding worker for relation "stress_victim= " (+0x3372e4)[0xaaaab0c072e4]
postgres: REPACK decoding worker for = relation "stress_victim" (+0x339634)[0xaaaab0c09634]
postgres:= REPACK decoding worker for relation "stress_victim" (RepackWorke= rMain+0x1ac)[0xaaaab0c094e8]
postgres: REPACK decoding worker for relati= on "stress_victim" (BackgroundWorkerMain+0x2b0)[0xaaaab0efc440]postgres: REPACK decoding worker for relation "stress_victim" (= postmaster_child_launch+0x1f0)[0xaaaab0f00398]
postgres: REPACK decoding= worker for relation "stress_victim" (+0x639ca4)[0xaaaab0f09ca4]<= br>postgres: REPACK decoding worker for relation "stress_victim" = (+0x639f94)[0xaaaab0f09f94]
postgres: REPACK decoding worker for relatio= n "stress_victim" (+0x638714)[0xaaaab0f08714]
postgres: REPACK= decoding worker for relation "stress_victim" (+0x635978)[0xaaaab= 0f05978]
postgres: REPACK decoding worker for relation "stress_vict= im" (PostmasterMain+0x160c)[0xaaaab0f050c8]
postgres: REPACK decodi= ng worker for relation "stress_victim" (main+0x3dc)[0xaaaab0d974d= 4]
/lib/aarch64-linux-gnu/libc.so.6(+0x284c4)[0xffff867584c4]
/lib/aa= rch64-linux-gnu/libc.so.6(__libc_start_main+0x98)[0xffff86758598]
postgr= es: REPACK decoding worker for relation "stress_victim" (_start+0= x30)[0xaaaab09bc1f0]
2026-02-19 18:20:56.088 IST [3905812] LOG: =C2=A0ch= eckpoint starting: wal
2026-02-19 18:21:10.683 IST [3905808] LOG: =C2=A0= background worker "REPACK decoding worker" (PID 3956168) was term= inated by signal 6: Aborted


Crash Test:
i did cras= h test using debugger using a breakpoint inside=C2=A0apply_concurrent_chang= es
to simulate a crash while concurrent changes are being done, after fe= w concurrent changes
are done , i crashed the server using "pg_ctl = -m immediate stop", then restarted the server,
i observed that REPA= CK (concurrently) didn't completed (expected), files were not swapped a= nd data
on the victim table is intact checked using FULL JOIN with shado= w table, but there are
some leftovers of the transient table we used for= REPACK (concurrently) such as
1) transient table's=C2=A0relation fi= les - these consume extra space , i think this was the
case with VACUUM = FULL previously, so these has to be removed manually , but
I thin= k this time we have a "leverage" which we can use to remove the e= xtra space.
2) transient table's=C2=A0WALs - these are generated bec= ause of concurrent changes done while
applying the logical decoded chang= es on the new transient table, i think this won't be a problem
until= they only will get recycled but if they get archived , they are of no use = instead they
consume more space and time during the archival process.
"Leverage" Idea:
i think we can re-use these transient ta= ble's=C2=A0relation files and WALs during crash recovery,
so that us= er don't have to re-run the REPACK (concurrently) after server has reco= vered,
for this we might need to write a WAL for REPACK (concurrently) t= o let startup process
know REPACK (concurrently) occurred which sets a f= lag, so at the end of startup process
all the WALs of the=C2=A0transient= table are already applied so transient table perfect now ,
at the end w= e can do swapping (finish_heap_swap) after checking the flag , these areall my initial thoughts on this idea to reuse the "residue" file= s of the transient table.
I could be totally wrong :) Please correct me = if I am.

i think we need to update this statement in repack.sgml reg= arding wal_level
=C2=A0 =C2=A0 =C2=A0 =C2=A0<listitem>
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 <para>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 The= <link linkend=3D"guc-wal-level"><varname>wal_level&l= t;/varname></link>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 configura= tion parameter is less than <literal>logical</literal>.
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 </para>
=C2=A0 =C2=A0 =C2=A0 =C2=A0</l= istitem>
because of this commit POC: enable logical decoding when wal= _level =3D 'replica' without a server restart (67c2097)



--
Thanks,
Srinath Reddy Sadipiralla
= EDB:=C2=A0https://www.enterprisedb.com/
--000000000000e8ba97064ba65cb9-- --000000000000e8ba98064ba65cbb Content-Type: application/octet-stream; name="setup.sql" Content-Disposition: attachment; filename="setup.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm23hlv50 Q1JFQVRFIFRBQkxFIHN0cmVzc192aWN0aW0gKAogICAgaWQgU0VSSUFMIFBSSU1BUlkgS0VZLAog ICAgYmFsYW5jZSBJTlQsCiAgICBwYXlsb2FkIFRFWFQKKTsKCkNSRUFURSBUQUJMRSBzdHJlc3Nf c2hhZG93ICgKICAgIGlkIFNFUklBTCBQUklNQVJZIEtFWSwKICAgIGJhbGFuY2UgSU5ULAogICAg cGF5bG9hZCBURVhUCik7CgpJTlNFUlQgSU5UTyBzdHJlc3NfdmljdGltIChiYWxhbmNlLCBwYXls b2FkKQpTRUxFQ1QKICAgIChyYW5kb20oKSoxMDAwKTo6aW50LAogICAgcmVwZWF0KG1kNShyYW5k b20oKTo6dGV4dCksIDYpCkZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMDAwMDApOwoKSU5TRVJU IElOVE8gc3RyZXNzX3NoYWRvdyBTRUxFQ1QgKiBGUk9NIHN0cmVzc192aWN0aW07 --000000000000e8ba98064ba65cbb Content-Type: application/octet-stream; name="dual_chaos.sql" Content-Disposition: attachment; filename="dual_chaos.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm23hpns1 XHNldCBpZCByYW5kb21femlwZmlhbigxLCA1MDAwMDAwLCAyLjUpClxzZXQgcmVhZF9pZCByYW5k b20oMSwgNTAwMDAwMCkKXHNldCB2YWwgcmFuZG9tKDEsIDEwMDApCgpCRUdJTjsKICBTRUxFQ1Qg cGdfYWR2aXNvcnlfeGFjdF9sb2NrKDppZCk7CiAgU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9j ayg6aWQrMSk7CgogIFNFTEVDVCBiYWxhbmNlLCBwYXlsb2FkIEZST00gc3RyZXNzX3ZpY3RpbSBX SEVSRSBpZCA9IDpyZWFkX2lkOwoKICBTRUxFQ1QgY291bnQoKikgRlJPTSBzdHJlc3NfdmljdGlt IFdIRVJFIGlkIEJFVFdFRU4gOmlkIEFORCA6aWQgKyA1OwoKICBVUERBVEUgc3RyZXNzX3ZpY3Rp bSBTRVQgYmFsYW5jZSA9IDp2YWwgV0hFUkUgaWQgPSA6aWQ7CgogIFVQREFURSBzdHJlc3Nfc2hh ZG93IFNFVCBiYWxhbmNlID0gOnZhbCBXSEVSRSBpZCA9IDppZDsKIAogIERFTEVURSBGUk9NIHN0 cmVzc192aWN0aW0gV0hFUkUgaWQgPSA6aWQgKyAxOwogIERFTEVURSBGUk9NIHN0cmVzc19zaGFk b3cgV0hFUkUgaWQgPSA6aWQgKyAxOwogCiAgSU5TRVJUIElOVE8gc3RyZXNzX3ZpY3RpbSAoaWQs IGJhbGFuY2UsIHBheWxvYWQpCiAgVkFMVUVTICg6aWQgKyAxLCA6dmFsLCAnbmV3JykKICBPTiBD T05GTElDVCAoaWQpIERPIFVQREFURSBTRVQgYmFsYW5jZSA9IEVYQ0xVREVELmJhbGFuY2UsIHBh eWxvYWQgPSBFWENMVURFRC5wYXlsb2FkOwogCiAgSU5TRVJUIElOVE8gc3RyZXNzX3NoYWRvdyAo aWQsIGJhbGFuY2UsIHBheWxvYWQpCiAgVkFMVUVTICg6aWQgKyAxLCA6dmFsLCAnbmV3JykKICBP TiBDT05GTElDVCAoaWQpIERPIFVQREFURSBTRVQgYmFsYW5jZSA9IEVYQ0xVREVELmJhbGFuY2Us IHBheWxvYWQgPSBFWENMVURFRC5wYXlsb2FkOwpDT01NSVQ7 --000000000000e8ba98064ba65cbb--