ZksyncMiddleware for Provider {
.filter(|log| {
log.topics[0] == BridgeBurnFilter::signature()
|| log.topics[0] == WithdrawalFilter::signature()
- || log.topics[0] == WithdrawalInitiatedFilter::signature()
})
.nth(index)
.ok_or(Error::WithdrawalLogNotFound(index, withdrawal_hash))?;
@@ -349,13 +347,6 @@ impl ZksyncMiddleware for Provider {
let withdrawal_event = WithdrawalEvents::decode_log(&raw_log)?;
let l2_to_l1_message_hash = match withdrawal_event {
- WithdrawalEvents::WithdrawalInitiated(w) => {
- let addr_lock = TOKEN_ADDRS.lock().await;
- let l_1_token = addr_lock
- .get(&w.l_2_token)
- .ok_or(Error::L2TokenUnknown(w.l_2_token))?;
- get_l1_bridge_burn_message_keccak(w.amount, w.l_1_receiver, *l_1_token)?
- }
WithdrawalEvents::BridgeBurn(b) => {
let mut addr_lock = TOKEN_ADDRS.lock().await;
From a4e91dd1fe20639314f9441185da6cb8ec0d598f Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Tue, 16 Jan 2024 19:09:28 +0100
Subject: [PATCH 019/128] fix(finalizer): introduce an optional threshold to
eth withdrawals (#348)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
README.md | 1 +
bin/withdrawal-finalizer/src/config.rs | 3 ++
bin/withdrawal-finalizer/src/main.rs | 7 +++++
finalizer/src/lib.rs | 13 +++++++--
...9d0503e6498288f4f40911dd1b2decb4a327.json} | 7 +++--
...a785f5128591f617d214d5929152d3469800.json} | 7 +++--
...f1622e1f15489530ccf7fd8a93088f4b6bf7.json} | 7 +++--
storage/src/lib.rs | 29 ++++++++++++++++++-
8 files changed, 62 insertions(+), 12 deletions(-)
rename storage/.sqlx/{query-c16ff516b3b4c276e35d802175f6b8c3a33826b9d8c3425153b3c254198d7af8.json => query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json} (84%)
rename storage/.sqlx/{query-1429bfeafe86ef0ce1449e07709bcce578fe6c917592a00654294c881dcc609a.json => query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json} (84%)
rename storage/.sqlx/{query-0296c80dfb2f21e40580333a071f07e0c0b25eb548cc83f9386c810847a3aa65.json => query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json} (84%)
diff --git a/README.md b/README.md
index 250467d..3b25028 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ Deployment is done by deploying a dockerized image of the service.
| `CUSTOM_TOKEN_DEPLOYER_ADDRESSES` | (Optional) Normally ERC20 tokens are deployed by the bridge contract. However, in custom cases it may be necessary to override that behavior with a custom set of addresses that have deployed tokens |
| `CUSTOM_TOKEN_ADDRESSES` | (Optional) Adds a predefined list of tokens to finalize. May be useful in case of custom bridge setups when the regular technique of finding token deployments does not work. |
| `ENABLE_WITHDRAWAL_METERING` | (Optional, default: `"true"`) By default Finalizer collects metrics about withdrawn token volumens. Users may optionally switch off this metering. |
+| `ETH_FINALIZATION_THRESHOLD`| (Optional, default: "0") Finalizer will only finalize ETH withdrawals that are greater or equal to this value |
The configuration structure describing the service config can be found in [`config.rs`](https://github.com/matter-labs/zksync-withdrawal-finalizer/blob/main/bin/withdrawal-finalizer/src/config.rs)
diff --git a/bin/withdrawal-finalizer/src/config.rs b/bin/withdrawal-finalizer/src/config.rs
index 01e64bf..5b7912c 100644
--- a/bin/withdrawal-finalizer/src/config.rs
+++ b/bin/withdrawal-finalizer/src/config.rs
@@ -83,6 +83,9 @@ pub struct Config {
#[envconfig(from = "CUSTOM_TOKEN_ADDRESS_MAPPINGS")]
pub custom_token_address_mappings: Option,
+
+ #[envconfig(from = "ETH_FINALIZATION_THRESHOLD")]
+ pub eth_finalization_threshold: Option,
}
#[derive(Deserialize, Serialize, Debug, Eq, PartialEq)]
diff --git a/bin/withdrawal-finalizer/src/main.rs b/bin/withdrawal-finalizer/src/main.rs
index facc008..b544c9e 100644
--- a/bin/withdrawal-finalizer/src/main.rs
+++ b/bin/withdrawal-finalizer/src/main.rs
@@ -283,6 +283,12 @@ async fn main() -> Result<()> {
config.batch_finalization_gas_limit,
);
+ let eth_finalization_threshold = match config.eth_finalization_threshold {
+ Some(eth_finalization_threshold) => {
+ Some(ethers::utils::parse_ether(eth_finalization_threshold)?)
+ }
+ None => None,
+ };
let finalizer = finalizer::Finalizer::new(
pgpool,
one_withdrawal_gas_limit,
@@ -294,6 +300,7 @@ async fn main() -> Result<()> {
finalizer_account_address,
config.tokens_to_finalize.unwrap_or_default(),
meter_withdrawals,
+ eth_finalization_threshold,
);
let finalizer_handle = tokio::spawn(finalizer.run(client_l2));
diff --git a/finalizer/src/lib.rs b/finalizer/src/lib.rs
index edff557..f339cf9 100644
--- a/finalizer/src/lib.rs
+++ b/finalizer/src/lib.rs
@@ -103,6 +103,7 @@ pub struct Finalizer {
account_address: Address,
withdrawals_meterer: Option,
token_list: TokenList,
+ eth_threshold: Option,
}
const NO_NEW_WITHDRAWALS_BACKOFF: Duration = Duration::from_secs(5);
@@ -132,6 +133,7 @@ where
account_address: Address,
token_list: TokenList,
meter_withdrawals: bool,
+ eth_threshold: Option,
) -> Self {
let withdrawals_meterer = meter_withdrawals.then_some(WithdrawalsMeter::new(
pgpool.clone(),
@@ -157,6 +159,7 @@ where
account_address,
withdrawals_meterer,
token_list,
+ eth_threshold,
}
}
@@ -351,14 +354,19 @@ where
let try_finalize_these = match &self.token_list {
TokenList::All => {
- storage::withdrawals_to_finalize(&self.pgpool, self.query_db_pagination_limit)
- .await?
+ storage::withdrawals_to_finalize(
+ &self.pgpool,
+ self.query_db_pagination_limit,
+ self.eth_threshold,
+ )
+ .await?
}
TokenList::WhiteList(w) => {
storage::withdrawals_to_finalize_with_whitelist(
&self.pgpool,
self.query_db_pagination_limit,
w,
+ self.eth_threshold,
)
.await?
}
@@ -367,6 +375,7 @@ where
&self.pgpool,
self.query_db_pagination_limit,
b,
+ self.eth_threshold,
)
.await?
}
diff --git a/storage/.sqlx/query-c16ff516b3b4c276e35d802175f6b8c3a33826b9d8c3425153b3c254198d7af8.json b/storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json
similarity index 84%
rename from storage/.sqlx/query-c16ff516b3b4c276e35d802175f6b8c3a33826b9d8c3425153b3c254198d7af8.json
rename to storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json
index 8587e13..e1f56a3 100644
--- a/storage/.sqlx/query-c16ff516b3b4c276e35d802175f6b8c3a33826b9d8c3425153b3c254198d7af8.json
+++ b/storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -57,7 +57,8 @@
"parameters": {
"Left": [
"Int8",
- "ByteaArray"
+ "ByteaArray",
+ "Numeric"
]
},
"nullable": [
@@ -73,5 +74,5 @@
false
]
},
- "hash": "c16ff516b3b4c276e35d802175f6b8c3a33826b9d8c3425153b3c254198d7af8"
+ "hash": "70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327"
}
diff --git a/storage/.sqlx/query-1429bfeafe86ef0ce1449e07709bcce578fe6c917592a00654294c881dcc609a.json b/storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json
similarity index 84%
rename from storage/.sqlx/query-1429bfeafe86ef0ce1449e07709bcce578fe6c917592a00654294c881dcc609a.json
rename to storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json
index a5835dd..adb68a8 100644
--- a/storage/.sqlx/query-1429bfeafe86ef0ce1449e07709bcce578fe6c917592a00654294c881dcc609a.json
+++ b/storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND (\n last_finalization_attempt IS NULL\n OR\n last_finalization_attempt < NOW() - INTERVAL '1 minutes'\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND (\n last_finalization_attempt IS NULL\n OR\n last_finalization_attempt < NOW() - INTERVAL '1 minutes'\n )\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $2\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -56,7 +56,8 @@
],
"parameters": {
"Left": [
- "Int8"
+ "Int8",
+ "Numeric"
]
},
"nullable": [
@@ -72,5 +73,5 @@
false
]
},
- "hash": "1429bfeafe86ef0ce1449e07709bcce578fe6c917592a00654294c881dcc609a"
+ "hash": "e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800"
}
diff --git a/storage/.sqlx/query-0296c80dfb2f21e40580333a071f07e0c0b25eb548cc83f9386c810847a3aa65.json b/storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json
similarity index 84%
rename from storage/.sqlx/query-0296c80dfb2f21e40580333a071f07e0c0b25eb548cc83f9386c810847a3aa65.json
rename to storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json
index bf3dce8..3e2e10b 100644
--- a/storage/.sqlx/query-0296c80dfb2f21e40580333a071f07e0c0b25eb548cc83f9386c810847a3aa65.json
+++ b/storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token NOT IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token NOT IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -57,7 +57,8 @@
"parameters": {
"Left": [
"Int8",
- "ByteaArray"
+ "ByteaArray",
+ "Numeric"
]
},
"nullable": [
@@ -73,5 +74,5 @@
false
]
},
- "hash": "0296c80dfb2f21e40580333a071f07e0c0b25eb548cc83f9386c810847a3aa65"
+ "hash": "f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7"
}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index 0310903..afc7f56 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -5,7 +5,7 @@
//! Finalizer watcher.storage.operations.
-use ethers::types::{Address, H160, H256};
+use ethers::types::{Address, H160, H256, U256};
use sqlx::{PgConnection, PgPool};
use chain_events::L2TokenInitEvent;
@@ -746,8 +746,11 @@ pub async fn withdrawals_to_finalize_with_blacklist(
pool: &PgPool,
limit_by: u64,
token_blacklist: &[Address],
+ eth_threshold: Option,
) -> Result> {
let blacklist: Vec<_> = token_blacklist.iter().map(|a| a.0.to_vec()).collect();
+ // if no threshold, query _all_ ethereum withdrawals since all of them are >= 0.
+ let eth_threshold = eth_threshold.unwrap_or(U256::zero());
let data = sqlx::query!(
"
@@ -782,6 +785,11 @@ pub async fn withdrawals_to_finalize_with_blacklist(
AND w.token NOT IN (SELECT * FROM UNNEST (
$2 :: BYTEA []
))
+ AND (
+ CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3
+ ELSE TRUE
+ END
+ )
ORDER BY
finalization_data.l2_block_number
LIMIT
@@ -789,6 +797,7 @@ pub async fn withdrawals_to_finalize_with_blacklist(
",
limit_by as i64,
&blacklist,
+ u256_to_big_decimal(eth_threshold),
)
.fetch_all(pool)
.await?
@@ -816,8 +825,11 @@ pub async fn withdrawals_to_finalize_with_whitelist(
pool: &PgPool,
limit_by: u64,
token_whitelist: &[Address],
+ eth_threshold: Option,
) -> Result> {
let whitelist: Vec<_> = token_whitelist.iter().map(|a| a.0.to_vec()).collect();
+ // if no threshold, query _all_ ethereum withdrawals since all of them are >= 0.
+ let eth_threshold = eth_threshold.unwrap_or(U256::zero());
let data = sqlx::query!(
"
@@ -852,6 +864,11 @@ pub async fn withdrawals_to_finalize_with_whitelist(
AND w.token IN (SELECT * FROM UNNEST (
$2 :: BYTEA []
))
+ AND (
+ CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3
+ ELSE TRUE
+ END
+ )
ORDER BY
finalization_data.l2_block_number
LIMIT
@@ -859,6 +876,7 @@ pub async fn withdrawals_to_finalize_with_whitelist(
",
limit_by as i64,
&whitelist,
+ u256_to_big_decimal(eth_threshold),
)
.fetch_all(pool)
.await?
@@ -885,8 +903,11 @@ pub async fn withdrawals_to_finalize_with_whitelist(
pub async fn withdrawals_to_finalize(
pool: &PgPool,
limit_by: u64,
+ eth_threshold: Option,
) -> Result> {
let latency = STORAGE_METRICS.call[&"withdrawals_to_finalize"].start();
+ // if no threshold, query _all_ ethereum withdrawals since all of them are >= 0.
+ let eth_threshold = eth_threshold.unwrap_or(U256::zero());
let data = sqlx::query!(
"
@@ -923,12 +944,18 @@ pub async fn withdrawals_to_finalize(
OR
last_finalization_attempt < NOW() - INTERVAL '1 minutes'
)
+ AND (
+ CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $2
+ ELSE TRUE
+ END
+ )
ORDER BY
finalization_data.l2_block_number
LIMIT
$1
",
limit_by as i64,
+ u256_to_big_decimal(eth_threshold),
)
.fetch_all(pool)
.await?
From 05739f55bf24149de1550cf2e9893b2a773343fd Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Tue, 16 Jan 2024 19:17:06 +0100
Subject: [PATCH 020/128] chore(main): release 0.4.0 (#316)
:robot: I have created a release *beep* *boop*
---
##
[0.4.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.3.4...v0.4.0)
(2024-01-16)
### Features
* **contracts:** Add the WithdrawalFinalizer Contract
([#314](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/314))
([aa71fcb](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/aa71fcb7cdac8c2dcc557a53431738b7be847da8))
### Bug Fixes
* **chain-events:** do not listen to withdrawalinitiated events
([#347](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/347))
([08e6971](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/08e6971fb31c72fd55441b781ef185afd52953b3))
* **deps:** update dependency @matterlabs/zksync-contracts to ^0.6.0
([#317](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/317))
([6067bc1](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/6067bc11751b7cdede63a38053b897df9a095d61))
* **deps:** update dependency ethers to v6
([#329](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/329))
([a3ca0bd](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a3ca0bde3bb8ad1d69c6ff8ecde724b09b68e6ff))
* **deps:** update dependency zksync-web3 to ^0.17.0
([#318](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/318))
([2cb7d58](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/2cb7d5820b267c7ba4068deccdfb8ed72019f121))
* **finalizer:** introduce an optional threshold to eth withdrawals
([#348](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/348))
([a4e91dd](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a4e91dd1fe20639314f9441185da6cb8ec0d598f))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index 18cac80..2537c1f 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.3.4"
+ ".": "0.4.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 899da6b..00b790b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,21 @@
# Changelog
+## [0.4.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.3.4...v0.4.0) (2024-01-16)
+
+
+### Features
+
+* **contracts:** Add the WithdrawalFinalizer Contract ([#314](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/314)) ([aa71fcb](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/aa71fcb7cdac8c2dcc557a53431738b7be847da8))
+
+
+### Bug Fixes
+
+* **chain-events:** do not listen to withdrawalinitiated events ([#347](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/347)) ([08e6971](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/08e6971fb31c72fd55441b781ef185afd52953b3))
+* **deps:** update dependency @matterlabs/zksync-contracts to ^0.6.0 ([#317](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/317)) ([6067bc1](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/6067bc11751b7cdede63a38053b897df9a095d61))
+* **deps:** update dependency ethers to v6 ([#329](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/329)) ([a3ca0bd](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a3ca0bde3bb8ad1d69c6ff8ecde724b09b68e6ff))
+* **deps:** update dependency zksync-web3 to ^0.17.0 ([#318](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/318)) ([2cb7d58](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/2cb7d5820b267c7ba4068deccdfb8ed72019f121))
+* **finalizer:** introduce an optional threshold to eth withdrawals ([#348](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/348)) ([a4e91dd](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a4e91dd1fe20639314f9441185da6cb8ec0d598f))
+
## [0.3.4](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.3.3...v0.3.4) (2023-11-14)
From 0fbddd49d17945778574ef8ab27522753f85ae7f Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Wed, 17 Jan 2024 11:40:49 +0100
Subject: [PATCH 021/128] fix(storage): remove order by to optimize query
(#349)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
...29f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e.json} | 4 ++--
...668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de.json} | 4 ++--
...2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28.json} | 4 ++--
storage/src/lib.rs | 6 ------
4 files changed, 6 insertions(+), 12 deletions(-)
rename storage/.sqlx/{query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json => query-21ed1c0b070f4929f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e.json} (93%)
rename storage/.sqlx/{query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json => query-78b20c983b951e668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de.json} (92%)
rename storage/.sqlx/{query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json => query-8c331d6438925f2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28.json} (93%)
diff --git a/storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json b/storage/.sqlx/query-21ed1c0b070f4929f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e.json
similarity index 93%
rename from storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json
rename to storage/.sqlx/query-21ed1c0b070f4929f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e.json
index adb68a8..6a16780 100644
--- a/storage/.sqlx/query-e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800.json
+++ b/storage/.sqlx/query-21ed1c0b070f4929f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND (\n last_finalization_attempt IS NULL\n OR\n last_finalization_attempt < NOW() - INTERVAL '1 minutes'\n )\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $2\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND (\n last_finalization_attempt IS NULL\n OR\n last_finalization_attempt < NOW() - INTERVAL '1 minutes'\n )\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $2\n ELSE TRUE\n END\n )\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -73,5 +73,5 @@
false
]
},
- "hash": "e3bccab1832ae37d7a5a274474f9a785f5128591f617d214d5929152d3469800"
+ "hash": "21ed1c0b070f4929f990e1810e682b4099dad6c4b65d951e3534e2168e7ad79e"
}
diff --git a/storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json b/storage/.sqlx/query-78b20c983b951e668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de.json
similarity index 92%
rename from storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json
rename to storage/.sqlx/query-78b20c983b951e668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de.json
index 3e2e10b..460f757 100644
--- a/storage/.sqlx/query-f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7.json
+++ b/storage/.sqlx/query-78b20c983b951e668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token NOT IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token NOT IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -74,5 +74,5 @@
false
]
},
- "hash": "f041b2f10b01842b3315f7d0354bf1622e1f15489530ccf7fd8a93088f4b6bf7"
+ "hash": "78b20c983b951e668b255f46c1f68fb4dc41f5e0fb9d4b55cc13a7c5210963de"
}
diff --git a/storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json b/storage/.sqlx/query-8c331d6438925f2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28.json
similarity index 93%
rename from storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json
rename to storage/.sqlx/query-8c331d6438925f2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28.json
index e1f56a3..794981b 100644
--- a/storage/.sqlx/query-70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327.json
+++ b/storage/.sqlx/query-8c331d6438925f2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n ORDER BY\n finalization_data.l2_block_number\n LIMIT\n $1\n ",
+ "query": "\n SELECT\n w.tx_hash,\n w.event_index_in_tx,\n withdrawal_id,\n finalization_data.l2_block_number,\n l1_batch_number,\n l2_message_index,\n l2_tx_number_in_block,\n message,\n sender,\n proof\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts < 3\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND w.token IN (SELECT * FROM UNNEST (\n $2 :: BYTEA []\n ))\n AND (\n CASE WHEN token = decode('000000000000000000000000000000000000800A', 'hex') THEN amount >= $3\n ELSE TRUE\n END\n )\n LIMIT\n $1\n ",
"describe": {
"columns": [
{
@@ -74,5 +74,5 @@
false
]
},
- "hash": "70c7bb78bf525cf29c0d5bd1c3a59d0503e6498288f4f40911dd1b2decb4a327"
+ "hash": "8c331d6438925f2ebe7749d5cc5bb5f6b7a8e177692896d4d9fe9db129defb28"
}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index afc7f56..54cce5c 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -790,8 +790,6 @@ pub async fn withdrawals_to_finalize_with_blacklist(
ELSE TRUE
END
)
- ORDER BY
- finalization_data.l2_block_number
LIMIT
$1
",
@@ -869,8 +867,6 @@ pub async fn withdrawals_to_finalize_with_whitelist(
ELSE TRUE
END
)
- ORDER BY
- finalization_data.l2_block_number
LIMIT
$1
",
@@ -949,8 +945,6 @@ pub async fn withdrawals_to_finalize(
ELSE TRUE
END
)
- ORDER BY
- finalization_data.l2_block_number
LIMIT
$1
",
From c5eb7e5be2f76911f6d797a7b6de44f9c78ea42c Mon Sep 17 00:00:00 2001
From: Danil
Date: Wed, 17 Jan 2024 16:59:36 +0100
Subject: [PATCH 022/128] feat(l1): parse l2 to l1 message (#352)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---------
Signed-off-by: Danil
---
chain-events/src/block_events.rs | 4 +-
client/src/contracts/IZkSync.json | 746 ++++++------------------------
client/src/zksync_contract.rs | 204 +++++---
test_tx.txt | 1 +
watcher/src/lib.rs | 8 +-
5 files changed, 278 insertions(+), 685 deletions(-)
create mode 100644 test_tx.txt
diff --git a/chain-events/src/block_events.rs b/chain-events/src/block_events.rs
index 1150306..abd24d8 100644
--- a/chain-events/src/block_events.rs
+++ b/chain-events/src/block_events.rs
@@ -12,7 +12,7 @@ use futures::{Sink, SinkExt, StreamExt};
use client::{
zksync_contract::{
codegen::{
- BlockCommitFilter, BlockExecutionFilter, BlocksVerificationFilter, CommitBlocksCall,
+ BlockCommitFilter, BlockExecutionFilter, BlocksVerificationFilter, CommitBatchesCall,
},
parse_withdrawal_events_l1,
},
@@ -282,7 +282,7 @@ where
let mut events = vec![];
- if let Ok(commit_blocks) = CommitBlocksCall::decode(&tx.input) {
+ if let Ok(commit_blocks) = CommitBatchesCall::decode(&tx.input) {
let mut res = parse_withdrawal_events_l1(
&commit_blocks,
tx.block_number
diff --git a/client/src/contracts/IZkSync.json b/client/src/contracts/IZkSync.json
index b553291..3ddb0b6 100644
--- a/client/src/contracts/IZkSync.json
+++ b/client/src/contracts/IZkSync.json
@@ -6,13 +6,13 @@
{
"indexed": true,
"internalType": "uint256",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -31,13 +31,13 @@
{
"indexed": true,
"internalType": "uint256",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -56,19 +56,19 @@
{
"indexed": false,
"internalType": "uint256",
- "name": "totalBlocksCommitted",
+ "name": "totalBatchesCommitted",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
- "name": "totalBlocksVerified",
+ "name": "totalBatchesVerified",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
- "name": "totalBlocksExecuted",
+ "name": "totalBatchesExecuted",
"type": "uint256"
}
],
@@ -81,38 +81,19 @@
{
"indexed": true,
"internalType": "uint256",
- "name": "previousLastVerifiedBlock",
+ "name": "previousLastVerifiedBatch",
"type": "uint256"
},
{
"indexed": true,
"internalType": "uint256",
- "name": "currentLastVerifiedBlock",
+ "name": "currentLastVerifiedBatch",
"type": "uint256"
}
],
"name": "BlocksVerification",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "proposalId",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "proposalHash",
- "type": "bytes32"
- }
- ],
- "name": "CancelUpgradeProposal",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [
@@ -136,22 +117,49 @@
"anonymous": false,
"inputs": [
{
- "indexed": true,
- "internalType": "uint256",
- "name": "proposalId",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "proposalHash",
- "type": "bytes32"
- },
- {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "facet",
+ "type": "address"
+ },
+ {
+ "internalType": "enum Diamond.Action",
+ "name": "action",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bool",
+ "name": "isFreezable",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes4[]",
+ "name": "selectors",
+ "type": "bytes4[]"
+ }
+ ],
+ "internalType": "struct Diamond.FacetCut[]",
+ "name": "facetCuts",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address",
+ "name": "initAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "initCalldata",
+ "type": "bytes"
+ }
+ ],
"indexed": false,
- "internalType": "bytes32",
- "name": "proposalSalt",
- "type": "bytes32"
+ "internalType": "struct Diamond.DiamondCutData",
+ "name": "diamondCut",
+ "type": "tuple"
}
],
"name": "ExecuteUpgrade",
@@ -182,17 +190,17 @@
{
"indexed": true,
"internalType": "address",
- "name": "oldAllowList",
+ "name": "oldAdmin",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
- "name": "newAllowList",
+ "name": "newAdmin",
"type": "address"
}
],
- "name": "NewAllowList",
+ "name": "NewAdmin",
"type": "event"
},
{
@@ -219,37 +227,18 @@
"inputs": [
{
"indexed": true,
- "internalType": "bytes32",
- "name": "previousBytecodeHash",
- "type": "bytes32"
- },
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "newBytecodeHash",
- "type": "bytes32"
- }
- ],
- "name": "NewL2BootloaderBytecodeHash",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "previousBytecodeHash",
- "type": "bytes32"
+ "internalType": "address",
+ "name": "oldPendingAdmin",
+ "type": "address"
},
{
"indexed": true,
- "internalType": "bytes32",
- "name": "newBytecodeHash",
- "type": "bytes32"
+ "internalType": "address",
+ "name": "newPendingAdmin",
+ "type": "address"
}
],
- "name": "NewL2DefaultAccountBytecodeHash",
+ "name": "NewPendingAdmin",
"type": "event"
},
{
@@ -409,180 +398,6 @@
"name": "NewPriorityTxMaxGasLimit",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "address",
- "name": "oldVerifier",
- "type": "address"
- },
- {
- "indexed": true,
- "internalType": "address",
- "name": "newVerifier",
- "type": "address"
- }
- ],
- "name": "NewVerifier",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "recursionNodeLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionLeafLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionCircuitsSetVksHash",
- "type": "bytes32"
- }
- ],
- "indexed": false,
- "internalType": "struct VerifierParams",
- "name": "oldVerifierParams",
- "type": "tuple"
- },
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "recursionNodeLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionLeafLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionCircuitsSetVksHash",
- "type": "bytes32"
- }
- ],
- "indexed": false,
- "internalType": "struct VerifierParams",
- "name": "newVerifierParams",
- "type": "tuple"
- }
- ],
- "name": "NewVerifierParams",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "proposalId",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "proposalHash",
- "type": "bytes32"
- }
- ],
- "name": "ProposeShadowUpgrade",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "components": [
- {
- "components": [
- {
- "internalType": "address",
- "name": "facet",
- "type": "address"
- },
- {
- "internalType": "enum Diamond.Action",
- "name": "action",
- "type": "uint8"
- },
- {
- "internalType": "bool",
- "name": "isFreezable",
- "type": "bool"
- },
- {
- "internalType": "bytes4[]",
- "name": "selectors",
- "type": "bytes4[]"
- }
- ],
- "internalType": "struct Diamond.FacetCut[]",
- "name": "facetCuts",
- "type": "tuple[]"
- },
- {
- "internalType": "address",
- "name": "initAddress",
- "type": "address"
- },
- {
- "internalType": "bytes",
- "name": "initCalldata",
- "type": "bytes"
- }
- ],
- "indexed": false,
- "internalType": "struct Diamond.DiamondCutData",
- "name": "diamondCut",
- "type": "tuple"
- },
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "proposalId",
- "type": "uint256"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "proposalSalt",
- "type": "bytes32"
- }
- ],
- "name": "ProposeTransparentUpgrade",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint256",
- "name": "proposalId",
- "type": "uint256"
- },
- {
- "indexed": true,
- "internalType": "bytes32",
- "name": "proposalHash",
- "type": "bytes32"
- }
- ],
- "name": "SecurityCouncilUpgradeApprove",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [],
@@ -610,20 +425,14 @@
},
{
"inputs": [],
- "name": "acceptGovernor",
+ "name": "acceptAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "_proposedUpgradeHash",
- "type": "bytes32"
- }
- ],
- "name": "cancelUpgradeProposal",
+ "inputs": [],
+ "name": "acceptGovernor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -634,12 +443,12 @@
"components": [
{
"internalType": "uint64",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint64"
},
{
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -673,15 +482,15 @@
"type": "bytes32"
}
],
- "internalType": "struct IExecutor.StoredBlockInfo",
- "name": "_lastCommittedBlockData",
+ "internalType": "struct IExecutor.StoredBatchInfo",
+ "name": "_lastCommittedBatchData",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint64",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint64"
},
{
@@ -706,46 +515,36 @@
},
{
"internalType": "bytes32",
- "name": "l2LogsTreeRoot",
+ "name": "priorityOperationsHash",
"type": "bytes32"
},
{
"internalType": "bytes32",
- "name": "priorityOperationsHash",
+ "name": "bootloaderHeapInitialContentsHash",
"type": "bytes32"
},
{
- "internalType": "bytes",
- "name": "initialStorageChanges",
- "type": "bytes"
+ "internalType": "bytes32",
+ "name": "eventsQueueStateHash",
+ "type": "bytes32"
},
{
"internalType": "bytes",
- "name": "repeatedStorageChanges",
+ "name": "systemLogs",
"type": "bytes"
},
{
"internalType": "bytes",
- "name": "l2Logs",
+ "name": "totalL2ToL1Pubdata",
"type": "bytes"
- },
- {
- "internalType": "bytes[]",
- "name": "l2ArbitraryLengthMessages",
- "type": "bytes[]"
- },
- {
- "internalType": "bytes[]",
- "name": "factoryDeps",
- "type": "bytes[]"
}
],
- "internalType": "struct IExecutor.CommitBlockInfo[]",
- "name": "_newBlocksData",
+ "internalType": "struct IExecutor.CommitBatchInfo[]",
+ "name": "_newBatchesData",
"type": "tuple[]"
}
],
- "name": "commitBlocks",
+ "name": "commitBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -756,12 +555,12 @@
"components": [
{
"internalType": "uint64",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint64"
},
{
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -795,12 +594,12 @@
"type": "bytes32"
}
],
- "internalType": "struct IExecutor.StoredBlockInfo[]",
- "name": "_blocksData",
+ "internalType": "struct IExecutor.StoredBatchInfo[]",
+ "name": "_batchesData",
"type": "tuple[]"
}
],
- "name": "executeBlocks",
+ "name": "executeBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -850,11 +649,6 @@
"internalType": "struct Diamond.DiamondCutData",
"name": "_diamondCut",
"type": "tuple"
- },
- {
- "internalType": "bytes32",
- "name": "_proposalSalt",
- "type": "bytes32"
}
],
"name": "executeUpgrade",
@@ -942,7 +736,7 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_l2BlockNumber",
+ "name": "_l2BatchNumber",
"type": "uint256"
},
{
@@ -952,7 +746,7 @@
},
{
"internalType": "uint16",
- "name": "_l2TxNumberInBlock",
+ "name": "_l2TxNumberInBatch",
"type": "uint16"
},
{
@@ -967,41 +761,15 @@
}
],
"name": "finalizeEthWithdrawal",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "freezeDiamond",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "getAllowList",
- "outputs": [
- {
- "internalType": "address",
- "name": "",
- "type": "address"
- }
- ],
- "stateMutability": "view",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
- "name": "getCurrentProposalId",
- "outputs": [
- {
- "internalType": "uint256",
- "name": "",
- "type": "uint256"
- }
- ],
- "stateMutability": "view",
+ "name": "freezeDiamond",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -1058,12 +826,12 @@
},
{
"inputs": [],
- "name": "getPendingGovernor",
+ "name": "getL2SystemContractsUpgradeBatchNumber",
"outputs": [
{
- "internalType": "address",
+ "internalType": "uint256",
"name": "",
- "type": "address"
+ "type": "uint256"
}
],
"stateMutability": "view",
@@ -1071,12 +839,12 @@
},
{
"inputs": [],
- "name": "getPriorityQueueSize",
+ "name": "getL2SystemContractsUpgradeTxHash",
"outputs": [
{
- "internalType": "uint256",
+ "internalType": "bytes32",
"name": "",
- "type": "uint256"
+ "type": "bytes32"
}
],
"stateMutability": "view",
@@ -1084,12 +852,12 @@
},
{
"inputs": [],
- "name": "getPriorityTxMaxGasLimit",
+ "name": "getName",
"outputs": [
{
- "internalType": "uint256",
+ "internalType": "string",
"name": "",
- "type": "uint256"
+ "type": "string"
}
],
"stateMutability": "view",
@@ -1097,12 +865,12 @@
},
{
"inputs": [],
- "name": "getProposedUpgradeHash",
+ "name": "getPendingGovernor",
"outputs": [
{
- "internalType": "bytes32",
+ "internalType": "address",
"name": "",
- "type": "bytes32"
+ "type": "address"
}
],
"stateMutability": "view",
@@ -1110,7 +878,7 @@
},
{
"inputs": [],
- "name": "getProposedUpgradeTimestamp",
+ "name": "getPriorityQueueSize",
"outputs": [
{
"internalType": "uint256",
@@ -1123,12 +891,12 @@
},
{
"inputs": [],
- "name": "getSecurityCouncil",
+ "name": "getPriorityTxMaxGasLimit",
"outputs": [
{
- "internalType": "address",
+ "internalType": "uint256",
"name": "",
- "type": "address"
+ "type": "uint256"
}
],
"stateMutability": "view",
@@ -1136,7 +904,7 @@
},
{
"inputs": [],
- "name": "getTotalBlocksCommitted",
+ "name": "getProtocolVersion",
"outputs": [
{
"internalType": "uint256",
@@ -1149,7 +917,7 @@
},
{
"inputs": [],
- "name": "getTotalBlocksExecuted",
+ "name": "getTotalBatchesCommitted",
"outputs": [
{
"internalType": "uint256",
@@ -1162,7 +930,7 @@
},
{
"inputs": [],
- "name": "getTotalBlocksVerified",
+ "name": "getTotalBatchesExecuted",
"outputs": [
{
"internalType": "uint256",
@@ -1175,7 +943,7 @@
},
{
"inputs": [],
- "name": "getTotalPriorityTxs",
+ "name": "getTotalBatchesVerified",
"outputs": [
{
"internalType": "uint256",
@@ -1188,12 +956,12 @@
},
{
"inputs": [],
- "name": "getUpgradeProposalState",
+ "name": "getTotalPriorityTxs",
"outputs": [
{
- "internalType": "enum UpgradeState",
+ "internalType": "uint256",
"name": "",
- "type": "uint8"
+ "type": "uint256"
}
],
"stateMutability": "view",
@@ -1242,19 +1010,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "isApprovedBySecurityCouncil",
- "outputs": [
- {
- "internalType": "bool",
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [],
"name": "isDiamondStorageFrozen",
@@ -1272,7 +1027,7 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_l2BlockNumber",
+ "name": "_l2BatchNumber",
"type": "uint256"
},
{
@@ -1353,7 +1108,7 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_blockNumber",
+ "name": "_batchNumber",
"type": "uint256"
}
],
@@ -1427,93 +1182,18 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "_proposalHash",
- "type": "bytes32"
- },
- {
- "internalType": "uint40",
- "name": "_proposalId",
- "type": "uint40"
- }
- ],
- "name": "proposeShadowUpgrade",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "components": [
- {
- "components": [
- {
- "internalType": "address",
- "name": "facet",
- "type": "address"
- },
- {
- "internalType": "enum Diamond.Action",
- "name": "action",
- "type": "uint8"
- },
- {
- "internalType": "bool",
- "name": "isFreezable",
- "type": "bool"
- },
- {
- "internalType": "bytes4[]",
- "name": "selectors",
- "type": "bytes4[]"
- }
- ],
- "internalType": "struct Diamond.FacetCut[]",
- "name": "facetCuts",
- "type": "tuple[]"
- },
- {
- "internalType": "address",
- "name": "initAddress",
- "type": "address"
- },
- {
- "internalType": "bytes",
- "name": "initCalldata",
- "type": "bytes"
- }
- ],
- "internalType": "struct Diamond.DiamondCutData",
- "name": "_diamondCut",
- "type": "tuple"
- },
- {
- "internalType": "uint40",
- "name": "_proposalId",
- "type": "uint40"
- }
- ],
- "name": "proposeTransparentUpgrade",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [
{
"components": [
{
"internalType": "uint64",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint64"
},
{
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -1547,20 +1227,20 @@
"type": "bytes32"
}
],
- "internalType": "struct IExecutor.StoredBlockInfo",
- "name": "_prevBlock",
+ "internalType": "struct IExecutor.StoredBatchInfo",
+ "name": "_prevBatch",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint64",
- "name": "blockNumber",
+ "name": "batchNumber",
"type": "uint64"
},
{
"internalType": "bytes32",
- "name": "blockHash",
+ "name": "batchHash",
"type": "bytes32"
},
{
@@ -1594,8 +1274,8 @@
"type": "bytes32"
}
],
- "internalType": "struct IExecutor.StoredBlockInfo[]",
- "name": "_committedBlocks",
+ "internalType": "struct IExecutor.StoredBatchInfo[]",
+ "name": "_committedBatches",
"type": "tuple[]"
},
{
@@ -1616,7 +1296,7 @@
"type": "tuple"
}
],
- "name": "proveBlocks",
+ "name": "proveBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1630,7 +1310,7 @@
},
{
"internalType": "uint256",
- "name": "_l2BlockNumber",
+ "name": "_l2BatchNumber",
"type": "uint256"
},
{
@@ -1640,7 +1320,7 @@
},
{
"internalType": "uint16",
- "name": "_l2TxNumberInBlock",
+ "name": "_l2TxNumberInBatch",
"type": "uint16"
},
{
@@ -1669,7 +1349,7 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_blockNumber",
+ "name": "_l2BatchNumber",
"type": "uint256"
},
{
@@ -1691,7 +1371,7 @@
},
{
"internalType": "uint16",
- "name": "txNumberInBlock",
+ "name": "txNumberInBatch",
"type": "uint16"
},
{
@@ -1735,7 +1415,7 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_blockNumber",
+ "name": "_l2BatchNumber",
"type": "uint256"
},
{
@@ -1747,7 +1427,7 @@
"components": [
{
"internalType": "uint16",
- "name": "txNumberInBlock",
+ "name": "txNumberInBatch",
"type": "uint16"
},
{
@@ -1835,24 +1515,11 @@
"inputs": [
{
"internalType": "uint256",
- "name": "_newLastBlock",
+ "name": "_newLastBatch",
"type": "uint256"
}
],
- "name": "revertBlocks",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "_upgradeProposalHash",
- "type": "bytes32"
- }
- ],
- "name": "securityCouncilUpgradeApprove",
+ "name": "revertBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1860,38 +1527,12 @@
{
"inputs": [
{
- "internalType": "contract IAllowList",
- "name": "_newAllowList",
+ "internalType": "address",
+ "name": "_newPendingAdmin",
"type": "address"
}
],
- "name": "setAllowList",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "_l2BootloaderBytecodeHash",
- "type": "bytes32"
- }
- ],
- "name": "setL2BootloaderBytecodeHash",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "_l2DefaultAccountBytecodeHash",
- "type": "bytes32"
- }
- ],
- "name": "setL2DefaultAccountBytecodeHash",
+ "name": "setPendingAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1953,58 +1594,15 @@
"stateMutability": "nonpayable",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "contract Verifier",
- "name": "_newVerifier",
- "type": "address"
- }
- ],
- "name": "setVerifier",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "components": [
- {
- "internalType": "bytes32",
- "name": "recursionNodeLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionLeafLevelVkHash",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "recursionCircuitsSetVksHash",
- "type": "bytes32"
- }
- ],
- "internalType": "struct VerifierParams",
- "name": "_newVerifierParams",
- "type": "tuple"
- }
- ],
- "name": "setVerifierParams",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [
{
"internalType": "uint256",
- "name": "_blockNumber",
+ "name": "_batchNumber",
"type": "uint256"
}
],
- "name": "storedBlockHash",
+ "name": "storedBatchHash",
"outputs": [
{
"internalType": "bytes32",
@@ -2021,74 +1619,6 @@
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
- },
- {
- "inputs": [
- {
- "components": [
- {
- "components": [
- {
- "internalType": "address",
- "name": "facet",
- "type": "address"
- },
- {
- "internalType": "enum Diamond.Action",
- "name": "action",
- "type": "uint8"
- },
- {
- "internalType": "bool",
- "name": "isFreezable",
- "type": "bool"
- },
- {
- "internalType": "bytes4[]",
- "name": "selectors",
- "type": "bytes4[]"
- }
- ],
- "internalType": "struct Diamond.FacetCut[]",
- "name": "facetCuts",
- "type": "tuple[]"
- },
- {
- "internalType": "address",
- "name": "initAddress",
- "type": "address"
- },
- {
- "internalType": "bytes",
- "name": "initCalldata",
- "type": "bytes"
- }
- ],
- "internalType": "struct Diamond.DiamondCutData",
- "name": "_diamondCut",
- "type": "tuple"
- },
- {
- "internalType": "uint256",
- "name": "_proposalId",
- "type": "uint256"
- },
- {
- "internalType": "bytes32",
- "name": "_salt",
- "type": "bytes32"
- }
- ],
- "name": "upgradeProposalHash",
- "outputs": [
- {
- "internalType": "bytes32",
- "name": "",
- "type": "bytes32"
- }
- ],
- "stateMutability": "pure",
- "type": "function"
}
]
}
diff --git a/client/src/zksync_contract.rs b/client/src/zksync_contract.rs
index dc6669f..ab5ef0e 100644
--- a/client/src/zksync_contract.rs
+++ b/client/src/zksync_contract.rs
@@ -21,7 +21,7 @@ use codegen::{
BlockCommitFilter, BlockExecutionFilter, BlocksRevertFilter, BlocksVerificationFilter,
};
-use self::codegen::{CommitBlocksCall, FinalizeEthWithdrawalCall};
+use self::codegen::{CommitBatchesCall, FinalizeEthWithdrawalCall};
/// An `enum` wrapping different block `event`s
#[derive(Debug)]
@@ -75,32 +75,32 @@ impl std::fmt::Display for BlockEvent {
match self {
Self::BlockCommit { event: bc, .. } => f
.debug_struct("BlockCommitFilter")
- .field("block_number", &bc.block_number)
- .field("block_hash", &H256::from(&bc.block_hash))
+ .field("block_number", &bc.batch_number)
+ .field("block_hash", &H256::from(&bc.batch_hash))
.field("commitment", &H256::from(&bc.commitment))
.finish(),
Self::BlockExecution { event: be, .. } => f
.debug_struct("BlockExecution")
- .field("block_number", &be.block_number)
- .field("block_hash", &H256::from(&be.block_hash))
+ .field("block_number", &be.batch_number)
+ .field("block_hash", &H256::from(&be.batch_hash))
.field("commitment", &H256::from(&be.commitment))
.finish(),
Self::BlocksVerification { event: bv, .. } => f
.debug_struct("BlocksVerification")
.field(
- "previous_last_verified_block",
- &bv.previous_last_verified_block,
+ "previous_last_verified_batch",
+ &bv.previous_last_verified_batch,
)
.field(
"current_last_verified_block",
- &bv.current_last_verified_block,
+ &bv.current_last_verified_batch,
)
.finish(),
Self::BlocksRevert { event: br, .. } => f
.debug_struct("BlocksRevert")
- .field("total_blocks_commited", &br.total_blocks_committed)
- .field("total_blocks_verified", &br.total_blocks_verified)
- .field("total_blocks_executed", &br.total_blocks_executed)
+ .field("total_blocks_commited", &br.total_batches_committed)
+ .field("total_blocks_verified", &br.total_batches_verified)
+ .field("total_blocks_executed", &br.total_batches_executed)
.finish(),
Self::L2ToL1Events { events } => f
.debug_struct("L2ToL1Events")
@@ -125,7 +125,7 @@ impl AbiDecode for L2LogCompresed {
let inner = codegen::L2Log {
l_2_shard_id: bytes[0],
is_service: bytes[1] != 0,
- tx_number_in_block: u16::from_be_bytes([bytes[2], bytes[3]]),
+ tx_number_in_batch: u16::from_be_bytes([bytes[2], bytes[3]]),
sender: Address::from_slice(&bytes[4..24]),
key: bytes[24..56]
.try_into()
@@ -163,33 +163,36 @@ pub struct L2ToL1Event {
pub tx_number_in_block: u16,
}
-/// Given a [`CommitBlocksCall`] parse all withdrawal events from [`L2ToL1`] logs.
+/// Given a [`CommitBatchesCall`] parse all withdrawal events from [`L2ToL1`] logs.
// TODO: rewrite in `nom`.
pub fn parse_withdrawal_events_l1(
- call: &CommitBlocksCall,
+ call: &CommitBatchesCall,
l1_block_number: u64,
l2_erc20_bridge_addr: Address,
) -> Vec {
let mut withdrawals = vec![];
- for data in &call.new_blocks_data {
- let logs = &data.l_2_logs;
- let length_bytes = match logs.get(..4) {
+ for data in &call.new_batches_data {
+ let logs_pubdata = &data.total_l2_to_l1_pubdata;
+ let mut cursor = 0;
+ let length_bytes = match logs_pubdata.get(..4) {
Some(b) => b,
None => continue,
};
+ cursor += 4;
let length = u32::from_be_bytes(
length_bytes
.try_into()
.expect("bytes length checked by .get(); qed"),
- );
+ ) as usize;
- let logs = &logs[4..];
+ let logs = &logs_pubdata[cursor..];
let mut current_message = 0;
- for i in 0..length as usize {
+ let mut l2_to_l1_compressed_messages = vec![];
+ for i in 0..length {
let offset = i * L2_TO_L1_LOG_SERIALIZED_SIZE;
let log_entry =
L2LogCompresed::decode(&logs[offset..(offset + L2_TO_L1_LOG_SERIALIZED_SIZE)])
@@ -199,61 +202,120 @@ pub fn parse_withdrawal_events_l1(
continue;
}
- let message = &data.l_2_arbitrary_length_messages[current_message];
- let message_sender: Address = H256::from(log_entry.0.key).into();
- let l2_block_number = data.block_number;
-
- if message_sender == ETH_TOKEN_ADDRESS
- && FinalizeEthWithdrawalCall::selector() == message[..4]
- && message.len() >= 56
- {
- let to = Address::from(
- TryInto::<[u8; 20]>::try_into(&message[4..24])
- .expect("message length was checked; qed"),
- );
- let amount = U256::from(
- TryInto::<[u8; 32]>::try_into(&message[24..56])
- .expect("message length was checked; qed"),
- );
-
- withdrawals.push(L2ToL1Event {
- token: ETH_TOKEN_ADDRESS,
- to,
- amount,
- l1_block_number,
- l2_block_number,
- tx_number_in_block: log_entry.0.tx_number_in_block,
- });
- }
+ l2_to_l1_compressed_messages.push((log_entry, current_message));
- if message_sender == l2_erc20_bridge_addr
- && FinalizeWithdrawalCall::selector() == message[..4]
- && message.len() >= 68
- {
- let to = Address::from(
- TryInto::<[u8; 20]>::try_into(&message[4..24])
- .expect("message length was checked; qed"),
- );
- let token = Address::from(
- TryInto::<[u8; 20]>::try_into(&message[24..44])
- .expect("message length was checked; qed"),
- );
- let amount = U256::from(
- TryInto::<[u8; 32]>::try_into(&message[44..76])
- .expect("message length was checked; qed"),
- );
- withdrawals.push(L2ToL1Event {
- token,
- to,
- amount,
- l1_block_number,
- l2_block_number,
- tx_number_in_block: log_entry.0.tx_number_in_block,
- });
- }
current_message += 1;
}
+ cursor += length * L2_TO_L1_LOG_SERIALIZED_SIZE;
+
+ let messages_length_bytes = &logs_pubdata[cursor..cursor + 4];
+ let messages_length = u32::from_be_bytes(
+ messages_length_bytes
+ .try_into()
+ .expect("bytes length checked by .get(); qed"),
+ ) as usize;
+ cursor += 4;
+ let messages_bytes = &logs_pubdata[cursor..];
+
+ // reset cursor, now we are working with messages
+ cursor = 0;
+ let mut current_message = 0;
+ for (log_entry, position) in l2_to_l1_compressed_messages {
+ // We are assuming that the messages are sorted by position
+ for i in current_message..messages_length {
+ let current_message_length = u32::from_be_bytes(
+ messages_bytes[cursor..cursor + 4]
+ .try_into()
+ .expect("bytes length checked by .get(); qed"),
+ ) as usize;
+ cursor += 4;
+ let message = &messages_bytes[cursor..cursor + current_message_length];
+ cursor += current_message_length;
+ // If the current message is not the one we are looking for, skip it and increase the cursor
+ if i < position {
+ continue;
+ }
+ if i > position {
+ panic!("We should've break before this point")
+ }
+
+ let message_sender: Address = H256::from(log_entry.0.key).into();
+ let l2_block_number = data.batch_number;
+
+ if message_sender == ETH_TOKEN_ADDRESS
+ && FinalizeEthWithdrawalCall::selector() == message[..4]
+ && message.len() >= 56
+ {
+ let to = Address::from(
+ TryInto::<[u8; 20]>::try_into(&message[4..24])
+ .expect("message length was checked; qed"),
+ );
+ let amount = U256::from(
+ TryInto::<[u8; 32]>::try_into(&message[24..56])
+ .expect("message length was checked; qed"),
+ );
+
+ withdrawals.push(L2ToL1Event {
+ token: ETH_TOKEN_ADDRESS,
+ to,
+ amount,
+ l1_block_number,
+ l2_block_number,
+ tx_number_in_block: log_entry.0.tx_number_in_batch,
+ });
+ }
+
+ if message_sender == l2_erc20_bridge_addr
+ && FinalizeWithdrawalCall::selector() == message[..4]
+ && message.len() >= 68
+ {
+ let to = Address::from(
+ TryInto::<[u8; 20]>::try_into(&message[4..24])
+ .expect("message length was checked; qed"),
+ );
+ let token = Address::from(
+ TryInto::<[u8; 20]>::try_into(&message[24..44])
+ .expect("message length was checked; qed"),
+ );
+ let amount = U256::from(
+ TryInto::<[u8; 32]>::try_into(&message[44..76])
+ .expect("message length was checked; qed"),
+ );
+ withdrawals.push(L2ToL1Event {
+ token,
+ to,
+ amount,
+ l1_block_number,
+ l2_block_number,
+ tx_number_in_block: log_entry.0.tx_number_in_batch,
+ });
+ }
+ current_message = i + 1;
+ break;
+ }
+ }
}
withdrawals
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use ethers::abi::Bytes;
+ use hex::FromHex;
+ use std::str::FromStr;
+
+ #[test]
+ fn parse_l2_to_l1() {
+ let input = include_str!("../../test_tx.txt");
+ let bytes = Bytes::from_hex(input).unwrap();
+ let block = CommitBatchesCall::decode(bytes).unwrap();
+ let withdrawals = parse_withdrawal_events_l1(
+ &block,
+ 0,
+ Address::from_str("11f943b2c77b743AB90f4A0Ae7d5A4e7FCA3E102").unwrap(),
+ );
+ assert_eq!(withdrawals.len(), 19);
+ }
+}
diff --git a/test_tx.txt b/test_tx.txt
new file mode 100644
index 0000000..1939a96
--- /dev/null
+++ b/test_tx.txt
@@ -0,0 +1 @@
+701f58c500000000000000000000000000000000000000000000000000000000000618d3230f3a35bca6728344d0d6a1cbd7827c2c0a1f8c39fea26404b2c3b60af2d17e000000000000000000000000000000000000000000000000000000000c6d60a90000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470c7bb425fbce41bdaf9701abe5e2f7c0bcb3e68dc9ba8489739014f0321d216ee0000000000000000000000000000000000000000000000000000000065a7d1e38f5892656422bb92ccf9ccbce6e582ef22fda0728499f7af1124a11f8befdbaa000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000cf8000000000000000000000000000000000000000000000000000000000000618d40000000000000000000000000000000000000000000000000000000065a7d228000000000000000000000000000000000000000000000000000000000c6d626b7cd38408cb6037fe8a1f9c5e72a6cdd324b91c7cdcc95de1e9c0c06f934cd1630000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47056120cd01ecd793c04292e6e2cd9357adf18c21f034d7d875207287736b4999a8908b701590aa5fe88fc82be05b704260159e0531d5ee0c98e09c891f788067b000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000026800000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000004230f3a35bca6728344d0d6a1cbd7827c2c0a1f8c39fea26404b2c3b60af2d17e000003e8000000000000000000000000000000000000800b000000000000000000000000000000000000000000000000000000000000000300000000000000000000000065a7d22800000000000000000000000065a7d269000103e800000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000005c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470000103e8000000000000000000000000000000000000800100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000103e8000000000000000000000000000000000000800800000000000000000000000000000000000000000000000000000000000000006a6947b1b7d28a8656c25c8f8a4cb707ec9e42f09565419234b154ad16ace967000103e800000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000001c1d115c6d61e9fb17620b5a1272da139589aa917760cab34eb5fdf12e7952e54000103e800000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000002404d767fa1adcb686597d5a179dfa403cf1387881753cc2625b8d863d0142edb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb3600000005000101870000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a966c8816e6e1023fe60ceba89b5755c3898bf496f3f4a90d49106f8cdfbe7cda000101a10000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a89ebcb7f34c55e4236de734539af7d1b90dd032965d29e5c76d22f2a1cc88ce6000101cd0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a4f2f7eb07ce4d62d3cfafcad0efa13142eca3617a4cda0703bfd4e8b3c021504000103660000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a4c7d8d17149481cff615110e3d21dce9837724c6f72d31d97524b18f9beb8493000103ac0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ae5ac95856be09f492a364772f1a4e43c80ae10b9ea93003eb3a7a314fbc657cf00000005000000386c0960f97a7b97ea16a9b505725a4dc39428319b6b850189000000000000000000000000000000000000000000000000001643d07bfb5d15000000386c0960f990a2f06feef126b21bd87bb204db53af9a0ed15f00000000000000000000000000000000000000000000000000153446c6a79b25000000386c0960f91542be541573306cfacb71f9e2d269223f02312b00000000000000000000000000000000000000000000000000189c0dd56563b9000000386c0960f98e2466dca3d76de08024cd81e3568fb72e5a7948000000000000000000000000000000000000000000000000001644fe05f51415000000386c0960f9f873e6eb2951b7a22740ab4c3280e34bb5e3c7390000000000000000000000000000000000000000000000000166d2f702508000000000000100c8410401c2caa2b907baa4ed7d68e726da567ea4e7e5a182edeb03adcc091890a85a560efe0001000727d2308686dfbd3af07990542407e5394c44f4c81351e6bfb91a966e6941a096f9f8fe2e5ee3c57c90b308ca341ca0a2bbb02e05971c6c16df89e5b86900010000a580e6ee8ffd39da0b01df8b667264b03a1a6e47b352168527ea56235bfa12aaa1216bad1ca57ed7323f8129da56d35e132099f021948980ebdafb05a909016ba45c589f78fb54d0e0ffae5908a9f41763414db81ece985b0a2cff4c7493dc0901933f98180e23c8dac6434ca388f9b3091971371bd414526403705644edb38658090311bf97942365bb9b6a84cf60f87a14707ee84d9b9965ccc12cb61bb2e0fcd0d40901a7db8c3417630482d57d1ba30eea1a1f44ca791eb49b2866ddaebe7bd62a616d0901b6351772b07cc847a81ef370d3c5a90afdbc59511e84a776778478a0078e1a550901997846c4b5e480a125425c1f108202dc317d46000cf1d99baa57bca3519250480902eba276a49fd3a3b2c5dc57df0feac55272b0371d763593dde0e26cf24db15caa09012c91130303f39c26b9225bcad8b6c56b44d0751ed4ca197e07a754194be449350901cd7e713bbdfb7b9f55c6bf0c94ca1f411bb14ebd00a139dea6d6e9f62e4263cd3903a814488acc00daddb15401720626de8808c333c26183ae3c4e305461f29aa0c5f37bb446c5f831886c98b76000983f3485bf407ddab3d80709c6a52f381f6909172b2a87891c9b342eedd324e23906ed83c14fe000735a0c1c4021263bd76d5740d081255d9d8839ae315c30be0641141af13e551a3904c2b90fffc0002a3f7810e00d36f102e2b714eb2fd9bc2d4ca3a40b1952a592abd7da2ec43b5c41013e3040042bad001e81fbfc48c93d4e5f12ef7f9fcb4c06a8cf24cf90566a1c8396f467b6ad118300230f3a35bca6728344d0d6a1cbd7827c2c0a1f8c39fea26404b2c3b60af2d17eebd2fe2c2df9a0cd879d39f1455d5e316342e33a828338dca62098cad6c1da65e103433db75c7a5877e9024c580000000000000000000000000000c92a8dede906e94ba6d85529e2984205813be4d0186adff73405c464e7ea58f3fab5e103433db75ef5424b92e9069c0000000000000000000000001f67561fb1da7bafbee6cfc04a76a02c41d2a5f6d5ce517480d6b92853127d3ec22d97a1e1034d0efbe13fdd4cc32e8d67000000000000000059a7d9a4f6fe303fc4afd4a06ff7066aa3cd29f0f00c79ef955c972f1dd0d72d2d0e521e7c612db8090aa9befaa99988e35d9e8a11b1e126e3af7a7e0f19ed220b22046e93a00c997f2c09087b69560a59b10d4ce09e3fe09bd7ed54070de6d7ea6d9f148d341deceff8e6f40901880890cb5712e7fb1d7cc2baea45c788032d4b9624928da57e51b1da432c5000a13b12363be89a99dc9d53a21dedfef53e0ee1897ca726d3a7e4ab789e8b671cbac71d5048c715c430b4b31d7105fe67ecea41bcc121678a5728d1ac7fdd8c6531788f92a296400db9cefa62753a3c3d44f4094df9c70e8a42330074727565616e796f6365616e2e73756d6d65720000000000000000000000002628b07319ee6c541a48310c41107242233ef6a11753dd882a9309f62c703edb8f311979017270c71afe155d4db239ab04a55d9a5a88f569a6594f7108ce60178e7d3b9403ece4afa15f19bf731437db95f630cf7b03a47506733044ef158666c756b52c5fec795b8c4589bfce16ee27a83b277f8f8fabf11ad8fe9d670901e436f79364bb6bc5560ca63795d1f7fb0c2e05ade0d06976893a0223ca63bdcaa167353586d23bcee18e003752e4be7de4825b48eba902ed9a73af926919cc17ad3c0bd5316fb0c716e6d9c2fa37fde1920983aca90901e5fbb0c8c188b26547074dc62bda86a1b54ac1d89262c63c6e94d1a52912a27229d60172709d352cd84288bc391f30f65fb6deb12f66e881b6950aa0ffaaa0098072b09ded74490ed5d2a3a02d9046b611532c11673943b122866d25c1098e11348f455f2d1709f64839bf65520f91d70a015f8b186b59f8386e9e77334b6b840e0fd46eb0cde20679f5adfc03ca23519a8f51038d7ea4c680000000001858b7d829306411575baac44718fa7b472985e04868a07429a508a123719bd24101ac57738af04eaa0dee481d7b33d5cd4be9c6da82907d44a0db51010175078e62415995c6502abf41018df85603bc655fb62f0b684a50e56698f43ba43d0e3ff5be82703d899302d9640fefbfe6a0ff0f0901cd529249b5165bf06b55a48d2920eb5aecd088c8d6102507c34b3f70d1f1b7e20901be4f296fd3a472bb315eebae42849434024d09b1d2eab820948d303a747068afa14bd49374bcbe3704c7b482173049b1002eed3b2e5c1d2cae26b90c2ef9b92eddd00aed16bf67f2bf892ac36060dfdb85e7cc55b7a1b4beb1106b02268fe7a065f21d2fc7852553a4309e7d0719e6f1e51bb42b0bca8c55b1f7dcda0d96a5a416111a8f1d98a40c3ee3312732017270ab26e9b642405d170e2ac3a3ee6d5b47884bcba8e03ab4a81b5fef4190f8ecbbf1090105b6c3b33ec77b27e821a62a163bd66ff050a55a53aae589f6f0e9dfd025a03919027063fb07d16b10b57a61a07d70a3abf543cd47133faeabb95a9e3d59a03292d0ada719a92b963ec7c3ec7241fceb4bdda798762de81c930729326ba71929a092cb741edcb6f74901f0ba352790d66a2b54ce516634a04ff338bbef780c47a87425f85dc375f5bc9f358a1c9ce3fb4e670a01c850e12e1d465d25954f8b268e16feae405df4cf78963fdbd9ca0e1b83e3e145292820667cd2ff5a024fb06a6cf168c89c56bcbe8d67106b6cfeda6337ef896c0ea92d6835587a20965afd78e3c4be8f3e5f11f284b1772446d72a6320066bd67a91650350bfeaff94ec817b711e329c268624d8578b9a0392d70b0d30e9046d82f34353216f1e2ac12effdc3bad68950069a600db42fbffa5ddd8bcbfdc36f6e25be113f95406abeed121f894a8c20ca8fb6071a0fac9685ffc6101cc405baaa82239821a3581616197051b53aea1190ee3be2d3bdbb0b1e8fe7bba8b8bef72096b476f7a71c38170ee9fadb5f7e895b9e0eaa1c5db68f30d21cbe0c9eac7be5ea83468d69297e6a5bbd888ee8da28691a8cf674ee825dc056eda87fbe55832f6ab25c2c7da76190901f9838381e46114fc578d6ebb26214cf6651a28c63f5acc3e5f03100864adc34309016a55011655363c7d4f42dcae89ec2749a50db1f28a1ff85d630cbc6c7a4ab760410ed7827f817c828b5ae578aa34a828cb81d24746b0d3c481dd76b51722a6cf8b81ae1bd5beedc01ba10e595bfcafb552f83e25d24e8a383f88c1ab48a451e8e82802fadbf500280b6342f06bab66c5b6880d5b2ce980b7f12fec94bd9009010906dc5d7fc11850bd62c2c61f1d39a4b947b5a672e0a90fa8893a93a57d69dda15603a110e73d9d7a1da2ebb57456b1392944a765a92be06ef52fcc02fe3f0ac26a58ec329ef2efa0f85ac06215e1f15eea23fec4a12fe24395472c7dcbd65bf2c1c6821121b56cad6f588ff3d128e22987105d97c56629172a94122f2b3a9f15d07f8a5061391bc0843118e3017270927959fef0d3c3cbf8215305ad7c7aaeac3ca800f8dc575e252e25aa10ac186b2f3118e4017270b6703713b87ec38df8042e46bf94f6885c4ea904f8ab8c6a4356327ee48e7fa4b1090160aca8fee48e13f6a2424aed77febc3663dedacefc0b77c558f80ebdd8baedff51016775f775a7edf4599b84f54bbc11ae09acd627791c6b8b336d5fc328cead3331ec1c17a566d40ee2750a012e0248ac00f92ba91f36f8ece45130ab122c07fce6bc60dbe7be1ded7cab3c3319f3a4410ec0220622904363511368ee256233c4a6dacb1c5784c19ebc86684a78f243360a0176831b481e05cfed5098b0bd6ba83b5d7c8dd5e74f7ec4af63053c79e2062ff00a0141b4876787eeb027a838d67e578404cd22706523964733267bddc919f26af4d50a01f6a637d1835a210700c4c7afdcc7ca6a212eea8cfd717c8a22f87304478ad8b80a01525f13b0217d3133508d1cb602616bc6bbec5d42aa90ceabb684a5d0a49f63940a011ce7b71a7700c2ce3f3a5327d03233bc919e231380a4539bdcc4c6c2ca5339f01927235d77ef3d5356c34063c1da2978d88dfdf802efe2d287f61ee43525d3d579aaed8a0a0164aabed9afee9d7a6a5870ce0c3f4bd4e11bb901914b6f4df6aa853c56f8e317218fcd979082e03c7e6fc0fd8af4e922cbfd20f44cf085bb24ac29bc0ec8dc1a70fd91928d212b459029f0bca4c3e647d62538ff52694a131d1e5885e26e7dfcd40fe24b01e35f0f386b0a01053789af1abff3fa13134e8f03b0d0bf838cd9e3ee73a421436407b49c17dd2a0a01dce6347065331627ad1d4b50878140b6fcf2e5e5c3c62b1a8a4f051d5807a5dd19bbed80d2bbdea1b9f8e4481592a7cd32ed4547af16d2970ce55a4736577a2880eeefcd210102f22836e7dcb2c2776575a3a0446ed43b73c273a5671fba667592b8fe7a5141dc3b7919bf87ef686d7740a20fa7b677aab9d74895b2670107b095833a1d297aa7daf300e0e5891127105a48523cd4ca3195811823837b36414249bc191faef83515580e0c3168bfd8a00a013ddeea638f5fdcf59b97bbc93dbfc3367f1810e11936678d983e3d574fff67bc191c0b95f5c4c18b8324f05b388e22ba2dc88014bba382a8207ec9616a0e048c8e7cb1ae0a01baad15b216740084ff94108752d13546520f9ba6ff729525d8a6c80d81b7cb1719a7dc408a1c5de8cd302c7a8a3f9a4e6474f529eb933bfc837f783e0e3bdb0e352a1ce71158f03189906780a96e9016ff3ae96cddc4d921bd092940b1e3d74a51bacd39ada5230a015f03a38952814693217b42c56d27fa37c28a5ed19aa03c0f394241c8b20e38b00a01d65e9802b8f97f4b6a9326997ffe99ee56cb3a483352467967eb1f871b3ead2119a70da00682f2d9a45ddaf16bd5bdc2afb662b8dbefff9b7b49afc01e963f837fe908000a01cf2759c6808dacc3aeef0868486a001b923eac1d9448ec7d739a7e4b8a6887362123d9683c416e546720ffbc6cd803266b6b6bf3f06b6352a0c7fb5de44a7f09f961ff5fed0a016ea532ea1dbdc8a77ee073466898350f0e89c05dc2a20a6c4b578e476fee6c7321015ad599d2e394931ef9f913581ea6be24e997e4ade1a0e2e225e3352ee26f479208ab600901c7f090cabf1097e846306f343758f984d720b5275d884a6dabb9019cc86da6401945d7125a277b21fd52964484b547b209af2b2a77ea8607d0e7e331d9c5005740ba043e1118978a46a4373aa0ed88fc688230e7af223271a30ff1b0e72c03638263c73cf0f137210f72f6312dda64d6420479f65f7c6ecf387aeb97f70a2994dac62c81bdde1b025f5ebf4c19c30f170b28eb43e215edd2f3a26c5e96a8a9704a5f0c5f65594f8bc4e961438c95f7d0194fc16aa6e0df8cce4835e08f558bc278c0a3f09fe35f29e476a7548c9ffe350ad60deb2119be293c7f346475f8f919c0ea05e2eae10089c6de7c36aa180728c05af248bc73ef62280a013767823acd687dce30b92d0622699c8c542eeeeef12c1d9d4b6e4530d91557a4a13b12363be89a99dc9d53a21dedfef53e0ee1897c1cf9c547e82180da547c8582b5fa98595655e787ac7a829afd7ff6911ceac7b2a1ae661e1e59cb4184a2428eac60a4cd349b688993bd8546776528f4cae65203f18144df09807ad7c45b739770ed7ed26957a162f0a1f9c04952c18c3849d120a490ef8bcaa527bfe61ca2e8f70138e2bb60d679f9e420e99a73701eb180dc6deb0db316c20f370d5199a1c2c2c3ffb3e2470e48327e08197549af609c66fd41f7e4789b7a53b8d213247c18fe686ed0cde54b9f587621f2649489abf18676a110d39646e379882ee67e2af3cf62e6383e5a5cea152202de020f6a1ca915ce0997e9ab3778c7693ee224e666f2b0d0fd01fa38ac2165a7d2555714b67cee518a302bdcbcefcf487d92e85a0752f5c202071838b1335b5ce9832165a923d569c4ef29c05c8c1e915bbcdfcc952ac178af4cb4106b0f9e77f5035c310297d6311e070172708b1ed2774d54ec0317111057d627be2059fc7d62e4e4758323cee60292e0b6ee44a1c2598cc2bb8674b73c0d6cb92e597985fb527c1b3c1f6ce4885b67254496f99e4783b0120c88f13457ad1883f2177acf54523cb409014ce1a03c58eb0566c286e480a26949e5e1c20557a76646ad1e900410639e98c3414238e84c7bb163adfce302520335fbafe210ffdf8e71ce647df72d4e7a3524991e3b28aa117471510901869b70f00267aaf88abf76a77ea67fd5f72ead26d8925a09de1ac5bcc07b15f20901d9770d952937b7f3ec70b838f8e11a27835b885181c70b4dfd525229a307eecaa10ec9a2b522bac8f7fe0cc80cfe9246e0194bae1e4b0b89611403683c5399fad26d8713d46a135ce9d6a4f5d320573c086e7bf69da1f531f66e7c965220b8ea56f0623bfdb6af5dfe756e506507b7e05d743bb02bb4556e5da7774c8f3824d50ce0fc8376f9ec8741e831358f017270c35407d410997d3c2dcd5fab159c7a360323ed16b2757481e3f6f14c31b7bc8e5b09017c7d5497814bb4906aee97231eb93ea529b3d34020dd1961ed59813c37dc4758392386f26fc10000377d9a4bf779481d5387798a01a0b6096134639f5b4b8f1429750228662e0d9721053606151247f14fdd1fc4db40a6b921255f89556b61fabba99082231d802e14ecace69881ffffffffffffffffffffffffff985ae4bc7b67cec08d4ebb51e38e606f53f95797e6ab576139209b926db2ea519fe2c621acea0106c6bbe1527884ebc7bd1cae188092b13490ce1c3e214eeece9b51fd60414fcfc11994211961f62b92eea2c20aa2101ba1dc01045e8b9e558bce4167bf4b31714a1a2a70f70a01500d41d1f8de371dbd2ba361cafd62bebfa9f1fd5a94e6fc50efadd9fe4925b30a01d96e841f23b2cd8c3fa39dcf56cd6e14447a7e2e13bd635d3bd288a758408f6e21026d2944b657044de6f4b9770c6a8d97f2984e442516fef4daebe16264213cc377ec0b7f2106d4ed6d4473e80af27ed6c2cd1fd7e6d3f7f463c3aa32595471ad3e757c4ce946d241650a01893e857b5ce255e49ba7568dc753d32e51d5eb6c735cb937c9fd2951db2bb63321010c6f026ed77abcf9fd246b320fb5e3779c3b297b1a6da91de142cc83f512b2836cc65f415b97e9081d9400000aab430f9f4a9336a35369c9b24b1c482ce57379cb73daef1fc35a8149c47e84a1a348ad257ca18eb85801aa82f95be28b3a60240ee60de51a6af49361f4cef81f0408c478af670d4d57939565230c0c05b181f834311c6f017270c8ad5884cf4c667846247fcee486da535d728b7bc89cf557e98dd3b022a8c13f6b090125880d7a690fe3f76f8b0a531dda6bd46ee5753b5c3dbe9a05932138654795c5492e3beeb067becd4f0a456f6c6e7f7a4f50d91115f4b1be5b1aa27b5dd4ccdee834389211181ae017810920fb90fa00381b12ea208c1033ec285d184e751661525b4f1ee568246cc06a981209082a54342d1e001ce0e0e42a4f7577ccc19c43656f1fbcb644bfa8092d6f487a470902a03bd201ff6b83581548d55eab77857d01e593d52d85f2e2ba35a0a335aa98b209026e7665e703b9b1eec0c11773a854788bad735538439b13ab9b79b2827f53985e09021373063cbfe423e00098019599a0fd4ba6b0ce004f29e32bb0c4becbda13744a090147c8497fca450affd49779d0254b9ce40836620da853c5cad0fe6c3812ae494c4901106539334231e2fa36889b8a4461b7cc5e9f87b5ca16a83c69446347b264a8f9e8c8ccd181885617e10340097794dbef6f99099eb300000000000000000056e2fb3a8fe016d9a830e9a82bcb6dc827c616292769be8730cf142fc0b47f204bf517843fa58de10340097860adddb8d94735b400000000000000000d5711a839333257c8aa927cbe042c26c37b3c9b773f8f3aacc73d1f57af524f715e07326d0c2fb0a1e4c42b3567dccef88d2b4fef27a103078c25bc8dff7876fcf221db4fc07df1a31ce71e6f8356ce46f5eb89173702b67cfbbb3dbb19014cc40b1564c2369ab3e3cf506209e6ba1f787a316eb968728400806d243fa65e81a5090168e8278821d3af5f7da46e61916bf4fa5bb9af18ca9a608af86402dc8c3a874b216b4b6cdcfe5980076ddf5348744147e22f3f69687b71190d59a8a052414c054e140d9f7e000d8fac299de54c855cbbaa04dea81f8679b9eefe5a660ea9cea1448526254e6c0284f1f3e0a10113a09e19d17b0525e0a0e594d7612b56f13eecbeddc0adfbf800616e64726579000000000000000000000000000000000000000000000000000c24752fcfd4ac2cddbef0670ec243428e7e164e938604f7f47357efbfe128fe58000d8fac299de54c855cbbaa04dea81f8679b9eefe5a660ea9cea1448526254e6c63ff02ccabb680ddca766f1ba013b2768ab2c3d9504c44bff364e6f76442ef5d210134d6f5fb297c51684cf82a35fb393ae41c1de1d27ec6c5a6086c07ef6f495b4ce3ebca098cfc74010df3e0e8c523cb58b0358ff2024aef6dadb185f6a21053bcf18a1635fd0978118d7d8495a8988decb33fb8cba729851ab95c8d6ee31c057aeb22dbf840b1b4210134d6f5375e22fbeacba0c068efbc4c3180ed573e0c176ca785bd2f59929168a16e21bc210134d6f5a3afe1021ab9de7a1eb92ff53fc56e9bb74d9c4d6ccad3721279cf7be25aa7f1210134d6f56970aeb19557f56a24413cdebc45d6501d47a158f0eb8ad3d30ba80e0632cb1c210134d6f58a509697462a5b67f43dfcce0f8881360aabea37cb7ec3a912409b35014df1da210134d6f56923362a977896d65d1cece561eff140fef390881dd3da6ff21fcdaa3d4f57bb0978291a544ed45ab776b99d57e736578e057111095d78eff95e576e7b0410c4b6b4210134d6f558b089e4a5272f6b73efb78132b8cc0c6284bf97a4132eaefe62a04c61fdac62096e80e94eb530be567521ef885cb526044a557cfbbbfba6d20d20e2d40e3119094809822790e7cd3c1969ed50fcb9c1ff88d2a777ef28422708bb462c1e4568b6e7ff06096ee5aac98b24322eb42f3114f9824c65e8ef0851608de60314f038577f7851bf040982b02612fb6c312ff1feccd6271288896559dd6fe6514bd483adc6e13f65858e144124390154ee489437feb1aeb3b7ff731bbd654087659df0cd00b4cf8d3c05bd566239b99ff3fd20744934607c1114c98b7ddb4b9f3a765bc3525b0bcea6f7743fcaa2da8c0fece84b1829006abecfd3909a69399622d954713868a75c8db4c7a456d0cc768002f23bb28ac58ce1891e9e107a29eb3095585c987c3902089a6340076426ff9ecd320464e708509fa67d77538cbd0cabaa7be116257603f60a06329939410c0e5e79f5e2f11269dbd027d325c4d7bf8aaaa8335c4767ea98b3521619be82bd8749655dae6269090144764501785aa6ddc44a3190c08dc84b2b33893a382cbaa5e68dfaab9421494b310e09fa2a59826362224e205cb0554038f2b6f3364807bfcbf1a0745e04671d0453b42ecb26e45102f0aaa320700c4543741bbdc622e69ead62ee6de1b8dfee3dd4a5e5fbd284292d031230fc541c71c095310c40f9ef7267b03b93bb5c1680d06cb0b22403300f18bbb3eb6b7b904fc53c8782d45766d93d5102f0aaa308ac09190123ede8100e454e65591c11ec548a8cfe81542d01cd0680c49ac356ceee64e954e4a11b3fc689bbb8fd00001416625686ab196279764dad503d0eccb0c5521e58f21dc0542f1fe81225c8a9fb511f3a0272051739607639571a923ca04ee186b9434dcef21aa126b5fa84383faf560e7b837f146619c16746ca9bb09cfbde39571a923ca04ee1dcc86e23f3f2b522bef635fb0e0df4b3bc1cebed73b901606063dea8394da8c1310e09fa2a59824fa33a86aadf7c1df79db101972087bc753f1be3c84bbf0cd92a574902953ef2491d30b2a70ffbd8455c0579016217cb5d155d7de03e235a50aa55bacc56d22cb7cb045a4e58e6b7b20c517f6a64ad93df56754230447fc7baa9c2a96900f6182a329ead79be742a825bc4be5861fe38b8da50138b59141662307a9d11857cbd09e0499e4e0cc6a8230aa4d1c17cbaa7ac738eae6b2d8d930a2cce44de399669e54905f68e8131ecf800003c06ee86ecc9ac134ad980f1b5c1f2f4e422282b45b28a6b754d7c3e738d8d6c399c8c8179ebcdc8141b52fc9cc28744a24ecacf711cf03096b83a4d0305788560d0b1535a44a7ab31b5e620f48000d7a06249a7fa8a3b473c5fd80a4c0f11044bdd91232e53552ad622363a6575290a01f1b16d40f1f0c07d83f7b6b2bbc4f951e9ed4973f2557f598cb67d24732411b73902ceae3a975cadaee38a0582c15247dc764e59a92c52b85fab1b845e10c70a3afcc9146b94e739390b8141bd6c98c163e2d0127f83b3b134be58bdbcab176c4dfeb0e26c39d0f039639e899f482a620a01d1f65182e5e3cf1ca17d3581ea92e53414ca0f42ca648d8c00bcb784aed9276e39576591d5798000f0320afaffd3f55833ee281fbe2536a28c8622b6913bf9698f0fdb2910ffcfb6a1157704342eef8ec7dbbc2b078e7174afe279138a6a049d22e3702d2ba811405fc93bf76e6fc2ff3462892c754755369ed003e0f6090169b5fe692e8e9dc6c390b119ca74091db0b5295ca02b39585e221f21a44f4aeba1f531f66e7c965220b8ea56f0623bfdb6af5dfe75609d5fb57cbc1430fa7018684c5aa954e74aac0724c1b239a40bea0bd7b3d49fa117363c3bd0483bbe57bf594ec2895be12c7e3a8654f240297ebb94af77627ab3c821a4223ab470d851072e2e145dd96f0eedff7f3132940172708e1cee4fedbe70baa266ba1030cbbab8e1f760f57549771a43cb513d73de202ff1313295017270a59450a7f366362f5e2f7eebe40494e74a785a6e99acf78b74796187cb86cdc3040901aab778f4685f386c5c5ea3bc52dfc054769754c268ddde10db8fb737e495df0809012b3ff5e8cd106d04e81d376244ee9b81df2fcf88c6e636d2b7b180ea759acbcda1313a8600f55531196d9ce6755c60cea51fb0624dffb6684cf79cc996ad1a38d2d894a8a282802f66aaba6724b49d2fc2ad6021ad09012806ece2bd7d1bbc2434388d9fc116df66b3b19180090207bbaa32111f818b3929dc0172708870cda2077c9ac9c7c375a00f4221fa7f9e8c4c268abc3737a2f748c735d57cf40901f654e681cadc99cb500fa8f2ac7f08cbccce8c7e46ba24691ad9777568214100a127194fbdaf195fc7de77374090f1dfeaf34052cc94c7128a6285b83083bfc505cd350eb9e00e3d069623bfd06b5360bfebfe31a4291b017270a9aaca54d619a696a43c45162c51348ed28ed82c143d59c99fc54c8396ee8a085c09557b96ed3daaa0ade54239d7232b44dad0ed4d962ab4510d58421004ed17aa7fbe2165a7d2284abda4d478d87ac6303a9715a65214139fb99f2ebef16360219bb528ebd4d22b0030783362313233363362653839613939646339643533613231646564666566350d034557bbe4934f03c45519a0ff52f5a497f01ac3bd253690921c2a64781d2a0033653065653138393763000000000000000000000000000000000000000000001da9254cd8d2fff9fda63d54fb2bbe953d59c7ef95557fa19a56ca5346b05e9ca15889d57d00a7f048ec8f9b0863a8ada480970daaaee71bbcb86efd735bc7ea405b83bf4308f4b44f6dafffd131e9d1730eb2c4c7a15889d57d00a7f048ec8f9b0863a8ada480970daaba359a380c7456595d668d47f46dabc157682f799c22f5f3afd06476612c066409022d5bce8cbe0600a90a8c84d873d2fba21d264c47c256a5bf715b1c1e7463f8f6a1f531f66e7c965220b8ea56f0623bfdb6af5dfe7572871b5ae1d027d04b555beaaf85d53ee4a18476e0318eff8fdc57f26fcedebe3131ae017270ad41b74a2447f2d77320b34ea5d3d75d75c306ba2e7d734e5b0a09a5052a4b5d610901df0f3e973337b0d8b9799114a098789c4da04171e195ba90d7568866c1e274a80901a5aa97f3c19863c2bdd411a086fb4984b0a9e0d7efdbc1b38f5a930e464c77d20901376c8491f931775924dd1efdd74775997bc0a9cb4017c3ff23195a367c5c09ca0901973a84de944907a15494a4f9a1adad097236976846da1ba1634b6b4bac5cf04d0901c64ea730e13fabb898531a491ec81ce398d17b79db5369b37f6b772dde24ab2da16dd28d2e86ab774d635c49dbe7b8e968839117c9591b97a8ea780c1d9b89eb38dcb5a42e623c69c253d5ce70ce8c7a872492337b0901245d40f6f23af64078a077e011b37ab530f55aedd72383eb27bd33bce16322320917b4e0ce34ab509148e6eaa987880a9597b499f8c73fd2bd74db39b6cc1c0d3ded4118f996ef63c57fdb2a9efb395a68af07ff2e47fe3dee157387bd578f45cb73afa03ec7f7550dc54e0901b9479d89dd1a68854e9faf11bb614ca02191093b5bc699c3070e8d247a66491f09018672a8c4526afa668654ddcf70079e7e6b45f0707255a99a03d8934614e091a409011921ef425bcdf9cd58812a5917ea1deaf90ff5f5e8e63e20512e4e238675788509016d1b4dcdb4d3932f2870df6b11264838de771ac0180ee3a5a11cc163c53c93210901afd0a09a5acd7d84187eeaba5e300df8549f0614aa36a3a9243880e0e513ceb30901bd61db36c212589bdda9ef04dae799c6aefc8c131f224aed9570e79389cc9825e103496c7da868239584f6637400000000000000000000000002ee065a451efaebc5e3994ea21d369c2294c5c03011d393e08bcc75a836343a1b6705eea1e4c42b3567dccef88d2b4fef27a103078c25bc8d13d03490efbb21008a5a29b7e897f6b7f4408d5ef8b75a37bb440d4c8c9e951fa191b93e6d46ba99bd8170034441e8ca52b4608bcf8d3f8786f79d6294053182ab8f289eea1c3b8db149d60768b72c85652914b3c90901f7fa006eadeae651bd0e5865477a0b03290d29cf39747639e9f62011ccd3304ca1e292f74d768bcdcb6e31146ae7ee34f337b410782aa685f143106ad4efc1b850910d465b4cda558f57d155bdecc76a1c145fd36c0901ebf6d85d3052748c50c9d8b06ac832e4a641478c116b6a03260630fb13193587a1ba13e12a58a7ab1fb1148f73b867ec5241f29fe76e2d34aa53159cae4977bf128d14f34c92b58f6f2fd748a0891b0c05656d1d8f09015c4bfe61fbf8e19d3272f3aae8a2a24655a53644eb9e890c9d351e6a5c0e9a2f310609017270c441fda435e2b1064d9be502d79626e2353ad57566466b3cc7f53f7cabbec6c3b50901355780540afe68fdecdbf94c52144240270328e6c02f8862c3d383a78d8dd867a1bb520774339288a216e5c865ffbd40c5e4aaeefb4d49761891c7a77fe079c63ec11b703dc7879bbb438527c8afe9cf3807db2e4da1bb520774339288a216e5c865ffbd40c5e4aaeefb596a03d8ee7aac8e5ad75a5e4e506f403269c1b91b63e3c5d46d168d0650f281a1bb520774339288a216e5c865ffbd40c5e4aaeefb42f18d1a8f4243eae476c04fe3ac7f0b216a20828b508a67be2b77570fd42eeaa1bb520774339288a216e5c865ffbd40c5e4aaeefbc74a076ef5fb3cdfd06ff070d97623bd1e84fdda6e0dcde19c256bb19fcf3181a1bb520774339288a216e5c865ffbd40c5e4aaeefba54f315e846b0458c0d91a0914c21be2ae44d43ad0490c54a855bf9df11533b3a1bb520774339288a216e5c865ffbd40c5e4aaeefbc0f69bc0e35508dbf1a0e171ee276e91366dff0dd7c456f56c313c0fd177edf0a1bb520774339288a216e5c865ffbd40c5e4aaeefb65d8b9ac0db79e23b99df5b2f13bba1fdcd76026be21184c41478af88217f9aea1bb520774339288a216e5c865ffbd40c5e4aaeefb6a5eb06b932db3b1cc92117badea3a6200fb07f0492a166f971c9211041886a6a1bb520774339288a216e5c865ffbd40c5e4aaeefb8d61016ffff7efc45643fa4b69d6c4955f422d85e5ee2f1cccce631087bab6ffa1bb520774339288a216e5c865ffbd40c5e4aaeefb08f8856a066e7144fe69c41a7995492a5b5ce9abd9c318ef289d25a5b957ee5fa1bb520774339288a216e5c865ffbd40c5e4aaeefb5176a67303708c265be122ee529f67160bc379f75d60a01927f9fe1fd6053641a1bb520774339288a216e5c865ffbd40c5e4aaeefbf0bea67d6cdd398644aff764f2f27da9dfeb0f9a2c514c3cf958701bc2b5fe67a1bb520774339288a216e5c865ffbd40c5e4aaeefb8c7b7c1cf7e83fe2dfc2900da37012db289bc377936b95e901a7aa3ddc8480d7a1bb520774339288a216e5c865ffbd40c5e4aaeefb1eceaff77063a184fade54adfb5464a246f2bd4c98444788f41f79dc6b37c9c1a1bb520774339288a216e5c865ffbd40c5e4aaeefb01a1943a6d8d9f9f3789186698857effb23ca8d0b888ac75e928b8467a7e9911a1bb520774339288a216e5c865ffbd40c5e4aaeefbfa8bb717145f1da21aca96ce33a3d91654f718cb2e579543a49ec3774b9dfd75a1bb520774339288a216e5c865ffbd40c5e4aaeefb1b0e5e4cd573017c9390862d00f0f5c6795e84c6f0198da6c9cf615a87ca3051a1bb520774339288a216e5c865ffbd40c5e4aaeefb171a955ba6cab70918529513271b49c34c8274bc506abff15c0dc5907fe2ca7da1bb520774339288a216e5c865ffbd40c5e4aaeefb1037458f7f6488a46eacca0470cbf92b766ccaf851205427aeb915e12226c752a1bb520774339288a216e5c865ffbd40c5e4aaeefb07c0a50039dd0ff46a7455286a3dcce81ce314e8d3a71798c22b9b592fbf9520a1bb520774339288a216e5c865ffbd40c5e4aaeefb18db98786d3c20370139f00cfd6e47df60ad78cc641cdad843a52374b9fb9d16a1bb520774339288a216e5c865ffbd40c5e4aaeefbac104243fcfe241e9b99756835733151d6be0c21788c0feace85bfacc53ac7efa1bb520774339288a216e5c865ffbd40c5e4aaeefbe7902bef820717e20f3e9dde8b471a8bb02824f99f5cb867d67a9ff67209b1952925017270bc16ef208f068ce1eddac16d1c54bb0bd544d6dab4ce55700e07b21626193a463ba1bb520774339288a216e5c865ffbd40c5e4aaeefb3d896f38f4692887f1c8774ed731d1d9d4e859794c2c96a322666bdb815a2a9fa1bb520774339288a216e5c865ffbd40c5e4aaeefbebb94ebbcce224ce31b328f276d7d9eaa647792eab9fa1c36edee3f740bfd0c0a1bb520774339288a216e5c865ffbd40c5e4aaeefb1802ceb556cc7c5460c38700c8e6a75493f0a7503a9b06d463c1bdf77c89b0bea1bb520774339288a216e5c865ffbd40c5e4aaeefba7266978a78adaae9ead48421dd69de9df2c6d7684e364e03811e788c584de59a1bb520774339288a216e5c865ffbd40c5e4aaeefbb57d38223d9e1b37b82713e1fc23ff217ca62bf6027f66b53947a326dd6a21a9a1bb520774339288a216e5c865ffbd40c5e4aaeefb0b3ccdd0e80c2c34de3431ce010481acdde75491ddb14879a77751e554acb8de092578b57d910879d9caade8b3a33495d399a0652dadb7ed7a7b73181014c9ab6e24a1bb520774339288a216e5c865ffbd40c5e4aaeefb6f9d2a8fa9af9476646061d611db87656c54d88f867ec9c92e934f8789ef8ebfa1bb520774339288a216e5c865ffbd40c5e4aaeefb16d9ad291e969981654ce74bd6e25bbf5b40dd14a5fcb4b607a2cf919b296ec7a1bb520774339288a216e5c865ffbd40c5e4aaeefb2b72b580d31ac9cac61b21fe863a0bd03a440e9c435f1421acb3eeb121f23c04a1bb520774339288a216e5c865ffbd40c5e4aaeefbfd1ec5aa09ac306dccb90f6d8c48b84829e95810f762dd8fda552f8636bf29b5a1bb520774339288a216e5c865ffbd40c5e4aaeefb56b8bffebca989082db3b63f6d0d4dc8b9a3b6c22d2bef3ba625695352f0d7aaa1bb520774339288a216e5c865ffbd40c5e4aaeefbfb22d584b37077fb0e3a7c2606116d37dcdee9e328689552b766d5376c642d9aa1bb520774339288a216e5c865ffbd40c5e4aaeefbcb710ddd4b7aad8ed0d7e6efb834cba60046001478c514913218aff5a69b5007a1bb520774339288a216e5c865ffbd40c5e4aaeefb89921af1967be2117410f71d112ade075b845f61eadfee0111033a99ccc235553913449068c74e1e223d539e90ac2bc6220ca9f6443a09d3655c3fde709556db7817de6ef4744738418ac7230489e80000b4ce9c9eb963931423708cb835240a3151a5832e2e50c99110c603b2c853d114418ac2604b79e84000b2ab8de1cc9ee2569c1697c6e3352aa4e6d4aabd793ef28125c0ed3843047e762165a7d4aa2bea112ae66b2e727d0db5b5140f3cdbfd7c8eb8f5aa513d9c1962d95d9c25b609019d48a8da07c2353e6058f11bb66ee52557056f2906baaee2b894e3f8dcec365d2165a7d25c364f66e1b21f486749b1e148227606f76f2d8ee8d963aae07cf4dd28e4869c8b411caeef0c42f8cd9ed57f776567f057c8135efc7a8515ed17da7023a4c52d5e43e20f133ef54df6953a03832dc6c6e1c9d6178594d04828cca1e7951e1fdf66bbf3e2b2435a72eba32e74d49b60e6a54ce10342aa4af823dc201cc1415c00000000000000000000000000abf796239168a2b01ad4e14f6566500609c7fe53c85e6e92152612c38b7b40d255a1d6193b4076a4fc11eb4bd08c1e75f5f740c9f8bfb44f5bc02a8763de05f4597484fec69c88e10342aa4abfba8c6a99bc1aec0000000000000000000a595ee544413b8b68f1898302540d390be18d47d858c75f72fdf545ad454c853973995fa0e82a2123c34600ff2f6e50a29c4439a87191b1eb816c117a32b247612b71871474b663d971c5b141107da255c8e685fedf35a041d4a1d5c99df2bfb259314c69f1dfd13c257c22e5e745960fbf53426500e4c42b3567dccef88d2b4fef27a103078c25bc8d000000000000000000000028e172f0e409be38895a9ef34397b698a9731d31004631465e9b52e204afda529ce9010000000001731953b7d3c5c87795d437da4d6adfc00fec1051b9a80f2246d5723dda6cab77c545229f2408ac26fabc59fa401729343c245c65c7b055e901000000000173194f88bd2a55b5e3703c93e225c48102e12bec29383591f88dc7bafb3d4a7234856f38ece5c6f88c0908388d302febdb5cc7ced48d72a1ba01ec38a66718d5b4ff8daba8849487a7a00465d7488024373329ba021d1d190a06eaa98d7f84743d1f1dab0f2de57f8f47b7ed0901753d5799a4a4fc672ca0912833a020abc890f0716d73eb02e77f4b355866313a1902bece7c9c0078c4cf93ad4ee4f43327bb69be94b02bb675c60a9585d227c40dcca0241902ae62833053cc2c5c39b48d3e9ebb0012370c44bf9054abe3a501c34346242a69c4601902beced946ad48529ebf9aedea8ee5db42b3fa3bcabdd2072bf50cd68c96c315fae08e592820667cd2031b20031600c4da16a9657008cacf14c2847ae11260441becd76211b334fb0edf1c552bc6f27a20965afd78e3c4be8f3e5f11f284b12f1f7f0672a827f894123ffdfb1fcad2f5fb173825ab09b3d8bff691ba3dd6559a0392d70b0d30e9046d82f34353216f1e2ac12ed320643f7c2da9b148243362af336b83abc9488a4388fb88bc040759e3c5cc6e0904a8dd7b74600b29be96190971ad896c1453eff72985c255367f1313d60e18e8ffe103471531f8c76bae8faa665c000000000000000000000000001f08854a3bb5dacaecb75d1a36a7bfec0aedc9d7f05624e968929242a52c4ac05d9c454101fa42feb87e4000ca0ad7bdd8bb43b89c702d2fd5514f8be7b1898cba0d67fcbf069dea521e114ea155e1e3776eda96fb2fff8faf9d4f5140fbb80ef5a416d1015bcecef939d3b7d4a2800c44b35a889d9aa3f40b597c16c9171102f53105610172708e43762a6ee49c69bd16b6cf7ae16c27c370f8e23fd0b2bf93966e3427c21b20a6090106dadbfeba16481c5744f8f134f7c3d612120a43761bb37c717f28ab317d9d7ca1ce2fcf732de54abccec639c80abf7289359949c64658a97ffc853ffbdda796af853b3168fe982dd4889896fa5a518e523f7402a2312090017270c3e669dd786763aa37421292a0c08c1145001ed5de146adc70a9eeb1a8cf24885d0901a77bd1817593f7ee572c9cf5b78413df3d20ca6c5d8884b02dd45b5f62e427b12902540be4009b20c38a424e34c8081177dee705c9744a7d8fd98bb683e8dc638a5e705c92bf0a01e2cec0816002069e4e85cb459d8dbe18f26696c9f79289b8d88af90c1742b9e10901bd95e96a7550edf90860c9d7140a2023da5ef027a9570f9226e2e50449b9b2aa19090cff96cb98966faa0167d44fdf3b4bd93e736965baa75fee15c56a6187be5843d36e0a017c63775e6c657817a67ba766c6309717e6eec102b5b4b4bd61c457920b99324d1904869d495bcb48e202f136aa6ac3cb1a094f5a05cc4a88f733367911647d3299c64f3c2165a7d2552c65ad4254a94fbb3ce026c2147fb9967f4fc764de7c25d7d8a2e6ef897625e16101aebb54087a76d51fc7e6a51920fc66c57f466aed57b20b8a460c63a6012cf621b642f8319b083ece2ae507711195832ec84fd71fcf06b7b748dff5543f50f5f5292a4f5499343d3a7ef6c2d1ba7b6df7501450508e9ef2d5f4ad2165a7d2283aebd910946f141c118be8149bf8bcf62d157d0f22004d7b53cc22a6058d2425612bf9ae7f1c2c032659239e19da9916156a2339e2d4e5f045f0ab60b04813ea67ea2cfd27c051a56163c4ff80590104c8238962d01a7ec6ce8d34337b47ca16b6345201371c3fa5d6ac0f3943593b9c7f3c9ef582e369c1b349028a1d29f79dd84a85e40c4796d0d55021436f3f446671708c83912e67fa209cd15326b6c58c72c2ae114d1ba3ec15c13ed76be605d23e88d50f6838b5e7a024fe433e729b4070a15cc1b6b4114d1b4025a1e4d346bd41181a71ea114395c38b7c4d24e73d51070ad3751057ca5ff879c097ce7bc90715b34b9f100000000099a67861ca69c3b977e7f3b315e3faea4ea570ca45e6718e22b7d124534a613e0901305d95d7be41e1cd2cf384ec7a3353db95e00d7515daf6a48ac0123c413f4ca3a190973213e2a230227bd7ccafb30391f4a52439ee781a6d80a0556a79a2d21dca0931e9f21c3eb6dcb7a3ec6f17b7f09b8108fa0f79c097ce7bc90715b34b9f1000000000eca3ddbac25f72694a0c567c640b70fa9c499909aecb82b72c59c9f76eef134779c097ce7bc90715b34b9f1000000000fd03a6f66e58d7a9daa021d2756b7f7ac5022af4b1cd0008d247d96a30801b300901975472e1b2c86f3957037a9bdd09db1335484e9fb8a60d9558037b2576652a6f090106bf067876a8f66a21700ce3e6334a94876bb5451aabb1c46a6a750004bdc7db0901883a78f8c7672d8e7d4554d5aea3d6d25003814fac07dd8b0a23acfc1dea0e5f09015870af2371f8a10072cfb370347af6c04b1943786f987d7b4bac4b8a48480344006465636973696f6e747970657468726565000000000000000000000000000022b2ade344ebcb1659b45e3c0bf2ebacbe612d0d9570fcef1dcef923db2b8d610aa1ae661e1e59cb4184a2428eac60a4cd349b68899395e44ca93f38b0ca2b4a709649d661ed48c531db801c35ac41067e5eb04c551021678905b17ac9afd5f20b6f465598124c2e8d237fe50e6a59bfce72e8126a032e46940fbd006339c85dfb7d0924617c632332ad9154268baf776f0b53de3f31e633adcd23cabdcc2b251ae7456c825480bf2756ff3b5bc49197511276744f2b6bec64a4b23fa13b12363be89a99dc9d53a21dedfef53e0ee1897c5f88e55ea4367f9f47a13550f302fde05a9f865c13d05892136f7077baf2cdf5006368656e7469616e72616e000000000000000000000000000000000000000016f5e1e8435f8d96e0ce854a51f6ac65a50bf06ffd31f93810e3702accb55b2180007a797a7a3433000000000000000000000000000000000000000000000000000c3ee773b466b095628802ca350fa028b77cbc318b9360d4a63d0dcd4b65d14c24006339c85dfb7d0924617c632332ad9154268baf776f0b53de3f31e633adcd23ca50f3831f1ba19d17c05436272f83a4f826567b09680c3bd399d4f879ea57e5880901956989ed47aa8e1ef6d8e97a3c255d055e120da96d8e54f9f0368e43f26f8562090101574b5a624c171177b8c8bb3eaccb931ad3d1f891eccd8ddfbcc8ce98a4da31a1f9c04952c18c3849d120a490ef8bcaa527bfe61c1a345745ea2cc965a83b6f17f3c7b69837ee6806448b4fc435c7750b4ae075a4a1ae661e1e59cb4184a2428eac60a4cd349b68899344e997157439a8c167e93ed5ddd3a28284f2008da0635d80cb766560ef029255a13b12363be89a99dc9d53a21dedfef53e0ee1897c8fd46efec9d2e62e83977ca9b5967c73d4bf50985f3992ee92a9c3aa3624006300e268d904524e853b5efffd4b0e2439a32e6348b5c7bd7ccbbcaf48296744e21c8f30ca4e2bff9158d7f4c3afeee89fb03373625186ac4ddd520eef9694068b4921678905aa617ea25f556d2678937f210781bf23e7ade787a7e285a3789096a8e82c72029921678905b7b987e84c8dc0291f63d2c101b9a6258c63cb2365906e13a7f171c037eae632d500c3bc320e8435d10ddd2fb260a29d49ee9bedcd7dfa03033c0a3a89e574396367581637087afece1a19a814fd827b6292f89a95a318f1e92af3a28db449e2392241015bc0dd6dfd8c90ef4c292325c0aa7e35dd0640d60f71afb33c4aac671f05c1a8d80234234bf90600516d595945316777557648765377706f426348543273734e3776614550564c7ae4d10984c36fd076655da86b26c097e6e8d3c87a96d699067e624f417ce718f9004a69633866714c6e79334e4b5074000000000000000000000000000000000000a7a27987ccaf8e9dff5a55936f9ae0c19f7f9b8b2401c54aa5bf68fedbe4971a190148230d547ccdb7ddf4b58f7a3c08ff0cc0d885ec8524363ee235f0feefb67cad1dbb190148231d6975d62ccc1477d9b2601e8356aa12ebf91a307287e24f7e17476727c7506fc1412cac000fc50acb458c0905a9eb1c50e95bca7dbed827689f6e1b12e1bc9e3b36c3704bc4919b0c8375463aee3a1383af393bce0d501e39007a6b53796e63000000000000000000000000000000000000000000000000000cd0428ba187cb9f142510e53a65def1bc5d3d3c3707c6904427eb92073434ef9a990148230000000000000000000000000000343992b96fc93b76836dc56f90139044f2f49eda76a9af613d4a0ac3cf0d7d6b7fd7a165a7d1fd00000000000000000000000065a7d2572df94b93dc1881f805571d428b2fd32d27e2323209356e1ddd4eaa10a9be7c8f095d3751e654b7c198c25ab4f21d292b5f0cbf4fa4119e765fc0400d2edaca6a01fa1901482325ab4a8739df21019d437ad3b1da357df245e227191238eba6a8ffd4675afccd0901fa65cf12e40e68e14da939e14c40a4388b478addbfe385afceaa0725b56b00ff1901482215764db6192419edf0332692a97bbc67f1a377cf8cf8b7cffa9ae1e35e897c98a10fc50acb458c0905a9eb1c50e95bca7dbed82768668fccaad0a81b4bf3d80f177559656143dc6e3c0d9557b2a3827ad51bc098900901619ab2ed6bc90baf1f3781e95c46bd450a1a6ce3aefc6659b0520f74ba5cd5eb0901be5a1c397520d15a1903602aa7616ed3a03103541c37b55aa33db867b4d79cd9090188bd69660b77dc6d9af8289766405504542ae13b0317a5c27482295d820bce47090156b465fbf6f88f56f6c18e6214fb722f625c403ab840cd9cf94ddebffa8c13cf09010a61f0aeeefa5c7fdbb23a2c4070466e46763b104db2ff702ceeaa526d5ec422090183b774973bd02d3e4254f70b05628888b84b9a3fd6a60bcdad2baf7802f532640901505ec4bb8d67cd7083b45738bd153e32394d5ddca1f6aa240a8db80d645f2c1909018befc904dfeacef2ddc97ae127508f69c4d83f9c6c39fd3933577ddd958ddf7009013f31ac47cb74a7e2230bb42a7e9ef5d3e1de70348766c0b5610532f4977152500901d3338b79f7892effff7cdc3e8e51946a1aba46d84a07b2f6060d649da145ec820901971ca6cbd6d6b80a5fccd17be6bea4d2e9512c46319d12e83d6d64a74add77a90901cac331832db9f9c60adf83d8094f06ecd69898ddc8846d2fe5ea84dce41a69e8090105c3a652009a6883bfd2c2c38f81fe6d6581bec21ec467ba61b59c030d86f6300901119629878cb581a5f968903b6b7dffa30a100bffe436696fd90c3e4faa5a06b30901954cf8820647b1c6bddd396464d1681bd49c9430925857c8946bb767796fe5e7090144d25ea459d16acbd039f579e73bfcef971664537addbdc7ddb7ca8bffd7f27c09016d4c1764eb14052a5f29c22f100508bd544cf884e26612e6c1ac6632d29fd3230901eb25a49955253ac58390e4941096798ec3c02199aa508be327c45d8a762868c80901e5d0b4c6a2a514b381f9e802e430f091c0b9c77fe76bb3d03c59fe7a63b4d2d40901b6d786c87a4dc035f443301606ff7fc57650ebd54cb2903e0a1596610fc4b49109017366a1fa9a6951ded70497778c32456480ede1089df6fe9e3118a785022a92f4090150da4bfbcbb59712e35de6548d33e2d11819ed14ac03da571a359715099bd9770901f756d0ef624437d05d5a8d605add990e66eb1f8c5859b9199195fe671d43d9920901ca6fe37b352384645061e9d45b15f44d969fd7280739b805bc1d475d663c3a6ba10ec9a2b522bac8f7fe0cc80cfe9246e0194bae1e37fdff979d7bf53414da78574b90a7581bac6b0194b8d1d1fee00f47fea32eaa09015eb5edd2dc5496b52726fcb654ec5d805c9bd869ae185243c7c1ea240154d0385105fb99239130c7540000b0a451a12582e154eb28dd91226fdeb290fbda61c52aff64502b604949b587094975870b417196e00000713da8907a81ac64f8e0a1b5ce8d59654930fbfee44f0a3838e8c6e17fc106ff4906659436cf28180000e5963e7669c6a4249272b3da49ba4740f13c50b2bf22611c32e832941cb86fb951037c22c10313bb840000aac95447aa398f9a3ab7735fc8d33bc2c04727757acbccbd07f3c1f4286ee0bda1cc2a5ef9fcda02c0a601dab0bcb12c11f477160d4bc6647e3543df5316447ad905d34a9abe7d2ad8442d7545f200426467a1f297311a7e0172708aef01104090a347076897f086043a16a14b78910cf2d3c32fd4c4a9598ce1f18b0901f3a87ab6f904ea5fd78442c458fc7c078bb3d9b95263c040736056f1b9d2f3e129d248afc67dd47bed58d3cda32e551174357f5c151372a10d198383ac75b711a46880f5768021017270bde189b87f3fee8c92f2967e884d4944e699a6fcb3da282ee95347d10614d3d87029d248afc67d1c86b97eb2af334dd9449c44d4176c2eb0b0c1562f8b8001ca85e2013ae9ff432101727095a2723ae59d2cf033f4ea85dc534ef36ea135996b7a1a67cfe0d2c617111133b229171548cee3575244e959dfd8b062f0bdb0ce966bbacadb7a22edaea95552f987ec3a337909a1af5aff535e6c44c6872ffe7d0295cb2e17b8da7aa178e64ac9ea1c7dfcd91b5d9d5bfcd0d8b5a9b7daba5fcb47c035772d1a41a6510100e1cd726a5371e6dccca000edcc1a371fa0d90f9a06a2bc26ba9794eb57acfad1cada351f18e92d703107d375c690c47452e035357ffd14733049e94181a9f6e0209cbf3bbab10fe5ab2833e9e42102510100e1e9cda064338891032c4370e8e9e6be50bfe4310d5b681f6e203eacdbd0969c3781156d347f83dea1281aed00431ce69b7576c010020127ede0a62d227cee221320410d2a71901f70c4a55536f267a6bea138de018317560756c7ebd93107d375c690c4a9f00649661ae28d96ae31a8a54cd578c6c186fbb492dfe102434264eef5cc2a09018adea8e2b681a6ab31fd47d334d4b0f4e646f9f7e7bb45073165e4ae5649c7c829171548cee32140d71c7e852b7767f7b039a77a54a6b2fd5d419fcd5c95174d08dbb47f162f09013d91c91879c38d8775ffb89ca0cb3768276db3f99f48b10c3186451f79e82f0a31168e017270a9ac8618bac3c520dbb47499113ec1624e6b541a49d48a75ec68773bd25a060e40a1866f4746a88d44caf295848395b7fbeaec7499a3ac591dfa0e0b7b98ed02c186d965ecf1e4057f301903d8484e3866f45fbca9f70901bac326a65890c5f11c0d6355a0e49c9102479cd64f739090f49d00850baec20da10ec9a2b522bac8f7fe0cc80cfe9246e0194bae1e6c740fb84a4beedffb30c9fa0d925d7ef84764dbb87db7b931e4af18557a98c80901114c23711e05dda8e74781acca208aee4b7722dd91204f1114cc24aec5accd860901dd2bd93c0630fba193ac42b81c4371e7bc380c27bf3ba362b0fc3021be1195f5411bc16d674ec80000fd4954900d3566366739cd302f26d8a7855f9da9a6be61b4078164080e47edff0a011656390e7511fc7214ca2b41499e267ac084d3cb0c1fc18688bf15226080c530a1ce2fcf732de54abccec639c80abf7289359949c6bf1643f8ab52230dbad3da38bef7aeb8a4aba6d36e885ffc4fc82b4714ba22493126cf017270a308954562b35cb180e1552b240104a40f0c9d4e06e380b75b036b72cba0b5f44409019ae345ecf54d6f94a9c8f81ec163496d4373cf1230e3b7aa28eabb7119d61bc6a10ec9a2b522bac8f7fe0cc80cfe9246e0194bae1e65ae56dd8e584e9ed2585c4f28351f87f2a1df4d87eb0867f34863f543d114660901ea7e11f2f80a9b61437ceba0e1148b580135590bed48359ae88c96755df10ca5004869207468657265210000000000000000000000000000000000000000000012220b5a08d408c81d4aa3586cf0ed792344258d6ffc09d925df33ae8cd8d5e71aa1ccca484b4191303dddb9db60ca1120ab667e22a2edd861cd3bbe1fe6e6941f688f26b146e10d141718f2f9f6fcfaf41df7de7b4d3102c2017270b1197b6e2ce618e80dd280d6345a638954653c8321a009ab6c49426654756ae3f80901bfed4f95d8e980c3d7b5bf17f785fdbf5da15a04d69c91bf7562690a1f91790e513636610d5ab516b339802b4b33afc19f559c53b5d8613002def0df9375d73e3a96bf581e538dde058a48310746a5288000ab9f3f322611e276e1dcac278d80a428f6aabbcd3d0ab5035717687f960908252165a7d263393b1dc697168074bb4c0d2529a6a135ea56af00d40a5ce46b18d3905e32cb022165a7d24210b8d1f9e678c0382052298d7193805de27be725b37a335e008f0349198834fc2165a7d23d74a542a2f210b49616aa7ec250380a088ef02f9d268ded17f1a9916ef32db81a2165a7d2577f6a152944baecb816b59eb528f629792b76edfc52578630408c0bcea87cc8be51363460da88542f095680fe991face68f0df79fff7147c93826b674302d0631ea06548eaaf0354c187ecd5983ae815f9a9f658d7e167a5ab7a99dd994e2fe68af98060d431d194f2ead8af2d4623728d24510db693cd009010bfa9af0f4411b68b0320adec93a22061de4b75cd4888ac8eb022aa7a2b3bab3310746a5288000343b413383c784103d3a889b37d650264b8382100d8b7f93d3bc26a0345f55472165abc6c212478aa32a0e0310fef28c61f518641224cbe1212af84a0a04d5dbe3c9e03b4c0902336427c898c51efb0ae22856f1592ba78f6e04064a44a6d051c911103d42cff409012a3bb333eb2a53b493873faebdaaa21a6287b404e35329d0d122a4bfb260ca635983ae815f9a9f658d7e167a377ed9d9e71ee1b9a987cedd26b923314c604c92fdfb0ed4decd844d6db17abb193ba41511762252e67214b042a7243aca7b356e1866257d3dc9a54e8a7b1b77a1b6a2b9a1ba13e12a58a7ab1fb1148f73b867ec5241f29fe7b887b4da20a889ea275d10d21517ddc3e62bf08bf8af08ab1aa2aed88b5d63b8090117c7771921177e6619cbdd58c7db0f3166312e82dba67754be39689137f42ccb31260d017270a0b1d9722955fc411baee3fcad29ee6ea912448bc33f1cb5e9dfe619f0f076ca06a139e098a153ad69834a9dac32f0fca92066ad03f4c0cade34a68385f4d8eb9668c756e6e3e20b2db7035f4463d7dbe6406c649c54090120828f81d2b9a6cb7be29c23e98ab8a59b51580592f42cc02dbb13ed8ecb2074313c5d017270b502ba19b831f21196f93083f9a004d4450e8461e0e53ebf5567c78b2dd4d74b1ea10f5ac9d4920f529af410f33db8c5c51a92ebcedb05cd460009010c6d12fe09010013ceee0901069ac8ed0901009a25070901012bcc2609010bc2d4980901022bfe0f0901034d0acb09010c6d3c4909020c5e35b40901084bb055090105037a5a09010b7e99170901095a2a800901054ed0cb090105cdadc209020011f39e09010768505209010550d12909010ab6c14009010be1d84f09010086c3d509010ba19092090200e364e70901090c3e2e090206c0583309010366fb4909010afc0c15090105931d2909010c6d55920901009716c2090206249339090107f86f78090107da6108090106c15661090102f4e2c809020a8d5c51090100583150090109548f1909010a4ea49b09010024744c090108e9c0140901081a9420090100b73fab0901053962280901014c004609010209f9d809010b90000c0901022b83380902080735470901058faec5090109fe1dcf09010c670e120901012dfa460901067fd2c209010081620909010669d82109010c29d83e09010171ebc80901030f9e4e090105a6e7ea090109014bcf09010031626209010c2e6ebe090200ce973809020918234609010363fede090102f6f0e009010480808b09010c6d1bca0901022725f909010120d6ec0901029be2a4090102b22431090103f2eaa509010be5273009010ba06c8609020c6011b009010171ebcb090102f5577509010bc2bc3c09010b6147ce090105140745090102411bfc09010a20a15d09010363dba109010a1f650a09010c3f37eb09010171ebcd090100f844b5090108284acd09010a050cf309010482181709010644d9fa0901068b034e09010c6cc7a509010b9d8a3309010c0f9f1e090205ab6cc5090100d253ed09010c3df07709010c06abf809010b2a490a0901009d281a09060b9739fe09010434051c09010b07a459090109db00920901066b14e709010505acc5090101e41fa709010025847b0904059f9f5e090101cf673909010227351609010937b857090108e92cb0090108f362e809010089fa55090101b5a21909030c480776090108c683880901055152bd09010039864609010c397b3809010b48009909010b16c35009010091b9400901095f85458901000000000000000000000000000000000c12fa3309010c6d1633090101e389550902011681ed09010004767f090106995df209010100099f09020983874b090106402e9909010268f71f09010529a7c709010171ebcf0901097e22ac09030c3e8bf8090100246a3509010bf09e73090100d45e6f09010be525ad0901000caf53090305502bd209010547abfb09010892694409010328b94409010051915109030454bb02090100b4483a09010ba6dd4a09020a10547409010b4ac45f0901006a68c409020596a90009010c12fa34090106bfce8b09020688ab5f0901036cec2809010a9ecfc60901018561b20901059543b9090103dd43bd090100352ad0090102cad1ea090201f3de2a09010afd1c1209020c2e620b09010b9ffbff09010028bee009010663a17009010be52732090104a373a309010becf00a09010c5d8a9009010269cef209010c6c4eed09010c2af1bc090102301f270901003a8fd109050c4a122209010bc8913209010bd4b9ef09010066184109010b2f5ace09010c5be43e0901055117a509010169fc810901079c5d4a0901055a3a4809020bbe57fc090104f851190901022722e609010645e3ee09020a72a2ec0902077b16a909010c4177cc09010c634dd809010c2de8b7090109d69a290901003b7cc009010016a3c3090204f93878090103f0c23f0901066cdc5c09010a60dcf909010c6d5bad090203db1f4709010353b714090102b2dbf009010987543c090201edcba609010a022a4d0901005290c609010b4abd950901055063ac0901055fa3f10901010fbb5a0901045d31af09020c15a970090109c885e2090109581ec8090107e30c88090209f928c50901048250170901012c19b9090105367ed509010c2f9e2f09010c67c0d109010bd990830901063aef3309010c4ab01709010870c3b80901039a199809010a35cb3509020a5864e30901071419e209010536551809030b3ca9700901063f79a309010a85b1d8090106909d4b09010c6d5d600928038cafcd09010be1d4760901022b5c6e090101954d5b09010b1a08d60901027ed3ab09010b91846109010536343d090206ac2a55090105a970bb090100f90aab09010484743c09010bdb6a1b09010126112d090106909d4d09010c12fa36090100e0ebb2090106eab391090101787456090100b527ab0901066db9d80901007054d509030c44979e0901089984220903049b60ed090100b4b63a09010a29110a0901036415cc09010005cfde0901064a8d7e09010b13f1dc090102552eb6090100c87aec09010b23bee5090200f92929090105159a6b09010c6d5bb0090105ddab1e090105e50bbc0901048bf568090104e80745090108d84b2509010bd00d990901000501ca090106c1a70a090201c677bc09010bc2d65b090103671489090107c39786090109f1102c0901022bee22090100274f2909010b9e9e0309010bfdbc290901017c35ed09010543354d09020c5a4bab09010c6c433e090100001fa309010ba303ac0902036440e809010a6fc3f4090106bdab6409010a3a4745090102488a2f09010ad41f470901054b286f090106909d5109010c02043b09010bd099df090103a2f6cc0901038a6177090201d968c609010af01fbd09010698e33a090100e331a909020547a65d0901064ad21f09010484cc42090103af5b6a09010c6d0d7a09020c358c5a0902014fa2f209010c6d5f1f09030014537809020c13cf4f090100ce9ada090307e5b7b40902013ec5b609010192a8f0090109a1fd590901081965eb09010a1e12d7090209d3797e09010c6c66320901062988da09010535e590090209936fc8090105074bed090104e7a83109010c02a8f209010c2bc40109020010d0b6090100cea21f09020c45e2670901007054da0902082d0d1d090209f4a934090106eb4ccb09010a12515409010c6c0d960901064a890c090101d1586c09010551741709010241c1ba09020c3e094c090102ffdd2b090109e93b4a09010a09dbb1090108b9bdb5090101e2114e09010328b6d5090105aadef6090101aa3c130901014fa2f70901005d8bea090106a998b5090103565da809010699234109010b8ab6e609010401d21c09010c383ce609020c0ed46c090100167b8809020679c14609010c6c4bba09010b5f4a9a09010c6d4bf3090107aa834e09020c2a81cb090204bf5d6109010c3aa038090103a447090903009b60890901014c0afb09010c3eac3709010c20d22b09010085f6c109010547954709010849dcd30901058cd84b09010be527340901096c2628090206bfd62f0901038cafd209010426204309010b6891250902052d85f70901012ff29e09010c3a759b0901001b49b60901054462c309010c350b230901000003f00901055251d809010005f8e709010786755009010ad88f2f09010212e27c09010bc2a1bc0902008774ab0903061bdb5f090100b51040090100001fa4090302f786770901071549ec09030395a0b5090102ff90c409010c226f8d09010b542b3009010035b19209010c0498cc09010b9b700109010764f5cf0901004d1c5c090100cea5c8090305a3923a09010c5fb8f809010c2f9e3a090109c53ffe09010c1f488709010bb41db20901009c28c909020c68998309010a5fc4b609010b48851a0901001cb90409010c12fa3a0901019f30a009010b6a45be0903024f3a8a090106973de109020604fa4609010535eacc090206204bdb0901064a754909010086226d09010a6d23eb09010bc8384e0901043095b2090201711b0a0902025e4eb60902032bd0f00901050eb561090101ff7a8c09020551d15b090104889ed40901098ca38c09010b85d7fe0902000627a809010a26aad909010bdc44c80901013b032209020b2a123609010c1f4f6a0901005c85580901038cad360901038f5c6e0901006a995009020a10127b090105bb21dc09050c5b66d60901042620460901000029de09010192a2de090109e41783090106bfd43009010a1eea8e09010aa39930090109acb80c0901045364f609010c6d5598092b0160452f0901084962b6090106405c7a090102318e8e090105f654410901057755e60901038f8fe209010266c62509250c5a098d09010a8c3177090109fe19b50901054ba744090105ddbd8e090101ed3d2d0901074d4e3a0902020badc5090100e00b5b090106f0ab520901002045e5090100538add09010be525b20901006e00c9090103408cd109010683bdaf09010454bb0709010a0dbb290901006b80db09020a588d6009010023e4a10902007054df090104516a6a0901019246cc0901018b717609080034545a090104de67940901012e5dc309030c618e490901008c3b95090106c7279309010c3149c409010290a2090901017f88f209010451703309010552057d0901097abceb0901011f4bfd09010346d38409010a161d9d0901021767b009010a15772009010c6d509889010000000000000000000000000000000108f325c309010b95325909010123652609010a288f490901096a50dc09020c6d377309010b3c165f090e076ef6b509020adaeb1909010c6d1f350901052ade9309010363fc6c09010c604dc809010bdb22f609010abd6e7f0901029c76300901044b3eb2090100a65ec409010bab048d090102288e1709010486d9f909010c6c6dae09010c5f8f95090200cea95009020bd8f177090101932c6e090102101f2009010b15d3f309010a551b10090107e0bd5809010a20b10909010010b36e09010bba99b209010535e1df0901036485ab09010c6bf51c090106f5f04e090103aca9ed09100536403a0901065177d609010010c8e009050307b06e09010b87a4ff0901068a745609010a05109d090109ea9d5409010c12fa3d090100525d9309010c13029209010a2f9f4d090101551753090209e4d33609020014864d09010b59cd2a090106aebc0509010c6bef9509010366287d090107221d0e09010089f34709020a771039090100d17ca20903000ca088090205dd92110901048c5f940901001ac23f0901048faa0a0902083846b5090105615a6609020328ad3209010608c9b00901074ef01a09010a0d7bf409010b216cf90901046dcd670901012c4c4309010081621e0902038cb2f809010be527380901037ca78b09010bfdc08309010b3baea4090200b538ad0901017112f309010bf845aa0901011f4c0b09010853403109020c6513c2090109c4ee7309010c5f916f0901045e18c909010027be2f09030be5273909010ba281bf0902080ef63f09010b9ed9b3090102b8d79e0901071f615c09010c2a8bcc0901042c73790901005ee61b09010ace89280902055237ba09010c6d4d5f09010171ebe609010be5d243090105527e9609010bfcddc7090207842ec1090100e007ef09010b3e868f09030bc46f330901004b88cf09010bcf9a1a090102ff816809010b29a5f909010c014c5b09010be5273a09010c51f8b909010c682d9a09020a369cda0901025f0d9109010b563a0209010873216e09010c6bf3ce090107a3934209010057162009020b4eb86f090107599e8f0901065eecce09010a2fc27809010c6d1cea090200ceace60903054fc61c090106c43ccd090105c58a0709010c2f9e4109010285ffdc09010ba01ef809020bfdbe310901064ba41709010816073d09010b0b3c1909010326f957090108a6bcce090105a6b10a09030c6d5f2409010a4d1dd409020ad1219c09010000002f4201c12c1a204df00805cd390b32f4376da665000c6d06a23a03796834d3fe000013b08e3245b866bd970005c03e2831fc4620b70f9009d99abc33b207d484d7d0009a1139420186f9b1345a0c00069546553901618f0c32a46000ff7703322e23bb3bee000bc2d106324d203399a7000228be19410f2028e39af722dc0770e63e39068363f3f76e36030ee2643a02cd6d124d14d30c6d2cb941010069031e73fdea0c63b6dd3a0167e2218eff000c5c560a3226e34d851900084abb9132276b22dea3000492467d3a1c8fe7eb8cf8000b7e83d5322f2986b25a00092cee483a68910eb86b07950539751a322f2986b25a00058ab7cd323b63d62bb5d00011ec8c3237a41cf5440007684c8332abf52076e5000539584f322f2a57501d000ab6a589324f392dcade000be13447322d4bb60b7000007d8426322f2a57501d000b9b1d6b39057ad55d619c4800e3610b3275399c8be700090c35e03a01ece3cbf11b7a06c056e432a420f1a48600014ea25c322f2a57501d000afc03c7322f2a57501d00055a44f93a3b724bea015c000c6d559c32364a2074b8000097028f3a010639def1c6000624817632f91b49f1af3d03f34004410186cc6acd4b000007ed46c8328d1f2ab4e20007da2f9032276587c4e8ff017b63963232bab612ef0002ce055f3908df2f0ad6e3c90a642ceb32282796de81000058240d3a01bb984f6625c9095479063a9ed108887b29000a4e46b2322a310f645e0000230153329796a6d70d000b815656390b4b4b5575534008e86f243239cf40500700081a5fb83a23f50f55f0500000b73fcb3a0210cbd583a0000002d9613109184ed8986603ae8bb6328d56ca419700014bdabd322f2986b25a000209cf593a0237ae9fe763000b8e820b322f2986b25a000228a1bb41105fa2f93a1e9b0207cc6d9c323612396177000117fee83a05d993d88b970009fdf91939132f07cab4a96a04b22f8031fa1c6d5030000c66e46e3227e918fb8500012de171323e132837180006716843411178b2c244ef8100008132a4390ee7bff85603a2066934403a19fea47b234618056cd1af390580ceaac1d00b0c29d8433338929c7f6ce701718ca7323573c275a100030f7e05322e351fb37900059fd59c3b116432b7ddf4000861f7ef32bfa83a57b6f3003144213227f8532053000c2ab6cb39033ecde0b77bfc00ce844a3a01ed016f9cf47c091817ea322b6d5c4d4f00014f2543322f2a57501d0002f6ee263a0efb88d6187400048060cf32359a4b0738000c6d14163b466883713beb68022702113942f2310e7c6d9c00b7321c3b5bb16df4f6421f0296fe253227f85320530002b1c162323d89cf6f6d0003f2d50c3a3724657d43d5400be521933227e6b30dfe000b9fe7e53918a4b34dcf28c30c600fb13226e34d85190001718ca8323857589d160002f551cc322a411a26ef000bc2ba703227e9e99948000828eba5323572f1d7de000513c703322f2986b25a0002188d5b3235404dd53f000a1587a6390cf8b21a98146e014f2548322f2986b25a000a1f42da3273a2168968000c332f2a3226e34d85190001718caa323573c275a10000f83e683a3330a96ec62b0108283c193a046d8f0bf93b4d0893311d3228374e2ec40004717af43227f923be16000644973f3a194f68a4515db906716e9d4115661dc26c5f01000c6bd26d32357fa841c0000b9d7a423236be1f7d6e000c0f57503a0173727ac6690005ab3b0e325d1218dc82a000d2541c39c9eb2f4d344ef80aae0d12317940fb3dd0000c3212873226e34d8519000c06aab6322f2986b25a000b2a52eb3a085115f75e4a00009d24f532c50702a7e3000b97335c322f2986b25a00043225a6327cb7db4b3b000b00a2ca323572f1d7de0009dab1ed324ee107795400066a8b043272f6ef2991000505203b3a20a9fc2c9bc60001c5456a3235304312ae0000242b253a030c69332fc500059ecb2b3a08ff41a3d09c0001cf5950322f399174eb00022702143934b63a665fc93709376005322fa19ec5c00008e888c6325df809f00f0008f352a73a063dc12703f5c20089f5fd3235304312ae0001b52f633a0269ddbb08660008ced3b73906379da05b60000c36dfb532274f2664310008beec33322a310f645e000550c1be32353f7d377c000030a7af39162f767c49c3080c397677322f38c0d728000b44e8623a0ab09bafbbdc280b168beb39115a086ede45770091b4a03a0145eae8604e000c11e5b53227e918fb85000c6d0e8a322824cb9d090001e3868432f82faa0b040000deb3283261e4d7be2300000473d5322abfb1328c000692428b41146b5b45a246830000fe52f53a02f3a34407c5000962cc793a026e76453910670a4c1894315af3107a4000063138713227e918fb850001b682613a027a0d4aaafef20c23f3d632bd6f92af9500081273f4410fd2e0ee5a4d24000525378332cab33d18eb4001718992323572f1d7de0004702d45390110d9316ec0000974b16432a4121cd3a9000c6d5f27030c33d7a53226e34d85190000032ac43226f22255f60009ac206d312d79883d20000bee175b323664d51bd30000d4578c3235428fff80000be521963227e918fb8500000bb86c3a02dff18d0dd2b705393e9e322f2a57501d0005392945322f2a57501d00089263c3326dada8b7fac9031bf6d3322f48cb99b90000518c2e327132af19b100042da31d322d8a9f383e0000b43b4a322f2a57501d000ba6cf8632565fdb3ba10001ed074839667eec11c520000000214d42f092db7db1806cd30a103fae3a1562b42499c1ba0b4abbb73a0230357489a900006a5d8431cdca1a949d5f054072bd3270bb8b6754000c11f4903227e9e999480006587f433a029d6c574b420006845c3b3a09f4238bfc5b00036cdbb1323abc817215000a9156a2323169fdd631000c6d5f28336b6c02a4e14000c70966322f2a57501d000590ec884171845d1928a0c2e401d5df0c322f2986b25a0000300f8b32340117dd710002cab8b8324918b124780001ef3a5c3a261ec18b93a0400ac9b78b390a606a7698966a0c2e5f0d3a24e928b4a10a000b9fa62e3909f4181b7eb606000257bf3227e918fb8500066395e632344be6d65e000be521973227e918fb850004a32c6a39027ef66ea2649a0becdab1322f2a57501d00084a01e2311b48eb57e0000c5d85ee322e35f0513c000574e47c4102c68af0bb14008c0263389f3235a9c6bcb1000c3fa3c032369932317c000c2aec89324839e5753700020b0aaf3a010cb240590b000039dc8939031109f19eb3e30c48e44c32355f09a567000c64299c312d79883d20000bc88c6f3a7486139d9de3670bd4b9fd322f38c0d72800005bb2fa3acaf8f5a42338000b2bba6d322a6d098c6e000c2a59453a0cb9373a0f5b4b0550fcb43228eda88a5c0001660a81390374b3e5d3a0ee0797f4b33280615f5b4500055a36ee3a0106672e0220000bbe4187322f2a57501d0004f84ead32b64f5255660002270520393f64829370ff680b9bb0883123b687b25e2e064579d33a016751851d1c000a2a918f31c3096dd6af2f077aff593a15d3d75a3abc250c4177f5322a31e00221000c60499f32272177f5c7000055ca3939025b5e8540b41b0b9517d531886c98b7600009d659a13a119b0e42c5e77d0030d7bd3227f85320530000169eca32b51d7f60ddcd03c43d09328d183487170003e2f33a3a02eba26713c70006437414411062703f1d38bf0009cb1e91323e6c788e94000c6c39aa399d7e99a670c73303dacd8e3a0120de755454000353a595390687c4581e8a9e02b2d4b73a35ae9cd063d70005c643582152112b4d092e58fe3a012e8001d5b3c101ed75eb3226f5829a67000a020e613a257b25b3de933f0051fbf53913ab597fb278620b4a86a3329396a3a6e00005394ae9322f2986b25a0005535d793ab937b2aac1b80000ebe88732353113b0710004455c6d3a03102c500a351f0c15a7c33b5410fe08d9a04b09b1a9073230852a644d00095819653a8aee4cba80d100091b5bbf3151dac207a00007825aa93247bee2b02b2a09f921df39077da8bd441bf104824ddf322eca348e1c00012c101a323842a5c2bd000533b335322f38c0d728000c2e95263226e34d8519000c67bfe2322f2986b25a000bd9877a3adaa6b090ff013b063adcc032343904e693000c33c4823226e34d851900086feabd3a189dace86626000390aca13a012dd5f36e74dd0a35b3603a0155e59a38dc000a581eda32b4ae22bb280006f92f373a5611917c403a5e052cb65c3a0355ce5890b22e0b3c79c732872b9dc0c600063f7127323664d51bd30006728b274111c62364fe155f000c6d52fd3a25fbe3942c1bd8038ca23b322704bcbf3500034a6a64410134cdb7cb46b5000be191693a043b9ca0780600022b1d8432335eff1c7f0000f9d86c32357fa841c0000b19ff143a266ab515158c5f027eb76c32353f7d377c000b64887232292afc676600052cb0b9324c8c6c883c0006aba6d5324079ec51bc00055e4d713237bc65b8f70000e066b0326237eaae1300048211823228eda88a5c000bda729332a44d347c53000101ad36322e23bb3bee0006728cfc4112f0d09d3459bf000c11e7b63227e918fb850004c0fddd39c033a9d259400000e0dc5c3227e918fb8500065cd18d3a05dd8b860cc64201785d873236123961770000b521243a0189e5f9500e000642be0741138f3a726bd41b00007054f23a06f41b7bdf98540c3573863226e34d851900067828e33a02e6e3f54070bd049521873a116f46f7cecc0000b4b660322f2986b25a000a285aee322a4b9a52520001f5689b322f2a57501d0000026f42322f38c0d728000625f841411509bee5b03601000b13c7933227e68954d70002552be6324abd4ceee9000c6c7aa33b12826ee8b456d800c87b07322f2986b25a000b238f943a0143774422a10000f8f3df3227f923be160004e9a3383b0c2a1fa9b39dab0c6d520932cccdec03480005dd05523226b7287ab10003b1a77632364105ea1100048249a83228eda88a5c0004e7ff223227e918fb850008d84b2a3226e6309e15000bcf9ec7322f2a57501d000004fc0c39100ef09522ab5d06c1489132e2bad11af80001bb13d33908354a67dbbbc10bc2d4a2325938cd746d0001f54a80322f2a57501d0007bc7a0a326c6a6feaec0009f10a623a160d32087bc78502227bf232ef3540d4e8000b8f8651312d79883d20000020ff483227f8532053000b9e99f1322bc5e1fce9000bfdb12b3325a28f9d9980017c270232370b5463e20005433563325059ef7910000c2a4d023908b71cef3cd0a40c67d0a13226e34d85190000001fa5420a874cd9f2c70f390ba1dc25390817aa5dbee0b401f570cf322f2986b25a000a6fbf7833342dfabf1740063216334109b6e64a8ec6001006bd79c33a07495d4c6d6b000a3a3c7732ab94330d0200024880ad3227f8532053000ad3d06f32b52e9c92f600052da6f932b493b4460fdb052d7ee139043c4cb180500006728cfe4111816d3b29121b000c0202b732378f10b2bc000bd096c13a2b30cf6a66220003a2f2ee3269794cc5f100038a5d1a3903e628eb88ee07018c7339322f399174eb000aedb90d322f9baedaa10009e8400c3148c273950000095f8d5b3a0524ffc988cf0006923d674111752543a029010000e3096432b69d996a480005479b2639026adef55f1b9806263a28411449e62eee570100028cf8df39e5dc4ea4f7c000048237e63228eda88a5c0003a7ba9341066195bb9aa59a620c6c958d3277cefd801d000c3563733a017332c3f22381014f177f322f2986b25a000c6d559f410b19942e1c59620000144c07327d64b5c83b000c0b67713a163fbcbb308a2e00ce87f53a02dff25dab95b707dd2f67324937f60bd700013ec2963235ead4465b0000a09c773226e34d85190009949887323876b55bf9000819306d3235707ffe95000a1e0c813a0108dad835ae0009d3781032361c2489e1000c667f793a173a4ac6b320150629831e3234a35461a900052ca8e6325a13447e3400096ebe243226f4b1fca4000b9510cd312d79883d200003b2ad9f329a895f4bcc0004b686f732664bd5240e980c029d13322f2a57501d000c2bc0443298ec0135b2000010cb9a3ab1fc7af4bca70001b7f07d390f538f658fa00009e66e083148c27395000000ce87f73a01ed016f9cf47c00002a3b41087ab54345c380000c45564f323572f1d7de00007054fa3a04fa91d36d1188082a8320324918b124780009d484653227e9e999480006eb3a233227e9e99948000a124e65390110906603d9b90c6538953a09349b28d4b6000625ff51410fd1ece3acaa01000138ceef3a1964e4e0868600055160a93228eda88a5c0002417e70393d3d7845d2b0720c33a81a3226e34d85190002f7729b32353113b0710009e528703a05e5df7cedb35d09ac01c5312d79883d20000a09c3163a53ae98563bf4f908b879023b8db77abdc9ffc301d82e45322f2a57501d00031bdb85322f48cb99b90005aad2453a060edac91c530001aa0d8e322f48cb99b900014f1411322f2a57501d00005d82e1322f2986b25a00084632fb311b48eb57e00006a0b9f832292afc6766000354b344322f2a57501d0006923ee14112b4e3c98df201000b8ab48c399d692d71277ca7040104fe323fdebdd2d3000c3763c4390631f7f8391a400c0ba4d1322f2a57501d00001674c73a014c1538579a0002d9a53e3903aa99396880000656600b32609983cf96db0a4b1ffe312d79883d20000c67cb443226e34d8519000b5f2662393174285d1e4f190c6d41013a04b9620e053b0005413e8f3127b64ec701c0074b5479390d3afbbdc732fc0c29a649325059ef79100004bf4dd9322a369ff16d000c31f6343226e34d85190003a43b9e3a13adb8f7c56900005487653b1a51925e4b7c3e014bdafd322f2986b25a000c340a253226e34d8519000c1fd2113a03e8722623b6870085e12a32b3bf6a16bb0005354ce2322f2a57501d00082d641742313d594db9a87e00058cd6b53227e9e99948000be5219a3227e918fb8500096b9e6b392a279b3e5e76bc06bfcd443b079b4874dc3b02038c86f5322704bcbf350004261e2c32357fba2363000b675bfb3a4105b901eaf7440c6d56ff3bacee4bb9b77a0003ad4ce93283fc6df88200012fef90424565815ba086f13f0c315d433226e34d8519000a4c1bcb312d79883d2000000aef37322a400dee6200054431453a0b873544bc0f2f0bd59c2232347f5b76c0000000028e327593ff11d10005392ffc322f2986b25a000005eed632357fba2363000784b73832cfd26257c1000ad83e1a390d855e25365de90212d34d3227e918fb85000bc29fc3325da1199039000087720639103c3cb4eb7ce2061b994d3227e918fb850000b50d1b322f2a57501d0000001e0b416fafbd11a211f3ec02f2e79132354ce07bdb000714ba693a01b815adc09aff03958051391dfb3c08a0906502f9161c32940240eb2e000c2258b13227e9e99948000b52e01c329b2cb9ea34000013b5e33227f923be16000c0484243909f87e0dabead10b9b63a6322f38c0d72800075f36cd31d6d1ccf97fa90043d0ad3227f923be160000ce8baf3a02dff25dab95b7059d4ac73b0da6643e368b710c5fb6c5322f2a57501d000c2e952e3226e34d85190004461c2231f5904616e00009c5326e3a0bb599e04f458e0c1dd7813227e918fb85000bb3fe3b3227e9e9994800009a6a633938f5b7858bc6210c6797313907cb84745bdda205411f44410dc283ff2eccc0000a56c9d83226f5829a67000b29b3383250ab5541b8000002484d3236ae3e7404000c11ed7c3227e918fb8500019f1e263227f923be16000b6a3b273a04233e46cc2f60019457eb3a0347806fc94fc90676ea733a1fea720a6b36000604b63232b2402043f2b4052ca8e7324f514cd56a0005b2cca632a5128d61ef00005748b3410ad61e63f1a3d010062e188b411442cb31a4ca01000075d9423a1ca10c14cb7f9a0a6cfea03a10395f08297de20bc7ec3e3a78dbb5327db58204308bc03a044969e336cce000f9beca3958b82d352657de025e3c683a01351a619fe00003100f2132b3d58887b100050ea479324d188d25844001ff71a43a0130c1972f6e0005394300322f2986b25a000482476a3228f0bb5260000984c1b3322e23bb3bee000b803bb832791464f3b500000622b73227f8532053000a26a09132b49261db80000bd58afc32347ce99d770002115f5541018bf41810dcb00000a88d643a013b03509b34000b29fa363902f9ea40e789f90c1f464f3227e918fb85000058bcca3aa29fbb1bb9ef11038c97c3322704bcbf350002b9a1af390de618d46570cb0069af8a326992b3a3d4000a0fea9d32b4b0d6251c00051a105e32bc1e515ba0000c2fdeb13906fc57ed3eb5da04261e30323582fc9a6f0000002a5e322f399174eb0000b1e45942718381cd011a2ea301708b863a2770b71972de0009e416163227a32db52a0006bfcd4e3acad41fa69e01000a1e6ec73246fa207051000a704b1132276b22dea30009ac89e13a0c56104797a61504534fd6390ef4e0038a1b380c6d4bf83a28d2db1761e23f016041d53227f85320530008491a253a010191eaed0c000b1fffae3a04d78f6378d10006316c9c3227e9e999480002229a99323882b2ff9c0005f647bf32343904e6930005773bb03227f923be160002ba65fa325d791f72240002666a963a239d4e5e5248870c2f6f6b3907ace66a51ae230a8c2c6d3295e162c3296309fdf6063906bf84ffa6e08405204520327e6a7552e50005dd00403226b7287ab10001e07443322f2986b25a000b0072c13a03807ef71ec6a806f37719392073e03672eed001ef7a803b408abb2139215e0093aabc322e9a61c2d600067f35e73226e34d8519000a4b1e93312d79883d200001286519390e35fa931a0002001dfc93322f38c0d7280000530ded32fa0fb0f0903b0be522fa3227e9e9994800006de0d43a2f065c543e94f1034059213b06f1033a4399680680bbe93290327bd01900042daa61322d8a9f383e000a0db9763902418f4a948c6c006b60b33a01968acf0b7b000a584f2c39035305631897d2085e0f4a313205af7670000023e2383961a2246c66b2ae007055013b2216587be99100042da0ce324632eab46500019241253234b55fbdd00000f97b5f4211e9039e1461610000344f07326c7c4930c5f903b1e4ed328d1834871700012e41a33a014013c33076000c618403326a90b84eb200008c10f832c8071e61010006c639353a133ae89d1931000000406542056cddc93e9e17eb0c3143de3235707ffe950002906a5d32aebba4d77cf40171fc91323571509c5800042d9c6c324632eab465000539392a322f2986b25a00095c35333227e9e9994800011de56d322f399174eb000313885a3a0606a47d0c02a00a15f77f39065c4a4d5ad2c2021759e73a03c46948ac66000a1569823a1569738c6e46c50c6ca9423281e66eb7cb0008f310213a0d1ecf8186ab060b937974421bc35d50b51d823f0c6d5bbb3258cbb2b7df0001232c413227e918fb85000a2871633a11987352fc4196096a49c73a01f65b54b02f000c6d27233916cd11b16e442709e6425a3148c2739500000b341cc43a01cca6ed9f7b00073dded43a015e3426bdea390a68373f3228367d9101000c1b00113239546edccc000525c17d3233569d581700014ecd05322f2a57501d000c6047b43adea02e6dbfed000bdb20ed3a0e638dc9bb8f020aa931c43ad74bf1e55beefe01572437398ae93e2c2e3c55029c657f3a473e7caa456d00044b3c573a15ef36b1bab70000a65ee9322f2986b25a000b757e7e3ac40572cf712d00022887753235707ffe95000482430a3228eda88a5c00085eb4cd312c90b39810000c66815c3a16f78e4acc73150bf1f3bd39175d655d782c4000ce8bb43a01ed02403ab77c0bd8e7a3322e35f0513c0001932c8c3a0275b7ab6ff408021005ba3236fa8ae531000b02ebff32359a4b0738000a550e603226f5829a67000700f10d322b6aea7406000a20a5c63a10629b6c76e22e0010b3a8390346f9eaced2a80bb6b8183a229f0976834a00052ca8ea41015156ed0e618100014f4fc4322f2986b25a000c6596633226e34d85190006ec820f3a593a300e4cbe0003aca3b83a0f3540866d39a0052cb1fa3b16b4ecfed1bf0b06484f0032e84e37752dcb0010bcd03a04d68610a4e027021d9257322ea6d0a62c000b87895e322f2986b25a000682b70841128a41d9d4a401000a04c507390174b5927535e209ea8f9c3903a8905f89db0708127dca3148c2739500000c5e12493905543df729c0000c11e2433227e9e99948000036b80a322f2a57501d000c13005e3227e9e99948000a62ea180a020a2f9f5839018d469d1269f9090f73573a0112299c2f110001550507327e7743944b0009e4cfaa33f99d47f1f860001443e33a02aab1cc7cea900b59985b3235304312ae0006ab72d5322f2986b25a000c65a3413226e34d85190001f5808c322f2a57501d000721fcd33227bd3b77a9000089f0fd3256617c7727000a75a3103269b7ee6c330000d178c832dc96dc589d00000bb3733a01ed016f9cf47c05dc76393226b7287ab100048c2842322f2986b25a000a6fb4e2410179eb8b5984ce810004e06b32fa0fb0f0903b0a866cbf312d79883d200004696dd732a0aaa69a1400070221f93a0738be873036000560ce2a3a0159b812bde5000c6d5f2f329359a33c2400031b7e42322f48cb99b9000608c7753227e918fb850006c81e0a4117835df54bb5c5f20a0d6e6e39189b201ca317230b1eec9f3a012611da91d300044713c1322a4049892c0000ff815c322e23bb3bee00008132be390ed27e314e9590028e60ff3267574fe19700038c8a1f322704bcbf35000c5d9aa03906bddb6ded00000be5219d3227e9e9994800037ca795322f2986b25a0009d9de9c3148c2739500000bfdb2ee3320e7ff88f5600b3ba8f63a0154c346ebd11100b538ca32ad09de8b930000f9bedd3a5ab5dc1e8f40480bf70bcd322f2986b25a00011de575322f399174eb00085235af32a06dcfe87f000c65122932fa014769853b09c4e5c039041a4059fe80110bf1f3c0323588e68fad00045e0cbf32358078df83000c6d2cc03278d6db71c2000027bbea420fd397d33e143b280be5219f3227e918fb85000ba1f31e39066f717d8921b20806811c325ab7165230000b868a4332292afc67660002b8bd6d3901752ee06c2f2e071f5bd6322f2986b25a000c29a2c3322f2986b25a00042a2b823a593ef20a1e160000583c0a322f2986b25a000acc597532e2cb8eade70005395358322f2986b25a000c6ae0423a0345e4a1d3bc00017189aa323573c275a1000be5d06c322f2986b25a0005396053322f2a57501d0000313353391ab2724e8e8f9a07842d21325f279c1b524300e00818327cef86c3b2000b3e6be54103e1fbefe187c34d0bc46f42322f2a57501d00003ce0203918b8a20f392bf90bcf808f322f2986b25a0002f911353235713ebab5000b297de93a107ed94ed292f10c014ad0322f2986b25a000be521a03227e9e99948000c51cb2b323d4b813b79000c528fb63910c9f892f644190a3698203247e89d79f40001c794a63aa0c6f6e03c2efe0b5635c83238c53e018600087306653278a1e3633f000c6596653226e34d851900079f16a5322f2986b25a000056311d329617816fc5000b4e9b2b3293960ea3e7000b69e882312d79883d2000056ce31a3924bbb870a7b80007594f2d322f9e02e68500065e3a64391e48fa76af33c40a2f9c1f3903762bba8197b90c1ad8b43a396f10e08cef8000ce8bb93a02dff32e4958b70b95134b312d79883d2000053934d3322f2a57501d0006c432b032298fe50e940005ba3c793226d9c1babf000c2e95373226e34d8519000212b6e8322bd303b09d000b9fa641390c84dd39134d400bfdb2ef3325a73018d5600646b7ea411038f43c572681000811726c3234fab60132000b0b26c6324d4899018e000ab6f94c3901c6bf526340000326d283323ca9a415510008a55cd63235e5baeee000055078a83a020170fa41c3000c6d5f30323cc912b5d7000a4d10a73a088100a29713d60597bbcf4138b34626b3d4418e0ad104a23904b4927f840b6700000024890100000000000000000000000000000045070a5197894200000000000000000000000000000045070a5554000ece4717aa4dd7f7d26cc6a5658dd6503df02706ae4bc6b662b87d2ee5bc410a070a5555002d70dd15dbbfed285ece7d51b48a6c996c95aced672b54e5d75df4eccfcc67f3070a555600ea9d7d8d700234bb5796f4a4f0fd5f2d287b91eaf38531f29279cdea2a58dae9070a555700c32afd398a6b9a4489d11fd19487da3c6c3581f9dc6b7f96751c22b2e3f8d94d070a555800328f20ecf843d1d41b27a51dbeac369797036e281232a462c7e18eea582ad48a070a5559007fb009cd5da4f102eaae9412d036bfbc3b371980f419cea7d3a519bc29f70689070a555a00695c053892a64de66eef199294c542dfad3c13096cf57380f988d50e289acdf4070a555b00893c54240df3f736e505b0526e68f4046b19e530902b2d39f2d39e2e99c42a21070a555c00ecc471b28855efa79fee946ccaf2949a1ef276939cc957eafbea274eaea44e4e070a555d0060785a03a0c14b18c76bdeeae535919b34646528658c304705709b6168b74c54070a555e008a49f069219b81777e35025af257953b8565c44a744d8d2286385e4379da9ba1070a555f00782939a6fd134777b1d0ac8c98e18c4474eff5c8d3b6e2be16ae30d4f24f91fa070a556000a14cfb6af05dbb8d82aab24cc96cac265dbd6a73bf27f9931b49fa18e15d1a0b070a556100790f2f5c90f998b74d1e01d0de38ac588fc61cbe2b5baf4fc44af428f9a813ff070a5562007082d179734cabf75a61a64297c44d4ea86d7ac3ea5b339b0178db4e3cd02f0b070a56c300136ee0480df8b39149363c218b647396cd77db49ac8da6d1a5df718c646f4505070a56c400d8a7f77f1357a7e968ab015ae88766d6a389b3d758c9f7fb6ae4b5fc532458b5070a56c5004539d286b1fc403096a71cbc5fca0e3a68878c3dbbd21aea78916e2f683716d5070a56c60093f3db52f4721fed8065e4300ec5dd4f681c31b55a9782482207b614b181edc5070a56c700673d0d9046886d29af2e2a4f48c3dd68108bf0ae50d7dc043042608835b04661070a56c800b2c156c6a6a68f6ed28cbeaeb09529ff070449c3ee2f5351ed2146df374a6ec4070a56c90064ea822c2cbee67554e5cd8e4dff5b5d67d5a48f0e1744eaece9df1bff3de372070a56ca0087cc274a4925b678fe35a4b1aa9480dfb6e62da9a6683a36d11dd3e77700fbc2070a56cb0041c82bb6a594b47ad4ececeb74970644833529b8a7ac5c9f9195c23dfa7c3c3e070a56cc008e1d5c12f9cc7ff32d351da3a51dc6da250d60beb4f93e8c791684981beaa079070a56cd00195917fd26ce298eb40e6a6da3cfd06dd7ab5e20da88c1a01a71f17825263046070a56ce00d71c8eca35d6738dc34229c77366fa68daa008e4af36a9eac178d4a6d8679c27070a56cf008fee12db89070d44da0706e8ba0cc9ab021a82f5c7f0ed887077cf1bfd9a3633070a56d000bcc824d8ec15706c06b0735f63576ee37e525b1230f2cfec8f9ad424094d1205070a56d100525ee5b321d11dec665f42fc343ca6d4e5c567bea26034744ef2fb3efabe8308070a56d2007b5e4ccba1f2d986ae5a4d3cb3903b9edfa8ac51cb1c59518b49b1a0dca7af59070a56d300596398983425344c56b3c852cfd83d5355b4e1c613c41e95133a09573a40e821070a56d40080c2f731c8f8fe97c6a3b869dca35845d21beee4116ac00fc4febfb4bf6fa6ef070a56d50011c50dc23472d9b266c9154b86c3c7df245a42e4a8fe823524dbb75f07671bf7070a56d6001583c73c264dd4b09789d697f44ac7058b78f43fceff09084f8a886df18586e9070a56d700492ca951cdb5f2895314c599b5b3158667c564f7d0c392dd8a2d1cf543270587070a56d800dcb730df09342c319c6ee871014afb80ec1696e1ce6ae3e994f0573cfd637c4f070a56d90033bea0005e00071439549cb8a347a2a997fb047aa80f762544efbec44b3086d9070a56da002425e8cddcfc592a78e5464b9df8fdbc1b4fc2941819740cb9a81d3984e8698b070a56db003b05389c0085ba626c6bb8ac0670ea00b638447d0ba0d07eff6ec24ba52b9497070a56dc008514fcfa9f51ff3cc6df8570fd389bb6047fb639930a7722fa3e80b429ebc1e9070a56dd0010861a5a892c0a70bf76b875053f8c43ec8903ab5a9bd93266c011b300f48b6b070a56de001e64c93e610f2cf7f6347bee7d5d16e9a58940ce69daa3c7df16b693389d811c070a56df00e6ce9c89eb97e6ca65e5508f87345b896e248743fa58daa570970969b59f103b070a56e0006e5e8bfb8019f87043a26ca29808830bcb40a823685085d1a95e29b0301c39e7070a56e10023ff5e9bed4376b62be978f553bcb72fa15b5e07add9f2af9b5a29b6c65597a0070a56e200e7af53b6d80e25b5640920dc34951cbd088c5e9a2a568919c0ed85f7faf5097e070a56e30056d53d34562b6641f64ab92a4d9ec05e2b780623e4af9ceb6c230000a0cd1c48070a56e4006708da8cdb9ce98edbd6ed65bdb35416a824a5aff0b0ab5707de7ef021bc48dd070a588c001435d13727931da6cfa7b25ba9c30104dd8755352615d007196d6fd7e1a39850070a588d001367c4994bb49141a2d0fc0e01d4b7a74220defb33bb4dd9c4b0bd12e6f4adf1070a588e006ca806e22c418e0a12ea81376eb340ab6e9e6ca0487a54214c5529c155816217070a588f00333bde909ca3eb86a52b39a698b65db04d07a670db0421f0ee46c6886a85f289070a5890004c1193da575a3aca7387199dc69f0ba9b74d08984d1cf0ea608ac33e15a7d068070a589100486ce3a7f208ce50d491981b052dd0b82158439178a010bfece42c14cc0b44ce070a589200bcbd514b32e4224695620a218cdad37ddf3dfe00090d5245e41e8ed0c5927b66070a589300297e13820b1ee825dfc63bce22a79a1882b39ffc96b52feaebc2799415351196070a589400a5fc8ae6f71721afb5f1fa2a1030fc45021876804a844fc948377a3438be0e70070a589500e3fb377be3fe163642f5918cbfcdc692ad23c4dc227cea966bfd69c5bf9a5f1b070a5896004139e6f0928846924c9f5f2231003746c24d61f6b57bb589c6361fc318afd22e070a589700e6924d20d6f257dd475f376d0e77ad04cd4963c8935108d38f6853f6605477a9070a5898008a2ed31eab9253bedcffe4a641f1f14b01050019ae0b3b709656cf24f39c3bda070a589900506784f580e9244ca30047569c187765ece4d7a92ee04c0f8f13551472e33a2c070a589a00b273f7a41ad3461431c58896ba5ae5b361bbdd3e6d548a73e7c7ba181207fb4b070a589b008995c00ee5c7048e6af14c7b80bb82875d77893e5fd0e125102b4b06734d9f50070a589c00f356ac02a469458eb07667b5f8ff61de2e800a5740e905394f12d00149c822d1070a51b489420000000000000000000000000000004502d98f29093102d98f2a291926cbf3f6039803671113ee039805621104fb04cd9b8b2206f67fb50c55a188d108a9bcef407c0bf561cefffffffffffffffffffffffff9fbcbbf0bf0e9cbd10a7f896da2c5d6c230fafffffffffffffffffffffffff68dd7a20c167f80d10a4a32f0358e4ec604a3fffffffffffffffffffffffff9d4cfcc0bec4008d10a8377979f8dd7e2fac4fffffffffffffffffffffffff7e746610bf2ae2cd10961dfc3fcdc7a5e756efffffffffffffffffffffffff75ba77409d9e8ee4159a7d9a4f6fe303f0055ca673102d47ccae3b00055ca683902588a0875d06b00ae069b094300ae069c29187f3e6a2c00b1fc8b22d42f9f2100b33c1c11805a00b1e786220c8bcb3a0bf857400b040c6d5f32030c6d5f3329118f2c2b4a0c15c7be0b01053f6b64d2031eecfb04e7d3d80b31ffffffffffffffdb8c64a763961146a6053f6b65d202e7af4699fad9d2c55fffffffffffffff94c271cd24f276b1d8053f6b6611031705483710112510053f6b6bd2202500197c3b83efa90dfffffffffffffff28b5f6aa28c03e315053f6b6cd225187eecf238c2ee52b6ffffffffffffffc761fe390c332c465d053f6b6d1101ea0548f9f5310389dfd3c9760a46e38709010a4b200809010c6d59fb09010350e968412d5e9e7b440ed14b0350e9693a04ba8b54d24505091b08fa0901091b5bc909010bd2b85051010c570cb5c6a79800000b02f4774a1b1ae4d6e2ef5000000b029f8049056bc75e2d631000000b0070bf4915af1d78b58c4000000b4d1edd510ad746921b44096844800b77015e4b03cb71f51fc55800000b4ed69a510ad7ad02abbdd1570b800b02e5604a1b1ae4d6e2ef5000000b85936f4a1b1ae4d6e2ef5000000c6d5f3f4ad8d726b7177a8000000afcb38b5215aef394c701dabf50000b7e7c294902b5e3af16b18800000b03c6eb51046d12dc03003aa800000bf8920a4a1b1ae4d6e2ef500000022d529f41037976a85acbc5b7022d52a02214395883022d52a121144715df022d52a2410b34a21b7d3694f7022e6afd4101cd1f34cfdb770d0916d1824a04842d06ccd73c62dc0c2427af410ddf0577f83d4fa409e616e24218fec0d2cb9923630c38232e420ddf0577f83d4fa402cef96c39028f3b79effc050c382c02390274747a0a352200002efc4118fb8dc8732d285d0000015639915ae9d7d09b95064e459d03000f0f3d490481597345f89553f4091a87ce410242dc6be55272540000215042018df85603bc655f0afa902a09010c02aebb8901048d43f055ec35f73555f904c1d3cc5d0b98862d894e00000000000000000000000000000000085e1ad50901085eb4ee0901000f7641490481597345f89553f4000f76423a3a26927da33621005e14ad220eca769e005e14ae210ecade310153fa442201d53fb20153fa45392ae79e20bc94110153fa46095d015408bc31146220672611015408bd5101dd414a29df2f4eacd3015408be210daec1820155a137410197a074c8a537390054c28f3a02ceb0cbfd34980054c2904903e8a4e80a01888317035142b4422d5e9e7b440ed14b035142b51932095509ae9eb5429e25b8b8075a1fd309ae9eb6390fd696c7007df102d98b76096202d98b7729131c50c6a7039809cc29806e7604cb03980c0129268789ce3c02d9a56e194ea8880a4efa82194c38250c6d5f4b030c6d5a080302f2f1cc49019b882f8053f90dea04cc8e92691c971ea11724526deea30b7bed04cc8196890a5cfaabc4c81d430777fbd95b435eef9304c272d4a9020000000000000001fb44fc499e716438040d16c704c272d5a908a1700617fffffffffffffffffffffffedacaf92204c272d641014923750000006d04cc8e9311173204cc8197310866f59299750c2cf1827b0adbe7e1f65c9d7de024d4845ced500c2cf18393f930708824e41c683fb5d3504374a007277000b7d3c2a92820667cd200000000000000000000002820667cd202af894daa2820667cd1ffffffffffffffffffffffd7df99832e05918767093a05918768290b073155d205a4deda3103fed4ddbefd05ae0b3a3101ff6a6edf7d0597bbf12904bacdf1b30c6d307f2110543bcb0c4d92e70b020c6d5bdc21883528770c6d06c32904bfa1d8800c6d5f4d0b0d0829147ca260ed964a86d02d728fd007b16382ee355ade5d7a0c6d55c4030c6d55c5030c6d55c7030c6d5a10090100cf9819420ed7827f817c828b0529427bc10200000800000000000000072cfabe8717fc222f4af932be05408e8a590619e3b576d0e5c35c41aa05407ad7799bd2c8e0b0744c16314106be4304e205407ad8b9011c91e571aa1000000000000000000000000000000ae70529427d392e0e4e48954dd50ac46138b10fd0d8c77b463006da478e000000a89c3d82000037d60ac46139b10fd3a97bc5411ef9bb575a000000a8bd7619000037e105dc1e3d7203844a562454b651d9153cd0aabb05dc1e3e8a6505d78837dbef344169d58879a93aa7d005dc1e3f000164eec9ec000000000000029e43638fd39824bdd2ff9183400000909d71a1330000928a22020f657f0000928b393089002d05189f0000928c093f000093982962b03d6479000093994903053e2003d57d229002cef478210f9c958b02cef72d41022078f87e5284fa09a2711e090106534d6a8903e04d799b94700c9ca6a006bf618f0c050652ee33894e000000000000000000000000000000000a46e66309020a4c18f709020c20ffb4090106b203de4905359992dc8ff00000084d0ec40309234867493615af3a517586ae670c6d5f5f0307d2e0df492a30e36e3764506dd60c6d5f6003084d0ec603006a99e61bbb614f0b16f1ce030411395e0300d25f66030c67eab11a0186a00c6d5f63030a46b2121a15317e00b7405e191300f6029b178f2102ee274e059f9f9f195d83ac0c2e6f01030853408b0304cd9c33220707de5003d46f172230f341f207141a5c2103a422bb029ae04221417fb73f00b539441903ec17017113ca2103da00b90b0b3c521a2d4f240c5f900713012d067034e5210688513a0c6cb7f5030c6d5f66030000219f2220f2d637009b618d2119bcfbe101b7ada422010636d40b6407b1124d90009717d61a129f2304c2732f22053d425307aaea8703098387931913655908733332211209d70e09fe1dfb1ad7ae5d0353b7f61a4c4b4008f363521940ec17038a62290300aceddf2102625a000ad88fb5030b6eba590b03084ac5aa19172c6e0a0a21801a148a9108284b33192d1ce00153fa592201d53fb205a6e858216a36e7fa0b85d893225d355f8a0209fb0913037801cbc53622013ee4d7050eb60e11029b00c1478e11017b008ff8921a68de5700c116ed1a03dd310b31b4021a25410c069bcaf61a0f2bcd0a35e4142203dcbc310bfb7d0d0a07000092a922020f657f07f86e0f21063a93a30a0d7c32220112a78f0a854f37210205a42409581f272105ebc9b50a67fed319c3721a0a107b5319e38215086b5664225c219559001997621a13655906f5f08b2103ca702609e241121a45201e0087758d09230b26097521019c96a2041136e20306bfcbf119172c6e0c682de31301d30023faa70b0708def1cc1a0f2bcd037515c8030268f86119173ea8055a3a9912cb200add4b4412ef310a09deda19ebf4d00a4d1e191a4c4b40052942b62a011620965d08f3266f198c2d6e00571733190cc4b30ad6cf37195c07370bc891962104da2db105931d82210285ddb106bd5ed82203a422bb0c6c91031a4c4b40065d4f4022014fb18001e38a6c1b1ee17e0bfe63ee0a0109acb84819839ee20c5b6734030a09dbe321038d3ae500cf98451903dbb60540f4171905688d031abedd1258f00c6d5f670b030c04adac030a7f04e51a2a1c250548bba8220164c1a60546a94421061336700099d8fd0300050304030b8abc300b060c68662a21097ab4550548b655217aaf3d82060681332106a5eacc0abd6eeb21092f722a0597c060222aabb2cd0c5a4c31030c0fbf1e21055d44e40c049b0203000083301199410063ee33213234fdf0028ce4492206a5eacc042c74462103cbe370057575141102e30be1d4ba1926992a083846eb194b362109d4f6fe1a31c0060a8933aa1926812d0a15777719e5b751009cacab290211c41a880a20b16719ae0e590b4f56b719236ec50066515f1a01cd16015408d91903747e05d04be4290254eb71220ba282121a4b302c0764f632030c6d5f691aa4db91066830d321011801a70a0dbb861a21b07606eab403193c98060bcd8b032103aa910c00267c4d21076e77ff0c6c0dcc1960e56c058bc6461901f0840c6d5f6b03049b61a719b95da7000040a62157f8920402b2da32210246195c0c6d4ea1192026c200bf345d191a23280c5d07bd03074ef0a51b725f3c0c6d5dc112ef3107711d661a9259930c6d5c0a0303407460190375d005cdafca1a65f866054f83bf1901cd1603a7fd14220b4bee7e005c86352106eb07d0045e44e622417fb73f00f85f4421022a1f5502f8523321019c40eb00ff57761a707db404a342601a26992a080ef12e2106e86ccd0a1251b21a103fd8004395801102240ae193731a2dc6c00bfcde32193319270bef24ff210175094a05153423210160132b0c4e649f194cd92d01c0244a1a5c073705cdae6a1a0434c405037b01210133dcb80c6d5f710303a447f819cf5e440c6d0c63030c5be4cf1986f0d20bd7e0752101d1cb33025e4ffb1b0ee39b0395a10703045d32f5191c0b9509f92947030a3271b61919a9d00b89ce8c13189708e92cf121735545840be85daa1996d8fc01000ac41916e360006619432108a1857d01ec0adf030241c400030c61635321032de7a40b6340f5030039874a030c6d5f741a0186a0010e02071989790e00b528da190d3f4a099761c1191a6d200453adab1aa7d8c0004b89ad0304c25216221225b9e800b1e84c21c74d897b0b04684e03087c18e52101046a040192acd22101a6e8890c6899f7030bee0f8c217733fc1409de58851aa7d8c0054572bd2102faf08003db217f190f6611099245402123c34600007055ca210c86e53f0c5a09fb030ba191000302ff917b030b3baf260901006e01a72101fe011c096c267503000024ee191924b00c6d5a30192e80880b9ffc791a7056ef07e30d151a019e1006270e552108b9e77305488b1e1a19a9d002cef4d011748f05865b30215eb1807f079c578d21065b70490c6d32b60304de6863210989b8b001bba05b220f4c49ca02076ce321010f380003fa37091910d8c1078673e221082cec3a03971d7319b77ab40c6d5f781afa8d0f0548b67552054628a1b0bfe1cbec0f056816ea6120a1d21a7006d6dd6e30d5a4054da50c61097ac1e13d632ceaf3b3906b054da50d916c9e000000000000000000000000000175e907d2e107492a30e36e3764506dd607d2e1083a1ec6c1eaf177320a46e7f709010a4c1c350901076d03c0424238e84c7bb163ad03dfedf209020c6d5f8409020c6d5f86090203dfedf6090209e642ae09010b8ec3a009010b9511ae0901088a0e0489032042b18b4979be30ba439324f23bf4c40888d993894e0000000000000000000000000000000003d46f36c948fffffffffff08be8b55923ceffffffffffffad2469454b0503d46f38c20be6b4536064a3bc000000000000002c851cc7f5d650c5a70c59b2efb910b687ff18c90effffffffffffffff59b6a99e4f8b8665042b6310b9b00ea019b6ae30fffffffffffffff92850daeccca498f7080bec98c2106032acc57ae80300000000000000000000000000000000080bec9942106032acc57ae8120c3c7a4fb95bce8d7e72ff8ffffffffffffffffc6e90da3e6f7e2f4303d46f3cc1035ceaa3cdd3cd66ffffffffffffffde8a4ad9409e00eba90c6d5dd50300906feb190305dc009027a1390ab1b0fe1e5f93008ff8c41a6be4330c68d77f2902bab32a250c68d30f290e2237e6f30c68d57f4101cd1f34cfdb770d001a6671290e2237e6f3022d7a9a2902bab32a25022e6be64101cd1f34cfdb770d0c6d5a43090104c2642a6991378ab350d6884bb9925e9ed604c25506892ca58690928463ea68a1776d0d3203fc4504c2524fc1020000010000000000000000fdc1572ac46e6fe23e3b4ab104c25250b2015148c23d7e0000000000000000000000000000000006ff26294124b62b5c00000c2806ff262a41249afc4f00000c1f04c2642b1901945f04c25507317c535eca502a02f2f2309201c5555dfffffffffffe6477d07fac06f21602f2f2319201c5555dfffffffffffe6477d07fac06f21600246ee03a2386f26fc10000011ed857030c6d5f8e3302ff3002f4400c3f80e703038b431103029b17cb2202ede3830c6d5f92030916d20121027a10570c6b5fa30304cd9fb3191f7ad50be01a6821050d28d00c6d5dda215d39927d044b405319e85e750a35e4672103eab61c0574fbde1ab91874029b1a47220101e38b0a854f6d220205c0370c6d47c70303bb4fab1ac9b8a9086b56cd215c3737a8085c20662118f810820c6ae84b0309a26f6e1a0178fc0342a5471a0754800a7c67c119c9b8a90c6d5f94030a2f862a1a4a508f07aa83fe030aba66d51a1f7ad50c5dc5ba030548b6ac227ab0c2b50c6d4b5e030a445a3d03058bcb911184f20c6d5a520308ce493111b5040c6d47ca030589dffd21029d84390b4abe1c2101290d16022d539f22026d8f230c6d31a7030a288fe819b91874091b049519015ecd0871fb5b2205086f1803a7fd39210b4bd0cf0c6b84b2030c6d5f99030c2dfda31a03321e0c6d47cf030a1f65d01a19d45e08fff4290b4202f2f23d2201c5555e0ad7d6af0308cddc0a210125bdad0c6d5a542232393e510c6b1303192652a302ff98a321010a03a709eabf841a2d96fd0c6d5f9a030c6d511421026d29440a3e1f4e210111777005488b521919d45e0c6d5f9c0305865b6f225eb8361609d9e7e3425b97e9081d9400000b61b18b419e25b8b80751780009dbe1ff1908a7d309ac1914429e25b8b8075a1fd30a86543b09010a866d35090109239d4d492e3beeb067becd4f0a0920a3e209b603c56faec94f0000000000000ed5d2284e240000000000045e5070bbddbc03c56fb0c2289367ad6cc0adc3fffffffffffffffffffd3a981913400003cb15e1c202e6e023df3c55cfffffffffffffffffffffcd43f4d1f64803ee5936c216552c62e951a237fffffffffffffffffffe798bf5e03ca104010bb3c20f575b26a432b5bcfffffffffffffffffffef3c82e610d180c539cd509080c6d5f9f21010000000bf0ea61030579c80aca02bc39b9146a279320ffffffffffffffff852d4f0fba0397bd0579c80bca134230d838a67d931ffffffffffffffff92fd1f52bbd43d0fc0579c80c8946ffffffffffffffecbdcf27c759826ce0057d5ab009560c55a1e2030c2506b011080009d9e43ad102a4125ee57afb06dc97000000000000001ec8728c82bf041c5a09d9e43bd10d6c2cf3cc2e0717746600000000000000a63d397326da3faf1a09d9e43c91015d0000000000000d6c2cf3cc2e071774660b60fb324113b635f62b0e0b3c04b56839c91213fe79f29096c1b800000000000000015b2b056b342c99df04b5683ac93922dfb8a0b5eb276100000000000000089b3289a0633ec9dc04cd9cb2898c0000000000000007245bf71416bd64ec04d067681905e73504b56840c23a261dbf7eedb5b2ffffffffffffffffbe57402d5989a99e04b56841ca0231ddbf3e5891e430fffffffffffffffaf77a5dfcc31e599704b568428946fffffffffffffffdce2240c1a76e1bcf04ccbf03312e4dc8b9444504b56849c2a6497cea455e9fb1fffffffffffffffed7a4cb7dc50a107704b5684aca01f882d9e746bf0c33fffffffffffffff8ed6bf464a7b3ac1904b5684b896dffffffffffffffffc0efa4c317281e7a04d0f752190293000c167ff7030bf2aee7030bec40be03057a76e581cead754912a4878d10c54a7c5e828e9f056cdfd689400000000000000000001b5acddee39d3e0a6d0dcc91d499d850d7b36f19d966dc6bb8602eecc7640c6d5c3909010c6d5dec030c548a3b410675949957b8b36105f7af2d4102783b0e307ae72205412033410dadf4a373c3126d002efb7509010afdf70111413f0c48c05b09010b2455ee09010c21be6f09960c00c6e609020c00c6e709010bdbd72c09030c5d8b4c09020be69be909010b9b44b709010b825bf5099b0c48c05f09780c2d1e1d09780c3e04e2098c0c2a825209820c0ff94809640b61488709010c47c4cf09010c4827a509640becf0be09010c2a138b09010b9b70d509a50be5d31409010b825bf609010bb9588d095a0b87a61209010c2d1e1f09060b44177909010bd9ad2e11011d0bb7e3ad09d70b1ea75d09aa0b44623f09010c48c06209010be2d3a309960bfcd50a09020b44624009d70c276b0e09b40bdb092209010bedf1cb098c0c12acc6097d0b534c0709aa0bf980d909de0bedf3de098c0c4827a909010c5df976095a0bf00e6209010c014cf609a00c0dfb8f098c0c4827aa09010bd18eb209010c350bca09640b5a394a09960c32a3ae09820b3dfc8f09cd0b23e21409010bcace6309010c32a3b009010c32a3b109780bc46ffc09780c4827ab09640bedf3df09010bee140009010bb9951809010bc46ffd09010b87a61509a50b71a87709910be69bff09010b2455ef09910b90010109960c12accc09870b45166c09d70c12accd09010bcace6709820c33077509820bedf1d309010bb9588e09010bd18eb5098c0c45e33e09010bcace6809820c00c6e909960b24552709820c4827ac096e0bd4bad009640bd8f1bd09020c0ff94b09010c38a2f009780c21be7309010c0ed55509960bd81a9009960b5a394c09010c47ac1d09010c67c14409640bb7e3b009010b82604309010bcf9ab609010c3e04e509020bcedf9609dc0bf00e65098c0bcace6c09010c2a825909010bd4bad109010bbdb06d09af0be69c04098c0c314a7a09030b61488a099b0bd00e1609640c12ae7f09870c4827b009010c05177509960be3bb63090d0be3bb64098c0bfa976a095a0bededa709010ba288a809aa0c4827b209010c12ae8109010c0dfb9409010c48c07109780b45166d09010c48c072096e0bededa9098c0c014cf909010b9889aa09010c12acd609010c4827b409640c5e849309010bc2b8fa098c0bcace7409010c397c0a09010b21a04609aa0becf0c3098c0c12acd809870be2d3ac09010c5d8b55095a0c38a2f609010bdc458a09640c2d1e2409780c4827b609010c12ae8409870c5df97c09010c5fc42509960c397c0b09a50c2a8c8c09820c06ac9c09960c4827b709010c45e34409820bcad0e609820c2a1393098c0bbe592709fb0bb9951d09dc0b973b1e09010b1ea75e09010c48c07809010be5d31b09820b23e219098c0bcedfa609010c2a8c8f09010c4827b909010b3dfc9009070bfa977009030c5e849709aa0c4827ba096e0bedefd409960c4827bb09640b9bd84109960bee1403098c0bd8f1c1096e0b534c0809010c05177c09010c276b1b09010bd00e1c09010c0ed55a09010bdbd73409820c00356209960c00c6f309960b82604609f00bedf1de09010bd81a9c09010b973b2209640b24552809010bf980e409010be2961c09960b9bd84309010c4827bd09640ba288ad09010c2d1e2809060bd9ad3e09010c33077f09010c0042bc09010c314a8709780b90010309010bdc459209030bbdb07409010c06aca209010c47ac2509640c47c4d9096e0bedefd809010c02a9ba09010c5fc42609010c350bd609010be2961e09010b21a04809010be69c17098c0c67c14509010bcf9ad109820b71a87b09010c02a9bb096e0bdb092e098c0bfcd51c09a00bcad0f009010c12ace009010b9b44ba09cd0c32a3c009010b9b70de09010bbe592a09010b9889ad09640c0042be09960bc2b8fe09010bcace8109820c12ae8e09010bedf1e5098c0c00356409010b44177a09d700b1fd6222c90714bb00bc14924101ec9b41dc4f99ad00bc149349023d0da7a5f64d3cbe0c6c4f64030c6d5fb4590a5d51e0c7ec3873ff727200bc17a539052ecdb2b8a22400bc17a6420a587bb7c7dcc9e500bc149969ab0cab9f288eafa8efc6b0e28d00bc0e57694e5a034a67516ca7c65b01a0e600bc0e58410dc019b4a66f386f0c6d5fb50300b1e8a1220c8bcb3a00bc149a6971aa4293f59bc590ea176bf9b90c6c4f6641047f9b7b4c4646540b37e66e1bbf0e580bf857ff6110555744584b12a395b326300c15c8550b0100bc14a15901aa94fc746afb86df12cc00bc14a24128703d025ae86c1c00b214d43a01ac50a6a0ac680b37e66f49640047d0ea11dc5eb10c34e7ed41079f7e2ad5b9ed4e0bf858010b0400bc17ab6934f85a265dc2e85ddfcdee789a0c15c85a611118cccd539306ab1b567b2a00bc14a6590a5d51e0c7ec3873ff727200bc14a741b49bcb22f973696300bc14a86934f859dcbe82b6337f7111b70000b1e54f426fbf42e722c29d130c18b46f41077bc137850512de004c69d141025b570f6f351fe2004c69d2092006bad88389088989391d4539d763fcc1ffd9b144287d06ba308489a30000000000000000000000000000000004d01b80c9470000000000000000000000000000000000000000000000000575ababc96e000000000000000000000000000000000009f2d8bf08e94a057f68a44155734db298034b17057fca93c96e0000000000000000000000000000000000000000000000000a8b3bb2c9880000000000000000000000000000000000211f3805cb16eb0bf0ea8cb13f8f4bad72ca857fa7000000000066ac5e6c8d92654904d01b83c98c0000000000000000000000000000000000000000000000000bf2af13b133d9801401c6c8974100000000005b8c7c16e444911d0c55a1f6b1213cd5bb5595465f1a0000000000544c053a143364510c256b1e490eb996892bda0e46cf0bfffb0bb10155b3403ba8baa22d00000089107f11f5451eb260a60bec40eab1368ffc4c0994715dcc000000000066d40382d825a9ee0c16801bb128aa7d6118f0962f1b00000000006497304a6dc43bc0057a012ec947000000000000000000000000000000020dd089363564c8e30575a294c98c00000000000000000000000000000000000cfef403195fe50575a3a1c947000000000000000000000000000000002c48c9d8b51a1a9504b230e14905e8adca7e459400000c6d5fc20300d99b06399c8c817e14c54e00d99b07399e33cc8fd9200000d988c8f1314a000000000000000000002a0a26f600000000000000000012ccc5385c00d988c9213fba2f9100d988ca713149fffffffffffffffffff9622a00d9f43c210428f786031abf49d109e8fffffffffffffce634f3dfa2ffffffffb0fd92434de774c6031abf4bb108a9ad8daaf2ffffffffffffffffffaf1c8974466f130ae0f65ea9a11926f033fffffffffffffffffffa1fc0b09167af0328f399b108089466babdffffffffffffffffffb4fcc8c3b50763054bb4ede91e0000000000000000000000002ffffffffffffffffff8b029b0e15a7c054e942d51c46044b2a7ce1113088c054e942ea1049542592c9aa3dee1cc445e40e28f0ffa25231c01c024d52a16f5d329a301c024d71a5c073701c024d83a02ceae3a975cad01c024d9092d01d38c0929182e11a5d501d38c0a41bcd46d90b3b03ea0023a7f5a21031843a60bf6168503023a7f5c393e314112f179f30000215642f092db7db1806cd302db8c5631164cfec523f204b58913390a7157d0875e8e06df3e8f0300d99b0e399e33cc8fd9200003d46f52420be6b4536064a3bc000021a34103917e0abbda473301b7aea9390a00c9f9ec87c004c273d3397ab5916f58503d087330393312cbc28b4694036a4fd639031933c01862c90153fb38392ae79e20bc94110c6d5c5d0301cbc5f3391cfc9e205d315000c11e8e2922ecb25c00009038bf390ab1b0fe1e5f9300c117a0315ad023c7e4000574fc0d3911049776df6496029b1abf3917ad4f8c9edd4d01cc121431017c02fa06ec000092dc393089002d05189f000094b931103b2a5f3f000698e3f30303c56fce3902c567e6ecc000068b04710303bb4fca39128277a747a000000023f73903637196722225001997f13901c6bf52630667066dba603303d1e38210000b906e5d0306909e293301e8f1c108000394d0413a0330e12892bd9a06e67171030529433a411973eecc45ad4bd908c2ff7239071afd498d0000078a18910308bb62223312cbc28b469406bd5f3739559267a3e8b9600540f4793262ab124a7155031abf583108a9ad8daaf302db89a739081aa92d4babd206dfa9e8030548bc453920a59eef5febc300002f113a013a2289cfb660066cdcf433012eae09c800095a2b1a396863b66fb8fb95034fbe0d3905d857cd5b15a0004b248642025b570f6f351fe2034e6cfa39029f23992771d302c3bd653929655ae7ecdac600009e8e31e26f8b3052e50c6d4b7841313d0733af15fe000541562d3a0b8141bd6c98c104cd3eac4206623f9011f73e62053532ae11020004a5f40d3103a35294400000246f1929607b81f5b4067fd37903006651fd312b7c7112da400155a23b3166ee60115c000589e0193a3d1e59d46b05b305d043e94106e557ead4e44000000094ba290a009d9400054bb4f93a074fd64f1ea58404a342c439038637ff9e000006995eae2bba43b7400001c024e33a02ceae3a975cad06909e332b174876e800064ad2e0030699240103000021573113e8a9ac940008cddc483a1aecffe22467930c62c2cf3a4a9b638448800006909e362b4f29944800010e033b3a0c8cc1c05e8a99000024f129147d357000068a75760304c252ae4101aabac00ff2319504a5f40e3103a3529440000b97f05941013fbe85edc90000000024f23a01df0a1d8b29d005bc3f6003029c77e039470de4df8200000a3e1f9a3a18e1a6ca7d2d3d0c6d5fcd03083ca5093105b5363c3f6302cef7e3310fe119b7018b01bba0d3410166f005f992a58303fa37b832ffcd5ab667de05412040410dc283ff2eccc0000b64086bf1371a0000000000000010c1f85df8b0ffffffffffffffffffffffffffb2700b664885a90bb169fef1683d3c46287582d2737047949c99a8200b664886610103a85704bdab960e7c98aa0b8f369009030b9518da090200ae074549035d7c186d1fd7460800ae074f094700bc0f2d49035d7c186d1fd74608083ca50a420de0b6b3a76400000b81a426410de0b6b3a764000008e03ffb090108e04a3b0901000040fe42056cddc93e9e17eb005e15ae220eca769e022d53e22214395883000040ff4209b153d57c49491e022d53e321144715df09ae9f43390fd696c7007df103514389422d5e9e7b440ed14b026cebc3210f704b340b03c81c51046d12dc03003aa80000022d569622160f5e9b026cebc41a0935ff00e33eeb192dc6c007d2e149492a30e36e3764506dd6000f107d490481597345f89553f4066992df4a1d620fbd8b59a42bbe04d6d8af121e000350eaae412d5e9e7b440ed14b02649cc51a060ddd005e15af210ecade3100004100216b9b7c020655cd421a3d2cd1000b4f853a0400890ce8e4ee0a5fa7534287fb9415be26892f005e15b0210ecade31000b4f8639207db0d92839bb0a35b1085110ac871561884b0bc00001161211390576672ea73a5d0b03c81d51046d12dc03003aa80000066992e03904ba8b54d2450509ac192b429e25b8b8075a1fd30a5fa7543938e5aae787529b02649cc61a0ee07d0266e2e91ad74fbc0054c33c3a02ceb0cbfd34980351438a193209550b835c8442015bc0dd6dfd8c9000e33eec1a2dc78e0054c33d4903e8a4e80a018883170b835c8542015bc0dd6dfd8c90000f77863a3a26927da33621022d53e622026d8f230a35b1095110ac871561884b0bc0000b03c81e3a01774d38095b5f0a5fa7554287fb9415be26892f0c1ab8a341016345785d8a000007d2e14a492a30e36e3764506dd607d2e14b3a1ec6c1eaf1773209ae9f44429e25b8b8075a1fd30a35b10a3a026c6e406f093e000041012157f89204000b4f8739207db0d92839bb000f7787490481597345f89553f40c1ab8a442016e48d57b76f1370b835c8631105ef39b200004d6d8b0192dc78e011612121a3ba4150c1ab8a542016e48d57b76f13700528a731a3ba4150350eaaf3a04ba8b54d2450502649cc739f1a2060cfed1180266e2ea11815f0655cd43491d620fbd8b59a42bbe01aea549410204ebcfbc4b60a80054c33e4903e8a4e80a01888317083ca515f1013cfffffffffffff21f494c589c0000000000000000000005b5363c3f63084433da9103035ad37d52590de3af225803c312cf7530084433db698246a68749a379cacf12b1b17b0540f488e9daffffffffffffffff9d54edb58eab000000000000000000000005688d0543c8c89914060506a602c4ae9bee4d6e34f91f8b2d73750543c8c961095b3c081df14ed9cb5790260c12c76a09010c642a5c09010b835c8931105ef39b20000b835c8a42015bc0dd6dfd8c90029b1adee9110000000000000017ad4f8c9edd4cfffffffffffffffffffffefe1c7502a03ab899018e33aa7011ec4a00f87a2170601f007e423f02a03ab959b9cb946b5b52b33efad5a300bd6013a15ad023c7e3fffffffffffffffffffffffffc22cf0abfae4f4202a303fe4b5300000b04a4623b0b3d1e99c5af780916d2394a04842d06ccd73c62dc0916d23a21027a10570916d23b11030f091a886759150c24c85951cbd2601281091a8868310b835d4bfc71091a88694162a6d67d7c8aeb5b091b04c1193bc8e90019a0718110f13e163fc30b038458b569fc7fec4e001997f7a3b03d64c20000000000000000000000232e4c5d6d0019a07229e680992be309dadbea09020b8f21c209010b95147109010ba51491a204b6f866c96fefe390263e2ff68d108f3d65ed8b0c2ae237030446096c09010a3e47564906d499ec6c6338000009c75006030589e04fc101fffffcfffffffffffffffd19ec3d8310241a0ac31beb5d0589e0516102aee6d109ac76fba85d90080589e052111d220ac46a13b90215effd189a4b783d840bb20000008bc46c2700002e490ac46a14b90212c7a4216f09366c501eb90000008acfd23b00002df80c6d4dda03000b4f8a39207db0d92839bb010e0342c94600000000000041f441c7141fffffffffffffdba777c30334010e0344ba0c8cc1c05e8a98ffffffffffffffff82f81a6cca6920000229c717ba033d7d35acdf06ffffffffffffffffdfb801ad2c63207d0c67999fb201ff9d739559ffffffffffffffffffec16e819e869e4010e0347ba09480df8d49fe0ffffffffffffffffa387f5a9e2aa46b20c445773b20536f4697659ffffffffffffffffffcc0c2da1734ef203971e0cd1019a0000000000032b6969ab7e0b0000000000090ecc994e0cbd03971e0ec2f61275f9252ec150ffffffffffffffff592064f56250c00003f54193c2081f0ed309459d25fffffffffffffffffa7e16fc108a48d203a3cc8fc2608d9e1bf1ccdac7ffffffffffffffffbe85c83a2db3925f03c5d197c28d65c90a2a1c4964ffffffffffffffffa01c85bf2412e4d101bba0fbe9310000000000000166f005f992a582fffffffffffffffffffff0b3b636021967c599047bb8bdad39e3e3227bd4526fbe6bf9ed34cd021967c66102178b6598c95980680b22be0a35b1173a026c6e406f093e0a35b1185110ac871561884b0bc0000c6d5c70090103971e2e42f61275f9252ec1510c6d5e333bf66902d82572000c6d5fff41289367ad6cc0adc403c56fe042289367ad6cc0adc4052bf3c641dd18df09c16941760394d141412f29b2cff10ebfe90b80b0a65235a724874b7719701b7c0c0cf7e05135a724874b7719701b7c01000bbc1916e3600548bc6da901000000000000000087a25501c7fe91168d75cfc70548c0a8593081d2edcbbefe896ca9b10548c0a97906c2e43bdf8059816f81c8099baf2e0548c0aaa9ccd2e56061000000000000000000000000000005bb0548bc6f2907b2ff64fe0548bc70b101456e6fdb5cb43a732bc200000000eb89800000004e08a783127101b25d9027867561f146487d76fc08a7831389433f4ad1839690efaba1bd892f48d570f608a7831400016527d60a000000000000028cff4aa4397f3180e3410e0e7a000134413918f0098e8ee05915c542fe56c4660d1fcee6098e8ee17901fda8cbfc53c9f613ab0208da4a3a098e8ee2e13a00000000000000000000f250d367f247383908fe00000000af24b802db89f839081aa92d4babd202db89f912350a02db89fa092202db8c965102d3d056a44bf4a0d74402db8c9729128135bb1402db8c98396139acac234d8f02db8c9919019118057a5753113df90c256b53c9037086d7baa1de4dce000000000000000000000000000021ae0bfffb4bd111cebe3d973e9d9bb55d00000000000000000000000000001c4b0545731d2102ee065a0a8939981926812d0a9206865210ac871561884b0bc0000a35b12b5110ac871561884b0bc000000041042911a1e6233500004105216b9b7c02000041064209b153d57c49491e00004107293f598e9919001a6728290e2237e6f30a5b2a4029037fae3c420ab6fa4b0901066993023904ba8b54d24505066993034a1d620fbd8b59a42bbe08462a8d0901084633f709010c6d5abb09250394d8ad89091bb6ff85ecb8661ff92df297ef0423aa0394c54aa91d000000000000000016b7cb3055e3130550b60dce0394d191ba0316c2b166aede000000000000000000000000000000000394c54b412bef249e000022ff0394d8ae393c5e55850b98000054c3734903e8a4e80a018883170c6d601b030881efc303000b4fa93a0400890ce8e4ee000b4faa39207db0d92839bb0047dc2b0a010c66f3a111e5ed09008166030c66f3a2391e1c9c11e5d166005e15f64104119b6b54dad949075667f203075667f3030900852f42042c34d99ff9c8e8090081680307562865a164b24bec3aafeddd2f5122e9a523d09b7c8751450c6cf332030655cd7c1a3d2cd10655cd7d491d620fbd8b59a42bbe04b5893e390a595ee5f038d104ccd0ccc17eb20df2be5b2118000000000000000000000000000000000591735a09440591735b2916f05276a405ba423c2123c3745d05ba703011172e0597c1082a81357d04020c161ff8130f3604ac816cc90200000000000000000000000000000000000000000000000000e33fb0192dc6c000e33fb11a2dc78e00199821090100199822090108cddc77210125bdad08cddc783a1aecffe224679308cddc79091608cdde5231072f30e0743d08cdde5349a897c2ef10cf70076408ce49ab2101e63bd50a854fb3c92f00000000000038db62b3308a00000000000104dea62c8dc60a854fb5ca01d6e44326b6a7e845fffffffffffffffe293545af0a89c0000aed1a22c22d8c8b7acc43a129ffffffffffffffffd275ecd2d52e5fd50c5e5208ba1e15386599a595ffffffffffffffffffe1ec6935625bd30afaec0fc20461c11e2d93ac66fffffffffffffffffb9e7bb5d18f9eaf0a854fb9ca01a4d7e1555736f51ffffffffffffffffe5b3ef0bd2e6965aa076d0446891e0000000000000002eb5c47d3d0c6367a0c6d602803076d04484111fd84c4da78ad22054850f309020ac1831d090104bd3cf009010790c0c609020a5fa8723938e5aae787529b0a5fa8734287fb9415be26892f04cda051191f08850541567d410fb9f155e9d7c756054158095901751c9d842485499f8b4f0541580a89030000000000000000000000000000000005865bd0215eb1807f05865bd1225eb8361605865bd20930058bc6fe310b332062a41f058bc6ff310c7dd6cceafd058bc700296d180515ef0b03c86251046d12dc03003aa800000b03c8633a01774d38095b5f0b952d0409010b8d22630304d6d8e3121e0004d6d8e4192dc78e03fa3823f10165ffffffffffffffff0032a5499822000000000000000000000010d8c103fa55849920a33df1ae5e1aaef03c91a3f0d4334260151a03fa5585610f56dfdf2d36ef6db065dac203bb50abe9f100000000000000128277a7479fffffffffffffffffffffffff36475703bb55f6991601ab2f9f4f00c6c618929b3bf8b6aca1bd9c03bb55f7610a4f4372e340e295d49294eb014c114b418ac7230489e8000009f15df4418ac7230489e800000c6d5cb3090101cbc66922013ee4d701cbc66a391cfc9e205d315001cbc66b11019201cbd219297a2cd4b34c01cbd21a4903957bde65d7a6987e01cc12a441010fe067c4e9b647026cec08210f704b34026cec091a0935ff00fe3df0297097ea9b2301000cd83103fcb25320d501002f7e297097ea9b2301000cd93103fcb25320d501000cdd197e704201002f7f190df28e01000cde197e7042084643e10901084a0323090109ab38ce090109ac218e0901014c11502902540be40000cf99da8903dbb5fffffffffffff1287d807e837d7502649d3839f1a2060cfed11802649d391a060ddd04a343681a26992a04a3436939038637ff9e000004a3436a094704a3d114310194aa4eec7804a3d1154924f1e5b56b319efd8804a5f476690a6b68b564cad58b32f74123110000216f42018df85603bc655f000021703113e8a9ac9400000021710937000021d45954162d0e76d45cd53ac267000021d5510434de2854d14c97c2ad000024f41933f8e902db8d3f095c0c5d1f52124b920b0b4d56111ad10add72da1221c10c13e79c118dd20bedc63f1905273f0c6d40ae030a7c55691129000aad86eb1218f302db8a6112350a0c6d3e430302db8d400916054156af114b920b58a53f12b1fe02649d4e1a0ee07d054bb595113000057a578c113e1c03d90b0f124b920a7838fe11708c078d41db1201de0a894d8c03038f5e41030ac476c4114e9f0a77189a1167970b4e4117121c5b0ad55a4e1220d6038f9190118c55000094ef31103b2a5f3f00000094f04a028a1d29f79dd84a85000094f11106e10000961651028f6f8e15d67f9c2da10000961761668c9a49c615988659a002f2000094f3193aee04000094f409010266e39b1ad74fbc0266e39c11815f0a3e1fdec9b1000000000004674ebf455ad1ffffffffffffdcfb5f28ed910a3e1fe0ba18e1a6ca7d2d3cffffffffffffffff07489b8c9f7a24d30a3e28f4ba1569fa969c27d8ffffffffffffffff29f1d54a291c6a8a0a47afa7ba02c932e28ce38bffffffffffffffffe426d345062758a10c3f0b9faa0b5a5b61b4ffffffffffffffffffff8e83e4bdffd20a528342b2ae6df6f8c029fffffffffffffffff93064798b7861de00002fa54118fb8dc8732d285d00002fa63a013a2289cfb66000002fa711312d000031325904d777443ec6368a02a56b00003133491473598e1201f938d602cefb23315a9594fd1df000002faa090100665275f10d5100000000000000002b7c7112da3ffffffffffffffffffffffffe32ea006654e3a10140230a7470155bc7adfe56be6900e95dbc3b15006654e4618dccf9bf7b47fe20af14509c00ae07a6094a00ae07a729125aaae37e00b2155a3a01a8c9033cd69e00b33dd531068a4c824d9e00b1e60e426fbf42e722c29d130c6c4fe5030b37e7691bc734bf0b37e76a3908ee2ca19a55bb0af9fc7ba102e93981c5e1116f0c59d8ed6081a4a2a1561afb0c0da426910cd602e55613dc3bd68a8bf6346fbed8161b0748fabe410869424d0a8a816e0c319b844108526c763061109d081c54f499cb0fccac6a2d911b8de7f7c0b21efef0d4cd64081c5b0829021bd4a4ac0748f185a102aa908d7613f0f0df81fc0b913cb0aa1e1d59a2028ae522e99b000000000000000000000da4cba66ba7ea4f0badf1e508806d921921028ae847e980000000000000000000000001bf625920b34f0ee5b7636cf47004ff5a0c6d5b2b0901000095004a028a1d29f79dd84a850b3a5418091109d39c9a09010c5ee53d09010a2996d009010c417b7909010b9185e109020bf8a27609020c61850009010c6562f109010c48b65309040c33f2bb09020b9edaf909070c6d60450901059188b5e93a0000000000000000000000000000000000000000000000000000000005917581e9820000000000000000000000000000000000000000000000000000000005917585e94400000000000000000000000000000000000000000000000000000000025e6a3709010b23c7cc00e268d904524e853b5efffd4b0e2439a32e6348b5c7bd7ccbbcaf48296744e21c0b23c7cd0901025e6a6609010b23c7d509010b835cea42015bc0dd6dfd8c900790c12709020ac1837f090104bd3d4a09010548513c0902000024fae93ffffffffffffffffe20f5e274d63000000000000000000000001924b0000026759905d98dce855a388c988bf37c7045e043b8971f000026766102bc3146497db6fde8aa8bf708ced527090108ced52e0901029b18e8e926fffffffffffffffffffffd121c7d0000000000000000000002ee274e02b27be379271c0702f2def6cc7e5e0f14ad488e02b27be47926e40d3f85f38ffb84ea9fbaf3fbb50a35e54ef1025b0000000000000000000003eab61bfffffffffffffffffffffc2343cf0a381a4381025cdad7e84bae38b444a6ff62934fa60a381a44810259269cdeba7024c13d25037b200c5a00fe3bdc0902022d576c2902db925c9a022d576d22160f5e9b01aea60e410204ebcfbc4b60a8022d576e290c638a025209a272912120df3275022d7bb82902bab32a2505488c2df10474000000000000000000000019d45dffffffffffffffffffffffe6563005488e3f810476e8acab0f499314b07780bd0509fc05488e408104711938884befc33752438db0fe686c09e66f0809010c3efda34a20f5b1eaad8d8000000c6d6074030c3f43d94a20f5b1eaad8d8000000c6d51d1490a5aa85009e39c00000c6d6075030c6d5ede0309a2310b7199f9b84fb700439eafac715f2eba08a6213a7902d28ffe29c970b97b4dd3bd51f4d4086b5809a25c27adc60000000000000000000000000000000009a2310c1901474e08a6213b1905fff70a46d71209010a4b1fd009010c2e2a39090100bc4e240901000021ab29e95df89560000021b22220f2d637000021b34103917e0abbda4733000021b40951000021da39012149922838bb000021db511a7bf1e490b488b3044000002408392b8434fd0b656c0c1ab97c41016345785d8a00000c1ab97d42016e48d57b76f1370590b470c90200000000000000000000000000000000000000000000000005d04def290254eb712205d044894106e557ead4e440000b69dbb109010b69ea5e0901028ae55f099b028ae560290ce1633fda028cfe6029f416549a02028dfc7d29249cf31718028cfba921133eadc0081c55262102f9770c0af9fcf6210f779e3e0748f1dc19cd98760bd59faa0304f9a33da30474c4450000000000000000000000000474c44504e0c683a9023aa8b591fffffffffffffffffffffffdc5574a6e08752ea841051c2df24d75303b0c514555c9020e0e008823e4ce76fffffffffffffffffffffffffaa2b55f0c6b1b0d199896800c6b1b0e19989680028ae61a0952028ae61b29070ac9c7d1028cedd5110912029642de11015c028ce6142a7cdd323a4a0c0da47a130d2a0c29510a41016e48d57b76f1370c1ab99142016e48d57b76f137026e527c12210309d9e00209010c6d608109010c695afe49014ae0b00da80ea0000ab8e5be4298eee79d10ce00000a63f7cf3a05dd45503de2f10c6d5efd4183c9c9475e8c1e1f0a4476e64a014ae0b00da80ea0000c68e4843a10c1f85df8b1000b8ab9474201bfb45c930309330bfcdfab397573b8e9d3f06f0a5fa93d4287fb9415be26892f0b206baa410b67d4eda9ef05910c15ab273acc0fdc1660c8ef0bfcdd9e4206b3b484fa4635df0b6409993910c1f85df8b1000a5fa6c7421ed868fd15a34af70b8abdcd3903df9e29ccf3300c68e6523a10c1f85df8b1000c6d5f003b2ab90df98e34660a5ff1244198eee79d10ce00000a632bcc410b8a647754248a0909aaad54090109ac0313090103a7fe72e938000000000000000000000b4bd0cefffffffffffffffffffff4b4118203b933027937f50a7467021cf597506efc99cd9b03b9330379380af8e9f96c08221b6cae5bf52e2109e8418509010c3e71691106b00c3e716a124f3f01d1bb89090700fe45dc1108ff0a7cddf209010a7cee6309010574fd36e9250000000000000011049776df6495ffffffffffffffffffffff46e78c05752c659903638a149f3067a64a01a5c5790295daa2f7b905752c66610193f988fd2e7d68d3e5e21b0871f3fd1a26ebd308752eb3c90303e5ae2233f3a289000000000000000000000000000000000872e845192d96fd07941906414155d2c127bc835d078d42321201de07941907424238e84c7bb163ad0871fc2c91aad6fffffffffffffffffffffffffac94f1407711e8b390a44c018e6a117078d4233315d438e410a260871904c21055d4aa10872e8473a041e9fb3303d0707711e8c1a6b6dc00793c9631105410871f3fea2055d4aa1000000000000000000000000000000000871f3ff3901b6c80000000001b7af972a131c197ca901b72c92a90a00c9f9ec87bffffffffffffffffffffffef9c92c01b7af985a79329f2b1abdce3d1d60120c6d609f030c57b72f0302c06d952183f836720116137a390576672ea73a5d0116137b1a3ba4150bf898015983ae815f9a9f658d7e167a0b77afcc611017420c611585098000d7a50bf895ef1901fa400bc2ddbd621017420c611585098000d7a50b6c1ff4690288f46b21e1221b011f9a7a700b01b8485115aef394c701dabf50000afacf5c391983024774d5f20bfd927c1904261e0bc2ef7811a8140b02eba8192af2bc0bc2ddbe32e39b27f810270b6c1ff73923db8135eee9500bf89804310746a52880000b7edb93030b02f8f4192af1a90b7ede22030b6c2252190467910b7edb9a030b77afe031e39b27f810270b6c4455311cf8bb3e6c90004d88071a98968000528b931a3ba415007a19721a989680085e0d710901085e110f09010024713fe956000000000000000000607b81f5b3ffffffffffffffdc790d903f0000002793ab69e8da5a689c321f12c699d53338002793ac891fc3359281e68d1552b550d9781c27a5d60b8e905e09010b8f887e090106bd5ffb617f81080add9e3f7b3df86f3306bf75f4796237be4cabbe6c888280d42e5536700000000000000000000000000000000000000000000000000000000000000000000000000000000618d50000000000000000000000000000000000000000000000000000000065a7d26e000000000000000000000000000000000000000000000000000000000c6d64315ea84be34f8963e526932bd15ac28dcdf1f083c6e34058a5a5a8247b5a8658790000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4705928518e90692d1ea25d47fdee93b4ed7f845ef670a24572f1bf9d0f9d597369686fec6c7ef322250666e0a93156b3257b3306dd896338eedaadd9391ee203db000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000026800000000000000000000000000000000000000000000800b00000000000000000000000000000000000000000000000000000000000000047cd38408cb6037fe8a1f9c5e72a6cdd324b91c7cdcc95de1e9c0c06f934cd163000003e8000000000000000000000000000000000000800b000000000000000000000000000000000000000000000000000000000000000300000000000000000000000065a7d26e00000000000000000000000065a7d2b5000103e800000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000005c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470000103e8000000000000000000000000000000000000800100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000103e800000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000019f73f98fbf05f807d0cf18cbf0fd707bd7b821a2ad7bce28fecef1e87cabb9000103e800000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000001d63141f04a47239db71be1201ebd7a9776d8ab78269bcd795d03f6171c91a481000103e80000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000000235671561753c8c59924133af0011f7b1ef920b7866befe18d33d6856286d0a72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3cb0000000e000100070000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800af7a443a74e40f39bac8ae5aa5e96d5faefbec43a41a918de0eaae1866f9c1aba000100e30000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a32750d626f4ca66b27e6d63be858dd88128f827c4654917a4801a5cb4f5d922d000101150000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800aa863a5762026c4eeb5a0dd778c009cf159b46db510b12104eeca976fa99f5f5e000102500000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800abdcc3e407f502642b28d976f213544ebe6f6f309af1c1ed1ef31f5847a634f270001031a0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ab7156299b81a6be0c5cbd0eee76d62d1b864899acfed6ac497f9ac7f5a8e4ec1000103310000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ac27b2d386308b493e73014ab67e7d9904afa4a920731f45ff236492349e7eee20001035c0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ad92532c6cbc4ea630e48ed485d04aa36e678e2335f972235b6a0582a4c353c9d000103880000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ac72c6d16b51b694d9e5b17990b01ff2d18ca9daf87c2a9861e1e981e0a8551720001038c0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800aad4e38b00268eccc9b494a3c97d58ff53273f33b2aa1e451e5aaf0a11e53aecd0001038d0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ae18cb5aa34dc325f7f3bb6dfaf316842c10a1614f4267598e54776148a6444c70001038f0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800ae02f8c6ccc4d9fd88cb6021f382487cf9169235eee9c0fd040f29560ccbe227e000103900000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800af06296bd9348beaa87b5491ca13cc73c44ada0e69842c60d652c47fcb0f4217e000103960000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a3e62fb6d8ad6cb16e262be655ba69ebcf2b2d351d8e6714de5d83759984afa5f000103b50000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800a9a60ab7dcd725e889a93cceeb6bfaf29971a72fd47d2abd1520a6d62b5d2f0980000000e000000386c0960f916f896def10f87a035a9d6327497e680b7a61f800000000000000000000000000000000000000000000000000011c37937e08000000000386c0960f9351e2347ed91aa0f857dc41c023c7573d687ddd90000000000000000000000000000000000000000000000000214e8348c4f0000000000386c0960f9530200a82efe6647e1f186eb7d36a3843804b2730000000000000000000000000000000000000000000000000166d2f702508000000000386c0960f9f2b66a992e38a0a285843dd6f2eb40a4b0e6c8ff0000000000000000000000000000000000000000000000000166d2f702508000000000386c0960f9275f52f7ee429875145fb6e0d42a1fd6c8a0a6d9000000000000000000000000000000000000000000000000019cd348cae68000000000386c0960f94613aab4a5a2e6c7e8ea6550a6265106e81f9fbf000000000000000000000000000000000000000000000000019faae14eb88000000000386c0960f99008c734f9139dd75fd1c3a0654cf2e57974f5c900000000000000000000000000000000000000000000000001a4ff1f45e24000000000386c0960f96b27cc94c23cc2af63361069068c2f195cbc03fe0000000000000000000000000000000000000000000000000012795f58d50000000000386c0960f917f130e682ab259562daf2ceab5bcb3d3c4ce6eb000000000000000000000000000000000000000000000000019cd348cae68000000000386c0960f97e4fe4038b702a4ea0b7fa4a6c0196c34496755a00000000000000000000000000000000000000000000000001a3935303f94000000000386c0960f900d0636a5e44a4c2caa6d9abc278be9fbe63de2f000000000000000000000000000000000000000000000000019de421fc554000000000386c0960f99c9bf505c9d2e37038fc1e0ca66611645b5d1814000000000000000000000000000000000000000000000000019b677c88fd8000000000386c0960f9cf26b243c9bec5a84212f58e752fe7d62aa228f700000000000000000000000000000000000000000000000001a66aeb87cb4000000000386c0960f9c377372ae2560729d0f4d27c92990070615ee0d4000000000000000000000000000000000000000000000000019ab19668090000000000000100cba20401c689ca0ca8bef11bdca00441b999d871b172cd97111333b09c430205c7a3fcc4670001000021a88a3dee3b0944ff9cbf36cb51c26df19b404d38a115a2a2e3ee5b88920bf9dd8ad8672b81f7116b2f9e42c443cf1c43c6b57463bd35e3915cee80150001000021a88a3dee3b0944ff9cbf36cb51c26df19b404d38a115a2a2e3ee5b88c8efb2960224c6b494a82001f9359b208c697505d51f1dc6ec3e8e51d2c89ee00001000117285a242b48c751232df502f6448f1dbf4a1d9132f1cccfce399608c80d039dcde865b5a183b4edee7d0e3e41149a87cc73e85038e92765518b6c999c0001000117285a242b48c751232df502f6448f1dbf4a1d9132f1cccfce399608c800632c8d27a8ea7f899cba4431b5965a3776a2c3bd775415e2a545b9ea7c93e600010001954939ad3f2944e4a4422d0bdf76efe212b361090bd109b7add6bc0422eaf2466a0d300c7a0ff14557e41c64750c16f7c1674982d75432e945e4f02bd7090132fc1f42827cbcb2d28d3be3d06d627c5cba5fc4c4e324e0fc963a8a03dbce6309013adcdc56962975981d38d692934849b2bef585e4097c9896a5357bebbea8c19e0902e222291fdf135d76baef2d064b7698943cd669223d3d098437b4668247cdd6cc09015a35eb251fadcf34525460dacbf373b6e8dfb1d6dbadc77c306bf8fc6d6773140903ce12afbc3182b6fbb71a4a771ac8cdce95d4c16643a340623b5d2896622322d90901b4960461a8754d62477ff25f5c23a72ac0344831ef6b43b3db1718c0915cbfe7090140405ea1ae25b0361bbab50af88c0a0916422dfb6f37264920d375cb91c444a80901be07be24f32981abadde1ec6b92fa1ae94197534040b5300f15705f48b51204f0901069a4f1394f71bc86fd1eae10528e1b417fea8b04a0266644291ca1da01ed0730901934cc62956c78dea6093fe347587bf8a820e9bf3bbe7d99221badd17122ab0a70901ca19c536b856f1b32bb6814d1048f9d0679bec314a04bd1dcd777589860e94970902da1904e7b8a4c4446217b98b2a08b4c060e60ecc6c73ab18c2a093fe46508593310617f71eb80098ba618ffef474c3f1600a62c83050ed3f5b97b66db3dbcdb0ea074a0254f3b33901bda703f0a0009522489e75ec0620b06aa24237d9fe173b0b8e632211784e751fbe2e077e5fa4410c6d304b18011001101b1d367f849946541b81bf1e65a0e7b8cfa64d3d730a393e5757e478a664693920e47dc01e5800d17efe21d7bdfff838931f653af509c8df4ffb28fbba68a722055cd13dd1feeb3924d775c6522000fde65ea6ad6575fde1fa61c0dda9f7c6c3dde414155c4ea2baa678a65d208fe13908e1bc9bf0400060786919cac3179e0b9b300ae90119600bcf82d9aad34629fca81098931738673926b97e040d40007e7ee297493af084c99ff4ed44c1b9d60f088b6a506dcb43c11eb1cd155ad4d8390dad8dfa62a00062045b50c659505b703ef983e895c22ca1829178e5c06493d8c1bbc84ca270853906ed83c14fe000443923c184d9a360a153b71ece040a05eff2f6ff16bdff8f552a5b2cb6db3b4231069805acb4000cc5a8483718833a74c1edb1d14cf72971380a46029c925d3d2ef705106c50a139038d7ea4c68000530321e88414bd23996ed2e64083bd5274b3cc04d0dd364c9fef65049adf267e3922fe85d709a0003f3ea8cc53a6422506b3cf0fbd3e42936d1e6d22360078bdb3f78dce3511afa7007cd38408cb6037fe8a1f9c5e72a6cdd324b91c7cdcc95de1e9c0c06f934cd163ad28e6580fd4e1cf3e8ed45aed35ab96e00957924cce1ded536697c2911f774ed901000065b1152affffffffffffffffffffffffffffffffffffffffcb4b6b565ed1a00a0faa56e6db5530ad5ee9e6ded1bb3360cfb2efa4238fb4af0a011b254f609c388529235ed2de14f145d6f9ee940fff64c3fcc91cbebc9aa39d50499c9667a819586e18263e6e85f3921a20628cda5a98def61fa979d8e3d6ef8a1c3fdb237f6dcf1c661ba1b70e00813ecb32acae2aa5bb7b063efc45b05b4ade9d2a368cd01f162239549dbaa2cc01d5e309ae627cb69d37317521b761c73c0901731a6cedecd6e00a8d570c5b64ebb5df7a934eb671e63be80cf244d0425fb52209010370b785c5ab73cca641872fe99c9e4b7c03500a4e0b22a3607895a3156609d1a1afe2d52343ef4c0418da42b44961a5e73a153854eb5e3f2123c35c243cd13ed8e4e63d0caac4d52d394e6179809f2e595b9ae88d0044a8addfbc1f8bd1e7a63c5014abb2d97493d9063c2d3f336ef7483ad8f2629731eeac7169793b4ba017f1c516cfbecf11a7c0e71221347ad9b5eb6eb4229433a117b0ff54def08e86239664be743aa7e3aad77a10d95816da96d1709df7e330d0e3aad25a48a90a2c1ecb14b8b1af9f006969ad7100797573756673616c2e7a6b000000000000000000000000000000000000000016fc62cffcbbdebf74aaeed996d8cec4691b3c739de177672ffe54654ae0049160007a6b0000000000000000000000000000000000000000000000000000000000049cea8f49d011c6872cf5885ec6324ce96b21ee8f49947bdd036db958aca4825900cf794b93fd32b70fe8dce1d824a74aa9272cf9ca19edad48326d9e9826a16e65b52545c1adf4bbe6f7e9f13698fcc9fe52bcc32b669793cde8515342b7ae0bdd007a6b00000000000000000000000000000000000000000000000000000000000497ef33892a0adc31f4aadb52315fa9251f792090b42b958ca2bbc0ab065bf32600616d6f6562612e7a6b00000000000000000000000000000000000000000000129b5fd9285b65b9fe97447554e60ae069dbf1b53763ecc802f37aaa3e9b273d5b0015f8daa032128384cb7ef17650124ff5d5ef9c2d8262eddefe9ea81ffb349704a07048290a0dc69b3530853d51a7338e4ced70c01fba5e81820334277bbd235b00f9179b66e783c7a7c03c3af02080418ef2e4cdfa40f9f62874259721d6adabd0f4d0ace674dfbedc27ce2f905a9b45eaf4320a5aee3eaf955b4470aac201827d412e0ecde667f9ef9fea9139c8b6ecd7c188b6aa3332198b38f502b73f83270be7bf830040833a6cbb09014a915ae1f2017af9bae3254d31061abe6b7ad8293cb6aee469ffdf9a422ebaf8296e017270f6f020aa55a5164ff7a5bef41809ffd9f5415fe71f2e19dfc90e0578a01985f6e4a167353586d23bcee18e003752e4be7de4825b48eb78717df34a6abb2f373577a8f38e5b999c8a65d1b915b994116be108b9d3c4e80a01e75b1a27423c426d50206f2492b7ae28f9f17b8e9b6ff804e69b700b4b5938d04146b6f28058995e2518343f74495ed16e0dbba09282837e06261614fec535e46323b37d7260df79d209017bf1397d4e85508cdfb426a88c38e7853113fc2d1b7dbadd63da4e1fb9b019cf09014837e62aaab014958479c72615949a281c7500f060a5af969237aa5fed48bf48a104e9db37d8ea0760072e1ace3f2a219988fdac29907ebf4a73965241adcc0c3f149b50e60e2a80fefb7d2aebc013958ea4f9d27b0901f066615f4d2489f622fe872d6a571ae871bff0b1a3b1b3fd46949fbdf1cffb42a1c5db68f30d21cbe0c9eac7be5ea83468d69297e659a01e8d0ec4ae3989d22016feba85a222e35112025b4226d1aef41fc58d0bf8a104e9db37d8ea0760072e1ace3f2a219988fdac296cdfce1247a50cda9b4818ea753e4ed7b6f259342f5197913c89105a7c4ffc4e0902bc2521d32a449f185e71855055e79f5f01c8ba3a06cced423d6c6ec9f1b19ba20901b39b3d18c3c9f1b44bd85a0fddd68cc43d3b7461de1f1272de5605de2d4987a90901e95614fbc72b4c8d4d896ecd69a1d486af67b9ee82425f0dfdcec38eef3cff33a10e595bfcafb552f83e25d24e8a383f88c1ab48a4540245aa8146d4326301299e88a69ee71c1f6eb2e69e386ced540b2863e8908ea180115c708e12edd42e504c1cd52aea96c547c05c39231312c390274efe7bd02e2c8bd88df34ef854654f0c05eb8a084ab13e3dec0901e45aed04f125a5b712136c6712fe358a6ad5a6b8d6ded28fe5a5650e263ecd5309015ea426772d46fab7e5eda5b71a8d7f1e2c380c504989bc37898329cfbb3d4fd0a180115c708e12edd42e504c1cd52aea96c547c05c918acae695a8b3d068e4a0ed6d99f38f1389416d540f163df0629d02c6e7ebee0901b2a51fb110af5fe789a26ea3f437d40527c183700b05883b06a2affd5fefc5330901038ba65af69b24b09da0bda800c84f4cd2307ad4dbac2f6f7a5d421adb08cd943118e501727106f4eecdc72e5755c21f4baf0f7dffac45e303d09c9c2a9f5c98ec6c01071af00ba1f8e02981f978f11dd730b768df7e714876fcd6ce629991121e1e0104b45524975505a74b603281b670709011c5dd85285d0b66ab493aaafbe0cec3ad26f42ca32e10dfcf502bee474bf6f0bf6cfa3bbd67230ef5c5f01fcb93b91499c8790a019499f4746b2587c66d42a9037e7f87470982ba95590fd5b92e70676ddd3ca79121019c40eb182beabf1ab9b67313b5c8fbdc2ddc1933a7e7e71d3fa5123ea15d3eb0fcf8bb11019360ddc36632855560798902d5bb853f551887d26453bab20e075b4af612bd21390a01594f7f7c0acefe3cfb2c0d974a3c6bed4010af6fef6a0b256b662bced66b9e822103085a2b5eb0d1f055cb0c2023090fe51623d3e0bc619904f77808db85fb870ee79bbd962103a422bb6eea24755e624417fb0e307e853789ec86447534d0b42b461a7c6e7ecca502240a01902f478532bc478dd0e26d4917177a2037fb6710c95ab8f91dfffc527619b4ee2103da7e31ab04c42959010f633dfbbb7e786d437a1977672eeb3d7c339bdb806682631e71194fe139a270a2d8acc92b3923df2cb3746118917961c68ae3a9bb1d834cfe45453cfec519016342031df0fa9248c58df24cbd078110f40fddea4218d04881bb19d7c84a3905267519c0f9905168531c12c1cfcf6ae94eb374fd73b6c3f97a080807fd2a41fdd96acda0666d1985ce53e38e4e1e745ccc12018000756e85ef20716672b2aac50e3e8df4204ea59052d30a01d42db26441d15acf977ae1704c1c34c0caa04b838efb56c3bb626c33b0c77bbc090138849c56a0600fb6c2d7727ca26ac9a3496ef395d2e955f103f58cb2d5709f150a018a4df95a056a7e70360b3492d8d0342affa837077a9a3ea2ed2680aa0fc73b67190f424073271b0a40b20fdb3aa79fd55a22dd158b4c1118cc843bd54deae4dd66633546210644bae3f09a82eaf690ac05cb00746c8208be1d7b6501e212ba068db8b1fa8e59e9c49119ac913702c6c2a86550adb4f5d80386890cdc228d42aaf9bd2635390038988590aa75210a0131083491196fd35e0d04bf85493c518b8fa22ce9cecfd9210638195d3369f38e19df1eb130c4c80c202016d7779aa07cc069c4669ad5cee7e30fc681c3185aacfd31d3f7198bcde2d94377dfe82efe077e9f27a77a8e9324d4e17fb7b8ca294dd0fafcffa971d90e21014e8722accee8aabd63cb59557e77524805313735f761299a7db398d00eb99fe40170a70a0139425fdfed5101d0a91e77d193397736fd761ed1c29fff3ca6991d8a911498420a01df0fbbb3fdd93da56295336cb849285ceac9768a574cf8ee6e1dd55ee05adf251906fb76fcf7266cb3df17671a8cf3092836a65e18ff7bf8cb047b677aed456b900ecbfe0a01ca7e23ce5b93f2f1caa8da8a02f71d15c6d5253baadd3fb5e3fec87e17420b0419aa8320256ba25f6ca71b5f7ea7ed42c33143986e127b915a03484f4726a59977b5d0b819e9f2f9aab452eb9689cf967c4015751dbfc92948b5f44606662ab598de994935c34f160a0105d52fb262185545635dc96bbf14dc331b0deb08c0c5a96fcd5665a48950ebcc1903e41bfdf6b60d96af2a1f88783e7a1a3a2f2fe2ae9ad7d060f87122c1250b0497f318210bf0fecb1189f73144a7a583c7e1ebee88a19c7be99d905d62254edb70063bdd79c7567da14a792abeb8c9deecdeda2010dd1598a2e5ad1f6554d65c8c542d8f8b2d972860a18d59bc1e4d9d15e8e7d2d815e6eae4d3b161eea15c200f5343bde75110d2e324978fdb3bbc808b9bdfc4d0689ca99a09630826f769596e1a6eda7538939c7f0401a8307c46d7a791090177b9ac1fc5eccb594a75b388ff08bb40cb45a0a3fe89325d921e0b710c28378a3107e2017270f47fb4ba5b5689e23f8c1a6875006c1d317b955a7558bb18e091b411207bb8d4e9a10c68091103e5e12a91bc55a537c0c6dbbe3944ddd32ed5d62c0c2dbcccd67fdd273965cecbdab1de3544130a1a6821c20f2e6e9c49027ac74958d1be7a78cb289b3632943e87cb3faa88487826c7f90db593b03559627275b659ee0fc49709018b6b08ac8a1bac677567e054c53e1b7b6d5dec028265eae74fd51bf3a2b8058fa11e8f1099a3fe6d2c1a960528394f4feb8f8a288d7d2df0ab0b9f9fbcba6c797eab827990c604b935c90e2018aacaf82c469df796090190ab235a37e19bcffb5627d4b8efe81b494e81f9552c8ea884d6ced454c215a80901990d2bfcb7f867ba65763f9ae631ec5f00fd59968e522aa0113d7ba46257941d3135900172710f664c5c14290e77e58ace81df68ae3283f72907aa3928549060599802c0106722a1ad0767e1b25068efce625053c982c7cdf26297e259ac4f125d0894b4d438280c4e802fcaa9c9131d7ccf16df29755090d23f303209013ace2a65e389a860cb53155c9b82f6a08f02ea896587a98f2b736498775f7d1aa14aa5cc5f01876266b9a0abca2a77fb4af9425cc3bacd98aa14f9194c5e3f764c16f9f4aa9f12edf150c11da1db9b00c7aca3da60a165d8e9461f9018596fe0ab94fa050ffb3bca242f2ae968b1a1ce9fb985d009282f8c8b18097fb9c65d01c31a62ce89d3e73d1e6239065815f32a6b526e0458aa24535ceeeca2c6f2264f7232db951704b8cda8c81e7c9e7096261198391c0da2eaf12cfe9c66bee23b2f533f4d78849e637e24cc5b7a95bb7b8c5443de60a1121233678a391b80125035b08c5f4c72097600625006c2034bcc8f9abfb625ea1f72b2db5efd98816ddb7893e84902f5e3b62a7f84f8233d345e6ee81337c94b1203025ed807be0680500cb93c9bbeb641242355efaff839063aa5f8e8809709286560af7a8432cbdaab706e68ec25916705ab9e68ccd0c0c9e5a3ba4d51103911cd46c2c5e94b227695953579a486f73adfde3d65c2062770c9210e27126b576c4abb3e1563333910e0a5dd4a2aee9178869ae297f25f3c33ea486b6411d6395036849d35237778be00d2af74f1d1392bde91afeec421bf6dad4795d2514f6d14ce9bf6c9476022ab9f014daa9e1abfd1777bf05dfe36390a5df8bb2ca311de5e7c251cccb60b48d3a055542e67f24fcd9ffa14b4b1133f74af727d88f29b390ab02b8fb02240ea89baea973a796fd1252b04dbb415914493e7e224ca1c67568fa3fd126c19e23903bdacee1b7eb540120a1a0ee1d2508502246422ce81748d52735e64bb0d850ede39551be6f9c43903b744003af109759b1dee86b3cd9ab3b0c5c5d8bbc91645472aac92036acd6a3a7aebaef0f3810901413ea6dd42158cd238f3cec4c0a9a868a9e0faffe75272dce25e86d39d3de912a14aa5cc5f01876266b9a0abca2a77fb4af9425cc39e8c44bbdd898e86e5a27a462acf142235355edc2e7630a66c1f8995aeadf699a165d8e9461f9018596fe0ab94fa050ffb3bca242f6a91f1a6510d6c44fe4e1d3541f9ec79e59ba241929a0ed43584911bac951a522102034690f5b9b01ece5efa38b460708be50a5fbf586f0e3a1102a68cfb2e836a8aa49cf00a014ea1e7d4721d451dbe39100f09734642f8e076b8916270994c905cd8c0aa15000a0132d31ae5e49a8452c81b49715e099b10b11b765530ffd139e565b04c5b2b1bd5090162ffa78be4157b9de4687c6e2fe56da78bf17d75f92008c343286a89866bacd911635d6707f810f8d52697eb390cb16271cfe23e09be84b46f7e967fd620f964f78ab519110f80568c5940f2ffaf4e5f69958a25f292db11344012ba85876b6aea2ab6270ae1bc0901dbf084b9dcbdf3834129e06cdc278af3f4f3fb8e3d6e964de1c81d3bbaa14b8a11635d483bd7a7d8d228158e367b5718ea601ec8abb27374b8251426926441245aba0d0a01f2e7f2d2dfdf2a5008171b734000a825767e30f2093eb5475b2aed31d8e5f7ed0a01fb3b04685d89d8357ae3eb085719b82aaacfa66861366ffbcf0aeed7e3fc00e309082c7db604eb4d8996844ca833815e736521f6498e7a8510f574abe4c3a2b5590f0908adc58da51ed086f76023b1577dad8841b67c9c2900dd337818e13e2e12dba7b20a01a35a547b032a0235b3c0e6f311d68b7d53426182185a0bd8e560cfe5a26d41fce10352366b755cb138795d8e3e000000000000000009613605b936e1ebccf1ecce8d3369210ca7f73e65abd8c3a281ea4eb3849055bcf284debe875bbf096e8e943824d259a325e3a822a572e49d2ba92162b72b6b7859acfd40bce4672cf2096e448cdbf97630f20c354f365aa88410f83562932dbf8ebc3efa95a1f57d31c72b210134d6f59a6d0c1a19eb7ba6778ea6e6fa45f0048d1368705659cfb037eb34dd71b24431210134d6f5ccf093220fa70a2241b6b3c7d34469556c0e93d2977dcef1851783468acc7f31210134d6f5d5fef07ba1cc4cdc63dc10b359dca3035a1a3c4aa6043291fa61730aba55ca99210134d6f5d4225a8989d2d253b01c5540b83cd491fe4970b8836978f1660252a1fc4713a9210134d6f5c9b58bd6d5b831c69ba80c93f3860371bc5d6b74f2587b62722537ba62b65ba0210134d6f502285e1c638ad292ca9ccc58e174f09e35025f0d39526c3229bc70bbb1018dec09aa62b592399550c1cc8de34c2b4ef71458784136e718ff17be189e6ad5e5a06d47210134d6f587ab8414e74255aeb674468441bfec19f050c8281254357adb2cd4d9227f26200996076e8deccca28a10bddd6d8803b158903540a3668386858b79556eaca4b8ea2c09786669672b923615ce2188abacd14cc096058a9d0b6909f94dd1c297aa4da85e31210134d6f5ceeecb578ab869ab5abbedf17316c13fcc15ef5fa4baa9f7a40e2bbe2ef6009c210134d6f5c4e9c832a84d81f30d511e7f4fcd8e465f880cec60017852d858c5a1d4de922e095ae9129a76283128e0e671b1f0d6017fefcc502b00c8f85f36efe61a8f22ff07ce210134d6f5808690e0534554692ce37dfadd42a12787734e5191de98b90f019778f4c5a89b097840245dc52e25b225c3dc834900abbfb579a8e7d96921305a0312b5807c5e790f210134d6f5e496ac5a7e4aae22c82f398244ca97e97870e0ee68540cc38fe9b53bb42d85da09788c3600cebdccbf588327d4ce138268b6f0e5044c41c9d3579075205d9e425234096e2a9b0785674e8321866559b2440103f3c343c973a7611af913033f65a8c04a5211010492d9eb361dc65f8a7bb24f87b8526979416fe9d4528d480e52213f099761665f09aa58ee89681e2e87a6ac7a739b047ac0ae23f0a4fa2ca96b8fa271557ffc32df190901911d78873fe8bd73ec50435cbb0ef6ece42348d68051f7fc545f60991d0ffadfa10ec9a2b522bac8f7fe0cc80cfe9246e0194bae1e7952eafa5d2580b7fa98113356dfb348f420b3f824a75bf0ffa8181dc669680a41063da4039b86ddcec9969ecd2dcf1897363ebdd1e8074ed11c2f98359315da8056bab5540fa4137b0901210eb5847c7ba40c3967885353581cc8b8a000b0ef2c8366152fb6d641059571090167f18df7384b9e1d309255ee6abeb6037f8765172ceeab42dec36beaefb6449c591416626ed9ec5f30b64838be34be27896c48f4b1dcf9ce1fc1a98fb8c67b0f6556ffc29cb23fb20fa831a8591416627fb11a2e3d2476a4de9b1c22fa179141dfc5ff910c79cccdef2054e547c8347f124c86c46c2cc34739571a923ca04ee1da163cc5b9b30297834d0ffa14eac828d46eb8b79f33b1f7e0b50cff470200d039571a923ca04ee1c9d1c3c2ce384cd0a5edb58b175949931915fe3ed01f3de129c18cac6432579a0a019ca59d056b3a8393c54edaeabcf380f1f4fa8176fec088b75b5ccd23e59e4e1f31048c27395000d5cdd6daaf3476d53e19412144f45aa0e3efdc4307bd63d59cf2f395e8cae077493635c9adc5dea0000055622d8780c03954b62056df259bbdb088bef01a3a1f94c5897d661823760edd391475b9c3d290da3a3ced9ff0eac0aa53860c0f9b63515be463f0af2a507e101f44e7a5be205f0ba1493abcb50436a8a8598a1b495a1b8eaca860c9cf596ea21d8d8526901f825419ea184a18ac6e65fd685afcfbbf75c7c610057bcf31157f0172710fdd470ed41ff9de815cdd344ce37b406dc544d29a9b53c28a470800fed3e899640901ad3c27cfd766dfb5e69b9ea54f89d5ed2f27e80f5e76be692d2d764a4f8bab0b091024855a2fbb5b044886f05ff536b01d9f8754081851f77090101e30548be68ca8a1412e6f2896aee8188ce4cb63f03c22c4e16db7944c40859a0c5853e7c6e9bfbdfdb15cf0d84ecdaeeac21bde609917c9b04af5e581386a88b779c54a668fb95b0dc7afaa03f103db4f60fa25ecc68ca4254d09e656d6c31fe85922224c8f64c2e54f7b8c15a144eda514b24a835e84ebb8ac622ed2944c7a01ce0d0fb1cb4542e50c3a1b3b1725016ee039619133e645a906be9d1849a6b7e98b8132e29a48f6954a16906bb70129b1afab55b59c15daa2bae4e463971eabaa54780a423e2808ddede32bb62fa44f7949cc413c3622cc0f9bcb0b0b9a7eb15147c025f93ae78e38b02f44b8cb6974add5d85912856bb76a26d7c43115a7017270ddfaef9ef0501faff812dccadefc102f2c6fe7e902e7093812a649f0fe687ebcdd0901cb8bf693cded6ded242bad16db05e583f059c0323b63cb5c60974fa1fb0def93a1b556d94bf379915c34033140cebbfdcdbf7b9d0b8a5a6708be01d4184a83df754016c9fc208574d10f1c21d53b63981581f1f7783902a8d025e4695bdde4a6c2ad8f43c8c6a416feb4bf6bab277d018f1505eab8976fb2561e4e631ca1c2c2c3ffb3e2470e48327e08197549af609c66fd3cfa49e0ea7e27b74372620adc482301d90ec052f71ab96504d75fbeb138e412a1c2c2c3ffb3e2470e48327e08197549af609c66fd4a63d2cc2e588e0a22508cd1647f6379cfd7da3a7b9a36aaf39e2f656d34943d490100000000000000018316d8b6d41e540a9fea044c39e87090d2fdd1608ace16c68fb54515df090347e9020000000065a7d2b08c4a50bb9140d6c7a8b4e018c366214937475dace312bed041cbbe4052334708cdfbe10180fde79cd8512f9d4c5e385a402bf92f09014fba1f65036cd4adb7bb888f70547ff012407318815be8a07dc69059b4071ecd399371ee1432c9f5fd3e2dfd3c751799ecb14a624ad55f6a50d490ad266b28f2136524d5194355ea39147af56f90ab7f4ff23acbb4963585918aa0d4fa1d4a526e58b8256bfbb947a53583f4c64ede0e4109a411f82576c0000a316626cb84392c71210ee600355397acc90a99dd3aaf364547c53424c6c26db95bf39bde21b95d77fb18f27bbcb07f3648720a2e00000073635775f5741817866f89adf873e5c6851c632ccce9bd8720d43dd13bc802e0c165a7d2ad7da8481aefb8c6b0271e1c411cd0a81b1b9c154ff8444ba1e9b743ff3ca3d10b7bfa38aae85b504a65cfd588e5a5607f22ff8cbf0901a405e6ee87c09cd8aee040723579ce236be46d8e26c2fd6c378035cf13b200eaa1820a62adac7c62a8292107e553514860c9163b24bacdffbf2850b415cbad8e5fa37f97ab8dac7beb6fd3e5cc8943e2d2a68a52afa1ce70b7f5bb44be2f8a7f37f8c162240440fc62189030c4ea25a7dd1cd740cf92d29e2d5f154717c969b7d0d7ef29c7a740cee4830a01eb15f97ce4dc29cc22e38a4f35b9b960ccf79295de87cd50c9def7d3319cfabd41dd18df09c169417656b1e4bdde0d25cccc6c06cd36875006b101558e64e972c76640becc51ac7bed0901b9c76dab2476bfe17166049269464feb6362d82e63976179940c0f11cd6d791b09018d9bda3e1c015229a5d9109a81ac5b82bc967f1f3a6c924a910d76700671ef42090164f5787242c4ad90b673e6b90cec844fbefa3b4c3e3c06d2e676231108614aa00901917b0b6eb598e3d671670e036e9e289460ca4ad55827cf833176ee5fdf43d99709019df6e1df17998e143b5a7cf9c3e4a99cc4776717c476fd2c0380ba83e260c07c410e6ed27d66680000786a396e116639701f6a39a696de6524e0a675d7a29a87e479c37f945c63211b410d99a8cec7e20000237ce3b7694d24fdc857633ee46efd1acd87bd8f7d73ca6a75c016c2eb642f4411e7dcd60c0be2cde0bbe03d20eb5e173715be66585b5421787b88541dff3f6bc04afe410ad31dde0cce000091587cec471ca5af9077ac5d3025c2130a8fe350711faf03610429cc751002e311b88b2e14e6f2d562f5ddfeafd67dc82c7cc8514f15767e722a49ea68969d579cb82d410d7621dc5821000000125ef1effe3e3decb978f3d9120c6ad7ab44df2c0be5f97edce66d48384b4811e57ea11e7c29858dafdceeb5ff633cbc877c7604954e2aaec9e50dda086c90e11b7a410905438e600100009eaae50a984e7950d7fb2ab682518ff88aa5f243443096b146a771ef15aaf2874108be35a9807f0000596c9564aca9d3933e77cbd6edbecbd2930f0805f66115ee358d6046c35d66e511950d4910a683d59dfe1ed209f03830131bfee248dfa458d820286e4ea12a63db746b410905438e60010000e3e726fb9fe911cc76d7a216642275964192df92370e4bcac79b64e9fc75967e1199c92358586c1c2530b1a250f43e7398807afb6f7564474eb300aa798abf71610378410ad31dde0cce0000383bc611ba3a76877aa4cd3f01b0f4126cefa9d59fef8ae9b77d5c947d20002e4108be35a9807f000011001716583d8f6f72f6f80dcf50a57cb105b20955c1d0ec92f6d33fd007b1bd410ba8478cab540000fd5a9e6c6f3da7adfa3fe0c70a37532ddc6ce312e4c806867902d7fa3c8a4ff9410ba8478cab54000055e85b494688efb741e63283423f711bc3bcc2b41c7824d6955d8e6e498eeeb811c6bde2bb12b119d712e1fae4473a420f52bf3c393e053cb731dc2ce825a247b66484410eb5e06245ea0000f314c02bbf7bf242a3cb1142cee3c6962e270fff307e38326c42abb2adbf9c4a11facad52700dd444b637adca0c3c3d8375b15b69cdb2f619cf51460195633184971e6410e6ed27d66680000a9cbadfb0326d4a54c87d7b665a612e763d947cb56e9dba48e48983b38e443ad11f60e9db7456d847d0fbe78905a2a050ef6ac0f6f75c7fad4f497ea971353729a1fc3410eb5e06245ea0000c557c2dfff901eb39d50a8291973886d584f321858c0ab675b01b66f8a0c442d410ad31dde0cce0000d4268dd38974dc976dfa3a5a7303ce485dc9202a995890eeb716d5055c5b8488410d99a8cec7e20000c05fd74977fd0ece1b55da55d6b10f339f520c0c8a4ae1af96b0f6abb06202fd410e6ed27d666800006f3aec27a720f43a7c874ca6ac4e99cef2de6a776b66b8ddc1a99087585d4bfa410e6ed27d66680000b64e9bd5cc9990f8abca392fffd6e555bf3a90f1d637bb7d329a982b8843847411f60ed667f3d104f8e7a03cf9287bb3ceb4563a7da2c45a8565a05ea7b3abf40a76f14109fdf42f6e480000ccd134abda3e1e668d300b61232db6d6e8e985a45bb3b26196e52152a4275b2841106033bf82f60000d876f890277d7e52a6eb4d95943ac8224c11face379192ea2f1c5e15921cf03b1901172e3e832e459f9c774e16bdd21e151f7ae3cf6277dc1e61ad417a9fdae231eddbf3410d7621dc582100002daba0d33e425e55163632a13faa025ff13bb0a5916367257f963097ce83373e4109fdf42f6e4800008ce9ea8f9c2a2cd37d2dd7fd3ebe103392d2bf2b759b983c6dc1dfad2db947ba11aa58099d1a48f76f73347c885a6aa3d61784510b3965c1c9575aa988fb2ee6869d20410ad31dde0cce0000025ecc3a1ce20b2fb7f08b7777d8c40660f86b82741486f8b6a07c6f80dbc43011b88be93b729ea2a360e852f81147d4605890d533cfc10128317307d2a54b464ec1f441106033bf82f600005882dadbe5a079e208462a69e8cd8f5e7958b8bf7d16a857b5e74e947d37bb8e0a011374302c288ed653d748dadd5dc461575851f4f2b0b2020e602abedb6e3e4ec50a01598d84778c6bdd9f559879ed6cffc5cad254ff71e1e5131c02c71d6148ab869ca1f2372788b23df335a260d88f349615b9d7d6918df407f236e72b8796326892c668962e205ecc2336ef884fe37b88defb9b91e224a191b93e6d46ba99bd8170034441e8ca52b4608bcf01235d9dc15bba179ad96f0d26ca043614b8b876d63eb88ea3c55b20c78b8d8e0a014191e7816dc072f924b09d0a636fd132d613bb2b72d23f5c631914c79b2d9cb60a014ed939742d580ed6077871b889008bfbc7e918d601c02e28d95d877314d402540901de291af131f249bb28b8334eb9441c4138c0d4b804dd4360a0a3ac3569700412090193051a611218a2049eb8cd7c566afcbabc174e61cf592d8ab4deab56bef204642931e948824b45ccf01044c6d2ba1b924dda026d4287d531263aef36c3d297efe1254d73bdf1a15799c8c7ac1f5fa04137d206474d6457b607a6054f1f6637b33200138e99cc8aa77d56f0f7a851051ad1c4246a2048e02716d080a1cdec51e5aeae4fb870dff34f430a6782721ee48e986f99818ebd7897cd8864b63b69e8e900742559d65485437056deeac87e18da090100efbd7dde10dede48d50abed0d80db14c480365c1d982703498f4bd090f503f09011da23e5da6590faa21d1ad86e6a9cfa64e8bd68957f6b6e3fa6c17cb05b79d5d39017dfcdece40004d62640872b3d5a5e366a8600d248a78dd73ef51463fdac9797a11e6af05eb8ca1e157d39611f31e0ab09818bb2bed8e9343ae3b1bc9f4d2fa105e7bfffbda2ef8e9f512b162be31cf7facb0928f3f7c8f7822b0c509043de06bd5f084fc3af98e161279382c40554c00434dc68b5525040d0bf4bea2cd110c412f4f04917337d12bc067c68993b62cf154c50f5d68c65cebb6611a87e2509f6b19033c603da68fd66c193d1f2e55d90367fc314cdc9f5b7adcd7185721b0f49855f8a76d09013aaa198d115baca37b93764e5489fa8affc1d791fa0ce1e18de7db123fde19780a01cf474f6e8ace6d2aa0882b80022b17b670df2b14cd6a8e911efd04162193eda2090128fbb9c3bda8173e727084486004982d29735920aef6b316ebe425e449efa89f0901aa75134736f5b9864cb05d345fe281d41da1baed0441213279d98ae87a19ded6190121abd3bea83588ebcf96d29beab562e94cbc7c96e380d14e0ec4027feca4d93a11292907bd58fe71970d81a6a86553b09885fd0312dc85d65d27077803844daa38ad90d76e5239ab0036ce086c4507c3735935edff0169e255a7b08594047fe3e1956fa313188d5c860af1fd2c8881ce7fd8fe77cf0705326fb3872b2d692a8923d204e9cb003334f6a1820a62adac7c62a8292107e553514860c9163b24ba637da108e2473594aa45323206c7a22a795ffade4309a7924ecbc0625bdb9a0036ce086c4507c3735935edff0169e255a7b08594047fe3e1956fa313188d5c862c820dfc9970f311a18ce376194e9f4414406415c924832bc5482b1125c86ba2006d6f6f6e77696c6c636f6d657368696e65000000000000000000000000000022584136680c5859b14b39693712a18071f65ecf23793cfb9b22f5a48ca6cd0230a192fadf9ccee4cb0fd4fb91cb0ac5a5a22a7d214f47179a646773eb5465ddea92b6d2eeb63d5b084e7920c2c3b339794a25db221e090176aadbd6a59a6613c668a672adb47b6a8e4a7ec7967ef3c12c48d5c2053d7734e10342aa4b352d3ac35e77e11b0000000000000000000001726d653e17b624d859cf8b8e83535de16bbe8017cbff96694c09480b2fe2e58aa39cf2eb1e39354a6ba7b09d874ccb1d7d0dec9c4a7aafa54965bd7df403a0f633d9febb6166eb6a6561ef08e63a0619199f7385c8c128c0dafaa88fed209db164bd6f5f074453c0994bc2c77bf79efeb0250105fae10342aa4b1c34d9c74965b5100000000000000000000000f8fecea94d67b7852b0aacc970b90d03a3f6a2ac03ee435c5e9f444e80990a510cf77c208f11134f63278db2da12203839aabc4669e9250235dda008592c87e2bf36f0a56824b43700616e647265792e7a6b00000000000000000000000000000000000000000000121709bf8e5c7ef17ae0203305d8772239e753bc71046094b661e515200c9820cb494d312ca8d2b37d7e7789a4d7624808b8e738900b172229c881a3ef49372a7496a988ed1b1ade1202d2a1b93a14b884d491802d1a803218f04542a63be4482890d76f4b7444799095da2e44e0c1329b3cf05324db1805e2c1723330ffe48f31152b017270d5fee403c334b20e4c5016779d6b9a2ec7e2f17f310acfd07264843c494542b8c64101c6bf5126bbbf39ed3aa333ff434da05f2a74dc5aa0f3f9d30cc79bcd23d178b88068f038faca7441011d7a9c6e8c64afaaafe5fbee24469d6c00f108293120fde434434833699600ef75da1702c9100a81187ffdf440880e24f5d4a232bba621eea551b0918152a5a27cf7105b9cbec57ead58f420ec82bba5d3711f48e00d481d7903741ec2ddcd883817608a8d05f117402bc96a5d5be1efa1186842df640dc8485eb1f8348b0da0261ac153c38e24f0a1f531f66e7c965220b8ea56f0623bfdb6af5dfe7567b72d1ce6af7da93aec624cf959cc8db98fd1e2167d7e801c8581d993c99dec313775017270d8755f25c258b9dd7ec3b40a93e82d38c332154800838a6c4161d1c1b9385f370f090111040f4f3abe6b6dc158f45fb8e0e5a62678df8970a784fd9014e80f480aab8609012a0ebd92120de8b02eafd48365506759b3f240c910cbc12075e90997582f5a48a108f98deb72d7bd58848420060a6fc924868392ffaedc69873e170c8d8dbf804d969de2290e622e2f8e4bbee43d20ac946d951c61090156606d803f6739237083cc44f52660f081b4dd53d6bf6ee80196b86a2b5fedac312ff5017270daebb69d9753988cacadcbd5cfd26278a43be1e646a3f28b174a33fd834f8ba9b209014e19eb012d994dce22a2795ea391e625c41b826df6ab8c2a7de3577db3cd344719038924c86a9e2cc7df8a91977b3433adba010262103511b0509ce8c6ec5a3f24f75091190389291c205b6ea3705fbb6ec0254d94825a00b6a56877e4b3603d014344b71cef6b3f1903892932dff6d15191d7a2eab5d59170e204ab4c57c105dd92d41d789571c939b6696ea17db8b3183806517c403302ebc25cd02b93aa9d0e744b5268ce1fa1e017596c69d65cd6656f68a6382e6db390646b1a42b60e7139c1011d7a9c6e8c64affecfb4fecbae0000000000000000000ed8e37ee1509748065366b30aea67514cfe652430e5bd8faf9f0ac2d03f6a4acb81187ffdf440880e24f5d4a232bba621ee384049de3da9334f13471cea1e29cc204a1b85599993b23778e2923fc079f2417903741ec2ddcd883817608a8d05f117badfc43b93589d833170d80ad210094c2b7dea2f5efddc01e3e267f4a5368e9f090191400452c67267de3299edba2b97cb8464bbaf09c21c93a91d576a8c3b488c811938f87905b132a11b305856a8eb9ebf98aa236b647e0ce767603270076fbf2dfbd3538219089524826e218b3481d2d2ef6dadb5a09c7ae4ee9b7e61ec14fbcc2d6c27e87614bb361952b7e675d0447cb38b5319c1f81e4983653fc733d33adad72ee27c5445aaae5e1b1390410e4f732467bbc534368c7cb285730424a1f37f9ea433126aeb78eb0724298f1c6968f23f634834d8410e4f731046318bb01ac6e88bde6c381bbc919b8eb2e2a9a41359552ed9b6f55723eae35fda2e1541410e4f73720386cdb9a45e997f60e6d60b071ca610c0aa048c1adc175fd170db8a7116eb4d75f92d0da176c02dffc49cd6d5dd6f46e5c00ff87d0b53da7b137f083073b309bc981e1a45cc94d640ca15e61ddf22c2b8049dcd9d99c999410901292f03dc0e51c9f48068d464dd96bdc34533b539eedee96901f537a5d1e57ed93103e8017270fdedf4964838b80f031c05bf152b7cc72cc1394429d33f4a01cf641f0ca9b6811d3103e90172710baee3fdf1188ee231dec934e554e068837a15d0bea51befad0c7cbd60c8c05e37a14cbc44a03ffeb1e6772e363a05630af98dca9845350a910c82d8fd70aa72ef9aabd94c66cee6cc79870296133b22e03541107a3709018718f9ab1c48811d2f1f495c6859439d17116165a0c087af5756abb963d77637411b0501ad06754f9a8ff367bff1ff7575ab72a129a18e86361394c84bb70a12eef33de0a8cf7ed0290a016e4dc3ab483b74122e462730d4851eb4260f83425e3939cfaf68466a865bedee19011f16661dc0f25208e2eba2fe03f1bae00af04e2361298125a82b67a7afdbc88db11009010c003861dc88cff04bf64ae2c0e074812b5588f4496afc1e58a780b635b136ce0901fb632910c52ff9b53fb074516c2f9163f121dd233b080bbf388952669baf54c4090137cf18b6e82597e884fc607dfff2acda2def907067dc095eeee688a65012c9d9a1e4622a57ab8f4168b80015bba28fa70fb64fa246e40b35aa66cde0bd344b4f3af655c50fd015ef0e98fa4723e4ea8bbf82a8eb7f090188e4b34922cc37ee9e658f0ad3b15fe71fb930915956bedb8c185a8e84ba83a7a901b2f4db04dbc8ba0e32f4901bdd1f39fa8e6de3eb5417a4270cfcc41286f5204fd32d204b903ad4775a369b9cecace169d947afe80901d65c06093154f542f3c266c900b01623877077381cf303f136da9e7d7e5ab0a279c097ce7bc90715b34b9f10000000005962fc2eb4ed8882c6d10bc4a1cd203c3ce4effa05419cb5d7a7168452205a9c0901beb3e4bc8807a0e0fdfd98493ae6a21383d8c9108c18c3f0452991f9c9634edf09015eb3750ac50989b1eea4c6e86c0f9c04e0e688d6c18b6d4da4dc5eb8c876de7f09013cc80473f78ce7ccac5b128875df391cacc79d0240f24fa1ab4caef0f71fe1e409017948c7aeb2b5311c1e1693bb47c3544f0bf51c82f01c5945d99d49db7a5f604a09010192bf5eca206e493ff32863b7130e50c76e2cc0e4b2b2d3d2e2c3b4934ed0750901d0fae637de392bb1185d506c043aeebb758767059f2a783120bdd08353cf6fb000f8f4c7fc7a358712f427197621ed89364bf3d1504f0fb8a966417e8c1a83e5c21578759c87827ad718ab0299754ad5dc245dc900135202c53b48f5fbb2af7c9921678905fd19b5e1eba3f9a2ed6444a7a3eaecda4ae21d7ce05c855d15fab5969ffd04e90d006f7579666f757966000000000000000000000000000000000000000000000010361e90609b214e4fe24935b766c7630f3fb5f59cff7ef51abde94f99d35904aba15c200f5343bde75110d2e324978fdb3bbc808b9b9ff3a3384af618df45295e87e3276bdb58b15e375da1904615284d297566e76e0901ff5fbda2fc4d72d5f2b2304b0e36fa6157c904799512944552d9e3044dc28513090171a57862db61fe0e0d2e1c2c6e14c20a6808c9a7a9266531dac3b705c0bb71e7090175a2dfe749e2abc468d88bcc95fab31c00949a157ef8c0ae731d1b5f627aafaa21678905f57c001e807db456e9c2358bab210ab0e5d9255a9aaa9b9f3b19e6f697f246d78f0073796e7468737065637472756d0000000000000000000000000000000000001a283a93743fc8871c0b0e08e74d75b65669decb0b44c22596112a4a279598abb700f8f4c7fc7a358712f427197621ed89364bf3d1504f0fb8a966417e8c1a83e5c2512180af562a30c6bcb748bcdfd3804e475ed6fff65413c0f48f3e79f0bb8062a1f9c04952c18c3849d120a490ef8bcaa527bfe61c115426d455060c89313450f0518d021890612da7b499312e63267278a6f323e30002f27cccab9fbd9d14fa5332131a8e370ac1669e8dedb8545bafaf3da47af47d3d1df21e7110a5fbfda79ba63cc448fcc8d8578e2ab315b453af2856b587cf25a15c200f5343bde75110d2e324978fdb3bbc808b9bf3f154731b26c6efdfe53b95cd4e4b5e81e202d19b2da83dc0bebe1d4c108fd4a14a792abeb8c9deecdeda2010dd1598a2e5ad1f6527feb5960b1467dd5adf09a191cd34664fb4392d2099289f2e45eeacc113aa70a14a792abeb8c9deecdeda2010dd1598a2e5ad1f657f243478d7acc6bcbe4ebdb4f5e78cf8cfc24a5668b7ca644354c80c4d7f6a0d0002f27cccab9fbd9d14fa5332131a8e370ac1669e8dedb8545bafaf3da47af47dfd472345a5f267c54b00e749fb6033e3904bb59384db526625854738fe9ec50200820a62adac7c62a8292107e553514860c9163b24000000000000000000000028cf6a12478c91f76eb210ffcac39ede43324f714d2131c361c26d2033869e8a5e0901e098b1b65f2b688a05b39ab47684ef557e3c07393eb199c63970ddd797e00f93a1b81ad3b05dc4e3e1228c9f0b84013638bcb997ac92dcc3f098fe60f331b72cb4714fec119406f6bb4395ab50e75cb359a0edbd76a1b586b3d3417af681c06752811944b871a217a1befd1f387b4efb7f8570f0f7bf0ecc4f6b023a3a6229367767d8662edebb255413190b5b8c12797c4ec2c8b5ae3a17e2254c0ebcaa50ded48857bf526d69ba7b8050d6d21c190b5b8e45d5a6a0f7eb81bcc6ab1e6a013bfea52fe5382640f7e7aef9e0abc053cd0d71190b5b8f7a41aff730e4cb25ed9848c010702b6fc2a4dad32b28076b51b20476f1595ade190b5b8d9c70562d5d0a019431827d2b9d4941744f0f9c788772b2fc2d56ad1dba58cb06190b5b8e1a97d26c94da37fbf9990cf4ffc363f136f4aaa9f4bd28cfc33d9a90054e6aa5190b5b8f87583f7ae7e52041f8584b2f7dc618c889613c3360ccbe2647bf697cd69786f10901c667da7c7767300eec40ea609144be4232230ede17e1ed4c5c71696f6143e2cd0901c243b197158fd27fbbf54cf08e18b6e34232c19184ed300ade4e28ce9205a7f7190b5b8d43bd108576a85795f457225c18c55c00cb0df7104e5ac27f3d8622e97af4f111190b5b8e5eb243dbd4727b8c1667429be446336eb0e42db0854dfdd07a453f7577febf00190b5b8d54132bbd36e5fe405c8f16173e78e5f9df2b8f774ffdbe34519168e37303b988a1dcdc7eda3cfef3c37d813400d7c88d5504e737a4b8c6ca9cb51d7afe2e3cbb659b9b5969c9775fdda48c9eb8145c4d791521f7db09011c4ce34e92ed5c9b82ae0f5cb4a08cfbc176379bd9cf1c6f1352d128c8f6d0df09016b75d2d413e211d6cf632893e56efd7c7b7be587151371d6908e990d459b63130901ae11d291e62b344b663c5dd206b9d9405469322c05c126d03bd38114e3ad9aa50901302929ec60eb479572c9280e9cc25a990f305781ae51fe0f694a3c69a2375eb30901fba850aff03e042110a94f1072eb03ec51e01458422b19d69f237c409b8973d40901a2baa9d77dee7d95b08eec307e6a06f32c5c27798d19059b40375a37466aeade0901812507a876d19cc037105dcb2afabeb6212733f2e22f308221c2145602eb088909010f2dbd20e103f5a5ab8a03dc396c04d1136f9a863b7168822065ab74dacc9fb409018ca194f7263ba4d1ec8017d7175016e0d0554af42a5e7e26cf4bc7e164d3865f090196eec1c6394eb00d50f8fc76bbea583f26a1ed9683cd26cbc7cea0a9fddb3a7e09014b4d7eb9a081d04a5a753df2d15d1d31937b4c0d905612250306e0c382c85ca209013c9d0be58679c058913c3abbf3a53df1c57f3b3c3df277e214eb3b1632ef7690090145f70053196dc2e9a3ad14fb8be94e5e417db8bf0c3aaa9b7020d7425a36ff0c09012e0ef0cc329a23b6949f59e79468a401a885c18c9a9472995b4e0ea045be47a3090108e17675889cd42445e662a0a2c1fff6156ade920ce4c710f5be850af981230f0901c1d70dda0524ba0116645052759c4fdc069a2c44a6987659213b08bb1ba738e50901b138800252b963455f5db81445db87a2c4d8262b43c78594cbafc5984e0a9a3d0901e48d15071a6f8a37130cd52876262b6be4547fb89fe400860b984a620e2614e30901b54ce651022d1650026ef4faceddda04c4661defcd23a517f0bbd9be984aaa210901e0b56fe5094c6d415ff8986627581017ce2f8d59734f2774e246fdf4a05997e60901cad3801ef7649a176054e8628f00e9b413f9523a596861afbc66c85b8c50c91b0901d0afaa8c56f9509b5e144d2456634712207a6b35f4e65004a92adaef97bb4fcb0901891410c977b80743948bf951a422245653ddc855d0691db4ab9c460412fd49ca0901e8921dc151b064a7bcdf2b40435d181f48b4c61538454ae1eda2c67345de1fc20901cc4e5c6ef0624fd24167cc4b900de85a0cc4906046c308b3e855f736e5c6b59f510385e4c179656dd40000c6a7fb5f14f02f3be45ab95772caa50824dcd48f24a9f3eb49192dd9c458fd92314fa5017270e3c8fac5d6a05056cddebabafb37270b6ad51f59eed4cdd1ffc61f9a58c037befaa1a348ad257ca18eb85801aa82f95be28b3a60240e995dd368f12fd480c1504d34d87bfb30add5ee206e4f5b46fc308388f671bb730901a9eaef3cd40abb88a4df932015e458ed2bacbafd08193b8002785f068f1ca9eb21017270d505b80917c687a41ffbf68feba571c7a9cbfff70128e8e49142e3974f88527d0e292da5922c89ca463f843f0d88742790db5a35158eaa63e67c69669a0931f3924ce4a88c8b5c210fc3c3bfa2c669a0a2b7a41008f7cf361e82ef3f906d898bb3fe452825f11508507a1478b9041ba0fdb72aaf5f971888f6d2243ef3b208b701d7ead911c505cc0a235a393c46d475c9f3108b59a89e139046960cc4832355405ec78c09015b5eaad686cb74646c812ca4abb60c110e05af3ac02eafa5554cab3f2bed687fa165ae399500000000000000000000000065a7d291364c2ee971c2e26c3c03a984b4c714286d6b49760ae9150f38127eaa8820f25b41016e48d4bbf8a000967eacff378e5031f770239fdae22fff53684329e1e1702d926933ed5e55b8302105f8ab5a913dc9e760ead076187a0d9a0dce02cfeecc1df8c645cf148ca657769f136500090de66f74c7f9456c422a6ecedfcaebeac415c3ce69b178dd433b49b08f10cc06de0916949d1af6deadaa79b205f71f23260d7466474bf934f8040ad1138abc34a7dae0091b95f5f70c584b35b385616cc6646ecff3441d5b715da4cbaf5e2ff91b5b39de2ee90100000000017319a76b0e451ce0ed629002ec2576571d546680fd14d4df7eb457388513fb855769af50645ac521ff5ce61500858447baa625edfdaba00a01d317f588562c7de44ac555f996736e0693ae2c2496eb20d1df5976eb3c91b4280a01c9ad0b73828e4e831b51c6a424a2f9489b0963967065ec1044b4147302606ee30a01b68db960d81ca25e3a912d0c25484343b2af0abc25ad085789ecd097e803f98b0a01ccbf9545ee7bda12ec43037403d913a779e1e7cab45458c939cdb95968bf884f4103a49ac6b3c212dca9414fc45a62e08594981a5655f19b637d6e770fedc590ca77050137de1b58290a0173efe5e26429a1b21db700e7922bdb4ade1cb73878b3bb8c7a4a87a2cda029b20a0198880c975adfeaa1a334cb4df958e0f775cff8a909b905a5c9702a20ff2c0a3a0a01e0282fd91eed4dd75689ac0b3059665c8486b83f9624e38179eda6477f9033690a010093d40b62d49ee402fc97bb3c22c512ebf74567f80b1bd4683d1549ece6df130a01a4413b59a3e343b36eee32b0c33bb5051a5e6bd34942c8079f30c58fad412b8c0a013dc63b2e51496694bf26ac1ea3c452e987cddeb40af8b73133c991034a89b1350a0167267f49a9cf716ab79c6efe6b6f807b2b3db27b9d7cfad737feb3fa1a09d9550a01f54c32237a4aee66d8045236818b90599551fdd10be53e66b040787d42245f1529c1b37abcdb5c1f1e67a84fa8729533a000f7f227ca753d0e615915a8dde3a763ad92fcab38c165a7d2ab4fad72fc09399b9d825e57809eeae56d509cb77b600334e1c479a3c2e3e49b91623fca539053fcc62ffddc41301f095b82228d75510972a4882eaaa66b3500ba13ef2b4f6ec89549929f4ee16bf5a28b72cf495d85576bb3e748f4c7df740209018b1e8212d9854ab00feb8311443ec307b619c61eaf366b10d0e052a67944e9f3512f3d36a8e95540180900a912af9b403dcc9717c25c7d5239fb7ec947581ab97d8db5f8f9417fdf1ef1d50901498f4d994af4e94ff3d9d46efe6f16b3fe6725d7299f6a3eb1bd13fc4c37167a2165abc70bc027638363fddc22894321634c5525c1386f73abadfd004b60e23692f4e788af5102b8cdb8dca181545218c90761885c7164932fce4d5ab47bd6263a315c074974f7e69b7ef1638cb369082165a7d2adcce79c5013b58c48542376bfe22315fa8575ffcb3b1a49284a4f63cbb90a8def5983ae815f9a9f658d7e167a69ced38e4c39e04a2ce748a0c139c04bfa079aa7463ecbb183144a03abe9ee112165a7d26e3c965b674295c9d340040c98cf53cabb7b95c39db64cce7c4486d8a3547987560904462a1f8aa5e60bc905c2e6860b3e59b0fbe5e305678ee737a5fbd6cb01aa4d8e310746a52880006327410350991cad195da351553a364622788cde8903730804ff22031e6bd6ec2165a7d28b8144f0eb72830046f96baea30553e89223f5cb1f52101a0cd1d5544c0675b1861937810900c41f1680eddca4df163f2b1eadc7cb203c1f707fad04ac2e98297588606f00418ac7230489e80000d325d44035f2b7fcbae226871a1b1842c1c87d2d1a61d9c9f72bb199468a51bc00686167656e00000000000000000000000000000000000000000000000000000a2e7bb6aad81fcd8597e31c5d042c539068a8b50ab35f45f9e682908290991842004800000000000000000000000000000000000000000000000000000000000002bac63e44e33c8d452cfe1c490278f57964dc1db0cf3776d222ef2e8fc4a10800a1bf9685d625e3bf3cc64d8ecc0be3e0ff3d0c2fcf9980f4bc571fe46b934bac4feb136b6e64f306a46ff2018fa8b85c3e566b4bd4418ac7230489e8000099691dd9acace5e28784e302cbafb6b10edc3d104c1238d4aad19d48a2f362f4a1f2851100f2cf57795e38c37bbdbef79c4978c62f245390e0a71e029e0cdcdd540f05bde5fa04fdf5ee3a635ef7781549049778a0090186cf83c0d4dfca5b8c6a0c3f36620e8453229e6e55e503acc6885e88ce4846b7190412c170b7f199536a358a5a5aba8e3c8527b0c0e58dd674524d7af974c30ce30be351190412c2d3c410a3010e7e66fe10f2d4c80e8e84982f189460e859f2f736a05f8f52d654190412c2c578a61595e4ae39155ec1c16f68f9822f499f710222717a5559c4421de8cb51a1a588803d26be431d4229885c22eeab669ec042979a36818d9222f0ff84bb7e5584f16f413d61af147feb9f66a108ece0d31c325209018081845160b5bf8e25b76f4bebb27fca720eacae7e9a20888a65e98e1a937ec7091565f089038e85ad5c352a919cee9b0f9049ffeaed78ca0c72b320225a4ef5f31d091b154f746dc2d6f0b898297e915fee3bfe3f81f54f97c71064bf561959996d5126091b0c34560909020bb7d2e709010b2e3f600901069ac8ed090100003567090300468a6b89010000000000000000000000000000000108929a4f090102233ced0901055f7da4090102731a86090100cdc61209020011aa9909020b4d4b8e09010a8e7f9d090100930e34090207b21d0389020000000000000000000000000000000008881afe090101d3a8b009010bf2ae1109010c6d60ac09010b75810309010800225609010983819509010b153a4d09010a286e31090102279d99090102cb5d4d090101902fa30901041a08dc090201c89c570901095a2a800901021e07a90901021d472509020c6c4929090200534a84090100e364e70901014fa67c09010c6765200901090c3e2e09010b9bac3409010205e1ac090105931d29090209ac9ab509020110d61109020ac8f965090105bbe30409010b6046b90901021d1d7c090106e75b08090309e5cb1709010c599ca20901022722de09010c6d5087090108086c3009020562307609010ba281bb090100c11896090109548f1909020024744c090105bc85a5090108e9c01409010a5aa5570901003818a409010af261e409010209f9d8090204554d6509010837504f09010bd8fecc09010a0796ea09040057160609010bd7c9ce0901041a08de09020c4a9140090102155fa30901067fd2c2090105a6e7ea09010c34428709010c3ecfb2090100ce973809020b2aad9b09010ab1a29709010972c18d0901017a1b7a09010c484abd090101264dea09020480808b090200b2b46209030c6d1bca090209db31e6090302f11b9f09020c0bb0e0090105b0b6cf0901084a0adb0901070e5e2709010154da5b090103f2eaa509010a880d5409010b8e240009010c006961090109ec132309010ac9b02c090104803bfc0901010c568f090100da8dbd090102bb92f209010688a79b090307418ccd09010c5b2f68090100f844b50902000c951d09010c1f98d70901077f727c090102080364090101d2703e0901068b034e09010c6cc7a509010c34f63309010c5303cb09010b07a45809010c0f9f1e09010c5b8c59090100d253ed09010285d21d09010630a5f20902009d281a09030c682d9509010c4780a20901040d1ea109020434051c09010bc46258090104f210ad09010c6c504e09010025847b09010792df4f090109ca9d250901059f9f5e09010937b8570901007b44ff0901066c5d76090107418cce0901055f5ba90901084c130709010089fa5509010b95d198090105545722090101fe1082090104fd2dac09020119aeb409010305e8e20901035789d409010b89332e09010b77c3b10901020088e50902007b4500090101e3895509010004767f0901053851150901031034af090106995df209010002c69609010944f78309010100099f09020b2136fa0901040d1ea20902082014d50901027573f2090103fe22d909010ab290a50901097e22ac0901013ef01709010aab32b309010234c8d909020c28143b090100bf32db090100089f64090106dee522090105e4b48709010815a7ae09010843bf980901000caf5309010c2fa02709010175e0b309010454d0ae09010111f9e4090102b458a509010a5bc1fc09010596a900090206bfce8b09010a71ff750901059543b9090100352ad089010000000000000000000000000000000102cad1ea090201f3de2a09050c2e620b090304b9470809010a7f2f5309010a4886fc090109a25507090108e1e943090101365ab2090105e658460901021cf2cd09010c60162f09010c4a12220901053f1ba60901040d1ea309020a4d1220090102273b3f090105ddc13909010c6d5d5f09010186f45209010a72a2ec0901005e4c5309010568f3e109010c634dd80901034cb43a0901012ce121090107154d0c09010459d2d30901050fd8c709020016a3c3090203f0c23f0901066cdc5c09010437ecd909010c6d5bad09010353b7140902003e2a4e090102b2dbf0090100a5d14709020987543c09020bf8e5010901005290c609010c6c4d880901008c574b090105622a4a0901045d31af09010179eff409010c15a9700901021b793109020740eea109010be54f36090102b46ba709010c5f934109010c3b56d109010a0c868a09010a418f3009010b8434390901012c19b909010c4ab2340901019024700901013ee281090209f116b70901071419e20901011717cb0901053655180902063f79a3090101d7baf509010c06dc81090102840157090105f284a509010c4b19d209010c5d72af09020b12668d09010c6d5d600912027ed3ab0901041a08e309020536343d0901014fa9d509010adae69c09010149b0230901055f5bae090106909d4d09010314e3840901034aa50709010c3e015a09010bcf492f0901097ca21c09010712613e090105621d8009010c59b67d09010bfdb485090100e0ebb2090101ff68ad09010b3d4289890100000000000000000000000000000001066db9d8090105c00d1709010439d92b09010899842209030c6c399f090109d4f0cb0901007b450409010bcd62e40901000389880901049b60ed09020740eea509010c492687090101efdcb909020b8e6e8909010a29110a09010b83dbf109020c2f9e320901064a8d7e090100ce589f09010c6d60ae09010a35a50209010c29d2bd09010a5b616f0901037d585b090108b1d0fd090105e50bbc090107ab720809010aaf94670901055a75ea09020c3c0dc70901000501ca09010c2c836f09010b9bb07a090107b21d06090206c1a70a0902034a91f009010005e4dd090100d74507090106bed42a0901001ce0100901001c9af10901022bee2209010b87fd940901011f4f5f090105c72998090100001fa3090206e0bd870901097befc309010b9ddee409010641054b090106bdab64090101b1615f090109db782d090104ad86a309020c3bb064090102ffe1e6090106909d5109010bd099df090203a2f6cc0901038a6177090301d35b60090101177cf709010698e33a0901022722ec090105e4ccca0901064ad21f090106e1f82209030b8e736909010c3c9ccd09010001769509010c358c5a09020849b99c09010c3eff6e090100ce9ada090104ebb8c909010282319309010a3aa6d40902085a681909010b0d00e3090105e50143090109a1fd5909010a1e12d70901054b95fc0901012d5d2809010535e59009010c67a83e09010240667409010bb2544909010032c3bb09010c5fc8e9090100c44f66090100cea21f0902041a08e40902065b8ba9090104b06e8809010a1f29900901078a003b0902052f62cd0902063f959709010026fb6309010ba838df0902066c695909010c6c0d960901064a890c09010c3eed5809010426203f09010554450709010c6d2713090106909d53090109fec7b60901040d514709020bdb4c2509010c4a8f48090109aca6cc09020938ea80090104f3dddc090100119a7309010c1f73c709010349a07b090109ea71ef090100cc0c8c090105aadef609010622c264090a0699234109010bce5cb009010647352609010300575a09010243293709010573ae6a090109fe96f6090108e198dd0901054b80f109010b8252e309010c6d5bb109010679c146090103b167bb09010142ddee09010c6d4bf309020002f487090103a4470909030b9baa570901009b6089090106a9fc7e09020c09704e0902076bfef20901058cd84b09010458680809010bab091e09010b9bae2809010bf46bd909010006226609010141e438090102b9ec0d0901000b99e70901000003f0090105e586310901014201c509010bee71cd0901056045e80901008774ab09020aeb250909010222c8f0090100001fa409020a34830f09010251347b090107b19d2409010be5f3cf09010b9b749909010a27d2600901066c6180090105c2d8b6090107418cd2090103a655b709010a8c364609010491086409010226beb1090100cea5c80901003c4e91090105e48c3309010c07aa03090106a0426a0901000bb32409010ba3e8df090209e52ee009020454d55c09010baa0365090106973de109020604fa4609010535eacc090101ba78580902005752f30901075116030901064a754909010086226d090100a4022509010076cf060901096dfe4509010abfa23a090101ff7a8c09010b85d7fe0902004714c409010a26aad90901081eb899090107add8110901013b032209020aff566e09010b85fa25090109f3b111090100c41b680901005c85580901007b450d09010822fbf9090100457c380902040d514b0902012f6c3409010189de9c0901054b9ead090105bb21dc090300a14f6209010c6c8c2609010192a2de090109e41783090100c6adaa09010175fac70901004575f7090201b817b10901001f119b090104082025090202283f24090106e757ce09020c6d55980927017b7242090209a3de12090102318e8e09010117e87609010c2a0ea009010655dfe3090109d7d0100902006e05d0090104554d7009010266c62509220006875e0901012d12a00901055f5bbc09010aa77d050901050fd32e0902054ba744090109ec1c1409010090faf809010c3dff8d0901020badc5090200538add09020a701e8e0901034c3ed0090107fce71209010b9ba44a09010c3eebf9090102de1cad0901007054df0902056d1ecb0901018b71760902016a60ea0902052a380109010386834109010c0943020902012e5dc30901008c3b9509010b9bb2cf090100cdb3ae09010ba91c8209010b2a11d90901021eca140901041a08e8090200975f62090105179f940901021767b009010a157720090108f325c309010133aebe09010c6d60b0090101236526090109a5a0bf090100fb0c490901012d885009010c6d37730901038f2f96090102d83999090206d509ed0901076ef6b5090209d3f65009010c3f088f090107e537e309010c6d1f350902052ade930902070e69cb090100922cf809020bdb22f609020abd6e7f09020c2fa0380901029c7630090109f31b75090303578c750901021e22db09010842a71c09010c3e24220901044b3eb209020b82b59109010c5d7ca8090109e93eb009010bab048d09020c2f9e3d090101fe0b190901017f88f4090105c33f7009010a0507f109010ac4e806090100cea950090202283f2809010b15d3f30901040d514e09020016a10a090107e0bd5809010010b36e0902027233e10901056b955d09020535e1df0902002024f60901013682c209010a16bef50901055d7fd709010b8646c8090106f5f04e09010536403a0902046ec0a20901002b95a8090109c670f10901068a745609010c4b9c2f0901028ec6310901071b2bd209010155175309010c6bef9509010476928809010815a9800901007d8623090207b82815090100091e4d090100affbfa09010bb9a65e09010ba1993509010a09e338090100d17ca20902007057410901000ca08809020b9ba6430901001ac23f0902083846b509020124ab4209010c6d60b1090100c4567309010ba1260809020896b44209010451a67e090100786d1d0901054b8bd609010b4b545e09010a03f2a7090105d4e7d509010c5b139e090109fba485090100a9e16109010bacfce409010b3baea40901050c3aa50901017112f30902015f77b109010c6513c209020c5f916f090105ab6cd009010c3e2134090102b3e4a509030027be2f0903056bb7780901000dcd04090100397a290902013d5b37090101535d3f09010b07a46309010c2a8bcc0901093a25e0090109b82eed090100508df2090200dd91bc09010ace892809020c6d5bb509060bfcddc70902012dc30209010c3ece3509010b3e868f0903047d7e3409010426204c090102ff816809010000610e09010c014c5b090100626a380902018a756e090105d79051090100e734dd090109f9e82809010a238a59090204149c550901046f84180901063e3cc909010a1ae1c709010c65f2e909010526f25609010aa5ba9c09010c6d1cea090100ceace60901002a6798090205ea01c009010be1d61d090106c43ccd090205e1c6cf09010081622609020128355f090207418cd909010a4be1df09010bb6ba2509010507e51b09020815b8fe09010a6885e00901064ba4170901072ed8a009010c098516090108a6bcce09010665c5b209010c5a2a4f090105a6b10a09010c6d5f2409010a4d1dd409020000002f4213a31700c52d80000c344e67420b1ab704a5bc08000bb7788c3255bbbbeb38000b29492732355f09a5670005c03e283a0123424bb175a4000026a632ba5e06932a0000467dc5325442c209d900089295b83273129fd5a2ea0219a18f3b09da04432a4627055d81a33227e918fb85000271fef532e60e9abce00000b2a80f3a0758b7da32db000770e63e3a924b996c596320001079003247f99c9d8e000b4d0e8e39073fb6c82ecd440a8e75083236740f40a1000092e9c43a1f8df7ae60568e087d7e8c3226fb4ec2400001cea78e322e452a760a000bf2a1e23227e9e9994800053e6f1631026ffc72b0000c63b6dd326889e5f27ddb0b757e74322f2986b25a0007ff13a332abeefae6dd01096572b3323e6add48ef000b103b77322f2986b25a000a27b8833a0e8d6c4876b9d702277e5e32353f7d377c0002cb4eb1322f2a57501d000166b00e322e23bb3bee000408fdaa32b559c150930001ae8b4832353113b07100092cee48396839099a805995021e046b322f2986b25a00020492d33a011358af8cca000c67ce1632470d1a37a00000534877322f2a57501d000a8b9c5a315af3107a400000e3610b32856037d41300014ee6ac322f2a57501d000a82cdc5391cf22a8106f29f090c35e03227e9e99948000b8e6c94322f2986b25a0001364fba3a0493ca3cf242cc008e84a13918de76816d8002055a44f93937a16920b38cbf09ac313e39100a8c4e8635d8010d07453249e64e0117000ac87bf1391a52f4ac91968905bbdf73323854e6c3cd000b60413b3b262a8e75ebfd77021935883b2053cf4d805d8706df0b103a02dff25dab95b709e5c1d83227e918fb85000c59670f3279db82d81d000227020e39384621248993e80c6d271d3a0a231555549b000b98ac0c315921673020000800f85c32bafa3b54bf000561f2403a0839cbb0842d5e0ba27fa2322f2986b25a0000a71b9e3908f0c5f6d0428d09547906399d6845237293730092331939038d7ea4c680040023015332887288a27f0005bc719b3226e34d8519000b8156563904fda2db7a578008e86f2432a5772296cf000a5a9f733a0b8d07dec787550016a93f397c585087238000003765be3227f923be16000af003983a120e0686bc83390209cf593a013172ae7a6400042db29b324642adf06a00082d5af0413115a56af1214b000bce6bce322f399174eb000a05ac163ab1605d1054bd0200145114322a411a26ef000a4b3ae7312d79883d20000bd7ace3322f2986b25a000408fdad32b552361fcf000c333b843226e34d85190004b22f80311902d7bb380001ba982b322f2a57501d00067168433b20fe394a61e616059fd59c4109b5d8bf7355c6100c343e00322e351fb379000c340f013226e34d85190000ce844a3a01f15c2ebb3a760991db9f390bb9551fc240000b1b4e4f3a0239cdb3bce0000a81e7d0319bd86cba86650972ace23a0748720be4f3000178be873b19d7fc7d4dd84c0c44cc6b322f2a57501d0002118aab410188374e3a8ef00001264aa0327540fe0384000c6d14fc39311765d581a000048060cf3ab4f1f2c9e2806a00b2b1ae3a11dae4391b31470c6d14163a01820f8e494f0009db2421390461326c5013c702f0b9c732ddde7a0ab4000c074b513a0743b2db55364705af16423226bf6c71b400082d605d41315cb3111725830007013a783226b7287ab1000154d7063a01cc4447228e0003f2d50c3a7c11e459d89fd10a63a57d32280db2d529000b8e21c7322f2a57501d000c006610322f2a57501d0009e779353227e9e999480000af040e3925a4a45e2ea0000ac939ba327d21a1af1a000480257832727e185a0b0002d458a0390100a8cec17000010c52fa3248064d118f0000da8a2d3a0ed0e9b1a06bc702b52639322f2a57501d0006885d393a0ba55a0b5b750007416eef322b5165c8be000c5b2d3c322f38c0d72800058b00f04107889732e852200000f83e6839320f63b67363a9000c88293227f8532053000c1ec3aa3227e9e9994800046db0a6322a310f645e0001749a473270b1c4023000013584ec32cd9a5ed9f50006716e9d3b07f8f75e3977c30c6bd26d39b04b2d2bbae3990c2acfee322f2986b25a000c51b632322f2a57501d000b00a2c8323572f1d7de000c0f575039422c207b5819b90c2a87703a0eddb98cd805400047521c393a62171973b0000c64bd2232642dfe22cf0000d2541c3ac944adbc6af9020285d23d322f2986b25a00062484d4390112b49e774c9a098ef5074106cec8a03e916000009d24f53265ae71534f000c52916c3235f0a06e34000c477c0e322f2a57501d000408fdb032b55a91ee5600043225a63278a54f9372000bc45ce43a0113c4a043660004f208b2322f8f995f7a000c67cb3a3226e34d8519000b951582312d79883d200000242b2532cbbcb1f651000792ade1390d52ef2a9bd7ba09ca489732b4f514442f00059ecb2b3226e34d851900093760053911875706fb154a00618a183227f923be16000636ed12420d54d6793aa46f000713a4433101d1a94a200007416ef0322b5236668100055f4b30322f2986b25a00084abb973226fb4ec240000089f5fd3227e918fb85000b95bafd332c5c6c073a1205544149326ebf7625d6000134e16a3a14b30b43ef950004ce93d232642adf6f090001197358322f2986b25a000305ca4f3235342678750002f51f033a0121c7e90d70870b892a273227fe2b33ee000b710d273a329c88d2b38b0001ffefeb3a054b72fb6af900006181b63227f923be160001e38684411bbf5bdae7f136f3000473d532891129477c0005382221313089c690530003101235322e35f0513c000692428b420f64f76a30f5e5000002c46a3a10b16554ce74120943517332434df4e2150000fe52f53a02f1e63bb65b000a4c1894312d79883d20000b20f09c3a14a66d6a4a19280408fdb132b5f2e34a2400081273f43b3131ee3eb186050275439332cf20e5b8da0003b3f5d541023f304d0a544d800ab13f9b390e5708800131610211795441018c4996257890000974b164324e4d465dca00013eecd932361f551f4a000a7031df32270b5984d1000234c8ee328bb4ffae7f000c280b1c3a03c64359b0cf0000bf29ca32b497576fb5000000e33d322bc5e1fce90006de9966322f38c0d7280005e4a928322f399174eb00080f88af32a0c55b412f00084335e73a7602aa3a706e00000bb86c32fa10818e533b0c2e96b83226e34d85190001667c68322e23bb3bee000000214d41d7b5c63731af9320042dac5b324632eab465000111e3b43261e4d7be230002b4520e322703ec2172000a5ba9cb390f9d72868d4eab054072bd32944b56d1110006587f43326d1e8e1224000a69c4f339076fa5a59211630590ec883b342759c39c98f204147a5939f3081604970c0000300f8b3a010badd48d7a0002cab8b832491a525ffe0001ef3a5c392416cd5cd743ca0c2e5f0d4207bbeaea5635c7000992c8be3930ac13d16c4002016f87a7410f83c93e549fbe2f08fcea67312d79883d20000a7a78363a0c1ae7522466f500001cf609010a4883f33295002dbe8800099a4f083a0bb89940c5325c08e0d2213b82ec0e8bd7584601361aa2322f2a57501d0005e62b5a3a4762b419074a00021b135b3b09696f561b5e1e0c6011ec323516f40c4f000c48e44c390317472bbaf4170521ded932ca2b38a4b59e0408fdb232b55165820c000a4d109a327c44d825ec70021c9d863b1b2e7a38d0bdef05dc87a43226b7287ab1000c6d32673a6f33da2e61798b0b692e47312d79883d20000166be16322e23bb3bee000a2a918f3227079fd83100005e11bb4202c7a7e498d8bf00056420d3322e35f0513c000c60499f32272177f5c70002fb1434322d3fa09049000055ca39390361855c531b1c0b689f87312d79883d20000101ad34322e23bb3bee000714a8333b153ff86b6d051c0459cb72328e4f5c2ccb00050efb313255eeb956060000169eca324f514cd56a0003e2f33a32fa0fb0f0903f06437414420c4c7755b6538f000153a21d329f1b55d3c5290c6c39aa3a8161871a07fa900353a595328206fb7281000038400e32522b4b46c30002b2d4b73227e9e999480000a5ca1e328d252c81a40005c643583106a884ee14e2092e58fe3a01026f4b05b0000a9ca949323e6a0cab2c000051fbf533303f44da28480c67cce63226e34d851900008c5297322f399174eb0005602a0731b3451d39205a04455c6d3901fbe2866d75a10179ecfb3294d52cc431000c15a7c33a01714515416500021929a4325da1139a58000740c96b322b5165c8be000be454a53a091a7d677ee70002b46420322704bcbf35000bf1f5a0323585b00463000c31b55532274f266431000a0c7e17390a40b88be151530a41789a3a023034743cde000b84328932353113b07100012c101a41010444773c3edad40c333d6b3226e34d8519000bd9877a39d50e65b32e207e0166a275322e23bb3bee00013ed6fb3a01eafa2d55967e09f107763a100ab9d0dcaa4606f92f373237a16f8131000116e3cd32293ca8657d00052cb65c3a01ca5d087eae1a063f71273a01d60d11e74a0001d7b805322f399174eb000c06d5dc322f2986b25a000283fde93a1b8ba449c9150005d4e9783226f5829a67000c33cc9b3226e34d8519000c5a027f32d9cedd57a9000af900943a089b049888ca0e0c6d52fd3a1119b542897b6e034a6a6441013a6e7b86475300027eb76c3a0a4d92817b1e120700171f316d23ad5f80000408fdb532b595eb27ab00052cb0b941013f9373d6810100014eeaa2322f2986b25a000a6835aa3228367d91010001493f11323641d091f300055f4d02322f2986b25a0000a4f4e939082bd67afbc00006728cfc420e5b0e7560396f000314a96832398270bd8400033ab9e7326e307aef79000c3311ea3226e34d8519000bcf4537323571509c5800097c86473a83b592d2a56dce070c4fdb32361f5b152b000561df723a0625dce8813efe0c2f51233a09b4df1cb823500bfdb12a3320e28e6ff68000e0dc5c322f2a57501d0001a66d463a1d95460ba1a0000b44f84b390f46d3c488c0000c6d559e3a08389fc0d7aa000b3d3ad4324c548b6adc000642be07420f80988c7a256f0005bf61b03240777a787300042c99cf322e23bb3bee00067828e33a02e6f65ffaa78d0c67d61e3226e34d85190009d4d8603a20cade380da16c00618a233227f923be16000bcd583a32353113b071000001cf0332a79099f37b000495218739118b31c2b3bf850740c96c322b52366681000c33fc673226e34d85190001efd1d439488fd710c9cb280b8e6847322f2986b25a000a285aee3a0eb67d22b09af90b83d7c4324ed6638aab000c2e95293226e34d8519000625f841336fe47a97df0000ce551639265b3b9f93da430c6c7aa332359a4b0738000a35a50d390360bad55c56ce0c29d103334e3a88b355bb0a5b5eba390ff3667123fd5f037d51d3322f38c0d7280004d1b703410116173342e9d39203b1a77632d22f53217f0007aa618d39056979b466e08b0a669a66394c33e95bc59c6b055a725632140200c025af0c31ca5a3226e34d8519000c5401d632a59cf26227000004fc0c3a0808c7be6cca000c2c39c7329390545db1000b8e6aa3322f2a57501d0007ac1aa83a02df3f2def1c0006c148913279a0358a8a000349752b3227e9e9994800000271a4322f399174eb0000d6411432366c8a05be0006becd87396731bacec6ea320115ac8f39365b44d9104000001cd7a332a2679d09db000c5d9cf7390691bf24a778000011d71c32353113b0710002227bf232583868d1e9000b87ee7c324f1847a7f900011de551322f38c0d7280005b1895c3226d9c1babf000c6d27203a24ebdbb309316c00001fa54209733866b2c2246f06bcb7a5329ffa1e5c36000954eaff322704bcbf35000b8bdf423a010088213e6480064054e8323fe22a03060006bd79c33a01c218ac27be00080b141c390110d9316ec000016f420332d0524136b50009c024683245b7e39c410004ad775532fce0475ab2000c31bd873226e34d85190002f755f13235304312ae0006728cfe420d36eab58c580f000bd096c13929ef33698d386a03a2f2ee3234605e15ed00038a5d1a32d2abdd4192820134d0213a1935d64a16110000dfbd813261e407206000095f8d5b3a045624f2d9960006923d673b1db0f77631e6d10227021f393b83bfaa6c938a05e4c798322f38c0d7280006263a283b08373c2f035c00028cf8df41728170c8c9bf800006a9db0d3a02db1f985b8c7e0b8e6848322f2a57501d000bd558c932347ce99d770000016b3b323a75b9a235000c3563733a017033479acd1000d3f275390188e6d68b0000082d4fa932378e75b9e2000c33b75e3226e34d85190000ce87f532fa0fb0f0903b04c053f13b6d651a9aac3ddf0282228d3235404dd53f000a3a97153a015f89e2fb780007b22795327bf6898eac000b0ce48e3a0f8a712c57e24205e4fd9e322f38c0d72800099498873903dd5feaf0138a0a1e0c81323665a5b9960004b901473a143eeaa83c33040101b0eb322e23bb3bee00052ca8e63b1f927daede6f0e0b9510cd312d79883d20000a83c48233a069040d710002187bb53235404dd53f000b2a55813a08548c0cc3f62a0032bbe63227f923be16000c5fc8f9322f2a57501d0000bec65c3a23dbf0b169ae00004a69ab41030b894a846e300000ce87f73a01ed016f9cf4760409455532b55466686d000609eabd421bd631a24dceff2900002a3b4202fe9be75370940004a9e668322a369ff16d000a1f1d74390508d7a8a7f4a5070347dd329a3b1e2ccb00050e6ae931befc94585ae9063f84e9322f38c0d728000026f16932353f7d377c000ba831813256617c772700066a2193420e410868e93e9f0008faa6db392be04272f9e0000c6d55a032a5d99964b4000c6538953257e6e53bdc000625ff513b0344ade14bbc800c33e3793226e34d85190004261e29322f399174eb000554432f32814d171951000c6783dd3a103f5fdd4103e40c6d1a783a5adbd9a960360006728b2a4212e9a6805cd8750009bd46d7324f0bb5015d000408fdbb32b559c15093000bd959c5322f2986b25a000c333b8a3226e34d85190009ac42213911b23c0d5b7ff40938e1963a01064a5af40a0004e681cd322f8ec8c1b7000b6eca453127df64b66fc9001195e13a0477b386b988800c1f697b3227e9e999480003499be9323e6add48ef0009ea638e392ac8b1168d99bd00cc08fb322a31e002210005aad245323d20c1d1cd0005cef3cb421838b002e5eced0006923ee13b1e93ad979a5ced0c1cf73e326427f6602c000bcdb5903a1a8d6cd5f035400646d462322f38c0d7280002f93ec43235d5b02c4f0001a6764c3227e5b2c133000573a11c32f91c1a8f723b09fc298632775d7646910008e0d2283b829b539b31df9804b97d763a143eee382fac040b8244323227f923be16000c6d587c322847470fb2000656600b326650ea8021db03b15e6f32507c5314350000e9393232c4eddc530a9e0af6f14431a3b5840f40000c6d4101327aa8019a8c0005413e8f310740d640d5e80002f2b0322f399174eb0003a43b9e329d482b46a8850b8e6c9a322f2986b25a0000548765326bcd4cbe2f000609818032a9b00aa151db0c096cf33950281c343601e1076b1281322f2986b25a00058cd6b532353113b0710008c9471c3103179fcad0000458555e3297694bdaf1000bab0935322f2a57501d000b8e6aa8322f2a57501d000bf4684f3a7566180983610000061b86322f399174eb0001323624322e4459d8470009e643a73148c27395000002b9d1b73227f853205300000b82ad32e4c97acfd4000000028e3272ca4cf3b400053d9be03a12ea5ef2ac5f000b18e15e312d79883d2000014202003a1907b0170af9000b58bc563a2b0507f31975000c63d3cf3231f6bcd82e0005602a163abcda30ed87f9000087720641024673278e1ae3d40aeadd4039213394446adf22021bacec3b24315eba9e602700001e0b4154e823d15bc40d970a3481993a4b68e4dc3ad39e023de21b3a23de16d93a5b0007763a363238bc94b692000be5f07e3293b5833a4e000b9b65df322f399174eb000a27b146390b27665dc178d3064d80e3420c737b498caf7a0005c2d7213227e918fb850007416ef7322a4b9a52520003a510d83901095ec5a2e0fa0a8c35093294cdf8fc23150491035b322f2a57501d00021d3bc03b0ab78157a4c37e00ce8baf32fa0fb0f0903b000fa2cc327e392b05400009d99ac233aef79c2785d005e46ca9322f38c0d728000bec8a473226f5829a670006967a7d397046593a118ec4000b7d393227f923be16000ba1e6ae390b2c4226627a0a070017223901b96e792e82ef09e4ffec3911e35b1652b560042db0b232462c302164000ba761bd3237bd3656ba000676ea733a5dbf7224e11a000604b632326356d6040cbf052ca8e73b216560423adcf601827e6e390dc90325cb8e1e005748b34209dd1c159a1ed43f075111f532a0bdd6064c00062e188b3b14db1d1742c7400075d9423297e4b847060000a3ff5432353f7d377c000076c6f432355f09a56700096de4ca322f38c0d728000a64f3a9322899122c4b0001ff71a43905659b46436c810b803bb83a01404f8da97e0000470bfc322f2a57501d000a26a09132b497576fb5000811e76632c7af15dcdc000765cad93a12bcaf9bcd180000a88d644106417467ec93063d0aff3e2339169487f5f8635c0b85f5ca322f2a57501d0009f379563917bbddab1c902100c4129d322f2986b25a000058bcca39a1354317bc730c0061860c3227f85320530007fbe6763227e918fb8500004533e73901d71afe86667b0408fdc032b625ced34f00012f69274202159c59e54f95000189ba8032353f7d377c0004b8c1833a143eef08cd6f04051a105e39017993b18c12ed00b1e459422b44709d90f02022009defb93a010c78a82656d20c6bde823227e9e999480001708b86322ab0dc61af0009e4161632280c4148ab0000c66712322f48cb99b90001668c4d322e23bb3bee00004533e939021c02604ef86101b80ed13a04c708e99eb213001f0ece3235404dd53f000407e2d132c0132d7bce00021cddcc3b2ac9462303863306df0b253a01ecff09af6d7a0c6d4bf83a2506f96213554b017b6990324918b12478000976727e3a054aec79d0880002229a9931970e3c12344700e185793227e9e99948000c242c1433463b1d73874f0655dc2032e987d0149ac906edcb9f3a014df54b28c500006e035c322f38c0d72800042db4fb324642adf06a0002666a963ad3a3e8170b52da000610a83a23dbfcdebc59000101ad48322e23bb3bee00055f4d06322f2986b25a000a9dedea323d7fc083bd00050efb593255d3c31e40000520452032393a611a4d0000ecc2c63108e9bd84d00009e6f9d33227e9e99948000090f18e3235404dd53f00052edc69390426ed2c5958000c3311f03226e34d85190001ef7a80328718d272eedb00530ded3a01ed016f9cf4760a700f3232fa0076cbc22a0349f0d93af335a86a9ad80007f4485a326d1ee77a53000b8e6aab322f2a57501d000c33b5a73226e34d85190002de17ed322704bcbf35000070550141012188e031142731056d0fd6410806dd539f0a01ff00f97b5f4201893695e0fd2000016a500e3264e2fec96d00050bdd4831751463e649b2038261393a019cbae534bf000c093d4e3a010f01bf73adab012e41a332ea013aa8ae00008c10f832d12ef474dc000b8e6ca3322f2986b25a0000cda138322f38c0d72800000040654204d421e62833c03f0ba9117a322bc5e1fce9000b2a10df322f38c0d72800021e884a323fe87f4216000409456432b5978c63310000975f833227f923be1600051410b9322f2986b25a00021759e732603dbe2ea7000a1569823262123ea6010008f31021390c85bf0f063b2a0133abfd32353f7d377c000c6d5bbb33493d3f125a0001232c41322e351fb3790009a5a0d33a64f37ecac9ab4300c031e7322f38c0d728000101b0f2322e23bb3bee0005f0aa3139043b3f63c9f1800c6d27233a23d4bdee7dc40002ba40013a0e6352dbcc0c0002d0f79639665857f6e6102706d49ab032ac1fbc1d4b00073dded43a017b5a3863100009d30b333972acb11ab990e60c33b9853226e34d85190007a189fa3226d9c1babf000c1b00113a0d4a1ccaf963660525c17d3241f338b0b35507019eff3226b7287ab10000922b1a3903b696da1634cb0bdb20ed3925b4511078d8430aa931c439d676e7eaf231530c2e96c53226e34d85190001572437396552c9f50f90d8029c657f3946e15c63f5310009f2d56d39187f8e40142ec402f5272b3a011f627abfe805021e1a8632f34cb6352400084082f1322ba5436090000c33177b3226e34d851900044b3c573914b05b5cfd693b0b82b5a0322e35f0513c000c59f4ca323003a453f20009e52a1b3a057e01a687f4440b757e7e3906d2eb66616e730c2e95333226e34d85190001e6c3413227e5b2c133000171e5a632357cb347210005b960373227535746650008926caa3228334705b7000ac48647390265b9f32b63ed00ce8bb43a01ed009eff3176021c9d983b4bae30b82e98ae0b02ebff392fcaa7f24bdbf60408fdc632b4c0045e280000164d1832353f7d377c000700f10d3287884866d2000010b3a832a5d2797dc200021e884b3a032245fe84ab5b056b8d4e3269515e939e00052ca8ea324f514cd56a00002025393a0fb1534e04d000013609b13915cbdee12eda490a1111683227798c65ae00055d6b1e322f38c0d728000b6400d432292afc676600001e837a31b5e620f4800006ec820f322ae185c09900052cb1fa324c8c6c883c00046eb13a322f399174eb0004eb082d39b11962c38c3731002b936b3227f85320530009c65375390891ddad87317a0682b7083b174d8f61df818c0c4b66f0322f2986b25a00028eb3d33a36c9bb0e48e0bc08127dca3112309ce54000071b25453a23df06aff8f800061a1cef390bf113506fe400090f735732c1b0e4fa17000a277d91315af3107a4000004ee4aa4107b3c18f3a5781550155050732376114c7e50000afad133903328b944c40000c65a3413226e34d8519000462d19d3a591ee49f39f200080f8a4f3263012103950000028f2132988f166d900e07b4572341037d13364a202bac00091bf53a0c98000ca3c43f00af3b3d3226f22255f6000bb988583a5c68c07929a54f0ba192a2322f8f995f7a000a09da2d3a12ade5cf17fb5500d178c8327996e55afa00007055063ae1a842f819169c000bb3733a01ed02403ab7760b8e6ca5322f2a57501d000004e06b3a01ed016f9cf476070221f939063c28b30f73d50124a899323857b7fb26000c6d5f2f33a033651a520009e8e19a3148c27395000000bec98d3a23dbee09eb7c000b9b23f33905dd821092043e08862ab1322a226a42890003f33c6232ea47736b760000786b413227e918fb850004b92d0a3a143eef08cd6f0404455c8d32d05fc24879000a03ef193a0eb1c5db5e4d220588caf33226e34d8519000c5b10e1322f399174eb0009e6526f3294b5a05646000b951586312d79883d200000a978673227e9e99948000b916aea32292afc6766000b6080df410e9d01ebc47c80000b3ba8f63ad571ce527571fe04c44993329ffdb9020dc100f9bedd3280a1905b6a00015ef34f32335fdba604000c6512293a01ece3cbf11b760bf1f3c039195befe24c2db105ab42243128df73f010050c33aa083226e34d85190002b3e3193a02c15290d51a2d0027bbea32fe46e8637d00056ba4b23a879e9af34cd919000d3d7939b0bc4155d517000039754e325dbeb7463100013d3c9f322f2986b25a00015352d5322e35f0513c000b0794c4322f8f995f7a000c29a2c33227e918fb85000939f3943237dcf273ad0009b817f132772c0e2b8700004eb23b324dc765b2140000dd8eb03274fe84e33d000acc59753913f21f0d2a8aef0c5c93b8390e823c253e9c5a0101b0f8322e23bb3bee000c340f143226e34d8519000b3e6be53b047925cfc980ef047d5672323664d51bd3000c6d60b70304261e35322f38c0d7280002f911353296169ef05f00000049d33227f8532053000c014ad03227e918fb85000062682232491981c23b00015c5b473227e918fb850005d40df2322fb0bb1d290000c1a9563227e918fb850009f9dac539024d3cbfe00b3b01b87863391914a1e61210000a2384053929d705773c4c7506bbfc1d410f4373bf6c36a0000c6d60b832afbce32ba20004146d46323fdebdd2d300046f8152322f399174eb00063e242b322f38c0d728000a1ae0443a0f6d2bae8dcf970c65c71a3234947f90cc000526cd593257d4866d67000a6336aa323cfee157fe000c1ad8b439382abfb5454a1c00ce8bb932fa0fb0f0903b002a67be39014b90d8e58be905dc123432e73b128829000be194d73a022c25efae220006c432b032611fea2259000582b271322f2986b25a0000813b65390ecab0f2fd052f012835a832cc9a3bc81c0007416f04322b5165c8be000a3e3cb73227e918fb85000b0ca5d0322e35f0513c000507decc3a47a61ee0f77500080eda1932afcb943939000a683dd3323fdee78bfa000646b7ea3b02a1939118b000072e6b2e322f2986b25a000ab6f94c39038d7ea4c680000c09824232292afc67660008a55cd63261e318b5380005ad30d13226e34d8519000c5a0f21322f2986b25a00055078a832b847a7f463000c6d5f303361f0b19e80000a4d10a739170b9daa6a0a2d0597bbcf4108579668a4b14dbe00000024890100000000000000000000000000000046070a519789480000000000000000000000000000004c070a5bd900b07014da4ec2564c7d415dd26086de57d5892db75a741b8a7914a569ea3e0d42070a5bda0001052bc651b4b2f3c4717452f8b2df5c1fe5d70a9764e23b3480a1e2cb51ecff070a5bdb007a19b96ea6f1e8c25e44d7044bd35e154f7482376b415639af9a6a5c75226058070a5bdc0059fc0bee7a75493ded34be59b2244fbd6fa601aca2166a2a502e7cb8f759db86070a5bdd009ed4c7d22ee24171a7d88a9ac51a325cef4ccded0d8f0001cd7b0a343c0b4144070a5bde00fc3ebd22b2b6a8ac6b9354b2899fcdfc4b8b48bef6cd006bda7e5448e086ed26070a5bdf0052fe424a41522a8b5a135922c11e8d7a677bd34a4dd8a4ffcab16702712022af070a5be0001fce0618fe03a11641079772dfb47ea9c70977a4352da4e23242e99a62b7617c070a5be10034bb6e012724ec20df66d1c3afdd8f4d2aaf9e4a34f71a01e92cd5905e582245070a5be200004427d1ace82b592ccc1f6203976f303867563ea73ae38d02a79bfef1a6edf4070a5be30089643cf1f5a9c9546c0d20463f38d581b137bce2cf72c00ab7bbf0131c22f2a1070a5be400aff9eeac65806d1c66018f86da1f38ce6b27ab29ae3aa632814746a044882e2e070a5be5003a47bd191ac24092ce50ea8e453e59cfdaeba1b200abc548b0bb7d091ec9497a070a5be60050c43f02a40a6d9556a6c840188342f6eb7c2bbaa896d8b2265d05aaacc4a65d070a5be70024c64df2f5eb446eaddce1a37a6ce46c75776bf92de146d07a8d4cb69d351339070a5be8007f752fb729bf0a467781688864ca409005b9a964a34da91168504dc0ef10f462070a5be900181466e736a1dc90a16efd13ccecc9b84f6b5f39e25ed44c2c8e46e8bfb5b55c070a589d00969e41df0e2217d02a31d8ebac73eb0cf2b45d57ed199845058af105b41d901f070a589e008ab1c60c33a91ea287dc4079b2fb7b5eb8ef807bcc8cb957cbfe2d102cc89c00070a589f00e0e31549e4bda379a13f03eb9285418bed284e0f522dde569bf6ac1c047e323c070a58a000844c9f3a649b69e3213ab713ebdcab15c145e85aef72f45a4f616468fdc6aa48070a58a1000219c741a1e12162fe37b357c3ac37e96fd939b5844d5a119eaa6076f7131690070a58a2004d4f4425e195622436426bd2c8a9ee8629101d4f80e03dbd5dad1c0dfadc1cac070a58a300f6a94d8f94e59ace4879bc3204ad6a0cc2efc6b3acfd5d43178778d89e09f4c2070a58a40083e2ff8ed5502443aebc3612421ef9228e68ecd8d73cc6b0b903dbdf68fef413070a58a500aa7a24c43765fa3697f75eb6406c945b513deaf565a044e1ff2293356140ac21070a58a600fb632921c2e209e29aab606db5cb6d50da5ca9851d53539f6f2722f02afb42dd070a58a700c9c583e5a03fc42048095c1f0819ede651f621ce071ea3f1c0c9ec0a686c8812070a58a8006accbfbbe6ed139abb0bafc88a4b45702cb420dfb7d7ded9511474bb58d96776070a58a900761126e907483ea2b8970b4ebdb0a238232dfb441b1c8f2ddea27ec9b1a71de0070a58aa001b0f40f23f75a59f9370305b7eb807e05b9800cd0fcface9146eaf6069f9ad88070a58ab004e7b5259c647f7ed408e7849a1a9fdc1babc3f5683ad2b7f46d578582c8820c9070a5a4400483f690a940438c2ded7a60851005b47fa493165b8b43ef6924dbe160d4aee6d070a5a45009e6c570dbd9843aed510c565f4535af16d0fd421770c0422e546c7dd0d5b8583070a5a460047452685d7a5cd8355a1ce26626569fed1a1fdc0faa7e2445bdd845c43067313070a5a4700833bf1d81e5f19cd5b10c47262026cf771e74f41dc120e6088ac3e84ab24522b070a5a4800f7239f9e20d0c1c89580de60037915044f1063e531d5decc3b009dfb4986bbe7070a5a4900ccecedb6040125baf8c4db45697cda7b7aca59f21881de33e209a7da5f3b6772070a5a4a00e92d739f170b10bca3a612a42017251e965f96c07134ddee2d1bd7f08a758353070a5a4b00cbd5c1dbf026d3016e24617c3ec58dacebbf52053d498cdce73fe288e35736ca070a5a4c0031bb811f4b442e9064058eec7e6af8436807d5b6e18c6f55bfa61eb09a9a74e5070a5a4d00fecf1f2b854d4475d03d5fc2b273fff943ed8761a4cefa61d736c14fab964056070a5a4e00d9fe134bdc81711d0cc0ad49000eac09c26fe8056f8123275859738bef6554f9070a5a4f00dd3d0f000c2757f5d7cc6dc1cf8d206e389c2096c7245115407ec6dcbdc66ae8070a5a5000a66557de1c011710c5c0959f6115ac01feb52f15d442e777e001c10a100c22c5070a5a5100b8e95f24133c706b73456be9f8ae44fc78910b8d5f4ac8288dcd04e641670db5070a5a5200e60bcc15a211b87e78291de31bc83c15e9bbdbe37bf0f9a9a31df3b2f1b7171f070a5a5300c055373834e863debcecf8d98d5080d24b87dfd25e5c6a64727c242ce2c36916070a5a54004ec607c9ecd47fc7709ac41174bd6252a1fada0d315ff9e557670580abcbfb50070a5a5500522ad9528d5573d6c2fd622528c0f8772323b5917b68fd9203236601edfaafaf070a5a5600fb723db3442a4f97502dc1ec395c7c314c179ac09cf83d0464cfd6a17086505a070a5a57007cdad97921458cd551b6b698bb613bfcdb794119645750f501a15afdac8f8175070a5a5800fcce22de3b7e5baed5e18539cfbbe0034433a54bef36b1dcd18cfe3bbe018a3a070a5a5900ba2d1cf8b0bb4e1b7f654692280c6272eaaa99d1f039e009f079788afe79f511070a5a5a00c2d5ed043ed89ac456d1c6437b30052acd27e72efe333253955de80bb17bf7ea070a5a5b002ba9ff3a179c20f7098527f59a0436dcea645039374fb8b5e9a1e8f04e66cb89070a5a5c00a7f90eb65ec0ae0ca0a287da1ca4549db2d39ce48ca428e1bb086a1247d34029070a5a5d0038e2ca4316d7cc8e4b05aec85e45edf2af7ce33208d854adf8b6a07b180a2b9d070a5a5e0040ec7e54e7adccd265b101112a16d24b62a4be8da94b079e14130002018f2a49070a5a5f00a03775c79a9b5329b903efb5f30d201e7dfc8ef989e5551013282f6ba35f0755070a5a60000dafa13fb06390c0d25cf4d9f2aec84a523dee101ddfa376fdac461d6fe0ae2a070a5a6100c98a0223c4bbe9fb0e68baa7e3b02e2e168a9550b2d9ac46b6e74b0ddfd09e76070a5a62001a7c9638d897c0b00964a9d0915ef72ffbaca9e688024ab2c67b1be1426a5c6c070a5a63007b6a4f8716bb07b55a43c9e13559496461ba76f9e466cfd957eef6e724f3c7cc070a5bf3001d1c90cef2d564ab17f59b63c8788f3be066d482525a85a3fe3e43b7a22c86ff070a5bf400192576e86759208e7aa01ee996695330ec3bcc6c408b69f234e3cd95703b6322070a5bf5004d5dba8ca25cbb3168ca282d3e34537d0f7fb8dd61b845303e510c9ccb99fdda070a5bf6001484accca40e59a45debcfa2009363ec9704434d5166c0df4ac37eb4d3e18344070a5bf7005fa09184cc16008608b7215232cc8e63c8a1accbd64214c3b3ed93884be5b111070a5bf800f2293ba50253e8df6a47e95464ff5b61e95878c9c53f4d205c8aa487278c5b17070a5bf900276aa770734e4fbe34b9fc1dbab4a14178a093479f334629236ac6878f60ec05070a5bfa00075b036c3c3bfc87c7bd423add72d400962c1b2bb09685229fcfc14a7565bd9b070a51b489480000000000000000000000000000004c04cd9b8b2106a6feed0c4f106fd10b6d30c1bb5f8f65564700000000000000000000000000211f200c523b09d109e03f3b8056af5c60bcffffffffffffffffffffffffffe9e13f0b83b5f9d132b6c17ef5018020ba12000000000000000000000000069bfe8e0a44533df10195ffffffffffffffffffffffffdb7d00000000000036bc435a98934efd0a44a69451011070ec340504ef26d40a44a695b1025d0894b4c99c538cdacb56dbda11ff0887cb0b1a6e0055ca6731c49777a929640055ca6839029cede4a9f1b800ae069b094200ae069c2918196deca400b1fc8b1901a3f100b33c1c117dfb00b1e7862a01baa543bc0c193b32210f09889f0c6d1a7c03053f6b6bd153bbc006202568e5e5a10000000000000001cb8ac9168b49b753053f6b6cd16055527534040d9c1cf400000000000000079b0881c03aecc408053f6b6d09420548f9f52979b07dfa730c6d60be090405456c9c4109a411f82576c00000f2114c3a27009f217ebe4300f2114d610469925f4a1f61b689639ea50bd2b85051050ce93d3d48ca6800000b030e284ad8d726b7177a8000000b02f4774a1b1ae4d6e2ef5000000b029f8049056bc75e2d631000000b0070bf494328a5b5d58c4000000b4d1edd4a6c6b935b8bbd4000000b199e9f4915af1d78b58c4000000b4ed69a4a6c6b935b8bbd4000000b7d1cdd52032d26d12e980b6000000c6d60cb030b87fdd74a1b1ae4d6e2ef5000000afc3f94510360051c8960000000000b4eeab3510a6b416f503214170b800b78f73b030b038c8d495150ae84a8cdf000000b73e520490ad78ebc5ac62000000bd892f2520333202ad91289a140000b7dd0e0510333202ad91289a140000b82bc754902b5e3af16b18800000b4d2ea44a6c6b935b8bbd4000000b02d4c74a1b1ae4d6e2ef5000000be93e154a6c6b935b8bbd400000022d529f499c850dc9f73c57cb8c022d52a02158c37cee022d52a1215bd28a11022d52a249a44128badd005e6a41022e6afd4101795c4a1090baed08f339cc4212d33a6c2ca707870916d1824a04e5f4dc8a0adde6c00a7f326e41e461b77256e16be7000f0f3d490401932517b3fc7ad90afa902a09010c02aebb81e67cf72d3850f4a9741ad2708413f9b50b98862d89450000000000000000000000000000000004c7e4bf422e0ecde667f9ef9f0a273f9109010a277da60901000f7641490401932517b3fc7ad9000f76423a337c122fc743c8005e14ad22033b470c005e14ae21033b5e6d09ae9eb542b56cbbd59d68c50509ae9eb6391231e18ed2a25502d98b76093e02d98b77290c1721db33039809cc2951409e219d03980c012918602f707b05776b8b412db9e9dfb91d30270209fd9c5101e1565400c1547796fe0572bbb95201e14f63a56780c596fe0c6016a14206f05b59d3b200000c6d60d60309fa845b030186bd794246b6f28058995e25029afc2a4acbcf470ecb4611b1640180c4214901f0ba352790d66a2b0c6d316503059cba7c420169206012d66d950c6ccfcd49cbcf470ecb4611b16404cc8e9271020d237aadbb9c28fa0ae2d118f604cc81968908a5ccb1b2277690de0a117060d26aa67604c272d4aa0a0000000000000009e7d717ac5d7457e053acc2d704c272d5aa0efd83f871ffffffffffffffffffffffff09aad0ba04c272d641013d0f580000006904cc8e931901a9dd04cc8197310702d6fd34000c2eaf1a81017289b22aa3b16ff45006e60b3be9010c2eaf1b992cf4e86ab5dd1e784e3e0f64598a0466709f5c0c2cf1828101701beee7e095c8e392fa622bd5f4980c2cf183992cc31bb576c0995cc38063a08e62721bb41e2300b7d3c2a35c86a7970000000000000000000000011d24ab6d02af894da92820667cd1ffffffffffffffffffffffd7df99832e0c6d60d80305918767094905918768290dd812e21905a4deda410853a5d6d71a276705ae0b3a31028252ef13af0597bbf1290163f41e590c67016429019ee4d4b10c6d307f1a9f51bb08ef74f3190390d20c4d92e72152fa90ee0c0fbb8622058c16920c6d5bdc0a080b0eac701b441e120c6725bf410853a0d232210e5f0c6725c0296cc8a9e03f0c438b180b650829147ca1bb04f95116eb5ff9657ca7f42afdd693f0cbe10e02e6899e4207dcd2c90743f2ec0512fe413103c27d7b9e2e02e6308e09e20c6897ff030afc3fafe969fffffffffffffffedfbc248ff1b9000000000360051c8960000000000b0070dc612378ec2cd291cbbf2cf305e60b0070dd99013cc0f3c85538ff6749a641faec2326f41b120529427bb9fffffcfffffffffffffffd55d0a66dbac5064d66fb828b05408e8a6102763c4996a171f6c0b3482805407ad81904a10d0ac4613ab10fe36165698d92d3222b0f000000a96c9c030000381b01053f42593414d4f0a652a04798000001053f433a01ff7b6dafc4e90000928a197b47f20000928b3a0b6f52d6e4f0dc0000928c095000009398297d520a8af0000093994903d5da2ff04d2720c002cef478210ca1ce4102cef72d410100c8e86d71f8520c191f16090106534d6a8903ad6a528d098b1fa84f4f9d603bbc395a0652ee33894a000000000000000000000000000000000a46e66309010a4c18f709010c66f49d090106b203de49088c62a7c2a6c755e40c6d60e8030b469a100306b251d4510139aa72d1558ca9d2e60766ecd0030b469c0c030794a2f949088c62a7c2a6c755e40a45d5720307d2e0df491652a365f24d502879084d1080030a05a0e2210748ee8e09f413cc030c6d60ea030937b8ac0300d25f66210892e5980c6d5dad22031048560a29115113d28d081eb5a8030b2e0aed19585f040507e5a82103085a2b04cd9c332106b7973603d46f172a0109289554017113ca030c6d5db20300460834220329c85b0000219f1a846074009b618d030a73f07f1ab43b6001b7ada419c65d400c0996ec134ee404c2732f211aa3927f03fe2c1d030353b7f60b380c6d5db31a3abf100c6d60f00300aceddf2102625a0004c7e4ea11c6da01e86e1b22028cc29f0a15bb362206eb07d007f5733c030209b01919dbb01e084ac5aa030b61a7281a0bafbf036e1acb22b70ce7ce009245d6194e2cba055a764b1a0563b001c4218f21025d6acf07154d67210e9fcb4305a6e858030b85d89322576d35360209fb09030a0ca9731a75e1a3008ff892222309b67f0aaf94e92203473bc009e52f1a1ac98df60afddb6c19bfa5a109f3b14e03069bcaf61908c168064e39021a0a3553000092a9197b47f204da6b30210782e8e40be1d65f1910357b05af91230a010a67fed30301e86b88030c4fa61803086b56642214c5e370001997622205c1155b06bfcbf1030572bbe3290211bc7b010c6d260a2102a67f98099feac52901cf513a6300d1a9c92111dd4312028be870211c97a7490b2354b1030a4d1e190b0100fa17f621018376df052942b6216a5e0b5708f3266f030ad6cf371ae4e1c005931d821b1e848006bd5ed82110642ac00885103b2203146d930803586a1930a2740c6d60f9030c0970970b050a48873f1a2171c00c59b6cc1966bdfc0ba126651a45ace30540f4172101bada2a0a1904cd11b5fe0803586c1932810402723509191d8fe70803081119325d0e0548bba8220256583c0a27d2c20300922dad1a2dc6c0085a6865030751124a290111374137080308121934135109a2556b197bf8f509f96ba8193084ff08035872192f94f40548b655213234fdf00799169219232c410c6d60fb0306a0432a0309c671701a62595c0abd6eeb030597c0602a01ab469f0e0c6d3c8c2101842cf40c584ba82103996bc002757fc41a554bf0056bb81b2105c1155b00a39949211e51d1e107e45db72204d3c2b605f7d3fd1a4efea80a35ca191a287b57000083301127050063ee330306900f9b19b71b00028ce4491ab71b000070581a21098d0a7a05e4eeba1bdab0310820170d21ab78c2a8097ca29a210597d598083846eb030a8933aa192e349d05849acd1998e4a004a3d00411e7640a1577771a72db3d009cacab2a0211c41a87080358781930826d095a486f19087d6409f5567a191655ef00267c4d0303a656781a1049d1046b17bb03058bc646113dd2049b61a71ac65d40000040a62178bc2f7606468d3f1a127ba4060706d4030c6d61031b16223b0a61e83f2901d637ac6b09b27e6a21046ea0760a286e9c19994a5d078fc61f0300da92ba199af5a40110b794290185dfbd4007711d662106ad3c1a0c6d5c0a210581026c0a1f29d11a3ccaab0c5f91fa1301360b00ce12210bbbfaef05e178911a4553d7071b2c33210183719903a7fd1422026cb41b005c86350300f85f440302f852331301c200ff5776191cd90002ff82260304a3426019c7760102734c4d1a3abf1000f13792030c6772942201406f40074909a119f03b040bfcde321a6684dd0a68933f1b64cc100c5b8cfa199efb8904ad88552210642ac000d3f2ec19127ba4010054072205e69f88028ec71e210251c6ae037515f40309fec80d22044b1f00078a061313019308b1d16d0303a447f812910c04ab1b7d030bd7e07503045d32f5030c6bf55821dfb0279b08e9c0842167cd0c810a5bf5121ab19a4f0a3a2019210329c85b0c6d5f72030be85daa0301000ac4191b774006bc1d362101da643f08a6c4450b2b09ac9b69030004dc53030a6a1ea31b64cc1005bb227a1a16e3600c6d5c0e1a08d9a0078fca2c2105e69f880c6d61071a127ba40b15e642030ad94bfa223234fdf00a07975921076d8bef0792dfcc03020762a21a08d9a00ac584a41a1fede904c252162104f720b004a3426911e76400b1e84c2a01c6c4b63a000697952101837efd0c191d91211fc694ea0c6d610903099245401b16223b007055ca0b0105931f7d190fde80042355df210183784d0c67a89419cf9f1102008a061926dde20b3baf26210919bb2a0bd7a01d1a0bafbf005483bd2267cd0c8105621e4f1940b15b0c5d790b1907a2fe0c6d5f762203104856000024ee2205c6db000c6d5a302201c9c3800bdba60221011b3970028406a02101288fa00c5f4041190927c009d3f6a2030bfa701e2103c14dc005d8529e2101a6e8890b138bf619a4c4f10bf5e5bd1ae4e1c00a3aad2021064fb49f0c6d5c131a554bf002072c9e21010d47640c6d53350305622b3003006c1476190a82f402cef4d0115e5005865b302217c942110c6d610c0b2b089fa0d10300fa12d521018376e40843c0022104fea3ea05fcf7e7210306c46401bba05b211a5d5eea0562314a19575562052adf930309aca7331ac688e7016a621b1a989680052fa5d21a0f42400aff56df1afb73e2029afc8322dfb0279b0411399f0309dd5306d1018a00000000003da355fdfecff5ffffffffffff3117f297732009dd5308ba498ca0218f3827fffffffffffffffa0a4b5696014314b109ec7a50ba05eda97152fc05ffffffffffffffff8505a65464a9dbdd0c44f30bb23baa590292defffffffffffffffffb2a4d36437a941309e7ef9aba43634c5739a943fffffffffffffffa8a1b630b591ea4c30548b6755202285dd075c478ed2543056816ea612a1a20bf3a2bd2dc26c2d46e054da50c6120a2f03602e8d23bb6133bff054da50d990175f50000000000000000000000000001e26a07d2e107491652a365f24d50287907d2e1083a103e43ded380e10186bdead10116fffffffffffc55095ac3f19800000000000b2881f897482d0186bdecb9071afd498cffffffffffffffffffffb9490d7fa766a1db0c6ba80cb902d66b4c4249ffffffffffffffffffe3c287f8c8325ff70ad1b9dcb10f58441ccee8ffffffffffffffffff67491bc46d1ac5019052e1b90349ec089b2e5effffffffffffffffdf4505fc263cbf900c4537a2b1eb4db092b8b5fffffffffffffffff6da366ef48a678d0b15e10a09010b18e1da09010bdd266e030bdd266f030bc8325711040b0bd8ddb8191e04fe09dd53134905f5b4a969febceb4f0c5cd986030b8ec3a009010b9511ae0901088a0e0489021fc44ab0b1ecfaaaf4b7c32983c647210888d99389350000000000000000000000000000000003d46f36c949ffffffffffaa4fd5141f7215ffffffffffff355516d3bd2b03d46f38c1193e4bcffaf2e75bffffffffffffff0ed6f814eb36db90c307d0f1edb9114561b41e1fc10000000000000000000000000000000007d0f1ee3910e0a5dd4a2aee0c59b2efb95cb65316a1c57bfffffffffffffffc65c2a294440b4b8f059c9355b903bdacee1b7eb500000000000000000000000000000000059c93563903bdacee1b7eb5042b6310c103fa29d7624b1f69ffffffffffffffda3ced7c199abbc5c2042b6311392bde91afeec421042b6312490120511469a4741000042b6313391c0da2eaf12cfe0464115041258127ca03d25000046411513903b744003af10904314d91413e731d9a03d9500004314d9239065815f32a6b520c3c7a4fc101fd47dda2b6a53dffffffffffffffec36031b53edc8894a03d46f3cc112a7c4a3e7780db7ffffffffffffff466dd12496661a76100c68c56e4902f70b5bc4b89af0000c68c56f4902f5e3b62a7f84f82304c386e441ad267a09c1b9a00004c386e53911cd46c2c5e94b07549a23b9063aa5f8e880970000000000000000000000000000000007549a2439063aa5f8e880970454e752b91cc225e624756f000000000000000000000000000000000454e753391b80125035b08c07d0fc18b90a5f497690baec0000000000000000000000000000000007d0fc19390a5df8bb2ca311046917344167fc86b6ddbd400004691735390ab02b8fb0224000906feb19042a55009027a1410335a46c074a940c008ff8c422230de0d40c68d77f2104fc6f5b0c68d30f290a06a70e030c68d57f4101795c4a1090baed001a6671290a06a70e03022d7a9a2104fc6f5b022e6be64101795c4a1090baed04c2642a69669afa6fd16cb00d516affbb0c04c2550681d60bd4c8db2956e704d8b18e2b18ad1704c25250b1017fb35bbf970000000000000000000000000000000004c2642b19011db704c255073102540be3fff80572bc1ec989fffffffffe95c0030ca62b6affffffffffff8a29afb1e40e0572bc20d101e1cad51e09eda801c9fffffffffffffe1eb09c5a987f3a6902098df594c90226ed30c55a03d2a2fffffffffffffffdd99ff750ca036d800572bc24d101d06e84ef626978371ffffffffffffffe300879d42a97c1604c0b1f6cb4c90f3562fde22a2bf803fffffffffffffff0ce828f1d1d759b33016d84810301053fd3593414d4f0a652a0479800000b989d590309d51ea521016028050a6666c721031975000916d2012102b3620e0a446b452103da27d80ae061821979f61a0c47ed2d09150c6d61221a08da500c6d5dda0b0108929ae703044b4053030c6b2d89030574fbde1aa7c597029b1a4722010a5e5e0bfb7fa80a07086b56cd2114cee3350359f34419f3edb2085c20660b290a0c3fe119431edb0c61d6fd21048c5b5209a26f6e030342a5470b1d065bec07030b7c8a780b010548b6ac22322dced30c6d3ddf0305f80814194eefc6058bcb91119e860c6d5a52213236a92308ce49311901b1640a3137a31972c59b0c6d47cb030589dffd1ab709540c6d5f9603058bcb9311ba97022d539f21766cd91409f1175f19a7c5970c6d612603091b0495110e290a0c96091a1c1fad0871fb5b1a5dd66d0c6d5f98030a48bd3a210138ffe00a3cec2019a3aa9303a7fd3921026d29440a15c4251999b80a02ff89f419f3ac720b6191901a55c9a708f759f52201d8740b02d83f1f030c04e6032119bd803308cddc0a2202704fb605544c30210532080f0c6d5114030a3e1f4e21050347a60c6d47d4030c6d5de421052444b90675d343190b34e005865b6f2117cabbc50a4453cf4136bc435a98934efd09ac191442b56cbbd59d68c5050b294cf041b56cbbd59d68c5050be7f4774236bc435a98934efd005483f32267cd0c81005483f42167c27f8b005483f51101f00054953531048949dd69a000549536310395f09496300c1078db0304b56839ca113dfbb7e57d38baa1ffffffffffffffff410e02df01669c4504b5683aca367e8962f0834758a8fffffffffffffffb443b75086f66f89c04cd9cb2894cfffffffffffffff9302ed3a1ef9714eb04d0676819033f2c04b56840c910162fa925ca19e5fc00000000000000003d095ea341b69fbf04b56841c99b6ec194acf87123320000000000000004adcb412784cfc44804b568428942000000000000009b6ec194acf871233204ccbf03312b0b3c519ff60b83b68d0902057a76e581deeb33a799d884124eca68e55126cf1d056cdfd68946000000000000000000000000000000000548decc4109613605b936e1eb01a5f91f4a02344b6bc864ac68f200d1e3c34902344b6bc864ac68f20afdf7011149e20c2a278b09010c2b60d109640c33852209820b83dd1c09010c5b119109a00bd6192309960c6617ee09a00c5b148409b40b9bb39509010c34433a096e0c4424bd09a00b8e48b709010b9bab0309010c4424be09010b8e745109910b8e1a1609a00c2b60d309010be56f7209010b9baf2b09910bcf49bc09640b21bd1509010c6617ef09010c33852409010b539b0709010b85fb2a09010b92406509dc0c34433c09010bfc6e6c09010c337c7109010b9bb14e09910b50f66a09010c334eb509010c33852509820bdb6ad709030b9bb14f09010bfbf54c09010c484bad09010ba7cd1a09be0c5a2b2109010c334eb809820bcae18809010b8df7fb09a00c334eb909010b21bd1609aa0bb84c4809010b9bb39809910b8e24b009910b85fb2f09dc0c1ae90809820be3355909730c006a0009780be3963509010bd6192a09010b5d84ad1101910c5e472c09aa0c00525b09960ba809e709010bad859f09010be3963709b90ba809ea09f50b2d981a09010c21be7209960b75827a09c80c34f6e209010c51fcb809010c5a2b2309a00c5e53f709960c0690a209010c33852a09010b8e24b209010c5b306d09010c337c76098c0b8e6fa409010bdb6ada09aa0c5b11a909010c334ebb09010c01bcc409010ba19a1009010c5fd9ad09960c484bb009820ba7d48109b40c1d4dd709820c209e9709820bf44ab009820c334ebd09820bdbdb3a09030c51fcbc09870ba8e3ec09010be42e9109010c06dd2e09820bd64ba6098c0b8e6fa709910c33077809010bab09e109e60bfc6c5809010be3bb67090d0ba7373009010c657df7098c0c34f6e9095a0bd7ca7b09010c06dd3109010ba7cd1f09010c334ec009820b8e1a1809010bcf1c5309020b83dd231101000b8e48bb09a00bad85a009a50b92406909010b29f52c09960bfbf54f09640c33852d09820c47818409010be426ce09010c334ec209010b90c5d109a00b9baf3c09010c5d7d6809020bb84c4909a50bdb4ccf09010c5b149409010c006a0309010bb3eb1309af0b2d981b09a50c1d4dd909010b9b758109a50c5b308409780c20c29409d20be56f7809a00be3bb6a098c0c3c9d6409020c1ae90f09010c37f83b09820bcae19109820bd9c3cd095a0ba7d48209010bd7ca7f098c0b9b758209010c21be7909010b61579209910b8e0b5609010b50f66b09820c33853009010c37f83c09010ba2826e09010c478185095a0b90c5d309010bfc6e7909640c5e473a09020c2ab40d09010c5d7d6909a00bd9c3d209010bb273dd09b40c292197098c0bfc6c5e09640c4b9cf909010ba19a171101550bb3eb1509010c20c29709010b539b0909e60bdbdb4009820c33077e09820c657df809010b8e0b5809a00c33853309820b21d77209aa0bbcde1209b40bf44ab109010b9bad1d09910c00525f09010bb273de09010c339c0e09010c12007609a00bd64bac09010b8e745809010b75827f09010ba8e3f509b40c4ea6a109010c2a2799098c0b9ba51109010b9bab0e09910c5fd9b009010b07a55b09010bcf1c6409910bcd942709010c339c0f09820bdb4cd5095a0bcf49d409010c5e53fd09020bf209fb09a00c29219b09010bcae19709820c4b9cfa09780c12007909010b07a55c1101a00ba2826f099b0bf209fd09010c4ea6a609b40b61579509010b21d77309010b9ba6f609910bab09e509010c2ab41009dc0b9ba6f709010b5d84b809010b9bad1e09010be3357809010c334ec809820b8df80d09010b9ba51209910ba7373809960c209e9f09010c3c9d6b09640bcae19909010c33853809010c0690ab098c0be42e9609960bbcde1609010c01bccb09b40be426d409a00bcd942c09b40b29f52d090109e6446709010c6d614f392053d3595d99a50c6cd5ea390c0315baf80cf30c34f9f129070b685ddc00bc17a53906d448083f6acf00bc17a64121cbcadf9290f39b00bc0e5769446b6a69fd4b2786e530063b0300bc0e584902aab71ec71558278500b1e8a12a01baa543bc00bc149a6948d5718b061ec79a493290f3b70c6d1af3030c193baf6120966fb6b4e4817184bb260b0c6cdbc8390d388c67e9fc8d0c6cd5ec030c6d5fb63b01441994a7e8e500bc14a159011158531538f4f56839cc00bc14a2411d59da6b0bf091b50c6d1af559307183ae9580382da4c66100bc17ab694585ef56b89a065d9b5bdd857b0c6d5fb839106b94941aa5a400b1e54f422a9767c8da4f117e0c193bb0210f09889f004c69d139b11962c38c3731004c69d2097704d01b80c9420000000000000000000000000000000000000000000000000c4f113bb101225031f8587e9bf800000000006fdedca9fca88bd4057f68a44115d48fd1c82ca8fa0c51b36db1012045f3294fed69cf0000000295fb39dfb7579c5f010a3ddc0ca9047b9487797d6607000000098bf0b7ccc55b6dbc7f04d01b83c94d0000000000000000000000000000000000000000000000000bef234c5302f0aaa6eec25b87ff710c523bc2a98bcedb82ac2155ca000000000060710dd2c063adb80575a9c8c9e800000000000000000000000000000000ba35896a8aefa31b0575a294c94d00000000000000000000000000000000000725d67ab1ac4c0b83b6be49022af9a8a41c15a4ce0575a3a1c94200000000000000000000000000000000292a6f14daab00570b09956cb9406be424d82254515094000000025ef22a6bc3a38bddcf04b230e1420de0b6b3a76400000abb158f420de0b6b3a764000000d99b063a9c8381812de02e00d99b073a9e2ab4416b547300d988c8e945000000000000000000000036c91100000000000000000000187fed5700d988c9194d4f7e00d988ca6945000000000000000000069d6e0c6d615f3308fff8b881c100d9f43c19056bd904b58b1439ad5ba4006958c40b09956dd149d68d6240026fcd97d3000000000000000000ad5ba4006958c40b09956e3ab1a2bc2ec50000054bb4ede96fffffffffffffffffffffffff7cf2000000000000001413c0422ce528054e942d5902ddac98c3901fdb0f94c0054e942ea11118f63ae980516a22f25c72dc0299f76cd7f1700000215641d7b5c63731af93200186beb439071afd498d0000066c69de410e40d9a0df03400004b589133ab7b7ded950e2690b97edf20306df3e8f4110391f4e6e6e800000d99b0e3a9e2ab4416b547303d46f5241193e4bcffaf2e75c00460884394a29a5a968cf35000021a33927bf93fda8221801b7aea93a1228479e0e038504c273d342026ee27b64ea16460916f8220303f2ed89397c11e459d89fc8036e1b564110bdb94960073f9501c4226e3a374d5243d1c6cb012e7f3c410160ebfbd37408e8009038bf410335a46c074a940c0574fc0d390f76ddf4bfcd46029b1abf391885d5d08f252806909e274112e977b94cf40000000092dc3a0b6f52d6e4f0dc0698e3f3411158e460913d0000068b047141155f2dd73a1a000007511a944218fae27693b40000000023f7311ab0e8654c1b001997f1398700cc7576db1909dd53503a498ca0218f38280c599dc43a6a94d74f430000084aca313902238b943b21b6066dba60410f8069c46fea100006909e29410d36bbed821cb00002e68a58420807457dc8e2f8ff06e67171411442f643bc1200000529433a4209ba0465eab1b327078a1891410fee83eaea2600000c6d4ef642315d00a77a107e0006bd5f3742017ee001ccb7e78206b252463ae38a0c0297f3610540f4793a285ae95a4b41cc02db89a73a07fbc6adceb06306dfa9e8411509e9f7c77e00000548bc453936bd124cc17c6c066cdcf4410c4c488dac183000075127df4218fae27693b4000005776c123a0450c0f30e365d095a2b1a03004b24863ab11962c38c373100009e8e311b4b0068c44d08ce4959314afde938e00001a5f95c3939ae8e5492c000053532ae090904a5f40d3102540be40000067fd379411158e460913d00000589e0193910bc5bd5397df60c6d4a5d03054bb4f9391413c0422ce5280b906c8441013fbe85edc9000002d063e2310ae9f7bcc0000180c4f73a31ef3c5ec27762038f30b8390e35fa931a000004a342c43a12344e3ef290da0500463739087f721123b48706995eae410f64c8a0857f000007bd1d2841017ee001ccb7e78206909e33410e5adfad55fe10000afc40473a012043db700e4708f75a2d392b4c0a48ac9080084972db41013fbe85edc90000064ad2e0411442f643bc12000006992401411298a2e67f06000008cddc4839393b227481157f066c6214410c734bb6f85f800004d859c631331ef1dfa000068a75764112751bf40f45000000f1c646312fd27acf03e704c252ae3a740e2a59a7f80e04a5f40e3102540be400000054f28a315f67bf3e46820c6d4b7c030bbc3b68395c391c7a6c3f4f000024f23987bf0d277954d7072eabf33a4b5bb08fa3c60c029c77e0030a3e1f9a3a75307910a8ce72083ca5093105b536cace1502cef7e331077d3004e520066c5e11410d54a7b1306910000c6d4ff6423115f2c29a8e800001bba0d3420268b987dedaa1d805456dbc4109a411f82576c000054120404209a411f82576c00000ae07454902f047f47c1c107eb100ae074f093e00bc0f2d4902f047f47c1c107eb10b149a35410de0b6b3a7640000083ca50a420de0b6b3a76400000b68921e09010b68a0ae090109152ceb410235638dae9f490d0564a862420235638dae9f490d000040fe4204d421e62833c03f005e15ae22033b470c022d53e22158c37cee0313f97a2202799255000040ff420269c1fe52efc4120c6775ff3aa7ece383c37574022d53e3215bd28a1109ae9f43391231e18ed2a255026cebc3220ad19667022d56962111e27ba8026cebc419067ab600e33eeb2119bcfbe107d2e149491652a365f24d5028790313f97b4902344b6bc864ac68f2000f107d490401932517b3fc7ad902649cc51906b6a000f211b5610469925f4a1f61b689639ea5005e15af21033b5e6d01dfde8e3901d23cff6b6c7d00f211b63a27009f217ebe4300004100211448941a0a5fa753420b5ac0f2528354e5005e15b021033b5e6d0a35b10851235f0a2a0d57c470000001161211390515cd67cd6c4401dfde8f421b0501ad06754f9a09ac192b42b56cbbd59d68c5050a5fa7543904c049138d100002649cc6190918d40266e2e92106e6617000d1e4784902344b6bc864ac68f2010540db593414d4f0a652a0479800000c67760039c9100cc357bc4800e33eec2219bd657302544cc521044b0440000f77863a337c122fc743c8022d53e621766cd91401dfde90421b0501ad06754f9a0a35b10951235f0a2a0d57c47000000a5fa755420b5ac0f2528354e507d2e14a491652a365f24d50287900f211b7610469925f4a1f61b689639ea507d2e14b3a103e43ded380e102544cc622044ac11509ae9f4442b56cbbd59d68c5050a35b10a3a0523f1a8458fdc000041012178bc2f76000f7787490401932517b3fc7ad9011612121a378109010540dc3a01ff7b6dafc4e900528a73221e3fa791010540dd593414d4f0a652a04798000002649cc74201063827e4de612e0266e2ea1a0418820c6776013aa7ece383c3757402824e893102cf5ffa02a401aea5494201d9366ed7410d50083ca515e962fffffffffffff21f494c589c0000000000000000000005b536cace15084433da89f0e55bcefd67cdea6cde1365c45907a294084433db6928af84b2254b48119b39d07b7e0540f488e934ffffffffffffffd7a516a5b4be340000000000000000000001bada2a0543c8c89904d808fa09fc69db97666553889f0b08a4731e0543c8c9610243e8012fd45f87cb7d6e4807f799720920029b1adee94c000000000000001885d5d08f2527fffffffffffffffffffffef5a1a202a03ab89906f5a0429a07d5e0c5ffd98ba36cbba95a4f1002a03ab961033df28d45afa158b75c3326054a8c37423c3622cc0f9bcb0b0916d2394a04e5f4dc8a0adde6c00916d23a2102b3620e0916d23b0932091a8867590157304568996fd9aec306091a886829bcb1821ffe091b04c1190269c90b6922aa09010b692f37090102d064033a02a8d025e4695b088510cdc1010000000000000000000000000000000000000000000000088510cf2a18940f27a909e8da27c120db2632ccbb23fdf33af6d1380000000005e6d2000cb0ae08973f9caa18940f27a9000000000000000000000018940f27a909b097f52a18940f27a909b097f67106c830753bab4227de7bb21cec0609b097f77106b25655672148e46dbb4d18d2ec0b534a0091e7600000000000000000000000000000f394089a1190a918940f27a8ffffffffffffffffffffffe76bf0d8570019a0718905079e6e9aede7450b4a55db76f5fa273f00198dc6a90d000000000000000ce1d4248544c0d648d3d66541001997f7a90bd90e51d90000000000000000000000000000000000198dc741081166b0000002ac0019a07231446e2d790fee09dadbea09020bfe98a909020bebdea709010c2d0e3a312fd27acf03e700f1c653312fd27acf03e70453eede09010c6d61829201022b1999e9ae87624d1cf1d5d00b5a00610c6d6183030589e04fc1020000000000000000000000cb0687a99fe843b82b3ede310589e0515985520ace4c9ed820fa7dd405b6988c791d55c20869f2ef47e7c8c4871fcb310589e052b1013ea0f4d500000000000000000000000000000005a80ac46a15b9021433ed1a888f7a56e84fc30000008b2a675500002e160ac46a16b90212e0eb6cb486463d1ac6540000008aa88b4100002deb0c67761e3aa7ece383c375740c67762039c9100cc357bc480c6776213aa7ece383c3757405456dc4090100d3f3b9090101bba0fbe92cfffffffffffffd97467821255e28000000000000000000001a5d5eea021967c599041e11bcd7d8660bdec1eea38ac32ce6c6b7e1021967c66101ebceeb441c3ea78f17545c0a35b1173a0523f1a8458fdc0a35b11851235f0a2a0d57c470000002d0643cf106f2fffffffffffffffd572fda1b96a500000000000000000ae9f7bcc00002fbaaa48901b37941e3ba0da0c011f2597258dc420902fbaaa5791c6395427334a5bafeb5e96c6b1b24029afd1a3a0c8ef2b15ed550029afd1fe9c2ffffffffffffffffffff204fd864ffffffffff3430b8f134b9ee4e9c02a059f651d604e90a74003e979ec002a059f7a1b1abc61382a0d9497d3504aba69c8453bc6eaf48029afd207205d89b2e653738c469c50219888904e666ce29081d80e5a20c6d1fd5030b80b0a6522380216e2d08d55547a40c0cf7e0512380216e2d08d55547a401000bbc191b77400548bc6da9010000000000000000e3e89eae17e5e0d33422073b0548c0a859029419f9474d60e89b5f1f0548c0a9790424ab116fc79a15e3ca8fdd74a6740548c0aaa97d6fc15fff0000000000000000000000000000004c0548bc6f325359cb242c390548bc70a967e4f6940a056c5bf0ab000000004b7e1300000019098e8ee0710422b501e7fc761c7139ce723ec1098e8ee1898bda8b838bdbfd7ea9ab44040589fe46c2098e8ee2000165a480a3000000000000028e47df5fc8721407265ab8c7e50002b135e8770402db89f83a07fbc6adceb06302db89f911344002db89fa093502db8c965104684e0d7d3665c6371702db8c97291cd86de1ec02db8c9911eb6c0a8936a34194137477c96b00000a893998192e349d0aa0501b4b0ad78ebc5ac62000000a965d7e4b056bc75e2d631000000a35b12b51235f0a2a0d57c47000000313f9b022027992550313f9b14902344b6bc864ac68f2000041042ae8628e66d400004105211448941a00004106420269c1fe52efc412000041072af27bc9b178001a6728290a06a70e030a8a81ce030ab6fa4b090202544ce421044b044002544ce522044ac1150b6ecbce09010b631e4109010c6d2be919033c6008086d3e09fd08086d3f09f008086d407201f3b793168ccbfe395cd8c0000008086d41f11fb8fffff5b7000000fe000000000000000000000000000000000000000008086d426a24f3433e4590d2787f0c00000008086d43f10e48000019d7000000fe000000000000001544875507e75c10e30800000002824eda3102cf5ffa02a4007f02db090109e8e2ad09010047dc2b0a0109ebf51e0a03098fc11303088510fb3ae392fbe1b168d10b2b6f613ae392fbe1b168d1005482053924b6f4832e6a450c6d61c303005e15f639e392fbe1b168d100548494411c8a3817bfca6359098fc116030c6cc028a23e7da13e26ad2d99be39490b7db8d067298cfb230c6ccf030304b5893e3a06072c1b9ccc1004ccd0ccc1205e042c87d9cc87000000000000000000000000000000000c51b3a6d1039993eaf58744610778fffffffffffffffffff9f4e6096a87ba0a3ddc5ad10eedf9fc0d8339f792200000000000000000000001826ec4c4d20591735a09520591735b291bddd92bef05ba423c22240a62e805ba7030111c350597c1083221da1d25a0cc0b0eaf1f1a474eb80b0eaf203901309a2f680cf00c6d61c80b1d0c6d61c9290de397f4160c6d268a1ba9436d00e33fb02119bcfbe100e33fb12219bd65730c6d61d233031b2003160008cddc772202704fb608cddc7839393b227481157f08cddc79096908cdde5231224a472af83208cdde535103249e3b279cf19ef21508ce49ab21048c261f08ce49ac39c97052f4d9a4ed057592b64a4d312ca8d2b37d7e7705759db74a4d312ca8d2b37d7e770a45e6c909010a4b3bcf09010c6114c00901090b2cd54105a4dc8be659314f076d044842076b9bdd0d14f08805776c43aa030000000000000000000031acf25865339d1e26570577d0657129afcb8fdca1a5d9b1eb5664b3c40577cb663901edb9a26e9e9005776c4542f679bbca01d0c9f905776c46a12ae78ca84f82d8dd77fffffffb4ec9b4000003ec0643c9e4c1011d7a9c6e8c64af0000000000000000011d7a9c6e8c64af07de7404bb317d91638edd2e0000000000000000026c72ca40a7a68c07f21b1f7bfc311c85d8457468f08cfd811dd22207f21b207319a7c5400624782e190aefae247f07f21b2100010002c2c0000000000000000000006679f319947a4e1df3fdfffffcb32c24a705484caa090208c215c3090104bd3cf0090105484ee109010446cbaa0901045892df09020700180809010a5fa8723904c049138d10000a5fa873420b5ac0f2528354e50b8eab2b09010b9516e7090105865bd02217c9421105865bd12117cabbc505865bd2095e058bc6fe31160fc8c28210058bc6ff3118556e4d525d058bc700290d95452270058bcc2a2928ff4f14b904d85a2eaa080000000000000084b48713effee71b6c774116d304d953bd610622658e55fc48e402a11ec004d8672329416f4a140004d85a30992edfb84211ee2e43000000079a868c000001f40b8f5f7509010b9516fb0901066da89419060ea80584c41409b4052943700901049986b909010be4e298730bfffff7000000000000000000550be4e299711cb17f3f0b084b8530977e9ac1490be4e29a711cb43e66a40e21479a5b5ae4e8f90653d7cf199445830653d7d0190f4a1005849b6d1998e4a00653d7d31998e4a001dfdf153901d23cff6b6c7d01dfdf16421b0501ad06754f9a026cec08220ad19667026cec0919067ab600fe3df029871cb7f88701000cd82a60c9b5dbd901002f7e29871cb7f88701000cd92a60c9b5dbd901b59151111f0001000cdd1a0bfd5501002f7f1910bcab01000cde1a0bfd55036e1bd8c98effffffffffbcd073109ff81bffffffffffffc37067971fe1036e1bdac110bdb94960073f94ffffffffffffff598441351c055c31690c3496a6b916006fbb29c44fffffffffffffffff2533c17a921cc01e038aff47c10b6a6e8bcba542e1ffffffffffffff8e79a0b33108b29e1d036e1bdfc1033e22c13d803239ffffffffffffffdfc0a4e963e6fc1c91074b456fc101ff278c9bb80622ffffffffffffffec24c7d70c8390b6970a8b4ba909020a8b9d08090201a5fa1bc9c3ffffffffffc6bfbce3e746dbfffffffffff86034a753a4eb01a5fa1db939ae8e5492bffffffffffffffffffdcbb494379b53970e0a88052db906a38187dd2e8affffffffffffffffbf0df091857c715a01c24e73b9330b0cccb59173fffffffffffffffe0ca6a3a615d725b308f75bbd89464693f59956ef57371e284ab702b9120e08e86201a9030000000000000002f90991715bd3fe35d626c46908f75a7eaa15c005fe990000000000000000000000000000000008e8620241021f8a86000000b408f75bbe310b1583a81bca02649d384201063827e4de612e02649d391906b6a004a3436819c7760104a343693a12344e3ef290da04a3436a097104a3d114310283f99d6b4904a3d115493ace568f003a5b9ab804a3d116510296ba56a56f909a7e0b04a5f4766906ab244b21c97e6d914215352901dfdf36421b0501ad06754f9a0b097fe10302db8d3f09360ac978da030c6d61e1030c6ccdc00302db8a611134400873327919072f4302db8d40090d0a44544912248302649d4e190918d4054bb59512830e0ae3ccd01124830c4852801912355b0c6d61e3030bd0ba99190292660ab29211030b0697b113f1520a7db4fa0305544ab21309e80a664fd21a12355b072eac801901f0b40b21387811830e0a7aea230301c422f1c95600000000001234cc00d704d5ffffffffffff8a0ed7e174fd01c422f3ba374d5243d1c6cafffffffffffffffdd9605198e5e810000275d512ba28c13c495c7d8dfffffffffffffffe6a37c99a731bbd2901c422f6b2b2422ff164b4fffffffffffffffff91123c3aae0bd680a75a83aba0dd9d3ca83e489ffffffffffffffff7617643ac7eb95710266e39b2106e661700266e39c1a0418820a3e1fdec928000000000014af5e8628381bffffffffffffffffd743a2cc0a3e1fe0ba75307910a8ce71fffffffffffffffb70dd1ecd2587a0000a3e28f4ba64db9dc4de6f72fffffffffffffffc1383f7aae1e37b240a47afa7ba0d1f19c1e2d5b5ffffffffffffffff7d515ab53e67fde00c3f0b9faa3578ac8b17fffffffffffffffffffdeb74f15666790a528342ba03358c113afe33ffffffffffffffffe009e0f813e5c08700ae07a6092500ae07a729092feda8d800b2155a310ae99359cb5400b33dd5310346129af03200b1e60e422a9767c8da4f117e0c6d603f3b01441994a7e8e50c6cd64a03074902b4a102aa947b2ae077028217d33ddbe6d35967822379028ae844e991000000000000000000017a81d59604217b199923fd96dd51747c30850866bcbba105d1b7a1f37fa47cb1c708ef33b3011aead2aa1507490cd1410752123ece9f9398028ae522e9450000000000000000000005dec3c9c0f5d3df8a270f08208aab7bd47e07490699a17974ba254c97e7ee8ee50c249b18e925d6f8c93f0595640da11967ad3f8207d3c6573372218ec33e62e5fba6070a687bd0030a687bd2a111e50a7020d48209c44e9ac0a96fa4f3cf9824700a2a7f6809010c42581d09020c0e62a009090c65612709010bce3aa309010c09e61e09010c342b6809010c2d23d80901059188b4e9ab00000000000000000000000000000000000000000000000000000000059188b5e9490000000000000000000000000000000000000000000000000000000005917581e93e0000000000000000000000000000000000000000000000000000000005917585e9520000000000000000000000000000000000000000000000000000000006c5b9240a0109f14d980309f14d990309f14d9a0309f14d9b030c6d553912495d09f14d9d115db10c6d553b03025e700b00c3bc320e8435d10ddd2fb260a29d49ee9bedcd7dfa03033c0a3a89e574396367004608fe220329c85b004608ff394a29a5a968cf350046090009900054801e310a9bb7822f000054801f49f88d3f402b428d5cf008c2161509010700185909010446cbc609010458930c090205484f01090104bd3d4a090105484d220902000024fae94d0000000000000087bf0d277954d6fffffffffffffffffffffa39250000002675990709cff52ea828dda2e2d978355012c99d07ff0000267661034a632c6e17af5727cddb1800afaf4f090300aa90fe090300fe3bdc090206b252ebe996ffffffffffffff1c75f3fd680c9f000000000139aa72d1558ca9d2e606b258e0696da9c91ba4895ab8ef3b767cba06b258e189cfeb1b3a832f427d162ae6424aa7a497bc022d576c2a53cc5deff5022d576d2111e27ba801aea60e4201d9366ed7410d50022d576e2a5dec5f07440c678654235e7ef246022d7bb82104fc6f5b0c6d597f235e7ef246034cd2b303085868021902019604d85a855a05878e17545782f6001e1b00f73d0c0300f211fe610469925f4a1f61b689639ea5093982f35905878e17545782f6001e1b0bbd16d40a010365f46fa1593ee0a29dc34eef8b67d4852c3a35b1ab8db9b504cc98db6102f2057e94ab3904f143eb5e04c7e638aa5f9ae2b1d20000000000000000000000000000000004cc98dc09330c6d622f490727de34a24f9000000c3efda34a10e9deaaf401e000000c3f43d94a10e9deaaf401e000000c6d62320309a2310b719ebb30b97e0700c14fcc2da66fe608a6213a79011f05b93b2413a3b2bef00bf984c8086b5809a214c9529b0000000000000000000000000000000009a2310c1901516b08a6213b1902621f0bfe6525490aac1aa54a67b9f0000180c602e957ffffffffffffffce10c3a13d889e000000000001f0ba352790d66a2b018774637108fd4acaacdacc6184517cce76500187746489035d74f73aeb165f4c1bdcb2581a142cc808fcd692090108fcebf90901000021ab292da5922c89000021b21a846074000021b33927bf93fda82218000021b40943000021da31ef4350b367f0000021db5115e8d1d1a168ef401fbe00002408390156c7377472a90be86024292da5922c890be8602509010be86028291518a926590be860294901f95cbbc5eccf3187028ae55f0945028ae56029058ab0f8fa028cfe602969048f0e48028dfc7d290fc0af0eef028cfba92909963ccb350749032d19e470830866bd2221076fa99d0595647c29097e24ed560a66501fba2a6510a7f84b48000000000000000000000000000000000c4861fc030acf2701ba2a6510a7f84b49000000000000000000000000000000000acf27023a59e7210570dc21028ae61a093f028ae61b2905695d977d028cedd519b721f8029642de11010b074906e919b71b00074906ea391cca465e0456b00b693a7f09010b24220f42016e48d4bbf8a0000b4b725009010b24221042016ef44f4f64d0400c29510a23bf7e5137026e527c1a0a4b620b3a6595c9010000000000000000000000000000000000000000000000000c6d624a410851954cbcb6efd80c6d60863b1f32d37cde99b80a8937464194137477c96b00000c6d608933b05d56c50a290c6d608a3b055a7280a67ffb0c6d608b3b1ef721017284d60bfcdfab39036308a5976a000a5fa93d420b5ac0f2528354e50c6d608c3b07d4eafa4c104c0bfcdd9e4206b6afa8050dbe9b0c6d608d3b129b1774f6ce220c6d608e3b06063ded756bea0c6d608f3b1f4446d5fc5e790c6d60903b22383f346a77a30c6d60913b1ad34b0a17856b0c6d60923b18818ef5116d8c0c6d60933b06e34f093d3de40a632bcc4109bfdb4d9ada23a8072eceab69b5bb49cb0b99df676b3e25ea5e072e9af5a911000000000000000000000008edd440f724e484a7072eacd3a1127336a5fffffffffffffffffffffffffcb0095d072e9af64205ceb44cfffffe87072eceac097f0bb937dda298f2cbdc6474237acefd8cca4c1069c1b2d26a290bb937de7b06589c7ca5316c3478216985d0f98b054a8d19423c3622cc0f9bcb0b09154aa4398250581b510b620564a92b11c6bd0564b2c131ddd1204fd58f0564b2c2417162de1a2a3127d709154aa50303faf7fcaa1d0000000000000001fffffffffffffffffffff94c03faf7fd4a02000000000000000203faf7fea90f00000000000000370000000000000000000006b303faf7ff4a0200000000000000060003ca20b14de9ffffffffffffe70700000000000000000000038d0003ca215103b3fffffffffffffcd403a7fe72e92a00000000000000000000026d2943fffffffffffffffffffffd934be503b93302792a04f865599e8f70db595952ba4d9803b933037929fb083127fb6b86bc7d6d7716edae0c3e7169090100fe45dc09460574fd36e940000000000000000f76ddf4bfcd45ffffffffffffffffffffff583a6905752c659905e09a19d96d6d623a7723262be3601a7b944005752c666102b8e99d769010845a4daf000770e80331052d75da96bf0872e8451a5dd66d0770b5ec42076b9bdd0d14f08807711e8b3a9b04db6c1d32f90872e8473908b41489e9391a07711e8c2106ad3c1a01b72c92aa1228479e0e0384ffffffffffffffffffffff39a2c00116137a390515cd67cd6c440116137b1a378109001e85ab09010c5f3dee09010c5f3def8901000000000000000000000000000000010be947c91905cabb0b4eeedb311b48eb57e0000b4d309f1902a3000be941fc6101edce652684d3c3a08f74ba0be94e0919035eb00b8805ce1901fa400afacf5c39024d3e3d7736460b8811415983ae815f9a9f658d7e167a0b881142310746a52880000b7ee76319033a390be949af392aee557f6de0000be941fd311b48eb57e0000b4eeedd6101edce652684313c236a949e0b02f8e109010b7ee9b1030be945d831fe06cdf6a0700c56dab51901f32c0b7d9b881901f2f90c56dab6510aea2eb4a7ee092b8f780b4dfdfa31622e54da7d170b7da3773906dc29776de98b0b7edb936115a91bfb53d3b88dc631d5110b4d344f311b48eb57e0000b4eecbb1902a3000be93fa0190327bb0b4d34506101edce65268437eb277351610b7ee76809900c6d625e31048c273950000b5f66cc315b7f50d1c0540b7edb9a39013263e8f0c6460b7d2f4b190466840b7d39ea319e9567eb3ec00b7d34d2610cdc0aa2561a2f80393b70ae0b02d93b192af4df0c6d626259524d10dbc0a39f786ece0c0b7d34d931b5e620f48000004d8807290185dfbd40036215112119bd65730c11e59d21044ac11500528b93221e3fa7910a6a1f80290185dfbd4000861fb009010085ea5f09010b4b726c09010b4b726d090106bd5ffbaa0200000000000000023c357dc55a285c21048f288706bf77cf6112d04749979ddeb127f42c2106bd5ffdb107985a1fedc54df6b73b3e0000000f58bf6500000515000000000000000000000000000000000000000000
\ No newline at end of file
diff --git a/watcher/src/lib.rs b/watcher/src/lib.rs
index c9955c7..e0453b7 100644
--- a/watcher/src/lib.rs
+++ b/watcher/src/lib.rs
@@ -201,7 +201,7 @@ where
event,
} => {
if let Some((range_begin, range_end)) = l2_middleware
- .get_l1_batch_block_range(event.block_number.as_u64() as u32)
+ .get_l1_batch_block_range(event.batch_number.as_u64() as u32)
.await?
{
WATCHER_METRICS
@@ -220,8 +220,8 @@ where
block_number,
event,
} => {
- let current_first_verified_batch = event.previous_last_verified_block.as_u64() + 1;
- let current_last_verified_batch = event.current_last_verified_block.as_u64();
+ let current_first_verified_batch = event.previous_last_verified_batch.as_u64() + 1;
+ let current_last_verified_batch = event.current_last_verified_batch.as_u64();
let range_begin = l2_middleware
.get_l1_batch_block_range(current_first_verified_batch as u32)
.await?
@@ -251,7 +251,7 @@ where
event,
} => {
if let Some((range_begin, range_end)) = l2_middleware
- .get_l1_batch_block_range(event.block_number.as_u64() as u32)
+ .get_l1_batch_block_range(event.batch_number.as_u64() as u32)
.await?
{
WATCHER_METRICS
From 342011f28a9f43936bb139a6e162f1143c0b2d0b Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Wed, 17 Jan 2024 17:07:33 +0100
Subject: [PATCH 023/128] chore(main): release 0.5.0 (#350)
:robot: I have created a release *beep* *boop*
---
##
[0.5.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.4.0...v0.5.0)
(2024-01-17)
### Features
* **l1:** parse l2 to l1 message
([#352](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/352))
([c5eb7e5](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/c5eb7e5be2f76911f6d797a7b6de44f9c78ea42c))
### Bug Fixes
* **storage:** remove order by to optimize query
([#349](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/349))
([0fbddd4](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/0fbddd49d17945778574ef8ab27522753f85ae7f))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index 2537c1f..f1c1e58 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.4.0"
+ ".": "0.5.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 00b790b..ff0105e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,17 @@
# Changelog
+## [0.5.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.4.0...v0.5.0) (2024-01-17)
+
+
+### Features
+
+* **l1:** parse l2 to l1 message ([#352](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/352)) ([c5eb7e5](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/c5eb7e5be2f76911f6d797a7b6de44f9c78ea42c))
+
+
+### Bug Fixes
+
+* **storage:** remove order by to optimize query ([#349](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/349)) ([0fbddd4](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/0fbddd49d17945778574ef8ab27522753f85ae7f))
+
## [0.4.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.3.4...v0.4.0) (2024-01-16)
From d0820847435e37c94a5030a8632d5e044e4bc201 Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Thu, 18 Jan 2024 10:05:19 +0100
Subject: [PATCH 024/128] chore: h2 security update (#356)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
Cargo.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index cf7b37b..04ea835 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1723,9 +1723,9 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.3.20"
+version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049"
+checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
dependencies = [
"bytes",
"fnv",
@@ -1733,7 +1733,7 @@ dependencies = [
"futures-sink",
"futures-util",
"http",
- "indexmap 1.9.3",
+ "indexmap 2.0.0",
"slab",
"tokio",
"tokio-util",
From e12b357f8a59d297db09f30f64dea33c1bb53c49 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 18 Jan 2024 10:18:14 +0100
Subject: [PATCH 025/128] chore(deps): update rust crate tracing to v0.1.40
[security] (#355)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [tracing](https://tokio.rs)
([source](https://togithub.com/tokio-rs/tracing)) |
workspace.dependencies | patch | `0.1.39` -> `0.1.40` |
### GitHub Vulnerability Alerts
####
[GHSA-8f24-6m29-wm2r](https://togithub.com/tokio-rs/tracing/pull/2765)
The implementation of the [`Instrumented::into_inner`] method in
affected versions of this crate contains undefined behavior due to
incorrect use of [`std::mem::forget`] The function creates `*const`
pointers to `self`, calls [`mem::forget(self)`][`std::mem::forget`], and
then moves values out of those pointers using [`std::ptr::read`].
```rust
// To manually destructure `Instrumented` without `Drop`, we
// move it into a ManuallyDrop and use pointers to its fields
let span: *const Span = &this.span;
let inner: *const ManuallyDrop = &this.inner;
mem::forget(self);
// SAFETY: Those pointers are valid for reads, because `Drop` didn't
// run, and properly aligned, because `Instrumented` isn't
// `#[repr(packed)]`.
let _span = unsafe { span.read() };
let inner = unsafe { inner.read() };
```
However, the [`mem::forget` documentation][`std::mem::forget`] states:
> Any resources the value manages, such as heap memory or a file handle,
will
> linger forever in an unreachable state. **However, it does not
guarantee that
> pointers to this memory will remain valid.**
This means that these pointers are no longer valid. This could result in
a stack use-after-free if LLVM chooses to reuse `self`'s stack slot for
a rebinding after the call to [`std::mem::forget`].
This undefined behavior has not been observed to cause miscompilation as
of Rust 1.73.0. However, any use of this method with the affected
versions of `tracing` are unsound.
The flaw was corrected in commit [20a1762] ([PR #2765]) by
replacing the use of [`std::mem::forget`] with `std::mem::ManuallyDrop`,
ensuring that the stack slot is not reused and the pointers remain valid
when they are read. The fix is
published in `tracing` [v0.1.40]. Affected versions have been yanked
from crates.io.
Thanks to [Taylor Cramer] and [Manish Goregaokar] for finding and
correcting
this issue!
[`Instrumented::into_inner`]:
https://docs.rs/tracing/latest/tracing/instrument/struct.Instrumented.html#method.into_inner
[`std::mem::forget`]: https://doc.rust-lang.org/std/mem/fn.forget.html
[`std::ptr::read`]:
https://doc.rust-lang.org/std/primitive.pointer.html#method.read-1
[20a1762]:
https://github.com/tokio-rs/tracing/commit/20a1762b3fd5f1fafead198fd18e469c68683721
[PR #2765]: https://togithub.com/tokio-rs/tracing/pull/2765
[v0.1.40]: https://crates.io/crates/tracing/0.1.40
[Taylor Cramer]: https://togithub.com/cramertj
[Manish Goregaokar]: https://togithub.com/manishearth
---
### Release Notes
tokio-rs/tracing (tracing)
###
[`v0.1.40`](https://togithub.com/tokio-rs/tracing/releases/tag/tracing-0.1.40):
tracing 0.1.40
[Compare
Source](https://togithub.com/tokio-rs/tracing/compare/tracing-0.1.39...tracing-0.1.40)
This release fixes a potential stack use-after-free in the
`Instrument::into_inner` method. Only uses of this method are affected
by this
bug.
##### Fixed
- Use `mem::ManuallyDrop` instead of `mem::forget` in
`Instrument::into_inner`
([#2765])
[#2765]: https://togithub.com/tokio-rs/tracing/pull/2765
Thanks to [@cramertj](https://togithub.com/cramertj) and
[@manishearth](https://togithub.com/manishearth) for finding and
fixing this issue!
---
### Configuration
📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 04ea835..6c26795 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4308,9 +4308,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
-version = "0.1.39"
+version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
"log",
"pin-project-lite",
From ef5e14701d48534c12a5c31f4cc9b991b42e6576 Mon Sep 17 00:00:00 2001
From: Danil
Date: Thu, 18 Jan 2024 12:17:17 +0100
Subject: [PATCH 026/128] feat(api): adds api to finalizer to query withdrawals
(#354)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---------
Signed-off-by: Danil
Co-authored-by: Fedor Sakharov
---
Cargo.lock | 230 ++++++++++++++++--
Cargo.toml | 4 +-
api/Cargo.toml | 15 ++
api/src/lib.rs | 54 ++++
bin/withdrawal-finalizer/Cargo.toml | 1 +
bin/withdrawal-finalizer/src/main.rs | 7 +-
...e59ab42e1511a38989dfc83f0a240d85a511a.json | 41 ++++
storage/src/lib.rs | 73 ++++++
8 files changed, 409 insertions(+), 16 deletions(-)
create mode 100644 api/Cargo.toml
create mode 100644 api/src/lib.rs
create mode 100644 storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
diff --git a/Cargo.lock b/Cargo.lock
index 6c26795..dcfc6fe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -137,6 +137,18 @@ dependencies = [
"backtrace",
]
+[[package]]
+name = "api"
+version = "0.2.0"
+dependencies = [
+ "axum",
+ "ethers",
+ "serde",
+ "sqlx",
+ "storage",
+ "tokio",
+]
+
[[package]]
name = "array-init"
version = "0.0.4"
@@ -210,6 +222,61 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+[[package]]
+name = "axum"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
+ "mime",
+ "pin-project-lite",
+ "rustversion",
+ "sync_wrapper",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
[[package]]
name = "backtrace"
version = "0.3.68"
@@ -1339,7 +1406,7 @@ dependencies = [
"futures-timer",
"futures-util",
"hashers",
- "http",
+ "http 0.2.9",
"instant",
"jsonwebtoken",
"once_cell",
@@ -1732,7 +1799,26 @@ dependencies = [
"futures-core",
"futures-sink",
"futures-util",
- "http",
+ "http 0.2.9",
+ "indexmap 2.0.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 1.0.0",
"indexmap 2.0.0",
"slab",
"tokio",
@@ -1844,6 +1930,17 @@ dependencies = [
"itoa",
]
+[[package]]
+name = "http"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
[[package]]
name = "http-body"
version = "0.4.5"
@@ -1851,7 +1948,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
dependencies = [
"bytes",
- "http",
+ "http 0.2.9",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
"pin-project-lite",
]
@@ -1877,9 +1997,9 @@ dependencies = [
"futures-channel",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.24",
+ "http 0.2.9",
+ "http-body 0.4.5",
"httparse",
"httpdate",
"itoa",
@@ -1891,6 +2011,25 @@ dependencies = [
"want",
]
+[[package]]
+name = "hyper"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.2",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "tokio",
+]
+
[[package]]
name = "hyper-rustls"
version = "0.24.1"
@@ -1898,13 +2037,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
dependencies = [
"futures-util",
- "http",
- "hyper",
+ "http 0.2.9",
+ "hyper 0.14.27",
"rustls",
"tokio",
"tokio-rustls",
]
+[[package]]
+name = "hyper-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.1.0",
+ "pin-project-lite",
+ "socket2 0.5.5",
+ "tokio",
+ "tracing",
+]
+
[[package]]
name = "iana-time-zone"
version = "0.1.57"
@@ -2242,6 +2399,12 @@ dependencies = [
"regex-automata 0.1.10",
]
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
[[package]]
name = "maybe-uninit"
version = "2.0.0"
@@ -3067,10 +3230,10 @@ dependencies = [
"encoding_rs",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.9",
+ "http-body 0.4.5",
+ "hyper 0.14.27",
"hyper-rustls",
"ipnet",
"js-sys",
@@ -3530,6 +3693,16 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_path_to_error"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
+dependencies = [
+ "itoa",
+ "serde",
+]
+
[[package]]
name = "serde_spanned"
version = "0.6.4"
@@ -4063,6 +4236,12 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
[[package]]
name = "tap"
version = "1.0.1"
@@ -4300,6 +4479,28 @@ dependencies = [
"winnow",
]
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project",
+ "pin-project-lite",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
[[package]]
name = "tower-service"
version = "0.3.2"
@@ -4417,7 +4618,7 @@ dependencies = [
"byteorder",
"bytes",
"data-encoding",
- "http",
+ "http 0.2.9",
"httparse",
"log",
"rand",
@@ -4612,7 +4813,7 @@ name = "vise-exporter"
version = "0.1.0"
source = "git+https://github.com/matter-labs/vise.git#90e5423a876575762dec71d5d279666cc5ae6b84"
dependencies = [
- "hyper",
+ "hyper 0.14.27",
"once_cell",
"tokio",
"tracing",
@@ -4937,6 +5138,7 @@ dependencies = [
name = "withdrawal-finalizer"
version = "0.2.0"
dependencies = [
+ "api",
"chain-events",
"client",
"color-eyre",
diff --git a/Cargo.toml b/Cargo.toml
index b8c3421..dd4dabd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,7 +14,8 @@ members = [
"tx-sender",
"vlog",
"watcher",
- "withdrawals-meterer"
+ "withdrawals-meterer",
+ "api"
]
[workspace.package]
@@ -56,6 +57,7 @@ chrono = { version = "0.4.31", default-features = false }
vise = { git = "https://github.com/matter-labs/vise.git" }
vise-exporter = { git = "https://github.com/matter-labs/vise.git" }
client = { path = "./client" }
+api = { path = "./api" }
chain-events = { path = "./chain-events" }
storage = { path = "./storage" }
withdrawals-meterer = { path = "./withdrawals-meterer" }
diff --git a/api/Cargo.toml b/api/Cargo.toml
new file mode 100644
index 0000000..05cd0f8
--- /dev/null
+++ b/api/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "api"
+version.workspace = true
+homepage.workspace = true
+license.workspace = true
+edition.workspace = true
+authors.workspace = true
+
+[dependencies]
+axum = "0.7.4"
+storage.workspace = true
+sqlx.workspace = true
+serde.workspace = true
+tokio.workspace = true
+ethers.workspace = true
\ No newline at end of file
diff --git a/api/src/lib.rs b/api/src/lib.rs
new file mode 100644
index 0000000..2540c28
--- /dev/null
+++ b/api/src/lib.rs
@@ -0,0 +1,54 @@
+use axum::extract::State;
+use axum::{http::StatusCode, routing::get, Json, Router};
+use ethers::abi::Address;
+use ethers::types::{H256, U256};
+use serde::{Deserialize, Serialize};
+use sqlx::PgPool;
+use storage::UserWithdrawal;
+
+#[derive(Deserialize, Serialize, Clone)]
+struct WithdrawalRequest {
+ pub from: Address,
+ pub limit: u64,
+}
+#[derive(Deserialize, Serialize, Clone)]
+struct WithdrawalResponse {
+ pub tx_hash: H256,
+ pub token: Address,
+ pub amount: U256,
+ pub status: String,
+}
+
+impl From for WithdrawalResponse {
+ fn from(withdrawal: UserWithdrawal) -> Self {
+ Self {
+ tx_hash: withdrawal.tx_hash,
+ token: withdrawal.token,
+ amount: withdrawal.amount,
+ status: format!("{:?}", withdrawal.status),
+ }
+ }
+}
+
+pub async fn run_server(pool: PgPool) {
+ let app = Router::new()
+ .route("/withdrawals", get(get_withdrawals))
+ .with_state(pool);
+
+ // run our app with hyper, listening globally on port 3000
+ let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
+ axum::serve(listener, app).await.unwrap();
+}
+
+async fn get_withdrawals(
+ State(pool): State,
+ Json(payload): Json,
+) -> Result>, StatusCode> {
+ let result: Vec<_> = storage::withdrawals_for_address(&pool, payload.from, payload.limit)
+ .await
+ .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
+ .into_iter()
+ .map(WithdrawalResponse::from)
+ .collect();
+ Ok(Json(result))
+}
diff --git a/bin/withdrawal-finalizer/Cargo.toml b/bin/withdrawal-finalizer/Cargo.toml
index 7b52d51..a385946 100644
--- a/bin/withdrawal-finalizer/Cargo.toml
+++ b/bin/withdrawal-finalizer/Cargo.toml
@@ -29,3 +29,4 @@ chain-events = { workspace = true }
vlog = { workspace = true }
finalizer = { workspace = true }
watcher = { workspace = true }
+api = { workspace = true }
diff --git a/bin/withdrawal-finalizer/src/main.rs b/bin/withdrawal-finalizer/src/main.rs
index b544c9e..b571648 100644
--- a/bin/withdrawal-finalizer/src/main.rs
+++ b/bin/withdrawal-finalizer/src/main.rs
@@ -290,7 +290,7 @@ async fn main() -> Result<()> {
None => None,
};
let finalizer = finalizer::Finalizer::new(
- pgpool,
+ pgpool.clone(),
one_withdrawal_gas_limit,
batch_finalization_gas_limit,
contract,
@@ -304,7 +304,12 @@ async fn main() -> Result<()> {
);
let finalizer_handle = tokio::spawn(finalizer.run(client_l2));
+ let api_server = tokio::spawn(api::run_server(pgpool));
+
tokio::select! {
+ r = api_server => {
+ tracing::error!("Api server ended with {r:?}");
+ }
r = block_events_handle => {
tracing::error!("Block Events stream ended with {r:?}");
}
diff --git a/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json b/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
new file mode 100644
index 0000000..3f80961
--- /dev/null
+++ b/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
@@ -0,0 +1,41 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "\n SELECT\n l2_to_l1_events.l1_token_addr,\n l2_to_l1_events.amount,\n withdrawals.tx_hash,\n finalization_data.finalization_tx\n FROM\n l2_to_l1_events\n JOIN finalization_data ON\n finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number\n AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block\n JOIN withdrawals ON\n withdrawals.id = finalization_data.withdrawal_id\n WHERE l2_to_l1_events.to_address = $1\n ORDER BY l2_to_l1_events.l2_block_number DESC\n LIMIT $2\n ",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "l1_token_addr",
+ "type_info": "Bytea"
+ },
+ {
+ "ordinal": 1,
+ "name": "amount",
+ "type_info": "Numeric"
+ },
+ {
+ "ordinal": 2,
+ "name": "tx_hash",
+ "type_info": "Bytea"
+ },
+ {
+ "ordinal": 3,
+ "name": "finalization_tx",
+ "type_info": "Bytea"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Bytea",
+ "Int8"
+ ]
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ true
+ ]
+ },
+ "hash": "1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a"
+}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index 54cce5c..17a35af 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -1288,3 +1288,76 @@ pub async fn delete_finalization_data_content(
Ok(())
}
+
+/// Finalization status of a withdrawal
+#[derive(Debug, Clone)]
+pub enum FinalizationStatus {
+ /// Withdrawal has been finalized
+ Finalized,
+ /// Withdrawal has not been finalized
+ NotFinalized,
+}
+
+/// Withdrawal event requested for address
+pub struct UserWithdrawal {
+ /// Transaction hash
+ pub tx_hash: H256,
+ /// Token address
+ pub token: Address,
+ /// Amount
+ pub amount: U256,
+ /// Status
+ pub status: FinalizationStatus,
+}
+
+/// Request withdrawals for a given address.
+pub async fn withdrawals_for_address(
+ pool: &PgPool,
+ address: Address,
+ limit: u64,
+) -> Result> {
+ let latency = STORAGE_METRICS.call[&"withdrawals_for_address"].start();
+
+ let events = sqlx::query!(
+ "
+ SELECT
+ l2_to_l1_events.l1_token_addr,
+ l2_to_l1_events.amount,
+ withdrawals.tx_hash,
+ finalization_data.finalization_tx
+ FROM
+ l2_to_l1_events
+ JOIN finalization_data ON
+ finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number
+ AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block
+ JOIN withdrawals ON
+ withdrawals.id = finalization_data.withdrawal_id
+ WHERE l2_to_l1_events.to_address = $1
+ ORDER BY l2_to_l1_events.l2_block_number DESC
+ LIMIT $2
+ ",
+ address.as_bytes(),
+ limit as i64,
+ )
+ .fetch_all(pool)
+ .await?
+ .into_iter()
+ .map(|r| {
+ let status = if r.finalization_tx.is_some() {
+ FinalizationStatus::Finalized
+ } else {
+ FinalizationStatus::NotFinalized
+ };
+ UserWithdrawal {
+ tx_hash: H256::from_slice(&r.tx_hash),
+ token: Address::from_slice(&r.l1_token_addr),
+ amount: utils::bigdecimal_to_u256(r.amount),
+ status,
+ }
+ })
+ .collect();
+
+ latency.observe();
+
+ Ok(events)
+}
From fb9f6bde4c761493002ddf9b92ff16ddf2f65284 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Thu, 18 Jan 2024 12:28:04 +0100
Subject: [PATCH 027/128] chore(main): release 0.6.0 (#357)
:robot: I have created a release *beep* *boop*
---
##
[0.6.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.5.0...v0.6.0)
(2024-01-18)
### Features
* **api:** adds api to finalizer to query withdrawals
([#354](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/354))
([ef5e147](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/ef5e14701d48534c12a5c31f4cc9b991b42e6576))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index f1c1e58..bcd0522 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.5.0"
+ ".": "0.6.0"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ff0105e..832346e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [0.6.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.5.0...v0.6.0) (2024-01-18)
+
+
+### Features
+
+* **api:** adds api to finalizer to query withdrawals ([#354](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/354)) ([ef5e147](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/ef5e14701d48534c12a5c31f4cc9b991b42e6576))
+
## [0.5.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.4.0...v0.5.0) (2024-01-17)
From a43e9553f16a3d8dcc486b4666f55bfaeb20f5ba Mon Sep 17 00:00:00 2001
From: Danil
Date: Thu, 18 Jan 2024 14:49:34 +0100
Subject: [PATCH 028/128] fix: change types on api (#358)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
Signed-off-by: Danil
---
api/src/lib.rs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/api/src/lib.rs b/api/src/lib.rs
index 2540c28..a1410b9 100644
--- a/api/src/lib.rs
+++ b/api/src/lib.rs
@@ -1,4 +1,4 @@
-use axum::extract::State;
+use axum::extract::{Path, Query, State};
use axum::{http::StatusCode, routing::get, Json, Router};
use ethers::abi::Address;
use ethers::types::{H256, U256};
@@ -8,7 +8,6 @@ use storage::UserWithdrawal;
#[derive(Deserialize, Serialize, Clone)]
struct WithdrawalRequest {
- pub from: Address,
pub limit: u64,
}
#[derive(Deserialize, Serialize, Clone)]
@@ -32,7 +31,7 @@ impl From for WithdrawalResponse {
pub async fn run_server(pool: PgPool) {
let app = Router::new()
- .route("/withdrawals", get(get_withdrawals))
+ .route("/withdrawals/:from", get(get_withdrawals))
.with_state(pool);
// run our app with hyper, listening globally on port 3000
@@ -41,10 +40,11 @@ pub async fn run_server(pool: PgPool) {
}
async fn get_withdrawals(
+ Path(from): Path,
State(pool): State,
- Json(payload): Json,
+ Query(payload): Query,
) -> Result>, StatusCode> {
- let result: Vec<_> = storage::withdrawals_for_address(&pool, payload.from, payload.limit)
+ let result: Vec<_> = storage::withdrawals_for_address(&pool, from, payload.limit)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
.into_iter()
From e6f8b0b0269a3e9dd5a82f7a9eceec10213a2d3b Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Thu, 18 Jan 2024 15:02:20 +0100
Subject: [PATCH 029/128] chore(withdrawal-finalizer): adds metrics for
unfinalized eth withdrawals (#351)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
bin/withdrawal-finalizer/src/main.rs | 8 +++
bin/withdrawal-finalizer/src/metrics.rs | 36 ++++++++++
...58786961de485d7f109005ee54d78f3fdd55e.json | 22 ++++++
...a5bc149d100f740be557d170e7f1e3a055532.json | 20 ++++++
storage/src/lib.rs | 71 +++++++++++++++++++
5 files changed, 157 insertions(+)
create mode 100644 storage/.sqlx/query-69b33bf2e4eeb6e6d37b8651fea58786961de485d7f109005ee54d78f3fdd55e.json
create mode 100644 storage/.sqlx/query-a3dbb0522919f63706f3576b394a5bc149d100f740be557d170e7f1e3a055532.json
diff --git a/bin/withdrawal-finalizer/src/main.rs b/bin/withdrawal-finalizer/src/main.rs
index b571648..daf2c5f 100644
--- a/bin/withdrawal-finalizer/src/main.rs
+++ b/bin/withdrawal-finalizer/src/main.rs
@@ -304,6 +304,11 @@ async fn main() -> Result<()> {
);
let finalizer_handle = tokio::spawn(finalizer.run(client_l2));
+ let metrics_handle = tokio::spawn(metrics::meter_unfinalized_withdrawals(
+ pgpool.clone(),
+ eth_finalization_threshold,
+ ));
+
let api_server = tokio::spawn(api::run_server(pgpool));
tokio::select! {
@@ -322,6 +327,9 @@ async fn main() -> Result<()> {
r = finalizer_handle => {
tracing::error!("Finalizer ended with {r:?}");
}
+ _ = metrics_handle => {
+ tracing::error!("Metrics loop has ended");
+ }
}
stop_vise_exporter.send_replace(());
diff --git a/bin/withdrawal-finalizer/src/metrics.rs b/bin/withdrawal-finalizer/src/metrics.rs
index e772420..235dafe 100644
--- a/bin/withdrawal-finalizer/src/metrics.rs
+++ b/bin/withdrawal-finalizer/src/metrics.rs
@@ -1,7 +1,13 @@
//! Metrics for main binary
+use std::time::Duration;
+
+use ethers::types::U256;
+use sqlx::PgPool;
use vise::{Gauge, Metrics};
+const METRICS_REFRESH_PERIOD: Duration = Duration::from_secs(15);
+
/// Main finalizer binary metrics
#[derive(Debug, Metrics)]
#[metrics(prefix = "withdrawal_finalizer")]
@@ -11,7 +17,37 @@ pub(super) struct FinalizerMainMetrics {
/// Capacity of the channel sending L2 events.
pub watcher_l2_channel_capacity: Gauge,
+
+ /// The withdrawals that were not finalized but are executed
+ pub executed_eth_withdrawals_not_finalized: Gauge,
+
+ /// The withdrawals that
+ pub unexecuted_eth_withdrawals_below_current_threshold: Gauge,
}
#[vise::register]
pub(super) static MAIN_FINALIZER_METRICS: vise::Global = vise::Global::new();
+
+pub async fn meter_unfinalized_withdrawals(pool: PgPool, eth_threshold: Option) {
+ loop {
+ tokio::time::sleep(METRICS_REFRESH_PERIOD).await;
+
+ let Ok(executed_not_finalized) =
+ storage::get_executed_and_not_finalized_withdrawals_count(&pool).await
+ else {
+ continue;
+ };
+ let Ok(unexecuted) = storage::get_unexecuted_withdrawals_count(&pool, eth_threshold).await
+ else {
+ continue;
+ };
+
+ MAIN_FINALIZER_METRICS
+ .executed_eth_withdrawals_not_finalized
+ .set(executed_not_finalized);
+
+ MAIN_FINALIZER_METRICS
+ .unexecuted_eth_withdrawals_below_current_threshold
+ .set(unexecuted);
+ }
+}
diff --git a/storage/.sqlx/query-69b33bf2e4eeb6e6d37b8651fea58786961de485d7f109005ee54d78f3fdd55e.json b/storage/.sqlx/query-69b33bf2e4eeb6e6d37b8651fea58786961de485d7f109005ee54d78f3fdd55e.json
new file mode 100644
index 0000000..adcb8db
--- /dev/null
+++ b/storage/.sqlx/query-69b33bf2e4eeb6e6d37b8651fea58786961de485d7f109005ee54d78f3fdd55e.json
@@ -0,0 +1,22 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "\n SELECT\n COUNT(*)\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND finalization_data.l2_block_number > COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND token = decode('000000000000000000000000000000000000800A', 'hex') \n AND amount >= $1\n ",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "count",
+ "type_info": "Int8"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Numeric"
+ ]
+ },
+ "nullable": [
+ null
+ ]
+ },
+ "hash": "69b33bf2e4eeb6e6d37b8651fea58786961de485d7f109005ee54d78f3fdd55e"
+}
diff --git a/storage/.sqlx/query-a3dbb0522919f63706f3576b394a5bc149d100f740be557d170e7f1e3a055532.json b/storage/.sqlx/query-a3dbb0522919f63706f3576b394a5bc149d100f740be557d170e7f1e3a055532.json
new file mode 100644
index 0000000..bbf830f
--- /dev/null
+++ b/storage/.sqlx/query-a3dbb0522919f63706f3576b394a5bc149d100f740be557d170e7f1e3a055532.json
@@ -0,0 +1,20 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "\n SELECT\n COUNT(*)\n FROM\n finalization_data\n JOIN withdrawals w ON finalization_data.withdrawal_id = w.id\n WHERE\n finalization_tx IS NULL\n AND failed_finalization_attempts = 0\n AND finalization_data.l2_block_number <= COALESCE(\n (\n SELECT\n MAX(l2_block_number)\n FROM\n l2_blocks\n WHERE\n execute_l1_block_number IS NOT NULL\n ),\n 1\n )\n AND token = decode('000000000000000000000000000000000000800A', 'hex') \n ",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "count",
+ "type_info": "Int8"
+ }
+ ],
+ "parameters": {
+ "Left": []
+ },
+ "nullable": [
+ null
+ ]
+ },
+ "hash": "a3dbb0522919f63706f3576b394a5bc149d100f740be557d170e7f1e3a055532"
+}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index 17a35af..4f09c8e 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -974,6 +974,77 @@ pub async fn withdrawals_to_finalize(
Ok(data)
}
+/// Get the number of ETH withdrawals not yet executed and finalized and above some threshold
+pub async fn get_unexecuted_withdrawals_count(
+ pool: &PgPool,
+ eth_threshold: Option,
+) -> Result {
+ // if no threshold, query _all_ ethereum withdrawals since all of them are >= 0.
+ let eth_threshold = eth_threshold.unwrap_or(U256::zero());
+
+ let count = sqlx::query!(
+ "
+ SELECT
+ COUNT(*)
+ FROM
+ finalization_data
+ JOIN withdrawals w ON finalization_data.withdrawal_id = w.id
+ WHERE
+ finalization_tx IS NULL
+ AND finalization_data.l2_block_number > COALESCE(
+ (
+ SELECT
+ MAX(l2_block_number)
+ FROM
+ l2_blocks
+ WHERE
+ execute_l1_block_number IS NOT NULL
+ ),
+ 1
+ )
+ AND token = decode('000000000000000000000000000000000000800A', 'hex')
+ AND amount >= $1
+ ",
+ u256_to_big_decimal(eth_threshold),
+ )
+ .fetch_one(pool)
+ .await?;
+
+ Ok(count.count.unwrap_or(0))
+}
+
+/// Get the number of ETH withdrawals executed but not finalized
+pub async fn get_executed_and_not_finalized_withdrawals_count(pool: &PgPool) -> Result {
+ let count = sqlx::query!(
+ "
+ SELECT
+ COUNT(*)
+ FROM
+ finalization_data
+ JOIN withdrawals w ON finalization_data.withdrawal_id = w.id
+ WHERE
+ finalization_tx IS NULL
+ AND failed_finalization_attempts = 0
+ AND finalization_data.l2_block_number <= COALESCE(
+ (
+ SELECT
+ MAX(l2_block_number)
+ FROM
+ l2_blocks
+ WHERE
+ execute_l1_block_number IS NOT NULL
+ ),
+ 1
+ )
+ AND token = decode('000000000000000000000000000000000000800A', 'hex')
+ ",
+ )
+ .fetch_one(pool)
+ .await?;
+
+ Ok(count.count.unwrap_or(0))
+}
+
/// Fetch finalization parameters for some withdrawal
pub async fn get_finalize_withdrawal_params(
pool: &PgPool,
From 7f4a7e9fd002c191b982dd3036dfb6986f448ccc Mon Sep 17 00:00:00 2001
From: Danil
Date: Thu, 18 Jan 2024 15:06:27 +0100
Subject: [PATCH 030/128] fix(api): Healtcheck and api fixes (#360)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---------
Signed-off-by: Danil
Co-authored-by: Fedor Sakharov
---
api/src/lib.rs | 8 ++++++++
bin/withdrawal-finalizer/src/main.rs | 10 ++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/api/src/lib.rs b/api/src/lib.rs
index a1410b9..0ead7c6 100644
--- a/api/src/lib.rs
+++ b/api/src/lib.rs
@@ -32,6 +32,7 @@ impl From for WithdrawalResponse {
pub async fn run_server(pool: PgPool) {
let app = Router::new()
.route("/withdrawals/:from", get(get_withdrawals))
+ .route("/health", get(health))
.with_state(pool);
// run our app with hyper, listening globally on port 3000
@@ -39,6 +40,13 @@ pub async fn run_server(pool: PgPool) {
axum::serve(listener, app).await.unwrap();
}
+async fn health(State(pool): State) -> Result<&'static str, StatusCode> {
+ pool.acquire()
+ .await
+ .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
+ Ok("ok")
+}
+
async fn get_withdrawals(
Path(from): Path,
State(pool): State,
diff --git a/bin/withdrawal-finalizer/src/main.rs b/bin/withdrawal-finalizer/src/main.rs
index daf2c5f..457a61a 100644
--- a/bin/withdrawal-finalizer/src/main.rs
+++ b/bin/withdrawal-finalizer/src/main.rs
@@ -15,7 +15,10 @@ use ethers::{
types::U256,
};
use eyre::{anyhow, Result};
-use sqlx::{postgres::PgConnectOptions, ConnectOptions, PgConnection, PgPool};
+use sqlx::{
+ postgres::{PgConnectOptions, PgPoolOptions},
+ ConnectOptions, PgConnection,
+};
use chain_events::{BlockEvents, L2EventsListener};
use client::{l1bridge::codegen::IL1Bridge, zksync_contract::codegen::IZkSync, ZksyncMiddleware};
@@ -177,7 +180,10 @@ async fn main() -> Result<()> {
let options =
PgConnectOptions::from_str(config.database_url.as_str())?.disable_statement_logging();
- let pgpool = PgPool::connect_with(options).await?;
+ let pgpool = PgPoolOptions::new()
+ .acquire_timeout(Duration::from_secs(2))
+ .connect_with(options)
+ .await?;
let from_l2_block = start_from_l2_block(
client_l2.clone(),
From 5d3254aae521499e26099e706b6dd1bad4fff0be Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Thu, 18 Jan 2024 15:11:12 +0100
Subject: [PATCH 031/128] chore(main): release 0.6.1 (#359)
:robot: I have created a release *beep* *boop*
---
##
[0.6.1](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.0...v0.6.1)
(2024-01-18)
### Bug Fixes
* **api:** Healtcheck and api fixes
([#360](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/360))
([7f4a7e9](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/7f4a7e9fd002c191b982dd3036dfb6986f448ccc))
* change types on api
([#358](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/358))
([a43e955](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a43e9553f16a3d8dcc486b4666f55bfaeb20f5ba))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index bcd0522..5d02000 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.6.0"
+ ".": "0.6.1"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 832346e..1cf7745 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## [0.6.1](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.0...v0.6.1) (2024-01-18)
+
+
+### Bug Fixes
+
+* **api:** Healtcheck and api fixes ([#360](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/360)) ([7f4a7e9](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/7f4a7e9fd002c191b982dd3036dfb6986f448ccc))
+* change types on api ([#358](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/358)) ([a43e955](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a43e9553f16a3d8dcc486b4666f55bfaeb20f5ba))
+
## [0.6.0](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.5.0...v0.6.0) (2024-01-18)
From dab6780de8699c9b4fb5f9dccc85be7fdfd0af58 Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Fri, 19 Jan 2024 18:30:07 +0100
Subject: [PATCH 032/128] fix(api): use permissive cors (#361)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
Cargo.lock | 17 +++++++++++++++++
Cargo.toml | 2 ++
api/Cargo.toml | 5 +++--
api/src/lib.rs | 3 +++
4 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index dcfc6fe..a26e36b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -147,6 +147,7 @@ dependencies = [
"sqlx",
"storage",
"tokio",
+ "tower-http",
]
[[package]]
@@ -4495,6 +4496,22 @@ dependencies = [
"tracing",
]
+[[package]]
+name = "tower-http"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e"
+dependencies = [
+ "bitflags 2.4.1",
+ "bytes",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "http-body-util",
+ "pin-project-lite",
+ "tower-layer",
+ "tower-service",
+]
+
[[package]]
name = "tower-layer"
version = "0.3.2"
diff --git a/Cargo.toml b/Cargo.toml
index dd4dabd..ad82552 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -67,5 +67,7 @@ tx-sender = { path = "./tx-sender" }
finalizer = { path = "./finalizer" }
tokio-stream = "0.1.14"
tokio-util = "0.7.10"
+tower-http = "0.5.1"
url = "2.5.0"
+axum = "0.7.4"
vlog = { path = "./vlog" }
diff --git a/api/Cargo.toml b/api/Cargo.toml
index 05cd0f8..081ed7a 100644
--- a/api/Cargo.toml
+++ b/api/Cargo.toml
@@ -7,9 +7,10 @@ edition.workspace = true
authors.workspace = true
[dependencies]
-axum = "0.7.4"
+axum = { workspace = true }
+tower-http = { workspace = true, features = ["cors"] }
storage.workspace = true
sqlx.workspace = true
serde.workspace = true
tokio.workspace = true
-ethers.workspace = true
\ No newline at end of file
+ethers.workspace = true
diff --git a/api/src/lib.rs b/api/src/lib.rs
index 0ead7c6..04d0d26 100644
--- a/api/src/lib.rs
+++ b/api/src/lib.rs
@@ -5,6 +5,7 @@ use ethers::types::{H256, U256};
use serde::{Deserialize, Serialize};
use sqlx::PgPool;
use storage::UserWithdrawal;
+use tower_http::cors::CorsLayer;
#[derive(Deserialize, Serialize, Clone)]
struct WithdrawalRequest {
@@ -30,9 +31,11 @@ impl From for WithdrawalResponse {
}
pub async fn run_server(pool: PgPool) {
+ let cors_layer = CorsLayer::permissive();
let app = Router::new()
.route("/withdrawals/:from", get(get_withdrawals))
.route("/health", get(health))
+ .layer(cors_layer)
.with_state(pool);
// run our app with hyper, listening globally on port 3000
From 8f1a621bd98754be4e0a7a84521116adb33e6af3 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Fri, 19 Jan 2024 18:49:15 +0100
Subject: [PATCH 033/128] chore(main): release 0.6.2 (#362)
:robot: I have created a release *beep* *boop*
---
##
[0.6.2](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.1...v0.6.2)
(2024-01-19)
### Bug Fixes
* **api:** use permissive cors
([#361](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/361))
([dab6780](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/dab6780de8699c9b4fb5f9dccc85be7fdfd0af58))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index 5d02000..bf5f1fb 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.6.1"
+ ".": "0.6.2"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1cf7745..f7c18a0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [0.6.2](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.1...v0.6.2) (2024-01-19)
+
+
+### Bug Fixes
+
+* **api:** use permissive cors ([#361](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/361)) ([dab6780](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/dab6780de8699c9b4fb5f9dccc85be7fdfd0af58))
+
## [0.6.1](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.0...v0.6.1) (2024-01-18)
From cfe74f20453a6deeba2aa5d051b4728066286150 Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Mon, 22 Jan 2024 12:31:48 +0100
Subject: [PATCH 034/128] chore: finalize all tokens by default (#363)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
finalizer/src/lib.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/finalizer/src/lib.rs b/finalizer/src/lib.rs
index f339cf9..9445dd4 100644
--- a/finalizer/src/lib.rs
+++ b/finalizer/src/lib.rs
@@ -60,7 +60,7 @@ pub enum TokenList {
impl Default for TokenList {
fn default() -> Self {
- Self::WhiteList(vec![client::ETH_TOKEN_ADDRESS])
+ Self::All
}
}
From b5a615243842a8d7867a0759e713776f801876d1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 12:32:42 +0100
Subject: [PATCH 035/128] chore(deps): update rust crate chrono to 0.4.32
(#365)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [chrono](https://togithub.com/chronotope/chrono) |
workspace.dependencies | patch | `0.4.31` -> `0.4.32` |
---
### Release Notes
chronotope/chrono (chrono)
###
[`v0.4.32`](https://togithub.com/chronotope/chrono/compare/v0.4.31...v0.4.32)
[Compare
Source](https://togithub.com/chronotope/chrono/compare/v0.4.31...v0.4.32)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 83 +++++++++++++++++++++++++++++++++++++++++++++---------
Cargo.toml | 2 +-
2 files changed, 71 insertions(+), 14 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index a26e36b..7ae0c51 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -534,15 +534,15 @@ dependencies = [
[[package]]
name = "chrono"
-version = "0.4.31"
+version = "0.4.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a"
dependencies = [
"android-tzdata",
"iana-time-zone",
"num-traits",
"serde",
- "windows-targets",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -2746,7 +2746,7 @@ dependencies = [
"libc",
"redox_syscall 0.3.5",
"smallvec 1.11.0",
- "windows-targets",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -5063,7 +5063,7 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -5072,7 +5072,7 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -5081,13 +5081,28 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
]
[[package]]
@@ -5096,42 +5111,84 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
[[package]]
name = "winnow"
version = "0.5.10"
diff --git a/Cargo.toml b/Cargo.toml
index ad82552..3fb0f4e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -53,7 +53,7 @@ syn = "2.0.43"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
-chrono = { version = "0.4.31", default-features = false }
+chrono = { version = "0.4.32", default-features = false }
vise = { git = "https://github.com/matter-labs/vise.git" }
vise-exporter = { git = "https://github.com/matter-labs/vise.git" }
client = { path = "./client" }
From 8c0ef40a228c27f9b7fae33521ed3fab84367ac1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 13:21:36 +0100
Subject: [PATCH 036/128] chore(deps): update rust crate async-trait to 0.1.77
(#364)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [async-trait](https://togithub.com/dtolnay/async-trait) |
workspace.dependencies | patch | `0.1.75` -> `0.1.77` |
---
### Release Notes
dtolnay/async-trait (async-trait)
###
[`v0.1.76`](https://togithub.com/dtolnay/async-trait/releases/tag/0.1.76)
[Compare
Source](https://togithub.com/dtolnay/async-trait/compare/0.1.75...0.1.76)
- Documentation improvements
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 58 +++++++++++++++++++++++++++---------------------------
Cargo.toml | 2 +-
2 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 7ae0c51..9d87e3e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -176,13 +176,13 @@ dependencies = [
[[package]]
name = "async-trait"
-version = "0.1.75"
+version = "0.1.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98"
+checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -586,7 +586,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -1286,7 +1286,7 @@ dependencies = [
"reqwest",
"serde",
"serde_json",
- "syn 2.0.43",
+ "syn 2.0.48",
"toml",
"walkdir",
]
@@ -1304,7 +1304,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -1330,7 +1330,7 @@ dependencies = [
"serde",
"serde_json",
"strum",
- "syn 2.0.43",
+ "syn 2.0.48",
"tempfile",
"thiserror",
"tiny-keccak",
@@ -1360,7 +1360,7 @@ dependencies = [
"ethers",
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -1678,7 +1678,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -2360,7 +2360,7 @@ checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -2622,7 +2622,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -2868,7 +2868,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -2906,7 +2906,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -2991,7 +2991,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
dependencies = [
"proc-macro2",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -3044,9 +3044,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.71"
+version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
+checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
"unicode-ident",
]
@@ -3071,14 +3071,14 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
name = "quote"
-version = "1.0.33"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
@@ -3680,7 +3680,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4186,7 +4186,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4228,9 +4228,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.43"
+version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53"
+checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [
"proc-macro2",
"quote",
@@ -4290,7 +4290,7 @@ checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4382,7 +4382,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4544,7 +4544,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4844,7 +4844,7 @@ source = "git+https://github.com/matter-labs/vise.git#90e5423a876575762dec71d5d2
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
]
[[package]]
@@ -4904,7 +4904,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
"wasm-bindgen-shared",
]
@@ -4938,7 +4938,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.43",
+ "syn 2.0.48",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
diff --git a/Cargo.toml b/Cargo.toml
index 3fb0f4e..9969802 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -28,7 +28,7 @@ exclude = ["./github"]
[workspace.dependencies]
auto_impl = "1.1.0"
-async-trait = "0.1.75"
+async-trait = "0.1.77"
ethers = { version = "2.0.11", default-features = false }
tokio = "1.35.1"
clap = "4.4.11"
From dfd91ea04e5ddb02966e763538e8f49bf48af919 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 15:18:05 +0100
Subject: [PATCH 037/128] chore(deps): update rust crate proc-macro2 to 1.0.78
(#367)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [proc-macro2](https://togithub.com/dtolnay/proc-macro2) |
workspace.dependencies | patch | `1.0.71` -> `1.0.78` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Cargo.toml b/Cargo.toml
index 9969802..47d1e50 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -44,7 +44,7 @@ color-eyre = "0.6.2"
eyre = "0.6.11"
dotenvy = "0.15.7"
envconfig = "0.10.0"
-proc-macro2 = "1.0.71"
+proc-macro2 = "1.0.78"
bincode = "1.3.3"
futures = "0.3.30"
quote = "1.0.33"
From d647b61eb4646e81799ae904f17d725781b99510 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 15:32:27 +0100
Subject: [PATCH 038/128] chore(deps): update rust crate clap to 4.4.18 (#366)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [clap](https://togithub.com/clap-rs/clap) | workspace.dependencies |
patch | `4.4.11` -> `4.4.18` |
---
### Release Notes
clap-rs/clap (clap)
###
[`v4.4.18`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4418---2024-01-16)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.17...v4.4.18)
##### Fixes
- *(error)* When lacking `usage` feature, ensure the list of required
arguments is unique
###
[`v4.4.17`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4417---2024-01-15)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.16...v4.4.17)
##### Fixes
- Fix `panic!` when mixing `args_conflicts_with_subcommands` with
`ArgGroup` (which is implicit with `derive`) introduced in 4.4.15
###
[`v4.4.16`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4416---2024-01-12)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.15...v4.4.16)
##### Fixes
- Ensure invalid escape sequences in user-defined strings are correctly
stripped when terminal doesn't support color
###
[`v4.4.15`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4415---2024-01-11)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.14...v4.4.15)
##### Fixes
- Improve error for `args_conflicts_with_subcommands`
- Ensure we error for `args_conflicts_with_subcommands` when using
subcommand short and long flags
###
[`v4.4.14`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4414---2024-01-08)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.13...v4.4.14)
##### Documentation
- Fix `find` cookbook entry to allow repeats of flags/options
##### Features
- Allow `num_args(0)` on options which allows making them emulate being
a flag for position-tracking flags
###
[`v4.4.13`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4413---2024-01-04)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.12...v4.4.13)
##### Documentation
- Fix link to structopt migration guide
###
[`v4.4.12`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#4412---2023-12-28)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.11...v4.4.12)
##### Performance
- Only ask `TypedValueParser` for possible values if needed
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 12 ++++++------
Cargo.toml | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 9d87e3e..d1b2f59 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -82,9 +82,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.4"
+version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
+checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -557,9 +557,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.4.11"
+version = "4.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2"
+checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
dependencies = [
"clap_builder",
"clap_derive",
@@ -567,9 +567,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.4.11"
+version = "4.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb"
+checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
dependencies = [
"anstream",
"anstyle",
diff --git a/Cargo.toml b/Cargo.toml
index 47d1e50..fcf905f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -31,7 +31,7 @@ auto_impl = "1.1.0"
async-trait = "0.1.77"
ethers = { version = "2.0.11", default-features = false }
tokio = "1.35.1"
-clap = "4.4.11"
+clap = "4.4.18"
tracing = "0.1"
tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
From 52da98a96c583aa1fa30cfa2f1771940ec7af1a7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 15:40:47 +0100
Subject: [PATCH 039/128] chore(deps): update rust crate serde to 1.0.195
(#369)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [serde](https://serde.rs)
([source](https://togithub.com/serde-rs/serde)) | workspace.dependencies
| patch | `1.0.193` -> `1.0.195` |
---
### Release Notes
serde-rs/serde (serde)
###
[`v1.0.195`](https://togithub.com/serde-rs/serde/releases/tag/v1.0.195)
[Compare
Source](https://togithub.com/serde-rs/serde/compare/v1.0.194...v1.0.195)
- Prevent remote definitions of tuple struct or tuple variant from
triggering dead_code warning
([#2671](https://togithub.com/serde-rs/serde/issues/2671))
###
[`v1.0.194`](https://togithub.com/serde-rs/serde/releases/tag/v1.0.194)
[Compare
Source](https://togithub.com/serde-rs/serde/compare/v1.0.193...v1.0.194)
- Update proc-macro2 to fix caching issue when using a rustc-wrapper
such as sccache
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index d1b2f59..cbd5780 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3654,9 +3654,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.193"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
+checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
dependencies = [
"serde_derive",
]
@@ -3674,9 +3674,9 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.193"
+version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
+checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index fcf905f..6cb1eba 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,7 +37,7 @@ tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
itertools = "0.12.0"
-serde = "1.0.193"
+serde = "1.0.195"
thiserror = "1.0.52"
serde_json = "1.0"
color-eyre = "0.6.2"
From 0c084b71bc71347ec0a0e2369bcc8278da768ae6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 16:49:18 +0100
Subject: [PATCH 040/128] chore(deps): update rust crate quote to 1.0.35 (#368)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [quote](https://togithub.com/dtolnay/quote) | workspace.dependencies |
patch | `1.0.33` -> `1.0.35` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Cargo.toml b/Cargo.toml
index 6cb1eba..23961b1 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -47,7 +47,7 @@ envconfig = "0.10.0"
proc-macro2 = "1.0.78"
bincode = "1.3.3"
futures = "0.3.30"
-quote = "1.0.33"
+quote = "1.0.35"
num = "0.4.1"
syn = "2.0.43"
hex = "0.4"
From 78bd7d6183586078b53db05d46d6108fcf1a9317 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 16:53:31 +0100
Subject: [PATCH 041/128] chore(deps): update rust crate syn to 2.0.48 (#370)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [syn](https://togithub.com/dtolnay/syn) | workspace.dependencies |
patch | `2.0.43` -> `2.0.48` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Cargo.toml b/Cargo.toml
index 23961b1..854e94c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -49,7 +49,7 @@ bincode = "1.3.3"
futures = "0.3.30"
quote = "1.0.35"
num = "0.4.1"
-syn = "2.0.43"
+syn = "2.0.48"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
From 49fb5259f32b07625c0f8528c34b53adf47cf30b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 17:05:03 +0100
Subject: [PATCH 042/128] chore(deps): update rust crate thiserror to 1.0.56
(#371)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [thiserror](https://togithub.com/dtolnay/thiserror) |
workspace.dependencies | patch | `1.0.52` -> `1.0.56` |
---
### Release Notes
dtolnay/thiserror (thiserror)
###
[`v1.0.56`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.56)
[Compare
Source](https://togithub.com/dtolnay/thiserror/compare/1.0.55...1.0.56)
- Update proc-macro2 to fix caching issue when using a rustc-wrapper
such as sccache
###
[`v1.0.55`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.55)
[Compare
Source](https://togithub.com/dtolnay/thiserror/compare/1.0.54...1.0.55)
- Work around improperly cached build script result by sccache – second
attempt
([#280](https://togithub.com/dtolnay/thiserror/issues/280))
###
[`v1.0.54`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.54)
[Compare
Source](https://togithub.com/dtolnay/thiserror/compare/1.0.53...1.0.54)
- Work around improperly cached build script result by sccache – first
attempt
([#279](https://togithub.com/dtolnay/thiserror/issues/279))
###
[`v1.0.53`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.53)
[Compare
Source](https://togithub.com/dtolnay/thiserror/compare/1.0.52...1.0.53)
- Reduce spurious rebuilds under RustRover IDE when using a nightly
toolchain
([#270](https://togithub.com/dtolnay/thiserror/issues/270))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index cbd5780..07a3329 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4275,18 +4275,18 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.52"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83a48fd946b02c0a526b2e9481c8e2a17755e47039164a86c4070446e3a4614d"
+checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.52"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7fbe9b594d6568a6a1443250a7e67d80b74e1e96f6d1715e1e21cc1888291d3"
+checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 854e94c..139dea4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -38,7 +38,7 @@ sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
itertools = "0.12.0"
serde = "1.0.195"
-thiserror = "1.0.52"
+thiserror = "1.0.56"
serde_json = "1.0"
color-eyre = "0.6.2"
eyre = "0.6.11"
From 88855aadb1b1681d847fb24922584b0f426d7828 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 23 Jan 2024 17:44:34 +0100
Subject: [PATCH 043/128] chore(deps): update rust docker tag to v1.75 (#372)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| rust | stage | minor | `1.74` -> `1.75` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index c73ae21..0723c8e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM rust:1.74 AS builder
+FROM rust:1.75 AS builder
WORKDIR /app
From 7c222388c2abf6edba06a2858f5a7b2483f8b767 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 25 Jan 2024 16:30:50 +0100
Subject: [PATCH 044/128] chore(deps): update rust crate chrono to 0.4.33
(#374)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [chrono](https://togithub.com/chronotope/chrono) |
workspace.dependencies | patch | `0.4.32` -> `0.4.33` |
---
### Release Notes
chronotope/chrono (chrono)
###
[`v0.4.33`](https://togithub.com/chronotope/chrono/releases/tag/v0.4.33):
0.4.33
[Compare
Source](https://togithub.com/chronotope/chrono/compare/v0.4.32...v0.4.33)
#### What's Changed
- Fixed typo in Duration::hours() exception by
[@danwilliams](https://togithub.com/danwilliams) in
[https://github.com/chronotope/chrono/pull/1384](https://togithub.com/chronotope/chrono/pull/1384)
- Make `rkyv` feature imply `size_32` by
[@pitdicker](https://togithub.com/pitdicker) in
[https://github.com/chronotope/chrono/pull/1383](https://togithub.com/chronotope/chrono/pull/1383)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 07a3329..00b3879 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -534,9 +534,9 @@ dependencies = [
[[package]]
name = "chrono"
-version = "0.4.32"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a"
+checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
dependencies = [
"android-tzdata",
"iana-time-zone",
diff --git a/Cargo.toml b/Cargo.toml
index 139dea4..e9c1733 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -53,7 +53,7 @@ syn = "2.0.48"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
-chrono = { version = "0.4.32", default-features = false }
+chrono = { version = "0.4.33", default-features = false }
vise = { git = "https://github.com/matter-labs/vise.git" }
vise-exporter = { git = "https://github.com/matter-labs/vise.git" }
client = { path = "./client" }
From f635101c1192886bfe1aace349f89d16eed35343 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 28 Jan 2024 23:32:26 +0100
Subject: [PATCH 045/128] chore(deps): update rust crate auto_impl to 1.1.2
(#376)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [auto_impl](https://togithub.com/auto-impl-rs/auto_impl) |
workspace.dependencies | patch | `1.1.0` -> `1.1.2` |
---
### Release Notes
auto-impl-rs/auto_impl (auto_impl)
###
[`v1.1.2`](https://togithub.com/auto-impl-rs/auto_impl/releases/tag/v1.1.2)
[Compare
Source](https://togithub.com/auto-impl-rs/auto_impl/compare/v1.1.1...v1.1.2)
#### What's Changed
- Associated type generics and syn::Error by
[@KodrAus](https://togithub.com/KodrAus) in
[https://github.com/auto-impl-rs/auto_impl/pull/96](https://togithub.com/auto-impl-rs/auto_impl/pull/96)
- Prepare for 1.1.2 release by
[@KodrAus](https://togithub.com/KodrAus) in
[https://github.com/auto-impl-rs/auto_impl/pull/97](https://togithub.com/auto-impl-rs/auto_impl/pull/97)
**Full Changelog**:
https://github.com/auto-impl-rs/auto_impl/compare/v1.1.1...v1.1.2
###
[`v1.1.1`](https://togithub.com/auto-impl-rs/auto_impl/releases/tag/v1.1.1)
[Compare
Source](https://togithub.com/auto-impl-rs/auto_impl/compare/v1.1.0...v1.1.1)
#### What's Changed
- Bump syn from 1.0 to 2.0 by
[@DaniPopes](https://togithub.com/DaniPopes) in
[https://github.com/auto-impl-rs/auto_impl/pull/92](https://togithub.com/auto-impl-rs/auto_impl/pull/92)
- Prepare for 1.1.1 release by
[@KodrAus](https://togithub.com/KodrAus) in
[https://github.com/auto-impl-rs/auto_impl/pull/95](https://togithub.com/auto-impl-rs/auto_impl/pull/95)
#### New Contributors
- [@DaniPopes](https://togithub.com/DaniPopes) made their first
contribution in
[https://github.com/auto-impl-rs/auto_impl/pull/92](https://togithub.com/auto-impl-rs/auto_impl/pull/92)
**Full Changelog**:
https://github.com/auto-impl-rs/auto_impl/compare/v1.1.0...v1.1.1
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 31 +++----------------------------
Cargo.toml | 2 +-
2 files changed, 4 insertions(+), 29 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 00b3879..67e5d1f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -207,14 +207,13 @@ dependencies = [
[[package]]
name = "auto_impl"
-version = "1.1.0"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89"
+checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa"
dependencies = [
- "proc-macro-error",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.48",
]
[[package]]
@@ -3018,30 +3017,6 @@ dependencies = [
"toml_edit 0.19.14",
]
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
[[package]]
name = "proc-macro2"
version = "1.0.78"
diff --git a/Cargo.toml b/Cargo.toml
index e9c1733..121218f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -27,7 +27,7 @@ authors = ["The Matter Labs Team "]
exclude = ["./github"]
[workspace.dependencies]
-auto_impl = "1.1.0"
+auto_impl = "1.1.2"
async-trait = "0.1.77"
ethers = { version = "2.0.11", default-features = false }
tokio = "1.35.1"
From 930625ba732b14e3c2fb9de2165a1fe60d0867cd Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Jan 2024 07:04:52 +0100
Subject: [PATCH 046/128] chore(deps): update rust crate serde to 1.0.196
(#375)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [serde](https://serde.rs)
([source](https://togithub.com/serde-rs/serde)) | workspace.dependencies
| patch | `1.0.195` -> `1.0.196` |
---
### Release Notes
serde-rs/serde (serde)
###
[`v1.0.196`](https://togithub.com/serde-rs/serde/compare/v1.0.195...v1.0.196)
[Compare
Source](https://togithub.com/serde-rs/serde/compare/v1.0.195...v1.0.196)
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 67e5d1f..936fd6a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3629,9 +3629,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.195"
+version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
+checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
dependencies = [
"serde_derive",
]
@@ -3649,9 +3649,9 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.195"
+version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
+checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 121218f..e78d35e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,7 +37,7 @@ tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
itertools = "0.12.0"
-serde = "1.0.195"
+serde = "1.0.196"
thiserror = "1.0.56"
serde_json = "1.0"
color-eyre = "0.6.2"
From 70b317eb8b253f671c1d70f730701ba76f1987e3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 29 Jan 2024 22:15:54 +0100
Subject: [PATCH 047/128] chore(deps): update rust crate itertools to 0.12.1
(#377)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [itertools](https://togithub.com/rust-itertools/itertools) |
workspace.dependencies | patch | `0.12.0` -> `0.12.1` |
---
### Release Notes
rust-itertools/itertools (itertools)
###
[`v0.12.1`](https://togithub.com/rust-itertools/itertools/blob/HEAD/CHANGELOG.md#0121)
[Compare
Source](https://togithub.com/rust-itertools/itertools/compare/v0.12.0...v0.12.1)
##### Added
- Documented iteration order guarantee for
`Itertools::[tuple_]combinations`
([#822](https://togithub.com/rust-itertools/itertools/issues/822))
- Documented possible panic in `iterate`
([#842](https://togithub.com/rust-itertools/itertools/issues/842))
- Implemented `Clone` and `Debug` for `Diff`
([#845](https://togithub.com/rust-itertools/itertools/issues/845))
- Implemented `Debug` for `WithPosition`
([#859](https://togithub.com/rust-itertools/itertools/issues/859))
- Implemented `Eq` for `MinMaxResult`
([#838](https://togithub.com/rust-itertools/itertools/issues/838))
- Implemented `From>` for `Option>`
([#843](https://togithub.com/rust-itertools/itertools/issues/843))
- Implemented `PeekingNext` for `RepeatN`
([#855](https://togithub.com/rust-itertools/itertools/issues/855))
##### Changed
- Made `CoalesceBy` lazy
([#801](https://togithub.com/rust-itertools/itertools/issues/801))
- Optimized `Filter[Map]Ok::next`, `Itertools::partition`,
`Unique[By]::next[_back]`
([#818](https://togithub.com/rust-itertools/itertools/issues/818))
- Optimized `Itertools::find_position`
([#837](https://togithub.com/rust-itertools/itertools/issues/837))
- Optimized `Positions::next[_back]`
([#816](https://togithub.com/rust-itertools/itertools/issues/816))
- Optimized `ZipLongest::fold`
([#854](https://togithub.com/rust-itertools/itertools/issues/854))
- Relaxed `Debug` bounds for `GroupingMapBy`
([#860](https://togithub.com/rust-itertools/itertools/issues/860))
- Specialized `ExactlyOneError::fold`
([#826](https://togithub.com/rust-itertools/itertools/issues/826))
- Specialized `Interleave[Shortest]::fold`
([#849](https://togithub.com/rust-itertools/itertools/issues/849))
- Specialized `MultiPeek::fold`
([#820](https://togithub.com/rust-itertools/itertools/issues/820))
- Specialized `PadUsing::[r]fold`
([#825](https://togithub.com/rust-itertools/itertools/issues/825))
- Specialized `PeekNth::fold`
([#824](https://togithub.com/rust-itertools/itertools/issues/824))
- Specialized `Positions::[r]fold`
([#813](https://togithub.com/rust-itertools/itertools/issues/813))
- Specialized `PutBackN::fold`
([#823](https://togithub.com/rust-itertools/itertools/issues/823))
- Specialized `RepeatN::[r]fold`
([#821](https://togithub.com/rust-itertools/itertools/issues/821))
- Specialized `TakeWhileInclusive::fold`
([#851](https://togithub.com/rust-itertools/itertools/issues/851))
- Specialized `ZipLongest::rfold`
([#848](https://togithub.com/rust-itertools/itertools/issues/848))
##### Notable Internal Changes
- Added test coverage in CI
([#847](https://togithub.com/rust-itertools/itertools/issues/847),
[#856](https://togithub.com/rust-itertools/itertools/issues/856))
- Added semver check in CI
([#784](https://togithub.com/rust-itertools/itertools/issues/784))
- Enforced `clippy` in CI
([#740](https://togithub.com/rust-itertools/itertools/issues/740))
- Enforced `rustdoc` in CI
([#840](https://togithub.com/rust-itertools/itertools/issues/840))
- Improved specialization tests
([#807](https://togithub.com/rust-itertools/itertools/issues/807))
- More specialization benchmarks
([#806](https://togithub.com/rust-itertools/itertools/issues/806))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 6 +++---
Cargo.toml | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 936fd6a..5970692 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2214,9 +2214,9 @@ dependencies = [
[[package]]
name = "itertools"
-version = "0.12.0"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
@@ -4932,7 +4932,7 @@ dependencies = [
"client",
"ethers",
"futures",
- "itertools 0.12.0",
+ "itertools 0.12.1",
"sqlx",
"storage",
"thiserror",
diff --git a/Cargo.toml b/Cargo.toml
index e78d35e..0ef5693 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -36,7 +36,7 @@ tracing = "0.1"
tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
-itertools = "0.12.0"
+itertools = "0.12.1"
serde = "1.0.196"
thiserror = "1.0.56"
serde_json = "1.0"
From b0628f17a29f954065f1cae4a632f82bc1f2262d Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Tue, 30 Jan 2024 21:51:21 +0100
Subject: [PATCH 048/128] fix(storage): return withdrawals for address for l1
and l2 addrs matches (#378)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
> When address A makes withdrawal to address B, api will only show that
withdrawal on address B. While we want to show it for both A and B.
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
...c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json} | 4 ++--
storage/src/lib.rs | 5 ++++-
2 files changed, 6 insertions(+), 3 deletions(-)
rename storage/.sqlx/{query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json => query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json} (78%)
diff --git a/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json b/storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json
similarity index 78%
rename from storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
rename to storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json
index 3f80961..12fc497 100644
--- a/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
+++ b/storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n l2_to_l1_events.l1_token_addr,\n l2_to_l1_events.amount,\n withdrawals.tx_hash,\n finalization_data.finalization_tx\n FROM\n l2_to_l1_events\n JOIN finalization_data ON\n finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number\n AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block\n JOIN withdrawals ON\n withdrawals.id = finalization_data.withdrawal_id\n WHERE l2_to_l1_events.to_address = $1\n ORDER BY l2_to_l1_events.l2_block_number DESC\n LIMIT $2\n ",
+ "query": "\n SELECT\n l2_to_l1_events.l1_token_addr,\n l2_to_l1_events.amount,\n withdrawals.tx_hash,\n finalization_data.finalization_tx\n FROM\n l2_to_l1_events\n JOIN finalization_data ON\n finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number\n AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block\n JOIN withdrawals ON\n withdrawals.id = finalization_data.withdrawal_id\n WHERE\n l2_to_l1_events.to_address = $1\n OR\n finalization_data.sender = $1\n ORDER BY l2_to_l1_events.l2_block_number DESC\n LIMIT $2\n ",
"describe": {
"columns": [
{
@@ -37,5 +37,5 @@
true
]
},
- "hash": "1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a"
+ "hash": "2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c"
}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index 4f09c8e..48c8e16 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -1403,7 +1403,10 @@ pub async fn withdrawals_for_address(
AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block
JOIN withdrawals ON
withdrawals.id = finalization_data.withdrawal_id
- WHERE l2_to_l1_events.to_address = $1
+ WHERE
+ l2_to_l1_events.to_address = $1
+ OR
+ finalization_data.sender = $1
ORDER BY l2_to_l1_events.l2_block_number DESC
LIMIT $2
",
From 43a8a15ab9d70d478f1203739279279e716272d7 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Tue, 30 Jan 2024 21:56:57 +0100
Subject: [PATCH 049/128] chore(main): release 0.6.3 (#379)
:robot: I have created a release *beep* *boop*
---
##
[0.6.3](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.2...v0.6.3)
(2024-01-30)
### Bug Fixes
* **storage:** return withdrawals for address for l1 and l2 addrs
matches
([#378](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/378))
([b0628f1](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/b0628f17a29f954065f1cae4a632f82bc1f2262d))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index bf5f1fb..7e23a4f 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.6.2"
+ ".": "0.6.3"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f7c18a0..8aa9c82 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [0.6.3](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.2...v0.6.3) (2024-01-30)
+
+
+### Bug Fixes
+
+* **storage:** return withdrawals for address for l1 and l2 addrs matches ([#378](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/378)) ([b0628f1](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/b0628f17a29f954065f1cae4a632f82bc1f2262d))
+
## [0.6.2](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.1...v0.6.2) (2024-01-19)
From b98d4d31c6898af9f708f1f1de1588ca7d1eadad Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 31 Jan 2024 11:16:42 +0100
Subject: [PATCH 050/128] chore(deps): update rust crate ethers to 2.0.13
(#380)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [ethers](https://togithub.com/gakonst/ethers-rs) |
workspace.dependencies | patch | `2.0.11` -> `2.0.13` |
---
### Release Notes
gakonst/ethers-rs (ethers)
###
[`v2.0.13`](https://togithub.com/gakonst/ethers-rs/blob/HEAD/CHANGELOG.md#2013---2024-01-30)
[Compare
Source](https://togithub.com/gakonst/ethers-rs/compare/ethers-v2.0.11...ethers-v2.0.13)
##### Bug Fixes
- Update api url
([#2693](https://togithub.com/gakonst/ethers-rs/issues/2693))
- Better file name to ident conversion
([#2688](https://togithub.com/gakonst/ethers-rs/issues/2688))
- Missing `AbiEncode` implem for tuples of length 16
([#2685](https://togithub.com/gakonst/ethers-rs/issues/2685))
- Allow missing base fee and reward vecs
([#2683](https://togithub.com/gakonst/ethers-rs/issues/2683))
- Metis is no 1559
([#2680](https://togithub.com/gakonst/ethers-rs/issues/2680))
- Normalize signature S
([#2679](https://togithub.com/gakonst/ethers-rs/issues/2679))
##### Depedencies
- Update coins-ledger requirement from 0.8.3 to 0.9.0
([#2687](https://togithub.com/gakonst/ethers-rs/issues/2687))
##### Features
- Add Base Sepolia as a chain
([#2708](https://togithub.com/gakonst/ethers-rs/issues/2708))
- Add viction
([#2710](https://togithub.com/gakonst/ethers-rs/issues/2710))
- Add support for Arbitrum Sepolia
([#2705](https://togithub.com/gakonst/ethers-rs/issues/2705))
##### Other
- Accept 'input' or 'data', (but not both), in transaction request
([#2697](https://togithub.com/gakonst/ethers-rs/issues/2697))
- Rename field camelCase
([#2682](https://togithub.com/gakonst/ethers-rs/issues/2682))
##### Styling
- Add Scroll Sepolia and update Scroll and Scroll Alpha Testnets
([#2692](https://togithub.com/gakonst/ethers-rs/issues/2692))
- Rustfmt
([#2681](https://togithub.com/gakonst/ethers-rs/issues/2681))
##### Testing
- Saner tx list params
([#2689](https://togithub.com/gakonst/ethers-rs/issues/2689))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 44 ++++++++++++++++++++++----------------------
Cargo.toml | 2 +-
2 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 5970692..d549a5f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1221,9 +1221,9 @@ dependencies = [
[[package]]
name = "ethers"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a5344eea9b20effb5efeaad29418215c4d27017639fd1f908260f59cbbd226e"
+checksum = "6c7cd562832e2ff584fa844cd2f6e5d4f35bbe11b28c7c9b8df957b2e1d0c701"
dependencies = [
"ethers-addressbook",
"ethers-contract",
@@ -1237,9 +1237,9 @@ dependencies = [
[[package]]
name = "ethers-addressbook"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09"
+checksum = "35dc9a249c066d17e8947ff52a4116406163cf92c7f0763cb8c001760b26403f"
dependencies = [
"ethers-core",
"once_cell",
@@ -1249,9 +1249,9 @@ dependencies = [
[[package]]
name = "ethers-contract"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd"
+checksum = "43304317c7f776876e47f2f637859f6d0701c1ec7930a150f169d5fbe7d76f5a"
dependencies = [
"const-hex",
"ethers-contract-abigen",
@@ -1268,9 +1268,9 @@ dependencies = [
[[package]]
name = "ethers-contract-abigen"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb"
+checksum = "f9f96502317bf34f6d71a3e3d270defaa9485d754d789e15a8e04a84161c95eb"
dependencies = [
"Inflector",
"const-hex",
@@ -1292,9 +1292,9 @@ dependencies = [
[[package]]
name = "ethers-contract-derive"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483"
+checksum = "452ff6b0a64507ce8d67ffd48b1da3b42f03680dcf5382244e9c93822cbbf5de"
dependencies = [
"Inflector",
"const-hex",
@@ -1308,9 +1308,9 @@ dependencies = [
[[package]]
name = "ethers-core"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d"
+checksum = "aab3cef6cc1c9fd7f787043c81ad3052eff2b96a3878ef1526aa446311bdbfc9"
dependencies = [
"arrayvec",
"bytes",
@@ -1338,9 +1338,9 @@ dependencies = [
[[package]]
name = "ethers-etherscan"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56"
+checksum = "16d45b981f5fa769e1d0343ebc2a44cfa88c9bc312eb681b676318b40cef6fb1"
dependencies = [
"chrono",
"ethers-core",
@@ -1364,9 +1364,9 @@ dependencies = [
[[package]]
name = "ethers-middleware"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93"
+checksum = "145211f34342487ef83a597c1e69f0d3e01512217a7c72cc8a25931854c7dca0"
dependencies = [
"async-trait",
"auto_impl",
@@ -1390,9 +1390,9 @@ dependencies = [
[[package]]
name = "ethers-providers"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816"
+checksum = "fb6b15393996e3b8a78ef1332d6483c11d839042c17be58decc92fa8b1c3508a"
dependencies = [
"async-trait",
"auto_impl",
@@ -1428,9 +1428,9 @@ dependencies = [
[[package]]
name = "ethers-signers"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532"
+checksum = "b3b125a103b56aef008af5d5fb48191984aa326b50bfd2557d231dc499833de3"
dependencies = [
"async-trait",
"coins-bip32",
@@ -1447,9 +1447,9 @@ dependencies = [
[[package]]
name = "ethers-solc"
-version = "2.0.11"
+version = "2.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f"
+checksum = "d21df08582e0a43005018a858cc9b465c5fff9cf4056651be64f844e57d1f55f"
dependencies = [
"cfg-if",
"const-hex",
diff --git a/Cargo.toml b/Cargo.toml
index 0ef5693..7b193b8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,7 +29,7 @@ exclude = ["./github"]
[workspace.dependencies]
auto_impl = "1.1.2"
async-trait = "0.1.77"
-ethers = { version = "2.0.11", default-features = false }
+ethers = { version = "2.0.13", default-features = false }
tokio = "1.35.1"
clap = "4.4.18"
tracing = "0.1"
From df24985dcf5a304cd35830a0f418569503be1797 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 4 Feb 2024 10:50:49 +0100
Subject: [PATCH 051/128] chore(deps): update rust crate tokio to 1.36.0 (#382)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [tokio](https://tokio.rs)
([source](https://togithub.com/tokio-rs/tokio)) | workspace.dependencies
| minor | `1.35.1` -> `1.36.0` |
---
### Release Notes
tokio-rs/tokio (tokio)
###
[`v1.36.0`](https://togithub.com/tokio-rs/tokio/releases/tag/tokio-1.36.0):
Tokio v1.36.0
[Compare
Source](https://togithub.com/tokio-rs/tokio/compare/tokio-1.35.1...tokio-1.36.0)
##### 1.36.0 (February 2nd, 2024)
##### Added
- io: add `tokio::io::Join` ([#6220])
- io: implement `AsyncWrite` for `Empty` ([#6235])
- net: add support for anonymous unix pipes ([#6127])
- net: add `UnixSocket` ([#6290])
- net: expose keepalive option on `TcpSocket` ([#6311])
- sync: add `{Receiver,UnboundedReceiver}::poll_recv_many`
([#6236])
- sync: add `Sender::{try_,}reserve_many` ([#6205])
- sync: add `watch::Receiver::mark_unchanged` ([#6252])
- task: add `JoinSet::try_join_next` ([#6280])
- time: add `FutureExt::timeout` ([#6276])
##### Changed
- io: make `copy` cooperative ([#6265])
- io: make `repeat` and `sink` cooperative ([#6254])
- io: simplify check for empty slice ([#6293])
- rt: improve robustness of `wake_in_drop_after_panic` test
([#6238])
- process: use pidfd on Linux when available ([#6152])
- sync: use AtomicBool in broadcast channel future ([#6298])
##### Fixed
- chore: typographic improvements ([#6262])
- runtime: remove obsolete comment ([#6303])
- task: fix typo ([#6261])
##### Documented
- io: clarify `clear_ready` docs ([#6304])
- net: document that `*Fd` traits on `TcpSocket` are unix-only
([#6294])
- sync: document FIFO behavior of `tokio::sync::Mutex` ([#6279])
[#6220]: https://togithub.com/tokio-rs/tokio/pull/6220
[#6235]: https://togithub.com/tokio-rs/tokio/pull/6235
[#6127]: https://togithub.com/tokio-rs/tokio/pull/6127
[#6290]: https://togithub.com/tokio-rs/tokio/pull/6290
[#6311]: https://togithub.com/tokio-rs/tokio/pull/6311
[#6236]: https://togithub.com/tokio-rs/tokio/pull/6236
[#6205]: https://togithub.com/tokio-rs/tokio/pull/6205
[#6252]: https://togithub.com/tokio-rs/tokio/pull/6252
[#6280]: https://togithub.com/tokio-rs/tokio/pull/6280
[#6276]: https://togithub.com/tokio-rs/tokio/pull/6276
[#6265]: https://togithub.com/tokio-rs/tokio/pull/6265
[#6254]: https://togithub.com/tokio-rs/tokio/pull/6254
[#6293]: https://togithub.com/tokio-rs/tokio/pull/6293
[#6238]: https://togithub.com/tokio-rs/tokio/pull/6238
[#6152]: https://togithub.com/tokio-rs/tokio/pull/6152
[#6298]: https://togithub.com/tokio-rs/tokio/pull/6298
[#6262]: https://togithub.com/tokio-rs/tokio/pull/6262
[#6303]: https://togithub.com/tokio-rs/tokio/pull/6303
[#6261]: https://togithub.com/tokio-rs/tokio/pull/6261
[#6304]: https://togithub.com/tokio-rs/tokio/pull/6304
[#6294]: https://togithub.com/tokio-rs/tokio/pull/6294
[#6279]: https://togithub.com/tokio-rs/tokio/pull/6279
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index d549a5f..74343bb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4332,9 +4332,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.35.1"
+version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [
"backtrace",
"bytes",
diff --git a/Cargo.toml b/Cargo.toml
index 7b193b8..f37ec72 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -30,7 +30,7 @@ exclude = ["./github"]
auto_impl = "1.1.2"
async-trait = "0.1.77"
ethers = { version = "2.0.13", default-features = false }
-tokio = "1.35.1"
+tokio = "1.36.0"
clap = "4.4.18"
tracing = "0.1"
tracing-subscriber = "0.3"
From 5d70fff184a362814c46361ce60df04d5f4429b1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 4 Feb 2024 11:21:52 +0100
Subject: [PATCH 052/128] chore(deps): update rust crate eyre to 0.6.12 (#381)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [eyre](https://togithub.com/eyre-rs/eyre) | workspace.dependencies |
patch | `0.6.11` -> `0.6.12` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 74343bb..34dbc4c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1485,9 +1485,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "eyre"
-version = "0.6.11"
+version = "0.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799"
+checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
dependencies = [
"indenter",
"once_cell",
diff --git a/Cargo.toml b/Cargo.toml
index f37ec72..f2e15ed 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -41,7 +41,7 @@ serde = "1.0.196"
thiserror = "1.0.56"
serde_json = "1.0"
color-eyre = "0.6.2"
-eyre = "0.6.11"
+eyre = "0.6.12"
dotenvy = "0.15.7"
envconfig = "0.10.0"
proc-macro2 = "1.0.78"
From 16a4159806f8001d65d1dbbbc6312124a660b49d Mon Sep 17 00:00:00 2001
From: omahs <73983677+omahs@users.noreply.github.com>
Date: Mon, 5 Feb 2024 09:54:00 +0100
Subject: [PATCH 053/128] fix: typos (#383)
fix: typos
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 3b25028..e9c98ca 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ A Withdrawal Finalizer in Rust.
## Purpose
-Withdrawal Finalizer is a component of `zksync-era` responsible for monitoring and finalizing [L2->L1 withdrawals](https://github.com/matter-labs/zksync-era/blob/main/docs/advanced/03_withdrawals.md). It does so by continiously monitoring events happening on both L2 and L1, keeping some state in persistent storage (which is PostgreSQL) and sending withdrawal finalization transactions whenever necessary.
+Withdrawal Finalizer is a component of `zksync-era` responsible for monitoring and finalizing [L2->L1 withdrawals](https://github.com/matter-labs/zksync-era/blob/main/docs/advanced/03_withdrawals.md). It does so by continuously monitoring events happening on both L2 and L1, keeping some state in persistent storage (which is PostgreSQL) and sending withdrawal finalization transactions whenever necessary.
## Building
@@ -33,7 +33,7 @@ $ env DATABASE_URL=postgres://mycreds@myhost/mydb sqlx migrate run
```
### Configuration
-Configuration is done via enviromnent variables that can also be read from `.env` file if it is present.
+Configuration is done via environment variables that can also be read from `.env` file if it is present.
Deployment is done by deploying a dockerized image of the service.
| Variable | Description |
@@ -48,7 +48,7 @@ Deployment is done by deploying a dockerized image of the service.
| `API_WEB3_JSON_RPC_HTTP_URL` | Address of the zkSync Era HTTP RPC endpoint |
| `DATABSE_URL` | The url of PostgreSQL database the service stores its state into |
| `GAS_LIMIT` | The gas limit of a single withdrawal finalization within the batch of withdrawals finalized in a call to `finalizeWithdrawals` in WithdrawalFinalizerContract |
-| `BATCH_FINALIZATION_GAS_LIMIT` | The gas limit of the finalizastion of the whole batch in a call to `finalizeWithdrawals` in Withdrawal Finalizer Contract |
+| `BATCH_FINALIZATION_GAS_LIMIT` | The gas limit of the finalization of the whole batch in a call to `finalizeWithdrawals` in Withdrawal Finalizer Contract |
| `WITHDRAWAL_FINALIZER_ACCOUNT_PRIVATE_KEY` | The private key of the account that is going to be submit finalization transactions |
| `TX_RETRY_TIMEOUT_SECS` | Number of seconds to wait for a potentially stuck finalization transaction before readjusting its fees |
| `TOKENS_TO_FINALIZE` | Configures the sets of tokens this instance of finalizer will finalize. It may be configured as a whitelist, a blacklist, a wildcard or completely disable any finalization. For more info see below. |
@@ -66,7 +66,7 @@ The configuration structure describing the service config can be found in [`conf
It may be handy to limit a set of tokens the Finalizer is finalizing. This
configuration may be specified by setting a rule in the `TOKENS_TO_FINALIZE` value.
-If this enviromnent variable is not set then by default Finalizer will only finalize
+If this environment variable is not set then by default Finalizer will only finalize
ETH token (`0x000...0800a`).
You may specify `All`, `None`, `BlackList` or `WhiteList` as json documents:
From a8717c3c5bc7df4495e5edc2aa2521be2ab39373 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 9 Feb 2024 10:57:27 +0100
Subject: [PATCH 054/128] chore(deps): update rust docker tag to v1.76 (#386)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| rust | stage | minor | `1.75` -> `1.76` |
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 0723c8e..9165fb8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM rust:1.75 AS builder
+FROM rust:1.76 AS builder
WORKDIR /app
From c2054bd1fa2022b36079c9758598a894c8c76dba Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 9 Feb 2024 11:04:52 +0100
Subject: [PATCH 055/128] chore(deps): update rust crate clap to 4.5.0 (#385)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [clap](https://togithub.com/clap-rs/clap) | workspace.dependencies |
minor | `4.4.18` -> `4.5.0` |
---
### Release Notes
clap-rs/clap (clap)
###
[`v4.5.0`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#450---2024-02-08)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.4.18...v4.5.0)
##### Compatibility
- Update MSRV to 1.74
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 20 ++++++++++----------
Cargo.toml | 2 +-
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 34dbc4c..12eb17b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -556,9 +556,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.4.18"
+version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
+checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f"
dependencies = [
"clap_builder",
"clap_derive",
@@ -566,9 +566,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.4.18"
+version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
+checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99"
dependencies = [
"anstream",
"anstyle",
@@ -578,9 +578,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.4.7"
+version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47"
dependencies = [
"heck",
"proc-macro2",
@@ -590,9 +590,9 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.6.0"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
[[package]]
name = "client"
@@ -4138,9 +4138,9 @@ dependencies = [
[[package]]
name = "strsim"
-version = "0.10.0"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
[[package]]
name = "strum"
diff --git a/Cargo.toml b/Cargo.toml
index f2e15ed..f35f6e6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -31,7 +31,7 @@ auto_impl = "1.1.2"
async-trait = "0.1.77"
ethers = { version = "2.0.13", default-features = false }
tokio = "1.36.0"
-clap = "4.4.18"
+clap = "4.5.0"
tracing = "0.1"
tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
From a68ea5611aa4e2d7f81c503b4335d6633a40f30b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 11 Feb 2024 19:32:35 +0100
Subject: [PATCH 056/128] chore(deps): update rust crate chrono to 0.4.34
(#387)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [chrono](https://togithub.com/chronotope/chrono) |
workspace.dependencies | patch | `0.4.33` -> `0.4.34` |
---
### Release Notes
chronotope/chrono (chrono)
###
[`v0.4.34`](https://togithub.com/chronotope/chrono/releases/tag/v0.4.34):
0.4.34
[Compare
Source](https://togithub.com/chronotope/chrono/compare/v0.4.33...v0.4.34)
### Notable changes
- In chrono 0.4.34 we finished the work to make all methods const where
doing so is supported by rust 1.61.
- We renamed the `Duration` type to `TimeDelta`. This removes the
confusion between chrono's type and the later `Duration` type in the
standard library. It will remain available under the old name as a type
alias for compatibility.
- The Windows implementation of `Local` is rewritten. The new version
avoids panics when the date is outside of the range supported by windows
(the years 1601 to 30828), and gives more accurate results during DST
transitions.
- The `Display` format of `TimeDelta` is modified to conform better to
ISO 8601. Previously it converted all values greater than 24 hours to a
value with days. This is not correct, as doing so changes the duration
from an 'accurate' to a 'nominal' representation to use ISO 8601 terms.
### Fixes
- Add missing range check in `TimeDelta::milliseconds`
([#1385](https://togithub.com/chronotope/chrono/issues/1385),
thanks [@danwilliams](https://togithub.com/danwilliams))
- Remove check for `DurationExceedsTimestamp` in `DurationRound`
([#1403](https://togithub.com/chronotope/chrono/issues/1403),
thanks [@joroKr21](https://togithub.com/joroKr21))
- Fix localized formatting with `%X`
(([https://github.com/chronotope/pure-rust-locales/pull/12](https://togithub.com/chronotope/pure-rust-locales/pull/12),
[#1420](https://togithub.com/chronotope/chrono/issues/1420))
- Windows: base implementation on `GetTimeZoneInformationForYear`
([#1017](https://togithub.com/chronotope/chrono/issues/1017))
### Additions
- Add `TimeDelta::try_milliseconds`
([#1385](https://togithub.com/chronotope/chrono/issues/1385),
thanks [@danwilliams](https://togithub.com/danwilliams))
- Add `TimeDelta::new`
([#1337](https://togithub.com/chronotope/chrono/issues/1337))
- Add `StrftimeItems::{parse, parse_to_owned}` and more documentation
([#1184](https://togithub.com/chronotope/chrono/issues/1184))
- More standard traits and documentation for `format::Locale` (via
[https://github.com/chronotope/pure-rust-locales/pull/8](https://togithub.com/chronotope/pure-rust-locales/pull/8))
### Changes
- Rename `Duration` to `TimeDelta`, add type alias
([#1406](https://togithub.com/chronotope/chrono/issues/1406))
- Make `TimeDelta` methods const
([#1337](https://togithub.com/chronotope/chrono/issues/1337))
- Make remaining methods of `NaiveDate`, `NaiveWeek`, `NaiveTime` and
`NaiveDateTime` const where possible
([#1337](https://togithub.com/chronotope/chrono/issues/1337))
- Make methods on `DateTime` const where possible
([#1400](https://togithub.com/chronotope/chrono/issues/1400))
- Make `Display` format of `TimeDelta` conform better to ISO 8601
([#1328](https://togithub.com/chronotope/chrono/issues/1328))
### Documentation
- Fix the formatting of `timestamp_micros`'s Example doc
([#1338](https://togithub.com/chronotope/chrono/issues/1338) via
[#1386](https://togithub.com/chronotope/chrono/issues/1386),
thanks [@emikitas](https://togithub.com/emikitas))
- Specify branch for GitHub Actions badge and fix link
([#1388](https://togithub.com/chronotope/chrono/issues/1388))
- Don't mention some deprecated methods in docs
([#1395](https://togithub.com/chronotope/chrono/issues/1395))
- Remove stray documentation from main
([#1397](https://togithub.com/chronotope/chrono/issues/1397))
- Improved documentation of `TimeDelta` constructors
([#1385](https://togithub.com/chronotope/chrono/issues/1385),
thanks [@danwilliams](https://togithub.com/danwilliams))
### Internal
- Switch branch names: 0.4.x releases are the `main` branch, work on 0.5
happens in the `0.5.x` branch
([#1390](https://togithub.com/chronotope/chrono/issues/1390),
[#1402](https://togithub.com/chronotope/chrono/issues/1402)).
- Don't use deprecated method in `impl Arbitrary for DateTime` and set
up CI test
([#1336](https://togithub.com/chronotope/chrono/issues/1336))
- Remove workaround for Rust < 1.61
([#1393](https://togithub.com/chronotope/chrono/issues/1393))
- Bump `codecov/codecov-action` from 3 to 4
([#1404](https://togithub.com/chronotope/chrono/issues/1404))
- Remove partial support for handling `-0000` offset
([#1411](https://togithub.com/chronotope/chrono/issues/1411))
- Move `TOO_LONG` error out of `parse_internal`
([#1419](https://togithub.com/chronotope/chrono/issues/1419))
Thanks to all contributors on behalf of the chrono team,
[@djc](https://togithub.com/djc) and
[@pitdicker](https://togithub.com/pitdicker)!
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 12eb17b..1afdb87 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -533,9 +533,9 @@ dependencies = [
[[package]]
name = "chrono"
-version = "0.4.33"
+version = "0.4.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
+checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"
dependencies = [
"android-tzdata",
"iana-time-zone",
diff --git a/Cargo.toml b/Cargo.toml
index f35f6e6..0b76716 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -53,7 +53,7 @@ syn = "2.0.48"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
-chrono = { version = "0.4.33", default-features = false }
+chrono = { version = "0.4.34", default-features = false }
vise = { git = "https://github.com/matter-labs/vise.git" }
vise-exporter = { git = "https://github.com/matter-labs/vise.git" }
client = { path = "./client" }
From 9470988b530f90ec061de83f2e45ed3ab3df0296 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Mon, 12 Feb 2024 18:36:48 +0100
Subject: [PATCH 057/128] chore(main): release 0.6.4 (#384)
:robot: I have created a release *beep* *boop*
---
##
[0.6.4](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.3...v0.6.4)
(2024-02-11)
### Bug Fixes
* typos
([16a4159](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/16a4159806f8001d65d1dbbbc6312124a660b49d))
* typos
([#383](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/383))
([16a4159](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/16a4159806f8001d65d1dbbbc6312124a660b49d))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index 7e23a4f..eb5abf7 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.6.3"
+ ".": "0.6.4"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8aa9c82..c5a5deb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## [0.6.4](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.3...v0.6.4) (2024-02-11)
+
+
+### Bug Fixes
+
+* typos ([16a4159](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/16a4159806f8001d65d1dbbbc6312124a660b49d))
+* typos ([#383](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/383)) ([16a4159](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/16a4159806f8001d65d1dbbbc6312124a660b49d))
+
## [0.6.3](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.2...v0.6.3) (2024-01-30)
From cb414b01392e9966e6a1a217b95a359af0f125f1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 12 Feb 2024 20:03:56 +0100
Subject: [PATCH 058/128] chore(deps): update rust crate thiserror to 1.0.57
(#388)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [thiserror](https://togithub.com/dtolnay/thiserror) |
workspace.dependencies | patch | `1.0.56` -> `1.0.57` |
---
### Release Notes
dtolnay/thiserror (thiserror)
###
[`v1.0.57`](https://togithub.com/dtolnay/thiserror/releases/tag/1.0.57)
[Compare
Source](https://togithub.com/dtolnay/thiserror/compare/1.0.56...1.0.57)
- Generate more efficient `Display` impl for error message which do not
contain any interpolated value
([#286](https://togithub.com/dtolnay/thiserror/issues/286),
thanks [@nyurik](https://togithub.com/nyurik))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 1afdb87..1111c5f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4250,18 +4250,18 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.56"
+version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.56"
+version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 0b76716..5946e9d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -38,7 +38,7 @@ sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
itertools = "0.12.1"
serde = "1.0.196"
-thiserror = "1.0.56"
+thiserror = "1.0.57"
serde_json = "1.0"
color-eyre = "0.6.2"
eyre = "0.6.12"
From fd1d765a44c97f5e4b5ae446f68fd98731bcde64 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 21 Feb 2024 09:45:29 +0100
Subject: [PATCH 059/128] chore(deps): update rust crate serde to 1.0.197
(#391)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [serde](https://serde.rs)
([source](https://togithub.com/serde-rs/serde)) | workspace.dependencies
| patch | `1.0.196` -> `1.0.197` |
---
### Release Notes
serde-rs/serde (serde)
###
[`v1.0.197`](https://togithub.com/serde-rs/serde/releases/tag/v1.0.197)
[Compare
Source](https://togithub.com/serde-rs/serde/compare/v1.0.196...v1.0.197)
- Fix unused_imports warnings when compiled by rustc 1.78
- Optimize code size of some Display impls
([#2697](https://togithub.com/serde-rs/serde/issues/2697), thanks
[@nyurik](https://togithub.com/nyurik))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 1111c5f..d94156a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3629,9 +3629,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.196"
+version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
dependencies = [
"serde_derive",
]
@@ -3649,9 +3649,9 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.196"
+version = "1.0.197"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 5946e9d..ff7158c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,7 +37,7 @@ tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
lazy_static = "1.4.0"
itertools = "0.12.1"
-serde = "1.0.196"
+serde = "1.0.197"
thiserror = "1.0.57"
serde_json = "1.0"
color-eyre = "0.6.2"
From 4367cfc983c8f7ad5142389f6b75ba88b2498bfc Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 21 Feb 2024 10:06:06 +0100
Subject: [PATCH 060/128] chore(deps): update rust crate clap to 4.5.1 (#390)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [clap](https://togithub.com/clap-rs/clap) | workspace.dependencies |
patch | `4.5.0` -> `4.5.1` |
---
### Release Notes
clap-rs/clap (clap)
###
[`v4.5.1`](https://togithub.com/clap-rs/clap/blob/HEAD/CHANGELOG.md#451---2024-02-16)
[Compare
Source](https://togithub.com/clap-rs/clap/compare/v4.5.0...v4.5.1)
##### Fixes
- *(error)* Include suggestion to add `--` even if there is a "did you
mean" so long as `last` or `trailing_var_arg` is used
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 8 ++++----
Cargo.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index d94156a..2288b63 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -556,9 +556,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.0"
+version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f"
+checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da"
dependencies = [
"clap_builder",
"clap_derive",
@@ -566,9 +566,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.0"
+version = "4.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99"
+checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb"
dependencies = [
"anstream",
"anstyle",
diff --git a/Cargo.toml b/Cargo.toml
index ff7158c..0059cfe 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -31,7 +31,7 @@ auto_impl = "1.1.2"
async-trait = "0.1.77"
ethers = { version = "2.0.13", default-features = false }
tokio = "1.36.0"
-clap = "4.5.0"
+clap = "4.5.1"
tracing = "0.1"
tracing-subscriber = "0.3"
sentry = { version = "0", default-features = false }
From a7a5918f7edcc8f762a25db4c2e968e120e0c9c2 Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Wed, 21 Feb 2024 10:24:55 +0100
Subject: [PATCH 061/128] fix(storage): add necessary indices for api query
(#392)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
# What ❔
Adds indices for api-related query.
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
storage/migrations/20240221084958_add-api-indices.down.sql | 2 ++
storage/migrations/20240221084958_add-api-indices.up.sql | 2 ++
2 files changed, 4 insertions(+)
create mode 100644 storage/migrations/20240221084958_add-api-indices.down.sql
create mode 100644 storage/migrations/20240221084958_add-api-indices.up.sql
diff --git a/storage/migrations/20240221084958_add-api-indices.down.sql b/storage/migrations/20240221084958_add-api-indices.down.sql
new file mode 100644
index 0000000..7bd6130
--- /dev/null
+++ b/storage/migrations/20240221084958_add-api-indices.down.sql
@@ -0,0 +1,2 @@
+DROP INDEX IF EXISTS ix_l2_to_l1_events_to_addres_l2_block_number;
+DROP INDEX IF EXISTS ix_finalization_data_l1_batch_number_l2_tx_number_in_block;
diff --git a/storage/migrations/20240221084958_add-api-indices.up.sql b/storage/migrations/20240221084958_add-api-indices.up.sql
new file mode 100644
index 0000000..a1076b4
--- /dev/null
+++ b/storage/migrations/20240221084958_add-api-indices.up.sql
@@ -0,0 +1,2 @@
+CREATE INDEX IF NOT EXISTS ix_l2_to_l1_events_to_addres_l2_block_number ON l2_to_l1_events (to_address,l2_block_number);
+CREATE INDEX IF NOT EXISTS ix_finalization_data_l1_batch_number_l2_tx_number_in_block on finalization_data (l1_batch_number,l2_tx_number_in_block);
From 6d7e7a402dc7deffba18fcfd74b50000cc995587 Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Wed, 21 Feb 2024 11:37:52 +0100
Subject: [PATCH 062/128] fix(storage): remove filtering by l2 addrs (#394)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit b0628f17a29f954065f1cae4a632f82bc1f2262d.
# What ❔
## Why ❔
## Checklist
- [ ] PR title corresponds to the body of PR (we generate changelog
entries from PRs).
- [ ] Tests for the changes have been added / updated.
- [ ] Documentation comments have been added / updated.
- [ ] Code has been formatted via `cargo fmt`.
---
...493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json} | 4 ++--
storage/src/lib.rs | 5 +----
2 files changed, 3 insertions(+), 6 deletions(-)
rename storage/.sqlx/{query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json => query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json} (78%)
diff --git a/storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json b/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
similarity index 78%
rename from storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json
rename to storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
index 12fc497..3f80961 100644
--- a/storage/.sqlx/query-2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c.json
+++ b/storage/.sqlx/query-1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "\n SELECT\n l2_to_l1_events.l1_token_addr,\n l2_to_l1_events.amount,\n withdrawals.tx_hash,\n finalization_data.finalization_tx\n FROM\n l2_to_l1_events\n JOIN finalization_data ON\n finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number\n AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block\n JOIN withdrawals ON\n withdrawals.id = finalization_data.withdrawal_id\n WHERE\n l2_to_l1_events.to_address = $1\n OR\n finalization_data.sender = $1\n ORDER BY l2_to_l1_events.l2_block_number DESC\n LIMIT $2\n ",
+ "query": "\n SELECT\n l2_to_l1_events.l1_token_addr,\n l2_to_l1_events.amount,\n withdrawals.tx_hash,\n finalization_data.finalization_tx\n FROM\n l2_to_l1_events\n JOIN finalization_data ON\n finalization_data.l1_batch_number = l2_to_l1_events.l2_block_number\n AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block\n JOIN withdrawals ON\n withdrawals.id = finalization_data.withdrawal_id\n WHERE l2_to_l1_events.to_address = $1\n ORDER BY l2_to_l1_events.l2_block_number DESC\n LIMIT $2\n ",
"describe": {
"columns": [
{
@@ -37,5 +37,5 @@
true
]
},
- "hash": "2d4fbb21f9b73c5a557e688ea157c578e2bcfaee3a4b5f22bc1965acd67e488c"
+ "hash": "1439a51cb9304493287a9c54c13e59ab42e1511a38989dfc83f0a240d85a511a"
}
diff --git a/storage/src/lib.rs b/storage/src/lib.rs
index 48c8e16..4f09c8e 100644
--- a/storage/src/lib.rs
+++ b/storage/src/lib.rs
@@ -1403,10 +1403,7 @@ pub async fn withdrawals_for_address(
AND finalization_data.l2_tx_number_in_block = l2_to_l1_events.tx_number_in_block
JOIN withdrawals ON
withdrawals.id = finalization_data.withdrawal_id
- WHERE
- l2_to_l1_events.to_address = $1
- OR
- finalization_data.sender = $1
+ WHERE l2_to_l1_events.to_address = $1
ORDER BY l2_to_l1_events.l2_block_number DESC
LIMIT $2
",
From 2f17d2ea7c910dc8d21cdd4fefafab78983afc3a Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Wed, 21 Feb 2024 11:42:34 +0100
Subject: [PATCH 063/128] chore(main): release 0.6.5 (#393)
:robot: I have created a release *beep* *boop*
---
##
[0.6.5](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.4...v0.6.5)
(2024-02-21)
### Bug Fixes
* **storage:** add necessary indices for api query
([#392](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/392))
([a7a5918](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a7a5918f7edcc8f762a25db4c2e968e120e0c9c2))
* **storage:** remove filtering by l2 addrs
([#394](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/394))
([6d7e7a4](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/6d7e7a402dc7deffba18fcfd74b50000cc995587))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
---
.github/release-please/manifest.json | 2 +-
CHANGELOG.md | 8 ++++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/.github/release-please/manifest.json b/.github/release-please/manifest.json
index eb5abf7..5b530ee 100644
--- a/.github/release-please/manifest.json
+++ b/.github/release-please/manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.6.4"
+ ".": "0.6.5"
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c5a5deb..d8164a5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## [0.6.5](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.4...v0.6.5) (2024-02-21)
+
+
+### Bug Fixes
+
+* **storage:** add necessary indices for api query ([#392](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/392)) ([a7a5918](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/a7a5918f7edcc8f762a25db4c2e968e120e0c9c2))
+* **storage:** remove filtering by l2 addrs ([#394](https://github.com/matter-labs/zksync-withdrawal-finalizer/issues/394)) ([6d7e7a4](https://github.com/matter-labs/zksync-withdrawal-finalizer/commit/6d7e7a402dc7deffba18fcfd74b50000cc995587))
+
## [0.6.4](https://github.com/matter-labs/zksync-withdrawal-finalizer/compare/v0.6.3...v0.6.4) (2024-02-11)
From f1581d9b8611736f21d6c63e145b8a7fa99f0316 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 23 Feb 2024 22:04:54 +0100
Subject: [PATCH 064/128] chore(deps): update rust crate tower-http to 0.5.2
(#395)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [tower-http](https://togithub.com/tower-rs/tower-http) |
workspace.dependencies | patch | `0.5.1` -> `0.5.2` |
---
### Release Notes
tower-rs/tower-http (tower-http)
###
[`v0.5.2`](https://togithub.com/tower-rs/tower-http/releases/tag/tower-http-0.5.2):
v0.5.2
[Compare
Source](https://togithub.com/tower-rs/tower-http/compare/tower-http-0.5.1...tower-http-0.5.2)
#### Added:
- **compression:** Will now send a `vary: accept-encoding` header on
compressed responses ([#399])
- **compression:** Support `x-gzip` as equivalent to `gzip` in
`accept-encoding` request header ([#467])
#### Fixed
- **compression:** Skip compression for range requests ([#446])
- **compression:** Skip compression for SSE responses by default
([#465])
- **cors:** *Actually* keep Vary headers set by the inner service when
setting response headers ([#473])
- Version 0.5.1 intended to ship this, but the implementation was buggy
and didn't actually do anything
[#399]: https://togithub.com/tower-rs/tower-http/pull/399
[#446]: https://togithub.com/tower-rs/tower-http/pull/446
[#465]: https://togithub.com/tower-rs/tower-http/pull/465
[#467]: https://togithub.com/tower-rs/tower-http/pull/467
[#473]: https://togithub.com/tower-rs/tower-http/pull/473
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 2288b63..5fd0d85 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4473,9 +4473,9 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.5.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e"
+checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
dependencies = [
"bitflags 2.4.1",
"bytes",
diff --git a/Cargo.toml b/Cargo.toml
index 0059cfe..2ca76ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -67,7 +67,7 @@ tx-sender = { path = "./tx-sender" }
finalizer = { path = "./finalizer" }
tokio-stream = "0.1.14"
tokio-util = "0.7.10"
-tower-http = "0.5.1"
+tower-http = "0.5.2"
url = "2.5.0"
axum = "0.7.4"
vlog = { path = "./vlog" }
From d847ed4a04ed0dff05ab8fddf61daf5d2fbcd4cb Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 23 Feb 2024 23:09:08 +0100
Subject: [PATCH 065/128] chore(deps): update rust crate syn to 2.0.50 (#389)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [syn](https://togithub.com/dtolnay/syn) | workspace.dependencies |
patch | `2.0.48` -> `2.0.50` |
---
### Release Notes
dtolnay/syn (syn)
### [`v2.0.50`](https://togithub.com/dtolnay/syn/releases/tag/2.0.50)
[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.49...2.0.50)
- Fix unused_imports warnings when compiled by rustc 1.78
### [`v2.0.49`](https://togithub.com/dtolnay/syn/releases/tag/2.0.49)
[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.48...2.0.49)
- Improve error location when parsing from an empty string literal using
`LitStr::parse`
([#1590](https://togithub.com/dtolnay/syn/issues/1590))
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 48 ++++++++++++++++++++++++------------------------
Cargo.toml | 2 +-
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 5fd0d85..ffff57c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -182,7 +182,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -213,7 +213,7 @@ checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -585,7 +585,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -1285,7 +1285,7 @@ dependencies = [
"reqwest",
"serde",
"serde_json",
- "syn 2.0.48",
+ "syn 2.0.50",
"toml",
"walkdir",
]
@@ -1303,7 +1303,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -1329,7 +1329,7 @@ dependencies = [
"serde",
"serde_json",
"strum",
- "syn 2.0.48",
+ "syn 2.0.50",
"tempfile",
"thiserror",
"tiny-keccak",
@@ -1359,7 +1359,7 @@ dependencies = [
"ethers",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -1677,7 +1677,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -2359,7 +2359,7 @@ checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -2621,7 +2621,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -2867,7 +2867,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -2905,7 +2905,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -2990,7 +2990,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
dependencies = [
"proc-macro2",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -3046,7 +3046,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -3655,7 +3655,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4161,7 +4161,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4203,9 +4203,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.48"
+version = "2.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb"
dependencies = [
"proc-macro2",
"quote",
@@ -4265,7 +4265,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4357,7 +4357,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4519,7 +4519,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4819,7 +4819,7 @@ source = "git+https://github.com/matter-labs/vise.git#90e5423a876575762dec71d5d2
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
]
[[package]]
@@ -4879,7 +4879,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
"wasm-bindgen-shared",
]
@@ -4913,7 +4913,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.48",
+ "syn 2.0.50",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
diff --git a/Cargo.toml b/Cargo.toml
index 2ca76ab..f20c974 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -49,7 +49,7 @@ bincode = "1.3.3"
futures = "0.3.30"
quote = "1.0.35"
num = "0.4.1"
-syn = "2.0.48"
+syn = "2.0.50"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
From 89454e06b19aff0e072a10b39ab59164bf3990c6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 28 Feb 2024 23:59:25 +0100
Subject: [PATCH 066/128] chore(deps): update rust crate auto_impl to 1.2.0
(#397)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [auto_impl](https://togithub.com/auto-impl-rs/auto_impl) |
workspace.dependencies | minor | `1.1.2` -> `1.2.0` |
---
### Release Notes
auto-impl-rs/auto_impl (auto_impl)
###
[`v1.2.0`](https://togithub.com/auto-impl-rs/auto_impl/releases/tag/v1.2.0)
[Compare
Source](https://togithub.com/auto-impl-rs/auto_impl/compare/v1.1.2...v1.2.0)
#### What's Changed
- feat: support async traits by
[@makcandrov](https://togithub.com/makcandrov) in
[https://github.com/auto-impl-rs/auto_impl/pull/98](https://togithub.com/auto-impl-rs/auto_impl/pull/98)
- Prepare for 1.2.0 release by
[@KodrAus](https://togithub.com/KodrAus) in
[https://github.com/auto-impl-rs/auto_impl/pull/99](https://togithub.com/auto-impl-rs/auto_impl/pull/99)
#### New Contributors
- [@makcandrov](https://togithub.com/makcandrov) made their first
contribution in
[https://github.com/auto-impl-rs/auto_impl/pull/98](https://togithub.com/auto-impl-rs/auto_impl/pull/98)
**Full Changelog**:
https://github.com/auto-impl-rs/auto_impl/compare/v1.1.2...v1.2.0
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index ffff57c..bea3cd6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -207,9 +207,9 @@ dependencies = [
[[package]]
name = "auto_impl"
-version = "1.1.2"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa"
+checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index f20c974..0c7dcaf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -27,7 +27,7 @@ authors = ["The Matter Labs Team "]
exclude = ["./github"]
[workspace.dependencies]
-auto_impl = "1.1.2"
+auto_impl = "1.2.0"
async-trait = "0.1.77"
ethers = { version = "2.0.13", default-features = false }
tokio = "1.36.0"
From 10d502bf5cebe4bb05a69850fe74a8924d51df55 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 29 Feb 2024 10:40:48 +0100
Subject: [PATCH 067/128] chore(deps): update rust crate syn to 2.0.52 (#396)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [syn](https://togithub.com/dtolnay/syn) | workspace.dependencies |
patch | `2.0.50` -> `2.0.52` |
---
### Release Notes
dtolnay/syn (syn)
### [`v2.0.52`](https://togithub.com/dtolnay/syn/releases/tag/2.0.52)
[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.51...2.0.52)
- Add an expression parser that uses match-arm's boundary rules
([#1593](https://togithub.com/dtolnay/syn/issues/1593))
### [`v2.0.51`](https://togithub.com/dtolnay/syn/releases/tag/2.0.51)
[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.50...2.0.51)
- Resolve non_local_definitions warnings in generated code under rustc
1.78-nightly
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.
---
- [ ] If you want to rebase/retry this PR, check
this box
---
This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/matter-labs/zksync-withdrawal-finalizer).
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Cargo.lock | 48 ++++++++++++++++++++++++------------------------
Cargo.toml | 2 +-
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index bea3cd6..419f0aa 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -182,7 +182,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -213,7 +213,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -585,7 +585,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -1285,7 +1285,7 @@ dependencies = [
"reqwest",
"serde",
"serde_json",
- "syn 2.0.50",
+ "syn 2.0.52",
"toml",
"walkdir",
]
@@ -1303,7 +1303,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -1329,7 +1329,7 @@ dependencies = [
"serde",
"serde_json",
"strum",
- "syn 2.0.50",
+ "syn 2.0.52",
"tempfile",
"thiserror",
"tiny-keccak",
@@ -1359,7 +1359,7 @@ dependencies = [
"ethers",
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -1677,7 +1677,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -2359,7 +2359,7 @@ checksum = "ba125974b109d512fccbc6c0244e7580143e460895dfd6ea7f8bbb692fd94396"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -2621,7 +2621,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -2867,7 +2867,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -2905,7 +2905,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -2990,7 +2990,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
dependencies = [
"proc-macro2",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -3046,7 +3046,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -3655,7 +3655,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4161,7 +4161,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4203,9 +4203,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.50"
+version = "2.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb"
+checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
dependencies = [
"proc-macro2",
"quote",
@@ -4265,7 +4265,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4357,7 +4357,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4519,7 +4519,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4819,7 +4819,7 @@ source = "git+https://github.com/matter-labs/vise.git#90e5423a876575762dec71d5d2
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
]
[[package]]
@@ -4879,7 +4879,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
"wasm-bindgen-shared",
]
@@ -4913,7 +4913,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.50",
+ "syn 2.0.52",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
diff --git a/Cargo.toml b/Cargo.toml
index 0c7dcaf..2162bef 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -49,7 +49,7 @@ bincode = "1.3.3"
futures = "0.3.30"
quote = "1.0.35"
num = "0.4.1"
-syn = "2.0.50"
+syn = "2.0.52"
hex = "0.4"
pretty_assertions = "1"
sqlx = "0.7"
From 29b6a72bb3927fe1a100332f664d40f41042099e Mon Sep 17 00:00:00 2001
From: Fedor Sakharov
Date: Mon, 4 Mar 2024 20:42:41 +0100
Subject: [PATCH 068/128] fix: disable l2 to l1 events because of eip4844
(#398)
---
Cargo.lock | 12 ++---
chain-events/src/block_events.rs | 78 +++-----------------------------
2 files changed, 12 insertions(+), 78 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 419f0aa..8efe1e8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1039,9 +1039,9 @@ dependencies = [
[[package]]
name = "elliptic-curve"
-version = "0.13.5"
+version = "0.13.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b"
+checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
dependencies = [
"base16ct",
"crypto-bigint",
@@ -2458,9 +2458,9 @@ dependencies = [
[[package]]
name = "mio"
-version = "0.8.9"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
dependencies = [
"libc",
"wasi",
@@ -5259,9 +5259,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]]
name = "zeroize"
-version = "1.6.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
+checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
[[package]]
name = "zip"
diff --git a/chain-events/src/block_events.rs b/chain-events/src/block_events.rs
index abd24d8..7fc3469 100644
--- a/chain-events/src/block_events.rs
+++ b/chain-events/src/block_events.rs
@@ -1,31 +1,22 @@
-use std::{sync::Arc, time::Duration};
+use std::sync::Arc;
use ethers::{
- abi::{AbiDecode, Address, RawLog},
+ abi::{Address, RawLog},
contract::EthEvent,
prelude::EthLogDecode,
providers::{Middleware, Provider, PubsubClient, Ws},
- types::{BlockNumber, Filter, Log, Transaction, ValueOrArray, H256},
+ types::{BlockNumber, Filter, Log, ValueOrArray},
};
use futures::{Sink, SinkExt, StreamExt};
use client::{
- zksync_contract::{
- codegen::{
- BlockCommitFilter, BlockExecutionFilter, BlocksVerificationFilter, CommitBatchesCall,
- },
- parse_withdrawal_events_l1,
- },
+ zksync_contract::codegen::{BlockCommitFilter, BlockExecutionFilter, BlocksVerificationFilter},
BlockEvent,
};
use ethers_log_decode::EthLogDecode;
use crate::{metrics::CHAIN_EVENTS_METRICS, Error, Result, RECONNECT_BACKOFF};
-// Total timecap for tx querying retry 10 minutes
-const PENDING_TX_RETRY: usize = 12 * 10;
-const PENDING_TX_RETRY_BACKOFF: Duration = Duration::from_secs(5);
-
#[derive(EthLogDecode)]
enum L1Events {
BlockCommit(BlockCommitFilter),
@@ -223,32 +214,11 @@ impl BlockEvents {
}
}
-async fn get_tx_with_retries(
- middleware: &M,
- tx_hash: H256,
- retries: usize,
-) -> Result