Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1h8E0X-0004DN-Kq for pgsql-hackers@arkaria.postgresql.org; Mon, 25 Mar 2019 01:02:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1h8E0U-0005cf-WB for pgsql-hackers@arkaria.postgresql.org; Mon, 25 Mar 2019 01:02:31 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1h8E0U-0005cX-LO for pgsql-hackers@lists.postgresql.org; Mon, 25 Mar 2019 01:02:30 +0000 Received: from tama50.ecl.ntt.co.jp ([129.60.39.147]) by magus.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1h8E0P-0007gV-E6 for pgsql-hackers@postgresql.org; Mon, 25 Mar 2019 01:02:29 +0000 Received: from vc1.ecl.ntt.co.jp (vc1.ecl.ntt.co.jp [129.60.86.153]) by tama50.ecl.ntt.co.jp (8.13.8/8.13.8) with ESMTP id x2P12FpT031743; Mon, 25 Mar 2019 10:02:15 +0900 Received: from vc1.ecl.ntt.co.jp (localhost [127.0.0.1]) by vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 5D641EA7550; Mon, 25 Mar 2019 10:02:15 +0900 (JST) Received: from jcms-pop21.ecl.ntt.co.jp (jcms-pop21.ecl.ntt.co.jp [129.60.87.134]) by vc1.ecl.ntt.co.jp (Postfix) with ESMTP id 50886EA752A; Mon, 25 Mar 2019 10:02:15 +0900 (JST) Received: from [127.0.0.1] (unknown [129.60.241.68]) by jcms-pop21.ecl.ntt.co.jp (Postfix) with ESMTPSA id 3F9B940034B; Mon, 25 Mar 2019 10:02:15 +0900 (JST) Subject: Re: [HACKERS] CLUSTER command progress monitor References: <20181218172311.qjrcso7cozfi7j2d@alvherre.pgsql> <58bbcaf7-a3e9-3718-51f1-65b4d1af97e2@lab.ntt.co.jp> <76d84ded-c81c-98b1-6fa4-4551ff295008@lab.ntt.co.jp> <6e7d43da-95da-216d-a015-f2563cd3c8de@lab.ntt.co.jp> <03cc5c0e-243c-e4a0-c5cf-a1f8380ca530@lab.ntt.co.jp> <288ef3f3-3b0b-9780-191b-67fea98e91ed@lab.ntt.co.jp> From: Tatsuro Yamada Message-ID: <490f30fe-2255-4991-65c1-e72bee2a9011@lab.ntt.co.jp> Date: Mon, 25 Mar 2019 10:01:46 +0900 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------FF9CF1647AB8500C66BF8C84" Content-Language: en-US X-CC-Mail-RelayStamp: 1 To: Robert Haas Cc: Rafia Sabih , Alvaro Herrera , Dmitry Dolgov <9erthalion6@gmail.com>, Peter Geoghegan , PostgreSQL-development , Jeff Janes , Thomas Munro , Michael Paquier X-TM-AS-MML: disable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------FF9CF1647AB8500C66BF8C84 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi Robert! On 2019/03/23 3:31, Robert Haas wrote: > On Tue, Mar 19, 2019 at 2:47 PM Robert Haas wrote: >> how close you were getting to rewriting the entire heap. This is the >> one thing I found but did not fix; any chance you could make this >> change and update the documentation to match? > > Hi, is anybody working on this? I sent this email using my personal email address: yamatattsu@gmail-. I re-send it with the patch and my test result. Thank you so much for reviewing the patch and sorry for the late reply. Today, I realized that you sent the email for the patch because I took a sick leave from work for a while. So, I created new patch based on your comments asap. I hope it is acceptable to you. :) Changes - Add new column *heap_tuples_written* in the view This column is updated when the phases are "seq scanning heap", "index scanning heap" or "writing new heap". - Fix document - Revised the patch on the current head: 940311e4bb32a5fe99155052e41179c88b5d48af. Please find attached files. :) Regards, Tatsuro Yamada --------------FF9CF1647AB8500C66BF8C84 Content-Type: text/x-patch; name="progress_monitor_for_cluster_command_v12.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="progress_monitor_for_cluster_command_v12.patch" diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index ac2721c..26a6899 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -340,7 +340,15 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser pg_stat_progress_vacuumpg_stat_progress_vacuum One row for each backend (including autovacuum worker processes) running VACUUM, showing current progress. - See . + See . + + + + + pg_stat_progress_clusterpg_stat_progress_cluster + One row for each backend running + CLUSTER or VACUUM FULL, showing current progress. + See . @@ -3394,9 +3402,9 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, PostgreSQL has the ability to report the progress of - certain commands during command execution. Currently, the only command - which supports progress reporting is VACUUM. This may be - expanded in the future. + certain commands during command execution. Currently, the only commands + which support progress reporting are VACUUM and + CLUSTER. This may be expanded in the future. @@ -3408,9 +3416,11 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, one row for each backend (including autovacuum worker processes) that is currently vacuuming. The tables below describe the information that will be reported and provide information about how to interpret it. - Progress reporting is not currently supported for VACUUM FULL - and backends running VACUUM FULL will not be listed in this - view. + Progress for VACUUM FULL commands is reported via + pg_stat_progress_cluster + because both VACUUM FULL and CLUSTER + rewrite the table, while regular VACUUM only modifies it + in place. See . @@ -3588,6 +3598,183 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
+ + + CLUSTER Progress Reporting + + + Whenever CLUSTER or VACUUM FULL is + running, the pg_stat_progress_cluster view will + contain a row for each backend that is currently running either command. + The tables below describe the information that will be reported and + provide information about how to interpret it. + + + + <structname>pg_stat_progress_cluster</structname> View + + + + Column + Type + Description + + + + + + pid + integer + Process ID of backend. + + + datid + oid + OID of the database to which this backend is connected. + + + datname + name + Name of the database to which this backend is connected. + + + relid + oid + OID of the table being clustered. + + + command + text + + The command that is running. Either CLUSTER or VACUUM FULL. + + + + phase + text + + Current processing phase. See . + + + + cluster_index_relid + bigint + + If the table is being scanned using an index, this is the OID of the + index being used; otherwise, it is zero. + + + + heap_tuples_scanned + bigint + + Number of heap tuples scanned. + This counter only advances when the phase is + seq scanning heap, + index scanning heap + or writing new heap. + + + + heap_tuples_written + bigint + + Number of heap tuples written. + This counter only advances when the phase is + seq scanning heap, + index scanning heap + or writing new heap. + + + + heap_blks_total + bigint + + Total number of heap blocks in the table. This number is reported + as of the beginning of seq scanning heap. + + + + heap_blks_scanned + bigint + + Number of heap blocks scanned. This counter only advances when the + phase is seq scanning heap. + + + + index_rebuild_count + bigint + + Number of indexes rebuilt. This counter only advances when the phase + is rebuilding index. + + + + +
+ + + CLUSTER and VACUUM FULL phases + + + + Phase + Description + + + + + + initializing + + The command is preparing to begin scanning the heap. This phase is + expected to be very brief. + + + + seq scanning heap + + The command is currently scanning the table using a sequential scan. + + + + index scanning heap + + CLUSTER is currently scanning the table using an index scan. + + + + sorting tuples + + CLUSTER is currently sorting tuples. + + + + swapping relation files + + The command is currently swapping newly-built files into place. + + + + rebuilding index + + The command is currently rebuilding an index. + + + + performing final cleanup + + The command is performing final cleanup. When this phase is + completed, CLUSTER + or VACUUM FULL will end. + + + + +
+ +
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index cb2c001..d2e284f 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -52,6 +52,7 @@ #include "catalog/storage.h" #include "commands/tablecmds.h" #include "commands/event_trigger.h" +#include "commands/progress.h" #include "commands/trigger.h" #include "executor/executor.h" #include "miscadmin.h" @@ -59,6 +60,7 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "parser/parser.h" +#include "pgstat.h" #include "rewrite/rewriteManip.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" @@ -3846,6 +3848,7 @@ reindex_relation(Oid relid, int flags, int options) List *indexIds; bool is_pg_class; bool result; + int i; /* * Open and lock the relation. ShareLock is sufficient since we only need @@ -3933,6 +3936,7 @@ reindex_relation(Oid relid, int flags, int options) /* Reindex all the indexes. */ doneIndexes = NIL; + i = 1; foreach(indexId, indexIds) { Oid indexOid = lfirst_oid(indexId); @@ -3950,6 +3954,11 @@ reindex_relation(Oid relid, int flags, int options) if (is_pg_class) doneIndexes = lappend_oid(doneIndexes, indexOid); + + /* Set index rebuild count */ + pgstat_progress_update_param(PROGRESS_CLUSTER_INDEX_REBUILD_COUNT, + i); + i++; } } PG_CATCH(); diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index d962648..b89df70 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -907,6 +907,33 @@ CREATE VIEW pg_stat_progress_vacuum AS FROM pg_stat_get_progress_info('VACUUM') AS S LEFT JOIN pg_database D ON S.datid = D.oid; +CREATE VIEW pg_stat_progress_cluster AS + SELECT + S.pid AS pid, + S.datid AS datid, + D.datname AS datname, + S.relid AS relid, + CASE S.param1 WHEN 1 THEN 'CLUSTER' + WHEN 2 THEN 'VACUUM FULL' + END AS command, + CASE S.param2 WHEN 0 THEN 'initializing' + WHEN 1 THEN 'seq scanning heap' + WHEN 2 THEN 'index scanning heap' + WHEN 3 THEN 'sorting tuples' + WHEN 4 THEN 'writing new heap' + WHEN 5 THEN 'swapping relation files' + WHEN 6 THEN 'rebuilding index' + WHEN 7 THEN 'performing final cleanup' + END AS phase, + S.param3 AS cluster_index_relid, + S.param4 AS heap_tuples_scanned, + S.param5 AS heap_tuples_written, + S.param6 AS heap_blks_total, + S.param7 AS heap_blks_scanned, + S.param8 AS index_rebuild_count + FROM pg_stat_get_progress_info('CLUSTER') AS S + LEFT JOIN pg_database D ON S.datid = D.oid; + CREATE VIEW pg_user_mappings AS SELECT U.oid AS umid, diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 3e2a807..205070b 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -36,10 +36,12 @@ #include "catalog/objectaccess.h" #include "catalog/toasting.h" #include "commands/cluster.h" +#include "commands/progress.h" #include "commands/tablecmds.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "optimizer/optimizer.h" +#include "pgstat.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/predicate.h" @@ -276,6 +278,14 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) /* Check for user-requested abort. */ CHECK_FOR_INTERRUPTS(); + pgstat_progress_start_command(PROGRESS_COMMAND_CLUSTER, tableOid); + if (OidIsValid(indexOid)) + pgstat_progress_update_param(PROGRESS_CLUSTER_COMMAND, + PROGRESS_CLUSTER_COMMAND_CLUSTER); + else + pgstat_progress_update_param(PROGRESS_CLUSTER_COMMAND, + PROGRESS_CLUSTER_COMMAND_VACUUM_FULL); + /* * We grab exclusive access to the target rel and index for the duration * of the transaction. (This is redundant for the single-transaction @@ -286,7 +296,10 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) /* If the table has gone away, we can skip processing it */ if (!OldHeap) + { + pgstat_progress_end_command(); return; + } /* * Since we may open a new transaction for each relation, we have to check @@ -305,6 +318,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) if (!pg_class_ownercheck(tableOid, GetUserId())) { relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } @@ -319,6 +333,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) if (RELATION_IS_OTHER_TEMP(OldHeap)) { relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } @@ -330,6 +345,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(indexOid))) { relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } @@ -340,6 +356,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) if (!HeapTupleIsValid(tuple)) /* probably can't happen */ { relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } indexForm = (Form_pg_index) GETSTRUCT(tuple); @@ -347,6 +364,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) { ReleaseSysCache(tuple); relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } ReleaseSysCache(tuple); @@ -401,6 +419,7 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) !RelationIsPopulated(OldHeap)) { relation_close(OldHeap, AccessExclusiveLock); + pgstat_progress_end_command(); return; } @@ -416,6 +435,8 @@ cluster_rel(Oid tableOid, Oid indexOid, int options) rebuild_relation(OldHeap, indexOid, verbose); /* NB: rebuild_relation does table_close() on OldHeap */ + + pgstat_progress_end_command(); } /* @@ -928,6 +949,17 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, */ if (OldIndex != NULL && !use_sort) { + const int ci_index[] = { + PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_INDEX_RELID + }; + int64 ci_val[2]; + + /* Set phase and OIDOldIndex to columns */ + ci_val[0] = PROGRESS_CLUSTER_PHASE_INDEX_SCAN_HEAP; + ci_val[1] = OIDOldIndex; + pgstat_progress_update_multi_param(2, ci_index, ci_val); + tableScan = NULL; heapScan = NULL; indexScan = index_beginscan(OldHeap, OldIndex, SnapshotAny, 0, 0); @@ -935,9 +967,17 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, } else { + /* In scan-and-sort mode and also VACUUM FULL, set phase */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_SEQ_SCAN_HEAP); + tableScan = table_beginscan(OldHeap, SnapshotAny, 0, (ScanKey) NULL); heapScan = (HeapScanDesc) tableScan; indexScan = NULL; + + /* Set total heap blocks */ + pgstat_progress_update_param(PROGRESS_CLUSTER_TOTAL_HEAP_BLKS, + heapScan->rs_nblocks); } slot = table_slot_create(OldHeap, NULL); @@ -994,6 +1034,10 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, break; buf = heapScan->rs_cbuf; + + /* In scan-and-sort mode and also VACUUM FULL, set heap blocks scanned */ + pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_BLKS_SCANNED, + heapScan->rs_cblock + 1); } LockBuffer(buf, BUFFER_LOCK_SHARE); @@ -1064,12 +1108,31 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, num_tuples += 1; if (tuplesort != NULL) + { tuplesort_putheaptuple(tuplesort, tuple); + + /* In scan-and-sort mode, report increase in number of tuples scanned */ + pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_TUPLES_SCANNED, + num_tuples); + } else + { + const int ct_index[] = { + PROGRESS_CLUSTER_HEAP_TUPLES_SCANNED, + PROGRESS_CLUSTER_HEAP_TUPLES_WRITTEN + }; + int64 ct_val[2]; + reform_and_rewrite_tuple(tuple, oldTupDesc, newTupDesc, values, isnull, rwstate); + + /* In indexscan mode and also VACUUM FULL, report increase in number of tuples scanned and written */ + ct_val[0] = num_tuples; + ct_val[1] = num_tuples; + pgstat_progress_update_multi_param(2, ct_index, ct_val); + } } if (indexScan != NULL) @@ -1085,8 +1148,17 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, */ if (tuplesort != NULL) { + double n_tuples = 0; + /* Report that we are now sorting tuples */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_SORT_TUPLES); + tuplesort_performsort(tuplesort); + /* Report that we are now writing new heap */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_WRITE_NEW_HEAP); + for (;;) { HeapTuple tuple; @@ -1097,10 +1169,14 @@ copy_heap_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, if (tuple == NULL) break; + n_tuples += 1; reform_and_rewrite_tuple(tuple, oldTupDesc, newTupDesc, values, isnull, rwstate); + /* Report n_tuples */ + pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_TUPLES_WRITTEN, + n_tuples); } tuplesort_end(tuplesort); @@ -1539,6 +1615,10 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, int reindex_flags; int i; + /* Report that we are now swapping relation files */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_SWAP_REL_FILES); + /* Zero out possible results from swapped_relation_files */ memset(mapped_tables, 0, sizeof(mapped_tables)); @@ -1586,8 +1666,16 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, else if (newrelpersistence == RELPERSISTENCE_PERMANENT) reindex_flags |= REINDEX_REL_FORCE_INDEXES_PERMANENT; + /* Report that we are now reindexing relations */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_REBUILD_INDEX); + reindex_relation(OIDOldHeap, reindex_flags, 0); + /* Report that we are now doing clean up */ + pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, + PROGRESS_CLUSTER_PHASE_FINAL_CLEANUP); + /* * If the relation being rebuild is pg_class, swap_relation_files() * couldn't update pg_class's own pg_class entry (check comments in diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index da1d685..90a817a 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -468,6 +468,8 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) /* Translate command name into command type code. */ if (pg_strcasecmp(cmd, "VACUUM") == 0) cmdtype = PROGRESS_COMMAND_VACUUM; + else if (pg_strcasecmp(cmd, "CLUSTER") == 0) + cmdtype = PROGRESS_COMMAND_CLUSTER; else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/src/include/commands/progress.h b/src/include/commands/progress.h index 9858b36..04542d9 100644 --- a/src/include/commands/progress.h +++ b/src/include/commands/progress.h @@ -34,4 +34,27 @@ #define PROGRESS_VACUUM_PHASE_TRUNCATE 5 #define PROGRESS_VACUUM_PHASE_FINAL_CLEANUP 6 +/* Progress parameters for cluster */ +#define PROGRESS_CLUSTER_COMMAND 0 +#define PROGRESS_CLUSTER_PHASE 1 +#define PROGRESS_CLUSTER_INDEX_RELID 2 +#define PROGRESS_CLUSTER_HEAP_TUPLES_SCANNED 3 +#define PROGRESS_CLUSTER_HEAP_TUPLES_WRITTEN 4 +#define PROGRESS_CLUSTER_TOTAL_HEAP_BLKS 5 +#define PROGRESS_CLUSTER_HEAP_BLKS_SCANNED 6 +#define PROGRESS_CLUSTER_INDEX_REBUILD_COUNT 7 + +/* Phases of cluster (as dvertised via PROGRESS_CLUSTER_PHASE) */ +#define PROGRESS_CLUSTER_PHASE_SEQ_SCAN_HEAP 1 +#define PROGRESS_CLUSTER_PHASE_INDEX_SCAN_HEAP 2 +#define PROGRESS_CLUSTER_PHASE_SORT_TUPLES 3 +#define PROGRESS_CLUSTER_PHASE_WRITE_NEW_HEAP 4 +#define PROGRESS_CLUSTER_PHASE_SWAP_REL_FILES 5 +#define PROGRESS_CLUSTER_PHASE_REBUILD_INDEX 6 +#define PROGRESS_CLUSTER_PHASE_FINAL_CLEANUP 7 + +/* Commands of PROGRESS_CLUSTER */ +#define PROGRESS_CLUSTER_COMMAND_CLUSTER 1 +#define PROGRESS_CLUSTER_COMMAND_VACUUM_FULL 2 + #endif diff --git a/src/include/pgstat.h b/src/include/pgstat.h index ea6cc8b..c080fa6 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -950,7 +950,8 @@ typedef enum typedef enum ProgressCommandType { PROGRESS_COMMAND_INVALID, - PROGRESS_COMMAND_VACUUM + PROGRESS_COMMAND_VACUUM, + PROGRESS_COMMAND_CLUSTER } ProgressCommandType; #define PGSTAT_NUM_PROGRESS_PARAM 10 diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index f104dc4..49ca3be 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1830,6 +1830,34 @@ pg_stat_database_conflicts| SELECT d.oid AS datid, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock FROM pg_database d; +pg_stat_progress_cluster| SELECT s.pid, + s.datid, + d.datname, + s.relid, + CASE s.param1 + WHEN 1 THEN 'CLUSTER'::text + WHEN 2 THEN 'VACUUM FULL'::text + ELSE NULL::text + END AS command, + CASE s.param2 + WHEN 0 THEN 'initializing'::text + WHEN 1 THEN 'seq scanning heap'::text + WHEN 2 THEN 'index scanning heap'::text + WHEN 3 THEN 'sorting tuples'::text + WHEN 4 THEN 'writing new heap'::text + WHEN 5 THEN 'swapping relation files'::text + WHEN 6 THEN 'rebuilding index'::text + WHEN 7 THEN 'performing final cleanup'::text + ELSE NULL::text + END AS phase, + s.param3 AS cluster_index_relid, + s.param4 AS heap_tuples_scanned, + s.param5 AS heap_tuples_written, + s.param6 AS heap_blks_total, + s.param7 AS heap_blks_scanned, + s.param8 AS index_rebuild_count + FROM (pg_stat_get_progress_info('CLUSTER'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) + LEFT JOIN pg_database d ON ((s.datid = d.oid))); pg_stat_progress_vacuum| SELECT s.pid, s.datid, d.datname, --------------FF9CF1647AB8500C66BF8C84 Content-Type: text/plain; charset=UTF-8; name="test_result.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test_result.txt" W1ZpZXcgZGVmaW5pdGlvbl0NCiMgXGQgcGdfc3RhdF9wcm9ncmVzc19jbHVzdGVyDQogICAg ICAgICAgIFZpZXcgInBnX2NhdGFsb2cucGdfc3RhdF9wcm9ncmVzc19jbHVzdGVyIg0KICAg ICAgIENvbHVtbiAgICAgICAgfCAgVHlwZSAgIHwgQ29sbGF0aW9uIHwgTnVsbGFibGUgfCBE ZWZhdWx0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0t LS0tLS0tLS0rLS0tLS0tLS0tDQogcGlkICAgICAgICAgICAgICAgICB8IGludGVnZXIgfCAg ICAgICAgICAgfCAgICAgICAgICB8DQogZGF0aWQgICAgICAgICAgICAgICB8IG9pZCAgICAg fCAgICAgICAgICAgfCAgICAgICAgICB8DQogZGF0bmFtZSAgICAgICAgICAgICB8IG5hbWUg ICAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogcmVsaWQgICAgICAgICAgICAgICB8IG9p ZCAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogY29tbWFuZCAgICAgICAgICAgICB8 IHRleHQgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogcGhhc2UgICAgICAgICAgICAg ICB8IHRleHQgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogY2x1c3Rlcl9pbmRleF9y ZWxpZCB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogaGVhcF90dXBsZXNf c2Nhbm5lZCB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogaGVhcF90dXBs ZXNfd3JpdHRlbiB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogaGVhcF9i bGtzX3RvdGFsICAgICB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQogaGVh cF9ibGtzX3NjYW5uZWQgICB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8DQog aW5kZXhfcmVidWlsZF9jb3VudCB8IGJpZ2ludCAgfCAgICAgICAgICAgfCAgICAgICAgICB8 DQoNCg0KW1NlbGVjdCBjb21tYW5kIGZvciB0aGUgdmlld10NCiMgXGEgXHQNCk91dHB1dCBm b3JtYXQgaXMgdW5hbGlnbmVkLg0KVHVwbGVzIG9ubHkgaXMgb24uDQoNCiMgc2VsZWN0ICog ZnJvbSBwZ19zdGF0X3Byb2dyZXNzX2NsdXN0ZXI7IFx3YXRjaCAwLjA1DQoNCg0KW1Rlc3Rz XQ0KIyAtLSBpbmRleCBzY2FuDQojIHNldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7DQpTRVQN CiMgY2x1c3RlciB2ZXJib3NlIHQxIHVzaW5nIGlkeF90MTsNCklORk86ICBjbHVzdGVyaW5n ICJwdWJsaWMudDEiIHVzaW5nIGluZGV4IHNjYW4gb24gImlkeF90MSINCklORk86ICAidDEi OiBmb3VuZCAwIHJlbW92YWJsZSwgMTAwMDAwMCBub25yZW1vdmFibGUgcm93IHZlcnNpb25z IGluIDU0MDYgcGFnZXMNCkRFVEFJTDogIDAgZGVhZCByb3cgdmVyc2lvbnMgY2Fubm90IGJl IHJlbW92ZWQgeWV0Lg0KQ1BVOiB1c2VyOiAwLjUwIHMsIHN5c3RlbTogMC4wOSBzLCBlbGFw c2VkOiAxLjExIHMuDQpDTFVTVEVSDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYz ODd8OTAyM3w5MDIzfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8ODE2MTh8ODE2MTh8MHwwfDANCjE0MjI4fDEz NTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8aW5kZXggc2Nhbm5pbmcgaGVhcHwxNjM4N3wx Njk5NDB8MTY5OTQwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8MjcyMDUzfDI3MjA1M3wwfDB8MA0KMTQyMjh8 MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxpbmRleCBzY2FubmluZyBoZWFwfDE2Mzg3 fDM5MDY4M3wzOTA2ODN8MHwwfDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNU RVJ8aW5kZXggc2Nhbm5pbmcgaGVhcHwxNjM4N3w0MjA4NzV8NDIwODc1fDB8MHwwDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYz ODd8NDIxMDYwfDQyMTA2MHwwfDB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xV U1RFUnxpbmRleCBzY2FubmluZyBoZWFwfDE2Mzg3fDQyMTA2MHw0MjEwNjB8MHwwfDANCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8aW5kZXggc2Nhbm5pbmcgaGVhcHwx NjM4N3w0NTY4Mjl8NDU2ODI5fDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxD TFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8NTMyNDgyfDUzMjQ4MnwwfDB8MA0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxpbmRleCBzY2FubmluZyBoZWFw fDE2Mzg3fDYyNDQ3N3w2MjQ0Nzd8MHwwfDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fENMVVNURVJ8aW5kZXggc2Nhbm5pbmcgaGVhcHwxNjM4N3w3MzY4MDN8NzM2ODAzfDB8MHww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhl YXB8MTYzODd8NzgyNzM1fDc4MjczNXwwfDB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYz ODR8Q0xVU1RFUnxpbmRleCBzY2FubmluZyBoZWFwfDE2Mzg3fDc5NzcyMHw3OTc3MjB8MHww fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8aW5kZXggc2Nhbm5pbmcg aGVhcHwxNjM4N3w3OTc3MjB8Nzk3NzIwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wx NjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8ODM4ODAzfDgzODgwM3ww fDB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxpbmRleCBzY2Fubmlu ZyBoZWFwfDE2Mzg3fDkxOTgyMHw5MTk4MjB8MHwwfDANCjE0MjI4fDEzNTcwfHBvc3RncmVz fDE2Mzg0fENMVVNURVJ8aW5kZXggc2Nhbm5pbmcgaGVhcHwxNjM4N3w5NTk1OTV8OTU5NTk1 fDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5u aW5nIGhlYXB8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0 Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8MTAwMDAwMHwx MDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4 IHNjYW5uaW5nIGhlYXB8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3 MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfGluZGV4IHNjYW5uaW5nIGhlYXB8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAwMDAwMHwxMDAwMDAwfDB8MHwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MTYzODd8MTAw MDAwMHwxMDAwMDAwfDB8MHwxDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KIyAt LSBzZXEgc2Nhbg0KIyBzZXQgZW5hYmxlX3NlcXNjYW4gdG8gb247DQpTRVQNCiMgc2V0IGVu YWJsZV9pbmRleHNjYW4gdG8gb2ZmOw0KU0VUDQojIGNsdXN0ZXIgdmVyYm9zZSB0MSB1c2lu ZyBpZHhfdDE7DQpJTkZPOiAgY2x1c3RlcmluZyAicHVibGljLnQxIiB1c2luZyBzZXF1ZW50 aWFsIHNjYW4gYW5kIHNvcnQNCklORk86ICAidDEiOiBmb3VuZCAwIHJlbW92YWJsZSwgMTAw MDAwMCBub25yZW1vdmFibGUgcm93IHZlcnNpb25zIGluIDU0MDYgcGFnZXMNCkRFVEFJTDog IDAgZGVhZCByb3cgdmVyc2lvbnMgY2Fubm90IGJlIHJlbW92ZWQgeWV0Lg0KQ1BVOiB1c2Vy OiAwLjUxIHMsIHN5c3RlbTogMC4xOCBzLCBlbGFwc2VkOiAxLjIxIHMuDQpDTFVTVEVSDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxD TFVTVEVSfHNlcSBzY2FubmluZyBoZWFwfDB8NTEwMzd8MHw1NDA2fDI3NnwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHNlcSBzY2FubmluZyBoZWFwfDB8MjM4NzI0 fDB8NTQwNnwxMjkxfDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8c2Vx IHNjYW5uaW5nIGhlYXB8MHw0MTc5NTB8MHw1NDA2fDIyNjB8MA0KMTQyMjh8MTM1NzB8cG9z dGdyZXN8MTYzODR8Q0xVU1RFUnxzZXEgc2Nhbm5pbmcgaGVhcHwwfDU5OTE4NXwwfDU0MDZ8 MzIzOXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHNlcSBzY2Fubmlu ZyBoZWFwfDB8NjAwNTQ4fDB8NTQwNnwzMjQ3fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fENMVVNURVJ8c2VxIHNjYW5uaW5nIGhlYXB8MHw5NTQ1Mjl8MHw1NDA2fDUxNjB8MA0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxzb3J0aW5nIHR1cGxlc3wwfDEw MDAwMDB8MHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RF Unx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHwxODkwNTB8NTQwNnw1NDA2fDANCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAw MDB8Mzg3MDIwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVT VEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDM4NzIwNXw1NDA2fDU0MDZ8MA0KMTQy Mjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAw MDAwMHwzODcyMDV8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENM VVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8Mzg3MzkwfDU0MDZ8NTQwNnwwDQox NDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwx MDAwMDAwfDUwODgzMXw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8 Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHw2NDgwODN8NTQwNnw1NDA2fDAN CjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHww fDEwMDAwMDB8NzYzNjgwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4 NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDc2Mzg2NXw1NDA2fDU0MDZ8 MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFw fDB8MTAwMDAwMHw3NjM4NjV8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8NzY4MTIwfDU0MDZ8NTQw NnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhl YXB8MHwxMDAwMDAwfDg5MjYwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8 MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8 NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3 IGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8MTAwMDAwMHw1 NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5n IG5ldyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxw b3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDEwMDAw MDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVi dWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1 NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwx MDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAw MDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xV U1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQox NDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwx MDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8 MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4 fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wx NjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1 NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBp bmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdy ZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0 MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRp bmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBv c3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAw MHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1 aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3 MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEw MDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8 cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8 MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAw MHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVT VEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEw MDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8 Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwx DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8 MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0 MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGlu ZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQw Nnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGlu ZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KDQoNCiMgLS0gb25seSBnaXZlbiB0YWJsZSBuYW1lIHRvIGNsdXN0ZXIg Y29tbWFuZA0KIyBjbHVzdGVyIHZlcmJvc2UgdDE7DQpJTkZPOiAgY2x1c3RlcmluZyAicHVi bGljLnQxIiB1c2luZyBzZXF1ZW50aWFsIHNjYW4gYW5kIHNvcnQNCklORk86ICAidDEiOiBm b3VuZCAwIHJlbW92YWJsZSwgMTAwMDAwMCBub25yZW1vdmFibGUgcm93IHZlcnNpb25zIGlu IDU0MDYgcGFnZXMNCkRFVEFJTDogIDAgZGVhZCByb3cgdmVyc2lvbnMgY2Fubm90IGJlIHJl bW92ZWQgeWV0Lg0KQ1BVOiB1c2VyOiAwLjUyIHMsIHN5c3RlbTogMC4xMyBzLCBlbGFwc2Vk OiAxLjE4IHMuDQpDTFVTVEVSDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHNlcSBzY2FubmluZyBoZWFwfDB8NzMwNTd8 MHw1NDA2fDM5NXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHNlcSBz Y2FubmluZyBoZWFwfDB8MjczMTkwfDB8NTQwNnwxNDc3fDANCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fENMVVNURVJ8c2VxIHNjYW5uaW5nIGhlYXB8MHw1MDk3NzB8MHw1NDA2fDI3 NTZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxzZXEgc2Nhbm5pbmcg aGVhcHwwfDU5OTE4NXwwfDU0MDZ8MzIzOXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4 NHxDTFVTVEVSfHNlcSBzY2FubmluZyBoZWFwfDB8NzA3MjYwfDB8NTQwNnwzODI0fDANCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8c29ydGluZyB0dXBsZXN8MHwxMDAw MDAwfDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8 d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8NDY3NDR8NTQwNnw1NDA2fDANCjE0MjI4fDEz NTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8 MjgyMjYyfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDM1MzE2NXw1NDA2fDU0MDZ8MA0KMTQyMjh8 MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAw MHwzNTMzNTB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNU RVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8MzUzMzUwfDU0MDZ8NTQwNnwwDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAw MDAwfDQyODc2MXw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xV U1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHw1NzExMTR8NTQwNnw1NDA2fDANCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEw MDAwMDB8NzI5ODI1fDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxD TFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDcyOTgyNXw1NDA2fDU0MDZ8MA0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8 MTAwMDAwMHw3MzAwMTB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8NzMwMTk1fDU0MDZ8NTQwNnww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8 MHwxMDAwMDAwfDgzMjMxMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYz ODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHw5ODU1NzZ8NTQwNnw1NDA2 fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVh cHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8 MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8 NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3 IGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8MTAwMDAwMHw1 NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxk aW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxw b3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAw MDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVi dWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1 NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwx MDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVS fHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAw MDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xV U1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQox NDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwx MDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8 MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4 fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wx NjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1 NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBp bmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdy ZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0 MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRp bmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBv c3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAw MHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1 aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3 MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEw MDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8 cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8 MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAw MHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVT VEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEw MDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8 Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwx DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8 MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0 MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGlu ZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQw Nnw1NDA2fDENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQojIC0tIG9ubHkgY2x1 c3RlciBjb21tYW5kDQojIGNsdXN0ZXIgdmVyYm9zZTsNCklORk86ICBjbHVzdGVyaW5nICJw dWJsaWMudDEiIHVzaW5nIHNlcXVlbnRpYWwgc2NhbiBhbmQgc29ydA0KSU5GTzogICJ0MSI6 IGZvdW5kIDAgcmVtb3ZhYmxlLCAxMDAwMDAwIG5vbnJlbW92YWJsZSByb3cgdmVyc2lvbnMg aW4gNTQwNiBwYWdlcw0KREVUQUlMOiAgMCBkZWFkIHJvdyB2ZXJzaW9ucyBjYW5ub3QgYmUg cmVtb3ZlZCB5ZXQuDQpDUFU6IHVzZXI6IDAuNTYgcywgc3lzdGVtOiAwLjE1IHMsIGVsYXBz ZWQ6IDEuMjMgcy4NCkNMVVNURVINCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8c2VxIHNjYW5uaW5nIGhlYXB8MHw3NDc2 M3wwfDU0MDZ8NDA1fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8c2Vx IHNjYW5uaW5nIGhlYXB8MHwyODEzNTF8MHw1NDA2fDE1MjF8MA0KMTQyMjh8MTM1NzB8cG9z dGdyZXN8MTYzODR8Q0xVU1RFUnxzZXEgc2Nhbm5pbmcgaGVhcHwwfDUyNDI4N3wwfDU0MDZ8 MjgzNHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHNlcSBzY2Fubmlu ZyBoZWFwfDB8NTk5MTg1fDB8NTQwNnwzMjM5fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fENMVVNURVJ8c2VxIHNjYW5uaW5nIGhlYXB8MHw3NjMxMzJ8MHw1NDA2fDQxMjZ8MA0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxzb3J0aW5nIHR1cGxlc3wwfDEw MDAwMDB8MHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RF Unx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHw2NjM1Nnw1NDA2fDU0MDZ8MA0KMTQyMjh8 MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAw MHwyOTQxNTB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNU RVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8MzE5NDk1fDU0MDZ8NTQwNnwwDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAw MDAwfDMxOTQ5NXw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xV U1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHwzNTc2MDV8NTQwNnw1NDA2fDANCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEw MDAwMDB8NDgzODQxfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxD TFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDU0MDU3MHw1NDA2fDU0MDZ8MA0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8 MTAwMDAwMHw1OTU3MDN8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fENMVVNURVJ8d3JpdGluZyBuZXcgaGVhcHwwfDEwMDAwMDB8Njk1OTcwfDU0MDZ8NTQwNnww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8 MHwxMDAwMDAwfDY5NjE1NXw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYz ODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHw2OTYxNTV8NTQwNnw1NDA2 fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBuZXcgaGVh cHwwfDEwMDAwMDB8NzYwMDY1fDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wx NjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDg4ODc4M3w1NDA2fDU0 MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBo ZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxNjM4NHxDTFVTVEVSfHdyaXRpbmcgbmV3IGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8NTQw Nnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8d3JpdGluZyBu ZXcgaGVhcHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9z dGdyZXN8MTYzODR8Q0xVU1RFUnx3cml0aW5nIG5ldyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAw fDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHdyaXRp bmcgbmV3IGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcw fHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAw MDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxy ZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAw fDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNU RVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQy Mjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAw MDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxD TFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDAN CjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHww fDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYz ODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQw NnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5k ZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVz fDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2 fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5n IGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0 Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8 NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWls ZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8 cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAw MDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJl YnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEz NTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8 MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RF UnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAw MDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENM VVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0K MTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8 MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4 NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2 fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRl eHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8 MTYzODR8Q0xVU1RFUnxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8 NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcg aW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fENMVVNURVJ8cmVidWlsZGluZyBpbmRleHwwfDEwMDAwMDB8MTAwMDAwMHw1 NDA2fDU0MDZ8MQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8Q0xVU1RFUnxyZWJ1aWxk aW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxw b3N0Z3Jlc3wxNjM4NHxDTFVTVEVSfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAw MDB8NTQwNnw1NDA2fDENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQojIC0tIHZh Y3V1bSBmdWxsDQojIHZhY3V1bSBmdWxsIHZlcmJvc2UgdDE7DQpJTkZPOiAgdmFjdXVtaW5n ICJwdWJsaWMudDEiDQpJTkZPOiAgInQxIjogZm91bmQgMCByZW1vdmFibGUsIDEwMDAwMDAg bm9ucmVtb3ZhYmxlIHJvdyB2ZXJzaW9ucyBpbiA1NDA2IHBhZ2VzDQpERVRBSUw6ICAwIGRl YWQgcm93IHZlcnNpb25zIGNhbm5vdCBiZSByZW1vdmVkIHlldC4NCkNQVTogdXNlcjogMC4z MyBzLCBzeXN0ZW06IDAuMDcgcywgZWxhcHNlZDogMC43OCBzLg0KVkFDVVVNDQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0g RlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDI0NTY1fDI0NTY1fDU0MDZ8MTMzfDANCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8 MTM0NzYwfDEzNDc2MHw1NDA2fDcyOXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxW QUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDI1MDg2MHwyNTA4NjB8NTQwNnwxMzU3 fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2Fubmlu ZyBoZWFwfDB8Mjk5OTA5fDI5OTkwOXw1NDA2fDE2MjJ8MA0KMTQyMjh8MTM1NzB8cG9zdGdy ZXN8MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHwzNzU3MzV8Mzc1NzM1 fDU0MDZ8MjAzMnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxz ZXEgc2Nhbm5pbmcgaGVhcHwwfDQyMTA0Mnw0MjEwNDJ8NTQwNnwyMjc2fDANCjE0MjI4fDEz NTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8NTM4 MTcyfDUzODE3Mnw1NDA2fDI5MTB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8VkFD VVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHw2Mjc1MjB8NjI3NTIwfDU0MDZ8MzM5M3ww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcg aGVhcHwwfDY4ODM3Nnw2ODgzNzZ8NTQwNnwzNzIxfDANCjE0MjI4fDEzNTcwfHBvc3RncmVz fDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8NzQyMDM1fDc0MjAzNXw1 NDA2fDQwMTJ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8VkFDVVVNIEZVTEx8c2Vx IHNjYW5uaW5nIGhlYXB8MHw4MTkxODF8ODE5MTgxfDU0MDZ8NDQyOXwwDQoxNDIyOHwxMzU3 MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDkzOTE3 MHw5MzkxNzB8NTQwNnw1MDc3fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VV TSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcg aGVhcHwwfDEwMDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdy ZXN8MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHwxMDAwMDAwfDEwMDAw MDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxM fHNlcSBzY2FubmluZyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8 MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4 NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8 NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxk aW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxw b3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwx MDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0g RlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQox NDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4 fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wx NjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0 MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1 aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3 MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAw MHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNV VU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwx DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGlu ZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAw fDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxy ZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAw MDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxW QUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQw NnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5n IGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0 Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAw MDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVM THxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8 MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4 NHxWQUNVVU0gRlVMTHxyZWJ1aWxkaW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8 NTQwNnwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxyZWJ1aWxk aW5nIGluZGV4fDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwxDQoNCg0KIyAtLSB2YWN1 dW0gZnVsbA0KIyB2YWN1dW0gZnVsbDsNClZBQ1VVTQ0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5u aW5nIGhlYXB8MHwxMDIxMDd8MTAyMTA3fDU0MDZ8NTUyfDANCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8MjMxNDM1fDIzMTQz NXw1NDA2fDEyNTJ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8VkFDVVVNIEZVTEx8 c2VxIHNjYW5uaW5nIGhlYXB8MHwyODg5NTd8Mjg4OTU3fDU0MDZ8MTU2MnwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDQ0 NjU0Nnw0NDY1NDZ8NTQwNnwyNDE0fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZB Q1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8NDQ5NTUwfDQ0OTU1MHw1NDA2fDI0MzF8 MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5n IGhlYXB8MHw1NzMyODR8NTczMjg0fDU0MDZ8MzA5OXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDY1MDMwOXw2NTAzMDl8 NTQwNnwzNTE2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNl cSBzY2FubmluZyBoZWFwfDB8NzU1MzU2fDc1NTM1Nnw1NDA2fDQwODR8MA0KMTQyMjh8MTM1 NzB8cG9zdGdyZXN8MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHw4ODgw MDB8ODg4MDAwfDU0MDZ8NDgwMXwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNV VU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDg5MzU1MHw4OTM1NTB8NTQwNnw0ODMxfDAN CjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBo ZWFwfDB8OTgwMzcxfDk4MDM3MXw1NDA2fDUzMDB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8 MTYzODR8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8 NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHNl cSBzY2FubmluZyBoZWFwfDB8MTAwMDAwMHwxMDAwMDAwfDU0MDZ8NTQwNnwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3wxNjM4NHxWQUNVVU0gRlVMTHxzZXEgc2Nhbm5pbmcgaGVhcHwwfDEw MDAwMDB8MTAwMDAwMHw1NDA2fDU0MDZ8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MTYzODR8 VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1 NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRp bmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBv c3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEw MDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBG VUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8 MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2 Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQw Nnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVp bGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcw fHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAw fDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VV TSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDAN CjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5k ZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDANCjE0MjI4fDEzNTcwfHBvc3RncmVz fDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8 NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJl YnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEz NTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAw MDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZB Q1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2 fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcg aW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3Rn cmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAw MDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxM fHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4 fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwx MDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0 fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1 NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRp bmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBv c3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEw MDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBG VUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0 MjI4fDEzNTcwfHBvc3RncmVzfDE2Mzg0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8 MHwxMDAwMDAwfDEwMDAwMDB8NTQwNnw1NDA2fDENCjE0MjI4fDEzNTcwfHBvc3RncmVzfDI2 MTN8VkFDVVVNIEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHwwfDB8MHwwfDANCjE0MjI4fDEz NTcwfHBvc3RncmVzfDEyNTV8VkFDVVVNIEZVTEx8aW5pdGlhbGl6aW5nfDB8MHwwfDB8MHww DQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wyNjA0fFZBQ1VVTSBGVUxMfGluaXRpYWxpemluZ3ww fDB8MHwwfDB8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MjYxN3xWQUNVVU0gRlVMTHxpbml0 aWFsaXppbmd8MHwwfDB8MHwwfDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDI2MDJ8VkFDVVVN IEZVTEx8c2VxIHNjYW5uaW5nIGhlYXB8MHw3MTF8NzExfDZ8NnwwDQoxNDIyOHwxMzU3MHxw b3N0Z3Jlc3wyNjAwfFZBQ1VVTSBGVUxMfGluaXRpYWxpemluZ3wwfDB8MHwwfDB8MA0KMTQy Mjh8MTM1NzB8cG9zdGdyZXN8MjYxOHxWQUNVVU0gRlVMTHxwZXJmb3JtaW5nIGZpbmFsIGNs ZWFudXB8MHwxMjJ8MTIyfDEyfDEyfDINCjE0MjI4fDEzNTcwfHBvc3RncmVzfDI5NjR8VkFD VVVNIEZVTEx8aW5pdGlhbGl6aW5nfDB8MHwwfDB8MHwwDQoxNDIyOHwxMzU3MHxwb3N0Z3Jl c3wxMjYxfFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8M3wzfDF8MXwwDQoxNDIy OHwxMzU3MHxwb3N0Z3Jlc3wzNjAzfFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8 NDE4fDQxOHwzfDN8MA0KMTQyMjh8MTM1NzB8cG9zdGdyZXN8MzA3OXxWQUNVVU0gRlVMTHxy ZWJ1aWxkaW5nIGluZGV4fDB8MXwxfDF8MXwxDQoxNDIyOHwxMzU3MHxwb3N0Z3Jlc3wzNDU2 fFZBQ1VVTSBGVUxMfHNlcSBzY2FubmluZyBoZWFwfDB8OTZ8OTZ8Mjl8NHwwDQoxNDIyOHwx MzU3MHxwb3N0Z3Jlc3w2MTA0fFZBQ1VVTSBGVUxMfHJlYnVpbGRpbmcgaW5kZXh8MHwwfDB8 MHwwfDANCjE0MjI4fDEzNTcwfHBvc3RncmVzfDEzNDE1fFZBQ1VVTSBGVUxMfGluaXRpYWxp emluZ3wwfDB8MHwwfDB8MA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K --------------FF9CF1647AB8500C66BF8C84--