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 1wDfqu-003ELr-2X for pgpool-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 09:51:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDfqr-009P3g-1R for pgpool-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 09:51:05 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDfqq-009P3X-2a for pgpool-hackers@lists.postgresql.org; Fri, 17 Apr 2026 09:51:05 +0000 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDfqn-00000001SCZ-1RIx for pgpool-hackers@lists.postgresql.org; Fri, 17 Apr 2026 09:51:03 +0000 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-b9358bc9c50so78872166b.1 for ; Fri, 17 Apr 2026 02:51:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776419460; cv=none; d=google.com; s=arc-20240605; b=SERgIpNywK6tipVZAT5rdYH1gJs8BhM4JQXmmiazpbySQUSfKwOCCSpXxkmX5PHCBn Hxfx3CWe01t8mimjRdj9pCVPk4Dj57/sGE5MNKp7j/+47tjNhpNGwwtITLgFZZFF7UZw Vtb2xrzDAGe8/06N2MWw3pP3aA8XK+Voy+EhqPe4hWDHONAxCcOTw9h/2nXQFEB71G8/ q8nC7Q6WEuqgnSxZq5u2GC8BrsWgKqYQYNVs8okb3h6Ok+ntSnlwHHZydrSsQQK8m5/B XDOV2IDVu5rnIfhR1YFmDEZKrOINu0o657Tcilz8pgOYZnJ9L70VDLoYjVC7sR0Wlf8o 1vGg== 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=gfF4AXjQ3xr2YHqg7EtVtDybemAemsFBfwv5GLJBvCg=; fh=m3oiE62fRN5J1XaE+5vpHZRIgCyFefxVI0mFw3d8yxA=; b=gCHQzBWUG2iXXq/eP1usoLkN5D6Nr/BsoQiC7L+IDJeLVIYCWjVR14s0Kd1RNw+bBy UXG9cAjCkyyzn49liq7tuTkbAxyLNwSjTOpiYawfX7C59up6GvOxWeV6gi4+Wl4XmkX0 cE07EOJcj99fFbnKGimn86H/a05QCw99S4OdM2zfdcRNavbP1pwUQjji2BPHGJmn7ets 4ydhtwKZn799GKsilWMPLCqOIAeJmyIGMS0mXjnuMGMMUUQnykiBwrNwr2IXf5avf4Xr 4F5K9JMm+zJvdBDxmM6VYgEwslCiVY7EJN3CujQ6Bm2IANbC8vPaUnhESI7JKZWICUjC yw7g==; 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=1776419460; x=1777024260; 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=gfF4AXjQ3xr2YHqg7EtVtDybemAemsFBfwv5GLJBvCg=; b=A2Znp3mdzSCt+gjYIpztvjBcyAk/j9gjRsOvwlD8Eg5kVk15dP792P3yUKdFiQZx1e Oapvj+q23ddLA4nI9x8KTFIOiTfj9VRy8fyJdbXDf+gGsnweB+P7pDAM5Pji5++AMzfO MaKaFGahyBKlRX30TGnVrBbzoq2CM6mhy+SDmysoHl1AdswypCce3q1Mpo184k12X0uF T2REE5JTcbzqNsZ743+93L0zgu5EUZ8BoEdN6LiwzO3AVl+iNdt58VwNzmm/LswSh+TZ C7QU+DOust/laoKvItDNXawqe94huER6/YKnGFcDsDtQRwxuQcZytZklxVExtWsZWTQf /npw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776419460; x=1777024260; 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=gfF4AXjQ3xr2YHqg7EtVtDybemAemsFBfwv5GLJBvCg=; b=SGzKX/SHGEJVsccRTSM4c1EdxufLHDV8PLV3MzuIy9BD84FM+zqpsFQYGSJ30+2cYS thZoGeQN4Pv72n4AzK3SCF5vDm20TuRo4PLwdGNJEBSgSJC+v/FTtLJY+H3Ixnu+1RvI qLClHeVv/zqEfMThtla8hOrs62AiIZKLNVTe8H2G7NMHyDt3wYY9RAOhmmqgvn4KvVjf +E17qKOZYYCvuGuiSvPAi0PRGCksDrsiK/Z2tAF5U7h8JV6524SJolb9cEXplNRUAeXs +Eq8owhAPYA94310999X+nHods5Ooaf7aosa9reA6EJFFf09fGD6EqiXx/ZMGBkoFFwx lfgQ== X-Gm-Message-State: AOJu0YxKxkD5e7GhackzFVCq5Jxfk1ZrW1TUi6s1lJ0RHEPxBtG9+7Di /LqL0909CY6OzzrByLVErbn0ZeKgIS0HCt5Qmty+0nUrKJbu5D5mgax0freDzpWUspPpQ5QPYeV jBUF94Qv2yDO+eA4GAw4OeBergZ++MhQyD3xr X-Gm-Gg: AeBDievotBHAjAYCgE6OyMzoIxFMMccX7VbeC8EEaHrgQqOZsSCmKtWF2Gv3pGq++ic In8pKbDCtl8ZWLEfe4YZDAHrHIehBIHYd4PX1TcZetZQ7UNrAQOWZSoizrxwQi0QY7ybmxJrPpf tqiDiRjgzcWU+UoWBkGebk7YUeHpZK1mLZf8LRm6wfRqCBUErFT0cEzcmAZlZFa7g0j2MuFC2V7 a+hzQFOXdrUN3GV8+Q5pKFUpxciUguPar/SIP723nrVReX4+IKhul946YsbILwmQrjFPRKoRN/f cKPaEb9ppoGk7nRU X-Received: by 2002:a17:906:fe04:b0:b97:c719:14d4 with SMTP id a640c23a62f3a-ba41adf9294mr110762766b.29.1776419459908; Fri, 17 Apr 2026 02:50:59 -0700 (PDT) MIME-Version: 1.0 References: <20260416.193138.2156629846536617464.ishii@postgresql.org> <20260417.073733.1428537764192913774.ishii@postgresql.org> In-Reply-To: <20260417.073733.1428537764192913774.ishii@postgresql.org> From: Bob Ross Date: Fri, 17 Apr 2026 11:50:48 +0200 X-Gm-Features: AQROBzBLRX-iQ_m7nMDJeFewk7WVMsiw1gfd6LHnEcLjn1xlYRiVPKfWhKC-yJ8 Message-ID: Subject: Re: Rotate SSL certificates on reload (SIGHUP) without restart To: Tatsuo Ishii Cc: pgpool-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000e1888e064fa4e239" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e1888e064fa4e239 Content-Type: multipart/alternative; boundary="000000000000e1888c064fa4e237" --000000000000e1888c064fa4e237 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Tatsuo, I've fixed the test failure. The issue was that the original test used the static self-signed server.crt as the CA bundle. When ssl_ca_cert is set, pgpool verifies the backend certificate against it, and the self-signed cert failed that check. The fix generates a dedicated server CA in the test and issues a backend cert signed by it, so pgpool can always verify the backend while ca1/ca2 are independently swapped to test client-cert trust rotation. The test now passes: *CA cert swap: CA1-signed client cert accepted before reload =E2=80=93 ok.C= A cert swap: CA1-signed client cert rejected after reload to CA2 =E2=80=93 ok.test= ing 042.ssl_reload...ok.out of 1 ok:1 failed:0 timeout:0* pgpool.log showing client cert accepted before reload: *2026-04-17 09:23:31.449: child pid 81378: DEBUG: got the SSL certificate2026-04-17 09:23:31.449: child pid 81378: DETAIL: Protocol Major: 3 Minor: 0 database: test user: ssltest2026-04-17 09:23:31.450: child pid 81378: DETAIL: client->server SSL response: S2026-04-17 09:23:31.455: child pid 81378: DETAIL: auth kind:0* SSL certificate reload completed: *2026-04-17 09:23:31.471: main pid 81347: LOG: reload SSL certificates.* pgpool.log showing client cert rejected after reload: *2026-04-17 09:23:32.485: psql pid 81385: DETAIL: SSLRequest from client2026-04-17 09:23:32.493: psql pid 81385: LOG: pool_ssl: "SSL_accept": "certificate verify failed"2026-04-17 09:23:32.493: psql pid 81385: ERROR: failed while reading startup packet* No changes to the core patch. The updated v4 is attached. Regards, Bob On Fri, Apr 17, 2026 at 12:37=E2=80=AFAM Tatsuo Ishii wrote: > Hi Bob, > > Thank you for the new patch. This time it failed with different > pgpool.log. > src/test/regression/log/042.ssl_reload was same. > > 2026-04-17 07:30:46.893: child pid 1475041: DEBUG: attempting to > negotiate a secure connection > 2026-04-17 07:30:46.893: child pid 1475041: DETAIL: sending > client->server SSL request > 2026-04-17 07:30:46.893: child pid 1475041: DEBUG: pool_flush_it: flush > size: 8 > 2026-04-17 07:30:46.894: child pid 1475041: DEBUG: pool_read: read 1 > bytes from backend 0 > 2026-04-17 07:30:46.894: child pid 1475041: DEBUG: attempting to > negotiate a secure connection > 2026-04-17 07:30:46.894: child pid 1475041: DETAIL: client->server SSL > response: S > 2026-04-17 07:30:46.899: child pid 1475041: LOG: pool_ssl: "SSL_connect"= : > "certificate verify failed" > 2026-04-17 07:30:46.899: child pid 1475041: DEBUG: pool_flush_it: flush > size: 58 > 2026-04-17 07:30:46.899: child pid 1475041: DEBUG: pool_read: read 360 > bytes from backend 0 > 2026-04-17 07:30:46.900: child pid 1475041: ERROR: backend authenticatio= n > failed > 2026-04-17 07:30:46.900: child pid 1475041: DETAIL: backend response wit= h > kind ' ' when expecting 'R' > 2026-04-17 07:30:46.900: child pid 1475041: DEBUG: pool_write: to > frontend: kind:E po:0 > 2026-04-17 07:30:46.900: child pid 1475041: DEBUG: pool_write: to > frontend: length:4 po:1 > 2026-04-17 07:30:46.900: child pid 1475041: DEBUG: pool_write: to > frontend: length:115 po:5 > 2026-04-17 07:30:46.900: child pid 1475041: DEBUG: pool_flush_it: flush > size: 120 > > > Hi Tatsuo, > > > > Thank you for the report and the log, that was very helpful. > > > > The bug was in the test, not in the core patch. Test 4 in 042.ssl_reloa= d > > set PGSSLROOTCERT=3D"$CADIR/ca1.crt" on both psql invocations. The inte= nt > was > > to use ca1.crt for server-side client-certificate verification, but > > PGSSLROOTCERT actually controls client-side server certificate > > verification, and ca1.crt is a freshly generated CA that never signed > > pgpool's server.crt. Because libpq upgrades sslmode=3Drequire to verify= -ca > > behavior when a root CA file is provided, psql immediately sent > unknown_ca > > back to pgpool and aborted the handshake before server-side client-cert > > verification ever ran. > > > > Fix: both lines now use PGSSLROOTCERT=3D"etc/$SSL_CRT". Since server.cr= t is > > self-signed it acts as its own root, so psql accepts pgpool's server > cert, > > the handshake completes, and the test exercises what it was always mean= t > to > > test: whether pgpool enforces the new ssl_ca_cert after reload. > > > > No changes to the core patch. > > > > Please find v3 attached. Please let me know if it fixes the test issue. > > > > Best regards, > > Bob > > > > On Thu, Apr 16, 2026 at 12:31=E2=80=AFPM Tatsuo Ishii > wrote: > > > >> Hi Bob, > >> > >> Thank you for the patch! > >> > >> Unfortunately after applying the patch, the test failed. From > >> src/test/regression/log/042.ssl_reload: > >> > >> =3D=3D=3D=3D=3D ssl_ca_cert swap (client cert auth reload) =3D=3D=3D= =3D=3D > >> waiting for server to start....1462289 2026-04-16 19:25:49.490 JST LOG= : > >> redirecting log output to logging collector process > >> 1462289 2026-04-16 19:25:49.490 JST HINT: Future log output will appe= ar > >> in directory "log". > >> done > >> server started > >> CA cert swap: CA1-signed client cert rejected before reload =E2=80=93 > unexpected. > >> > >> From pgpool.log: > >> > >> 2026-04-16 19:26:10.150: child pid 1462331: DETAIL: Protocol Major: > 1234 > >> Minor: 5679 database: user: > >> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG: selecting backend > >> connection > >> 2026-04-16 19:26:10.150: child pid 1462331: DETAIL: SSLRequest from > client > >> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG: pool_write: to > >> frontend: kind:S po:0 > >> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG: pool_flush_it: flu= sh > >> size: 1 > >> 2026-04-16 19:26:10.167: child pid 1462331: LOG: pool_ssl: > "SSL_accept": > >> "tlsv1 alert unknown ca" > >> 2026-04-16 19:26:10.167: child pid 1462331: DEBUG: unable to read dat= a > >> from frontend > >> 2026-04-16 19:26:10.167: child pid 1462331: DETAIL: socket read faile= d > >> with error "Connection reset by peer" > >> > >> Please let me know if you need more info. > >> > >> Regards, > >> -- > >> Tatsuo Ishii > >> SRA OSS K.K. > >> English: http://www.sraoss.co.jp/index_en/ > >> Japanese:http://www.sraoss.co.jp > >> > >> > Hi Tatsuo, > >> > > >> > Please see attached v2. It adds regression coverage for SSL cert > reload > >> > with client certificate authentication; there are no functional code > >> > changes. > >> > > >> > Best regards, > >> > Bob > >> > > >> > > >> > On Tue, Apr 14, 2026 at 10:02=E2=80=AFAM Tatsuo Ishii > >> wrote: > >> > > >> >> Hi Bob, > >> >> > >> >> > Hi Tatsuo, > >> >> > > >> >> > Please let me know if you need any assistance with updating your > test > >> >> > cases. I am be happy to help. > >> >> > > >> >> > Thanks, > >> >> > Bob > >> >> > >> >> Sorry for late. I was busy with personal affairs and some other > >> >> projects. > >> >> > >> >> > On Thu, Apr 2, 2026 at 9:57=E2=80=AFPM Bob Ross > >> >> wrote: > >> >> > > >> >> >> Hi Tatsuo, > >> >> >> > >> >> >> Thanks for putting together the regression tests. > >> >> >> > >> >> >> Thoughts on your questions: > >> >> >> - CA Certificates - Yes, adding a cert auth test is highly > >> recommended. > >> >> We > >> >> >> could test this by generating two different dummy CA certificate= s. > >> Start > >> >> >> pgpool trusting CA #1, swap the config to CA #2, reload and > verify if > >> >> >> client connection correctly gets rejected. > >> >> > >> >> If you could extend the test file I posted so that it performs a ce= rt > >> >> auth test, that would be helpful. > >> >> > >> >> >> - DH parameters - perhaps we can test this by providing a > >> non-existent > >> >> >> file path and then use grep to check pgpool.log for specific > warning > >> >> >> message (per pool_ssl.c it=E2=80=99s =E2=80=9CDH: could not load= DH parameters=E2=80=9D) > when > >> >> >> pgpool tries to load the file. > >> >> > >> >> I think it will not work. > >> >> > >> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > >> >> static bool > >> >> initialize_dh(SSL_CTX *context) > >> >> { > >> >> DH *dh =3D NULL; > >> >> > >> >> SSL_CTX_set_options(context, SSL_OP_SINGLE_DH_USE); > >> >> > >> >> if (pool_config->ssl_dh_params_file[0]) > >> >> dh =3D load_dh_file(pool_config->ssl_dh_params_file= ); > >> >> if (!dh) > >> >> dh =3D load_dh_buffer(FILE_DH2048, > sizeof(FILE_DH2048)); > >> >> if (!dh) > >> >> { > >> >> ereport(WARNING, > >> >> (errmsg("DH: could not load DH > >> >> parameters"))); > >> >> return false; > >> >> } > >> >> : > >> >> : > >> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > >> >> > >> >> The ereport message is printed when the built-in DH parameter file = is > >> >> broken. But as long as the source file is fine, it would never > happen. > >> >> > >> >> Maybe we should fix the code above so that it emits ereport when it > >> >> fails to load the DH parameter file specified by ssl_dh_params_file= ? > >> >> > >> >> Regards, > >> >> -- > >> >> Tatsuo Ishii > >> >> SRA OSS K.K. > >> >> English: http://www.sraoss.co.jp/index_en/ > >> >> Japanese:http://www.sraoss.co.jp > >> >> > >> > --000000000000e1888c064fa4e237 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Tatsuo,

