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 1rkL0M-00C1NE-LS for pgsql-sql@arkaria.postgresql.org; Wed, 13 Mar 2024 09:34:35 +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 1rkL0K-00GZqg-15 for pgsql-sql@arkaria.postgresql.org; Wed, 13 Mar 2024 09:34:32 +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 1rjwbP-007fbu-Na for pgsql-sql@lists.postgresql.org; Tue, 12 Mar 2024 07:31:12 +0000 Received: from mail-yb1-xb33.google.com ([2607:f8b0:4864:20::b33]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rjwbM-00454S-18 for pgsql-sql@lists.postgresql.org; Tue, 12 Mar 2024 07:31:10 +0000 Received: by mail-yb1-xb33.google.com with SMTP id 3f1490d57ef6-dcc84ae94c1so4755565276.1 for ; Tue, 12 Mar 2024 00:31:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710228668; x=1710833468; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=l+GntULXqNdiQ4oPfv7hESlIJLhgtuXO4qadDYUmIDc=; b=CB6qSO2stBdk966ER9IA9tWEelQxlJF4na6xDiqspzeidOMETg6fvG68K7L/PebuT9 DRrV2hjN1TWPtuFffgJTMrfCMPhi1H0E9POvyy6CnFWZE5Cck3y+fDWHpnpUxGq3+w90 2eg9jT4WjNqDk8kOKTZptfXvLOveppf2Op9z4PGsFpfjNsskjpZcgTUgboEPQKBzI9o5 7vKW8e6iXjOkzFzPLdGDea3QLDuBKZ7uw2qHzPNE6bPkJVn56V89DTWzogEqgC2VZjuS DIlWl0PZv8xUovy9D+wS0cxw7nEsb+hUxePvndBpZLuY562sZOAP+E1qsRM0JCCkmVFs /xWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710228668; x=1710833468; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=l+GntULXqNdiQ4oPfv7hESlIJLhgtuXO4qadDYUmIDc=; b=N2eVd5d5qyNKLyVZvWpfPq4MIjthP7aS2DZrkVM982FK60v0XrC+pcyLiccPB/or3P 1W58qSCJjOj75K037/e+F8+m5EH8e0Hq//TK4SXVzljgUmXd4BOjAsKJQjbZSQlxO20x dggmIE/uiOFXxwik0nh4YkQYT7oF7tpN98O6qJdv3Hb3Ar12Vvgc+PU/bDNK9f/200DL uaiEGQCTJPKkazuR544kCTH+THlbWiUFu77ciL53nae4NgD6ukIuAYktnhr7OcC0u0bZ IBs78n9EqBthAfTmi52bTbmO0hztx8pzpJ5uQ+yaD+0mYbURukr4gUEMKkhqEWhgiOkK peVA== X-Gm-Message-State: AOJu0YzTg8EYPulmrzblEgIxUFBGFGZhjsSW+anzB5YUqFSvIK7T6zoH iHz2z7+EupApb0KX8OkP4tLM1smwUyflSVZ534X4D41An10q1pW/6wKnOCeUK41mQ5/lyI8VPd2 TBBfXNUpDUnQ4rS7uN61F9yPTIzEuXqRcS5g= X-Google-Smtp-Source: AGHT+IH6NAJYbycSWSgUL+ZzlHaPlja/UMaIo3BHZWLWHENEirLuKZ0PdxF+S0wJEYqfw6AnIx3/MuKqQmTaQfsB2FY= X-Received: by 2002:a25:bfcb:0:b0:dcd:26a8:7f84 with SMTP id q11-20020a25bfcb000000b00dcd26a87f84mr2808490ybm.47.1710228667974; Tue, 12 Mar 2024 00:31:07 -0700 (PDT) MIME-Version: 1.0 From: Sheryl Prabhu David Date: Tue, 12 Mar 2024 13:00:57 +0530 Message-ID: Subject: Nested loop behaviour with pg_stat_activity To: pgsql-sql@lists.postgresql.org Content-Type: multipart/alternative; boundary="0000000000003d4e99061371a4c8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003d4e99061371a4c8 Content-Type: text/plain; charset="UTF-8" Hi, I am working on a solution to sample pg_stat_activity along the lines of what is possible in Oracle, described as follows: In an Oracle database using a SQL like the one below, we have the ability to use, a series along the lines of Postgresqls generate_series() as seen in the 'connect by' line as outer table of a forced nested loop, and v$session(Oracles equivalent of pg_stat_activity) as the inner table, to get many samples of v$session each second. select /*+ ORDERED NO_MERGE USE_NL(g t s) */ g.*, t.*, s.* from ( select /*+ NO_MERGE */ 1 from dual connect by level <= :v_samples ) g, ( select /*+ NO_MERGE */ hsecs from v$timer ) t, ( select /*+ NO_MERGE */ s.sql_id, plan_hash_value, sql_exec_start, sql_exec_id, event, state, wait_class, row_wait_obj#, program, s.module, s.action, status from v$session s left outer join v$sqlarea sa on s.sql_hash_value=sa.hash_value and s.sql_address=sa.address where type != 'BACKGROUND' ) s order by sql_id, sql_exec_id, plan_hash_value, event, row_wait_obj# Trying something similar in Postgres does not produce an equivalent result. Instead of 'Number of sample' times *DIFFERENT* copies of pg_stat_activity, we are seeing 'Number of sample' times *SAME* copy of pg_stat_activity, unlike Oracle. MVCC and Isolation guarantees for regular tables is expected to produce this kind of a result, but I was hoping pg_stat_activity being a portal into internal data structures will act similar to Oracles v$session bypassing MVCC+Isolation. I am hoping to find out if there is anyway to force Oracle type behaviour for pg_stat_activity, please help. SQL I have tried in Postgres: vagrant=# set enable_material = off; SET vagrant=# explain with sampled as materialized ( select * from ( select pid, datname, usename, query, query_start, wait_event_type, wait_event, state from pg_stat_activity i, ( select * from generate_series(1,100) ) o offset 0 ) where state = 'active' ) select query, query_start, wait_event_type, wait_event, count(*) from sampled group by query, query_start, wait_event_type, wait_event; QUERY PLAN --------------------------------------------------------------------------------------------------------------- HashAggregate (cost=330.56..331.06 rows=50 width=112) Group Key: sampled.query, sampled.query_start, sampled.wait_event_type, sampled.wait_event CTE sampled -> Subquery Scan on unnamed_subquery (cost=2.39..328.93 rows=50 width=268) Filter: (unnamed_subquery.state = 'active'::text) -> Nested Loop (cost=2.39..203.93 rows=10000 width=268) -> Hash Left Join (cost=2.38..3.93 rows=100 width=268) Hash Cond: (s.usesysid = u.oid) -> Hash Left Join (cost=1.05..2.32 rows=100 width=208) Hash Cond: (s.datid = d.oid) -> Function Scan on pg_stat_get_activity s (cost=0.00..1.00 rows=100 width=148) -> Hash (cost=1.02..1.02 rows=2 width=68) -> Seq Scan on pg_database d (cost=0.00..1.02 rows=2 width=68) -> Hash (cost=1.15..1.15 rows=15 width=68) -> Seq Scan on pg_authid u (cost=0.00..1.15 rows=15 width=68) -> Function Scan on generate_series (cost=0.00..1.00 rows=100 width=0) -> CTE Scan on sampled (cost=0.00..1.00 rows=50 width=104) (17 rows) Could not get the nested loop order correct with this. vagrant=# explain with sampled as ( select * from ( with o as ( select pid, datname, usename, query, query_start, wait_event_type, wait_event, state from pg_stat_activity offset 0 ) select o2.* from o, o as o1, o as o2 offset 0 ) where state = 'active' ) select query, query_start, wait_event_type, wait_event, count(*) from sampled group by query, query_start, wait_event_type, wait_event; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate (cost=33015.13..33139.02 rows=4889 width=112) Group Key: unnamed_subquery.query, unnamed_subquery.query_start, unnamed_subquery.wait_event_type, unnamed_subquery.wait_event -> Sort (cost=33015.13..33027.63 rows=5000 width=104) Sort Key: unnamed_subquery.query, unnamed_subquery.query_start, unnamed_subquery.wait_event_type, unnamed_subquery.wait_event -> Subquery Scan on unnamed_subquery (cost=3.93..32707.93 rows=5000 width=104) Filter: (unnamed_subquery.state = 'active'::text) -> Nested Loop (cost=3.93..20207.93 rows=1000000 width=268) CTE o -> Hash Left Join (cost=2.38..3.93 rows=100 width=268) Hash Cond: (s.usesysid = u.oid) -> Hash Left Join (cost=1.05..2.32 rows=100 width=208) Hash Cond: (s.datid = d.oid) -> Function Scan on pg_stat_get_activity s (cost=0.00..1.00 rows=100 width=148) -> Hash (cost=1.02..1.02 rows=2 width=68) -> Seq Scan on pg_database d (cost=0.00..1.02 rows=2 width=68) -> Hash (cost=1.15..1.15 rows=15 width=68) -> Seq Scan on pg_authid u (cost=0.00..1.15 rows=15 width=68) -> Nested Loop (cost=0.00..203.00 rows=10000 width=0) -> CTE Scan on o (cost=0.00..2.00 rows=100 width=0) -> CTE Scan on o o1 (cost=0.00..2.00 rows=100 width=0) -> CTE Scan on o o2 (cost=0.00..2.00 rows=100 width=136) (21 rows) With this I am able to get the nested loop order correct where the alias o2 from which we are taking the results is the inner table in join order, but still we only get multiple copies of one state from pg_stat_activity. Please suggest alternatives if any. Regards Prabhu David --0000000000003d4e99061371a4c8 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SGksPGRpdj48YnI+PC9kaXY+PGRpdj5JIGFtIHdvcmtpbmcgb24gYSBz b2x1dGlvbiB0byBzYW1wbGUgcGdfc3RhdF9hY3Rpdml0eSBhbG9uZyB0aGUgbGluZXMgb2Ygd2hh dCBpcyBwb3NzaWJsZSBpbiBPcmFjbGUsIGRlc2NyaWJlZCBhcyBmb2xsb3dzOjwvZGl2PjxkaXY+ PGJyPjwvZGl2PjxkaXY+SW4gYW4gT3JhY2xlIGRhdGFiYXNlIHVzaW5nIGEgU1FMIGxpa2UgdGhl IG9uZSBiZWxvdywgd2UgaGF2ZSB0aGUgYWJpbGl0eSB0byB1c2UsIGEgc2VyaWVzIGFsb25nIHRo ZSBsaW5lcyBvZiBQb3N0Z3Jlc3FscyBnZW5lcmF0ZV9zZXJpZXMoKSBhcyBzZWVuIGluIHRoZSAm IzM5O2Nvbm5lY3QgYnkmIzM5OyBsaW5lIGFzIG91dGVyIHRhYmxlIG9mIGEgZm9yY2VkIG5lc3Rl ZCBsb29wLCBhbmQgdiRzZXNzaW9uKE9yYWNsZXMgZXF1aXZhbGVudCBvZiBwZ19zdGF0X2FjdGl2 aXR5KSBhcyB0aGUgaW5uZXIgdGFibGUsIHRvIGdldCBtYW55IHNhbXBsZXMgb2YgdiRzZXNzaW9u IGVhY2ggc2Vjb25kLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+c2VsZWN0PGJyPsKgIMKgIMKg IMKgIC8qKyBPUkRFUkVEIE5PX01FUkdFIFVTRV9OTChnIHQgcykgKi88YnI+wqAgwqAgwqAgwqAg Zy4qLDxicj7CoCDCoCDCoCDCoCB0LiosPGJyPsKgIMKgIMKgIMKgIHMuKjxicj5mcm9tPGJyPsKg IMKgIMKgIMKgICg8YnI+wqAgwqAgwqAgwqAgc2VsZWN0IC8qKyBOT19NRVJHRSAqLyAxIGZyb20g ZHVhbCBjb25uZWN0IGJ5IGxldmVsICZsdDs9IDp2X3NhbXBsZXM8YnI+wqAgwqAgwqAgwqAgKSBn LDxicj7CoCDCoCDCoCDCoCAoPGJyPsKgIMKgIMKgIMKgIHNlbGVjdCAvKisgTk9fTUVSR0UgKi8g aHNlY3MgZnJvbSB2JHRpbWVyPGJyPsKgIMKgIMKgIMKgICkgdCw8YnI+wqAgwqAgwqAgwqAgKDxi cj7CoCDCoCDCoCDCoCBzZWxlY3Q8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyorIE5PX01F UkdFICovPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHMuc3FsX2lkLDxicj7CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBwbGFuX2hhc2hfdmFsdWUsPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHNxbF9leGVjX3N0YXJ0LDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzcWxfZXhlY19pZCw8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXZlbnQsPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHN0YXRlLDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3YWl0X2NsYXNzLDxicj7CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCByb3dfd2FpdF9vYmojLDxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBwcm9ncmFtLDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzLm1vZHVsZSw8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgcy5hY3Rpb24sPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHN0YXR1czxicj7CoCDCoCDCoCDCoCBmcm9tPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHYk c2Vzc2lvbiBzPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlZnQgb3V0ZXIgam9pbiB2JHNx bGFyZWEgc2Egb24gcy5zcWxfaGFzaF92YWx1ZT1zYS5oYXNoX3ZhbHVlIGFuZCBzLnNxbF9hZGRy ZXNzPXNhLmFkZHJlc3M8YnI+wqAgwqAgwqAgwqAgd2hlcmU8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgdHlwZSAhPSAmIzM5O0JBQ0tHUk9VTkQmIzM5Ozxicj7CoCDCoCDCoCDCoCApIHM8YnI+ b3JkZXIgYnk8YnI+wqAgwqAgwqAgwqAgc3FsX2lkLDxicj7CoCDCoCDCoCDCoCBzcWxfZXhlY19p ZCw8YnI+wqAgwqAgwqAgwqAgcGxhbl9oYXNoX3ZhbHVlLDxicj7CoCDCoCDCoCDCoCBldmVudCw8 YnI+wqAgwqAgwqAgwqAgcm93X3dhaXRfb2JqIzxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2 PlRyeWluZyBzb21ldGhpbmcgc2ltaWxhciBpbiBQb3N0Z3JlcyBkb2VzIG5vdCBwcm9kdWNlIGFu IGVxdWl2YWxlbnQgcmVzdWx0LiBJbnN0ZWFkIG9mICYjMzk7TnVtYmVyIG9mIHNhbXBsZSYjMzk7 IHRpbWVzIDxiPkRJRkZFUkVOVDwvYj7CoGNvcGllcyBvZiBwZ19zdGF0X2FjdGl2aXR5LCB3ZSBh cmUgc2VlaW5nICYjMzk7TnVtYmVyIG9mIHNhbXBsZSYjMzk7IHRpbWVzIDxiPlNBTUU8L2I+IGNv cHkgb2YgcGdfc3RhdF9hY3Rpdml0eSwgdW5saWtlIE9yYWNsZS4gTVZDQyBhbmQgSXNvbGF0aW9u IGd1YXJhbnRlZXMgZm9yIHJlZ3VsYXIgdGFibGVzIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgdGhp cyBraW5kIG9mIGEgcmVzdWx0LCBidXQgSSB3YXMgaG9waW5nIHBnX3N0YXRfYWN0aXZpdHkgYmVp bmcgYSBwb3J0YWwgaW50byBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgd2lsbCBhY3Qgc2ltaWxh ciB0byBPcmFjbGVzIHYkc2Vzc2lvbiBieXBhc3NpbmcgTVZDQytJc29sYXRpb24uIEkgYW0gaG9w aW5nIHRvIGZpbmQgb3V0IGlmIHRoZXJlIGlzIGFueXdheSB0byBmb3JjZSBPcmFjbGUgdHlwZSBi ZWhhdmlvdXIgZm9yIHBnX3N0YXRfYWN0aXZpdHksIHBsZWFzZSBoZWxwLjwvZGl2PjxkaXY+PGJy PjwvZGl2PjxkaXY+U1FMIEkgaGF2ZSB0cmllZCBpbiBQb3N0Z3Jlczo8L2Rpdj48ZGl2Pjxicj48 L2Rpdj48ZGl2PnZhZ3JhbnQ9IyBzZXQgZW5hYmxlX21hdGVyaWFsID0gb2ZmOzxicj5TRVQ8YnI+ dmFncmFudD0jIGV4cGxhaW48YnI+d2l0aCBzYW1wbGVkIGFzIG1hdGVyaWFsaXplZCAoPGJyPsKg IMKgIHNlbGVjdDxicj7CoCDCoCDCoCDCoCDCoCDCoCo8YnI+wqAgwqAgZnJvbTxicj7CoCDCoCAo PGJyPsKgIMKgIMKgIMKgIHNlbGVjdDxicj7CoCDCoCDCoCDCoCDCoCDCoCBwaWQsPGJyPsKgIMKg IMKgIMKgIMKgIMKgIGRhdG5hbWUsPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHVzZW5hbWUsPGJyPsKg IMKgIMKgIMKgIMKgIMKgIHF1ZXJ5LDxicj7CoCDCoCDCoCDCoCDCoCDCoCBxdWVyeV9zdGFydCw8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgd2FpdF9ldmVudF90eXBlLDxicj7CoCDCoCDCoCDCoCDCoCDC oCB3YWl0X2V2ZW50LDxicj7CoCDCoCDCoCDCoCDCoCDCoCBzdGF0ZTxicj7CoCDCoCDCoCDCoCBm cm9tPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHBnX3N0YXRfYWN0aXZpdHkgaSw8YnI+wqAgwqAgwqAg wqAgwqAgwqAgKCBzZWxlY3QgKiBmcm9tIGdlbmVyYXRlX3NlcmllcygxLDEwMCkgKSBvPGJyPsKg IMKgIMKgIMKgIG9mZnNldCAwPGJyPsKgIMKgICk8YnI+wqAgwqAgd2hlcmU8YnI+wqAgwqAgwqAg wqAgc3RhdGUgPSAmIzM5O2FjdGl2ZSYjMzk7PGJyPik8YnI+c2VsZWN0PGJyPsKgIMKgIHF1ZXJ5 LDxicj7CoCDCoCBxdWVyeV9zdGFydCw8YnI+wqAgwqAgd2FpdF9ldmVudF90eXBlLDxicj7CoCDC oCB3YWl0X2V2ZW50LDxicj7CoCDCoCBjb3VudCgqKTxicj5mcm9tPGJyPsKgIMKgIHNhbXBsZWQ8 YnI+Z3JvdXAgYnk8YnI+wqAgwqAgcXVlcnksPGJyPsKgIMKgIHF1ZXJ5X3N0YXJ0LDxicj7CoCDC oCB3YWl0X2V2ZW50X3R5cGUsPGJyPsKgIMKgIHdhaXRfZXZlbnQ7PGJyPsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIFFVRVJZIFBMQU48YnI+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tPGJyPsKgSGFzaEFnZ3JlZ2F0ZSDCoChjb3N0PTMzMC41Ni4uMzMxLjA2 IHJvd3M9NTAgd2lkdGg9MTEyKTxicj7CoCDCoEdyb3VwIEtleTogc2FtcGxlZC5xdWVyeSwgc2Ft cGxlZC5xdWVyeV9zdGFydCwgc2FtcGxlZC53YWl0X2V2ZW50X3R5cGUsIHNhbXBsZWQud2FpdF9l dmVudDxicj7CoCDCoENURSBzYW1wbGVkPGJyPsKgIMKgIMKgLSZndDsgwqBTdWJxdWVyeSBTY2Fu IG9uIHVubmFtZWRfc3VicXVlcnkgwqAoY29zdD0yLjM5Li4zMjguOTMgcm93cz01MCB3aWR0aD0y NjgpPGJyPsKgIMKgIMKgIMKgIMKgIMKgRmlsdGVyOiAodW5uYW1lZF9zdWJxdWVyeS5zdGF0ZSA9 ICYjMzk7YWN0aXZlJiMzOTs6OnRleHQpPGJyPsKgIMKgIMKgIMKgIMKgIMKgLSZndDsgwqBOZXN0 ZWQgTG9vcCDCoChjb3N0PTIuMzkuLjIwMy45MyByb3dzPTEwMDAwIHdpZHRoPTI2OCk8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoEhhc2ggTGVmdCBKb2luIMKgKGNvc3Q9Mi4z OC4uMy45MyByb3dzPTEwMCB3aWR0aD0yNjgpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgSGFzaCBDb25kOiAocy51c2VzeXNpZCA9IHUub2lkKTxicj7CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoC0mZ3Q7IMKgSGFzaCBMZWZ0IEpvaW4gwqAoY29zdD0xLjA1 Li4yLjMyIHJvd3M9MTAwIHdpZHRoPTIwOCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBIYXNoIENvbmQ6IChzLmRhdGlkID0gZC5vaWQpPGJyPsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLSZndDsgwqBGdW5jdGlvbiBTY2Fu IG9uIHBnX3N0YXRfZ2V0X2FjdGl2aXR5IHMgwqAoY29zdD0wLjAwLi4xLjAwIHJvd3M9MTAwIHdp ZHRoPTE0OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAt Jmd0OyDCoEhhc2ggwqAoY29zdD0xLjAyLi4xLjAyIHJvd3M9MiB3aWR0aD02OCk8YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoFNl cSBTY2FuIG9uIHBnX2RhdGFiYXNlIGQgwqAoY29zdD0wLjAwLi4xLjAyIHJvd3M9MiB3aWR0aD02 OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoEhhc2ggwqAo Y29zdD0xLjE1Li4xLjE1IHJvd3M9MTUgd2lkdGg9NjgpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLSZndDsgwqBTZXEgU2NhbiBvbiBwZ19hdXRoaWQgdSDC oChjb3N0PTAuMDAuLjEuMTUgcm93cz0xNSB3aWR0aD02OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAtJmd0OyDCoEZ1bmN0aW9uIFNjYW4gb24gZ2VuZXJhdGVfc2VyaWVzIMKgKGNvc3Q9 MC4wMC4uMS4wMCByb3dzPTEwMCB3aWR0aD0wKTxicj7CoCDCoC0mZ3Q7IMKgQ1RFIFNjYW4gb24g c2FtcGxlZCDCoChjb3N0PTAuMDAuLjEuMDAgcm93cz01MCB3aWR0aD0xMDQpPGJyPigxNyByb3dz KTxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkNvdWxkIG5vdCBnZXQgdGhlIG5lc3RlZCBs b29wIG9yZGVyIGNvcnJlY3Qgd2l0aCB0aGlzLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+dmFn cmFudD0jIGV4cGxhaW48YnI+d2l0aCBzYW1wbGVkIGFzICg8YnI+wqAgwqAgc2VsZWN0PGJyPsKg IMKgIMKgIMKgIMKgIMKgKjxicj7CoCDCoCBmcm9tPGJyPsKgIMKgICg8YnI+wqAgwqAgd2l0aCBv IGFzICg8YnI+wqAgwqAgwqAgwqAgc2VsZWN0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIHBpZCw8YnI+ wqAgwqAgwqAgwqAgwqAgwqAgZGF0bmFtZSw8YnI+wqAgwqAgwqAgwqAgwqAgwqAgdXNlbmFtZSw8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgcXVlcnksPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHF1ZXJ5X3N0 YXJ0LDxicj7CoCDCoCDCoCDCoCDCoCDCoCB3YWl0X2V2ZW50X3R5cGUsPGJyPsKgIMKgIMKgIMKg IMKgIMKgIHdhaXRfZXZlbnQsPGJyPsKgIMKgIMKgIMKgIMKgIMKgIHN0YXRlPGJyPsKgIMKgIMKg IMKgIGZyb208YnI+wqAgwqAgwqAgwqAgwqAgwqAgcGdfc3RhdF9hY3Rpdml0eTxicj7CoCDCoCDC oCDCoCBvZmZzZXQgMDxicj7CoCDCoCApPGJyPsKgIMKgIHNlbGVjdDxicj7CoCDCoCDCoCDCoCBv Mi4qPGJyPsKgIMKgIGZyb208YnI+wqAgwqAgwqAgwqAgbyw8YnI+wqAgwqAgwqAgwqAgbyBhcyBv MSw8YnI+wqAgwqAgwqAgwqAgbyBhcyBvMjxicj7CoCDCoCDCoCDCoCBvZmZzZXQgMDxicj7CoCDC oCApPGJyPsKgIMKgIHdoZXJlPGJyPsKgIMKgIMKgIMKgIHN0YXRlID0gJiMzOTthY3RpdmUmIzM5 Ozxicj4pPGJyPnNlbGVjdDxicj7CoCDCoCBxdWVyeSw8YnI+wqAgwqAgcXVlcnlfc3RhcnQsPGJy PsKgIMKgIHdhaXRfZXZlbnRfdHlwZSw8YnI+wqAgwqAgd2FpdF9ldmVudCw8YnI+wqAgwqAgY291 bnQoKik8YnI+ZnJvbTxicj7CoCDCoCBzYW1wbGVkPGJyPmdyb3VwIGJ5PGJyPsKgIMKgIHF1ZXJ5 LDxicj7CoCDCoCBxdWVyeV9zdGFydCw8YnI+wqAgwqAgd2FpdF9ldmVudF90eXBlLDxicj7CoCDC oCB3YWl0X2V2ZW50Ozxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBRVUVS WSBQTEFOPGJyPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj7CoEdyb3VwQWdncmVnYXRlIMKgKGNv c3Q9MzMwMTUuMTMuLjMzMTM5LjAyIHJvd3M9NDg4OSB3aWR0aD0xMTIpPGJyPsKgIMKgR3JvdXAg S2V5OiB1bm5hbWVkX3N1YnF1ZXJ5LnF1ZXJ5LCB1bm5hbWVkX3N1YnF1ZXJ5LnF1ZXJ5X3N0YXJ0 LCB1bm5hbWVkX3N1YnF1ZXJ5LndhaXRfZXZlbnRfdHlwZSwgdW5uYW1lZF9zdWJxdWVyeS53YWl0 X2V2ZW50PGJyPsKgIMKgLSZndDsgwqBTb3J0IMKgKGNvc3Q9MzMwMTUuMTMuLjMzMDI3LjYzIHJv d3M9NTAwMCB3aWR0aD0xMDQpPGJyPsKgIMKgIMKgIMKgIMKgU29ydCBLZXk6IHVubmFtZWRfc3Vi cXVlcnkucXVlcnksIHVubmFtZWRfc3VicXVlcnkucXVlcnlfc3RhcnQsIHVubmFtZWRfc3VicXVl cnkud2FpdF9ldmVudF90eXBlLCB1bm5hbWVkX3N1YnF1ZXJ5LndhaXRfZXZlbnQ8YnI+wqAgwqAg wqAgwqAgwqAtJmd0OyDCoFN1YnF1ZXJ5IFNjYW4gb24gdW5uYW1lZF9zdWJxdWVyeSDCoChjb3N0 PTMuOTMuLjMyNzA3LjkzIHJvd3M9NTAwMCB3aWR0aD0xMDQpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgRmlsdGVyOiAodW5uYW1lZF9zdWJxdWVyeS5zdGF0ZSA9ICYjMzk7YWN0aXZlJiMzOTs6 OnRleHQpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLSZndDsgwqBOZXN0ZWQgTG9vcCDCoChj b3N0PTMuOTMuLjIwMjA3LjkzIHJvd3M9MTAwMDAwMCB3aWR0aD0yNjgpPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgQ1RFIG88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAtJmd0OyDCoEhhc2ggTGVmdCBKb2luIMKgKGNvc3Q9Mi4zOC4uMy45MyByb3dzPTEw MCB3aWR0aD0yNjgpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgSGFzaCBDb25kOiAocy51c2VzeXNpZCA9IHUub2lkKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC0mZ3Q7IMKgSGFzaCBMZWZ0IEpvaW4gwqAoY29zdD0x LjA1Li4yLjMyIHJvd3M9MTAwIHdpZHRoPTIwOCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBIYXNoIENvbmQ6IChzLmRhdGlkID0gZC5vaWQp PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg LSZndDsgwqBGdW5jdGlvbiBTY2FuIG9uIHBnX3N0YXRfZ2V0X2FjdGl2aXR5IHMgwqAoY29zdD0w LjAwLi4xLjAwIHJvd3M9MTAwIHdpZHRoPTE0OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoEhhc2ggwqAoY29zdD0xLjAyLi4x LjAyIHJvd3M9MiB3aWR0aD02OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoFNlcSBTY2FuIG9uIHBnX2RhdGFi YXNlIGQgwqAoY29zdD0wLjAwLi4xLjAyIHJvd3M9MiB3aWR0aD02OCk8YnI+wqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAtJmd0OyDCoEhhc2ggwqAoY29zdD0xLjE1 Li4xLjE1IHJvd3M9MTUgd2lkdGg9NjgpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLSZndDsgwqBTZXEgU2NhbiBvbiBwZ19hdXRoaWQgdSDC oChjb3N0PTAuMDAuLjEuMTUgcm93cz0xNSB3aWR0aD02OCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAtJmd0OyDCoE5lc3RlZCBMb29wIMKgKGNvc3Q9MC4wMC4uMjAzLjAwIHJv d3M9MTAwMDAgd2lkdGg9MCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAtJmd0OyDCoENURSBTY2FuIG9uIG8gwqAoY29zdD0wLjAwLi4yLjAwIHJvd3M9MTAwIHdp ZHRoPTApPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLSZndDsg wqBDVEUgU2NhbiBvbiBvIG8xIMKgKGNvc3Q9MC4wMC4uMi4wMCByb3dzPTEwMCB3aWR0aD0wKTxi cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC0mZ3Q7IMKgQ1RFIFNjYW4gb24gbyBv MiDCoChjb3N0PTAuMDAuLjIuMDAgcm93cz0xMDAgd2lkdGg9MTM2KTxicj4oMjEgcm93cyk8YnI+ PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5XaXRoIHRoaXMgSSBhbSBhYmxlIHRvIGdldCB0aGUg bmVzdGVkIGxvb3Agb3JkZXIgY29ycmVjdCB3aGVyZSB0aGUgYWxpYXMgbzIgZnJvbSB3aGljaCB3 ZSBhcmUgdGFraW5nIHRoZSByZXN1bHRzIGlzIHRoZSBpbm5lciB0YWJsZSBpbiBqb2luIG9yZGVy LCBidXQgc3RpbGwgd2Ugb25seSBnZXQgbXVsdGlwbGUgY29waWVzIG9mIG9uZSBzdGF0ZSBmcm9t IHBnX3N0YXRfYWN0aXZpdHkuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5QbGVhc2Ugc3VnZ2Vz dCBhbHRlcm5hdGl2ZXMgaWYgYW55LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+UmVnYXJkczwv ZGl2PjxkaXY+UHJhYmh1IERhdmlkPC9kaXY+PC9kaXY+DQo= --0000000000003d4e99061371a4c8--