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 1v7B6f-00GBFf-Bj for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Oct 2025 11:16:17 +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 1v7B6d-00BsPU-0t for pgsql-hackers@arkaria.postgresql.org; Fri, 10 Oct 2025 11:16:15 +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 1v7B6c-00BsP9-99 for pgsql-hackers@lists.postgresql.org; Fri, 10 Oct 2025 11:16:15 +0000 Received: from forward100d.mail.yandex.net ([2a02:6b8:c41:1300:1:45:d181:d100]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1v7B6W-0011pw-04 for pgsql-hackers@lists.postgresql.org; Fri, 10 Oct 2025 11:16:14 +0000 Received: from mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:201b:0:640:dd3f:0]) by forward100d.mail.yandex.net (Yandex) with ESMTPS id 4CEE3C0079; Fri, 10 Oct 2025 14:16:00 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id wFJbLWbL34Y0-MDgEdMPY; Fri, 10 Oct 2025 14:15:59 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1760094959; bh=gDEy/n/Lx2msqsCnSYasVmXcKIGRKnHTyy94XOCiQ9I=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=n+al8TBqAZlDLcuy8w10YtmIpNZlpT0PwxwY1pCwmu7LMBfFod1AasSkedXyCWWEv byhjKuD19JNVdCTBhGYVLLTjTBP6jozq4mCbqloCwRFu2CZYmp2/gUgCiffTDea1iB Z0HVq3GB/bFU4XlmKsrNoBEP4lWlWZlHYVdPLf8E= Authentication-Results: mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Content-Type: multipart/mixed; boundary="------------L1JycJBl0zJGKV0dRzGVia1e" Message-ID: <0c498546-8af0-4aec-98fa-ad4f373cf711@yandex.ru> Date: Fri, 10 Oct 2025 14:15:58 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: pull-up subquery if JOIN-ON contains refs to upper-query To: Ilia Evdokimov Cc: Ranier Vilela , PostgreSQL Hackers , Peter Petrov , David Rowley References: <0b1f670d-b39d-4966-bf32-f0d502ebc564@postgrespro.ru> <46bc4eaf-58c5-42ab-8041-d3380a0768de@postgrespro.ru> <9b041978-06e3-4a50-8a5d-dacbb054f23e@tantorlabs.com> <8d7cbbf6-ddc0-4696-8af2-a68d740e14f2@postgrespro.ru> <6078f7e1-4b29-4b31-bd28-b84149e404e4@postgrespro.ru> <975a3736-a8b5-49b3-8009-4d4e86867aa1@postgrespro.ru> <0adbf75a-2059-4bb7-b878-c33892dbc1f0@tantorlabs.com> <300d7bb0-345c-4c0b-a0ef-4de573fcc94b@postgrespro.ru> <32446f52-1b18-499a-a77b-d6b66ad0f4cf@tantorlabs.com> <87a6fcbf-929a-408a-9471-28be3080254a@postgrespro.ru> <4e9d279c-83c1-42d3-b74d-7366ecd7f085@tantorlabs.com> Content-Language: en-US From: Alena Rybakina In-Reply-To: <4e9d279c-83c1-42d3-b74d-7366ecd7f085@tantorlabs.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------L1JycJBl0zJGKV0dRzGVia1e Content-Type: multipart/alternative; boundary="------------YbWtzKCKx8loSyCFzEsHx6Gx" --------------YbWtzKCKx8loSyCFzEsHx6Gx Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi! On 03.09.2025 00:07, Ilia Evdokimov wrote: > > Hi, > > I've reviewed this patch, and I have suggestion about the approach. > > Currently, the patch extends 'convert_EXISTS_sublick_to_join' with=20 > quite complex logic (clause collection, volatile checks, rewriting=20 > join quals, etc). While it works, the amount of branching and special=20 > cases makes the function harder to follow. > > Looking at the logic, it seems that a large part of the complexity=20 > comes from trying to directly adapt 'convert_EXISTS_sublink_to_join'=20 > instead of factoring out a dedicated path. An alternative would be to=20 > introduce a separate function=20 > *'convert_EXISTS_sublink_to_lateral_join' *- with a similar API to=20 > 'convert_ANY_sublink_to_join'. Such a function can focus only on the=20 > EXISTS-to-join case, while keeping the existing function shorter and=20 > easier to reason about. > > I even made some first rough sketches of this approach (not a finished=20 > patch, just an outline). Of course, it would still need proper=20 > adaptation, but I think it demonstrates that the overall structure can=20 > be kept simpler. > > What do you think about refactoring in this direction? > > I think this approach isn=E2=80=99t fully correct. By forming a join betw= een a=20 subquery and the outer relation, you effectively force the optimizer to=20 choose a Nested Loop join. Furthermore, it prevents the planner from=20 exploring all join orders between the subquery=E2=80=99s tables and the o= uter=20 relation, so we may miss a more optimal plan. With your patch, I consistently get the following plan. I even disabled=20 nested loops to see whether the planner could switch to a Hash Join or=20 Merge Join, but those aren=E2=80=99t applicable with lateral parameters i= n this=20 pattern. CREATE TABLE ta (id int PRIMARY KEY, val int); INSERT INTO ta VALUES (1,1), (2,2); CREATE TABLE tb (id int PRIMARY KEY, aval int); INSERT INTO tb VALUES (1,1), (2,1); CREATE TABLE tc (id int PRIMARY KEY, aid int); INSERT INTO tc VALUES (3,5), (1,5); CREATE TABLE td (id int PRIMARY KEY, aid int); INSERT INTO td VALUES (1,6), (2,7), (3,8), (4,9); CREATE TABLE te (id int PRIMARY KEY, aid int); INSERT INTO te VALUES (5,6), (6,7), (7,8), (4,9), (1,1); SET enable_nestloop =3D OFF; EXPLAIN ANALYZE SELECT ta.id FROM ta WHERE EXISTS ( =C2=A0 SELECT 1 =C2=A0 FROM tb =C2=A0 WHERE tb.id =3D ta.id =C2=A0=C2=A0=C2=A0 AND EXISTS (SELECT 1 FROM tc WHERE tc.id =3D tb.id) ); =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=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=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN -------------------------------------------------------------------------= ------------------------------------------------------- =C2=A0Nested Loop Semi Join=C2=A0 (cost=3D0.31..37017.50 rows=3D2260 wid= th=3D4) (actual=20 time=3D0.116..0.142 rows=3D2.00 loops=3D1) =C2=A0=C2=A0 Disabled: true =C2=A0=C2=A0 Buffers: local hit=3D9 =C2=A0=C2=A0 ->=C2=A0 Seq Scan on ta=C2=A0 (cost=3D0.00..32.60 rows=3D22= 60 width=3D4) (actual=20 time=3D0.037..0.039 rows=3D2.00 loops=3D1) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Buffers: local hit=3D1 =C2=A0=C2=A0 ->=C2=A0 Nested Loop Semi Join=C2=A0 (cost=3D0.31..16.36 ro= ws=3D1 width=3D0) (actual=20 time=3D0.045..0.046 rows=3D1.00 loops=3D2) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Disabled: true =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Buffers: local hit=3D8 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ->=C2=A0 Index Only Sca= n using tb_pkey on tb (cost=3D0.15..8.17=20 rows=3D1 width=3D4) (actual time=3D0.030..0.030 rows=3D1.00 loops=3D2) =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 Index Cond: (id =3D ta.id) =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 Heap Fetches: 2 =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 Index Searches: 2 =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 Buffers: local hit=3D4 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ->=C2=A0 Index Only Sca= n using tc_pkey on tc (cost=3D0.15..8.17=20 rows=3D1 width=3D4) (actual time=3D0.010..0.010 rows=3D1.00 loops=3D2) =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 Index Cond: (id =3D ta.id) =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 Heap Fetches: 2 =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 Index Searches: 2 =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 Buffers: local hit=3D4 =C2=A0Planning Time: 0.539 ms =C2=A0Execution Time: 0.252 ms (20 rows) Anyway, thank you for the work and attention here - your feedback was=20 useful! I=E2=80=99ve also rebased the patch on current master. --------------YbWtzKCKx8loSyCFzEsHx6Gx Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

Hi!

On 03.09.2025 00:07, Ilia Evdokimov wrote:

Hi,

I've reviewed this patch, and I have suggestion about the approach.

Currently, the patch extends 'convert_EXISTS_sublick_to_join' with quite complex logic (clause collection, volatile checks, rewriting join quals, etc). While it works, the amount of branching and special cases makes the function harder to follow.<= /p>

Looking at the logic, it seems that a large part of the complexity comes from trying to directly adapt 'convert_EXISTS_sublink_to_join' instead of factoring out a dedicated path. An alternative would be to introduce a separate function 'convert_EXISTS_sublink_to_lateral_join' - with a similar API to 'convert_ANY_sublink_to_join'. Such a function can focus only on the EXISTS-to-join case, while keeping the existing function shorter and easier to reason about.

I even made some first rough sketches of this approach (not a finished patch, just an outline). Of course, it would still need proper adaptation, but I think it demonstrates that the overall structure can be kept simpler.

What do you think about refactoring in this direction?


I think this approach isn=E2=80=99t fully correct. By forming a join = between a subquery and the outer relation, you effectively force the optimizer to choose a Nested Loop join. Furthermore, it prevents the planner from exploring all join orders between the subquery=E2=80=99s= tables and the outer relation, so we may miss a more optimal plan.

With your patch, I consistently get the following plan. I even disabled nested loops to see whether the planner could switch to a Hash Join or Merge Join, but those aren=E2=80=99t applicable with lat= eral parameters in this pattern.

CREATE TABLE ta (id int PRIMARY KEY, val int);
INSERT INTO ta VALUES (1,1), (2,2);

CREATE TABLE tb (id int PRIMARY KEY, aval int);
INSERT INTO tb VALUES (1,1), (2,1);

CREATE TABLE tc (id int PRIMARY KEY, aid int);
INSERT INTO tc VALUES (3,5), (1,5);

CREATE TABLE td (id int PRIMARY KEY, aid int);
INSERT INTO td VALUES (1,6), (2,7), (3,8), (4,9);

CREATE TABLE te (id int PRIMARY KEY, aid int);
INSERT INTO te VALUES (5,6), (6,7), (7,8), (4,9), (1,1);

SET enable_nestloop =3D OFF;

EXPLAIN ANALYZE
SELECT ta.id
FROM ta
WHERE EXISTS (
=C2=A0 SELECT 1
=C2=A0 FROM tb
=C2=A0 WHERE tb.id =3D ta.id
=C2=A0=C2=A0=C2=A0 AND EXISTS (SELECT 1 FROM tc WHERE tc.id =3D tb.id= )
);

=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=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=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QUERY PLAN=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= =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=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0
-------------------------------------------------------------------------= -------------------------------------------------------
=C2=A0Nested Loop Semi Join=C2=A0 (cost=3D0.31..37017.50 rows=3D2260 = width=3D4) (actual time=3D0.116..0.142 rows=3D2.00 loops=3D1)
=C2=A0=C2=A0 Disabled: true
=C2=A0=C2=A0 Buffers: local hit=3D9
=C2=A0=C2=A0 ->=C2=A0 Seq Scan on ta=C2=A0 (cost=3D0.00..32.60 row= s=3D2260 width=3D4) (actual time=3D0.037..0.039 rows=3D2.00 loops=3D1)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Buffers: local hit=3D= 1

=C2=A0=C2=A0 ->=C2=A0 Nested Loop Semi Join=C2=A0 (cost=3D0.31..16= .36 rows=3D1 width=3D0) (actual time=3D0.045..0.046 rows=3D1.00 loops=3D2)
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Disabled: true
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Buffers: local hit=3D= 8
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ->=C2=A0 Index On= ly Scan using tb_pkey on tb=C2=A0 (cost=3D0.15..8.17 rows=3D1 width=3D4) (actual time=3D0.030..0.030 ro= ws=3D1.00 loops=3D2)
=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 Index Cond: (id =3D ta.id)
=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 Heap Fetches: 2
=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 Index Searches: 2
=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 Buffers: local hit=3D4
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ->=C2=A0 Index On= ly Scan using tc_pkey on tc=C2=A0 (cost=3D0.15..8.17 rows=3D1 width=3D4) (actual time=3D0.010..0.010 ro= ws=3D1.00 loops=3D2)
=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 Index Cond: (id =3D ta.id)
=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 Heap Fetches: 2
=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 Index Searches: 2
=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 Buffers: local hit=3D4
=C2=A0Planning Time: 0.539 ms
=C2=A0Execution Time: 0.252 ms
(20 rows)

Anyway, thank you for the work and attention here - your feedback was useful!

I=E2=80=99ve also rebased the patch on current master.


