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 1qgLmO-00FPTl-T3 for pgsql-bugs@arkaria.postgresql.org; Wed, 13 Sep 2023 09:03:25 +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 1qgLmN-00Fwcv-LL for pgsql-bugs@arkaria.postgresql.org; Wed, 13 Sep 2023 09:03:23 +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 1qgAtd-00C4J5-3C for pgsql-bugs@lists.postgresql.org; Tue, 12 Sep 2023 21:26:09 +0000 Received: from mail-out2.rabota.space ([217.65.2.58]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qgAtV-004DTR-Vu for pgsql-bugs@lists.postgresql.org; Tue, 12 Sep 2023 21:26:07 +0000 Received: by mail-out2.rabota.space (Postfix) with ESMTP id 4Rlc863RYjz3wtf for ; Wed, 13 Sep 2023 00:25:58 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rabota.ru; s=mail-20200803; t=1694553958; bh=fREvu4Hs/HAK/B7hkVH65sYsRK3eIgzPHAZWLRpazqA=; h=From:To:Subject:Date:Message-ID:Content-Type:MIME-Version:From; b=iV+fWjYmX1i2tIEf/HJ+g10YxD4CzUynr2V2cae0TAcvz0hQoOyQTkluU15wTNU5w 8oNRipMGwjptRnZKxFPFrjL1g8SdBhJX3Q21MDvQEhhIZuZ8bvzvBEC23Afaxx74xS Jx+NqOwQZVq5+Sl7EzsXH5yhKVfBJl/q6oq3/axBRoFeZDRD15iXYpSxLgMdCKYhhg idBbdDMKJaPwsf+6TDLU6/89sg7kbohQvHhrdiMOQtiiXl/BredYLcptq6FmjG45Aa 7nGohDM7aGi3CuAgB1/oVzIQCxRLHJDFcZSZGEPyj5HHAeXVBSed2QrqQXwC7C/VSH 2jnrYL9THu2MA== Authentication-Results: mail-out2.rabota.space; dkim=pass header.d=rabota.ru Received: by mx2.rabota.space with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim) (envelope-from ) id 1qgAtR-0006zd-2h for pgsql-bugs@lists.postgresql.org; Wed, 13 Sep 2023 00:25:57 +0300 Received: from ex1-msk2.corp.rabota.space (172.22.35.7) by ex2-msk2.corp.rabota.space (172.22.35.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.20; Wed, 13 Sep 2023 00:25:57 +0300 Received: from ex1-msk2.corp.rabota.space ([fe80::e5df:dcf2:146e:9acd]) by ex1-msk2.corp.rabota.space ([fe80::e5df:dcf2:146e:9acd%8]) with mapi id 15.02.1118.020; Wed, 13 Sep 2023 00:25:57 +0300 From: =?koi8-r?B?8snOwdQg7dXI1MHSz9c=?= To: "pgsql-bugs@lists.postgresql.org" Subject: PostgreSQL 12.15 query performance problem Thread-Topic: PostgreSQL 12.15 query performance problem Thread-Index: AQHZ5bvPZaqiSarNXUaLGROvJrW0Dw== Date: Tue, 12 Sep 2023 21:25:57 +0000 Message-ID: <64f5b8ebc96d48f49da8a8f4a3cf7b40@rabota.ru> Accept-Language: ru-RU, en-US Content-Language: ru-RU X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [172.22.32.141] Content-Type: multipart/mixed; boundary="_004_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_" MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_004_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_ Content-Type: multipart/alternative; boundary="_000_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_" --_000_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_ Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: quoted-printable Hello! select version(); --PostgreSQL 12.15 (Ubuntu 12.15-1.pgdg18.04+1) on x86_64-pc-linux-gnu, com= piled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit create schema if not exists test; drop table if exists test.sample_data; create table test.sample_data (id, data) as ( values (9::int, '{"click_id": "8dQZ1Q61daZvNyO", "utm_medium": "cpa", "utm= _source": "cityads", "utm_campaign": "Bg0m12"}'::jsonb), (1, '{"click_id": "8dQZ1Q2eA9Z5n75", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (2, '{"click_id": "1", "utm_source": "cityads"}'), (10, '{"click_id": "8dQZ1Q7WFYZiASC", "utm_medium": "cpa", "utm_sou= rce": "cityads", "utm_campaign": "Bg0m12"}'), (11, '{"click_id": "8dQZ1Q7Y3yZvIpx", "utm_medium": "cpa", "utm_sou= rce": "cityads", "utm_campaign": "Bg0m12"}'), (12, '{"click_id": "8dQZ1Q8jFjZrppg", "utm_medium": "cpa", "utm_sou= rce": "cityads", "utm_campaign": "Bg0m12"}'), (13, '{"click_id": "8dQZ1Q8IW7ZA7WY", "utm_medium": "cpa", "utm_sou= rce": "cityads", "utm_campaign": "Bg0m12"}'), (3, '{"click_id": "8dQZ1Q2WXjZmTBR", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (4, '{"click_id": "8dQZ1Q2XkuZe6hw", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (5, '{"click_id": "8dQZ1Q2XtaZA88c", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (7, '{"click_id": "8dQZ1Q2XW8Zivqs", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (6, '{"click_id": "8dQZ1Q2XAWZn0x3", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"}'), (8, '{"7": "777", "arr": [9, 8, 3, 4], "click_id": "8dQZ1Q61arZmTAm= ", "utm_medium": "cpa", "utm_source": "cityads", "utm_campaign": "Bg0m12"}'= ) ); --next create function jsonb_unnest_recursive(jsonb) from --https://github.com/rin-nas/postgresql-patterns-library/blob/master/functi= ons/jsonb_unnest_recursive.sql --or see attachement --Q1 select j.* from test.sample_data as s cross join jsonb_unnest_recursive(s.data) as j; --55 rows retrieved in 3 s 914 ms --Q2 select j.* from test.sample_data as s cross join lateral ( -- code body from jsonb_unnest_recursive(jsonb) with recursive r (path, value, member_of) as ( select array[k.key], v.value, t.type from jsonb_typeof(s.data) as t(type) left join jsonb_each(case t.type when 'object' then s.data end) as = o(obj_key, obj_value) on true left join jsonb_array_elements(case t.type when 'array' then s.data= end) with ordinality as a(arr_value, arr_key) on true cross join coalesce(o.obj_key, (a.arr_key - 1)::text) as k(key) cross join coalesce(o.obj_value, a.arr_value) as v(value) where t.type in ('object', 'array') and k.key is not null union all select array_append(r.path, k.key), v.value, t.type from r cross join jsonb_typeof(r.value) as t(type) left join jsonb_each(case t.type when 'object' then r.value end) as= o(obj_key, obj_value) on true left join jsonb_array_elements(case t.type when 'array' then r.valu= e end) with ordinality as a(arr_value, arr_key) on true cross join coalesce(o.obj_key, (a.arr_key - 1)::text) as k(key) cross join coalesce(o.obj_value, a.arr_value) as v(value) where t.type in ('object', 'array') and k.key is not null ) select r.* from r where jsonb_typeof(r.value) not in ('object', 'array') ) as j; -- 55 rows retrieved in 446 ms Why Q2 much faster than Q1? --- Best regards, Rinat Mukhtarov =F5=F7=E5=E4=EF=ED=EC=E5=EE=E9=E5 =EF =EB=EF=EE=E6=E9=E4=E5=EE=E3=E9=E1=EC= =F8=EE=EF=F3=F4=E9: =FC=D4=CF =DC=CC=C5=CB=D4=D2=CF=CE=CE=CF=C5 =D3=CF=CF= =C2=DD=C5=CE=C9=C5 =C9 =CC=C0=C2=D9=C5 =C4=CF=CB=D5=CD=C5=CE=D4=D9, =D0=D2= =C9=CC=CF=D6=C5=CE=CE=D9=C5 =CB =CE=C5=CD=D5, =D3=CF=C4=C5=D2=D6=C1=D4 =CB= =CF=CE=C6=C9=C4=C5=CE=C3=C9=C1=CC=D8=CE=D5=C0 =C9=CE=C6=CF=D2=CD=C1=C3=C9= =C0. =EE=C1=D3=D4=CF=D1=DD=C9=CD =D5=D7=C5=C4=CF=CD=CC=D1=C5=CD =F7=C1=D3 = =CF =D4=CF=CD, =DE=D4=CF =C5=D3=CC=C9 =DC=D4=CF =D3=CF=CF=C2=DD=C5=CE=C9=C5= =CE=C5 =D0=D2=C5=C4=CE=C1=DA=CE=C1=DE=C5=CE=CF =F7=C1=CD, =C9=D3=D0=CF=CC= =D8=DA=CF=D7=C1=CE=C9=C5, =CB=CF=D0=C9=D2=CF=D7=C1=CE=C9=C5, =D2=C1=D3=D0= =D2=CF=D3=D4=D2=C1=CE=C5=CE=C9=C5 =C9=CE=C6=CF=D2=CD=C1=C3=C9=C9, =D3=CF=C4= =C5=D2=D6=C1=DD=C5=CA=D3=D1 =D7 =CE=C1=D3=D4=CF=D1=DD=C5=CD =D3=CF=CF=C2=DD= =C5=CE=C9=C9, =C1 =D4=C1=CB=D6=C5 =CF=D3=D5=DD=C5=D3=D4=D7=CC=C5=CE=C9=C5 = =CC=C0=C2=D9=C8 =C4=C5=CA=D3=D4=D7=C9=CA =CE=C1 =CF=D3=CE=CF=D7=C5 =DC=D4= =CF=CA =C9=CE=C6=CF=D2=CD=C1=C3=C9=C9, =D3=D4=D2=CF=C7=CF =DA=C1=D0=D2=C5= =DD=C5=CE=CF. =E5=D3=CC=C9 =F7=D9 =D0=CF=CC=D5=DE=C9=CC=C9 =DC=D4=CF =D3=CF= =CF=C2=DD=C5=CE=C9=C5 =D0=CF =CF=DB=C9=C2=CB=C5, =D0=CF=D6=C1=CC=D5=CA=D3= =D4=C1, =D3=CF=CF=C2=DD=C9=D4=C5 =CF=C2 =DC=D4=CF=CD =CF=D4=D0=D2=C1=D7=C9= =D4=C5=CC=C0 =D0=CF =DC=CC=C5=CB=D4=D2=CF=CE=CE=CF=CA =D0=CF=DE=D4=C5 =C9 = =D5=C4=C1=CC=C9=D4=C5 =DC=D4=CF =D3=CF=CF=C2=DD=C5=CE=C9=C5. CONFIDENTIALIT= Y NOTICE: This email and any files attached to it are confidential. If you = are not the intended recipient you are notified that using, copying, distri= buting or taking any action in reliance on the contents of this information= is strictly prohibited. If you have received this email in error please no= tify the sender and delete this email. --_000_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_ Content-Type: text/html; charset="koi8-r" Content-Transfer-Encoding: quoted-printable

Hello!


select version();
--PostgreSQL 12.15 (Ubuntu 12.15-1.pgdg18.04+1) on x86_64-pc-= linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit
<= /span>
create schema if not exists test;

drop table = if exists test.sample_data;

c= reate table test.sample_data (id, data) as (
values
<= span style=3D"color:#0033b3;">
(9::int, '= {"click_id": "8dQZ1Q61daZvNyO", "utm_medium":= "cpa", "utm_source": "cityads", "utm_ca= mpaign": "Bg0m12"}'::jsonb),
(1, '{"click_= id": "8dQZ1Q2eA9Z5n75", "utm_medium": "cpa&qu= ot;, "utm_source": "cityads", "utm_campaign":= "Bg0m12"}'),
(2= , '{"click_id": "1&quo= t;, "utm_source": "cityads"}'),
(10
, '{&quo= t;click_id": "8dQZ1Q7WFYZiASC", "utm_medium": &quo= t;cpa", "utm_source": "cityads", "utm_campaig= n": "Bg0m12"}'),
(11, '{"click_id": &q= uot;8dQZ1Q7Y3yZvIpx", "utm_medium": "cpa", "u= tm_source": "cityads", "utm_campaign": "Bg0m1= 2"}'),
(12, '{"click_id": "8dQZ1Q8jFjZrppg&= quot;, "utm_medium": "cpa", "utm_source": &qu= ot;cityads", "utm_campaign": "Bg0m12"}'
), (13, '{"click_id": "8dQZ1Q8IW7ZA7WY", "utm_med= ium": "cpa", "utm_source": "cityads", &q= uot;utm_campaign": "Bg0m12"}'),
(3, '{"clic= k_id": "8dQZ1Q2WXjZmTBR", "utm_medium": "cpa&= quot;, "utm_source": "cityads", "utm_campaign"= ;: "Bg0m12"}'),
(4, '{"click_id": "8dQ= Z1Q2XkuZe6hw", "utm_medium": "cpa", "utm_sour= ce": "cityads", "utm_campaign": "Bg0m12"= }'),
(5, '{"click_id": "8dQZ1Q2XtaZA88c", &= quot;utm_medium": "cpa", "utm_source": "citya= ds", "utm_campaign": "Bg0m12"}'),
= (7, = '{"click_id": "8dQZ1Q2XW8Zivqs", "utm_medium"= : "cpa", "utm_source": "cityads", "utm_c= ampaign": "Bg0m12"}'),
(6, '{"click_id"= ;: "8dQZ1Q2XAWZn0x3", "utm_medium": "cpa", &q= uot;utm_source": "cityads", "utm_campaign": "= Bg0m12"}'),
(8= , '{"7": "777", "ar= r": [9, 8, 3, 4], "click_id": "8dQZ1Q61arZmTAm", &= quot;utm_medium": "cpa", "utm_source": "citya= ds", "utm_campaign": "Bg0m12"}')
);
<= br>--next create function = jsonb_unnest_recursive(jsonb) from
--https://github.com/rin-nas/postgresql-patterns-library= /blob/master/functions/jsonb_unnest_recursive.sql
--or see attachement

--Q1
select j.*
from tes= t.sample_data as s
cross join jsonb_unnest_recursive(s.data) as j;
--55 rows retrieved in 3 s 914 ms

--Q2
select j.*
from test.sample_data as
s
cross join lateral (
-- code body from jsonb_unnest_recursive(jsonb)
with recursive r (path, val= ue, member_of) as
( select
array[k.key],
v.value, t.type
from
jsonb_typeof(s.data) as t(type)
left join jsonb_ea= ch(case t.type when 'object' then = s.data end) as
o(o= bj_key, obj_value) on true
= left join jsonb_a= rray_elements(case t.type when 'arr= ay' then s.data end) with ordinality as a(arr_value, a= rr_key) on true
cross join coalesce(o= .obj_key, (a.arr_key - 1)::text) = as k(key)
cross join coalesce(o.obj_value, a.arr_value) as v(value)
where= t.type in ('object', 'array')
and k.key is not null
= union all
select
array_append(r.path, k.key),
= v.value,
t.type
= from r
cross join
jsonb_typeof(r.value) as t(type)
left join = jsonb_each(<= span style=3D"color:#0033b3;">case
t<= /span>.type when 'object' then r.value en= d) as o(obj_key, obj_value) on tru= e
left join jsonb_array_elements(case
t.type when 'array' then r.value end
) with ordinality as a(arr_value, arr_key) on true
cross join <= /span>coalesce(o.obj_key<= /span>, (a.arr_key - 1)::text) as <= span style=3D"color:#000000;">k(key)
cross join coalesce(o.obj_value, a
.arr_valu= e) as v(value)
where
t.type in ('object', 'array')
and k.key is not null
)
select r.*
from
r
=
where jsonb_ty= peof(r.value) not in ('object', 'ar= ray')
) as j;
-- 55 rows retrieved in 446 ms<= /span>

<= /span>Why Q2 much faster than Q1?

---
Best regards,
Rinat Mukhtarov

=F5=F7=E5=E4=EF=ED=EC=E5=EE=E9=E5 =EF =EB=EF=EE=E6=E9=E4=E5=EE=E3=E9=E1=EC= =F8=EE=EF=F3=F4=E9: =FC=D4=CF =DC=CC=C5=CB=D4=D2=CF=CE=CE=CF=C5 =D3=CF=CF= =C2=DD=C5=CE=C9=C5 =C9 =CC=C0=C2=D9=C5 =C4=CF=CB=D5=CD=C5=CE=D4=D9, =D0=D2= =C9=CC=CF=D6=C5=CE=CE=D9=C5 =CB =CE=C5=CD=D5, =D3=CF=C4=C5=D2=D6=C1=D4 =CB= =CF=CE=C6=C9=C4=C5=CE=C3=C9=C1=CC=D8=CE=D5=C0 =C9=CE=C6=CF=D2=CD=C1=C3=C9= =C0. =EE=C1=D3=D4=CF=D1=DD=C9=CD =D5=D7=C5=C4=CF=CD=CC=D1=C5=CD =F7=C1=D3 = =CF =D4=CF=CD, =DE=D4=CF =C5=D3=CC=C9 =DC=D4=CF =D3=CF=CF=C2=DD=C5=CE=C9=C5= =CE=C5 =D0=D2=C5=C4=CE=C1=DA=CE=C1=DE=C5=CE=CF =F7=C1=CD, =C9=D3=D0=CF=CC= =D8=DA=CF=D7=C1=CE=C9=C5, =CB=CF=D0=C9=D2=CF=D7=C1=CE=C9=C5, =D2=C1=D3=D0= =D2=CF=D3=D4=D2=C1=CE=C5=CE=C9=C5 =C9=CE=C6=CF=D2=CD=C1=C3=C9=C9, =D3=CF=C4=C5=D2=D6=C1=DD=C5=CA=D3=D1 =D7 = =CE=C1=D3=D4=CF=D1=DD=C5=CD =D3=CF=CF=C2=DD=C5=CE=C9=C9, =C1 =D4=C1=CB=D6= =C5 =CF=D3=D5=DD=C5=D3=D4=D7=CC=C5=CE=C9=C5 =CC=C0=C2=D9=C8 =C4=C5=CA=D3=D4= =D7=C9=CA =CE=C1 =CF=D3=CE=CF=D7=C5 =DC=D4=CF=CA =C9=CE=C6=CF=D2=CD=C1=C3= =C9=C9, =D3=D4=D2=CF=C7=CF =DA=C1=D0=D2=C5=DD=C5=CE=CF. =E5=D3=CC=C9 =F7=D9= =D0=CF=CC=D5=DE=C9=CC=C9 =DC=D4=CF =D3=CF=CF=C2=DD=C5=CE=C9=C5 =D0=CF =CF= =DB=C9=C2=CB=C5, =D0=CF=D6=C1=CC=D5=CA=D3=D4=C1, =D3=CF=CF=C2=DD=C9=D4=C5 = =CF=C2 =DC=D4=CF=CD =CF=D4=D0=D2=C1=D7=C9=D4=C5=CC=C0 =D0=CF =DC=CC=C5=CB= =D4=D2=CF=CE=CE=CF=CA =D0=CF=DE=D4=C5 =C9 =D5=C4=C1=CC=C9=D4=C5 =DC=D4=CF = =D3=CF=CF=C2=DD=C5=CE=C9=C5. CONFIDENTIALITY NOTICE: This email and any files attached to it are confid= ential. If you are not the intended recipient you are notified that using, = copying, distributing or taking any action in reliance on the contents of t= his information is strictly prohibited. If you have received this email in error please notify the sender and dele= te this email. --_000_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_-- --_004_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_ Content-Type: application/sql; name="jsonb_unnest_recursive.sql" Content-Description: jsonb_unnest_recursive.sql Content-Disposition: attachment; filename="jsonb_unnest_recursive.sql"; size=2321; creation-date="Tue, 12 Sep 2023 21:20:04 GMT"; modification-date="Tue, 12 Sep 2023 21:20:04 GMT" Content-Transfer-Encoding: base64 Y3JlYXRlIG9yIHJlcGxhY2UgZnVuY3Rpb24gcHVibGljLmpzb25iX3VubmVzdF9yZWN1cnNpdmUo ZGF0YSBqc29uYikKICAgIHJldHVybnMgdGFibGUoCiAgICAgICAgcGF0aCAgdGV4dFtdLAogICAg ICAgIHZhbHVlIGpzb25iLAogICAgICAgIG1lbWJlcl9vZiB0ZXh0CiAgICApCiAgICBpbW11dGFi bGUKICAgIHJldHVybnMgbnVsbCBvbiBudWxsIGlucHV0IC0tID0gc3RyaWN0CiAgICBwYXJhbGxl bCBzYWZlIC0tIFBvc3RncmVzIDEwIG9yIGxhdGVyCiAgICBzZWN1cml0eSBpbnZva2VyCiAgICBs YW5ndWFnZSBzcWwKICAgIHNldCBzZWFyY2hfcGF0aCA9ICcnCmFzICRmdW5jJAogICAgLS1leHBs YWluIChhbmFseXNlKQogICAgd2l0aCByZWN1cnNpdmUgciAocGF0aCwgdmFsdWUsIG1lbWJlcl9v ZikgYXMKICAgICgKICAgICAgICBzZWxlY3QKICAgICAgICAgICAgYXJyYXlbay5rZXldLAogICAg ICAgICAgICB2LnZhbHVlLAogICAgICAgICAgICB0LnR5cGUKICAgICAgICBmcm9tIGpzb25iX3R5 cGVvZihkYXRhKSBhcyB0KHR5cGUpCiAgICAgICAgbGVmdCBqb2luIGpzb25iX2VhY2goY2FzZSB0 LnR5cGUgd2hlbiAnb2JqZWN0JyB0aGVuIGRhdGEgZW5kKSBhcyBvKG9ial9rZXksIG9ial92YWx1 ZSkgb24gdHJ1ZQogICAgICAgIGxlZnQgam9pbiBqc29uYl9hcnJheV9lbGVtZW50cyhjYXNlIHQu dHlwZSB3aGVuICdhcnJheScgdGhlbiBkYXRhIGVuZCkgd2l0aCBvcmRpbmFsaXR5IGFzIGEoYXJy X3ZhbHVlLCBhcnJfa2V5KSBvbiB0cnVlCiAgICAgICAgY3Jvc3Mgam9pbiBjb2FsZXNjZShvLm9i al9rZXksIChhLmFycl9rZXkgLSAxKTo6dGV4dCkgYXMgayhrZXkpCiAgICAgICAgY3Jvc3Mgam9p biBjb2FsZXNjZShvLm9ial92YWx1ZSwgYS5hcnJfdmFsdWUpIGFzIHYodmFsdWUpCiAgICAgICAg d2hlcmUgdC50eXBlIGluICgnb2JqZWN0JywgJ2FycmF5JykKICAgICAgICAgIGFuZCBrLmtleSBp cyBub3QgbnVsbAogICAgdW5pb24gYWxsCiAgICAgICAgc2VsZWN0CiAgICAgICAgICAgIGFycmF5 X2FwcGVuZChyLnBhdGgsIGsua2V5KSwKICAgICAgICAgICAgdi52YWx1ZSwKICAgICAgICAgICAg dC50eXBlCiAgICAgICAgZnJvbSByCiAgICAgICAgY3Jvc3Mgam9pbiBqc29uYl90eXBlb2Yoci52 YWx1ZSkgYXMgdCh0eXBlKQogICAgICAgIGxlZnQgam9pbiBqc29uYl9lYWNoKGNhc2UgdC50eXBl IHdoZW4gJ29iamVjdCcgdGhlbiByLnZhbHVlIGVuZCkgYXMgbyhvYmpfa2V5LCBvYmpfdmFsdWUp IG9uIHRydWUKICAgICAgICBsZWZ0IGpvaW4ganNvbmJfYXJyYXlfZWxlbWVudHMoY2FzZSB0LnR5 cGUgd2hlbiAnYXJyYXknIHRoZW4gci52YWx1ZSBlbmQpIHdpdGggb3JkaW5hbGl0eSBhcyBhKGFy cl92YWx1ZSwgYXJyX2tleSkgb24gdHJ1ZQogICAgICAgIGNyb3NzIGpvaW4gY29hbGVzY2Uoby5v Ympfa2V5LCAoYS5hcnJfa2V5IC0gMSk6OnRleHQpIGFzIGsoa2V5KQogICAgICAgIGNyb3NzIGpv aW4gY29hbGVzY2Uoby5vYmpfdmFsdWUsIGEuYXJyX3ZhbHVlKSBhcyB2KHZhbHVlKQogICAgICAg IHdoZXJlIHQudHlwZSBpbiAoJ29iamVjdCcsICdhcnJheScpCiAgICAgICAgICBhbmQgay5rZXkg aXMgbm90IG51bGwKICAgICkKICAgIHNlbGVjdCByLioKICAgIGZyb20gcgogICAgd2hlcmUganNv bmJfdHlwZW9mKHIudmFsdWUpIG5vdCBpbiAoJ29iamVjdCcsICdhcnJheScpOwokZnVuYyQ7Cgpj b21tZW50IG9uIGZ1bmN0aW9uIHB1YmxpYy5qc29uYl91bm5lc3RfcmVjdXJzaXZlKGRhdGEganNv bmIpIGlzICdSZWN1cnNpdmUgcGFyc2UgbmVzdGVkIEpTT04gKGFycmF5cyBhbmQgb2JqZWN0cyks IHJldHVybnMga2V5cyBhbmQgaXRzIHZhbHVlcyc7CgoKLS1URVNUIEFORCBVU0lORyBFWEFNUExF CnNlbGVjdCBjYXJkaW5hbGl0eShwYXRoKSBhcyBsZXZlbCwgKgpmcm9tIHB1YmxpYy5qc29uYl91 bm5lc3RfcmVjdXJzaXZlKCd7ImlkIjoxMjMsImciOm51bGwsImEiOls5LDgsNCw1XSwibmFtZSI6 InVua25vd24iLCAiNyI6IDN9Jzo6anNvbmIpCm9yZGVyIGJ5IGxldmVsLCBtZW1iZXJfb2YsIHBh dGg7CgovKgotLSBFeGFtcGxlOiBmaW5kIGFsbCBlbWFpbHMgaW4gSlNPTiBkYXRhCnNlbGVjdCBw YXRoLCB2YWx1ZS0+PjAgYXMgZW1haWwKZnJvbSBwdWJsaWMuanNvbmJfdW5uZXN0X3JlY3Vyc2l2 ZSgnW3sibmFtZSI6Ik1pa2UiLCAiYWdlIjogNDUsICJlbWFpbHMiOltudWxsLCAibWlrZS4xOTc3 QGdtYWlsLmNvbSJdfV0nOjpqc29uYikKd2hlcmUganNvbmJfdHlwZW9mKHZhbHVlKSA9ICdzdHJp bmcnCiAgYW5kIHB1YmxpYy5pc19lbWFpbCh2YWx1ZS0+PjApOwoqLwo= --_004_64f5b8ebc96d48f49da8a8f4a3cf7b40rabotaru_--