I've fixed the test failure. The iss= ue was that the original test used the static self-signed server.crt as the= CA bundle. When ssl_ca_cert is set, pgpool verifies the backend certificat= e against it, and the self-signed cert failed that check. The fix generates= a dedicated server CA in the test and issues a backend cert signed by it, = so pgpool can always verify the backend while ca1/ca2 are independently swa= pped to test client-cert trust rotation.

The test now passes:
=
CA cert swap: CA1-signed client cert accepted before reload =E2=80=93 o= k.
CA cert swap: CA1-signed client cert rejected after reload to CA2 =E2= =80=93 ok.

testing 042.ssl_reload...ok.
out of 1 ok:1 failed:0 ti= meout:0


pgpool.log showing client cert accepted before reload:
2026-04-17 09:23:31.449: child pid 81378: DEBUG: =C2=A0got the SSL= certificate
2026-04-17 09:23:31.449: child pid 81378: DETAIL: =C2=A0Pro= tocol Major: 3 Minor: 0 database: test user: ssltest
2026-04-17 09:23:31= .450: child pid 81378: DETAIL: =C2=A0client->server SSL response: S
2= 026-04-17 09:23:31.455: child pid 81378: DETAIL: =C2=A0auth kind:0

<= br>SSL certificate reload completed:

2026-04-17 09:23= :31.471: main pid 81347: LOG: =C2=A0reload SSL certificates.

pgp= ool.log showing client cert rejected after reload:

2026-04-17 09:23:32.485: psql pid 81385: DETAIL: =C2=A0SSLRequest from= client
2026-04-17 09:23:32.493: psql pid 81385: LOG: =C2=A0pool_ssl: &q= uot;SSL_accept": "certificate verify failed"
2026-04-17 0= 9:23:32.493: psql pid 81385: ERROR: =C2=A0failed while reading startup pack= et


No changes to the core patch.
The updated v4 is attached.<= br>
Regards,
Bob

On Fri, Apr 17, 202= 6 at 12:37=E2=80=AFAM Tatsuo Ishii <ishii@postgresql.org> wrote:
Hi Bob,

Thank you for the new patch. This time it failed with different pgpool.log.=
src/test/regression/log/042.ssl_reload was same.

2026-04-17 07:30:46.893: child pid 1475041: DEBUG:=C2=A0 attempting to nego= tiate a secure connection
2026-04-17 07:30:46.893: child pid 1475041: DETAIL:=C2=A0 sending client-&g= t;server SSL request
2026-04-17 07:30:46.893: child pid 1475041: DEBUG:=C2=A0 pool_flush_it: flu= sh size: 8
2026-04-17 07:30:46.894: child pid 1475041: DEBUG:=C2=A0 pool_read: read 1 = bytes from backend 0
2026-04-17 07:30:46.894: child pid 1475041: DEBUG:=C2=A0 attempting to nego= tiate a secure connection
2026-04-17 07:30:46.894: child pid 1475041: DETAIL:=C2=A0 client->server= SSL response: S
2026-04-17 07:30:46.899: child pid 1475041: LOG:=C2=A0 pool_ssl: "SSL_= connect": "certificate verify failed"
2026-04-17 07:30:46.899: child pid 1475041: DEBUG:=C2=A0 pool_flush_it: flu= sh size: 58
2026-04-17 07:30:46.899: child pid 1475041: DEBUG:=C2=A0 pool_read: read 36= 0 bytes from backend 0
2026-04-17 07:30:46.900: child pid 1475041: ERROR:=C2=A0 backend authentica= tion failed
2026-04-17 07:30:46.900: child pid 1475041: DETAIL:=C2=A0 backend response = with kind ' ' when expecting 'R'
2026-04-17 07:30:46.900: child pid 1475041: DEBUG:=C2=A0 pool_write: to fro= ntend: kind:E po:0
2026-04-17 07:30:46.900: child pid 1475041: DEBUG:=C2=A0 pool_write: to fro= ntend: length:4 po:1
2026-04-17 07:30:46.900: child pid 1475041: DEBUG:=C2=A0 pool_write: to fro= ntend: length:115 po:5
2026-04-17 07:30:46.900: child pid 1475041: DEBUG:=C2=A0 pool_flush_it: flu= sh size: 120