--------------YbWtzKCKx8loSyCFzEsHx6Gx-- --------------L1JycJBl0zJGKV0dRzGVia1e Content-Type: text/x-patch; charset=UTF-8; name="v6-0001-Enables-pull-up-of-EXISTS-subqueries-that-contain-IN.patch" Content-Disposition: attachment; filename*0="v6-0001-Enables-pull-up-of-EXISTS-subqueries-that-contain-IN"; filename*1=".patch" Content-Transfer-Encoding: base64 RnJvbSA5NjVkMDk4NTAyOWIzZDA1NDU5ZTcxNjkwODc1NWVjMTJiZGIxMTAwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0 Z3Jlc3Byby5ydT4KRGF0ZTogRnJpLCAxMCBPY3QgMjAyNSAxMzo0OTo0NiArMDMwMApTdWJq ZWN0OiBbUEFUQ0hdIEVuYWJsZXMgcHVsbC11cCBvZiBFWElTVFMgc3VicXVlcmllcyB0aGF0 IGNvbnRhaW4gSU5ORVIKIGpvaW5zLCB1bmxvY2tpbmcgam9pbiByZW9yZGVyaW5nIGFuZCBl YXJsaWVyIGZpbHRlcmluZy4gT1VURVIgam9pbnMgd2l0aAogb3V0ZXIgcmVmZXJlbmNlcyBh cmUgc2FmZWx5IGV4Y2x1ZGVkIHRvIHByZXNlcnZlIG51bGwtcHJlc2VydmluZyBzZW1hbnRp Y3MuCgpUbyBhY2hpZXZlIHRoaXMsIGludHJvZHVjZSBhIG11dGF0b3IgdGhhdCBwZXJmb3Jt cyBhIHNpbmdsZSBjb25zZXJ2YXRpdmUKcGFzcyBvdmVyIHRoZSBzdWJxdWVyeSBqb2ludHJl ZSBhbmQgc3RvcHMgdHJhbnNmb3JtYXRpb24gaWYgc3VicXVlcnkKY29udGFpbnMgdm9sYXRp bGUgcXVhbHMsIG9yIE9VVEVSIGpvaW5zIHdpdGggb3V0ZXIgcmVmZXJlbmNlcywgc2luY2UK aG9pc3Rpbmcgd291bGQgYnJlYWsgbnVsbC1wcmVzZXJ2aW5nIGJlaGF2aW9yLgoKT24gdGhl IG90aGVyIGhhbmQsIE9VVEVSIGpvaW5zIHdpdGhvdXQgc3VjaCByZWZlcmVuY2VzIHJlbWFp biBpbnRhY3QuCkFkZCBJUyBOT1QgTlVMTCBndWFyZHMgb24gaG9pc3RlZCBvdXRlciBWYXJz IHRvIGF2b2lkIHJlZHVuZGFudCBudWxsIGVsZW1lbnRzCnRoYXQgb2J2aW91c2x5IHdvbid0 IHJlc3VsdCBhZnRlciBqb2luIG9wZXJhdGlvbi4KUmVwbGFjZSBhZmZlY3RlZCBzdWJxdWVy eSBxdWFscyB3aXRoIHRydWUuCgpBdXRob3I6IEFsZW5hIFJ5YmFraW5hClJldmlld2Vyczog UmFuaWVyIFZpbGVsYSA8cmFuaWVyLnZmQGdtYWlsLmNvbT4sCgkgICBQZXRlciBQZXRyb3Yg PHAucGV0cm92QHBvc3RncmVzcHJvLnJ1PiwKCSAgIElsaWEgRXZkb2tpbW92IDxpbHlhLmV2 ZG9raW1vdkB0YW50b3JsYWJzLmNvbT4KLS0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxh bi9zdWJzZWxlY3QuYyAgICAgICAgfCAyODkgKysrKysrLQogc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9zdWJzZWxlY3Qub3V0ICAgICAgIHwgNzkxICsrKysrKysrKysrKysrKysrKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC91cGRhdGFibGVfdmlld3Mub3V0IHwgIDEwICst CiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsICAgICAgICAgICAgfCA0NDMg KysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAxNDg3IGluc2VydGlvbnMoKyksIDQ2IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1 YnNlbGVjdC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMKaW5k ZXggMTQxOTJhMTMyMzYuLmY1NzQzMGEwNDI5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9zdWJzZWxlY3QuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9zdWJzZWxlY3QuYwpAQCAtMTQ0MCw2ICsxNDQwLDIzNyBAQCBjb252ZXJ0X0FOWV9z dWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJ cmV0dXJuIHJlc3VsdDsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgSG9pc3RKb2luUXVhbHNDb250 ZXh0Cit7CisJTGlzdCAqb3V0ZXJfY2xhdXNlczsgICAvKiBjb2xsZWN0IGhvaXN0ZWQgY2xh dXNlcyAqLworCVJlbGlkcyBvYnNlcnZlZF9udWxsdGVzdF92YXJzOworfSBIb2lzdEpvaW5R dWFsc0NvbnRleHQ7CisKK3N0YXRpYyBOb2RlICoKK3ByZXByb2Nlc3NfcXVhbHMoTm9kZSAq bm9kZSkKK3sKKwkvKgorCSAqIFJ1biBjb25zdC1mb2xkaW5nIHdpdGhvdXQgcGxhbm5lciBj b250ZXh0LgorCSAqCisJICogSU1QT1JUQU5UOiBQYXNzIE5VTEwgYXMgUGxhbm5lckluZm8g aGVyZSBiZWNhdXNlIHdl4oCZcmUgc2ltcGxpZnlpbmcKKwkgKiBhICpzdWJxdWVyeeKAmXMq IHF1YWxzIGJlZm9yZSBpdHMgcnRhYmxlIGhhcyBiZWVuIG1lcmdlZCB3aXRoIHRoZQorCSAq IHBhcmVudC4gSWYgd2UgcGFzc2VkIGEgbm9uLU5VTEwgcm9vdCwgZXZhbF9jb25zdF9leHBy ZXNzaW9ucygpCisJICogY291bGQgcGVyZm9ybSByb290LWRlcGVuZGVudCB0cmFuc2Zvcm1z IChlLmcuLCBmb2xkIE51bGxUZXN0IG9uIFZhcgorCSAqIHVzaW5nIHZhcl9pc19ub25udWxs YWJsZSkgYWdhaW5zdCB0aGUgKndyb25nKiByYW5nZXRhYmxlLCByaXNraW5nCisJICogb3V0 LW9mLWJvdW5kcyBSVEUgYWNjZXNzLiBTZWUgZXZhbF9jb25zdF9leHByZXNzaW9ucygp4oCZ cyBjb250cmFjdDoKKwkgKiDigJxyb290IGNhbiBiZSBwYXNzZWQgYXMgTlVMTCDigKbigJ0g Zm9yIGV4YWN0bHkgdGhpcyB1c2UtY2FzZS4KKwkgKi8KKwlub2RlID0gZXZhbF9jb25zdF9l eHByZXNzaW9ucyhOVUxMLCBub2RlKTsKKwlub2RlID0gKE5vZGUgKikgY2Fub25pY2FsaXpl X3F1YWwoKEV4cHIgKikgbm9kZSwgZmFsc2UpOworCisJbm9kZSA9IChOb2RlICopIG1ha2Vf YW5kc19pbXBsaWNpdCgoRXhwciAqKSBub2RlKTsKKworCXJldHVybiBub2RlOworfQorCitz dGF0aWMgTnVsbFRlc3QgKgorbWFrZV9udWxsdGVzdChWYXIgKnZhciwgTnVsbFRlc3RUeXBl IHR5cGUpCit7CisJTnVsbFRlc3QgKm51bGx0ZXN0ID0gbWFrZU5vZGUoTnVsbFRlc3QpOwor CW51bGx0ZXN0LT5hcmcgPSAoRXhwciAqKSB2YXI7CisJbnVsbHRlc3QtPm51bGx0ZXN0dHlw ZSA9IHR5cGU7CisJbnVsbHRlc3QtPmFyZ2lzcm93ID0gZmFsc2U7CisJbnVsbHRlc3QtPmxv Y2F0aW9uID0gLTE7CisKKwlyZXR1cm4gbnVsbHRlc3Q7Cit9CisKK3N0YXRpYyBib29sCitz aW1wbGljaXR5X2NoZWNrX3dhbGtlcihOb2RlICpub2RlLCB2b2lkICpjdHgpCit7CisJaWYg KG5vZGUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisJZWxzZSBpZihJc0Eo bm9kZSwgVmFyKSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZSBpZihJc0Eobm9kZSwgUXVlcnkp KQorCQlyZXR1cm4gcXVlcnlfdHJlZV93YWxrZXIoKFF1ZXJ5ICopIG5vZGUsCisJCQkJCQkJ CSBzaW1wbGljaXR5X2NoZWNrX3dhbGtlciwKKwkJCQkJCQkJICh2b2lkKikgY3R4LAorCQkJ CQkJCQkgUVRXX0VYQU1JTkVfUlRFU19CRUZPUkUpOworCisJcmV0dXJuIGV4cHJlc3Npb25f dHJlZV93YWxrZXIobm9kZSwgc2ltcGxpY2l0eV9jaGVja193YWxrZXIsCisJCQkJCQkJCSAg KHZvaWQgKikgY3R4KTsKK30KKworc3RhdGljIExpc3QgKgorZ2VuZXJhdGVfbm90X251bGxf ZXhwcnMoTGlzdCAqbGlzdF9leHByLCBSZWxpZHMgKm9ic2VydmVkX3ZhcnMpCit7CisJTGlz dENlbGwgKmxjOworCUxpc3QgKnJlc3VsdCA9IE5JTDsKKworCWZvcmVhY2gobGMsIGxpc3Rf ZXhwcikKKwl7CisJCU5vZGUgKm5vZGUgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCisJCWlm IChJc0Eobm9kZSwgT3BFeHByKSkKKwkJeworCQkJTm9kZSAqbGFyZyA9IGdldF9sZWZ0b3Ao bm9kZSk7CisJCQlOb2RlICpyYXJnID0gZ2V0X3JpZ2h0b3Aobm9kZSk7CisKKwkJCWlmIChJ c0EobGFyZywgUmVsYWJlbFR5cGUpKQorCQkJCWxhcmcgPSAoTm9kZSAqKSAoKFJlbGFiZWxU eXBlICopIGxhcmcpLT5hcmc7CisKKwkJCWlmIChJc0EocmFyZywgUmVsYWJlbFR5cGUpKQor CQkJCXJhcmcgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIHJhcmcpLT5hcmc7CisKKwkJ CWlmKElzQShsYXJnLCBWYXIpKQorCQkJeworCQkJCVZhciAqdmFyID0gKFZhciAqKSBsYXJn OworCQkJCWlmICghYm1zX2lzX21lbWJlcih2YXItPnZhcm5vLCAqb2JzZXJ2ZWRfdmFycykg JiYgdmFyLT52YXJsZXZlbHN1cCA9PSAxKQorCQkJCXsKKwkJCQkJTnVsbFRlc3QgKm51bGx0 ZXN0ID0gbWFrZV9udWxsdGVzdCh2YXIsIElTX05PVF9OVUxMKTsKKwkJCQkJcmVzdWx0ID0g bGFwcGVuZChyZXN1bHQsIG51bGx0ZXN0KTsKKwkJCQkJKm9ic2VydmVkX3ZhcnMgPSBibXNf YWRkX21lbWJlcigqb2JzZXJ2ZWRfdmFycywgdmFyLT52YXJubyk7CisJCQkJCWNvbnRpbnVl OworCQkJCX0KKwkJCX0KKworCQkJaWYoSXNBKHJhcmcsIFZhcikpCisJCQl7CisJCQkJVmFy ICp2YXIgPSAoVmFyICopIHJhcmc7CisJCQkJaWYgKCFibXNfaXNfbWVtYmVyKHZhci0+dmFy bm8sICpvYnNlcnZlZF92YXJzKSAmJiB2YXItPnZhcmxldmVsc3VwID09IDEpCisJCQkJewor CQkJCQlOdWxsVGVzdCAqbnVsbHRlc3QgPSBtYWtlX251bGx0ZXN0KHZhciwgSVNfTk9UX05V TEwpOworCQkJCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgbnVsbHRlc3QpOworCQkJCQkq b2JzZXJ2ZWRfdmFycyA9IGJtc19hZGRfbWVtYmVyKCpvYnNlcnZlZF92YXJzLCB2YXItPnZh cm5vKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJu IHJlc3VsdDsKK30KKworc3RhdGljIE5vZGUgKgoraG9pc3RfcGFyZW50X3F1YWxzX2pvaW50 cmVlX211dGF0b3IoTm9kZSAqanRub2RlLCBIb2lzdEpvaW5RdWFsc0NvbnRleHQgKmNvbnRl eHQpCit7CisJaWYgKGp0bm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChJ c0EoanRub2RlLCBSYW5nZVRibFJlZikpCisJCXJldHVybiBqdG5vZGU7ICAvKiBub3RoaW5n IHRvIGNoYW5nZSAqLworCisJaWYgKElzQShqdG5vZGUsIEpvaW5FeHByKSkKKwl7CisJCUpv aW5FeHByICpqID0gKEpvaW5FeHByICopIGp0bm9kZTsKKwkJSm9pbkV4cHIgKm5ld2ogPSBt YWtlTm9kZShKb2luRXhwcik7CisJCUxpc3RDZWxsICpsYzsKKwkJTGlzdCAqam9pbl9jbGF1 c2VzID0gTklMOworCQlOb2RlICpxdWFsOworCQltZW1jcHkobmV3aiwgaiwgc2l6ZW9mKEpv aW5FeHByKSk7CisKKwkJLyogUmVjdXJzZSBpbnRvIGpvaW4gaW5wdXRzICovCisJCW5ld2ot PmxhcmcgPSAoTm9kZSAqKSBob2lzdF9wYXJlbnRfcXVhbHNfam9pbnRyZWVfbXV0YXRvcihq LT5sYXJnLCBjb250ZXh0KTsKKwkJbmV3ai0+cmFyZyA9IChOb2RlICopIGhvaXN0X3BhcmVu dF9xdWFsc19qb2ludHJlZV9tdXRhdG9yKGotPnJhcmcsIGNvbnRleHQpOworCisJCWlmKGNv bnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25zKG5ld2otPnF1YWxzKSB8fAorCQkJCQkJCQluZXdq LT5sYXJnID09IE5VTEwgfHwKKwkJCQkJCQkJbmV3ai0+cmFyZyA9PSBOVUxMKQorCQkJcmV0 dXJuIE5VTEw7CisKKwkJcXVhbCA9IG5ld2otPnF1YWxzOworCQlxdWFsID0gcHJlcHJvY2Vz c19xdWFscyhxdWFsKTsKKworCQlmb3JlYWNoKGxjLCAoTGlzdCAqKSBxdWFsKQorCQl7CisJ CQlOb2RlICpub2RlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKworCQkJaWYgKElzQShub2Rl LCBPcEV4cHIpKQorCQkJeworCQkJCWlmKHNpbXBsaWNpdHlfY2hlY2tfd2Fsa2VyKGdldF9s ZWZ0b3Aobm9kZSksIE5VTEwpICYmCisJCQkJCQlzaW1wbGljaXR5X2NoZWNrX3dhbGtlcihn ZXRfcmlnaHRvcChub2RlKSwgTlVMTCkpCisJCQkJeworCQkJCQlqb2luX2NsYXVzZXMgPSBs YXBwZW5kKGpvaW5fY2xhdXNlcywgbm9kZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJ CX0KKwkJCWNvbnRleHQtPm91dGVyX2NsYXVzZXMgPSBsYXBwZW5kKGNvbnRleHQtPm91dGVy X2NsYXVzZXMsIG5vZGUpOworCQl9CisKKwkJLyogT25seSB0b3VjaCBJTk5FUiBKT0lOcyAq LworCQlpZiAoKGotPmpvaW50eXBlICE9IEpPSU5fTEVGVCAmJgorCQkJIGotPmpvaW50eXBl ICE9IEpPSU5fUklHSFQgJiYKKwkJCSBqLT5qb2ludHlwZSAhPSBKT0lOX0ZVTEwpKSAgLyog c3VicXVlcnkgdmFycyAqLworCQl7CisJCQlMaXN0ICpudWxsX3Rlc3RzOworCisJCQlpZiAo am9pbl9jbGF1c2VzID09IE5JTCkgIC8qIHN1YnF1ZXJ5IHZhcnMgKi8KKwkJCXsKKwkJCQlu ZXdqLT5xdWFscyA9IChOb2RlICopIG1ha2VCb29sQ29uc3QodHJ1ZSwgZmFsc2UpOworCQkJ fQorCQkJZWxzZSBpZihqb2luX2NsYXVzZXMgIT0gTklMICYmIGNvbnRhaW5fdmFyc19vZl9s ZXZlbCgoTm9kZSAqKSBqb2luX2NsYXVzZXMsIDEpKQorCQkJeworCQkJCW51bGxfdGVzdHMg PSBnZW5lcmF0ZV9ub3RfbnVsbF9leHBycyhqb2luX2NsYXVzZXMsICZjb250ZXh0LT5vYnNl cnZlZF9udWxsdGVzdF92YXJzKTsKKwkJCQljb250ZXh0LT5vdXRlcl9jbGF1c2VzID0gbGlz dF9jb25jYXQoY29udGV4dC0+b3V0ZXJfY2xhdXNlcywgbnVsbF90ZXN0cyk7CisJCQkJY29u dGV4dC0+b3V0ZXJfY2xhdXNlcyA9IGxpc3RfY29uY2F0KGNvbnRleHQtPm91dGVyX2NsYXVz ZXMsIGpvaW5fY2xhdXNlcyk7CisJCQkJbmV3ai0+cXVhbHMgPSAoTm9kZSAqKSBtYWtlQm9v bENvbnN0KHRydWUsIGZhbHNlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdqLT5x dWFscyA9IChOb2RlICopIG1ha2VfYW5kc19leHBsaWNpdChqb2luX2NsYXVzZXMpOworCQkJ fQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGNvbnRhaW5fdmFyc19vZl9sZXZlbChqLT5x dWFscywgMSkpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlyZXR1cm4gKE5vZGUgKikg bmV3ajsKKwl9CisKKwlpZiAoSXNBKGp0bm9kZSwgRnJvbUV4cHIpKQorCXsKKwkJRnJvbUV4 cHIgKmYgPSAoRnJvbUV4cHIgKikganRub2RlOworCQlGcm9tRXhwciAqbmV3ZiA9IG1ha2VO b2RlKEZyb21FeHByKTsKKwkJTGlzdENlbGwgKmxjOworCQlMaXN0ICpmcm9tbGlzdCA9IE5J TDsKKworCQkvKiBSZWN1cnNlIGludG8gZnJvbWxpc3QgKi8KKwkJbWVtY3B5KG5ld2YsIGYs IHNpemVvZihGcm9tRXhwcikpOworCisJCS8qCisJCSAqIFByb2Nlc3MgY2hpbGRyZW4sIGlm IGFueSBvZiB0aGVpciBqb2ludHJlZSBjb250YWlucyBWYXJzIG9mIHRoZQorCQkgKiBwYXJl bnQgcXVlcnkgb3IgcXVhbHMgb2YgdGhlaXIgSm9pbkV4cHIgY29udGFpbnMgdm9sYXRpbGUg ZnVuY3Rpb25zCisJCSAqIHRoZW4gZXhpdAorCQkgKi8KKwkJZm9yZWFjaChsYywgbmV3Zi0+ ZnJvbWxpc3QpCisJCXsKKwkJCU5vZGUgKmZub2RlID0gaG9pc3RfcGFyZW50X3F1YWxzX2pv aW50cmVlX211dGF0b3IobGZpcnN0KGxjKSwgY29udGV4dCk7CisKKwkJCWlmIChmbm9kZSA9 PSBOVUxMKQorCQkJCXJldHVybiBOVUxMOworCQkJZnJvbWxpc3QgPSBsYXBwZW5kKGZyb21s aXN0LCBmbm9kZSk7CisJCX0KKworCQluZXdmLT5mcm9tbGlzdCA9IGZyb21saXN0OworCisJ CWlmKGNvbnRhaW5fdm9sYXRpbGVfZnVuY3Rpb25zKG5ld2YtPnF1YWxzKSkKKwkJCXJldHVy biBOVUxMOworCisJCWlmKG5ld2YtPnF1YWxzKQorCQl7CisJCQlOb2RlICpxdWFsID0gbmV3 Zi0+cXVhbHM7CisJCQkvKiBRdWFscyAoV0hFUkUgY2xhdXNlKSBtYXkgc3RpbGwgY29udGFp biBzdWJsaW5rcyBldGMgKi8KKwkJCXF1YWwgPSBwcmVwcm9jZXNzX3F1YWxzKHF1YWwpOwor CQkJY29udGV4dC0+b3V0ZXJfY2xhdXNlcyA9IGxpc3RfY29uY2F0KGNvbnRleHQtPm91dGVy X2NsYXVzZXMsIChMaXN0ICopIHF1YWwpOworCQkJbmV3Zi0+cXVhbHMgPSBOVUxMOworCQl9 CisKKwkJcmV0dXJuIChOb2RlICopIG5ld2Y7CisJfQorCisJcmV0dXJuIGp0bm9kZTsgIC8q IHF1aWV0IGNvbXBpbGVyICovCit9CisKIC8qCiAgKiBjb252ZXJ0X0VYSVNUU19zdWJsaW5r X3RvX2pvaW46IHRyeSB0byBjb252ZXJ0IGFuIEVYSVNUUyBTdWJMaW5rIHRvIGEgam9pbgog ICoKQEAgLTE0NTQsMTIgKzE2ODUsMTMgQEAgY29udmVydF9FWElTVFNfc3VibGlua190b19q b2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJMaW5rICpzdWJsaW5rLAogCUpvaW5FeHByICAg KnJlc3VsdDsKIAlRdWVyeQkgICAqcGFyc2UgPSByb290LT5wYXJzZTsKIAlRdWVyeQkgICAq c3Vic2VsZWN0ID0gKFF1ZXJ5ICopIHN1YmxpbmstPnN1YnNlbGVjdDsKLQlOb2RlCSAgICp3 aGVyZUNsYXVzZTsKIAlQbGFubmVySW5mbyBzdWJyb290OwogCWludAkJCXJ0b2Zmc2V0Owog CWludAkJCXZhcm5vOwogCVJlbGlkcwkJY2xhdXNlX3Zhcm5vczsKIAlSZWxpZHMJCXVwcGVy X3Zhcm5vczsKKwlMaXN0IAkgICAqbmV3V2hlcmUgPSBOSUw7CisJSG9pc3RKb2luUXVhbHND b250ZXh0IGhqcV9jb250ZXh0ID0ge05JTCwgTlVMTH07CiAKIAlBc3NlcnQoc3VibGluay0+ c3ViTGlua1R5cGUgPT0gRVhJU1RTX1NVQkxJTkspOwogCkBAIC0xNDg5LDM0ICsxNzIxLDYg QEAgY29udmVydF9FWElTVFNfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBT dWJMaW5rICpzdWJsaW5rLAogCWlmICghc2ltcGxpZnlfRVhJU1RTX3F1ZXJ5KHJvb3QsIHN1 YnNlbGVjdCkpCiAJCXJldHVybiBOVUxMOwogCi0JLyoKLQkgKiBTZXBhcmF0ZSBvdXQgdGhl IFdIRVJFIGNsYXVzZS4gIChXZSBjb3VsZCB0aGVvcmV0aWNhbGx5IGFsc28gcmVtb3ZlCi0J ICogdG9wLWxldmVsIHBsYWluIEpPSU4vT04gY2xhdXNlcywgYnV0IGl0J3MgcHJvYmFibHkg bm90IHdvcnRoIHRoZQotCSAqIHRyb3VibGUuKQotCSAqLwotCXdoZXJlQ2xhdXNlID0gc3Vi c2VsZWN0LT5qb2ludHJlZS0+cXVhbHM7Ci0Jc3Vic2VsZWN0LT5qb2ludHJlZS0+cXVhbHMg PSBOVUxMOwotCi0JLyoKLQkgKiBUaGUgcmVzdCBvZiB0aGUgc3ViLXNlbGVjdCBtdXN0IG5v dCByZWZlciB0byBhbnkgVmFycyBvZiB0aGUgcGFyZW50Ci0JICogcXVlcnkuICAoVmFycyBv ZiBoaWdoZXIgbGV2ZWxzIHNob3VsZCBiZSBva2F5LCB0aG91Z2guKQotCSAqLwotCWlmIChj b250YWluX3ZhcnNfb2ZfbGV2ZWwoKE5vZGUgKikgc3Vic2VsZWN0LCAxKSkKLQkJcmV0dXJu IE5VTEw7Ci0KLQkvKgotCSAqIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgV0hFUkUgY2xhdXNl IG11c3QgY29udGFpbiBzb21lIFZhcnMgb2YgdGhlCi0JICogcGFyZW50IHF1ZXJ5LCBlbHNl IGl0J3Mgbm90IGdvbm5hIGJlIGEgam9pbi4KLQkgKi8KLQlpZiAoIWNvbnRhaW5fdmFyc19v Zl9sZXZlbCh3aGVyZUNsYXVzZSwgMSkpCi0JCXJldHVybiBOVUxMOwotCi0JLyoKLQkgKiBX ZSBkb24ndCByaXNrIG9wdGltaXppbmcgaWYgdGhlIFdIRVJFIGNsYXVzZSBpcyB2b2xhdGls ZSwgZWl0aGVyLgotCSAqLwotCWlmIChjb250YWluX3ZvbGF0aWxlX2Z1bmN0aW9ucyh3aGVy ZUNsYXVzZSkpCi0JCXJldHVybiBOVUxMOwotCiAJLyoKIAkgKiBTY2FuIHRoZSByYW5nZXRh YmxlIGZvciByZWxhdGlvbiBSVEVzIGFuZCByZXRyaWV2ZSB0aGUgbmVjZXNzYXJ5CiAJICog Y2F0YWxvZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCByZWxhdGlvbi4gIFVzaW5nIHRoaXMgaW5m b3JtYXRpb24sIGNsZWFyCkBAIC0xNTM3LDEzICsxNzQxLDE3IEBAIGNvbnZlcnRfRVhJU1RT X3N1YmxpbmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywK IAlzdWJyb290LnR5cGUgPSBUX1BsYW5uZXJJbmZvOwogCXN1YnJvb3QuZ2xvYiA9IHJvb3Qt Pmdsb2I7CiAJc3Vicm9vdC5wYXJzZSA9IHN1YnNlbGVjdDsKLQlzdWJzZWxlY3QtPmpvaW50 cmVlLT5xdWFscyA9IHdoZXJlQ2xhdXNlOwogCXN1YnNlbGVjdCA9IHByZXByb2Nlc3NfcmVs YXRpb25fcnRlcygmc3Vicm9vdCk7CiAKLQkvKgotCSAqIE5vdyBzZXBhcmF0ZSBvdXQgdGhl IFdIRVJFIGNsYXVzZSBhZ2Fpbi4KLQkgKi8KLQl3aGVyZUNsYXVzZSA9IHN1YnNlbGVjdC0+ am9pbnRyZWUtPnF1YWxzOworCXN1YnNlbGVjdC0+am9pbnRyZWUgPSAoRnJvbUV4cHIgKiAp IGhvaXN0X3BhcmVudF9xdWFsc19qb2ludHJlZV9tdXRhdG9yKChOb2RlICopIHN1YnNlbGVj dC0+am9pbnRyZWUsICZoanFfY29udGV4dCk7CisKKwlpZihzdWJzZWxlY3QtPmpvaW50cmVl ID09IE5VTEwgfHwgaGpxX2NvbnRleHQub3V0ZXJfY2xhdXNlcyA9PSBOSUwpCisJCXJldHVy biBOVUxMOworCisJbmV3V2hlcmUgPSBoanFfY29udGV4dC5vdXRlcl9jbGF1c2VzOworCisJ Ym1zX2ZyZWUoaGpxX2NvbnRleHQub2JzZXJ2ZWRfbnVsbHRlc3RfdmFycyk7CisKIAlzdWJz ZWxlY3QtPmpvaW50cmVlLT5xdWFscyA9IE5VTEw7CiAKIAkvKgpAQCAtMTU2OCw3ICsxNzc2 LDcgQEAgY29udmVydF9FWElTVFNfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290 LCBTdWJMaW5rICpzdWJsaW5rLAogCSAqLwogCXJ0b2Zmc2V0ID0gbGlzdF9sZW5ndGgocGFy c2UtPnJ0YWJsZSk7CiAJT2Zmc2V0VmFyTm9kZXMoKE5vZGUgKikgc3Vic2VsZWN0LCBydG9m ZnNldCwgMCk7Ci0JT2Zmc2V0VmFyTm9kZXMod2hlcmVDbGF1c2UsIHJ0b2Zmc2V0LCAwKTsK KwlPZmZzZXRWYXJOb2RlcygoTm9kZSAqKSBuZXdXaGVyZSwgcnRvZmZzZXQsIDApOwogCiAJ LyoKIAkgKiBVcHBlci1sZXZlbCB2YXJzIGluIHN1YnF1ZXJ5IHdpbGwgbm93IGJlIG9uZSBs ZXZlbCBjbG9zZXIgdG8gdGhlaXIKQEAgLTE1NzYsNyArMTc4NCw3IEBAIGNvbnZlcnRfRVhJ U1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGlu aywKIAkgKiBiZWNvbWVzIGxldmVsIHplcm8uCiAJICovCiAJSW5jcmVtZW50VmFyU3VibGV2 ZWxzVXAoKE5vZGUgKikgc3Vic2VsZWN0LCAtMSwgMSk7Ci0JSW5jcmVtZW50VmFyU3VibGV2 ZWxzVXAod2hlcmVDbGF1c2UsIC0xLCAxKTsKKwlJbmNyZW1lbnRWYXJTdWJsZXZlbHNVcCgo Tm9kZSAqKSBuZXdXaGVyZSwgLTEsIDEpOwogCiAJLyoKIAkgKiBOb3cgdGhhdCB0aGUgV0hF UkUgY2xhdXNlIGlzIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBwYXJlbnQgcXVlcnkKQEAgLTE1 ODQsNyArMTc5Miw3IEBAIGNvbnZlcnRfRVhJU1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVy SW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKIAkgKiBUaGUgb25lcyA8PSBydG9mZnNl dCBiZWxvbmcgdG8gdGhlIHVwcGVyIHF1ZXJ5OyB0aGUgb25lcyA+IHJ0b2Zmc2V0IGRvCiAJ ICogbm90LgogCSAqLwotCWNsYXVzZV92YXJub3MgPSBwdWxsX3Zhcm5vcyhyb290LCB3aGVy ZUNsYXVzZSk7CisJY2xhdXNlX3Zhcm5vcyA9IHB1bGxfdmFybm9zKHJvb3QsIChOb2RlICop IG5ld1doZXJlKTsKIAl1cHBlcl92YXJub3MgPSBOVUxMOwogCXZhcm5vID0gLTE7CiAJd2hp bGUgKCh2YXJubyA9IGJtc19uZXh0X21lbWJlcihjbGF1c2VfdmFybm9zLCB2YXJubykpID49 IDApCkBAIC0xNTkzLDcgKzE4MDEsNiBAQCBjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pv aW4oUGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJCQl1cHBlcl92YXJu b3MgPSBibXNfYWRkX21lbWJlcih1cHBlcl92YXJub3MsIHZhcm5vKTsKIAl9CiAJYm1zX2Zy ZWUoY2xhdXNlX3Zhcm5vcyk7Ci0JQXNzZXJ0KCFibXNfaXNfZW1wdHkodXBwZXJfdmFybm9z KSk7CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIGdvdCB0aGUgc2V0IG9mIHVwcGVyLWxl dmVsIHZhcm5vcywgd2UgY2FuIG1ha2UgdGhlIGxhc3QKQEAgLTE2MDcsNyArMTgxNCw3IEBA IGNvbnZlcnRfRVhJU1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3Vi TGluayAqc3VibGluaywKIAkgKiBhZGRzIHN1YnF1ZXJ5J3MgUlRFUGVybWlzc2lvbkluZm9z IGludG8gdGhlIHVwcGVyIHF1ZXJ5LgogCSAqLwogCUNvbWJpbmVSYW5nZVRhYmxlcygmcGFy c2UtPnJ0YWJsZSwgJnBhcnNlLT5ydGVwZXJtaW5mb3MsCi0JCQkJCSAgIHN1YnNlbGVjdC0+ cnRhYmxlLCBzdWJzZWxlY3QtPnJ0ZXBlcm1pbmZvcyk7CisJCQkJCXN1YnNlbGVjdC0+cnRh YmxlLCBzdWJzZWxlY3QtPnJ0ZXBlcm1pbmZvcyk7CiAKIAkvKgogCSAqIEFuZCBmaW5hbGx5 LCBidWlsZCB0aGUgSm9pbkV4cHIgbm9kZS4KQEAgLTE2MTYsMTYgKzE4MjMsMTggQEAgY29u dmVydF9FWElTVFNfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJMaW5r ICpzdWJsaW5rLAogCXJlc3VsdC0+am9pbnR5cGUgPSB1bmRlcl9ub3QgPyBKT0lOX0FOVEkg OiBKT0lOX1NFTUk7CiAJcmVzdWx0LT5pc05hdHVyYWwgPSBmYWxzZTsKIAlyZXN1bHQtPmxh cmcgPSBOVUxMOwkJLyogY2FsbGVyIG11c3QgZmlsbCB0aGlzIGluICovCisJCiAJLyogZmxh dHRlbiBvdXQgdGhlIEZyb21FeHByIG5vZGUgaWYgaXQncyB1c2VsZXNzICovCiAJaWYgKGxp c3RfbGVuZ3RoKHN1YnNlbGVjdC0+am9pbnRyZWUtPmZyb21saXN0KSA9PSAxKQogCQlyZXN1 bHQtPnJhcmcgPSAoTm9kZSAqKSBsaW5pdGlhbChzdWJzZWxlY3QtPmpvaW50cmVlLT5mcm9t bGlzdCk7CiAJZWxzZQogCQlyZXN1bHQtPnJhcmcgPSAoTm9kZSAqKSBzdWJzZWxlY3QtPmpv aW50cmVlOworCQogCXJlc3VsdC0+dXNpbmdDbGF1c2UgPSBOSUw7CiAJcmVzdWx0LT5qb2lu X3VzaW5nX2FsaWFzID0gTlVMTDsKLQlyZXN1bHQtPnF1YWxzID0gd2hlcmVDbGF1c2U7CiAJ cmVzdWx0LT5hbGlhcyA9IE5VTEw7CiAJcmVzdWx0LT5ydGluZGV4ID0gMDsJCS8qIHdlIGRv bid0IG5lZWQgYW4gUlRFIGZvciBpdCAqLworCXJlc3VsdC0+cXVhbHMgPSAoTm9kZSAqKSBt YWtlX2FuZHNfZXhwbGljaXQobmV3V2hlcmUpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dCBiL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3Vic2VsZWN0Lm91dAppbmRleCBjZjZiMzJkMTE3 My4uZTQ5ODY2YmYxYzkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv c3Vic2VsZWN0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVj dC5vdXQKQEAgLTEwMzgsNiArMTAzOCw3OTcgQEAgd2hlcmUgZXhpc3RzICgKICAgd2hlcmUg cm9hZC5uYW1lID0gc3MuZjEgKTsKIHJvbGxiYWNrOwogLS0KKy0tIFRlc3QgY2FzZSBmb3Ig ZXhpc3Qgc3VibGluayB3aGVyZSB3ZSBjYW4gY29uc2lkZXIgc29tZSB1bmRlcGVuZGVudCBl eHByZXNzaW9uCistLSB3aXRoIG91dGVyIGxpbmsKKy0tCitFWFBMQUlOIChDT1NUUyBPRkYp CitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJP TSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0gdGIuaWQKKyk7CisgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgU2VtaSBKb2lu CisgICAtPiAgU2VxIFNjYW4gb24gdGEKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAg LT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Yl9wa2V5IG9uIHRiCisgICAgICAgICAgICAg ICBJbmRleCBDb25kOiAoaWQgPSB0YS5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0 YworKDYgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEK K1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0 YS5pZCA9IHRjLmlkCispOworICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9u IHRhCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4g dXNpbmcgdGNfcGtleSBvbiB0YworICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0g dGEuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIKKyg2IHJvd3MpCisKK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBT RUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gMSA9IDEKKyAgV0hFUkUgdGEuaWQg PSB0Yy5pZAorKTsKKyAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiB0YQor ICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5n IHRjX3BrZXkgb24gdGMKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlk KQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisoNiByb3dzKQorCistLSBKb2luIGNv bXBvdW5kIGV4cHJlc3Npb24KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9N IHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMg T04gdGEuaWQgPSB0Yy5pZAorICAgICAgICAgICBBTkQgdGEuaWQgPSB0Yi5pZAorKTsKKyAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBSaWdodCBTZW1pIEpvaW4KKyAgIEhhc2ggQ29u ZDogKHRjLmlkID0gdGEuaWQpCisgICAtPiAgSGFzaCBKb2luCisgICAgICAgICBIYXNoIENv bmQ6ICh0Yi5pZCA9IHRjLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAg ICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjCisgICAt PiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRhCisoOSByb3dzKQorCitFWFBM QUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YSB0YTEKK1dIRVJFIEVYSVNUUyAo CisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0Yi5hdmFsID0gdGMuYWlk CisgICAgICAgICAgIEFORCB0Yi5hdmFsID0gdGExLmlkCispOworICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAg SGFzaCBDb25kOiAodGExLmlkID0gdGIuYXZhbCkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YSB0 YTEKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgVW5pcXVlCisgICAgICAgICAgICAgICAt PiAgTWVyZ2UgSm9pbgorICAgICAgICAgICAgICAgICAgICAgTWVyZ2UgQ29uZDogKHRiLmF2 YWwgPSB0Yy5haWQpCisgICAgICAgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IHRiLmF2YWwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YgorICAgICAgICAgICAgICAgICAgICAgLT4g IFNvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnQgS2V5OiB0Yy5haWQKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworKDEzIHJvd3Mp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitKT0lOIHRiIE9O IHRydWUKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIgdGIxCisgIEpP SU4gdGMgT04gdGEuaWQgPSB0Yi5pZAorKTsKKyAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVz dGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgSGFzaCBKb2luCisgICAgICAgICBIYXNoIENv bmQ6ICh0YS5pZCA9IHRiLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRhCisgICAg ICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAt PiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YiB0YjEKKyAgICAg ICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRj CisoMTAgcm93cykKKworLS0gQ29tcG91bmQgZXhwcmVzc2lvbiB3aXRoIGNvbnN0IHR5cGUg b3Igb3RoZXIgdHlwZSBvZiBleHByZXNzaW9ucworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIK KyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlkCisgICAgICAgICAgIEFORCB0YS5pZCA9IDEK Kyk7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRh X3BrZXkgb24gdGEKKyAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IDEpCisgICAtPiAgTmVz dGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGNfcGtleSBv biB0YworICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkKKyAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiB0YgorKDcgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIK KyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlkCisgICAgICAgICAgIEFORCB0Yi5pZCA9IDEK Kyk7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg SGFzaCBSaWdodCBTZW1pIEpvaW4KKyAgIEhhc2ggQ29uZDogKHRjLmlkID0gdGEuaWQpCisg ICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcg dGJfcGtleSBvbiB0YgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkKKyAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgLT4gIEhhc2gKKyAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiB0YQorKDggcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU IDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAg UklHSFQgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlkCisgIFdIRVJFIHRhLnZhbCA9IDEKKyk7 CisgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4g b24gdGEKKyAgIEZpbHRlcjogRVhJU1RTKFN1YlBsYW4gZXhpc3RzXzEpCisgICBTdWJQbGFu IGV4aXN0c18xCisgICAgIC0+ICBSZXN1bHQKKyAgICAgICAgICAgT25lLVRpbWUgRmlsdGVy OiAodGEudmFsID0gMSkKKyAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgor ICAgICAgICAgICAgICAgICBKb2luIEZpbHRlcjogKHRhLmlkID0gdGMuaWQpCisgICAgICAg ICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAgICAgICAgICAgICAtPiAgTWF0 ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCiso MTAgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dI RVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5p ZCA9IHRiLmlkCisgICAgICAgICAgIEFORCB0Yi5hdmFsID0gQU5ZICgnezF9Jzo6aW50W10p CispOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2gg Sm9pbgorICAgSGFzaCBDb25kOiAodGEuaWQgPSB0Yi5pZCkKKyAgIC0+ICBTZXEgU2NhbiBv biB0YQorICAgLT4gIEhhc2gKKyAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAg ICAgICAgICBHcm91cCBLZXk6IHRiLmlkCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExv b3AKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAgICAg ICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gdGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEZpbHRlcjogKGF2YWwgPSBBTlkgKCd7MX0nOjppbnRlZ2VyW10pKQorKDExIHJvd3MpCisK Ky0tIEV4aXN0cyBTdWJMaW5rIGV4cHJlc3Npb24gd2l0aGluIGV4cHJlc3Npb24KK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhIHRhMQorV0hFUkUgRVhJU1RTICgK KyAgU0VMRUNUIDEKKyAgRlJPTSB0YQorICBKT0lOIHRiIE9OIHRhLmlkID0gdGExLmlkCisg ICAgICAgICAgIEFORCB0YTEudmFsID0gMQorICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVD VCAxCisgICAgRlJPTSB0YSB0YTIKKyAgICBXSEVSRSB0YTIuaWQgPSB0YTEuaWQKKyAgKQor KTsKKyAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBO ZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiB0YSB0YTIKKyAgICAg ICAgIEZpbHRlcjogKHZhbCA9IDEpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGFfcGtleSBvbiB0YQorICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKGlkID0gdGEyLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRi CisoNyByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YSB0 YTEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0YiBP TiB0YS52YWwgPSB0YTEuaWQKKyAgICAgICAgICAgQU5EIHRhMS5pZCA9IDEKKyAgV0hFUkUg RVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAgIEZST00gdGEgdGEyCisgICAgV0hFUkUgdGEy LmlkID0gdGEuaWQKKyAgKQorKTsKKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgLT4gIEluZGV4IE9ubHkg U2NhbiB1c2luZyB0YV9wa2V5IG9uIHRhIHRhMQorICAgICAgICAgSW5kZXggQ29uZDogKGlk ID0gMSkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRi CisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiB0YSB0YTIKKyAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKHZhbCA9IDEpCiso OCByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hF UkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBXSEVSRSB0YS5pZCA9IHRi LmlkCisgICAgQU5EIEVYSVNUUyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0Ywor ICAgICAgV0hFUkUgdGMuaWQgPSB0Yi5pZAorICAgICAgICBBTkQgdGMuYWlkICsgdGIuYXZh bCA+IDAKKyAgICApCispOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBTZW1pIEpvaW4KKyAgIEhhc2ggQ29uZDogKHRh LmlkID0gdGMuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gdGEKKyAgIC0+ICBIYXNoCisgICAg ICAgICAtPiAgSGFzaCBKb2luCisgICAgICAgICAgICAgICBIYXNoIENvbmQ6ICh0Yi5pZCA9 IHRjLmlkKQorICAgICAgICAgICAgICAgSm9pbiBGaWx0ZXI6ICgodGMuYWlkICsgdGIuYXZh bCkgPiAwKQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAgICAgICAg ICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRj CisoMTAgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEK K1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgV0hFUkUgdGEuaWQg PSB0Yi5pZAorICAgIEFORCBFWElTVFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZST00g dGMKKyAgICAgIFdIRVJFIHRjLmlkID0gdGIuaWQKKyAgICAgICAgQU5EIHRjLmFpZCArIHRh LnZhbCA+IDAKKyAgICApCispOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg SGFzaCBKb2luCisgICBIYXNoIENvbmQ6ICh0YS5pZCA9IHRiLmlkKQorICAgSm9pbiBGaWx0 ZXI6IEVYSVNUUyhTdWJQbGFuIGV4aXN0c18xKQorICAgLT4gIFNlcSBTY2FuIG9uIHRhCisg ICAtPiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICBTdWJQbGFuIGV4 aXN0c18xCisgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRjX3BrZXkgb24gdGMKKyAgICAg ICAgICAgSW5kZXggQ29uZDogKGlkID0gdGIuaWQpCisgICAgICAgICAgIEZpbHRlcjogKChh aWQgKyB0YS52YWwpID4gMCkKKygxMCByb3dzKQorCistLSBDaGVjayB3aXRoIE5VTEwgYW5k IE5PVCBOVUxMIGV4cHJlc3Npb25zCitBTFRFUiBUQUJMRSB0YSBBREQgQ09MVU1OIGlzX2Fj dGl2ZSBib29sOworVVBEQVRFIHRhIFNFVCBpc19hY3RpdmUgPSB0cnVlOworRVhQTEFJTiAo Q09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVD VCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAgICBB TkQgQ09BTEVTQ0UodGEuaXNfYWN0aXZlLCB0cnVlKQorKTsKKyAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4K KyAgIC0+ICBTZXEgU2NhbiBvbiB0YQorICAgICAgICAgRmlsdGVyOiBDT0FMRVNDRShpc19h Y3RpdmUsIHRydWUpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBP bmx5IFNjYW4gdXNpbmcgdGJfcGtleSBvbiB0YgorICAgICAgICAgICAgICAgSW5kZXggQ29u ZDogKGlkID0gdGEuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKyg3IHJvd3Mp CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRiCitXSEVSRSBFWElT VFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRhCisgIEpPSU4gdGMgT04gdGEuaWQgPSB0Yi5p ZAorICAgICAgICAgQU5EIENPQUxFU0NFKHRhLmlzX2FjdGl2ZSwgdHJ1ZSkKKyk7CisgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTWVyZ2UgSm9pbgorICAgTWVyZ2UgQ29uZDogKHRiLmlkID0gdGEuaWQpCisgICAtPiAg SW5kZXggT25seSBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIKKyAgIC0+ICBVbmlxdWUKKyAg ICAgICAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4g dXNpbmcgdGFfcGtleSBvbiB0YQorICAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiBDT0FM RVNDRShpc19hY3RpdmUsIHRydWUpCisgICAgICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUK KyAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworKDkgcm93cykKKwor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAo CisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisg ICAgICAgICBBTkQgQ0FTRQorICAgICAgICAgICAgICAgV0hFTiB0YS5pc19hY3RpdmUgVEhF TiB0cnVlCisgICAgICAgICAgICAgICBFTFNFIGZhbHNlCisgICAgICAgICAgICAgRU5EID0g dHJ1ZQorKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbgor ICAgLT4gIFNlcSBTY2FuIG9uIHRhCisgICAgICAgICBGaWx0ZXI6IENBU0UgV0hFTiBpc19h Y3RpdmUgVEhFTiB0cnVlIEVMU0UgZmFsc2UgRU5ECisgICAtPiAgTmVzdGVkIExvb3AKKyAg ICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGJfcGtleSBvbiB0YgorICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gdGEuaWQpCisgICAgICAgICAtPiAgU2VxIFNj YW4gb24gdGMKKyg3IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitG Uk9NIHRiCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRhCisgIEpPSU4g dGMgT04gdGEuaWQgPSB0Yi5pZAorICAgICAgICAgQU5EIENBU0UKKyAgICAgICAgICAgICAg IFdIRU4gdGEuaXNfYWN0aXZlIFRIRU4gdHJ1ZQorICAgICAgICAgICAgICAgRUxTRSBmYWxz ZQorICAgICAgICAgICAgIEVORCA9IHRydWUKKyk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNZXJnZSBKb2luCisgICBNZXJnZSBDb25kOiAodGIu aWQgPSB0YS5pZCkKKyAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGJfcGtleSBvbiB0 YgorICAgLT4gIFVuaXF1ZQorICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAg ICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0YV9wa2V5IG9uIHRhCisgICAgICAgICAgICAg ICAgICAgICBGaWx0ZXI6IENBU0UgV0hFTiBpc19hY3RpdmUgVEhFTiB0cnVlIEVMU0UgZmFs c2UgRU5ECisgICAgICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworKDkgcm93cykKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisg IEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAgICBBTkQgdGEu aXNfYWN0aXZlCispOworICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9uIHRh CisgICAgICAgICBGaWx0ZXI6IGlzX2FjdGl2ZQorICAgLT4gIE5lc3RlZCBMb29wCisgICAg ICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIKKyAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHRjCisoNyByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJP TSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRj IE9OIHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFORCB0YS5pc19hY3RpdmUgSVMgTk9UIE5V TEwKKyk7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgU2VxIFNjYW4gb24gdGEKKyAgICAg ICAgIEZpbHRlcjogKGlzX2FjdGl2ZSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBOZXN0ZWQgTG9v cAorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Yl9wa2V5IG9uIHRiCisg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSB0YS5pZCkKKyAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiB0YworKDcgcm93cykKKworLS0gRGlzYWJsZWQgcHVsbCB1cCBiZWNhdXNl IGl0IGlzIGFwcGxjYXBhYmxlIGZvciBJTk5FUiBKT0lOIGNvbm5lY3Rpb24KK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxF Q1QgMQorICBGUk9NIHRiCisgIFJJR0hUIEpPSU4gdGMgT04gdGEuaWQgPSB0Yy5pZAorKTsK KyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiB0YQorICAgRmls dGVyOiBFWElTVFMoU3ViUGxhbiBleGlzdHNfMSkKKyAgIFN1YlBsYW4gZXhpc3RzXzEKKyAg ICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgICAgICAgICBKb2luIEZpbHRlcjog KHRhLmlkID0gdGMuaWQpCisgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAg ICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHRiCisoOCByb3dzKQorCistLSBEaXNhYmxlIHB1bGwtdXAgZHVlIHRvIGxhY2sgb2YgdGhl IG91dGVyIHZhcgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dI RVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0Yy5p ZCA9IHRiLmlkCispOworICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBSZXN1bHQKKyAgIE9uZS1UaW1lIEZpbHRlcjogKEluaXRQbGFuIGV4 aXN0c18xKS5jb2wxCisgICBJbml0UGxhbiBleGlzdHNfMQorICAgICAtPiAgTmVzdGVkIExv b3AKKyAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAgICAgICAgIC0+ICBJbmRl eCBPbmx5IFNjYW4gdXNpbmcgdGNfcGtleSBvbiB0YworICAgICAgICAgICAgICAgICBJbmRl eCBDb25kOiAoaWQgPSB0Yi5pZCkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YQorKDggcm93cykK KworQ1JFQVRFIFRBQkxFIHRkIChpZCBpbnQsIHRjX2lkIGJ5dGVhLCB2YWwgaW50KTsKK0lO U0VSVCBJTlRPIHRkCitTRUxFQ1QgZy5pZCwgJ1Rlc3QxJzo6Ynl0ZWEgQVMgdGNfaWQsIDYg QVMgdmFsCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAyNSkgQVMgZyhpZCkKK1VOSU9OIEFM TAorU0VMRUNUIGcuaWQsICdUZXN0Mic6OmJ5dGVhIEFTIHRjX2lkLCA3IEFTIHZhbAorRlJP TSBnZW5lcmF0ZV9zZXJpZXMoMjYsIDUwKSBBUyBnKGlkKQorVU5JT04gQUxMCitTRUxFQ1Qg Zy5pZCwgJ1Rlc3Q0Jzo6Ynl0ZWEgQVMgdGNfaWQsIDYgQVMgdmFsCitGUk9NIGdlbmVyYXRl X3Nlcmllcyg1MSwgNzUpIEFTIGcoaWQpCitVTklPTiBBTEwKK1NFTEVDVCBnLmlkLCAnVGVz dDUnOjpieXRlYSBBUyB0Y19pZCwgNyBBUyB2YWwKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDc2 LCAxMDApIEFTIGcoaWQpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorIFNFTEVDVCB0YS5pZAor ICAgRlJPTSB0YQorICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgICBGUk9N IHRiCisgICAgIFdIRVJFIHRiLmlkID0gdGEuaWQgQU5ECisgICAgICAgICAgIEVYSVNUUwor ICAgICAgICAoU0VMRUNUIDEKKyAgICAgICAgICAgRlJPTSB0YworICAgICAgICAgIFdIRVJF IHRjLmlkID0gdGIuaWQpCisgICAgICAgICAgICAgICApOworICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBIYXNoIFJpZ2h0IFNlbWkgSm9pbgorICAgSGFzaCBDb25kOiAodGMuaWQgPSB0YS5p ZCkKKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgIEhhc2ggQ29uZDogKHRiLmlkID0gdGMu aWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIKKyAgICAgICAgIC0+ICBIYXNoCisg ICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKyAgIC0+ICBIYXNoCisgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gdGEKKyg5IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikK KyBTRUxFQ1QgdGEuaWQKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxF Q1QgMQorICAgICAgRlJPTSB0YgorICAgICBXSEVSRSB0Yi5pZCA9IHRhLmlkIEFORAorICAg ICAgICAgICBFWElTVFMKKyAgICAgICAgKFNFTEVDVCAxCisgICAgICAgICAgIEZST00gdGMK KyAgICAgICAgICBXSEVSRSB0Yy5pZCA9IHRhLmlkKQorICAgICAgICAgICAgICAgKTsKKyAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2luCisgICBIYXNoIENvbmQ6ICh0Yy5pZCA9 IHRiLmlkKQorICAgLT4gIEhhc2ggSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAodGMuaWQg PSB0YS5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAgICAgLT4gIEhh c2gKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YQorICAgLT4gIEhhc2gKKyAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YgorKDkgcm93cykKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorIFNFTEVDVCB0YS5pZAorICAgRlJPTSB0YQorICBXSEVSRSBFWElTVFMgKAorICAg IFNFTEVDVCAxCisgICAgICBGUk9NIHRiCisgICAgIFdIRVJFIHRiLmlkID0gdGEuaWQKKyAg ICAgICBBTkQgRVhJU1RTCisgICAgICAgICAgICAgIChTRUxFQ1QgMQorICAgICAgICAgICAg ICAgICBGUk9NIHRjCisgICAgICAgICAgICAgICBXSEVSRSB0Yi5pZCA9IHRhLmlkKQorICAg ICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBIYXNoIEpvaW4KKyAgIEhhc2ggQ29uZDogKHRiLmlkID0gdGEuaWQpCisgICBKb2luIEZp bHRlcjogRVhJU1RTKFN1YlBsYW4gZXhpc3RzXzEpCisgICAtPiAgU2VxIFNjYW4gb24gdGIK KyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGEKKyAgIFN1YlBsYW4g ZXhpc3RzXzEKKyAgICAgLT4gIFJlc3VsdAorICAgICAgICAgICBPbmUtVGltZSBGaWx0ZXI6 ICh0Yi5pZCA9IHRhLmlkKQorICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKygxMCBy b3dzKQorCitleHBsYWluIChDT1NUUyBPRkYpCisgU0VMRUNUIHRhLmlkCisgICBGUk9NIHRh CisgIFdIRVJFIEVYSVNUUyAoCisgICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGIKKyAgICAg ICAgam9pbiB0YyBvbiB0Yy5pZCA9IHRhLmlkCisgICAgICAgICAgQU5EIEVYSVNUUyAoCisg ICAgICAgICAgICAgICAgU0VMRUNUIDEKKyAgICAgICAgICAgICAgICAgIEZST00gdGQKKyAg ICAgICAgICAgICAgICBXSEVSRSB0ZC5pZCA9IHRhLmlkKQorICAgICAgICAgICAgICAgICk7 CisgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgSGFzaCBKb2luCisgICBIYXNoIENvbmQ6ICh0YS5pZCA9IHRkLmlkKQorICAg LT4gIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRh CisgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgIC0+ICBJbmRleCBP bmx5IFNjYW4gdXNpbmcgdGNfcGtleSBvbiB0YworICAgICAgICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGlkID0gdGEuaWQpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24g dGIKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAg ICAgICAgR3JvdXAgS2V5OiB0ZC5pZAorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHRkCisoMTIgcm93cykKKworZXhwbGFpbiAoQ09TVFMgT0ZGKQorIFNFTEVDVCB0YS5pZAor ICAgRlJPTSB0YQorICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgICBGUk9N IHRiCisgICAgICAgIGpvaW4gdGMgb24gdGMuaWQgPSB0YS5pZAorICAgICAgICAgIEFORCBF WElTVFMgKAorICAgICAgICAgICAgICAgIFNFTEVDVCAxCisgICAgICAgICAgICAgICAgICBG Uk9NIHRkCisgICAgICAgICAgICAgICAgV0hFUkUgdGIuaWQgPSB0YS5pZCkKKyAgICAgICAg ICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgU2VxIFNjYW4gb24gdGEK KyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IEVYSVNUUyhTdWJQ bGFuIGV4aXN0c18xKQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Y19w a2V5IG9uIHRjCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSB0YS5pZCkKKyAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YgorICAgICAgICAgU3ViUGxhbiBleGlzdHNfMQor ICAgICAgICAgICAtPiAgUmVzdWx0CisgICAgICAgICAgICAgICAgIE9uZS1UaW1lIEZpbHRl cjogKHRiLmlkID0gdGEuaWQpCisgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0 ZAorKDExIHJvd3MpCisKK0NSRUFURSBUQUJMRSB0ZSAoaWQgaW50LCB0Y19pZCBieXRlYSwg dmFsIGludCk7CitJTlNFUlQgSU5UTyB0ZSBTRUxFQ1QgKiBGUk9NIHRkOworRVhQTEFJTiAo Q09TVFMgT0ZGKQorU0VMRUNUIHQxLioKK0ZST00gdGEgdDEKK1dIRVJFIEVYSVNUUyAoCisg IFNFTEVDVCAxCisgIEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAor ICBKT0lOIHRiIHQyIE9OIHQyLmlkID0gdDEuaWQKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBT RUxFQ1QgMQorICAgIEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAor ICAgIEpPSU4gdGQgdDMgT04gdDMudGNfaWQgSU4gKCdUZXN0MSc6OmJ5dGVhLCAnVGVzdDIn OjpieXRlYSkKKyAgICBXSEVSRSBFWElTVFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZS T00gdGUgdDQKKyAgICAgIFdIRVJFIHQ0LnRjX2lkID0gdDMudGNfaWQKKyAgICAgICAgQU5E IHQ0LnZhbCA9IHQyLmF2YWwKKyAgICApID0gRVhJU1RTICgKKyAgICAgIFNFTEVDVCAxCisg ICAgICBGUk9NIHRjIHQ1CisgICAgICBXSEVSRSB0NS5pZCA9IHQzLmlkCisgICAgKQorICAp CispOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIFNlbWkgSm9pbgorICAgTWVy Z2UgQ29uZDogKHQxLmlkID0gdDIuaWQpCisgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0YV9w a2V5IG9uIHRhIHQxCisgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAgICAgICBK b2luIEZpbHRlcjogKChBTlkgKCh0My50Y19pZCA9IChoYXNoZWQgU3ViUGxhbiBleGlzdHNf MikuY29sMSkgQU5EICh0Mi5hdmFsID0gKGhhc2hlZCBTdWJQbGFuIGV4aXN0c18yKS5jb2wy KSkpID0gKEFOWSAodDMuaWQgPSAoaGFzaGVkIFN1YlBsYW4gZXhpc3RzXzQpLmNvbDEpKSkK KyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIgdDIKKyAgICAg ICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRk IHQzCisgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6ICh0Y19pZCA9IEFOWSAoJ3siXFx4 NTQ2NTczNzQzMSIsIlxceDU0NjU3Mzc0MzIifSc6OmJ5dGVhW10pKQorICAgICAgICAgU3Vi UGxhbiBleGlzdHNfMgorICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGUgdDQKKyAgICAg ICAgIFN1YlBsYW4gZXhpc3RzXzQKKyAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjIHQ1 CisoMTMgcm93cykKKworRVhQTEFJTgorU0VMRUNUIHRhLioKK0ZST00gdGEKK1dIRVJFIEVY SVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0Yy5pZCA9IHRi LmlkCisgICAgICAgICBBTkQgdGIuaWQgPSB0YS5pZAorICBKT0lOIHRkIE9OIHRkLmlkID0g dGMuaWQKKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEhhc2ggUmlnaHQgU2VtaSBKb2luICAoY29zdD0xODEuMjAuLjIxOS4zNSBy b3dzPTExMDAgd2lkdGg9OSkKKyAgIEhhc2ggQ29uZDogKHRkLmlkID0gdGEuaWQpCisgICAt PiAgSGFzaCBKb2luICAoY29zdD0xMjEuNzAuLjE1MC4wMiByb3dzPTEyMDAgd2lkdGg9MTIp CisgICAgICAgICBIYXNoIENvbmQ6ICh0ZC5pZCA9IHRjLmlkKQorICAgICAgICAgLT4gIEhh c2ggSm9pbiAgKGNvc3Q9NjAuODUuLjg2LjAxIHJvd3M9MTIwMCB3aWR0aD04KQorICAgICAg ICAgICAgICAgSGFzaCBDb25kOiAodGQuaWQgPSB0Yi5pZCkKKyAgICAgICAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiB0ZCAgKGNvc3Q9MC4wMC4uMjIuMDAgcm93cz0xMjAwIHdpZHRoPTQp CisgICAgICAgICAgICAgICAtPiAgSGFzaCAgKGNvc3Q9MzIuNjAuLjMyLjYwIHJvd3M9MjI2 MCB3aWR0aD00KQorICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiICAo Y29zdD0wLjAwLi4zMi42MCByb3dzPTIyNjAgd2lkdGg9NCkKKyAgICAgICAgIC0+ICBIYXNo ICAoY29zdD0zMi42MC4uMzIuNjAgcm93cz0yMjYwIHdpZHRoPTQpCisgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gdGMgIChjb3N0PTAuMDAuLjMyLjYwIHJvd3M9MjI2MCB3aWR0 aD00KQorICAgLT4gIEhhc2ggIChjb3N0PTMyLjAwLi4zMi4wMCByb3dzPTIyMDAgd2lkdGg9 OSkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YSAgKGNvc3Q9MC4wMC4uMzIuMDAgcm93 cz0yMjAwIHdpZHRoPTkpCisoMTMgcm93cykKKworRFJPUCBUQUJMRSB0ZCwgdGU7CitDUkVB VEUgVEFCTEUgdHN0MSAoaWQgaW50LCBtZXMgdmFyY2hhcigyMCkpOworQ1JFQVRFIFRBQkxF IHRzdDIgKGlkIGludCwgdHN0MV9pZCBpbnQsIHR5cGVfaWQgaW50KTsKK0NSRUFURSBUQUJM RSB0c3QzIChpZCBieXRlYSk7CitDUkVBVEUgVEFCTEUgdHN0NCAoaWQgaW50LCB0c3QzX2lk IGJ5dGVhLCB0eXBlX2lkIGludCk7CitDUkVBVEUgVEFCTEUgdHN0NSAoaWQgaW50LCB0c3Qz X2lkIGJ5dGVhLCB0eXBlX2lkIGludCk7CitJTlNFUlQgSU5UTyB0c3QxIFZBTFVFUyAoMSwg J3Rlc3QxJyk7CitJTlNFUlQgSU5UTyB0c3QxIFZBTFVFUyAoMiwgJ3Rlc3QyJyk7CitJTlNF UlQgSU5UTyB0c3QxIFZBTFVFUyAoMywgJ3Rlc3QzJyk7CitJTlNFUlQgSU5UTyB0c3QyIFZB TFVFUyAoMSwgMiwgNyk7CitJTlNFUlQgSU5UTyB0c3QyIFZBTFVFUyAoMSwgMiwgNik7CitJ TlNFUlQgSU5UTyB0c3QyIFZBTFVFUyAoMiwgMywgNyk7CitJTlNFUlQgSU5UTyB0c3QzCitT RUxFQ1QgKCdUZXN0JyB8fCBnLmlkKTo6Ynl0ZWEgQVMgaWQKKyAgIEZST00gZ2VuZXJhdGVf c2VyaWVzKDEsIDUpIEFTIGcoaWQpOworSU5TRVJUIElOVE8gdHN0NAorKFNFTEVDVCBnLmlk LCAnVGVzdDEnOjpieXRlYSBBUyB0c3QzX2lkLCA2IEFTIHR5cGVfaWQKKyAgIEZST00gZ2Vu ZXJhdGVfc2VyaWVzKDEsIDI1KSBBUyBnKGlkKSkKK1VOSU9OIEFMTAorKFNFTEVDVCBnLmlk LCAnVGVzdDInOjpieXRlYSBBUyB0c3QzX2lkLCA3IEFTIHR5cGVfaWQKKyAgIEZST00gZ2Vu ZXJhdGVfc2VyaWVzKDI2LCA1MCkgQVMgZyhpZCkpCitVTklPTiBBTEwKKyhTRUxFQ1QgZy5p ZCwgJ1Rlc3Q0Jzo6Ynl0ZWEgQVMgdHN0M19pZCwgNiBBUyB0eXBlX2lkCisgICBGUk9NIGdl bmVyYXRlX3Nlcmllcyg1MSwgNzUpIEFTIGcoaWQpKQorVU5JT04gQUxMCisoU0VMRUNUIGcu aWQsICdUZXN0NSc6OmJ5dGVhIEFTIHRzdDNfaWQsIDcgQVMgdHlwZV9pZAorICAgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoNzYsIDEwMCkgQVMgZyhpZCkpOworSU5TRVJUIElOVE8gdHN0NSBT RUxFQ1QgKiBGUk9NIHRzdDQ7CitWQUNVVU0gKEFOQUxZWkUpIHRzdDEsIHRzdDIsIHRzdDMs IHRzdDQsIHRzdDU7CistLSBDYXNlIHdpdGggdHdvIGV4aXN0cyBpbiBPcEV4cHIsIGluIHRo ZSBmaXJzdCBvbmUgdDMuaWQgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IHF1ZXJ5 CistLSBhbmQgdDIudHlwZS1pZCBpcyB0aGUgcmVmZXJlbmNlIHRvIGdyYW5kcGFyZW50IHF1 ZXJ5CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgdDEuKgorRlJPTSB0c3QxIHQxCitX SEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIChTRUxFQ1QgMSBBUyBTREJMX0RV TU1ZKSBTREJMX0RVQUwKKyAgSk9JTiB0c3QyIHQyIE9OIHQyLnRzdDFfaWQgPSB0MS5pZAor ICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgRlJPTSAoU0VMRUNUIDEgQVMg U0RCTF9EVU1NWSkgU0RCTF9EVUFMCisgICAgSk9JTiB0c3QzIHQzIE9OIHQzLmlkIElOICgn VGVzdDEnOjpieXRlYSwgJ1Rlc3QyJzo6Ynl0ZWEpCisgICAgV0hFUkUgRVhJU1RTICgKKyAg ICAgIFNFTEVDVCAxCisgICAgICBGUk9NIHRzdDQgdDQKKyAgICAgIFdIRVJFIHQ0LnRzdDNf aWQgPSB0My5pZAorICAgICAgICBBTkQgdDQudHlwZV9pZCA9IHQyLnR5cGVfaWQKKyAgICAp ID0gRVhJU1RTICgKKyAgICAgIFNFTEVDVCAxCisgICAgICBGUk9NIHRzdDUgdDUKKyAgICAg IFdIRVJFIHQ1LnRzdDNfaWQgPSB0My5pZAorICAgICkKKyAgKQorKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgSGFzaCBSaWdodCBTZW1pIEpvaW4KKyAgIEhhc2ggQ29uZDogKHQyLnRzdDFfaWQg PSB0MS5pZCkKKyAgIC0+ICBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgICAgICAgIEpvaW4g RmlsdGVyOiAoRVhJU1RTKFN1YlBsYW4gZXhpc3RzXzEpID0gRVhJU1RTKFN1YlBsYW4gZXhp c3RzXzMpKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRzdDIgdDIKKyAgICAgICAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRzdDMgdDMK KyAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKGlkID0gQU5ZICgneyJcXHg1NDY1NzM3 NDMxIiwiXFx4NTQ2NTczNzQzMiJ9Jzo6Ynl0ZWFbXSkpCisgICAgICAgICBTdWJQbGFuIGV4 aXN0c18xCisgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0c3Q0IHQ0CisgICAgICAgICAg ICAgICAgIEZpbHRlcjogKCh0c3QzX2lkID0gdDMuaWQpIEFORCAodHlwZV9pZCA9IHQyLnR5 cGVfaWQpKQorICAgICAgICAgU3ViUGxhbiBleGlzdHNfMworICAgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gdHN0NSB0NQorICAgICAgICAgICAgICAgICBGaWx0ZXI6ICh0c3QzX2lkID0g dDMuaWQpCisgICAtPiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRzdDEgdDEK KyAgICAgICAgICAgICAgIEZpbHRlcjogKGlkIElTIE5PVCBOVUxMKQorKDE3IHJvd3MpCisK K0RST1AgVEFCTEUgdHN0MSwgdHN0MiwgdHN0MywgdHN0NCwgdHN0NTsKIC0tIFRlc3QgY2Fz ZSBmb3Igc3VibGlua3MgcHVzaGVkIGRvd24gaW50byBzdWJzZWxlY3RzIHZpYSBqb2luIGFs aWFzIGV4cGFuc2lvbgogLS0KIHNlbGVjdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC91cGRhdGFibGVfdmlld3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC91cGRhdGFibGVfdmlld3Mub3V0CmluZGV4IDAzZGY3ZTc1YjdiLi41ZmY4ZGI1M2Nm MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC91cGRhdGFibGVfdmll d3Mub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdXBkYXRhYmxlX3ZpZXdz Lm91dApAQCAtMzE3NywxNCArMzE3NywxMiBAQCBFWFBMQUlOIChjb3N0cyBvZmYpIElOU0VS VCBJTlRPIHJ3X3ZpZXcxIFZBTFVFUyAoMiwgJ05ldyByb3cgMicpOwogICAgICAgICAgT25l LVRpbWUgRmlsdGVyOiAoKEluaXRQbGFuIGV4aXN0c18xKS5jb2wxIElTIE5PVCBUUlVFKQog IAogIFVwZGF0ZSBvbiBiYXNlX3RibAotICAgSW5pdFBsYW4gZXhpc3RzXzEKLSAgICAgLT4g IEluZGV4IE9ubHkgU2NhbiB1c2luZyBiYXNlX3RibF9wa2V5IG9uIGJhc2VfdGJsIHQKLSAg ICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMikKLSAgIC0+ICBSZXN1bHQKLSAgICAgICAg IE9uZS1UaW1lIEZpbHRlcjogKEluaXRQbGFuIGV4aXN0c18xKS5jb2wxCisgICAtPiAgTmVz dGVkIExvb3AgU2VtaSBKb2luCiAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBiYXNl X3RibF9wa2V5IG9uIGJhc2VfdGJsCiAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQg PSAyKQotKDE1IHJvd3MpCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBiYXNlX3Ri bF9wa2V5IG9uIGJhc2VfdGJsIHQKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9 IDIpCisoMTMgcm93cykKIAogSU5TRVJUIElOVE8gcndfdmlldzEgVkFMVUVTICgyLCAnTmV3 IHJvdyAyJyk7CiBTRUxFQ1QgKiBGUk9NIGJhc2VfdGJsOwpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1 YnNlbGVjdC5zcWwKaW5kZXggMzZhOGEwYWExZDUuLjQwYzljM2Q4ODRiIDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3N1YnNlbGVjdC5zcWwKQEAgLTUxNiw2ICs1MTYsNDQ5IEBAIHdoZXJlIGV4 aXN0cyAoCiByb2xsYmFjazsKIAogLS0KKy0tIFRlc3QgY2FzZSBmb3IgZXhpc3Qgc3VibGlu ayB3aGVyZSB3ZSBjYW4gY29uc2lkZXIgc29tZSB1bmRlcGVuZGVudCBleHByZXNzaW9uCist LSB3aXRoIG91dGVyIGxpbmsKKy0tCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAx CitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpP SU4gdGMgT04gdGEuaWQgPSB0Yi5pZAorKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIK KyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlkCispOworCitFWFBMQUlOIChDT1NUUyBPRkYp CitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJP TSB0YgorICBKT0lOIHRjIE9OIDEgPSAxCisgIFdIRVJFIHRhLmlkID0gdGMuaWQKKyk7CisK Ky0tIEpvaW4gY29tcG91bmQgZXhwcmVzc2lvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIK KyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlkCisgICAgICAgICAgIEFORCB0YS5pZCA9IHRi LmlkCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YSB0YTEK K1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0 Yi5hdmFsID0gdGMuYWlkCisgICAgICAgICAgIEFORCB0Yi5hdmFsID0gdGExLmlkCispOwor CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorSk9JTiB0YiBPTiB0 cnVlCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiIHRiMQorICBKT0lO IHRjIE9OIHRhLmlkID0gdGIuaWQKKyk7CisKKy0tIENvbXBvdW5kIGV4cHJlc3Npb24gd2l0 aCBjb25zdCB0eXBlIG9yIG90aGVyIHR5cGUgb2YgZXhwcmVzc2lvbnMKK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1Qg MQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGEuaWQgPSB0Yy5pZAorICAgICAgICAgICBB TkQgdGEuaWQgPSAxCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJP TSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRj IE9OIHRhLmlkID0gdGMuaWQKKyAgICAgICAgICAgQU5EIHRiLmlkID0gMQorKTsKKworRVhQ TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisg IFNFTEVDVCAxCisgIEZST00gdGIKKyAgUklHSFQgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlk CisgIFdIRVJFIHRhLnZhbCA9IDEKKyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisg IEpPSU4gdGMgT04gdGEuaWQgPSB0Yi5pZAorICAgICAgICAgICBBTkQgdGIuYXZhbCA9IEFO WSAoJ3sxfSc6OmludFtdKQorKTsKKworLS0gRXhpc3RzIFN1YkxpbmsgZXhwcmVzc2lvbiB3 aXRoaW4gZXhwcmVzc2lvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00g dGEgdGExCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRhCisgIEpPSU4g dGIgT04gdGEuaWQgPSB0YTEuaWQKKyAgICAgICAgICAgQU5EIHRhMS52YWwgPSAxCisgIFdI RVJFIEVYSVNUUyAoCisgICAgU0VMRUNUIDEKKyAgICBGUk9NIHRhIHRhMgorICAgIFdIRVJF IHRhMi5pZCA9IHRhMS5pZAorICApCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgMQorRlJPTSB0YSB0YTEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00g dGEKKyAgSk9JTiB0YiBPTiB0YS52YWwgPSB0YTEuaWQKKyAgICAgICAgICAgQU5EIHRhMS5p ZCA9IDEKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAgIEZST00gdGEgdGEy CisgICAgV0hFUkUgdGEyLmlkID0gdGEuaWQKKyAgKQorKTsKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisg IEZST00gdGIKKyAgV0hFUkUgdGEuaWQgPSB0Yi5pZAorICAgIEFORCBFWElTVFMgKAorICAg ICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGMKKyAgICAgIFdIRVJFIHRjLmlkID0gdGIuaWQK KyAgICAgICAgQU5EIHRjLmFpZCArIHRiLmF2YWwgPiAwCisgICAgKQorKTsKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNF TEVDVCAxCisgIEZST00gdGIKKyAgV0hFUkUgdGEuaWQgPSB0Yi5pZAorICAgIEFORCBFWElT VFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGMKKyAgICAgIFdIRVJFIHRjLmlk ID0gdGIuaWQKKyAgICAgICAgQU5EIHRjLmFpZCArIHRhLnZhbCA+IDAKKyAgICApCispOwor CistLSBDaGVjayB3aXRoIE5VTEwgYW5kIE5PVCBOVUxMIGV4cHJlc3Npb25zCitBTFRFUiBU QUJMRSB0YSBBREQgQ09MVU1OIGlzX2FjdGl2ZSBib29sOworVVBEQVRFIHRhIFNFVCBpc19h Y3RpdmUgPSB0cnVlOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0 YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9O IHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFORCBDT0FMRVNDRSh0YS5pc19hY3RpdmUsIHRy dWUpCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YgorV0hF UkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YQorICBKT0lOIHRjIE9OIHRhLmlk ID0gdGIuaWQKKyAgICAgICAgIEFORCBDT0FMRVNDRSh0YS5pc19hY3RpdmUsIHRydWUpCisp OworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJ U1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0gdGIu aWQKKyAgICAgICAgIEFORCBDQVNFCisgICAgICAgICAgICAgICBXSEVOIHRhLmlzX2FjdGl2 ZSBUSEVOIHRydWUKKyAgICAgICAgICAgICAgIEVMU0UgZmFsc2UKKyAgICAgICAgICAgICBF TkQgPSB0cnVlCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0 YgorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YQorICBKT0lOIHRjIE9O IHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFORCBDQVNFCisgICAgICAgICAgICAgICBXSEVO IHRhLmlzX2FjdGl2ZSBUSEVOIHRydWUKKyAgICAgICAgICAgICAgIEVMU0UgZmFsc2UKKyAg ICAgICAgICAgICBFTkQgPSB0cnVlCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0Ygor ICBKT0lOIHRjIE9OIHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFORCB0YS5pc19hY3RpdmUK Kyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBF WElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGEuaWQgPSB0 Yi5pZAorICAgICAgICAgQU5EIHRhLmlzX2FjdGl2ZSBJUyBOT1QgTlVMTAorKTsKKworCist LSBEaXNhYmxlZCBwdWxsIHVwIGJlY2F1c2UgaXQgaXMgYXBwbGNhcGFibGUgZm9yIElOTkVS IEpPSU4gY29ubmVjdGlvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00g dGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgUklHSFQgSk9J TiB0YyBPTiB0YS5pZCA9IHRjLmlkCispOworCistLSBEaXNhYmxlIHB1bGwtdXAgZHVlIHRv IGxhY2sgb2YgdGhlIG91dGVyIHZhcgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEK K0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9J TiB0YyBPTiB0Yy5pZCA9IHRiLmlkCispOworCitDUkVBVEUgVEFCTEUgdGQgKGlkIGludCwg dGNfaWQgYnl0ZWEsIHZhbCBpbnQpOworCitJTlNFUlQgSU5UTyB0ZAorU0VMRUNUIGcuaWQs ICdUZXN0MSc6OmJ5dGVhIEFTIHRjX2lkLCA2IEFTIHZhbAorRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwgMjUpIEFTIGcoaWQpCisKK1VOSU9OIEFMTAorCitTRUxFQ1QgZy5pZCwgJ1Rlc3Qy Jzo6Ynl0ZWEgQVMgdGNfaWQsIDcgQVMgdmFsCitGUk9NIGdlbmVyYXRlX3NlcmllcygyNiwg NTApIEFTIGcoaWQpCisKK1VOSU9OIEFMTAorCitTRUxFQ1QgZy5pZCwgJ1Rlc3Q0Jzo6Ynl0 ZWEgQVMgdGNfaWQsIDYgQVMgdmFsCitGUk9NIGdlbmVyYXRlX3Nlcmllcyg1MSwgNzUpIEFT IGcoaWQpCisKK1VOSU9OIEFMTAorCitTRUxFQ1QgZy5pZCwgJ1Rlc3Q1Jzo6Ynl0ZWEgQVMg dGNfaWQsIDcgQVMgdmFsCitGUk9NIGdlbmVyYXRlX3Nlcmllcyg3NiwgMTAwKSBBUyBnKGlk KTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorIFNFTEVDVCB0YS5pZAorICAgRlJPTSB0YQor ICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgICBGUk9NIHRiCisgICAgIFdI RVJFIHRiLmlkID0gdGEuaWQgQU5ECisgICAgICAgICAgIEVYSVNUUworICAgICAgICAoU0VM RUNUIDEKKyAgICAgICAgICAgRlJPTSB0YworICAgICAgICAgIFdIRVJFIHRjLmlkID0gdGIu aWQpCisgICAgICAgICAgICAgICApOworCitFWFBMQUlOIChDT1NUUyBPRkYpCisgU0VMRUNU IHRhLmlkCisgICBGUk9NIHRhCisgIFdIRVJFIEVYSVNUUyAoCisgICAgU0VMRUNUIDEKKyAg ICAgIEZST00gdGIKKyAgICAgV0hFUkUgdGIuaWQgPSB0YS5pZCBBTkQKKyAgICAgICAgICAg RVhJU1RTCisgICAgICAgIChTRUxFQ1QgMQorICAgICAgICAgICBGUk9NIHRjCisgICAgICAg ICAgV0hFUkUgdGMuaWQgPSB0YS5pZCkKKyAgICAgICAgICAgICAgICk7CisKK0VYUExBSU4g KENPU1RTIE9GRikKKyBTRUxFQ1QgdGEuaWQKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJU1RT ICgKKyAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0YgorICAgICBXSEVSRSB0Yi5pZCA9IHRh LmlkCisgICAgICAgQU5EIEVYSVNUUworICAgICAgICAgICAgICAoU0VMRUNUIDEKKyAgICAg ICAgICAgICAgICAgRlJPTSB0YworICAgICAgICAgICAgICAgV0hFUkUgdGIuaWQgPSB0YS5p ZCkKKyAgICAgICAgICAgICAgICApOworCitleHBsYWluIChDT1NUUyBPRkYpCisgU0VMRUNU IHRhLmlkCisgICBGUk9NIHRhCisgIFdIRVJFIEVYSVNUUyAoCisgICAgU0VMRUNUIDEKKyAg ICAgIEZST00gdGIKKyAgICAgICAgam9pbiB0YyBvbiB0Yy5pZCA9IHRhLmlkCisgICAgICAg ICAgQU5EIEVYSVNUUyAoCisgICAgICAgICAgICAgICAgU0VMRUNUIDEKKyAgICAgICAgICAg ICAgICAgIEZST00gdGQKKyAgICAgICAgICAgICAgICBXSEVSRSB0ZC5pZCA9IHRhLmlkKQor ICAgICAgICAgICAgICAgICk7CisKK2V4cGxhaW4gKENPU1RTIE9GRikKKyBTRUxFQ1QgdGEu aWQKKyAgIEZST00gdGEKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAgICAg RlJPTSB0YgorICAgICAgICBqb2luIHRjIG9uIHRjLmlkID0gdGEuaWQKKyAgICAgICAgICBB TkQgRVhJU1RTICgKKyAgICAgICAgICAgICAgICBTRUxFQ1QgMQorICAgICAgICAgICAgICAg ICAgRlJPTSB0ZAorICAgICAgICAgICAgICAgIFdIRVJFIHRiLmlkID0gdGEuaWQpCisgICAg ICAgICAgICAgICAgKTsKKworQ1JFQVRFIFRBQkxFIHRlIChpZCBpbnQsIHRjX2lkIGJ5dGVh LCB2YWwgaW50KTsKK0lOU0VSVCBJTlRPIHRlIFNFTEVDVCAqIEZST00gdGQ7CisKK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCB0MS4qCitGUk9NIHRhIHQxCitXSEVSRSBFWElTVFMg KAorICBTRUxFQ1QgMQorICBGUk9NIChTRUxFQ1QgMSBBUyBTREJMX0RVTU1ZKSBTREJMX0RV QUwKKyAgSk9JTiB0YiB0MiBPTiB0Mi5pZCA9IHQxLmlkCisgIFdIRVJFIEVYSVNUUyAoCisg ICAgU0VMRUNUIDEKKyAgICBGUk9NIChTRUxFQ1QgMSBBUyBTREJMX0RVTU1ZKSBTREJMX0RV QUwKKyAgICBKT0lOIHRkIHQzIE9OIHQzLnRjX2lkIElOICgnVGVzdDEnOjpieXRlYSwgJ1Rl c3QyJzo6Ynl0ZWEpCisgICAgV0hFUkUgRVhJU1RTICgKKyAgICAgIFNFTEVDVCAxCisgICAg ICBGUk9NIHRlIHQ0CisgICAgICBXSEVSRSB0NC50Y19pZCA9IHQzLnRjX2lkCisgICAgICAg IEFORCB0NC52YWwgPSB0Mi5hdmFsCisgICAgKSA9IEVYSVNUUyAoCisgICAgICBTRUxFQ1Qg MQorICAgICAgRlJPTSB0YyB0NQorICAgICAgV0hFUkUgdDUuaWQgPSB0My5pZAorICAgICkK KyAgKQorKTsKKworRVhQTEFJTgorU0VMRUNUIHRhLioKK0ZST00gdGEKK1dIRVJFIEVYSVNU UyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0Yy5pZCA9IHRiLmlk CisgICAgICAgICBBTkQgdGIuaWQgPSB0YS5pZAorICBKT0lOIHRkIE9OIHRkLmlkID0gdGMu aWQKKyk7CisKK0RST1AgVEFCTEUgdGQsIHRlOworCitDUkVBVEUgVEFCTEUgdHN0MSAoaWQg aW50LCBtZXMgdmFyY2hhcigyMCkpOworQ1JFQVRFIFRBQkxFIHRzdDIgKGlkIGludCwgdHN0 MV9pZCBpbnQsIHR5cGVfaWQgaW50KTsKK0NSRUFURSBUQUJMRSB0c3QzIChpZCBieXRlYSk7 CitDUkVBVEUgVEFCTEUgdHN0NCAoaWQgaW50LCB0c3QzX2lkIGJ5dGVhLCB0eXBlX2lkIGlu dCk7CitDUkVBVEUgVEFCTEUgdHN0NSAoaWQgaW50LCB0c3QzX2lkIGJ5dGVhLCB0eXBlX2lk IGludCk7CisKK0lOU0VSVCBJTlRPIHRzdDEgVkFMVUVTICgxLCAndGVzdDEnKTsKK0lOU0VS VCBJTlRPIHRzdDEgVkFMVUVTICgyLCAndGVzdDInKTsKK0lOU0VSVCBJTlRPIHRzdDEgVkFM VUVTICgzLCAndGVzdDMnKTsKK0lOU0VSVCBJTlRPIHRzdDIgVkFMVUVTICgxLCAyLCA3KTsK K0lOU0VSVCBJTlRPIHRzdDIgVkFMVUVTICgxLCAyLCA2KTsKK0lOU0VSVCBJTlRPIHRzdDIg VkFMVUVTICgyLCAzLCA3KTsKKworSU5TRVJUIElOVE8gdHN0MworU0VMRUNUICgnVGVzdCcg fHwgZy5pZCk6OmJ5dGVhIEFTIGlkCisgICBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA1KSBB UyBnKGlkKTsKKworSU5TRVJUIElOVE8gdHN0NAorKFNFTEVDVCBnLmlkLCAnVGVzdDEnOjpi eXRlYSBBUyB0c3QzX2lkLCA2IEFTIHR5cGVfaWQKKyAgIEZST00gZ2VuZXJhdGVfc2VyaWVz KDEsIDI1KSBBUyBnKGlkKSkKK1VOSU9OIEFMTAorKFNFTEVDVCBnLmlkLCAnVGVzdDInOjpi eXRlYSBBUyB0c3QzX2lkLCA3IEFTIHR5cGVfaWQKKyAgIEZST00gZ2VuZXJhdGVfc2VyaWVz KDI2LCA1MCkgQVMgZyhpZCkpCitVTklPTiBBTEwKKyhTRUxFQ1QgZy5pZCwgJ1Rlc3Q0Jzo6 Ynl0ZWEgQVMgdHN0M19pZCwgNiBBUyB0eXBlX2lkCisgICBGUk9NIGdlbmVyYXRlX3Nlcmll cyg1MSwgNzUpIEFTIGcoaWQpKQorVU5JT04gQUxMCisoU0VMRUNUIGcuaWQsICdUZXN0NSc6 OmJ5dGVhIEFTIHRzdDNfaWQsIDcgQVMgdHlwZV9pZAorICAgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoNzYsIDEwMCkgQVMgZyhpZCkpOworSU5TRVJUIElOVE8gdHN0NSBTRUxFQ1QgKiBGUk9N IHRzdDQ7CisKK1ZBQ1VVTSAoQU5BTFlaRSkgdHN0MSwgdHN0MiwgdHN0MywgdHN0NCwgdHN0 NTsKKworLS0gQ2FzZSB3aXRoIHR3byBleGlzdHMgaW4gT3BFeHByLCBpbiB0aGUgZmlyc3Qg b25lIHQzLmlkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBxdWVyeQorLS0gYW5k IHQyLnR5cGUtaWQgaXMgdGhlIHJlZmVyZW5jZSB0byBncmFuZHBhcmVudCBxdWVyeQorRVhQ TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQxLioKK0ZST00gdHN0MSB0MQorV0hFUkUgRVhJ U1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSAoU0VMRUNUIDEgQVMgU0RCTF9EVU1NWSkgU0RC TF9EVUFMCisgIEpPSU4gdHN0MiB0MiBPTiB0Mi50c3QxX2lkID0gdDEuaWQKKyAgV0hFUkUg RVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAgIEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVN TVkpIFNEQkxfRFVBTAorICAgIEpPSU4gdHN0MyB0MyBPTiB0My5pZCBJTiAoJ1Rlc3QxJzo6 Ynl0ZWEsICdUZXN0Mic6OmJ5dGVhKQorICAgIFdIRVJFIEVYSVNUUyAoCisgICAgICBTRUxF Q1QgMQorICAgICAgRlJPTSB0c3Q0IHQ0CisgICAgICBXSEVSRSB0NC50c3QzX2lkID0gdDMu aWQKKyAgICAgICAgQU5EIHQ0LnR5cGVfaWQgPSB0Mi50eXBlX2lkCisgICAgKSA9IEVYSVNU UyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0c3Q1IHQ1CisgICAgICBXSEVSRSB0 NS50c3QzX2lkID0gdDMuaWQKKyAgICApCisgICkKKyk7CisKK0RST1AgVEFCTEUgdHN0MSwg dHN0MiwgdHN0MywgdHN0NCwgdHN0NTsKKwogLS0gVGVzdCBjYXNlIGZvciBzdWJsaW5rcyBw dXNoZWQgZG93biBpbnRvIHN1YnNlbGVjdHMgdmlhIGpvaW4gYWxpYXMgZXhwYW5zaW9uCiAt LQogCi0tIAoyLjM0LjEKCg== --------------L1JycJBl0zJGKV0dRzGVia1e--