Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1erHFl-0004Co-Al for pgadmin-hackers@arkaria.postgresql.org; Thu, 01 Mar 2018 05:59:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1erHFk-0006MG-IP for pgadmin-hackers@arkaria.postgresql.org; Thu, 01 Mar 2018 05:59:40 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1erHCg-0004tM-4e for pgadmin-hackers@lists.postgresql.org; Thu, 01 Mar 2018 05:56:30 +0000 Received: from mail-ot0-x244.google.com ([2607:f8b0:4003:c0f::244]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1erHCa-00067c-L6 for pgadmin-hackers@postgresql.org; Thu, 01 Mar 2018 05:56:28 +0000 Received: by mail-ot0-x244.google.com with SMTP id 79so4561787oth.11 for ; Wed, 28 Feb 2018 21:56:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=YaeLoTd8/d/GihUe8D+4UmRIa8NUb2k6UZm5olc0uls=; b=CBjIEzjHFSGVefurMtk6Eyr/kYtMFvDFqVHBzhukfZT/uLNyyVscKO/b3Bkg6SQKeR H8jycB4m/Yt6gRF5Ucau4TKN9Jazy5K6bJOxO5kzU4hCUwCB33Mi8OKoMkzOqRFwxGEd CXftyEjZB/dKUvW4R3wSIyP1q7RUyA+LOahmbk9amX4zXvAwBY9Ys+ojhdr6AfyFkqD8 KSHC435ZBEbot9cvwOVi5JHrvLoBiu+D2QPjbf+cm92VYr9iDSjSNRyFY+kgzOy5ErGZ qqMDlqie27ifpo+ibDR3AOCCuOPrxND8EOjaW2rKQGufv/7yildvotPnboexemlYsWIv 5CMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=YaeLoTd8/d/GihUe8D+4UmRIa8NUb2k6UZm5olc0uls=; b=IlnFF6/888f4bgC10Bsi+ffU86tJwn2WWNNGhoRn0/nrfs7BCnsmji7NKsStCLpfKz iyJ9HNXRTIAgILGJkyDiqsMo25H4lA0KB6DQsa4BKogVCucRUYwmllM9jpT+QIWwpxlW mJUyXUJNtQ8Jc/zJt4WXbRHrrzAi+tFG0iuAUXwx0/mIOp/qrJwUaLU34Je0jveMyRKl Rs4RbadQjfVzje6ZhJPIVMYRCSU5D+j981XwqEwUekM8n8B877RW7bTKVG2RUK+hRz4u CiRjNBW2ITiXCD5UbKFGMHlMrBAsD89h5a8hzH2PcRA1BrSnZtW97iBLkJONgXGKKr+J mb5Q== X-Gm-Message-State: AElRT7GfODu5gEObtAo/yVdlJwBM2fjzc8zhJTZAw0ccbMrFgxkzgmXS j5HHdvhtQbcMVbZXtR3Bp9KT7YZBg3pNDlgIW7H+Ww== X-Google-Smtp-Source: AG47ELtDv2QIhs3ApXRg8PVCMsNwUdwlwzZJ/3NLYOMcRvV0djWmiVnsoPRnhtG26DZal6bfhuCmN04gFkz2NPEq5sI= X-Received: by 10.157.37.206 with SMTP id q72mr439869ota.296.1519883782202; Wed, 28 Feb 2018 21:56:22 -0800 (PST) MIME-Version: 1.0 Received: by 10.74.203.154 with HTTP; Wed, 28 Feb 2018 21:56:21 -0800 (PST) In-Reply-To: References: From: Khushboo Vashi Date: Thu, 1 Mar 2018 11:26:21 +0530 Message-ID: Subject: Re: pgAdmin 4 commit: Ensure we pick up the messages from the current query To: Joao De Almeida Pereira Cc: Dave Page , Murtuza Zabuawala , pgadmin-hackers Content-Type: multipart/mixed; boundary="001a113d747cf0ab4c05665384d8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --001a113d747cf0ab4c05665384d8 Content-Type: multipart/alternative; boundary="001a113d747cf0ab4905665384d6" --001a113d747cf0ab4905665384d6 Content-Type: text/plain; charset="UTF-8" Hi Joao, Thanks for reviewing. On Wed, Feb 28, 2018 at 8:55 PM, Joao De Almeida Pereira < jdealmeidapereira@pivotal.io> wrote: > Hello Khushboo, > After reviewing the patch I have the gut feeling that we do not have > enough test coverage on this issue, specially due to the intricate while > loop and conditions around the polling. > I think that this deserve Unit tests around it, When I say Unit Test I am > not talking about executing queries against the database, but do some > stubbing of the database so that we can control the flow that we want. > You are right. It needs more unit testing. I have checked below scenarios: 1. Returns 2 notices with data output 2. Returns 1000 notices with data output 3. No notices with data output By running above, I have checked, each time returned notices are accurate, no old notices are getting appended, it does not affect with the amount of messages (few, none or more). Also, with the updated patch, I have made sure that all these queries run with the single transaction id (same connection). So, please let me know if you think I can add more things to this. > > It is a temptation to try to always do a Feature Test to test what we want > because it is "easier" to write and ultimately it is what users see, but > while 1 Feature Test runs we can run 200 Unit Tests that give us much more > confidence that the code is doing what we expect it to do. > > Right, so added regression tests instead of feature tests. This being said, I run the tests on the CI Pipeline and all tests pass. > Running pycodestyle fails due to some line sizes on the > psycopg2/__init__py. I believe that it is not what you changed, but since > you were changing the file it can be fixed it is just: > > pgadmin/utils/driver/psycopg2/__init__.py:1276: [E501] line too long (81 > > 79 characters) > pgadmin/utils/driver/psycopg2/__init__.py:1277: [E501] line too long (91 > > 79 characters) > pgadmin/utils/driver/psycopg2/__init__.py:1282: [E501] line too long (81 > > 79 characters) > pgadmin/utils/driver/psycopg2/__init__.py:1283: [E501] line too long (91 > > 79 characters) > 4 E501 line too long (81 > 79 characters) > > Fixed. Thanks for pointing out. > > Thanks > Joao > > > On Wed, Feb 28, 2018 at 6:49 AM Khushboo Vashi < > khushboo.vashi@enterprisedb.com> wrote: > >> On Mon, Feb 26, 2018 at 10:02 PM, Dave Page wrote: >> >>> Argh, I ran some tests, but didn't spot any lost messages in the tests I >>> ran. I'll revert the patch. >>> >>> Khushboo; >>> >>> Please look at the following: >>> >>> - Fix the patch so it doesn't drop messages. >>> >> Fixed. >> By default, the notice attribute of the connection object of psycopg 2 >> only stores 50 notices. Once it reaches to 50 it starts from 1 again. >> To fix this I have changed the notice attribute from list to deque to >> append more messages. Currently I have kept the maximum limit at a time of >> the notice attribute is 100000 (in a single poll). >> >>> - Add regression tests to make sure it doesn't break in the future. This >>> may require creating one or more functions the spew out a whole lot of >>> notices, and then running a couple of queries and checking the output. >>> >> Added. With this regression test, the current code is failing which has >> been taken care in this patch. >> >>> - Check the messages panel on the history tab. I just noticed it seems >>> to only be showing an even smaller subset of the messages. >>> >> Tested and no issues found. >> >>> >>> >> Thanks. >>> >>> On Mon, Feb 26, 2018 at 4:23 PM, Murtuza Zabuawala >> enterprisedb.com> wrote: >>> >>>> Sent bit early, >>>> >>>> You can run 'VACUUM FULL VERBOSE' in query tool and verify the >>>> populated messages (pgAdmin3 vs. pgAdmin4). >>>> >>>> >>>> On Mon, Feb 26, 2018 at 9:48 PM, Murtuza Zabuawala >>> enterprisedb.com> wrote: >>>> >>>>> Hi Khushboo/Dave, >>>>> >>>>> With given commit, I'm again seeing the issue raised in >>>>> https://redmine.postgresql.org/issues/1523 :( >>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Regards, >>>>> Murtuza Zabuawala >>>>> EnterpriseDB: http://www.enterprisedb.com >>>>> The Enterprise PostgreSQL Company >>>>> >>>>> >>>>> On Mon, Feb 26, 2018 at 7:49 PM, Dave Page wrote: >>>>> >>>>>> Ensure we pick up the messages from the current query and not a >>>>>> previous one. Fixes #3094 >>>>>> >>>>>> Branch >>>>>> ------ >>>>>> master >>>>>> >>>>>> Details >>>>>> ------- >>>>>> https://git.postgresql.org/gitweb?p=pgadmin4.git;a=commitdiff;h= >>>>>> 08b3ccc01a4d57e8ea3657f8882a53dcd1b99386 >>>>>> Author: Khushboo Vashi >>>>>> >>>>>> Modified Files >>>>>> -------------- >>>>>> web/pgadmin/utils/driver/abstract.py | 1 + >>>>>> web/pgadmin/utils/driver/psycopg2/__init__.py | 64 >>>>>> +++++++++------------------ >>>>>> 2 files changed, 21 insertions(+), 44 deletions(-) >>>>>> >>>>>> >>>>> >>>> >>> >>> >>> -- >>> Dave Page >>> Blog: http://pgsnake.blogspot.com >>> Twitter: @pgsnake >>> >>> EnterpriseDB UK: http://www.enterprisedb.com >>> The Enterprise PostgreSQL Company >>> >> --001a113d747cf0ab4905665384d6 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Joao,

Thanks for reviewing.

On Wed, Feb 28, 2018 a= t 8:55 PM, Joao De Almeida Pereira <jdealmeidapereira@pivotal.i= o> wrote:
= Hello Khushboo,
After reviewing the patch I have the gut feeling that w= e do not have enough test coverage on this issue, specially due to the intr= icate while loop and conditions around the polling.
I think that = this deserve Unit tests around it, When I say Unit Test I am not talking ab= out executing queries against the database, but do some stubbing of the dat= abase so that we can control the flow that we want.
<= /blockquote>
You are right. It needs more unit testing. I have checked = below scenarios:
1. Returns 2 notices with data output
= 2. Returns 1000 notices with data output
3. No notices with data = output=C2=A0

By running above, I have checked, eac= h time returned notices are accurate, no old notices are getting appended, = it does not affect with the amount of messages (few, none or more).=C2=A0 A= lso, with the updated patch, I have made sure that all these queries run wi= th the single transaction id (same connection).

So= , please let me know if you think I can add more things to this.
=C2=A0=C2=A0
I= t is a temptation to try to always do a Feature Test to test what we want b= ecause it is "easier" to write and ultimately it is what users se= e, but while 1 Feature Test runs we can run 200 Unit Tests that give us muc= h more confidence that the code is doing what we expect it to do.

Right, so added regression tests instead= of feature tests.=C2=A0

This being said, I run the tests on the C= I Pipeline and all tests pass. Running pycodestyle fails due to some line s= izes on the psycopg2/__init__py. I believe that it is not what you changed,= but since you were changing the file it can be fixed it is just:

pgadmin/utils/driver/psycopg2/__init__.py:1276: [= E501] line too long (81 > 79 characters)
pgadmin/utils/driver/= psycopg2/__init__.py:1277: [E501] line too long (91 > 79 characters= )
pgadmin/utils/driver/psycopg2/__init__.py:1282: [E501] lin= e too long (81 > 79 characters)
pgadmin/utils/driver/psycopg2/= __init__.py:1283: [E501] line too long (91 > 79 characters)
4=C2=A0 =C2=A0 =C2=A0 =C2=A0E501 line too long (81 > 79 characters)

Fixed. Thanks for pointing= out.=C2=A0

Thanks
Joao


On Wed,= Feb 28, 2018 at 6:49 AM Khushboo Vashi <khushboo.vashi@enterprisedb.com<= /a>> wrote:
On Mon, Feb 26, 2018 at = 10:02 PM, Dave Page <dpage@pgadmin.org> wrote:
Argh, I ran some t= ests, but didn't spot any lost messages in the tests I ran. I'll re= vert the patch.

Khushboo;

Pleas= e look at the following:

- Fix the patch so it doe= sn't drop messages.
Fixed.<= /div>
By default, the notice attribute of the connection object of psyc= opg 2 only stores 50 notices. Once it reaches to 50 it starts from 1 again.=
To fix this I have changed the notice attribute from list to deq= ue to append more messages. Currently I have kept the maximum limit at a ti= me of the notice attribute is=C2=A0100000 (in a single poll).=C2=A0
- Add regression tests to make sure it doesn't break in the fu= ture. This may require creating one or more functions the spew out a whole = lot of notices, and then running a couple of queries and checking the outpu= t.
Added. With this regression t= est, the current code is failing which has been taken care in this patch.
- Check the messages panel on the history tab. I just notice= d it seems to only be showing an even smaller subset of the messages.
=
Tested and no issues found= .
=C2=A0
Thanks.
<= div>

On Mon, Feb 26,= 2018 at 4:23 PM, Murtuza Zabuawala <murtuza.zabuawala@enterprisedb.com> wrote:
Sent bit early,=C2=A0

You can run 'VACUUM FULL VERBOSE' in q= uery tool and verify the populated messages (pgAdmin3 vs. pgAdmin4).=C2=A0<= /div>


On Mon, Feb 26, 2018 at 9:48 PM, Murtuza Zabuawala <= mur= tuza.zabuawala@enterprisedb.com> wrote:
Hi Khushboo/Dave,

With given comm= it, I'm again seeing the issue raised in https://redmine.postgresql.= org/issues/1523 :(




--
Regards,=
= Murtuza Zabuawala
EnterpriseDB:=C2=A0http://www.enterprisedb.com=
The Enterprise PostgreSQL Company


On Mon, Feb 26, 2018 at 7:49 PM, Dave Page <= span dir=3D"ltr"><dpage@pgadmin.org> wrote:
Ensure we pick up the messages from the current query an= d not a previous one. Fixes #3094

Branch
------
master

Details
-------
https://git.postgresql.org/gitweb?p=3Dpgadmin4.git;a=3Dcommitdiff;h=3D08b3ccc01a4d57e8ea3657f8882a53dcd1b99386
Author: Khushboo Vashi <khushboo.vashi@enterprisedb.com>

Modified Files
--------------
web/pgadmin/utils/driver/abstract.py=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= |=C2=A0 1 +
web/pgadmin/utils/driver/psycopg2/__init__.py | 64 +++++++++----------= --------
2 files changed, 21 insertions(+), 44 deletions(-)






--
Dave Page
Blog: http://pgsnake.blogspot.= com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The = Enterprise PostgreSQL Company

--001a113d747cf0ab4905665384d6-- --001a113d747cf0ab4c05665384d8 Content-Type: text/x-patch; charset="US-ASCII"; name="RM_3094_ver2.patch" Content-Disposition: attachment; filename="RM_3094_ver2.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_je83i8sf0 ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL2ZlYXR1cmVfdGVzdHMva2V5Ym9hcmRfc2hvcnRjdXRf dGVzdC5weSBiL3dlYi9wZ2FkbWluL2ZlYXR1cmVfdGVzdHMva2V5Ym9hcmRfc2hvcnRjdXRfdGVz dC5weQppbmRleCBiODM0NTdjLi5iYmFlMTk0IDEwMDY0NAotLS0gYS93ZWIvcGdhZG1pbi9mZWF0 dXJlX3Rlc3RzL2tleWJvYXJkX3Nob3J0Y3V0X3Rlc3QucHkKKysrIGIvd2ViL3BnYWRtaW4vZmVh dHVyZV90ZXN0cy9rZXlib2FyZF9zaG9ydGN1dF90ZXN0LnB5CkBAIC02MiwxMCArNjIsMTMgQEAg Y2xhc3MgS2V5Ym9hcmRTaG9ydGN1dEZlYXR1cmVUZXN0KEJhc2VGZWF0dXJlVGVzdCk6CiAgICAg ICAgICAgICApLmtleV9kb3duKAogICAgICAgICAgICAgICAgIGtleV9jb21ib1syXQogICAgICAg ICAgICAgKS5rZXlfdXAoCi0gICAgICAgICAgICAgICAgS2V5cy5BTFQKKyAgICAgICAgICAgICAg ICBrZXlfY29tYm9bMF0KKyAgICAgICAgICAgICkua2V5X3VwKAorICAgICAgICAgICAgICAgIGtl eV9jb21ib1sxXQogICAgICAgICAgICAgKS5wZXJmb3JtKCkKIAotICAgICAgICAgICAgcHJpbnQo IkV4ZWN1dGluZyBzaG9ydGN1dDogIiArIHNlbGYubmV3X3Nob3J0Y3V0c1tzXVsnbG9jYXRvcidd ICsgIi4uLiIsIGZpbGU9c3lzLnN0ZGVyciwgZW5kPSIiKQorICAgICAgICAgICAgcHJpbnQoIkV4 ZWN1dGluZyBzaG9ydGN1dDogIiArIHNlbGYubmV3X3Nob3J0Y3V0c1tzXVsnbG9jYXRvciddICsK KyAgICAgICAgICAgICAgICAgICIuLi4iLCBmaWxlPXN5cy5zdGRlcnIsIGVuZD0iIikKIAogICAg ICAgICAgICAgc2VsZi53YWl0LnVudGlsKAogICAgICAgICAgICAgICAgIEVDLnByZXNlbmNlX29m X2VsZW1lbnRfbG9jYXRlZCgKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3Rvb2xzL3NxbGVkaXRv ci90ZXN0cy90ZXN0X3BvbGxfcXVlcnlfdG9vbC5weSBiL3dlYi9wZ2FkbWluL3Rvb2xzL3NxbGVk aXRvci90ZXN0cy90ZXN0X3BvbGxfcXVlcnlfdG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi5lNDcxMjliCi0tLSAvZGV2L251bGwKKysrIGIvd2ViL3BnYWRtaW4vdG9v bHMvc3FsZWRpdG9yL3Rlc3RzL3Rlc3RfcG9sbF9xdWVyeV90b29sLnB5CkBAIC0wLDAgKzEsMTEy IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwZ0FkbWluIDQgLSBQb3N0Z3JlU1FMIFRvb2xz CisjCisjIENvcHlyaWdodCAoQykgMjAxMyAtIDIwMTgsIFRoZSBwZ0FkbWluIERldmVsb3BtZW50 IFRlYW0KKyMgVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgUG9zdGdyZVNRTCBM aWNlbmNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbXBvcnQganNvbgorCitmcm9tIHBnYWRt aW4uYnJvd3Nlci5zZXJ2ZXJfZ3JvdXBzLnNlcnZlcnMuZGF0YWJhc2VzLnRlc3RzIGltcG9ydCB1 dGlscyBhcyBcCisgICAgZGF0YWJhc2VfdXRpbHMKK2Zyb20gcGdhZG1pbi51dGlscy5yb3V0ZSBp bXBvcnQgQmFzZVRlc3RHZW5lcmF0b3IKK2Zyb20gcmVncmVzc2lvbiBpbXBvcnQgcGFyZW50X25v ZGVfZGljdAorZnJvbSByZWdyZXNzaW9uLnB5dGhvbl90ZXN0X3V0aWxzIGltcG9ydCB0ZXN0X3V0 aWxzIGFzIHV0aWxzCisKKworY2xhc3MgVGVzdFBvbGxRdWVyeVRvb2woQmFzZVRlc3RHZW5lcmF0 b3IpOgorICAgICIiIiBUaGlzIGNsYXNzIHdpbGwgdGVzdCB0aGUgcXVlcnkgdG9vbCBwb2xsaW5n LiAiIiIKKyAgICBzY2VuYXJpb3MgPSBbCisgICAgICAgICgnV2hlbiBxdWVyeSB0b29sIHBvbGxp bmcgcmV0dXJucyBtZXNzYWdlcyB3aXRoIHJlc3VsdCBkYXRhLXNldCcsCisgICAgICAgICBkaWN0 KAorICAgICAgICAgICAgIHNxbD1bCisgICAgICAgICAgICAgICAgICIiIgorRFJPUCBUQUJMRSBJ RiBFWElTVFMgdGVzdF9mb3Jfbm90aWNlczsKKworRE8gJCQKK0JFR0lOCisgICAgUkFJU0UgTk9U SUNFICdIZWxsbywgd29ybGQhJzsKK0VORCAkJDsKKworU0VMRUNUICdDSEVDS0lORyBQT0xMSU5H JzsKKyIiIiwKKyAgICAgICAgICAgICAgICAgIiIiCitETyAkJAorQkVHSU4KKyAgICBGT1IgaSBp biAxLi4xMDAwIExPT1AKKyAgICAgICAgUkFJU0UgTk9USUNFICdDb3VudCBpcyAlJywgaTsKKyAg ICBFTkQgTE9PUDsKK0VORCAkJDsKKworU0VMRUNUICdDSEVDS0lORyBQT0xMSU5HIEZPUiBMT05H IE1FU1NBR0VTJzsKKyIiIiwKKyAgICAgICAgICAgICAgICAgIlNFTEVDVCAnQ0hFQ0tJTkcgUE9M TElORyBXSVRIT1VUIE1FU1NBR0VTJzsiCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAg ICAgIGV4cGVjdGVkX21lc3NhZ2U9WydOT1RJQ0U6ICB0YWJsZSAidGVzdF9mb3Jfbm90aWNlcyIg JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiZG9lcyBub3QgZXhpc3QsIHNr aXBwaW5nCitOT1RJQ0U6ICBIZWxsbywgd29ybGQhCisiIiIsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIlxuIi5qb2luKFsiTk9USUNFOiAgQ291bnQgaXMgezB9Ii5mb3JtYXQoaSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdl KDEsIDEwMDEpXSkgKyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmVd LAorICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3VsdD1bJ0NIRUNLSU5HIFBPTExJTkcnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NIRUNLSU5HIFBPTExJTkcgRk9SIExPTkcgTUVT U0FHRVMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NIRUNLSU5HIFBPTExJTkcg V0lUSE9VVCBNRVNTQUdFUyddLAorICAgICAgICAgICAgIHByaW50X21lc3NhZ2VzPVsnMiBOT1RJ Q0VTIFdJVEggREFUQVNFVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAwIE5P VElDRVMgV0lUSCBEQVRBU0VUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05PIE5P VElDRSBXSVRIIERBVEFTRVQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAg ICAgICkpCisgICAgXQorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICIiIiBUaGlz IGZ1bmN0aW9uIHdpbGwgY2hlY2sgbWVzc2FnZXMgcmV0dXJuIGJ5IHF1ZXJ5IHRvb2wgcG9sbGlu Zy4gIiIiCisgICAgICAgIGRhdGFiYXNlX2luZm8gPSBwYXJlbnRfbm9kZV9kaWN0WyJkYXRhYmFz ZSJdWy0xXQorICAgICAgICBzZWxmLnNlcnZlcl9pZCA9IGRhdGFiYXNlX2luZm9bInNlcnZlcl9p ZCJdCisKKyAgICAgICAgc2VsZi5kYl9pZCA9IGRhdGFiYXNlX2luZm9bImRiX2lkIl0KKyAgICAg ICAgZGJfY29uID0gZGF0YWJhc2VfdXRpbHMuY29ubmVjdF9kYXRhYmFzZShzZWxmLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLlNFUlZFUl9H Uk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz ZWxmLnNlcnZlcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzZWxmLmRiX2lkKQorICAgICAgICBpZiBub3QgZGJfY29uWyJpbmZvIl0gPT0gIkRh dGFiYXNlIGNvbm5lY3RlZC4iOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZCBu b3QgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuIikKKworICAgICAgICAjIEluaXRpYWxpemUgcXVl cnkgdG9vbAorICAgICAgICB1cmwgPSAnL2RhdGFncmlkL2luaXRpYWxpemUvcXVlcnlfdG9vbC97 MH0vezF9L3syfScuZm9ybWF0KAorICAgICAgICAgICAgdXRpbHMuU0VSVkVSX0dST1VQLCBzZWxm LnNlcnZlcl9pZCwgc2VsZi5kYl9pZCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnRlc3Rlci5w b3N0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzcG9uc2Uuc3RhdHVzX2NvZGUs IDIwMCkKKworICAgICAgICByZXNwb25zZV9kYXRhID0ganNvbi5sb2FkcyhyZXNwb25zZS5kYXRh LmRlY29kZSgndXRmLTgnKSkKKyAgICAgICAgc2VsZi50cmFuc19pZCA9IHJlc3BvbnNlX2RhdGFb J2RhdGEnXVsnZ3JpZFRyYW5zSWQnXQorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZm9yIHMg aW4gc2VsZi5zcWw6CisgICAgICAgICAgICBwcmludCgiRXhlY3V0aW5nIGFuZCBwb2xsaW5nIHdp dGg6ICIgKyBzZWxmLnByaW50X21lc3NhZ2VzW2NudF0pCisgICAgICAgICAgICAjIFN0YXJ0IHF1 ZXJ5IHRvb2wgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIHVybCA9ICcvc3FsZWRpdG9yL3F1ZXJ5 X3Rvb2wvc3RhcnQvezB9Jy5mb3JtYXQoc2VsZi50cmFuc19pZCkKKyAgICAgICAgICAgIHJlc3Bv bnNlID0gc2VsZi50ZXN0ZXIucG9zdCh1cmwsIGRhdGE9anNvbi5kdW1wcyh7InNxbCI6IHN9KSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU9J2h0 bWwvanNvbicpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLnN0YXR1 c19jb2RlLCAyMDApCisKKyAgICAgICAgICAgICMgUXVlcnkgdG9vbCBwb2xsaW5nCisgICAgICAg ICAgICB1cmwgPSAnL3NxbGVkaXRvci9wb2xsL3swfScuZm9ybWF0KHNlbGYudHJhbnNfaWQpCisg ICAgICAgICAgICByZXNwb25zZSA9IHNlbGYudGVzdGVyLmdldCh1cmwpCisgICAgICAgICAgICBz ZWxmLmFzc2VydEVxdWFscyhyZXNwb25zZS5zdGF0dXNfY29kZSwgMjAwKQorICAgICAgICAgICAg cmVzcG9uc2VfZGF0YSA9IGpzb24ubG9hZHMocmVzcG9uc2UuZGF0YS5kZWNvZGUoJ3V0Zi04Jykp CisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIHJldHVybmVkIG1lc3NhZ2VzCisgICAgICAgICAg ICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmV4cGVjdGVkX21lc3NhZ2VbY250XSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2RhdGFbJ2RhdGEnXVsnYWRkaXRpb25hbF9t ZXNzYWdlcyddKQorICAgICAgICAgICAgIyBDaGVjayB0aGUgb3V0cHV0CisgICAgICAgICAgICBz ZWxmLmFzc2VydEVxdWFscyhzZWxmLmV4cGVjdGVkX3Jlc3VsdFtjbnRdLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfZGF0YVsnZGF0YSddWydyZXN1bHQnXVswXVswXSkK KworICAgICAgICAgICAgY250ICs9IDEKKworICAgICAgICAjIERpc2Nvbm5lY3QgdGhlIGRhdGFi YXNlCisgICAgICAgIGRhdGFiYXNlX3V0aWxzLmRpc2Nvbm5lY3RfZGF0YWJhc2Uoc2VsZiwgc2Vs Zi5zZXJ2ZXJfaWQsIHNlbGYuZGJfaWQpCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi91dGlscy9k cml2ZXIvYWJzdHJhY3QucHkgYi93ZWIvcGdhZG1pbi91dGlscy9kcml2ZXIvYWJzdHJhY3QucHkK aW5kZXggMzJlMWM5Ny4uMjcxYmZlYyAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vdXRpbHMvZHJp dmVyL2Fic3RyYWN0LnB5CisrKyBiL3dlYi9wZ2FkbWluL3V0aWxzL2RyaXZlci9hYnN0cmFjdC5w eQpAQCAtMTY4LDYgKzE2OCw4IEBAIGNsYXNzIEJhc2VDb25uZWN0aW9uKG9iamVjdCk6CiAgICAg QVNZTkNfV1JJVEVfVElNRU9VVCA9IDMKICAgICBBU1lOQ19OT1RfQ09OTkVDVEVEID0gNAogICAg IEFTWU5DX0VYRUNVVElPTl9BQk9SVEVEID0gNQorICAgIEFTWU5DX1RJTUVPVVQgPSAwLjIKKyAg ICBBU1lOQ19OT1RJQ0VfTUFYTEVOR1RIID0gMTAwMDAwCiAKICAgICBAYWJzdHJhY3RtZXRob2QK ICAgICBkZWYgY29ubmVjdChzZWxmLCAqKmt3YXJncyk6CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1p bi91dGlscy9kcml2ZXIvcHN5Y29wZzIvX19pbml0X18ucHkgYi93ZWIvcGdhZG1pbi91dGlscy9k cml2ZXIvcHN5Y29wZzIvX19pbml0X18ucHkKaW5kZXggODE0NDJlNC4uOTQxYTY5NCAxMDA2NDQK LS0tIGEvd2ViL3BnYWRtaW4vdXRpbHMvZHJpdmVyL3BzeWNvcGcyL19faW5pdF9fLnB5CisrKyBi L3dlYi9wZ2FkbWluL3V0aWxzL2RyaXZlci9wc3ljb3BnMi9fX2luaXRfXy5weQpAQCAtMzcsNiAr MzcsNyBAQCBmcm9tIC5jdXJzb3IgaW1wb3J0IERpY3RDdXJzb3IKIGZyb20gLnR5cGVjYXN0IGlt cG9ydCByZWdpc3Rlcl9nbG9iYWxfdHlwZWNhc3RlcnMsIFwKICAgICByZWdpc3Rlcl9zdHJpbmdf dHlwZWNhc3RlcnMsIHJlZ2lzdGVyX2JpbmFyeV90eXBlY2FzdGVycywgXAogICAgIHJlZ2lzdGVy X2FycmF5X3RvX3N0cmluZ190eXBlY2FzdGVycywgQUxMX0pTT05fVFlQRVMKK2Zyb20gY29sbGVj dGlvbnMgaW1wb3J0IGRlcXVlCiAKIAogaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6CkBAIC0x MTAsNyArMTExLDcgQEAgY2xhc3MgQ29ubmVjdGlvbihCYXNlQ29ubmVjdGlvbik6CiAgICAgICAt IFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gd2FpdCBmb3IgYXN5bmNocm9ub3VzIGNvbm5lY3Rpb24u IFRoaXMgaXMgYQogICAgICAgICBibG9ja2luZyBjYWxsLgogCi0gICAgKiBfd2FpdF90aW1lb3V0 KGNvbm4sIHRpbWUpCisgICAgKiBfd2FpdF90aW1lb3V0KGNvbm4pCiAgICAgICAtIFRoaXMgbWV0 aG9kIGlzIHVzZWQgdG8gd2FpdCBmb3IgYXN5bmNocm9ub3VzIGNvbm5lY3Rpb24gd2l0aCB0aW1l b3V0LgogICAgICAgICBUaGlzIGlzIGEgbm9uIGJsb2NraW5nIGNhbGwuCiAKQEAgLTMxMCw2ICsz MTEsOSBAQCBjbGFzcyBDb25uZWN0aW9uKEJhc2VDb25uZWN0aW9uKToKICAgICAgICAgICAgICkK ICAgICAgICAgICAgIHJldHVybiBGYWxzZSwgbXNnCiAKKyAgICAgICAgIyBPdmVyd3JpdGUgY29u bmVjdGlvbiBub3RpY2UgYXR0ciB0byBzdXBwb3J0CisgICAgICAgICMgbW9yZSB0aGFuIDUwIG5v dGljZXMgYXQgYSB0aW1lCisgICAgICAgIHBnX2Nvbm4ubm90aWNlcyA9IGRlcXVlKFtdLCBzZWxm LkFTWU5DX05PVElDRV9NQVhMRU5HVEgpCiAgICAgICAgIHNlbGYuY29ubiA9IHBnX2Nvbm4KICAg ICAgICAgc2VsZi53YXNDb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgIHRyeToKQEAgLTEyMDgsNiAr MTIxMiw3IEBAIEZhaWxlZCB0byByZXNldCB0aGUgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIGR1 ZSB0byBmb2xsb3dpbmcgZXJyb3I6CiAgICAgICAgICAgICApCiAgICAgICAgICAgICByZXR1cm4g RmFsc2UsIG1zZwogCisgICAgICAgIHBnX2Nvbm4ubm90aWNlcyA9IGRlcXVlKFtdLCBzZWxmLkFT WU5DX05PVElDRV9NQVhMRU5HVEgpCiAgICAgICAgIHNlbGYuY29ubiA9IHBnX2Nvbm4KICAgICAg ICAgc2VsZi5fX2JhY2tlbmRfcGlkID0gcGdfY29ubi5nZXRfYmFja2VuZF9waWQoKQogCkBAIC0x MjYxLDUxICsxMjY2LDMxIEBAIEZhaWxlZCB0byByZXNldCB0aGUgY29ubmVjdGlvbiB0byB0aGUg c2VydmVyIGR1ZSB0byBmb2xsb3dpbmcgZXJyb3I6CiAKICAgICAgICAgQXJnczoKICAgICAgICAg ICAgIGNvbm46IGNvbm5lY3Rpb24gb2JqZWN0Ci0gICAgICAgICAgICB0aW1lOiB3YWl0IHRpbWUK ICAgICAgICAgIiIiCi0KLSAgICAgICAgc3RhdGUgPSBjb25uLnBvbGwoKQotICAgICAgICBpZiBz dGF0ZSA9PSBwc3ljb3BnMi5leHRlbnNpb25zLlBPTExfT0s6Ci0gICAgICAgICAgICByZXR1cm4g c2VsZi5BU1lOQ19PSwotICAgICAgICBlbGlmIHN0YXRlID09IHBzeWNvcGcyLmV4dGVuc2lvbnMu UE9MTF9XUklURToKLSAgICAgICAgICAgICMgV2FpdCBmb3IgdGhlIGdpdmVuIHRpbWUgYW5kIHRo ZW4gY2hlY2sgdGhlIHJldHVybiBzdGF0dXMKLSAgICAgICAgICAgICMgSWYgdGhyZWUgZW1wdHkg bGlzdHMgYXJlIHJldHVybmVkIHRoZW4gdGhlIHRpbWUtb3V0IGlzIHJlYWNoZWQuCi0gICAgICAg ICAgICB0aW1lb3V0X3N0YXR1cyA9IHNlbGVjdC5zZWxlY3QoW10sIFtjb25uLmZpbGVubygpXSwg W10sIDApCi0gICAgICAgICAgICBpZiB0aW1lb3V0X3N0YXR1cyA9PSAoW10sIFtdLCBbXSk6Ci0g ICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuQVNZTkNfV1JJVEVfVElNRU9VVAotCi0gICAgICAg ICAgICAjIHBvbGwgYWdhaW4gdG8gY2hlY2sgdGhlIHN0YXRlIGlmIGl0IGlzIHN0aWxsIFBPTExf V1JJVEUKLSAgICAgICAgICAgICMgdGhlbiByZXR1cm4gQVNZTkNfV1JJVEVfVElNRU9VVCBlbHNl IHJldHVybiBBU1lOQ19PSy4KKyAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgIHN0YXRlID0g Y29ubi5wb2xsKCkKLSAgICAgICAgICAgIGlmIHN0YXRlID09IHBzeWNvcGcyLmV4dGVuc2lvbnMu UE9MTF9XUklURToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5BU1lOQ19XUklURV9USU1F T1VUCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5BU1lOQ19PSwotICAgICAgICBlbGlmIHN0YXRl ID09IHBzeWNvcGcyLmV4dGVuc2lvbnMuUE9MTF9SRUFEOgotICAgICAgICAgICAgIyBXYWl0IGZv ciB0aGUgZ2l2ZW4gdGltZSBhbmQgdGhlbiBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cwotICAgICAg ICAgICAgIyBJZiB0aHJlZSBlbXB0eSBsaXN0cyBhcmUgcmV0dXJuZWQgdGhlbiB0aGUgdGltZS1v dXQgaXMgcmVhY2hlZC4KLSAgICAgICAgICAgIHRpbWVvdXRfc3RhdHVzID0gc2VsZWN0LnNlbGVj dChbY29ubi5maWxlbm8oKV0sIFtdLCBbXSwgMCkKLSAgICAgICAgICAgIGlmIHRpbWVvdXRfc3Rh dHVzID09IChbXSwgW10sIFtdKToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5BU1lOQ19S RUFEX1RJTUVPVVQKLQotICAgICAgICAgICAgIyBzZWxlY3Quc2VsZWN0IHRpbWVvdXQgb3B0aW9u IHdvcmtzIG9ubHkgaWYgd2UgcHJvdmlkZQotICAgICAgICAgICAgIyAgZW1wdHkgW10gW10gW10g ZmlsZSBkZXNjcmlwdG9yIGluIHNlbGVjdC5zZWxlY3QoKSBmdW5jdGlvbgotICAgICAgICAgICAg IyBhbmQgdGhhdCBhbHNvIHdvcmtzIG9ubHkgb24gVU5JWCBiYXNlZCBzeXN0ZW0sIGl0IGRvIG5v dCBzdXBwb3J0Ci0gICAgICAgICAgICAjIFdpbmRvd3MgSGVuY2Ugd2UgaGF2ZSB3cm90ZSBvdXIg b3duIHBvb2xpbmcgbWVjaGFuaXNtIHRvIHJlYWQKLSAgICAgICAgICAgICMgZGF0YSBmYXN0IGVh Y2ggY2FsbCBjb25uLnBvbGwoKSByZWFkcyBjaHVua3Mgb2YgZGF0YSBmcm9tCi0gICAgICAgICAg ICAjIGNvbm5lY3Rpb24gb2JqZWN0IG1vcmUgd2UgcG9sbCBtb3JlIHdlIHJlYWQgZGF0YSBmcm9t IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGNudCA9IDAKLSAgICAgICAgICAgIHdoaWxlIGNudCA8 IDEwMDA6Ci0gICAgICAgICAgICAgICAgIyBwb2xsIGFnYWluIHRvIGNoZWNrIHRoZSBzdGF0ZSBp ZiBpdCBpcyBzdGlsbCBQT0xMX1JFQUQKLSAgICAgICAgICAgICAgICAjIHRoZW4gcmV0dXJuIEFT WU5DX1JFQURfVElNRU9VVCBlbHNlIHJldHVybiBBU1lOQ19PSy4KLSAgICAgICAgICAgICAgICBz dGF0ZSA9IGNvbm4ucG9sbCgpCi0gICAgICAgICAgICAgICAgaWYgc3RhdGUgPT0gcHN5Y29wZzIu ZXh0ZW5zaW9ucy5QT0xMX09LOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5BU1lO Q19PSwotICAgICAgICAgICAgICAgIGNudCArPSAxCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5B U1lOQ19SRUFEX1RJTUVPVVQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIHBzeWNv cGcyLk9wZXJhdGlvbmFsRXJyb3IoCi0gICAgICAgICAgICAgICAgInBvbGwoKSByZXR1cm5lZCAl cyBmcm9tIF93YWl0X3RpbWVvdXQgZnVuY3Rpb24iICUgc3RhdGUKLSAgICAgICAgICAgICkKKyAg ICAgICAgICAgIGlmIHN0YXRlID09IHBzeWNvcGcyLmV4dGVuc2lvbnMuUE9MTF9PSzoKKyAgICAg ICAgICAgICAgICByZXR1cm4gc2VsZi5BU1lOQ19PSworICAgICAgICAgICAgZWxpZiBzdGF0ZSA9 PSBwc3ljb3BnMi5leHRlbnNpb25zLlBPTExfV1JJVEU6CisgICAgICAgICAgICAgICAgIyBXYWl0 IGZvciB0aGUgZ2l2ZW4gdGltZSBhbmQgdGhlbiBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cworICAg ICAgICAgICAgICAgICMgSWYgdGhyZWUgZW1wdHkgbGlzdHMgYXJlIHJldHVybmVkIHRoZW4gdGhl IHRpbWUtb3V0IGlzCisgICAgICAgICAgICAgICAgIyByZWFjaGVkLgorICAgICAgICAgICAgICAg IHRpbWVvdXRfc3RhdHVzID0gc2VsZWN0LnNlbGVjdChbXSwgW2Nvbm4uZmlsZW5vKCldLCBbXSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5BU1lO Q19USU1FT1VUKQorICAgICAgICAgICAgICAgIGlmIHRpbWVvdXRfc3RhdHVzID09IChbXSwgW10s IFtdKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuQVNZTkNfV1JJVEVfVElNRU9V VAorICAgICAgICAgICAgZWxpZiBzdGF0ZSA9PSBwc3ljb3BnMi5leHRlbnNpb25zLlBPTExfUkVB RDoKKyAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIHRoZSBnaXZlbiB0aW1lIGFuZCB0aGVuIGNo ZWNrIHRoZSByZXR1cm4gc3RhdHVzCisgICAgICAgICAgICAgICAgIyBJZiB0aHJlZSBlbXB0eSBs aXN0cyBhcmUgcmV0dXJuZWQgdGhlbiB0aGUgdGltZS1vdXQgaXMKKyAgICAgICAgICAgICAgICAj IHJlYWNoZWQuCisgICAgICAgICAgICAgICAgdGltZW91dF9zdGF0dXMgPSBzZWxlY3Quc2VsZWN0 KFtjb25uLmZpbGVubygpXSwgW10sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzZWxmLkFTWU5DX1RJTUVPVVQpCisgICAgICAgICAgICAgICAgaWYg dGltZW91dF9zdGF0dXMgPT0gKFtdLCBbXSwgW10pOgorICAgICAgICAgICAgICAgICAgICByZXR1 cm4gc2VsZi5BU1lOQ19SRUFEX1RJTUVPVVQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAg ICAgICAgcmFpc2UgcHN5Y29wZzIuT3BlcmF0aW9uYWxFcnJvcigKKyAgICAgICAgICAgICAgICAg ICAgInBvbGwoKSByZXR1cm5lZCAlcyBmcm9tIF93YWl0X3RpbWVvdXQgZnVuY3Rpb24iICUgc3Rh dGUKKyAgICAgICAgICAgICAgICApCiAKICAgICBkZWYgcG9sbChzZWxmLCBmb3JtYXR0ZWRfZXhj ZXB0aW9uX21zZz1GYWxzZSwgbm9fcmVzdWx0PUZhbHNlKToKICAgICAgICAgIiIiCkBAIC0xMzQ3 LDggKzEzMzIsOCBAQCBGYWlsZWQgdG8gcmVzZXQgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZl ciBkdWUgdG8gZm9sbG93aW5nIGVycm9yOgogICAgICAgICAgICAgaXNfZXJyb3IgPSBUcnVlCiAK ICAgICAgICAgaWYgc2VsZi5jb25uLm5vdGljZXMgYW5kIHNlbGYuX19ub3RpY2VzIGlzIG5vdCBO b25lOgotICAgICAgICAgICAgd2hpbGUgc2VsZi5jb25uLm5vdGljZXM6Ci0gICAgICAgICAgICAg ICAgc2VsZi5fX25vdGljZXMuYXBwZW5kKHNlbGYuY29ubi5ub3RpY2VzLnBvcCgwKVs6XSkKKyAg ICAgICAgICAgIHNlbGYuX19ub3RpY2VzLmV4dGVuZChzZWxmLmNvbm4ubm90aWNlcykKKyAgICAg ICAgICAgIHNlbGYuY29ubi5ub3RpY2VzLmNsZWFyKCkKIAogICAgICAgICAjIFdlIGFsc28gbmVl ZCB0byBmZXRjaCBub3RpY2VzIGJlZm9yZSB3ZSByZXR1cm4gZnJvbSBmdW5jdGlvbiBpbiBjYXNl CiAgICAgICAgICMgb2YgYW55IEV4Y2VwdGlvbiwgVG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiB3 ZSB3aWxsIHJldHVybiBhZnRlcgo= --001a113d747cf0ab4c05665384d8--