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.94.2) (envelope-from ) id 1tmb0A-007w30-0Y for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 16:08:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tmb09-004UGK-9y for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 16:08:13 +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.94.2) (envelope-from ) id 1tmb08-004UFl-Nt for pgsql-hackers@lists.postgresql.org; Mon, 24 Feb 2025 16:08:12 +0000 Received: from mail-io1-xd2c.google.com ([2607:f8b0:4864:20::d2c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tmb04-000VBU-2f for pgsql-hackers@postgresql.org; Mon, 24 Feb 2025 16:08:11 +0000 Received: by mail-io1-xd2c.google.com with SMTP id ca18e2360f4ac-855a095094fso120079739f.1 for ; Mon, 24 Feb 2025 08:08:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740413289; x=1741018089; darn=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=I8alg7usfAYbQdpl1mIP1kFv/pG2xvshtZte6ZGu4nw=; b=AbC2jzj7M2/0WqWMtxBgFRddp85QcGlsbpD71LxAaOlE+cpA99Y8CPX3t/nY0Ho64I 7n++bTIGzabt4YRl6v+0QqF9xVz5l4qBg4H0lfmsGfNA5f3LPM2kC2W1UKzUpzxpbGBn TrWax8eZehgtkm0ageqhP5mEEVZADDA3nb3LnRCNKYVsnS7vv/LCXjqdBzK3sBsKyER5 VdRZthZ0jvnP6rn9YhJ3jGGhec9dc29ixwMO6PG5H7dA+T3pon8q8hTYcSPTWrCgpD1D xLeuNV/VzLwkCbbrsmRtR2xsmYIUXWcEObIGlR5tb86UCgoWo8nZ420Abwk03OmIHfcn 0/3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740413289; x=1741018089; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=I8alg7usfAYbQdpl1mIP1kFv/pG2xvshtZte6ZGu4nw=; b=RP2fer9Z6qxgLpg2B6Asg22Tpn1j/otjFSDCOIxSBzLWvtb8N/Vw5MoDO0cp0cZ59Q ljhTqKuX9NeW0YNTU1ztE9WGVoMN7YIOucDM6Y2SiWrNbAV64oleeQ4C+v5sqWE5LiaO OBeXoLrBQQ3xDWTVNxP45H0lOZVRp+rvrJVAUmJq4rfEEpWn/vEyGPt/WnVQImDjQONG +1n41wnOq4yklZLXiUvlAbl8En51uxZhMhoOBfF/Dd8ngM02T3LAeCvtLD3ZVnBinVky T84CGeqb4u2jrYqWBBuROgnmWEwV43NJNM8ic50xKSUBxV+MAbqv7xkwdfKVke9a/aL6 wmmQ== X-Forwarded-Encrypted: i=1; AJvYcCXgs5C6nrjrqy5WMDibf4A8gjjVMaFSIG5DqAdZH3nr56KVoF67cRvVvgMZzedCUG4DCX264NaIiBTz37Qi@postgresql.org X-Gm-Message-State: AOJu0Yy3S9WDktTNnWj+QjkRByfB2t3E1JYfkO+pZX3dlsDxHhnnBbzj BudPL3IoMvy/i56GU/+5VBhPMZ4vh6/jobjoT6qpDAxw8R4Ty1LAZsF3D7aZQP5/xsbSDFSj1Qw i08NY2Ge7C7lmsmQMGFa1jgVZwui44cqi X-Gm-Gg: ASbGncvbai2bsA8DJ0mAfyG97cT2mNFplIwOaHR/1bGC8rNxIQJYy9Ad0EHXC/eSGXz 4UzNCrcnfLsUaydHzLa80Gh2zqLshmyQOItrVIYzJb/PLGJoX6/qAu7ED4E9m1WEI1eHo6fYjEj Vg6TVZYIM= X-Google-Smtp-Source: AGHT+IHFK+lKpaIX46OQ6nWxNHg1K0kM94rKRKME3+yY4xcFhMzaehRe5HA6AU2qdZlQ4xR6kRd4GlcQoz0iu/jYrnk= X-Received: by 2002:a05:6e02:184a:b0:3cf:fa94:c7d with SMTP id e9e14a558f8ab-3d2cae6b8a1mr96356165ab.9.1740413289184; Mon, 24 Feb 2025 08:08:09 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Andrew Jackson Date: Mon, 24 Feb 2025 10:07:33 -0600 X-Gm-Features: AWEUYZn4T76ggJ1MCRLmOcHo79EZckYv_Pu84ubPv4lAUnVggZ87-tFlw2kQYJ8 Message-ID: Subject: Re: Add Option To Check All Addresses For Matching target_session_attr To: Andrey Borodin Cc: Vladimir Sitnikov , Dave Page , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000dd6c2b062ee58b81" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000dd6c2b062ee58b81 Content-Type: multipart/alternative; boundary="000000000000dd6c26062ee58b7f" --000000000000dd6c26062ee58b7f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Looks like this needed another rebase to account for the oauth commit. Rebase attached. On Mon, Feb 24, 2025 at 9:38=E2=80=AFAM Andrew Jackson wrote: > Hi, > > Thank you for the review! > > Review Response > > - Made a first pass at a real commit message > - Fixed the condition on the if statement to use strcmp > - Added a test suite in the files `src/interfaces/libpq/t/ > 006_target_session_attr_dns.pl` and `src/interfaces/libpq/t/ > 007_load_balance_dns_check_all_addrs.pl` which checks the > target_session_attrs as when used with and without load balancing. > > Regarding the name of the variable itself I am definitely open to opinion= s > on this. I didn't put too much thought initially and just chose > `check_all_addrs`. I feel like given that it modifies the behaviour of > `target_session_attrs` ideally it should reference that in the name but > that would make that variable name very long: something akin to > `target_session_attrs_check_all_addrs`. > > Context > > I tested some drivers as well and found that pgx, psycopg, and > rust-postgres all traverse every IP address when looking for a matching > target_session_attrs. Asyncpg and psycopg2 on the other hand follow libpq > and terminate additional attempts after the first failure. Given this it > seems like there is a decent amount of fragmentation in the ecosystem as = to > how exactly to implement this feature. I believe some drivers choose to > traverse all addresses because they have users target the same use case > outlined above. > > Thanks again, > Andrew Jackson > > On Sun, Feb 16, 2025 at 6:03=E2=80=AFAM Andrey Borodin > wrote: > >> Hi Andrew! >> >> cc Jelte, I suspect he might be interested. >> >> > On 20 Nov 2024, at 20:51, Andrew Jackson >> wrote: >> > >> > Would appreciate any feedback on the applicability/relevancy of the >> goal here or the implementation. >> >> Thank you for raising the issue. Following our discussion in Discord I'm >> putting my thoughts to list. >> >> >> Context >> >> A DNS record might return several IPs. Consider we have a connection >> string with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to >> 3.3.3.3,4.4.4.4. >> If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.1 and >> 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1 and >> 3.3.3.3 responded). >> >> If we enable libpq load balancing some random 2 IPs will be probed. >> >> IMO it's a bug, at least when load balancing is enabled. Let's consider >> if we can change default behavior here. I suspect we can't do it for >> "load_balance_hosts=3Ddisable". And even for load balancing this might b= e too >> unexpected change for someone. >> >> Further I only consider proposal not as a bug fix, but as a feature. >> >> In Discord we have surveyed some other drivers. >> pgx treats all IPs as different servers [1]. npgsql goes through all IPs >> one-by-one always [2]. PGJDBC are somewhat in a decision process [3] (cc >> Dave and Vladimir, if they would like to provide some input). >> >> >> Review >> >> The patch needs a rebase. It's trivial, so please fine attached. The >> patch needs real commit message, it's not trivial :) >> >> We definitely need to adjust tests [0]. We need to change >> 004_load_balance_dns.pl so that it tests target_session_attrs too. >> >> Some documentation would be nice. >> >> I do not like how this check is performed >> + if (conn->check_all_addr= s >> && conn->check_all_addrs[0] =3D=3D '1') >> Let's make it like load balancing is done [4]. >> >> Finally, let's think about naming alternatives for "check_all_addrs". >> >> I think that's enough for a first round of the review. If it's not a bug= , >> but a feature - it's a very narrow window to get to 18. But we might be >> lucky... >> >> Thank you! >> >> >> Best regards, Andrey Borodin. >> >> [0] >> https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e6= 44ee9456853e#diff-b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b512151= 74cf3ffR94 >> [1] https://github.com/jackc/pgx/blob/master/pgconn/pgconn.go#L177 >> [2] >> https://github.com/npgsql/npgsql/blob/7f1a59fa8dc1ccc34a70154f49a768e1ab= f826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986 >> [3] https://github.com/pgjdbc/pgjdbc/pull/3012#discussion_r1408069450 >> [4] >> https://github.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e6= 44ee9456853e#diff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5a4= aeb7f68R1660 >> > --000000000000dd6c26062ee58b7f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Looks like this needed another rebase to account=C2=A0for = the oauth commit. Rebase attached.

On Mon, Feb 24, 202= 5 at 9:38=E2=80=AFAM Andrew Jackson <andrewjackson947@gmail.com> wrote:
Hi,

Than= k you for the review!

Review Response
<= div>
- Made a first pass at a real commit message
-= Fixed the condition on the if statement to use strcmp
- Added a = test suite in the files `src/interfaces/libpq/t/006_target_session_attr_dns.pl= ` and `src/interfaces/libpq/t/007_load_balance_dns_check_all_addrs.pl= ` which checks the target_session_attrs as when used with and without load = balancing.

Regarding the name of the variable itse= lf I am=C2=A0definitely open to opinions on this. I didn't put too much= thought initially and just chose `check_all_addrs`. I feel like given that= it modifies the behaviour of `target_session_attrs` ideally it should refe= rence that in the name but that would make that variable name very long: so= mething akin to `target_session_attrs_check_all_addrs`.=C2=A0
Context

I tested some drivers as well = and found that pgx, psycopg, and rust-postgres all traverse every IP addres= s when looking for a matching target_session_attrs. Asyncpg and psycopg2 on= the other hand follow libpq and terminate additional attempts after the fi= rst failure. Given this it seems like there is a decent amount of fragmenta= tion in the ecosystem as to how exactly to implement this feature. I believ= e some drivers choose to traverse all addresses because they have users tar= get the same use case outlined above.=C2=A0

Thanks= again,
Andrew Jackson

=
On Sun, Feb 16, 2025 at 6:03=E2=80=AF= AM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
Hi Andrew!

cc Jelte, I suspect he might be interested.

> On 20 Nov 2024, at 20:51, Andrew Jackson <andrewjackson947@gmail.com> w= rote:
>
> Would appreciate any feedback on the applicability/relevancy of the go= al here or the implementation.

Thank you for raising the issue. Following our discussion in Discord I'= m putting my thoughts to list.


Context

A DNS record might return several IPs. Consider we have a connection string= with "host=3DA,B", A is resolved to 1.1.1.1,2.2.2.2, B to 3.3.3.= 3,4.4.4.4.
If we connect with "target_session_attrs=3Dread-write" IPs 1.1.1.= 1 and 3.3.3.3 will be probed, but 2.2.2.2 and 4.4.4.4 won't (if 1.1.1.1= and 3.3.3.3 responded).

If we enable libpq load balancing some random 2 IPs will be probed.

IMO it's a bug, at least when load balancing is enabled. Let's cons= ider if we can change default behavior here. I suspect we can't do it f= or "load_balance_hosts=3Ddisable". And even for load balancing th= is might be too unexpected change for someone.

Further I only consider proposal not as a bug fix, but as a feature.

In Discord we have surveyed some other drivers.
pgx treats all IPs as different servers [1]. npgsql goes through all IPs on= e-by-one always [2]. PGJDBC are somewhat in a decision process [3] (cc Dave= and Vladimir, if they would like to provide some input).


Review

The patch needs a rebase. It's trivial, so please fine attached. The pa= tch needs real commit message, it's not trivial :)

We definitely need to adjust tests [0]. We need to change 004_load_bal= ance_dns.pl so that it tests target_session_attrs too.

Some documentation would be nice.

I do not like how this check is performed
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0if (conn->check_all_addrs && conn->check_= all_addrs[0] =3D=3D '1')
Let's make it like load balancing is done [4].

Finally, let's think about naming alternatives for "check_all_addr= s".

I think that's enough for a first round of the review. If it's not = a bug, but a feature - it's a very narrow window to get to 18. But we m= ight be lucky...

Thank you!


Best regards, Andrey Borodin.

[0] https://github= .com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#diff= -b05b74d2a97d7f74d4311ba1702d732f0df1b101c6ac99c146b51215174cf3ffR94 [1] https://github.com/jackc/pgx/blob/= master/pgconn/pgconn.go#L177
[2] https://github.com/npgsql/npgsql/blob/7f1a59fa8dc= 1ccc34a70154f49a768e1abf826ba/src/Npgsql/Internal/NpgsqlConnector.cs#L986
[3]
https://github.com/pgjdbc/pgjdb= c/pull/3012#discussion_r1408069450
[4] https://gith= ub.com/postgres/postgres/commit/7f5b19817eaf38e70ad1153db4e644ee9456853e#di= ff-8d819454e061b9d4cdae9c8922ded05753a629d70f2ac1de1d4f6d5a4aeb7f68R1660
--000000000000dd6c26062ee58b7f-- --000000000000dd6c2b062ee58b81 Content-Type: text/x-patch; charset="US-ASCII"; name="v4-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Disposition: attachment; filename="v4-0001-Add-option-to-check-all-addrs-for-target_session.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7j92efa0 RnJvbSBmMmEzYjFlNTE4MjRkYTdiNGEzZWIwOTZlZDIyMTVkNjRlNjE3YWJkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgQm9yb2RpbiA8YW1ib3JvZGluQGFjbS5vcmc+CkRh dGU6IEZyaSwgMTQgRmViIDIwMjUgMjM6MTM6NTUgKzA1MDAKU3ViamVjdDogW1BBVENIIHY0XSBB ZGQgb3B0aW9uIHRvIGNoZWNrIGFsbCBhZGRycyBmb3IgdGFyZ2V0X3Nlc3Npb24uCgpUaGUgY3Vy cmVudCBiZWhhdmlvdXIgb2YgbGlicHEgd2l0aCByZWdhcmQgdG8gc2VhcmNoaW5nCmZvciBhIG1h dGNoaW5nIHRhcmdldF9zZXNzaW9uX2F0dHJzIGluIGEgbGlzdCBvZiBhZGRycyBpcwp0aGF0IGFm dGVyIHN1Y2Nlc3NmdWxseSBjb25uZWN0aW5nIHRvIGEgc2VydmVyIGlmIHRoZSBzZXJ2ZXJzCnNl c3Npb25fYXR0ciBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWVzdCB0YXJnZXRfc2Vzc2lvbl9hdHRy cwpubyBmdXRoZXIgYWRkcmVzcyBpcyBjb25zaWRlcmVkLiBUaGlzIGJlaGF2aW91ciBpcyBleHRy ZW1lbHkKaW5jb252ZW5pZW50IGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgdXNlciBpcyBhdHRl bXB0aW5nIHRvCmltcGxlbWVudCBhIGhpZ2ggYXZhaWxhYmlsaXR5IHNldHVwIHdpdGhvdXQgaGF2 aW5nIHRvIG1vZGlmeQpETlMgcmVjb3JkcyBvciBhIHByb3h5IHNlcnZlciBjb25maWcuCgpUaGlz IFBSIGFkZHMgYSBjbGllbnQgc2lkZSBvcHRpb24gY2FsbGVkIGNoZWNrX2FsbF9hZGRycy4KV2hl biBzZXQgdG8gMSB0aGlzIG9wdGlvbiB3aWxsIHRlbGwgbGlicHEgdG8gY29udGludWUgY2hlY2tp bmcKYW55IHJlbWFpbmluZyBhZGRyZXNzZXMgZXZlbiBpZiB0aGVyZSB3YXMgYSB0YXJnZXRfc2Vz c2lvbl9hdHRycwptaXNtYXRjaCBvbiBvbmUgb2YgdGhlbS4KCkF1dGhvcjogQW5kcmV3IEphY2tz b24KUmV2aWV3ZWQtYnk6IEFuZHJleSBCb3JvZGluCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBv c3RncmVzcWwub3JnL21lc3NhZ2UtaWQvZmxhdC9DQUtLNUJrRVNTYzY5c3AyVGlUV0h2dk9IQ1Vl eTByRFdYU3JSOXBpbnlScXlmYW1VWWclNDBtYWlsLmdtYWlsLmNvbQotLS0KIGRvYy9zcmMvc2dt bC9saWJwcS5zZ21sICAgICAgICAgICAgICAgICAgICAgICB8ICAzMyArKysrKwogc3JjL2ludGVy ZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jICAgICAgICAgICAgIHwgIDI1ICsrLS0KIHNyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWludC5oICAgICAgICAgICAgICB8ICAgMSArCiAuLi4vbGlicHEv dC8wMDZfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMucGwgICAgfCAxMjkgKysrKysrKysrKysrKysr KysrCiAuLi4vdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwgfCAxMjgg KysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMzA2IGluc2VydGlvbnMoKyksIDEw IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9pbnRlcmZhY2VzL2xpYnBxL3Qv MDA2X3RhcmdldF9zZXNzaW9uX2F0dHJfZG5zLnBsCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2lu dGVyZmFjZXMvbGlicHEvdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwK CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbCBiL2RvYy9zcmMvc2dtbC9saWJw cS5zZ21sCmluZGV4IGRkYjM1OTZkZjgzLi5jNWQyOWQ3YTBmOSAxMDA2NDQKLS0tIGEvZG9jL3Ny Yy9zZ21sL2xpYnBxLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKQEAgLTI0ODMs NiArMjQ4MywzOSBAQCBwb3N0Z3Jlc3FsOi8vJTJGdmFyJTJGbGliJTJGcG9zdGdyZXNxbC9kYm5h bWUKICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgIDwvdmFybGlzdGVudHJ5PgogCisgICAgIDx2YXJs aXN0ZW50cnkgaWQ9ImxpYnBxLWNvbm5lY3QtY2hlY2stYWxsLWFkZHJzIiB4cmVmbGFiZWw9ImNo ZWNrX2FsbF9hZGRycyI+CisgICAgICA8dGVybT48bGl0ZXJhbD5jaGVja19hbGxfYWRkcnM8L2xp dGVyYWw+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBD b250cm9scyB3aGV0aGVyIG9yIG5vdCBhbGwgYWRkcmVzc2VzIHdpdGhpbiBhIGhvc3RuYW1lIGFy ZSBjaGVja2VkIHdoZW4gdHJ5aW5nIHRvIG1ha2UgYSBjb25uZWN0aW9uCisgICAgICAgIHdoZW4g YXR0ZW1wdGluZyB0byBmaW5kIGEgY29ubmVjdGlvbiB3aXRoIGEgbWF0Y2hpbmcgPHhyZWYgbGlu a2VuZD0ibGlicHEtY29ubmVjdC10YXJnZXQtc2Vzc2lvbi1hdHRyIi8+LgorCisgICAgICAgIFRo ZXJlIGFyZSB0d28gbW9kZXM6CisgICAgICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICAgICA8dmFy bGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPjA8L2xpdGVyYWw+IChkZWZhdWx0 KTwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgIDxwYXJhPgorICAgICAg ICAgICAgSWYgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gaXMgbWFkZSBhbmQgdGhhdCBjb25uZWN0 aW9uIGlzIGZvdW5kIHRvIGhhdmUgYQorICAgICAgICAgICAgbWlzbWF0Y2hpbmcgPHhyZWYgbGlu a2VuZD0ibGlicHEtY29ubmVjdC10YXJnZXQtc2Vzc2lvbi1hdHRyIi8+IGRvIG5vdCBjaGVjawor ICAgICAgICAgICAgYW55IGFkZGl0aW9uYWwgYWRkcmVzc2VzIGFuZCBtb3ZlIG9udG8gdGhlIG5l eHQgaG9zdCBpZiBvbmUgd2FzIHByb3ZpZGVkLgorICAgICAgICAgICA8L3BhcmE+CisgICAgICAg ICAgPC9saXN0aXRlbT4KKyAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgPHZhcmxp c3RlbnRyeT4KKyAgICAgICAgICA8dGVybT48bGl0ZXJhbD4xPC9saXRlcmFsPjwvdGVybT4KKyAg ICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgYSBz dWNjZXNzZnVsIGNvbm5lY3Rpb24gaXMgbWFkZSBhbmQgdGhhdCBjb25uZWN0aW9uIGlzIGZvdW5k IHRvIGhhdmUgYQorICAgICAgICAgICAgbWlzbWF0Y2hpbmcgPHhyZWYgbGlua2VuZD0ibGlicHEt Y29ubmVjdC10YXJnZXQtc2Vzc2lvbi1hdHRyIi8+IHByb2NlZWQKKyAgICAgICAgICAgIHRvIGNo ZWNrIGFueSBhZGRpdGlvbmFsIGFkZHJlc3Nlcy4KKyAgICAgICAgICAgPC9wYXJhPgorICAgICAg ICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgPC92YXJp YWJsZWxpc3Q+CisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJs aXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgICA8L3BhcmE+CiAgIDwvc2VjdDI+CmRp ZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMgYi9zcmMvaW50ZXJm YWNlcy9saWJwcS9mZS1jb25uZWN0LmMKaW5kZXggZDUwNTFmNWU4MjAuLmJkMDI2NWM1NTNlIDEw MDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKKysrIGIvc3JjL2lu dGVyZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jCkBAIC0zNzMsNiArMzczLDEwIEBAIHN0YXRpYyBj b25zdCBpbnRlcm5hbFBRY29ubmluZm9PcHRpb24gUFFjb25uaW5mb09wdGlvbnNbXSA9IHsKIAog CXsic2NyYW1fc2VydmVyX2tleSIsIE5VTEwsIE5VTEwsIE5VTEwsICJTQ1JBTS1TZXJ2ZXItS2V5 IiwgIkQiLCBTQ1JBTV9NQVhfS0VZX0xFTiAqIDIsCiAJb2Zmc2V0b2Yoc3RydWN0IHBnX2Nvbm4s IHNjcmFtX3NlcnZlcl9rZXkpfSwKKwl7ImNoZWNrX2FsbF9hZGRycyIsICJQR0NIRUNLQUxMQURE UlMiLAorCQlEZWZhdWx0TG9hZEJhbGFuY2VIb3N0cywgTlVMTCwKKwkJIkNoZWNrLUFsbC1BZGRy cyIsICIiLCAxLAorCW9mZnNldG9mKHN0cnVjdCBwZ19jb25uLCBjaGVja19hbGxfYWRkcnMpfSwK IAogCS8qIE9BdXRoIHYyICovCiAJeyJvYXV0aF9pc3N1ZXIiLCBOVUxMLCBOVUxMLCBOVUxMLApA QCAtNDM2MiwxMSArNDM2NiwxMSBAQCBrZWVwX2dvaW5nOgkJCQkJCS8qIFdlIHdpbGwgY29tZSBi YWNrIHRvIGhlcmUgdW50aWwgdGhlcmUgaXMKIAkJCQkJCWNvbm4tPnN0YXR1cyA9IENPTk5FQ1RJ T05fT0s7CiAJCQkJCQlzZW5kVGVybWluYXRlQ29ubihjb25uKTsKIAotCQkJCQkJLyoKLQkJCQkJ CSAqIFRyeSBuZXh0IGhvc3QgaWYgYW55LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlcgot CQkJCQkJICogYWRkaXRpb25hbCBhZGRyZXNzZXMgZm9yIHRoaXMgaG9zdC4KLQkJCQkJCSAqLwot CQkJCQkJY29ubi0+dHJ5X25leHRfaG9zdCA9IHRydWU7CisJCQkJCQlpZiAoc3RyY21wKGNvbm4t PmNoZWNrX2FsbF9hZGRycywgIjEiKSA9PSAwKQorCQkJCQkJCWNvbm4tPnRyeV9uZXh0X2FkZHIg PSB0cnVlOworCQkJCQkJZWxzZQorCQkJCQkJCWNvbm4tPnRyeV9uZXh0X2hvc3QgPSB0cnVlOwor CiAJCQkJCQlnb3RvIGtlZXBfZ29pbmc7CiAJCQkJCX0KIAkJCQl9CkBAIC00NDE3LDExICs0NDIx LDExIEBAIGtlZXBfZ29pbmc6CQkJCQkJLyogV2Ugd2lsbCBjb21lIGJhY2sgdG8gaGVyZSB1bnRp bCB0aGVyZSBpcwogCQkJCQkJY29ubi0+c3RhdHVzID0gQ09OTkVDVElPTl9PSzsKIAkJCQkJCXNl bmRUZXJtaW5hdGVDb25uKGNvbm4pOwogCi0JCQkJCQkvKgotCQkJCQkJICogVHJ5IG5leHQgaG9z dCBpZiBhbnksIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyCi0JCQkJCQkgKiBhZGRpdGlv bmFsIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0LgotCQkJCQkJICovCi0JCQkJCQljb25uLT50cnlf bmV4dF9ob3N0ID0gdHJ1ZTsKKwkJCQkJCWlmIChzdHJjbXAoY29ubi0+Y2hlY2tfYWxsX2FkZHJz LCAiMSIpID09IDApCisJCQkJCQkJY29ubi0+dHJ5X25leHRfYWRkciA9IHRydWU7CisJCQkJCQll bHNlCisJCQkJCQkJY29ubi0+dHJ5X25leHRfaG9zdCA9IHRydWU7CisKIAkJCQkJCWdvdG8ga2Vl cF9nb2luZzsKIAkJCQkJfQogCQkJCX0KQEAgLTUwNDcsNiArNTA1MSw3IEBAIGZyZWVQR2Nvbm4o UEdjb25uICpjb25uKQogCWZyZWUoY29ubi0+b2F1dGhfY2xpZW50X2lkKTsKIAlmcmVlKGNvbm4t Pm9hdXRoX2NsaWVudF9zZWNyZXQpOwogCWZyZWUoY29ubi0+b2F1dGhfc2NvcGUpOworCWZyZWUo Y29ubi0+Y2hlY2tfYWxsX2FkZHJzKTsKIAl0ZXJtUFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVz c2FnZSk7CiAJdGVybVBRRXhwQnVmZmVyKCZjb25uLT53b3JrQnVmZmVyKTsKIApkaWZmIC0tZ2l0 IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmggYi9zcmMvaW50ZXJmYWNlcy9saWJw cS9saWJwcS1pbnQuaAppbmRleCBmMzZmN2YxOWQ1OC4uMjdmMTYyYzFjMjkgMTAwNjQ0Ci0tLSBh L3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xp YnBxL2xpYnBxLWludC5oCkBAIC00MzIsNiArNDMyLDcgQEAgc3RydWN0IHBnX2Nvbm4KIAljaGFy CSAgICpsb2FkX2JhbGFuY2VfaG9zdHM7IC8qIGxvYWQgYmFsYW5jZSBvdmVyIGhvc3RzICovCiAJ Y2hhcgkgICAqc2NyYW1fY2xpZW50X2tleTsJLyogYmFzZTY0LWVuY29kZWQgU0NSQU0gY2xpZW50 IGtleSAqLwogCWNoYXIJICAgKnNjcmFtX3NlcnZlcl9rZXk7CS8qIGJhc2U2NC1lbmNvZGVkIFND UkFNIHNlcnZlciBrZXkgKi8KKwljaGFyICAgICAgICpjaGVja19hbGxfYWRkcnM7ICAvKiB3aGV0 aGVyIHRvIGNoZWNrIGFsbCBpcHMgd2l0aGluIGEgaG9zdCBvciB0ZXJtaW5hdGUgb24gZmFpbHVy ZSAqLwogCiAJYm9vbAkJY2FuY2VsUmVxdWVzdDsJLyogdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24g aXMgdXNlZCB0byBzZW5kIGEKIAkJCQkJCQkJICogY2FuY2VsIHJlcXVlc3QsIGluc3RlYWQgb2Yg YmVpbmcgYSBub3JtYWwKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3QvMDA2X3Rh cmdldF9zZXNzaW9uX2F0dHJfZG5zLnBsIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDZfdGFy Z2V0X3Nlc3Npb25fYXR0cl9kbnMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLjkxNGY2YzQ3MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvbGli cHEvdC8wMDZfdGFyZ2V0X3Nlc3Npb25fYXR0cl9kbnMucGwKQEAgLTAsMCArMSwxMjkgQEAKKwor IyBDb3B5cmlnaHQgKGMpIDIwMjMtMjAyNSwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQg R3JvdXAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgQ29u ZmlnOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6 OkNsdXN0ZXI7Cit1c2UgVGVzdDo6TW9yZTsKKworaWYgKCEkRU5We1BHX1RFU1RfRVhUUkF9IHx8 ICRFTlZ7UEdfVEVTVF9FWFRSQX0gIX4gL1xibG9hZF9iYWxhbmNlXGIvKQoreworCXBsYW4gc2tp cF9hbGwgPT4KKwkgICdQb3RlbnRpYWxseSB1bnNhZmUgdGVzdCBsb2FkX2JhbGFuY2Ugbm90IGVu YWJsZWQgaW4gUEdfVEVTVF9FWFRSQSc7Cit9CisKKyMgQ2x1c3RlciBzZXR1cCB3aGljaCBpcyBz aGFyZWQgZm9yIHRlc3RpbmcgYm90aCBsb2FkIGJhbGFuY2luZyBtZXRob2RzCitteSAkY2FuX2Jp bmRfdG9fMTI3XzBfMF8yID0KKyAgJENvbmZpZ3tvc25hbWV9IGVxICdsaW51eCcgfHwgJFBvc3Rn cmVTUUw6OlRlc3Q6OlV0aWxzOjp3aW5kb3dzX29zOworCisjIENoZWNrcyBmb3IgdGhlIHJlcXVp cmVtZW50cyBmb3IgdGVzdGluZyBsb2FkIGJhbGFuY2luZyBtZXRob2QgMgoraWYgKCEkY2FuX2Jp bmRfdG9fMTI3XzBfMF8yKQoreworCXBsYW4gc2tpcF9hbGwgPT4gJ2xvYWRfYmFsYW5jZSB0ZXN0 IG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzJzsKK30KKworbXkgJGhvc3RzX3Bh dGg7CitpZiAoJHdpbmRvd3Nfb3MpCit7CisJJGhvc3RzX3BhdGggPSAnYzpcV2luZG93c1xTeXN0 ZW0zMlxEcml2ZXJzXGV0Y1xob3N0cyc7Cit9CitlbHNlCit7CisJJGhvc3RzX3BhdGggPSAnL2V0 Yy9ob3N0cyc7Cit9CisKK215ICRob3N0c19jb250ZW50ID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRp bHM6OnNsdXJwX2ZpbGUoJGhvc3RzX3BhdGgpOworCitteSAkaG9zdHNfY291bnQgPSAoKSA9Cisg ICRob3N0c19jb250ZW50ID1+IC8xMjdcLjBcLjBcLlsxLTNdIHBnLWxvYWRiYWxhbmNldGVzdC9n OworaWYgKCRob3N0c19jb3VudCAhPSAzKQoreworCSMgSG9zdCBmaWxlIGlzIG5vdCBwcmVwYXJl ZCBmb3IgdGhpcyB0ZXN0CisJcGxhbiBza2lwX2FsbCA9PiAiaG9zdHMgZmlsZSB3YXMgbm90IHBy ZXBhcmVkIGZvciBETlMgbG9hZCBiYWxhbmNlIHRlc3QiOworfQorCiskUG9zdGdyZVNRTDo6VGVz dDo6Q2x1c3Rlcjo6dXNlX3RjcCA9IDE7CiskUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6dGVz dF9wZ2hvc3QgPSAnMTI3LjAuMC4xJzsKK215ICRwb3J0ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1 c3Rlcjo6Z2V0X2ZyZWVfcG9ydCgpOworCitteSAkbm9kZV9wcmltYXJ5MSA9IFBvc3RncmVTUUw6 OlRlc3Q6OkNsdXN0ZXItPm5ldygncHJpbWFyeTEnLCBwb3J0ID0+ICRwb3J0KTsKKyRub2RlX3By aW1hcnkxLT5pbml0KGhhc19hcmNoaXZpbmcgPT4gMSwgYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsK KworIyBTdGFydCBpdAorJG5vZGVfcHJpbWFyeTEtPnN0YXJ0OworCisjIFRha2UgYmFja3VwIGZy b20gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBydW4KKyRub2RlX3ByaW1hcnkxLT5iYWNr dXAoJ215X2JhY2t1cCcpOworCitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6 Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5JywgcG9ydCA9PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Cisk bm9kZV9zdGFuZGJ5LT5pbml0X2Zyb21fYmFja3VwKCRub2RlX3ByaW1hcnkxLCAnbXlfYmFja3Vw JywKKwloYXNfcmVzdG9yaW5nID0+IDEpOworJG5vZGVfc3RhbmRieS0+c3RhcnQoKTsKKworbXkg JG5vZGVfcHJpbWFyeTIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ25vZGUxJywg cG9ydCA9PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Ciskbm9kZV9wcmltYXJ5MiAtPmluaXQoKTsK KyRub2RlX3ByaW1hcnkyIC0+c3RhcnQoKTsKKworIyB0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmlt YXJ5IHNob3VsZCBhbHdheXMgY2hvb3NlIHRoZSBmaXJzdCBvbmUuCiskbm9kZV9wcmltYXJ5MS0+ Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRf c2Vzc2lvbl9hdHRycz1wcmltYXJ5IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Np b25fYXR0cnM9cHJpbWFyeSBjb25uZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJT RUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdj b25uZWN0MScvXSk7Ciskbm9kZV9wcmltYXJ5MS0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2Fk YmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1yZWFkLXdyaXRlIGNo ZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC13cml0ZSBjb25u ZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJ bG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9w cmltYXJ5MS0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9y dCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1hbnkgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRf c2Vzc2lvbl9hdHRycz1hbnkgY29ubmVjdHMgdG8gdGhlIGZpcnN0IG5vZGUiLAorCXNxbCA9PiAi U0VMRUNUICdjb25uZWN0MSciLAorCWxvZ19saWtlID0+IFtxci9zdGF0ZW1lbnQ6IFNFTEVDVCAn Y29ubmVjdDEnL10pOworJG5vZGVfc3RhbmRieS0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2Fk YmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1zdGFuZGJ5IGNoZWNr X2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9c3RhbmRieSBjb25uZWN0cyB0 byB0aGUgdGhpcmQgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xp a2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9zdGFuZGJ5 LT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdl dF9zZXNzaW9uX2F0dHJzPXJlYWQtb25seSBjaGVja19hbGxfYWRkcnM9MSIsCisJInRhcmdldF9z ZXNzaW9uX2F0dHJzPXJlYWQtb25seSBjb25uZWN0cyB0byB0aGUgdGhpcmQgbm9kZSIsCisJc3Fs ID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VM RUNUICdjb25uZWN0MScvXSk7CisKKworJG5vZGVfcHJpbWFyeTEtPnN0b3AoKTsKKworIyB0YXJn ZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IHNob3VsZCBhbHdheXMgY2hvb3NlIHRoZSBmaXJzdCBv bmUuCiskbm9kZV9wcmltYXJ5Mi0+Y29ubmVjdF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRl c3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lvbl9hdHRycz1wcmltYXJ5IGNoZWNrX2FsbF9hZGRy cz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cHJpbWFyeSBjb25uZWN0cyB0byB0aGUgZmly c3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3Fy L3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9wcmltYXJ5Mi0+Y29ubmVj dF9vaygKKwkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCB0YXJnZXRfc2Vzc2lv bl9hdHRycz1yZWFkLXdyaXRlIGNoZWNrX2FsbF9hZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25f YXR0cnM9cmVhZC13cml0ZSBjb25uZWN0cyB0byB0aGUgZmlyc3Qgbm9kZSIsCisJc3FsID0+ICJT RUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3FyL3N0YXRlbWVudDogU0VMRUNUICdj b25uZWN0MScvXSk7Ciskbm9kZV9zdGFuZGJ5LT5jb25uZWN0X29rKAorCSJob3N0PXBnLWxvYWRi YWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9uX2F0dHJzPWFueSBjaGVja19hbGxf YWRkcnM9MSIsCisJInRhcmdldF9zZXNzaW9uX2F0dHJzPWFueSBjb25uZWN0cyB0byB0aGUgZmly c3Qgbm9kZSIsCisJc3FsID0+ICJTRUxFQ1QgJ2Nvbm5lY3QxJyIsCisJbG9nX2xpa2UgPT4gW3Fy L3N0YXRlbWVudDogU0VMRUNUICdjb25uZWN0MScvXSk7Ciskbm9kZV9zdGFuZGJ5LT5jb25uZWN0 X29rKAorCSJob3N0PXBnLWxvYWRiYWxhbmNldGVzdCBwb3J0PSRwb3J0IHRhcmdldF9zZXNzaW9u X2F0dHJzPXN0YW5kYnkgY2hlY2tfYWxsX2FkZHJzPTEiLAorCSJ0YXJnZXRfc2Vzc2lvbl9hdHRy cz1zdGFuZGJ5IGNvbm5lY3RzIHRvIHRoZSB0aGlyZCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAn Y29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3Qx Jy9dKTsKKyRub2RlX3N0YW5kYnktPmNvbm5lY3Rfb2soCisJImhvc3Q9cGctbG9hZGJhbGFuY2V0 ZXN0IHBvcnQ9JHBvcnQgdGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC1vbmx5IGNoZWNrX2FsbF9h ZGRycz0xIiwKKwkidGFyZ2V0X3Nlc3Npb25fYXR0cnM9cmVhZC1vbmx5IGNvbm5lY3RzIHRvIHRo ZSB0aGlyZCBub2RlIiwKKwlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdDEnIiwKKwlsb2dfbGlrZSA9 PiBbcXIvc3RhdGVtZW50OiBTRUxFQ1QgJ2Nvbm5lY3QxJy9dKTsKKworJG5vZGVfcHJpbWFyeTIt PnN0b3AoKTsKKyRub2RlX3N0YW5kYnktPnN0b3AoKTsKKworCitkb25lX3Rlc3RpbmcoKTsKZGlm ZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3QvMDA3X2xvYWRfYmFsYW5jZV9kbnNfY2hl Y2tfYWxsX2FkZHJzLnBsIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDdfbG9hZF9iYWxhbmNl X2Ruc19jaGVja19hbGxfYWRkcnMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLmQzNDA1NTk4ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvbGli cHEvdC8wMDdfbG9hZF9iYWxhbmNlX2Ruc19jaGVja19hbGxfYWRkcnMucGwKQEAgLTAsMCArMSwx MjggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUsIFBvc3RncmVTUUwgR2xvYmFsIERldmVs b3BtZW50IEdyb3VwCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwor dXNlIENvbmZpZzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBQb3N0Z3JlU1FM OjpUZXN0OjpDbHVzdGVyOwordXNlIFRlc3Q6Ok1vcmU7CisKK2lmICghJEVOVntQR19URVNUX0VY VFJBfSB8fCAkRU5We1BHX1RFU1RfRVhUUkF9ICF+IC9cYmxvYWRfYmFsYW5jZVxiLykKK3sKKwlw bGFuIHNraXBfYWxsID0+CisJICAnUG90ZW50aWFsbHkgdW5zYWZlIHRlc3QgbG9hZF9iYWxhbmNl IG5vdCBlbmFibGVkIGluIFBHX1RFU1RfRVhUUkEnOworfQorCitteSAkY2FuX2JpbmRfdG9fMTI3 XzBfMF8yID0KKyAgJENvbmZpZ3tvc25hbWV9IGVxICdsaW51eCcgfHwgJFBvc3RncmVTUUw6OlRl c3Q6OlV0aWxzOjp3aW5kb3dzX29zOworCisjIENoZWNrcyBmb3IgdGhlIHJlcXVpcmVtZW50cyBm b3IgdGVzdGluZyBsb2FkIGJhbGFuY2luZyBtZXRob2QgMgoraWYgKCEkY2FuX2JpbmRfdG9fMTI3 XzBfMF8yKQoreworCXBsYW4gc2tpcF9hbGwgPT4gJ2xvYWRfYmFsYW5jZSB0ZXN0IG9ubHkgc3Vw cG9ydGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzJzsKK30KKworbXkgJGhvc3RzX3BhdGg7CitpZiAo JHdpbmRvd3Nfb3MpCit7CisJJGhvc3RzX3BhdGggPSAnYzpcV2luZG93c1xTeXN0ZW0zMlxEcml2 ZXJzXGV0Y1xob3N0cyc7Cit9CitlbHNlCit7CisJJGhvc3RzX3BhdGggPSAnL2V0Yy9ob3N0cyc7 Cit9CisKK215ICRob3N0c19jb250ZW50ID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnNsdXJw X2ZpbGUoJGhvc3RzX3BhdGgpOworCitteSAkaG9zdHNfY291bnQgPSAoKSA9CisgICRob3N0c19j b250ZW50ID1+IC8xMjdcLjBcLjBcLlsxLTNdIHBnLWxvYWRiYWxhbmNldGVzdC9nOworaWYgKCRo b3N0c19jb3VudCAhPSAzKQoreworCSMgSG9zdCBmaWxlIGlzIG5vdCBwcmVwYXJlZCBmb3IgdGhp cyB0ZXN0CisJcGxhbiBza2lwX2FsbCA9PiAiaG9zdHMgZmlsZSB3YXMgbm90IHByZXBhcmVkIGZv ciBETlMgbG9hZCBiYWxhbmNlIHRlc3QiOworfQorCiskUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rl cjo6dXNlX3RjcCA9IDE7CiskUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlcjo6dGVzdF9wZ2hvc3Qg PSAnMTI3LjAuMC4xJzsKKworbXkgJHBvcnQgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOjpn ZXRfZnJlZV9wb3J0KCk7Citsb2NhbCAkVGVzdDo6QnVpbGRlcjo6TGV2ZWwgPSAkVGVzdDo6QnVp bGRlcjo6TGV2ZWwgKyAxOworbXkgJG5vZGVfcHJpbWFyeTEgPSBQb3N0Z3JlU1FMOjpUZXN0OjpD bHVzdGVyLT5uZXcoInByaW1hcnkxIiwgcG9ydCA9PiAkcG9ydCk7Ciskbm9kZV9wcmltYXJ5MS0+ aW5pdChoYXNfYXJjaGl2aW5nID0+IDEsIGFsbG93c19zdHJlYW1pbmcgPT4gMSk7CisKKyMgU3Rh cnQgaXQKKyRub2RlX3ByaW1hcnkxLT5zdGFydCgpOworCisjIFRha2UgYmFja3VwIGZyb20gd2hp Y2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBydW4KKyRub2RlX3ByaW1hcnkxLT5iYWNrdXAoIm15 X2JhY2t1cCIpOworCitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rl ci0+bmV3KCJzdGFuZGJ5IiwgcG9ydCA9PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Ciskbm9kZV9z dGFuZGJ5LT5pbml0X2Zyb21fYmFja3VwKCRub2RlX3ByaW1hcnkxLCAibXlfYmFja3VwIiwKKwlo YXNfcmVzdG9yaW5nID0+IDEpOworJG5vZGVfc3RhbmRieS0+c3RhcnQoKTsKKworbXkgJG5vZGVf cHJpbWFyeTIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoIm5vZGUxIiwgcG9ydCA9 PiAkcG9ydCwgb3duX2hvc3QgPT4gMSk7Ciskbm9kZV9wcmltYXJ5Mi0+aW5pdCgpOworJG5vZGVf cHJpbWFyeTItPnN0YXJ0KCk7CitzdWIgdGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyIHsKKwlteSAk dGFyZ2V0X3Nlc3Npb25fYXR0cnMgPSBzaGlmdDsKKwlteSAkdGVzdF9udW0gPSBzaGlmdDsKKwlt eSAkcHJpbWFyeTFfZXhwZWN0X3RyYWZmaWMgPSBzaGlmdDsKKwlteSAkc3RhbmRieV9leHBlZWN0 X3RyYWZmaWMgPSBzaGlmdDsKKwlteSAkcHJpbWFyeTJfZXhwZWN0X3RyYWZmaWMgPSBzaGlmdDsK KwkjIFN0YXRpc3RpY2FsbHkgdGhlIGZvbGxvd2luZyBsb29wIHdpdGggbG9hZF9iYWxhbmNlX2hv c3RzPXJhbmRvbSB3aWxsIGFsbW9zdAorCSMgY2VydGFpbmx5IGNvbm5lY3QgYXQgbGVhc3Qgb25j ZSB0byBlYWNoIG9mIHRoZSBub2Rlcy4gVGhlIGNoYW5jZSBvZiB0aGF0IG5vdAorCSMgaGFwcGVu aW5nIGlzIHNvIHNtYWxsIHRoYXQgaXQncyBuZWdsaWdpYmxlOiAoMi8zKV41MCA9IDEuNTY4MzI4 NTVlLTkKKwlmb3JlYWNoIG15ICRpICgxIC4uIDUwKQorCXsKKwkJJG5vZGVfcHJpbWFyeTEtPmNv bm5lY3Rfb2soCisJCQkiaG9zdD1wZy1sb2FkYmFsYW5jZXRlc3QgcG9ydD0kcG9ydCBsb2FkX2Jh bGFuY2VfaG9zdHM9cmFuZG9tIHRhcmdldF9zZXNzaW9uX2F0dHJzPSR7dGFyZ2V0X3Nlc3Npb25f YXR0cnN9IGNoZWNrX2FsbF9hZGRycz0xIiwKKwkJCSJyZXBlYXRlZCBjb25uZWN0aW9ucyB3aXRo IHJhbmRvbSBsb2FkIGJhbGFuY2luZyIsCisJCQlzcWwgPT4gIlNFTEVDVCAnY29ubmVjdCR7dGVz dF9udW19JyIpOworCX0KKwlteSAkbm9kZV9wcmltYXJ5MV9vY2N1cnJlbmNlcyA9ICgpID0KKwkg ICRub2RlX3ByaW1hcnkxLT5sb2dfY29udGVudCgpID1+IC9zdGF0ZW1lbnQ6IFNFTEVDVCAnY29u bmVjdCR7dGVzdF9udW19Jy9nOworCW15ICRub2RlX3N0YW5kYnlfb2NjdXJyZW5jZXMgPSAoKSA9 CisJICAkbm9kZV9zdGFuZGJ5LT5sb2dfY29udGVudCgpID1+IC9zdGF0ZW1lbnQ6IFNFTEVDVCAn Y29ubmVjdCR7dGVzdF9udW19Jy9nOworCW15ICRub2RlX3ByaW1hcnkyX29jY3VycmVuY2VzID0g KCkgPQorCSAgJG5vZGVfcHJpbWFyeTItPmxvZ19jb250ZW50KCkgPX4gL3N0YXRlbWVudDogU0VM RUNUICdjb25uZWN0JHt0ZXN0X251bX0nL2c7CisKKwlteSAkdG90YWxfb2NjdXJyZW5jZXMgPQor CSAgJG5vZGVfcHJpbWFyeTFfb2NjdXJyZW5jZXMgKyAkbm9kZV9zdGFuZGJ5X29jY3VycmVuY2Vz ICsgJG5vZGVfcHJpbWFyeTJfb2NjdXJyZW5jZXM7CisKKwlpZiAoJHByaW1hcnkxX2V4cGVjdF90 cmFmZmljID09IDEpIHsKKwkJb2soJG5vZGVfcHJpbWFyeTFfb2NjdXJyZW5jZXMgPiAwLCAicmVj ZWl2ZWQgYXQgbGVhc3Qgb25lIGNvbm5lY3Rpb24gb24gbm9kZTEiKTsKKwl9ZWxzZXsKKwkJb2so JG5vZGVfcHJpbWFyeTFfb2NjdXJyZW5jZXMgPT0gMCwgInJlY2VpdmVkIGF0IGxlYXN0IG9uZSBj b25uZWN0aW9uIG9uIG5vZGUxIik7CisJfQorCWlmICgkc3RhbmRieV9leHBlZWN0X3RyYWZmaWMg PT0gMSkgeworCQlvaygkbm9kZV9zdGFuZGJ5X29jY3VycmVuY2VzID4gMCwgInJlY2VpdmVkIGF0 IGxlYXN0IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJfWVsc2V7CisJCW9rKCRub2RlX3N0 YW5kYnlfb2NjdXJyZW5jZXMgPT0gMCwgInJlY2VpdmVkIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9u IG9uIG5vZGUxIik7CisJfQorCisJaWYgKCRwcmltYXJ5Ml9leHBlY3RfdHJhZmZpYyA9PSAxKSB7 CisJCW9rKCRub2RlX3ByaW1hcnkyX29jY3VycmVuY2VzID4gMCwgInJlY2VpdmVkIGF0IGxlYXN0 IG9uZSBjb25uZWN0aW9uIG9uIG5vZGUxIik7CisJfWVsc2V7CisJCW9rKCRub2RlX3ByaW1hcnky X29jY3VycmVuY2VzID09IDAsICJyZWNlaXZlZCBhdCBsZWFzdCBvbmUgY29ubmVjdGlvbiBvbiBu b2RlMSIpOworCX0KKworCW9rKCR0b3RhbF9vY2N1cnJlbmNlcyA9PSA1MCwgInJlY2VpdmVkIDUw IGNvbm5lY3Rpb25zIGFjcm9zcyBhbGwgbm9kZXMiKTsKK30KKwordGVzdF90YXJnZXRfc2Vzc2lv bl9hdHRyKCdhbnknLAorCTEsIDEsIDEsIDEpOwordGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdy ZWFkLW9ubHknLAorCTIsIDAsIDEsIDApOwordGVzdF90YXJnZXRfc2Vzc2lvbl9hdHRyKCdyZWFk LXdyaXRlJywKKwkzLCAxLCAwLCAxKTsKK3Rlc3RfdGFyZ2V0X3Nlc3Npb25fYXR0cigncHJpbWFy eScsCisJNCwgMSwgMCwgMSk7Cit0ZXN0X3RhcmdldF9zZXNzaW9uX2F0dHIoJ3N0YW5kYnknLAor CTUsIDAsIDEsIDApOworCisKKyRub2RlX3ByaW1hcnkxLT5zdG9wKCk7Ciskbm9kZV9wcmltYXJ5 Mi0+c3RvcCgpOworJG5vZGVfc3RhbmRieS0+c3RvcCgpOworCitkb25lX3Rlc3RpbmcoKTsKLS0g CjIuNDcuMgoK --000000000000dd6c2b062ee58b81--