> Hi Tatsuo,
>
> Thank you for the report and the log, that was very helpful.
>
> The bug was in the test, not in the core patch. Test 4 in 042.ssl_relo= ad
> set PGSSLROOTCERT=3D"$CADIR/ca1.crt" on both psql invocation= s. The intent was
> to use ca1.crt for server-side client-certificate verification, but > PGSSLROOTCERT actually controls client-side server certificate
> verification, and ca1.crt is a freshly generated CA that never signed<= br> > pgpool's server.crt. Because libpq upgrades sslmode=3Drequire to v= erify-ca
> behavior when a root CA file is provided, psql immediately sent unknow= n_ca
> back to pgpool and aborted the handshake before server-side client-cer= t
> verification ever ran.
>
> Fix: both lines now use PGSSLROOTCERT=3D"etc/$SSL_CRT". Sinc= e server.crt is
> self-signed it acts as its own root, so psql accepts pgpool's serv= er cert,
> the handshake completes, and the test exercises what it was always mea= nt to
> test: whether pgpool enforces the new ssl_ca_cert after reload.
>
> No changes to the core patch.
>
> Please find v3 attached. Please let me know if it fixes the test issue= .
>
> Best regards,
> Bob
>
> On Thu, Apr 16, 2026 at 12:31=E2=80=AFPM Tatsuo Ishii <ishii@postgresql.org> = wrote:
>
>> Hi Bob,
>>
>> Thank you for the patch!
>>
>> Unfortunately after applying the patch, the test failed. From
>> src/test/regression/log/042.ssl_reload:
>>
>> =3D=3D=3D=3D=3D ssl_ca_cert swap (client cert auth reload) =3D=3D= =3D=3D=3D
>> waiting for server to start....1462289 2026-04-16 19:25:49.490 JST= LOG:
>> redirecting log output to logging collector process
>> 1462289 2026-04-16 19:25:49.490 JST HINT:=C2=A0 Future log output = will appear
>> in directory "log".
>>=C2=A0 done
>> server started
>> CA cert swap: CA1-signed client cert rejected before reload =E2=80= =93 unexpected.
>>
>> From pgpool.log:
>>
>> 2026-04-16 19:26:10.150: child pid 1462331: DETAIL:=C2=A0 Protocol= Major: 1234
>> Minor: 5679 database:=C2=A0 user:
>> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG:=C2=A0 selecting= backend
>> connection
>> 2026-04-16 19:26:10.150: child pid 1462331: DETAIL:=C2=A0 SSLReque= st from client
>> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG:=C2=A0 pool_writ= e: to
>> frontend: kind:S po:0
>> 2026-04-16 19:26:10.150: child pid 1462331: DEBUG:=C2=A0 pool_flus= h_it: flush
>> size: 1
>> 2026-04-16 19:26:10.167: child pid 1462331: LOG:=C2=A0 pool_ssl: &= quot;SSL_accept":
>> "tlsv1 alert unknown ca"
>> 2026-04-16 19:26:10.167: child pid 1462331: DEBUG:=C2=A0 unable to= read data
>> from frontend
>> 2026-04-16 19:26:10.167: child pid 1462331: DETAIL:=C2=A0 socket r= ead failed
>> with error "Connection reset by peer"
>>
>> Please let me know if you need more info.
>>
>> Regards,
>> --
>> Tatsuo Ishii
>> SRA OSS K.K.
>> English: http://www.sraoss.co.jp/index_en/
>> Japanese:http://www.sraoss.co.jp
>>
>> > Hi Tatsuo,
>> >
>> > Please see attached v2. It adds regression coverage for SSL c= ert reload
>> > with client certificate authentication; there are no function= al code
>> > changes.
>> >
>> > Best regards,
>> > Bob
>> >
>> >
>> > On Tue, Apr 14, 2026 at 10:02=E2=80=AFAM Tatsuo Ishii <ishii@postgresql.org= >
>> wrote:
>> >
>> >> Hi Bob,
>> >>
>> >> > Hi Tatsuo,
>> >> >
>> >> > Please let me know if you need any assistance with u= pdating your test
>> >> > cases. I am be happy to help.
>> >> >
>> >> > Thanks,
>> >> > Bob
>> >>
>> >> Sorry for late. I was busy with personal affairs and some= other
>> >> projects.
>> >>
>> >> > On Thu, Apr 2, 2026 at 9:57=E2=80=AFPM Bob Ross <= bob.ross.1982= 1@gmail.com>
>> >> wrote:
>> >> >
>> >> >> Hi Tatsuo,
>> >> >>
>> >> >> Thanks for putting together the regression tests= .
>> >> >>
>> >> >> Thoughts on your questions:
>> >> >> - CA Certificates - Yes, adding a cert auth test= is highly
>> recommended.
>> >> We
>> >> >> could test this by generating two different dumm= y CA certificates.
>> Start
>> >> >> pgpool trusting CA #1, swap the config to CA #2,= reload and verify if
>> >> >> client connection correctly gets rejected.
>> >>
>> >> If you could extend the test file I posted so that it per= forms a cert
>> >> auth test, that would be helpful.
>> >>
>> >> >> - DH parameters - perhaps we can test this by pr= oviding a
>> non-existent
>> >> >> file path and then use grep to check pgpool.log = for specific warning
>> >> >> message (per pool_ssl.c it=E2=80=99s =E2=80=9CDH= : could not load DH parameters=E2=80=9D) when
>> >> >> pgpool tries to load the file.
>> >>
>> >> I think it will not work.
>> >>
>> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>> >> static bool
>> >> initialize_dh(SSL_CTX *context)
>> >> {
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0DH=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*dh =3D NULL;
>> >>
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0SSL_CTX_set_options(cont= ext, SSL_OP_SINGLE_DH_USE);
>> >>
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (pool_config->ssl_= dh_params_file[0])
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0dh =3D load_dh_file(pool_config->ssl_dh_params_file);
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!dh)
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0dh =3D load_dh_buffer(FILE_DH2048, sizeof(FILE_DH2048));
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!dh)
>> >>=C2=A0 =C2=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(WARNING,
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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("= ;DH: could not load DH
>> >> parameters")));
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0return false;
>> >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >> :
>> >> :
>> >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>> >>
>> >> The ereport message is printed when the built-in DH param= eter file is
>> >> broken. But as long as the source file is fine, it would = never happen.
>> >>
>> >> Maybe we should fix the code above so that it emits erepo= rt when it
>> >> fails to load the DH parameter file specified by ssl_dh_p= arams_file?
>> >>
>> >> Regards,
>> >> --
>> >> Tatsuo Ishii
>> >> SRA OSS K.K.
>> >> English: http://www.sraoss.co.jp/index_en/ >> >> Japanese:http://www.sraoss.co.jp
>> >>
>>
--000000000000e1888c064fa4e237-- --000000000000e1888e064fa4e239 Content-Type: application/octet-stream; name="v4-0001-Feature-reload-SSL-certificates-on-SIGHUP-without.patch" Content-Disposition: attachment; filename="v4-0001-Feature-reload-SSL-certificates-on-SIGHUP-without.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo2q1km80 RnJvbSBjOTdmYzZlOWQ0YWNiM2Y1MDcxZTQ3M2RiM2IzNDU3N2YyNDk4ZDU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCb2IgUm9zcyA8Ym9iLnJvc3MuMTk4MjFAZ21haWwuY29tPgpE YXRlOiBUaHUsIDE3IEFwciAyMDI2IDAwOjAwOjAwICswMDAwClN1YmplY3Q6IFtQQVRDSCB2NF0g RmVhdHVyZTogcmVsb2FkIFNTTCBjZXJ0aWZpY2F0ZXMgb24gU0lHSFVQIHdpdGhvdXQgcmVzdGFy dApNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRG LTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKQWxsb3cgUGdwb29sLUlJIHRvIHBp Y2sgdXAgcm90YXRlZCBUTFMgY2VydGlmaWNhdGVzIChhbmQgYW55IGNoYW5nZSB0bwpTU0wtcmVs YXRlZCBjb25maWd1cmF0aW9uKSB3aGVuIHJlY2VpdmluZyBTSUdIVVAgKGkuZS4gc3lzdGVtY3Rs IHJlbG9hZApwZ3Bvb2wyKSwgbWF0Y2hpbmcgdGhlIGJlaGF2aW9yIFBvc3RncmVTUUwgaGFzIGhh ZCBzaW5jZSBQb3N0Z3JlU1FMIDEyLgoKUHJvYmxlbToKQWxsIFNTTCBjb25maWd1cmF0aW9uIHBh cmFtZXRlcnMgKHNzbF9jZXJ0LCBzc2xfa2V5LCBzc2xfY2FfY2VydCwKc3NsX2NpcGhlcnMsIGV0 Yy4pIHdlcmUgZGVjbGFyZWQgQ0ZHQ1hUX0lOSVQsIG1lYW5pbmcgdGhleSB3ZXJlIHNpbGVudGx5 Cmlnbm9yZWQgd2hlbiBwb29sX2dldF9jb25maWcoKSB3YXMgY2FsbGVkIHVuZGVyIENGR0NYVF9S RUxPQUQuCkZ1cnRoZXJtb3JlLCBTU0xfU2VydmVyU2lkZV9pbml0KCkgd2FzIG9ubHkgY2FsbGVk IG9uY2UgYXQgc3RhcnR1cCBpbgptYWluLmMgYW5kIG5ldmVyIGFnYWluLCBzbyB0aGUgaW4tbWVt b3J5IFNTTF9DVFggd2FzIG5ldmVyIHJlZnJlc2hlZC4KCkZpeDoKMS4gc3JjL21haW4vcGdwb29s X21haW4uYwogICAtIEluY2x1ZGUgdXRpbHMvcG9vbF9zc2wuaC4KICAgLSBJbiByZWxvYWRfY29u ZmlnKCksIGNhbGwgU1NMX1NlcnZlclNpZGVfaW5pdCgpIChndWFyZGVkIGJ5CiAgICAgI2lmZGVm IFVTRV9TU0wpICpiZWZvcmUqIGtpbGxfYWxsX2NoaWxkcmVuKFNJR0hVUCkuICBUaGUgZnVuY3Rp b24KICAgICBhbHJlYWR5IHJlcGxhY2VzIFNTTF9mcm9udGVuZF9jb250ZXh0IGF0b21pY2FsbHk6 IGl0IGZyZWVzIHRoZSBvbGQKICAgICBTU0xfQ1RYIG9ubHkgYWZ0ZXIgYSBuZXcgb25lIGhhcyBi ZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBzbyBhCiAgICAgZmFpbGVkIHJlbG9hZCBsZWF2ZXMg dGhlIGV4aXN0aW5nIGNvbnRleHQgaW50YWN0LgoKMi4gc3JjL3Byb3RvY29sL2NoaWxkLmMKICAg LSBJbiBjaGVja19jb25maWdfcmVsb2FkKCksIGNhbGwgU1NMX1NlcnZlclNpZGVfaW5pdCgpIChn dWFyZGVkIGJ5CiAgICAgI2lmZGVmIFVTRV9TU0wpIHNvIGVhY2ggd29ya2VyIGNoaWxkIGFsc28g cmVmcmVzaGVzIGl0cyBvd24gY29weSBvZgogICAgIHRoZSBTU0wgY29udGV4dCBmb3Igc3Vic2Vx dWVudCBuZXcgY29ubmVjdGlvbnMuICBJbi1mbGlnaHQgVExTCiAgICAgc2Vzc2lvbnMgYXJlIHVu YWZmZWN0ZWQgYmVjYXVzZSB0aGV5IGhvbGQgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZQogICAg IFNTTCBvYmplY3QsIG5vdCB0byBTU0xfZnJvbnRlbmRfY29udGV4dC4KCjMuIHNyYy9jb25maWcv cG9vbF9jb25maWdfdmFyaWFibGVzLmMKICAgLSBDaGFuZ2UgQ0ZHQ1hUX0lOSVQgLT4gQ0ZHQ1hU X1JFTE9BRCBmb3I6CiAgICAgICBzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzLCBzc2xfY2VydCwg c3NsX2tleSwgc3NsX2NhX2NlcnQsCiAgICAgICBzc2xfY2FfY2VydF9kaXIsIHNzbF9jcmxfZmls ZSwgc3NsX2NpcGhlcnMsIHNzbF9lY2RoX2N1cnZlLAogICAgICAgc3NsX2RoX3BhcmFtc19maWxl LCBzc2xfcGFzc3BocmFzZV9jb21tYW5kLgogICAtIFRoZSAnc3NsJyBib29sZWFuIChtYXN0ZXIg ZW5hYmxlIGZsYWcpIGlzIGludGVudGlvbmFsbHkgbGVmdCBhcwogICAgIENGR0NYVF9JTklUIGJl Y2F1c2UgZHluYW1pY2FsbHkgZW5hYmxpbmcgU1NMIGF0IHJ1bnRpbWUgaXMgYQogICAgIGxhcmdl ciwgc2VwYXJhdGUgY29uY2Vybi4KClVzYWdlIGFmdGVyIHRoaXMgY2hhbmdlOgpTdGFuZGFyZCBp bi1wbGFjZSBjZXJ0aWZpY2F0ZSByb3RhdGlvbiAoY2VydC1tYW5hZ2VyLCBBQ01FLCBtYW51YWwK b3BlbnNzbCByZWZyZXNoIGF0IHRoZSBzYW1lIHBhdGgpOgoKICAgICMgcmVwbGFjZSAvZXRjL3Bn cG9vbC9zZXJ2ZXIue2NydCxrZXl9IHdpdGggbmV3IGZpbGVzCiAgICBzeXN0ZW1jdGwgcmVsb2Fk IHBncG9vbDIKICAgICMgb3I6IHBncG9vbCAtZiAvZXRjL3BncG9vbC9wZ3Bvb2wuY29uZiByZWxv YWQKCk5ldyBjb25uZWN0aW9ucyB3aWxsIHVzZSB0aGUgbmV3IGNlcnRpZmljYXRlcyBhZnRlciB3 b3JrZXJzIHByb2Nlc3MKdGhlIHJlbG9hZCBzaWduYWwuIEV4aXN0aW5nIGNvbm5lY3Rpb25zIGFy ZSBub3QgaW50ZXJydXB0ZWQuCgpTd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgY2VydGlmaWNhdGUg cGF0aCBhbHNvIHdvcmtzOiB1cGRhdGUKcGdwb29sLmNvbmYgdGhlbiByZWxvYWQg4oCUIHRoZSBu ZXcgcGF0aHMgYXJlIG5vdyBhY2NlcHRlZCBpbgpDRkdDWFRfUkVMT0FEIGNvbnRleHQuCgpBdXRo b3I6IEJvYiBSb3NzIDxib2Iucm9zcy4xOTgyMUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBUYXRz dW8gSXNoaWkgPGlzaGlpQHBvc3RncmVzcWwub3JnPgpEaXNjdXNzaW9uOiBodHRwczovL3d3dy5w b3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL2ZsYXQvQ0FIdFp2cmRkcWZibkVSWVlfRHFnVVJXQ2p1 WGVUak0weTA4ay1aUF9CMGJBSFl4MmFnJTQwbWFpbC5nbWFpbC5jb20KLS0tCiBzcmMvY29uZmln L3Bvb2xfY29uZmlnX3ZhcmlhYmxlcy5jICAgICAgICAgICAgfCAgMjAgKy0KIHNyYy9tYWluL3Bn cG9vbF9tYWluLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNyArKwogc3JjL3Byb3RvY29s L2NoaWxkLmMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDExICsKIC4uLi9yZWdyZXNzaW9u L3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL1JFQURNRSAgICB8ICAgNiArCiAuLi4vdGVzdHMvMDQyLnNz bF9yZWxvYWQvc2VydmVyLmNydCAgICAgICAgICAgfCAgNzkgKysrKysrKysKIC4uLi90ZXN0cy8w NDIuc3NsX3JlbG9hZC9zZXJ2ZXIua2V5ICAgICAgICAgICB8ICAyNyArKysKIC4uLi90ZXN0cy8w NDIuc3NsX3JlbG9hZC9zZXJ2ZXIucmVxICAgICAgICAgICB8ICA2MSArKysrKysKIC4uLi9yZWdy ZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL3Rlc3Quc2ggICB8IDI5MCArKysrKysrKysrKysr KysrKysrKysrKysKIDggZmlsZXMgY2hhbmdlZCwgNDMzIGluc2VydGlvbnMoKyksIDEwIGRlbGV0 aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3Npb24vdGVzdHMvMDQy LnNzbF9yZWxvYWQvUkVBRE1FCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzc2lv bi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2ZXIuY3J0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3Jj L3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2ZXIua2V5CiBjcmVhdGUg bW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2 ZXIucmVxCiBjcmVhdGUgbW9kZSAxMDA3NTUgc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIu c3NsX3JlbG9hZC90ZXN0LnNoCgpkaWZmIC0tZ2l0IGEvc3JjL2NvbmZpZy9wb29sX2NvbmZpZ192 YXJpYWJsZXMuYyBiL3NyYy9jb25maWcvcG9vbF9jb25maWdfdmFyaWFibGVzLmMKaW5kZXggY2Ux M2M0MmY2Li5jYTQwYzM0MWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb25maWcvcG9vbF9jb25maWdfdmFy aWFibGVzLmMKKysrIGIvc3JjL2NvbmZpZy9wb29sX2NvbmZpZ192YXJpYWJsZXMuYwpAQCAtNzA1 LDcgKzcwNSw3IEBAIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2Jvb2wgQ29uZmlndXJlTmFtZXNCb29s W10gPQogCX0sCiAKIAl7Ci0JCXsic3NsX3ByZWZlcl9zZXJ2ZXJfY2lwaGVycyIsIENGR0NYVF9J TklULCBTU0xfQ09ORklHLAorCQl7InNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMiLCBDRkdDWFRf UkVMT0FELCBTU0xfQ09ORklHLAogCQkJIlVzZSBzZXJ2ZXIncyBTU0wgY2lwaGVyIHByZWZlcmVu Y2VzLCByYXRoZXIgdGhhbiB0aGUgY2xpZW50J3MiLAogCQkJQ09ORklHX1ZBUl9UWVBFX0JPT0ws IGZhbHNlLCAwCiAJCX0sCkBAIC0xMjcxLDcgKzEyNzEsNyBAQCBzdGF0aWMgc3RydWN0IGNvbmZp Z19zdHJpbmcgQ29uZmlndXJlTmFtZXNTdHJpbmdbXSA9CiAJfSwKIAogCXsKLQkJeyJzc2xfY2Vy dCIsIENGR0NYVF9JTklULCBTU0xfQ09ORklHLAorCQl7InNzbF9jZXJ0IiwgQ0ZHQ1hUX1JFTE9B RCwgU1NMX0NPTkZJRywKIAkJCSJTU0wgcHVibGljIGNlcnRpZmljYXRlIGZpbGUuIiwKIAkJCUNP TkZJR19WQVJfVFlQRV9TVFJJTkcsIGZhbHNlLCAwCiAJCX0sCkBAIC0xMjgxLDcgKzEyODEsNyBA QCBzdGF0aWMgc3RydWN0IGNvbmZpZ19zdHJpbmcgQ29uZmlndXJlTmFtZXNTdHJpbmdbXSA9CiAJ fSwKIAogCXsKLQkJeyJzc2xfa2V5IiwgQ0ZHQ1hUX0lOSVQsIFNTTF9DT05GSUcsCisJCXsic3Ns X2tleSIsIENGR0NYVF9SRUxPQUQsIFNTTF9DT05GSUcsCiAJCQkiU1NMIHByaXZhdGUga2V5IGZp bGUuIiwKIAkJCUNPTkZJR19WQVJfVFlQRV9TVFJJTkcsIGZhbHNlLCAwCiAJCX0sCkBAIC0xMjkx LDcgKzEyOTEsNyBAQCBzdGF0aWMgc3RydWN0IGNvbmZpZ19zdHJpbmcgQ29uZmlndXJlTmFtZXNT dHJpbmdbXSA9CiAJfSwKIAogCXsKLQkJeyJzc2xfY2FfY2VydCIsIENGR0NYVF9JTklULCBTU0xf Q09ORklHLAorCQl7InNzbF9jYV9jZXJ0IiwgQ0ZHQ1hUX1JFTE9BRCwgU1NMX0NPTkZJRywKIAkJ CSJTaW5nbGUgUEVNIGZvcm1hdCBmaWxlIGNvbnRhaW5pbmcgQ0Egcm9vdCBjZXJ0aWZpY2F0ZShz KS4iLAogCQkJQ09ORklHX1ZBUl9UWVBFX1NUUklORywgZmFsc2UsIDAKIAkJfSwKQEAgLTEzMDEs NyArMTMwMSw3IEBAIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX3N0cmluZyBDb25maWd1cmVOYW1lc1N0 cmluZ1tdID0KIAl9LAogCiAJewotCQl7InNzbF9jYV9jZXJ0X2RpciIsIENGR0NYVF9JTklULCBT U0xfQ09ORklHLAorCQl7InNzbF9jYV9jZXJ0X2RpciIsIENGR0NYVF9SRUxPQUQsIFNTTF9DT05G SUcsCiAJCQkiRGlyZWN0b3J5IGNvbnRhaW5pbmcgQ0Egcm9vdCBjZXJ0aWZpY2F0ZShzKS4iLAog CQkJQ09ORklHX1ZBUl9UWVBFX1NUUklORywgZmFsc2UsIDAKIAkJfSwKQEAgLTEzMTEsNyArMTMx MSw3IEBAIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX3N0cmluZyBDb25maWd1cmVOYW1lc1N0cmluZ1td ID0KIAl9LAogCiAJewotCQl7InNzbF9jcmxfZmlsZSIsIENGR0NYVF9JTklULCBTU0xfQ09ORklH LAorCQl7InNzbF9jcmxfZmlsZSIsIENGR0NYVF9SRUxPQUQsIFNTTF9DT05GSUcsCiAJCQkiU1NM IGNlcnRpZmljYXRlIHJldm9jYXRpb24gbGlzdCBmaWxlIiwKIAkJCUNPTkZJR19WQVJfVFlQRV9T VFJJTkcsIGZhbHNlLCAwCiAJCX0sCkBAIC0xMzIxLDcgKzEzMjEsNyBAQCBzdGF0aWMgc3RydWN0 IGNvbmZpZ19zdHJpbmcgQ29uZmlndXJlTmFtZXNTdHJpbmdbXSA9CiAJfSwKIAogCXsKLQkJeyJz c2xfY2lwaGVycyIsIENGR0NYVF9JTklULCBTU0xfQ09ORklHLAorCQl7InNzbF9jaXBoZXJzIiwg Q0ZHQ1hUX1JFTE9BRCwgU1NMX0NPTkZJRywKIAkJCSJBbGxvd2VkIFNTTCBjaXBoZXJzLiIsCiAJ CQlDT05GSUdfVkFSX1RZUEVfU1RSSU5HLCBmYWxzZSwgMAogCQl9LApAQCAtMTMzMSw3ICsxMzMx LDcgQEAgc3RhdGljIHN0cnVjdCBjb25maWdfc3RyaW5nIENvbmZpZ3VyZU5hbWVzU3RyaW5nW10g PQogCX0sCiAKIAl7Ci0JCXsic3NsX2VjZGhfY3VydmUiLCBDRkdDWFRfSU5JVCwgU1NMX0NPTkZJ RywKKwkJeyJzc2xfZWNkaF9jdXJ2ZSIsIENGR0NYVF9SRUxPQUQsIFNTTF9DT05GSUcsCiAJCQki VGhlIGN1cnZlIHRvIHVzZSBpbiBFQ0RIIGtleSBleGNoYW5nZS4iLAogCQkJQ09ORklHX1ZBUl9U WVBFX1NUUklORywgZmFsc2UsIDAKIAkJfSwKQEAgLTEzNDEsNyArMTM0MSw3IEBAIHN0YXRpYyBz dHJ1Y3QgY29uZmlnX3N0cmluZyBDb25maWd1cmVOYW1lc1N0cmluZ1tdID0KIAl9LAogCiAJewot CQl7InNzbF9kaF9wYXJhbXNfZmlsZSIsIENGR0NYVF9JTklULCBTU0xfQ09ORklHLAorCQl7InNz bF9kaF9wYXJhbXNfZmlsZSIsIENGR0NYVF9SRUxPQUQsIFNTTF9DT05GSUcsCiAJCQkiUGF0aCB0 byB0aGUgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBjb250YWluZWQgZmlsZSIsCiAJCQlDT05G SUdfVkFSX1RZUEVfU1RSSU5HLCBmYWxzZSwgMAogCQl9LApAQCAtMTM1MSw3ICsxMzUxLDcgQEAg c3RhdGljIHN0cnVjdCBjb25maWdfc3RyaW5nIENvbmZpZ3VyZU5hbWVzU3RyaW5nW10gPQogCX0s CiAKIAl7Ci0JCXsic3NsX3Bhc3NwaHJhc2VfY29tbWFuZCIsIENGR0NYVF9JTklULCBTU0xfQ09O RklHLAorCQl7InNzbF9wYXNzcGhyYXNlX2NvbW1hbmQiLCBDRkdDWFRfUkVMT0FELCBTU0xfQ09O RklHLAogCQkJIlBhdGggdG8gdGhlIERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMgY29udGFpbmVk IGZpbGUiLAogCQkJQ09ORklHX1ZBUl9UWVBFX1NUUklORywgZmFsc2UsIDAKIAkJfSwKZGlmZiAt LWdpdCBhL3NyYy9tYWluL3BncG9vbF9tYWluLmMgYi9zcmMvbWFpbi9wZ3Bvb2xfbWFpbi5jCmlu ZGV4IGJmN2M0NTJlMi4uMGE5YzkyODI2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9wZ3Bvb2xfbWFp bi5jCisrKyBiL3NyYy9tYWluL3BncG9vbF9tYWluLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNs dWRlICJ3YXRjaGRvZy93ZF9saWZlY2hlY2suaCIKICNpbmNsdWRlICJ3YXRjaGRvZy93YXRjaGRv Zy5oIgogI2luY2x1ZGUgInBjcC9wY3Bfd29ya2VyLmgiCisjaW5jbHVkZSAidXRpbHMvcG9vbF9z c2wuaCIKICNpbmNsdWRlIDxncnAuaD4KIAogLyoKQEAgLTM0ODksNiArMzQ5MCwyMiBAQCByZWxv YWRfY29uZmlnKHZvaWQpCiAJaWYgKHBvb2xfY29uZmlnLT5lbmFibGVfcG9vbF9oYmEpCiAJCWxv YWRfaGJhKGhiYV9maWxlKTsKIAorI2lmZGVmIFVTRV9TU0wKKwkvKgorCSAqIElmIFNTTCBpcyBl bmFibGVkLCByZS1pbml0aWFsaXplIHRoZSBTU0wgY29udGV4dCBzbyB0aGF0IG5ldworCSAqIGNv bm5lY3Rpb25zIHBpY2sgdXAgcm90YXRlZCBjZXJ0aWZpY2F0ZXMgd2l0aG91dCByZXF1aXJpbmcg YSByZXN0YXJ0LgorCSAqIFNTTF9TZXJ2ZXJTaWRlX2luaXQoKSBpcyBzYWZlIHRvIGNhbGwgcmVw ZWF0ZWRseTogaXQgZnJlZXMgYW5kIHJlcGxhY2VzCisJICogdGhlIGV4aXN0aW5nIFNTTF9DVFgg b25seSBvbiBzdWNjZXNzLCBsZWF2aW5nIHRoZSBvbGQgY29udGV4dCBpbnRhY3Qgb24KKwkgKiBm YWlsdXJlLgorCSAqLworCWlmIChwb29sX2NvbmZpZy0+c3NsKQorCXsKKwkJZXJlcG9ydChMT0cs CisJCQkJKGVycm1zZygicmVsb2FkIFNTTCBjZXJ0aWZpY2F0ZXMuIikpKTsKKwkJU1NMX1NlcnZl clNpZGVfaW5pdCgpOworCX0KKyNlbmRpZgkJCQkJCQkvKiBVU0VfU1NMICovCisKIAlraWxsX2Fs bF9jaGlsZHJlbihTSUdIVVApOwogfQogCmRpZmYgLS1naXQgYS9zcmMvcHJvdG9jb2wvY2hpbGQu YyBiL3NyYy9wcm90b2NvbC9jaGlsZC5jCmluZGV4IGMzNGYwNTcyOC4uNzEzYmZlMjhmIDEwMDY0 NAotLS0gYS9zcmMvcHJvdG9jb2wvY2hpbGQuYworKysgYi9zcmMvcHJvdG9jb2wvY2hpbGQuYwpA QCAtMTc5Niw2ICsxNzk2LDE3IEBAIGNoZWNrX2NvbmZpZ19yZWxvYWQodm9pZCkKIAkJaWYgKHN0 cmNtcCgiIiwgcG9vbF9jb25maWctPnBvb2xfcGFzc3dkKSkKIAkJCXBvb2xfcmVvcGVuX3Bhc3N3 ZF9maWxlKCk7CiAKKyNpZmRlZiBVU0VfU1NMCisJCS8qCisJCSAqIFJlLWluaXRpYWxpemUgdGhl IGZyb250ZW5kIFNTTCBjb250ZXh0IHNvIHRoaXMgY2hpbGQgcHJvY2VzcworCQkgKiBzZXJ2ZXMg bmV3IGNvbm5lY3Rpb25zIHdpdGggYW55IHJvdGF0ZWQgY2VydGlmaWNhdGVzIHdpdGhvdXQgYQor CQkgKiByZXN0YXJ0LiAgSW4tZmxpZ2h0IFRMUyBzZXNzaW9ucyBhcmUgdW5hZmZlY3RlZDsgdGhl eSBob2xkIGEKKwkJICogZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgb2xkIFNTTCBvYmplY3QuCisJ CSAqLworCQlpZiAocG9vbF9jb25maWctPnNzbCkKKwkJCVNTTF9TZXJ2ZXJTaWRlX2luaXQoKTsK KyNlbmRpZgkJCQkJCS8qIFVTRV9TU0wgKi8KKwogCQlnb3Rfc2lnaHVwID0gMDsKIAl9CiB9CmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL1JFQURN RSBiL3NyYy90ZXN0L3JlZ3Jlc3Npb24vdGVzdHMvMDQyLnNzbF9yZWxvYWQvUkVBRE1FCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uYzczY2YwYmQzCi0tLSAvZGV2L251bGwK KysrIGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9SRUFETUUKQEAg LTAsMCArMSw2IEBACitUaGUgc2FtcGxlIHNlcnZlci5rZXkgYW5kIHNlcnZlci5jcnQgd2FzIGNy ZWF0ZWQgYnkgdXNpbmcgZm9sbG93aW5nIGNvbW1hbmRzOgorCitvcGVuc3NsIHJlcSAtbmV3IC10 ZXh0IC1vdXQgc2VydmVyLnJlcQorb3BlbnNzbCByc2EgLWluIHByaXZrZXkucGVtIC1vdXQgc2Vy dmVyLmtleQorcm0gcHJpdmtleS5wZW0KK29wZW5zc2wgcmVxIC14NTA5IC1kYXlzIDM2NTAgLWlu IHNlcnZlci5yZXEgLXRleHQgLWtleSBzZXJ2ZXIua2V5IC1vdXQgc2VydmVyLmNydApkaWZmIC0t Z2l0IGEvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2ZXIuY3J0 IGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2ZXIuY3J0Cm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMC4uOTBkNWUwOGU3Ci0tLSAvZGV2L251 bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC9zZXJ2ZXIu Y3J0CkBAIC0wLDAgKzEsNzkgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZl cnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjoKKyAgICAgICAgICAgIGY0Ojg2 OjRhOmFhOjUwOjQyOjYzOmRjCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMjU2V2l0aFJT QUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDID0gQVUsIFNUID0gU29tZS1TdGF0ZSwgTyA9 IEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZAorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAg Tm90IEJlZm9yZTogQXVnIDI5IDAyOjUyOjM2IDIwMTggR01UCisgICAgICAgICAgICBOb3QgQWZ0 ZXIgOiBBdWcgMjYgMDI6NTI6MzYgMjAyOCBHTVQKKyAgICAgICAgU3ViamVjdDogQyA9IEFVLCBT VCA9IFNvbWUtU3RhdGUsIE8gPSBJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQKKyAgICAgICAgU3Vi amVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTog cnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIFB1YmxpYy1LZXk6ICgyMDQ4IGJpdCkKKyAg ICAgICAgICAgICAgICBNb2R1bHVzOgorICAgICAgICAgICAgICAgICAgICAwMDpmNDplMzozMDpm MDowOTplMjo0MzowZTphMTo2NzoyZTozYjplZjpiNToKKyAgICAgICAgICAgICAgICAgICAgODg6 MWU6NGU6YTk6MDY6ZmE6ZjI6OTQ6OGI6ZmE6NGY6MGE6OWY6ZTA6NTc6CisgICAgICAgICAgICAg ICAgICAgIDQ1Ojk1OjJjOmMxOjE4OjFkOjIxOjZkOmM4OjVjOjJhOjA1Ojk0OjBiOmM2OgorICAg ICAgICAgICAgICAgICAgICA0OTpjNTo5Nzo4ODphYzo4ODpiYTo3MzpmYjo4MToyODplYjplMTpj ZDo3ZjoKKyAgICAgICAgICAgICAgICAgICAgOWQ6ZmI6ZTA6YzU6MGQ6ZWY6MzU6Y2M6MTI6Yjg6 NzQ6MGI6YTE6ZTk6NjU6CisgICAgICAgICAgICAgICAgICAgIGQ0OjE5OjM4OjliOmE4OmUxOmM1 OmVmOmQ1OmYxOjljOmNmOjhhOmRlOmJmOgorICAgICAgICAgICAgICAgICAgICBmYTpkNzo2Yzpm OTpkNzo4NToxMDpkYjo5ZjplOTowMzplOTo3ZTpmMTo4MToKKyAgICAgICAgICAgICAgICAgICAg ZGU6OWQ6ZjM6YjM6YTM6NmY6MTk6MzE6Yzg6YmI6MzE6YzA6ZTc6N2Q6ZWE6CisgICAgICAgICAg ICAgICAgICAgIDZiOjAyOjk4OjIxOjdjOmMyOmY1OjlkOjBkOjdjOjg1OjJiOjVkOjgxOjdjOgor ICAgICAgICAgICAgICAgICAgICA3MTo3NDo0Mjo4OTphYjo1YzozMTphYzoxOTpmZDpjMjowYjpm YjplNTpjMjoKKyAgICAgICAgICAgICAgICAgICAgYjI6NTQ6MTU6NjQ6NDA6OWM6YmY6ZWQ6ZDI6 YjE6YmI6NzU6Zjk6ZTk6ZDg6CisgICAgICAgICAgICAgICAgICAgIDY3OmIzOjRlOjYzOmM0OjNl OmY0OjhhOjJjOjg3OjUwOjI3OmRkOjIyOjk3OgorICAgICAgICAgICAgICAgICAgICBmMTpmNzoy Njo0OTo4NzowMzo1NTowODphNDpkMjo0NDoyMTplMTo5YTozMzoKKyAgICAgICAgICAgICAgICAg ICAgODI6OTY6MDk6YjM6MDg6NjU6YmM6YTg6M2E6ZjQ6NjQ6ZjM6NjA6NjI6ZDA6CisgICAgICAg ICAgICAgICAgICAgIDk4OmQ5OjgyOjBjOjFiOmJlOmI2OjljOjIyOmU4OjdmOmU2OmViOjIwOmQ5 OgorICAgICAgICAgICAgICAgICAgICA3MTo2NzoyYzpkNToxNDo4MzphYTpmMTozNzo3NTo5ODo0 Yzo2ODoxZDo5NToKKyAgICAgICAgICAgICAgICAgICAgZmU6MWY6ZWM6Y2I6OWI6MTc6OWM6ZjQ6 OTI6MjI6ZGE6YmI6Nzg6NDY6ZjM6CisgICAgICAgICAgICAgICAgICAgIGRlOjdkCisgICAgICAg ICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5z aW9uczoKKyAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKKyAgICAg ICAgICAgICAgICA2ODpFRDpBNzpGRToxRTozNjoyNjoxODo4MDoyQjpDNjpBMjowNzoyMzoxQzpB NDowMDo1NzoxNjo2OAorICAgICAgICAgICAgWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmll cjogCisgICAgICAgICAgICAgICAga2V5aWQ6Njg6RUQ6QTc6RkU6MUU6MzY6MjY6MTg6ODA6MkI6 QzY6QTI6MDc6MjM6MUM6QTQ6MDA6NTc6MTY6NjgKKworICAgICAgICAgICAgWDUwOXYzIEJhc2lj IENvbnN0cmFpbnRzOiBjcml0aWNhbAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWdu YXR1cmUgQWxnb3JpdGhtOiBzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAgZGQ6NjE6 NjI6ODM6NmU6ZmE6ZTg6OGE6MWI6MDI6YzY6OWY6N2Y6ZjM6NTI6Zjg6MDQ6NWM6CisgICAgICAg ICBjOTozNTpmOTo0YzoxZDo0ZjowZjo5Zjo2YzphMjoxODo5NTpmMDo3Njo5MzplNTo5OTo1ODoK KyAgICAgICAgIDRhOjg4OjdhOjU0OjY4OmNmOjI4OjY0OjhlOjAxOjNmOmZiOjdlOjI4OjZmOmFk OmM2OjA4OgorICAgICAgICAgYTI6MDk6Nzc6NGM6MTM6NGI6MWQ6Njg6NzA6Mzg6OTE6ZDQ6ZGM6 Zjc6YzM6Yzg6ODE6MzY6CisgICAgICAgICA0ODpiOTowMTo0NjpmOTpmYTplODpmNzpiYTpmZToy Mzo0YzplMzoyNzphOTo1ODoyZDphNjoKKyAgICAgICAgIDNkOjg4OmFjOmI4OjcxOjliOjg0OmVj OmJkOjgyOmM0OjQ1OjFkOmJhOjc3OmVkOjczOjU0OgorICAgICAgICAgYTk6MTY6NzY6ODA6NDA6 MGI6ODA6NDI6NDc6NjA6ODQ6Y2Y6NDE6ZTA6MGY6OGU6ODU6ZDM6CisgICAgICAgICAyODozNjpm YjpmNjo4YzpmODpjNjoyMDpiMzpjNDowNjpjYzoyZDo2ZDozNzo3ODpiNDpkNToKKyAgICAgICAg IDRkOjE0OmRiOmYwOjA0OjU2OjY2OmQ4OjVhOmNjOmZmOmJkOjBjOjE5OjZkOjM5OmJmOjI2Ogor ICAgICAgICAgYWM6MTc6MGM6OTE6YTQ6Njg6NGI6YmM6ODY6NGY6MGE6MTA6ODE6YjU6YWM6MWU6 YTY6Nzg6CisgICAgICAgICBiMTo3ZjplOTpmMzo5ZToxYjozMjo5MjpiMjo4ZjpmNzplMjphMzph ZTo0NDplMjo5OTpiMDoKKyAgICAgICAgIDA0OjBhOjE1OmViOjdhOjM3OjEwOmIyOjdiOmVmOjM1 OjZjOmE1OmRiOjEzOjk2OjQyOmU5OgorICAgICAgICAgMjI6M2M6NzI6NmE6MzQ6MTY6MGQ6YjU6 MmM6NDk6ZjM6ODM6Yzc6ZmY6ZGE6ZWM6NTc6MTQ6CisgICAgICAgICBhYjowZDo4ZDo3Njo4Zjpm MDphMjoyMTo0Zjo4ODo1NDpiYzoyZjpjNjpiOTo3Yjo4YzpkYToKKyAgICAgICAgIDQyOjlhOmIx OjEyCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURZRENDQWtpZ0F3SUJBZ0lKQVBT R1NxcFFRbVBjTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVV4Q3pBSkJnTlYKK0JBWVRBa0ZWTVJNd0VR WURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0RCaEpiblJsY201bGRDQlgKK2FXUm5h WFJ6SUZCMGVTQk1kR1F3SGhjTk1UZ3dPREk1TURJMU1qTTJXaGNOTWpnd09ESTJNREkxTWpNMldq QkYKK01Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdB MVVFQ2d3WVNXNTAKK1pYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUlCSWpBTkJna3Foa2lH OXcwQkFRRUZBQU9DQVE4QU1JSUIKK0NnS0NBUUVBOU9NdzhBbmlRdzZoWnk0Nzc3V0lIazZwQnZy eWxJdjZUd3FmNEZkRmxTekJHQjBoYmNoY0tnV1UKK0M4Wkp4WmVJcklpNmMvdUJLT3ZoelgrZCsr REZEZTgxekJLNGRBdWg2V1hVR1RpYnFPSEY3OVh4bk0rSzNyLzYKKzEyejUxNFVRMjUvcEErbCs4 WUhlbmZPem8yOFpNY2k3TWNEbmZlcHJBcGdoZk1MMW5RMThoU3RkZ1h4eGRFS0oKK3Exd3hyQm45 d2d2NzVjS3lWQlZrUUp5LzdkS3h1M1g1NmRobnMwNWp4RDcwaWl5SFVDZmRJcGZ4OXlaSmh3TlYK K0NLVFNSQ0hobWpPQ2xnbXpDR1c4cURyMFpQTmdZdENZMllJTUc3NjJuQ0xvZiticklObHhaeXpW RklPcThUZDEKK21FeG9IWlgrSCt6TG14ZWM5SklpMnJ0NFJ2UGVmUUlEQVFBQm8xTXdVVEFkQmdO VkhRNEVGZ1FVYU8ybi9oNDIKK0poaUFLOGFpQnlNY3BBQlhGbWd3SHdZRFZSMGpCQmd3Rm9BVWFP Mm4vaDQySmhpQUs4YWlCeU1jcEFCWEZtZ3cKK0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Fo a2lHOXcwQkFRc0ZBQU9DQVFFQTNXRmlnMjc2NklvYkFzYWYKK2YvTlMrQVJjeVRYNVRCMVBENTlz b2hpVjhIYVQ1WmxZU29oNlZHalBLR1NPQVQvN2ZpaHZyY1lJb2dsM1RCTkwKK0hXaHdPSkhVM1Bm RHlJRTJTTGtCUnZuNjZQZTYvaU5NNHllcFdDMm1QWWlzdUhHYmhPeTlnc1JGSGJwMzdYTlUKK3FS WjJnRUFMZ0VKSFlJVFBRZUFQam9YVEtEYjc5b3o0eGlDenhBYk1MVzAzZUxUVlRSVGI4QVJXWnRo YXpQKzkKK0RCbHRPYjhtckJjTWthUm9TN3lHVHdvUWdiV3NIcVo0c1gvcDg1NGJNcEt5ai9maW82 NUU0cG13QkFvVjYzbzMKK0VMSjc3elZzcGRzVGxrTHBJanh5YWpRV0RiVXNTZk9EeC8vYTdGY1Vx dzJOZG8vd29pRlBpRlM4TDhhNWU0emEKK1FwcXhFZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0t LS0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2Fk L3NlcnZlci5rZXkgYi9zcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL3Nl cnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi4wZGRkNjkzMDMK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVs b2FkL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBL RVktLS0tLQorTUlJRXBRSUJBQUtDQVFFQTlPTXc4QW5pUXc2aFp5NDc3N1dJSGs2cEJ2cnlsSXY2 VHdxZjRGZEZsU3pCR0IwaAorYmNoY0tnV1VDOFpKeFplSXJJaTZjL3VCS092aHpYK2QrK0RGRGU4 MXpCSzRkQXVoNldYVUdUaWJxT0hGNzlYeAorbk0rSzNyLzYxMno1MTRVUTI1L3BBK2wrOFlIZW5m T3pvMjhaTWNpN01jRG5mZXByQXBnaGZNTDFuUTE4aFN0ZAorZ1h4eGRFS0pxMXd4ckJuOXdndjc1 Y0t5VkJWa1FKeS83ZEt4dTNYNTZkaG5zMDVqeEQ3MGlpeUhVQ2ZkSXBmeAorOXlaSmh3TlZDS1RT UkNIaG1qT0NsZ216Q0dXOHFEcjBaUE5nWXRDWTJZSU1HNzYybkNMb2YrYnJJTmx4Wnl6VgorRklP cThUZDFtRXhvSFpYK0grekxteGVjOUpJaTJydDRSdlBlZlFJREFRQUJBb0lCQUQ2RWZhcmFLeHhK Y09VaAoraFlXbHgzRk5UWk9Obno1VEdmenh6bXo4ZXJRaHI4NFRLY1NZSVFkTlUwVktRdTBoeVcr YW5GY2R2eFNPVzZBVgorMDJSSk5xVmZDMUhrK1pnT25EQTBvZGdxZm5xMzRNdGd5QVRyYXgyQXoy NE4wUjYzUnQxNnpvY0VKamRMbTJTaAorb1p1NHNpcm1mdnV0cnF1VG0rd1dvSDMwVzdYVENyZDE3 dGhxOCs1VkJ1bVhMVzRzcjQwUFdYY2ZQQzFPZDdKSAordXRZWjBsR3hyODlmaHVQcG5wTHc3VjY3 RWRzbHdtWWw4YXZoenJVbHprWFBxdWZaMzNYZFdGaS9JWG9Oak1aMgorTUZnWkZOS0h2NjgybnFq cnJvZHluNGlYRXpNU2o0ejRRTFROeG9INzlIV3ZDYjJIalVwRVdUTnJmZHUzTE5DWgorRmFocUht RUNnWUVBLzVNbUVFQjJHTmxoYU1QK05NSy8zeDlSQ2ZEZmxlcUVkRXhmMEtBNlR1SVNOWVVnZUVl QgorZGZjekNOOFd0eHlETW9yNmZ2d0lOeEVBSFg2NC9Db21wRS95YStaMjVWZEJRTWNMcE5WR1Mw MWFEZHJxV041QgorNHFHOE95SzMrZUFqQ252eUN6V3N2dnBLMUk1dTY1cTYrUStDdzF3UWF4WXpo c1prRWF6UTBPa0NnWUVBOVV0OQorbTc0Uk1HdWRqa3ZKSzdKSVBMRExHRXNrbyt5cmg4SXVvR24v d0xwVUp3bWtaRlF1OEhScWRkZE1WandRaTRDTgorSURTY2J2eUgwdUUyeU4rZ2cvQkIwZUJJeWhm ckkzeGw2RkpJUUJuSTAvN3dtYjJVODJPVDBMUzE4aDluOGRBSworK21PTmNSM3pMN1hEZTh4eTFx VFMwampkMVFUMVFTNFlMR1BDeEhVQ2dZRUFvd2Z0Q2dUMDBOa3FhRGhPV3IyNAordzg0b1ZkMFA0 NFFjUmt2Sit6MmF0R05HRmxuNzRuNUt1VU9kakpVeTJsQVg2US82eHpKaTB5M0hFd21aVzFKUQor SUJUWG9iajhNMFE3M2VTYkt1VFoySU5aWk9rM0FNV1c1Y2tpVjk3SDJWLy9PbHJpaGdBUldDbzF2 ZTIyR0JrMgorR0ZhcXBaQis4TERTNGJDQWVUM3lYckVDZ1lFQTVyWjNVU29uTHJ5NWQySk90NXU3 RitKTlUrOHhha0VyWU1oQworWkx6dVFZNi9vZXdPeEJMdUIxbm4zQ2lCYzBhUlpUU25DRmlUbmt4 RlVCSm1IZTlBSVhpejM3d3RtbTkreVdTeQorMFIyN09SZEhiaVlHbFFQY2VrUDVmcjdKdHc3VkRI cmFLSUhFUWxXaUt3aXg4ZG50VlhlM2x1VEh1Umt0dUgycgorWE8wRC94VUNnWUVBbFF0WHlHU2wv dGFVakt5ZnZmeGxGRHRwT3dCQXdVajJDc056ZVVkMi81YVdrcVVydFl6OAorSk5DUGdTTFBLRGhM cGF2SDB2VUVtZnRGM3VEVlB4dk1RNEpHOU1RN21lSGdMN0FabXRLZFUwVkkrQXY5eGlKZQorZDdB MXg2bzg4Z3YxVHF2R1JpdDJxUnhOT1QwbXpoRGNYdVIyRUlRcVVhdjQ1TnlCb2tTbzl4dz0KKy0t LS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNz aW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL3NlcnZlci5yZXEgYi9zcmMvdGVzdC9yZWdyZXNzaW9u L3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL3NlcnZlci5yZXEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwLi5mZGZkNTIzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzaW9uL3Rlc3RzLzA0Mi5zc2xfcmVsb2FkL3NlcnZlci5yZXEKQEAgLTAsMCArMSw2MSBAQAor Q2VydGlmaWNhdGUgUmVxdWVzdDoKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAxICgweDAp CisgICAgICAgIFN1YmplY3Q6IEMgPSBBVSwgU1QgPSBTb21lLVN0YXRlLCBPID0gSW50ZXJuZXQg V2lkZ2l0cyBQdHkgTHRkCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAg ICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgICAg ICBQdWJsaWMtS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAg ICAgICAgICAgICAgICAgMDA6ZjQ6ZTM6MzA6ZjA6MDk6ZTI6NDM6MGU6YTE6Njc6MmU6M2I6ZWY6 YjU6CisgICAgICAgICAgICAgICAgICAgIDg4OjFlOjRlOmE5OjA2OmZhOmYyOjk0OjhiOmZhOjRm OjBhOjlmOmUwOjU3OgorICAgICAgICAgICAgICAgICAgICA0NTo5NToyYzpjMToxODoxZDoyMTo2 ZDpjODo1YzoyYTowNTo5NDowYjpjNjoKKyAgICAgICAgICAgICAgICAgICAgNDk6YzU6OTc6ODg6 YWM6ODg6YmE6NzM6ZmI6ODE6Mjg6ZWI6ZTE6Y2Q6N2Y6CisgICAgICAgICAgICAgICAgICAgIDlk OmZiOmUwOmM1OjBkOmVmOjM1OmNjOjEyOmI4Ojc0OjBiOmExOmU5OjY1OgorICAgICAgICAgICAg ICAgICAgICBkNDoxOTozODo5YjphODplMTpjNTplZjpkNTpmMTo5YzpjZjo4YTpkZTpiZjoKKyAg ICAgICAgICAgICAgICAgICAgZmE6ZDc6NmM6Zjk6ZDc6ODU6MTA6ZGI6OWY6ZTk6MDM6ZTk6N2U6 ZjE6ODE6CisgICAgICAgICAgICAgICAgICAgIGRlOjlkOmYzOmIzOmEzOjZmOjE5OjMxOmM4OmJi OjMxOmMwOmU3OjdkOmVhOgorICAgICAgICAgICAgICAgICAgICA2YjowMjo5ODoyMTo3YzpjMjpm NTo5ZDowZDo3Yzo4NToyYjo1ZDo4MTo3YzoKKyAgICAgICAgICAgICAgICAgICAgNzE6NzQ6NDI6 ODk6YWI6NWM6MzE6YWM6MTk6ZmQ6YzI6MGI6ZmI6ZTU6YzI6CisgICAgICAgICAgICAgICAgICAg IGIyOjU0OjE1OjY0OjQwOjljOmJmOmVkOmQyOmIxOmJiOjc1OmY5OmU5OmQ4OgorICAgICAgICAg ICAgICAgICAgICA2NzpiMzo0ZTo2MzpjNDozZTpmNDo4YToyYzo4Nzo1MDoyNzpkZDoyMjo5NzoK KyAgICAgICAgICAgICAgICAgICAgZjE6Zjc6MjY6NDk6ODc6MDM6NTU6MDg6YTQ6ZDI6NDQ6MjE6 ZTE6OWE6MzM6CisgICAgICAgICAgICAgICAgICAgIDgyOjk2OjA5OmIzOjA4OjY1OmJjOmE4OjNh OmY0OjY0OmYzOjYwOjYyOmQwOgorICAgICAgICAgICAgICAgICAgICA5ODpkOTo4MjowYzoxYjpi ZTpiNjo5YzoyMjplODo3ZjplNjplYjoyMDpkOToKKyAgICAgICAgICAgICAgICAgICAgNzE6Njc6 MmM6ZDU6MTQ6ODM6YWE6ZjE6Mzc6NzU6OTg6NGM6Njg6MWQ6OTU6CisgICAgICAgICAgICAgICAg ICAgIGZlOjFmOmVjOmNiOjliOjE3OjljOmY0OjkyOjIyOmRhOmJiOjc4OjQ2OmYzOgorICAgICAg ICAgICAgICAgICAgICBkZTo3ZAorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgx MDAwMSkKKyAgICAgICAgQXR0cmlidXRlczoKKyAgICAgICAgICAgIGEwOjAwCisgICAgU2lnbmF0 dXJlIEFsZ29yaXRobTogc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDdhOjMwOjY5 OjZjOmFhOjMwOjZmOmYzOmJjOmRjOjg1Ojc4OjA0OmVmOmY2OjBjOmIyOjA0OgorICAgICAgICAg ZTc6MDM6NTU6ZmQ6NGE6OTg6NzQ6ZDY6ZmQ6MjQ6YTE6ZTk6ZTg6M2Q6ZTM6YTE6YjA6ZGM6Cisg ICAgICAgICAxMjpiOToxZjozODpmZTo5ZTo0Mjo1YTowYzowNjpiODowYzpmNjo2NTowYjo3ODo5 NTo3MzoKKyAgICAgICAgIDI3OjMxOjE0OmU1OjRkOjRmOmUyOjgyOjNmOjUyOjI0OjQ1OmJhOjMx OmU3Ojg3OmI3OmM4OgorICAgICAgICAgYjk6OGE6ZGI6NWY6NWU6ZmQ6MWE6ZjI6NmM6N2Q6ZDY6 ZDE6MWQ6MTk6Nzc6NWU6MTA6NTE6CisgICAgICAgICBkMzoyNDo3Zjo1YTo3ZDozZjplYjpkYjoz MzowYjoyNzo5Nzo3MjpiOTpmMDplYTo4OTo3OToKKyAgICAgICAgIGNhOmI3OjIzOjdjOmMwOjhh OmU5OjExOjMwOjQ1Ojk5OjA5OjU4OmRhOjA4Ojg2OjI4OjMyOgorICAgICAgICAgMjE6YzA6M2Y6 MmU6ODc6M2U6YTQ6OTY6NTU6ZjE6NjU6NzI6NGY6MDY6MGI6YjM6YTE6OTc6CisgICAgICAgICA3 ZDo1NDo2YzowZDo5NjpiNDo0MToxMTo2ZToyODo0NTpjYjoxNjpkNzoxZTo3MDoxZTphODoKKyAg ICAgICAgIGEyOjRlOjdmOjY1OjhlOjcxOmU5OjA1OmUyOmFkOmNjOjlhOjc5OjFkOjczOjM5OmU4 OmYwOgorICAgICAgICAgZTg6ZjM6NzU6YWI6YmY6OWQ6NDQ6N2I6Yjc6NzY6M2Y6MGQ6NTA6ZTA6 OWM6ZWY6MmM6ZDU6CisgICAgICAgICBlYjpjMzowZDo0ZjpjMTo3NzphZjo1Njo3ZTo3ODpkYjpl ODphMDo1MjowNTpmNjo0OTo4OToKKyAgICAgICAgIGFiOmMwOmZmOmQ2Ojk3OjlkOjlkOjg0OjE0 OjEyOjczOmVlOjMxOjFkOjEyOmFkOmU3OjkxOgorICAgICAgICAgOGQ6YWM6ZmY6ZWU6OGQ6MTg6 MDc6YmU6Yzg6ZWM6NTc6OWQ6Nzg6NDE6OWM6MWU6YTE6NzU6CisgICAgICAgICAyYjo5OTpmNzo3 MAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KK01JSUNpakNDQVhJQ0FRQXdS VEVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnTUNsTnZiV1V0VTNSaGRHVXgKK0lUQWZCZ05W QkFvTUdFbHVkR1Z5Ym1WMElGZHBaR2RwZEhNZ1VIUjVJRXgwWkRDQ0FTSXdEUVlKS29aSWh2Y04K K0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFQVGpNUEFKNGtNT29XY3VPKysxaUI1T3FRYjY4cFNM K2s4S24rQlgKK1JaVXN3UmdkSVczSVhDb0ZsQXZHU2NXWGlLeUl1blA3Z1NqcjRjMS9uZnZneFEz dk5jd1N1SFFMb2VsbDFCazQKK202amh4ZS9WOFp6UGl0Ni8rdGRzK2RlRkVOdWY2UVBwZnZHQjNw M3pzNk52R1RISXV6SEE1MzNxYXdLWUlYekMKKzlaME5mSVVyWFlGOGNYUkNpYXRjTWF3Wi9jSUwr K1hDc2xRVlpFQ2N2KzNTc2J0MStlbllaN05PWThRKzlJb3MKK2gxQW4zU0tYOGZjbVNZY0RWUWlr MGtRaDRab3pncFlKc3dobHZLZzY5R1R6WUdMUW1ObUNEQnUrdHB3aTZIL20KKzZ5RFpjV2NzMVJT RHF2RTNkWmhNYUIyVi9oL3N5NXNYblBTU0l0cTdlRWJ6M24wQ0F3RUFBYUFBTUEwR0NTcUcKK1NJ YjNEUUVCQ3dVQUE0SUJBUUI2TUdsc3FqQnY4N3pjaFhnRTcvWU1zZ1RuQTFYOVNwaDAxdjBrb2Vu b1BlT2gKK3NOd1N1Ujg0L3A1Q1dnd0d1QXoyWlF0NGxYTW5NUlRsVFUvaWdqOVNKRVc2TWVlSHQ4 aTVpdHRmWHYwYThteDkKKzF0RWRHWGRlRUZIVEpIOWFmVC9yMnpNTEo1ZHl1ZkRxaVhuS3R5Tjh3 SXJwRVRCRm1RbFkyZ2lHS0RJaHdEOHUKK2h6NmtsbFh4WlhKUEJndXpvWmQ5Vkd3TmxyUkJFVzRv UmNzVzF4NXdIcWlpVG45bGpuSHBCZUt0ekpwNUhYTTUKKzZQRG84M1dydjUxRWU3ZDJQdzFRNEp6 dkxOWHJ3dzFQd1hldlZuNTQyK2lnVWdYMlNZbXJ3UC9XbDUyZGhCUVMKK2MrNHhIUkt0NTVHTnJQ L3VqUmdIdnNqc1Y1MTRRWndlb1hVcm1mZHcKKy0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1Qt LS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9h ZC90ZXN0LnNoIGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC90ZXN0 LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMC4uMzAyMjE2ODc4Ci0tLSAv ZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvcmVncmVzc2lvbi90ZXN0cy8wNDIuc3NsX3JlbG9hZC90 ZXN0LnNoCkBAIC0wLDAgKzEsMjkwIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIyB0ZXN0IHNjcmlwdCBmb3IgU1NMIGNvbm5lY3Rpb24gdXBvbiByZWxvYWRpbmcgZm9yOiBm cm9udGVuZCA8LS0+IFBncG9vbC1JSSBhbmQgUGdwb29sLUlJIGFuZCBQb3N0Z3JlU1FMLgorIwor c291cmNlICRURVNUTElCUworVEVTVERJUj10ZXN0ZGlyCitQU1FMPSRQR0JJTi9wc3FsCitQR19D VEw9JFBHQklOL3BnX2N0bAorZXhwb3J0IFBHREFUQUJBU0U9dGVzdAorU1NMX0tFWT1zZXJ2ZXIu a2V5CitTU0xfQ1JUPXNlcnZlci5jcnQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgcHNxbCBvdXRwdXQgZm9yIFxjb25uaW5mbyB0byBzZWUg aWYgU1NMIGVuYWJsZWQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCitmdW5jdGlvbiBjaGVja19zc2wgeworICAgICRQU1FMIC1oIGxvY2FsaG9zdCB0ZXN0IDw8 RU9GID4gcmVzdWx0CitcY29ubmluZm8KK1xxCitFT0YKKworICAgICMgUG9zdGdyZVNRTCAxOCBv ciBsYXRlciBwcmludHMgdGFibHVsYXIgb3V0cHV0IGZvciBcY29ubmluZm8uCisgICAgIyBGb3Ig U1NMLCAiU1NMIENvbm5lY3Rpb24gfCB0cnVlIChvciBmYWxzZSkiCisgICAgaWYgWyAkUEdWRVJT SU9OIC1nZSAxOCBdO3RoZW4KKwlncmVwICJTU0wgQ29ubmVjdGlvbiIgcmVzdWx0fGdyZXAgdHJ1 ZQorICAgIGVsc2UKKwlncmVwIFNTTCByZXN1bHQKKyAgICBmaQorfQorCisjIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBU ZXN0IHNzbCBjb25maWd1cmF0aW9uIHBhcmFtLgorIyBwYXJhbXM6CisjICQxOiBjb25maWd1cmF0 aW9uIG5hbWUuIGUuZy4gc3NsX2NlcnQKKyMgJDI6IGdvb2QgdmFsdWUgZm9yIHRoZSBjb25maWcK KyMKKyMgVGhpcyBwZXJmb3JtcyBmb2xsb3dpbmcgdGVzdHM6CisjIDEuIFNldCBiYWQgdmFsdWUg dG8gdGhlIGNvbmZpZyBhbmQgcmVzdGFydCBwZ3Bvb2wgdG8gbWFrZSBzdXJlIFNTTCBjb25uZWN0 aW9uIGRvZXMgbm90IGVzdGFibGlzaC4KKyMgMi4gU2V0IGdvb2QgdmFsdWUgdG8gdGhlIGNvbmZp ZyBhbmQgcmVsb2FkIHRvIG1ha2Ugc3VyZSBTU0wgY29ubmVjdGlvbiBlc3RhYmxpc2hlcy4KKyMg SWYgdGVzdCBmYWlscywgZXhpdCB3aXRoIHN0YXR1cyAxCitmdW5jdGlvbiB0ZXN0X3NzbCB7Cisg ICAgIyBzZXQgYmFkIHZhbHVlCisgICAgZWNobyAiJDEgPSAnYmFkX3ZhbHVlJyIgPj4gZXRjL3Bn cG9vbC5jb25mCisgICAgIyByZXN0YXJ0IHBncG9vbAorICAgIC4vc3RhcnRhbGwKKyAgICB3YWl0 X2Zvcl9wZ3Bvb2xfc3RhcnR1cAorICAgIGNoZWNrX3NzbAorICAgIGlmIFsgJD8gPSAwIF07dGhl bgorCWVjaG8gIkNoZWNraW5nIFNTTCBjb25uZWN0aW9uIGJldHdlZW4gZnJvbnRlbmQgYW5kIFBn cG9vbC1JSSBzdWNjZWVkZWQgZGVzcGl0ZSBiYWQgY29uZmlnIHZhbHVlIGZvciAkMSIKKwkuL3No dXRkb3duYWxsCisJZXhpdCAxCisgICAgZmkKKyAgICBlY2hvICJDaGVja2luZyBTU0wgY29ubmVj dGlvbiBiZXR3ZWVuIGZyb250ZW5kIGFuZCBQZ3Bvb2wtSUkgZmFpbGVkIGR1ZSB0byBiYWQgY29u ZmlnIHZhbHVlIGZvciAkMSBhcyBleHBlY3RlZC4iCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IFNT TCBjb25uZWN0aW9uIHN1Y2NlZWRzIHdpdGggZ29vZCBjb25maWcgdmFsdWUKKyAgICBlY2hvICIk MSA9ICckMiciID4+IGV0Yy9wZ3Bvb2wuY29uZgorICAgIC4vcGdwb29sX3JlbG9hZAorICAgIHNs ZWVwIDEKKyAgICBjaGVja19zc2wKKyAgICBpZiBbICQ/ID0gMCBdO3RoZW4KKwllY2hvICJDaGVj a2luZyBTU0wgY29ubmVjdGlvbiBiZXR3ZWVuIGZyb250ZW5kIGFuZCBQZ3Bvb2wtSUkgc3VjY2Vl ZGVkIHdpdGggZ29vZCAkMSIKKyAgICBlbHNlCisJZWNobyAiQ2hlY2tpbmcgU1NMIGNvbm5lY3Rp b24gYmV0d2VlbiBmcm9udGVuZCBhbmQgUGdwb29sLUlJIGZhaWxlZCB3aXRoIGdvb2QgJDEiCisJ Li9zaHV0ZG93bmFsbAorCWV4aXQgMQorICAgIGZpCisgICAgLi9zaHV0ZG93bmFsbAorfQorCisj IG1haW4gc2NyaXB0IHN0YXJ0cyBoZXJlCitybSAtZnIgJFRFU1RESVIKK21rZGlyICRURVNURElS CitjZCAkVEVTVERJUgorCisjIGNyZWF0ZSB0ZXN0IGVudmlyb25tZW50LiBOdW1iZXIgb2YgYmFj a2VuZCBub2RlIGlzIDEgaXMgZW5vdWdoLgorZWNobyAtbiAiY3JlYXRpbmcgdGVzdCBlbnZpcm9u bWVudC4uLiIKKyRQR1BPT0xfU0VUVVAgLW0gcyAtbiAxIHx8IGV4aXQgMQorZWNobyAiZG9uZS4i CisKKyMgc2V0dXAgU1NMIGtleSBhbmQgY3J0IGZpbGUKK2NwIC1wIC4uLyRTU0xfS0VZIGV0Yy8K K2NobW9kIG9nLXJ3eCBldGMvJFNTTF9LRVkKK2NwIC1wIC4uLyRTU0xfQ1JUIGV0Yy8KK2NwIC1w IC4uLyRTU0xfS0VZIGRhdGEwLworY2htb2Qgb2ctcnd4IGRhdGEwLyRTU0xfS0VZCitjcCAtcCAu Li8kU1NMX0NSVCBkYXRhMC8KKworIyBlbmFibGUgU1NMIHN1cHBvcnQKK2Rpcj1gcHdkYAorCitl Y2hvICJzc2wgPSBvbiIgPj4gZXRjL3BncG9vbC5jb25mCitlY2hvICJzc2xfa2V5ID0gJyRTU0xf S0VZJyIgPj4gZXRjL3BncG9vbC5jb25mCitlY2hvICJzc2xfY2VydCA9ICckU1NMX0NSVCciID4+ IGV0Yy9wZ3Bvb2wuY29uZgorZWNobyAic3NsX3ByZWZlcl9zZXJ2ZXJfY2lwaGVycyA9IG9uIiA+ PiBldGMvcGdwb29sLmNvbmYKK2VjaG8gInNzbF9jaXBoZXJzID0gJ0VFQ0RIOkhJR0g6TUVESVVN OiszREVTOiFhTlVMTCciID4+IGV0Yy9wZ3Bvb2wuY29uZgorCitlY2hvICJzc2wgPSBvbiIgPj4g ZGF0YTAvcG9zdGdyZXNxbC5jb25mCitlY2hvICJzc2xfY2VydF9maWxlID0gJyRTU0xfQ1JUJyIg Pj4gZGF0YTAvcG9zdGdyZXNxbC5jb25mCitlY2hvICJzc2xfa2V5X2ZpbGUgPSAnJFNTTF9LRVkn IiA+PiBkYXRhMC9wb3N0Z3Jlc3FsLmNvbmYKKworIyBiYWNrZW5kIG11c3QgYmUgY29ubmVjdGVk IHZpYSBUQ1AvSVAKK2VjaG8gImJhY2tlbmRfaG9zdG5hbWUwID0gJ2xvY2FsaG9zdCciID4+IGV0 Yy9wZ3Bvb2wuY29uZgorCisjIHByb2R1Y2UgZGVidWcgbWVzc2FnZSBzaW5jZSB0aGUgb25seSB3 YXkgdG8gY29uZmlybSB0aGUgU1NMCisjIGNvbm5lY3Rpb25zIGlzIGJlaW5nIGVzdGFibGlzaGVk IGlzLCBsb29rIGludG8gdGhlIGRlYnVnIGxvZy4KK2VjaG8gImxvZ19taW5fbWVzc2FnZXMgPSBk ZWJ1ZzUiID4+IGV0Yy9wZ3Bvb2wuY29uZgorCisjIGFsbG93IHRvIGFjY2VzcyBJUHY2IGxvY2Fs aG9zdAorZWNobyAiaG9zdCAgICBhbGwgICAgICAgICAgICAgYWxsICAgICAgICAgICAgIDo6MS8x MjggICAgICAgICAgICAgICAgIHRydXN0IiA+PiBkYXRhMC9wZ19oYmEuY29uZgorCitzb3VyY2Ug Li9iYXNocmMucG9ydHMKKworLi9zdGFydGFsbAorCitleHBvcnQgUEdQT1JUPSRQR1BPT0xfUE9S VAorCit3YWl0X2Zvcl9wZ3Bvb2xfc3RhcnR1cAorCisjIGZpcnN0LCBjaGVja2luZyBmcm9udGVu ZDwtLT5QZ3Bvb2wtSUkuLi4KK2NoZWNrX3NzbAoraWYgWyAkPyAhPSAwIF07dGhlbgorICAgIGVj aG8gIkNoZWNraW5nIFNTTCBjb25uZWN0aW9uIGJldHdlZW4gZnJvbnRlbmQgYW5kIFBncG9vbC1J SSBmYWlsZWQuIgorICAgIC4vc2h1dGRvd25hbGwKKyAgICBleGl0IDEKK2ZpCitlY2hvICJDaGVj a2luZyBTU0wgY29ubmVjdGlvbiBiZXR3ZWVuIGZyb250ZW5kIGFuZCBQZ3Bvb2wtSUkgd2FzIG9r LiIKKworaWYgWyAkUEdWRVJTSU9OIC1nZSAxOCBdO3RoZW4KKyAgICBncmVwICJTU0wgUHJvdG9j b2wiIHJlc3VsdHxncmVwIFRMU3YxLjIKK2Vsc2UKKyAgICBncmVwIFNTTCByZXN1bHQgfGdyZXAg VExTdjEuMgorZmkKKworIyBpZiBTU2wgcHJvdG9jb2wgdmVyc2lvbiBUTFN2MS4yCitpZiBbICQ/ ID0gMCBdO3RoZW4KKyAgICBncmVwIFNTTCByZXN1bHQgfGdyZXAgRUNESAorCisgICAgaWYgWyAk PyAhPSAwIF07dGhlbgorICAgICAgICBlY2hvICJDaGVja2luZyBTU0wgY29ubmVjdGlvbiB3aXRo IEVDREggYmV0d2VlbiBmcm9udGVuZCBhbmQgUGdwb29sLUlJIGZhaWxlZC4iCisgICAgICAgIC4v c2h1dGRvd25hbGwKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKwllY2hvICJDaGVja2luZyBTU0wg Y29ubmVjdGlvbiB3aXRoIEVDREggYmV0d2VlbiBmcm9udGVuZCBhbmQgUGdwb29sLUlJIHdhcyBv ay4iCitmaQorCitncmVwICJjbGllbnQtPnNlcnZlciBTU0wgcmVzcG9uc2U6IFMiIGxvZy9wZ3Bv b2wubG9nID4vZGV2L251bGwKK2lmIFsgJD8gIT0gMCBdO3RoZW4KKyAgICBlY2hvICJDaGVja2lu ZyBTU0wgY29ubmVjdGlvbiBiZXR3ZWVuIFBncG9vbC1JSSBhbmQgYmFja2VuZCBmYWlsZWQuIgor ICAgIC4vc2h1dGRvd25hbGwKKyAgICBleGl0IDEKK2ZpCitlY2hvICJDaGVja2luZyBTU0wgY29u bmVjdGlvbiBiZXR3ZWVuIFBncG9vbC1JSSBhbmQgYmFja2VuZCB3YXMgb2suIgorCisjIFNvIGZh ciBTU0wgY29ubmVjdGlvbiBiZXR3ZWVuIGNsaWVudHMgYW5kIFBncG9vbC1JSSwgUGdwb29sLUlJ IGFuZCBiYWNrZW5kIGFyZSBvay4KKworLi9zaHV0ZG93bmFsbAorCisjIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0 IFNTTCBwYXJhbXMKKworY29uZmlnX25hbWVzWzBdPXNzbF9jZXJ0Citjb25maWdfbmFtZXNbMV09 c3NsX2NpcGhlcnMKK2NvbmZpZ19uYW1lc1syXT1zc2xfY3JsX2ZpbGUKK2NvbmZpZ19uYW1lc1sz XT1zc2xfZGhfcGFyYW1zX2ZpbGUJIyBzc2xfZGhfcGFyYW1zX2ZpbGUgY2FuIGJlIGEgaW52YWxp ZCBmaWxlIChmYWxsYmFjayBtZWNoYW5pc20pCitjb25maWdfbmFtZXNbNF09c3NsX2VjZGhfY3Vy dmUKK2NvbmZpZ19uYW1lc1s1XT1zc2xfa2V5Citjb25maWdfbmFtZXNbNl09c3NsX3Bhc3NwaHJh c2VfY29tbWFuZAkjIGNlcnQgZG9lcyBub3QgcmVxdWlyZSBwYXNzIHBhc3NwaHJhc2UKK2NvbmZp Z19uYW1lc1s3XT1zc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzCSMgdGhpcyBhZmZlY3RzIHNlcnZl ciBzaWRlIGNpcGhlcnMKKworZ29vZF92YWx1ZXNbMF09c2VydmVyLmNydAorZ29vZF92YWx1ZXNb MV09SElHSDpNRURJVU06KzNERVM6IWFOVUxMCitnb29kX3ZhbHVlc1syXT0iIgorZ29vZF92YWx1 ZXNbM109c2tpcAorZ29vZF92YWx1ZXNbNF09cHJpbWUyNTZ2MQorZ29vZF92YWx1ZXNbNV09c2Vy dmVyLmtleQorZ29vZF92YWx1ZXNbNl09c2tpcAorZ29vZF92YWx1ZXNbN109c2tpcAorCitmb3Ig aSBpbiB7MC4uN30KK2RvCisgICAgZWNobyAiPT09PT0gJHtjb25maWdfbmFtZXNbJGldfSA9PT09 PSIKKyAgICBpZiBbICIke2dvb2RfdmFsdWVzWyRpXX0iID0gInNraXAiIF07dGhlbgorCWVjaG8g InNraXAgdGhpcyB0ZXN0IgorICAgIGVsc2UKKwl0ZXN0X3NzbCAke2NvbmZpZ19uYW1lc1skaV19 ICR7Z29vZF92YWx1ZXNbJGldfQorICAgIGZpCitkb25lCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3QgNDog c3NsX2NhX2NlcnQgc3dhcCDigJMgY2xpZW50IGNlcnQgcmVqZWN0ZWQgYWZ0ZXIgQ0Egcm90YXRp b24KKyMKKyMgMS4gVHdvIGluZGVwZW5kZW50IHNlbGYtc2lnbmVkIENBcyBhcmUgZ2VuZXJhdGVk IChDQSAjMSAvIENBICMyKS4KKyMgMi4gQSBjbGllbnQgY2VydGlmaWNhdGUgaXMgc2lnbmVkIHdp dGggQ0EgIzEuCisjIDMuIHBncG9vbCBzdGFydHMgdHJ1c3RpbmcgQ0EgIzEgd2l0aCBwb29sX2hi YS5jb25mIHNldCB0byByZXF1aXJlCisjICAgIGNsaWVudC1jZXJ0aWZpY2F0ZSBhdXRoZW50aWNh dGlvbiAoY2VydCBtZXRob2QpLgorIyA0LiBWZXJpZnkgdGhlIENBMS1zaWduZWQgY2xpZW50IGNl cnQgaXMgYWNjZXB0ZWQuCisjIDUuIFJlbG9hZCBwZ3Bvb2wgd2l0aCBzc2xfY2FfY2VydCBwb2lu dGluZyBhdCBDQSAjMi4KKyMgNi4gVmVyaWZ5IHRoZSBzYW1lIGNsaWVudCBjZXJ0IGlzIG5vdyBy ZWplY3RlZCBiZWNhdXNlIGl0cyBpc3N1ZXIKKyMgICAgKENBICMxKSBpcyBubyBsb25nZXIgdHJ1 c3RlZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCitlY2hvICI9PT09PSBzc2xfY2FfY2VydCBzd2FwIChjbGllbnQgY2Vy dCBhdXRoIHJlbG9hZCkgPT09PT0iCisKK0NBRElSPWBwd2RgL2NhdGVzdAorbWtkaXIgLXAgIiRD QURJUiIKKworb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtZGF5cyAzNjUwIC1ub2RlcyBcCisgICAg LXN1YmogIi9DTj1UZXN0Q0ExIiBcCisgICAgLWtleW91dCAiJENBRElSL2NhMS5rZXkiIC1vdXQg IiRDQURJUi9jYTEuY3J0IiAyPi9kZXYvbnVsbAorCitvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1k YXlzIDM2NTAgLW5vZGVzIFwKKyAgICAtc3ViaiAiL0NOPVRlc3RDQTIiIFwKKyAgICAta2V5b3V0 ICIkQ0FESVIvY2EyLmtleSIgLW91dCAiJENBRElSL2NhMi5jcnQiIDI+L2Rldi9udWxsCisKK29w ZW5zc2wgcmVxIC1uZXcgLW5vZGVzIFwKKyAgICAtc3ViaiAiL0NOPXNzbHRlc3QiIFwKKyAgICAt a2V5b3V0ICIkQ0FESVIvY2xpZW50LmtleSIgLW91dCAiJENBRElSL2NsaWVudC5jc3IiIDI+L2Rl di9udWxsCitvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzNjUwIFwKKyAgICAtQ0EgIiRDQURJUi9j YTEuY3J0IiAtQ0FrZXkgIiRDQURJUi9jYTEua2V5IiAtQ0FjcmVhdGVzZXJpYWwgXAorICAgIC1p biAiJENBRElSL2NsaWVudC5jc3IiIC1vdXQgIiRDQURJUi9jbGllbnQuY3J0IiAyPi9kZXYvbnVs bAorY2htb2QgNjAwICIkQ0FESVIvY2xpZW50LmtleSIKKworIyBHZW5lcmF0ZSBhIGRlZGljYXRl ZCBzZXJ2ZXIgQ0EgYW5kIGEgbmV3IGJhY2tlbmQgY2VydCAod2l0aCBTQU4gZm9yIGxvY2FsaG9z dCkKKyMgc2lnbmVkIGJ5IGl0LiAgVGhpcyBDQSBpcyBzdGFibGUgYWNyb3NzIHRoZSB0d28gcmVs b2FkIHBoYXNlcyBzbyBwZ3Bvb2wgY2FuCisjIGFsd2F5cyB2ZXJpZnkgdGhlIGJhY2tlbmQsIHdo aWxlIGNhMS9jYTIgYXJlIHN3YXBwZWQgdG8gY29udHJvbCBjbGllbnQtY2VydAorIyB0cnVzdC4g IGNhMS5jcnQgYW5kIGNhMi5jcnQgYXJlIHVzZWQgb25seSBmb3IgY2xpZW50LWNlcnRpZmljYXRl IGF1dGguCitvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1kYXlzIDM2NTAgLW5vZGVzIFwKKyAgICAt c3ViaiAiL0NOPVRlc3RTZXJ2ZXJDQSIgXAorICAgIC1rZXlvdXQgIiRDQURJUi9zZXJ2ZXJfY2Eu a2V5IiAtb3V0ICIkQ0FESVIvc2VydmVyX2NhLmNydCIgMj4vZGV2L251bGwKKworb3BlbnNzbCBy ZXEgLW5ldyAtbm9kZXMgXAorICAgIC1zdWJqICIvQ049bG9jYWxob3N0IiBcCisgICAgLWFkZGV4 dCAic3ViamVjdEFsdE5hbWU9RE5TOmxvY2FsaG9zdCxJUDoxMjcuMC4wLjEiIFwKKyAgICAta2V5 b3V0ICIkQ0FESVIvYmFja2VuZC5rZXkiIC1vdXQgIiRDQURJUi9iYWNrZW5kLmNzciIgMj4vZGV2 L251bGwKK29wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDM2NTAgXAorICAgIC1DQSAiJENBRElSL3Nl cnZlcl9jYS5jcnQiIC1DQWtleSAiJENBRElSL3NlcnZlcl9jYS5rZXkiIC1DQWNyZWF0ZXNlcmlh bCBcCisgICAgLWV4dGZpbGUgPChlY2hvICJzdWJqZWN0QWx0TmFtZT1ETlM6bG9jYWxob3N0LElQ OjEyNy4wLjAuMSIpIFwKKyAgICAtaW4gIiRDQURJUi9iYWNrZW5kLmNzciIgLW91dCAiJENBRElS L2JhY2tlbmQuY3J0IiAyPi9kZXYvbnVsbAorY2htb2QgNjAwICIkQ0FESVIvYmFja2VuZC5rZXki CisKKyMgUmVwbGFjZSB0aGUgc3RhdGljIHNlcnZlci5jcnQvc2VydmVyLmtleSB3aXRoIHRoZSBu ZXcgQ0Etc2lnbmVkIGNlcnQgc28gdGhhdAorIyBib3RoIHBncG9vbCAoZnJvbnRlbmQgU1NMKSBh bmQgUG9zdGdyZVNRTCAoYmFja2VuZCBTU0wpIHVzZSBpdC4KK2NwICIkQ0FESVIvYmFja2VuZC5j cnQiIGV0Yy8kU1NMX0NSVAorY3AgIiRDQURJUi9iYWNrZW5kLmtleSIgZXRjLyRTU0xfS0VZCitj aG1vZCBvZy1yd3ggZXRjLyRTU0xfS0VZCitjcCAiJENBRElSL2JhY2tlbmQuY3J0IiBkYXRhMC8k U1NMX0NSVAorY3AgIiRDQURJUi9iYWNrZW5kLmtleSIgZGF0YTAvJFNTTF9LRVkKK2NobW9kIG9n LXJ3eCBkYXRhMC8kU1NMX0tFWQorCisjIENBIGJ1bmRsZXM6IHNlcnZlcl9jYSAodmVyaWZpZXMg YmFja2VuZCkgKyBjbGllbnQgQ0EgKHZlcmlmaWVzIGNsaWVudCBjZXJ0KS4KK2NhdCAiJENBRElS L3NlcnZlcl9jYS5jcnQiICIkQ0FESVIvY2ExLmNydCIgPiAiJENBRElSL2NvbWJpbmVkX2NhMS5j cnQiCitjYXQgIiRDQURJUi9zZXJ2ZXJfY2EuY3J0IiAiJENBRElSL2NhMi5jcnQiID4gIiRDQURJ Ui9jb21iaW5lZF9jYTIuY3J0IgorCitlY2hvICJzc2xfY2FfY2VydCA9ICckQ0FESVIvY29tYmlu ZWRfY2ExLmNydCciID4+IGV0Yy9wZ3Bvb2wuY29uZgorZWNobyAiZW5hYmxlX3Bvb2xfaGJhID0g b24iID4+IGV0Yy9wZ3Bvb2wuY29uZgorY2F0ID4+IGV0Yy9wb29sX2hiYS5jb25mIDw8J0hCQScK K2hvc3Rzc2wgYWxsIHNzbHRlc3QgMTI3LjAuMC4xLzMyIGNlcnQKK2hvc3Rzc2wgYWxsIHNzbHRl c3QgOjoxLzEyOCBjZXJ0CitIQkEKKworLi9zdGFydGFsbAord2FpdF9mb3JfcGdwb29sX3N0YXJ0 dXAKKworJFBTUUwgLWggbG9jYWxob3N0IC1wICRQR1BPT0xfUE9SVCB0ZXN0IC1jICJDUkVBVEUg Uk9MRSBzc2x0ZXN0IExPR0lOIiAyPi9kZXYvbnVsbCB8fDoKKworUEdTU0xNT0RFPXJlcXVpcmUg UEdTU0xDRVJUPSIkQ0FESVIvY2xpZW50LmNydCIgUEdTU0xLRVk9IiRDQURJUi9jbGllbnQua2V5 IiBcCisgICAgUEdTU0xST09UQ0VSVD0iJENBRElSL3NlcnZlcl9jYS5jcnQiICRQU1FMIC1oIGxv Y2FsaG9zdCAtVSBzc2x0ZXN0IHRlc3QgLWMgIlNFTEVDVCAxIiA+L2Rldi9udWxsIDI+JjEKK2lm IFsgJD8gPSAwIF07IHRoZW4KKyAgICBlY2hvICJDQSBjZXJ0IHN3YXA6IENBMS1zaWduZWQgY2xp ZW50IGNlcnQgYWNjZXB0ZWQgYmVmb3JlIHJlbG9hZCDigJMgb2suIgorZWxzZQorICAgIGVjaG8g IkNBIGNlcnQgc3dhcDogQ0ExLXNpZ25lZCBjbGllbnQgY2VydCByZWplY3RlZCBiZWZvcmUgcmVs b2FkIOKAkyB1bmV4cGVjdGVkLiIKKyAgICAuL3NodXRkb3duYWxsCisgICAgZXhpdCAxCitmaQor CitlY2hvICJzc2xfY2FfY2VydCA9ICckQ0FESVIvY29tYmluZWRfY2EyLmNydCciID4+IGV0Yy9w Z3Bvb2wuY29uZgorLi9wZ3Bvb2xfcmVsb2FkCitzbGVlcCAxCisKK1BHU1NMTU9ERT1yZXF1aXJl IFBHU1NMQ0VSVD0iJENBRElSL2NsaWVudC5jcnQiIFBHU1NMS0VZPSIkQ0FESVIvY2xpZW50Lmtl eSIgXAorICAgIFBHU1NMUk9PVENFUlQ9IiRDQURJUi9zZXJ2ZXJfY2EuY3J0IiAkUFNRTCAtaCBs b2NhbGhvc3QgLVUgc3NsdGVzdCB0ZXN0IC1jICJTRUxFQ1QgMSIgPi9kZXYvbnVsbCAyPiYxCitp ZiBbICQ/ICE9IDAgXTsgdGhlbgorICAgIGVjaG8gIkNBIGNlcnQgc3dhcDogQ0ExLXNpZ25lZCBj bGllbnQgY2VydCByZWplY3RlZCBhZnRlciByZWxvYWQgdG8gQ0EyIOKAkyBvay4iCitlbHNlCisg ICAgZWNobyAiQ0EgY2VydCBzd2FwOiBDQTEtc2lnbmVkIGNsaWVudCBjZXJ0IHN0aWxsIGFjY2Vw dGVkIGFmdGVyIENBMiByZWxvYWQg4oCTIHVuZXhwZWN0ZWQuIgorICAgIC4vc2h1dGRvd25hbGwK KyAgICBleGl0IDEKK2ZpCisKKy4vc2h1dGRvd25hbGwKK2V4aXQgMAotLSAKMi40My4w --000000000000e1888e064fa4e239--