From d1f92a585bb92f56bfc2a16a01c3e58753058ef1 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Mon, 13 Apr 2020 12:02:18 +0300 Subject: [PATCH 1/2] core: add NewTransactionFromBytes method to Transaction Added `NewTransactionFromBytes(b []byte)` method to transaction.Transaction in order to avoid code duplication. --- pkg/core/transaction/helper_test.go | 5 ++--- pkg/core/transaction/transaction.go | 11 +++++++++++ pkg/rpc/client/rpc.go | 8 +++----- pkg/rpc/server/server.go | 6 ++---- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pkg/core/transaction/helper_test.go b/pkg/core/transaction/helper_test.go index 32f2dd743..de49b9f6f 100644 --- a/pkg/core/transaction/helper_test.go +++ b/pkg/core/transaction/helper_test.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "testing" - "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" "github.com/stretchr/testify/assert" ) @@ -20,7 +19,7 @@ var ( func decodeTransaction(rawTX string, t *testing.T) *Transaction { b, err1 := hex.DecodeString(rawTX) assert.Nil(t, err1) - tx := &Transaction{} - assert.NoError(t, testserdes.DecodeBinary(b, tx)) + tx, err := NewTransactionFromBytes(b) + assert.NoError(t, err) return tx } diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index f26726034..21bce78b4 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -238,6 +238,17 @@ func (t *Transaction) Bytes() []byte { return buf.Bytes() } +// NewTransactionFromBytes decodes byte array into *Transaction +func NewTransactionFromBytes(b []byte) (*Transaction, error) { + tx := &Transaction{} + r := io.NewBinReaderFromBuf(b) + tx.DecodeBinary(r) + if r.Err != nil { + return nil, r.Err + } + return tx, nil +} + // transactionJSON is a wrapper for Transaction and // used for correct marhalling of transaction.Data type transactionJSON struct { diff --git a/pkg/rpc/client/rpc.go b/pkg/rpc/client/rpc.go index bb0144582..fa9d3e9c9 100644 --- a/pkg/rpc/client/rpc.go +++ b/pkg/rpc/client/rpc.go @@ -279,11 +279,9 @@ func (c *Client) GetRawTransaction(hash util.Uint256) (*transaction.Transaction, if err != nil { return nil, err } - r := io.NewBinReaderFromBuf(txBytes) - tx := new(transaction.Transaction) - tx.DecodeBinary(r) - if r.Err != nil { - return nil, r.Err + tx, err := transaction.NewTransactionFromBytes(txBytes) + if err != nil { + return nil, err } return tx, nil } diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index 3d5da1e2b..0a4c37ed2 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -931,10 +931,8 @@ func (s *Server) sendrawtransaction(reqParams request.Params) (interface{}, erro } else if byteTx, err := reqParams[0].GetBytesHex(); err != nil { return nil, response.ErrInvalidParams } else { - r := io.NewBinReaderFromBuf(byteTx) - tx := &transaction.Transaction{} - tx.DecodeBinary(r) - if r.Err != nil { + tx, err := transaction.NewTransactionFromBytes(byteTx) + if err != nil { return nil, response.ErrInvalidParams } relayReason := s.coreServer.RelayTxn(tx) From 65503aa9b43e0ca720d63ba48c89896cc96b38fd Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Fri, 10 Apr 2020 13:41:49 +0300 Subject: [PATCH 2/2] core: add nonce field to transaction 1. Closes #840: added Nonce field to transaction.Transaction and removed Nonce field from transaction.MinerTx 2. Added following methods to different tx types: - NewMinerTx() - NewMinerTxWithNonce(...) - NewEnrollmentTx(...) - NewIssueTx() - NewPublishTx(...) - NewRegisterTx(...) - NewStateTx(...) in order to avoid code duplication when new transaction is created. 3. Commented out test cases where binary transaction/block are used. These test cases marked with `TODO NEO3.0: Update binary` and need to be updated. 4. Updated other tests 5. Added constant Nonce to GoveringTockenTx, UtilityTokenTx and genesis block to avoid data variability. Also marked with TODO. --- cli/wallet/wallet.go | 5 +- integration/performance_test.go | 16 +---- pkg/consensus/block_test.go | 3 +- pkg/consensus/consensus.go | 15 +---- pkg/consensus/consensus_test.go | 19 +++--- pkg/consensus/payload_test.go | 17 +---- pkg/consensus/recovery_message_test.go | 3 +- pkg/core/block/block_test.go | 22 ++++--- pkg/core/blockchain_test.go | 2 +- pkg/core/dao/dao_test.go | 2 +- pkg/core/helper_test.go | 76 ++++++++++++++++------- pkg/core/mempool/mem_pool_test.go | 56 +++++++---------- pkg/core/transaction/claim.go | 17 +++++ pkg/core/transaction/contract.go | 12 +++- pkg/core/transaction/contract_test.go | 12 +--- pkg/core/transaction/enrollment.go | 17 +++++ pkg/core/transaction/enrollment_test.go | 11 +--- pkg/core/transaction/helper_test.go | 1 + pkg/core/transaction/invocation.go | 2 + pkg/core/transaction/issue.go | 17 +++++ pkg/core/transaction/miner.go | 27 ++++++-- pkg/core/transaction/miner_test.go | 3 +- pkg/core/transaction/publish.go | 17 +++++ pkg/core/transaction/register.go | 16 +++++ pkg/core/transaction/register_test.go | 29 +++------ pkg/core/transaction/state.go | 17 +++++ pkg/core/transaction/state_test.go | 11 +--- pkg/core/transaction/transaction.go | 15 +++-- pkg/core/transaction/transaction_test.go | 18 +++--- pkg/core/util.go | 71 ++++++++------------- pkg/core/util_test.go | 16 ++++- pkg/rpc/client/rpc_test.go | 70 +++------------------ pkg/rpc/server/server_test.go | 51 +++++++-------- pkg/rpc/server/testdata/testblocks.acc | Bin 111720 -> 111756 bytes 34 files changed, 354 insertions(+), 332 deletions(-) diff --git a/cli/wallet/wallet.go b/cli/wallet/wallet.go index b6cfb7f9a..d3992d5c1 100644 --- a/cli/wallet/wallet.go +++ b/cli/wallet/wallet.go @@ -263,10 +263,7 @@ func claimGas(ctx *cli.Context) error { }) } - tx := &transaction.Transaction{ - Type: transaction.ClaimType, - Data: &claim, - } + tx := transaction.NewClaimTX(&claim) tx.AddOutput(&transaction.Output{ AssetID: core.UtilityTokenID(), diff --git a/integration/performance_test.go b/integration/performance_test.go index 1c65ab4bb..f2768c68b 100644 --- a/integration/performance_test.go +++ b/integration/performance_test.go @@ -77,20 +77,8 @@ func getTX(t *testing.B, wif *keys.WIF) *transaction.Transaction { fromAddressHash, err := address.StringToUint160(fromAddress) require.NoError(t, err) - tx := &transaction.Transaction{ - Type: transaction.InvocationType, - Version: 0, - Data: &transaction.InvocationTX{ - Script: []byte{0x51}, - Gas: 1, - Version: 1, - }, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - } + tx := transaction.NewInvocationTX([]byte{0x51}, 1) + tx.Version = 0 tx.Attributes = append(tx.Attributes, transaction.Attribute{ Usage: transaction.Description, diff --git a/pkg/consensus/block_test.go b/pkg/consensus/block_test.go index 2da15057e..0e9edf915 100644 --- a/pkg/consensus/block_test.go +++ b/pkg/consensus/block_test.go @@ -6,6 +6,7 @@ import ( "github.com/nspcc-dev/dbft/block" "github.com/nspcc-dev/dbft/crypto" + "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/stretchr/testify/require" ) @@ -42,7 +43,7 @@ func TestNeoBlock_Setters(t *testing.T) { b.SetPrevHash(util.Uint256{9, 8, 7}) require.Equal(t, util.Uint256{9, 8, 7}, b.PrevHash()) - txx := []block.Transaction{newMinerTx(123)} + txx := []block.Transaction{transaction.NewMinerTX()} b.SetTransactions(txx) require.Equal(t, txx, b.Transactions()) } diff --git a/pkg/consensus/consensus.go b/pkg/consensus/consensus.go index 25b16b7c7..c1bc653fd 100644 --- a/pkg/consensus/consensus.go +++ b/pkg/consensus/consensus.go @@ -2,7 +2,6 @@ package consensus import ( "errors" - "math/rand" "sort" "time" @@ -452,17 +451,9 @@ func (s *service) getVerifiedTx(count int) []block.Transaction { }} } for { - nonce := rand.Uint32() - res[0] = &transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: &transaction.MinerTX{Nonce: nonce}, - Attributes: nil, - Inputs: nil, - Outputs: txOuts, - Scripts: nil, - Trimmed: false, - } + minerTx := transaction.NewMinerTX() + minerTx.Outputs = txOuts + res[0] = minerTx if tx, _, _ := s.Chain.GetTransaction(res[0].Hash()); tx == nil { break diff --git a/pkg/consensus/consensus_test.go b/pkg/consensus/consensus_test.go index 502d98eb1..640c31399 100644 --- a/pkg/consensus/consensus_test.go +++ b/pkg/consensus/consensus_test.go @@ -18,10 +18,7 @@ import ( func TestNewService(t *testing.T) { srv := newTestService(t) - tx := &transaction.Transaction{ - Type: transaction.MinerType, - Data: &transaction.MinerTX{Nonce: 12345}, - } + tx := transaction.NewMinerTX() require.NoError(t, srv.Chain.PoolTx(tx)) var txx []block.Transaction @@ -34,10 +31,10 @@ func TestNewService(t *testing.T) { func TestService_GetVerified(t *testing.T) { srv := newTestService(t) txs := []*transaction.Transaction{ - newMinerTx(1), - newMinerTx(2), - newMinerTx(3), - newMinerTx(4), + transaction.NewMinerTXWithNonce(123), + transaction.NewMinerTXWithNonce(124), + transaction.NewMinerTXWithNonce(125), + transaction.NewMinerTXWithNonce(126), } require.NoError(t, srv.Chain.PoolTx(txs[3])) @@ -45,7 +42,7 @@ func TestService_GetVerified(t *testing.T) { p := new(Payload) p.SetType(payload.PrepareRequestType) - p.SetPayload(&prepareRequest{transactionHashes: hashes, minerTx: *newMinerTx(999)}) + p.SetPayload(&prepareRequest{transactionHashes: hashes, minerTx: *transaction.NewMinerTXWithNonce(999)}) p.SetValidatorIndex(1) priv, _ := getTestValidator(1) @@ -109,7 +106,7 @@ func TestService_getTx(t *testing.T) { srv := newTestService(t) t.Run("transaction in mempool", func(t *testing.T) { - tx := newMinerTx(1234) + tx := transaction.NewMinerTXWithNonce(1234) h := tx.Hash() require.Equal(t, nil, srv.getTx(h)) @@ -122,7 +119,7 @@ func TestService_getTx(t *testing.T) { }) t.Run("transaction in local cache", func(t *testing.T) { - tx := newMinerTx(4321) + tx := transaction.NewMinerTXWithNonce(4321) h := tx.Hash() require.Equal(t, nil, srv.getTx(h)) diff --git a/pkg/consensus/payload_test.go b/pkg/consensus/payload_test.go index 70ca25fb4..949f5a5c5 100644 --- a/pkg/consensus/payload_test.go +++ b/pkg/consensus/payload_test.go @@ -230,7 +230,7 @@ func randomPrepareRequest(t *testing.T) *prepareRequest { timestamp: rand.Uint32(), nonce: rand.Uint64(), transactionHashes: make([]util.Uint256, txCount), - minerTx: *newMinerTx(rand.Uint32()), + minerTx: *transaction.NewMinerTX(), } req.transactionHashes[0] = req.minerTx.Hash() @@ -303,18 +303,3 @@ func TestMessageType_String(t *testing.T) { require.Equal(t, "RecoveryRequest", recoveryRequestType.String()) require.Equal(t, "UNKNOWN(0xff)", messageType(0xff).String()) } - -func newMinerTx(nonce uint32) *transaction.Transaction { - return &transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: &transaction.MinerTX{ - Nonce: rand.Uint32(), - }, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - } -} diff --git a/pkg/consensus/recovery_message_test.go b/pkg/consensus/recovery_message_test.go index ed72f6fbe..d6a0fdc94 100644 --- a/pkg/consensus/recovery_message_test.go +++ b/pkg/consensus/recovery_message_test.go @@ -7,6 +7,7 @@ import ( "github.com/nspcc-dev/dbft/crypto" "github.com/nspcc-dev/dbft/payload" + "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/util" @@ -33,7 +34,7 @@ func TestRecoveryMessage_Setters(t *testing.T) { timestamp: 87, nonce: 321, transactionHashes: []util.Uint256{{1}}, - minerTx: *newMinerTx(123), + minerTx: *transaction.NewMinerTX(), nextConsensus: util.Uint160{1, 2}, } p1 := new(Payload) diff --git a/pkg/core/block/block_test.go b/pkg/core/block/block_test.go index b8a7d1a8c..0aec0bf7d 100644 --- a/pkg/core/block/block_test.go +++ b/pkg/core/block/block_test.go @@ -8,7 +8,6 @@ import ( "github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" - "github.com/nspcc-dev/neo-go/pkg/io" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -85,8 +84,8 @@ func newDumbBlock() *Block { }, }, Transactions: []*transaction.Transaction{ - {Type: transaction.MinerType, Data: &transaction.MinerTX{}}, - {Type: transaction.IssueType, Data: &transaction.IssueTX{}}, + transaction.NewMinerTX(), + transaction.NewIssueTX(), }, } } @@ -104,26 +103,28 @@ func TestBlockVerify(t *testing.T) { assert.Nil(t, block.Verify()) block.Transactions = []*transaction.Transaction{ - {Type: transaction.IssueType, Data: &transaction.IssueTX{}}, - {Type: transaction.MinerType, Data: &transaction.MinerTX{}}, + transaction.NewIssueTX(), + transaction.NewMinerTX(), } assert.NoError(t, block.RebuildMerkleRoot()) assert.NotNil(t, block.Verify()) block.Transactions = []*transaction.Transaction{ - {Type: transaction.IssueType, Data: &transaction.IssueTX{}}, - {Type: transaction.MinerType, Data: &transaction.MinerTX{}}, + transaction.NewIssueTX(), + transaction.NewMinerTX(), } assert.NoError(t, block.RebuildMerkleRoot()) assert.NotNil(t, block.Verify()) block.Transactions = []*transaction.Transaction{ - {Type: transaction.MinerType, Data: &transaction.MinerTX{}}, - {Type: transaction.IssueType, Data: &transaction.IssueTX{}}, - {Type: transaction.IssueType, Data: &transaction.IssueTX{}}, + transaction.NewMinerTX(), + transaction.NewIssueTX(), + transaction.NewIssueTX(), } assert.NotNil(t, block.Verify()) } +//TODO NEO3.0: Update binary +/* func TestBinBlockDecodeEncode(t *testing.T) { // transaction taken from mainnet: 2000000 rawtx := "00000000e5a49e24ee36e972e1bbee16c6897b88050e95e40db157d901cbb68de5243dc93482b51e7ce810eca512afe201768668de5910d4373db067418ad1cf95cd291de424a15a80841e00ec3bd62b5562099d59e75d652b5d3827bf04c165bbe9ef95cca4bf5501fd450140f9ef37e9a31614d0c42aca576d11fcd2ca4cade56143e725ab45e2c7372601e5322a89e0585b44f6f436147be6dc6513ebe781c358abadb1336cadc8f1fdf2e4407fedf529ec4b16ada7fec16efcb377e9c0ea515b12b98a8bed01c385999f8f6121dd5fad32abe4d95dc0c11e9a3a6ce093a7f550b96b779c45f584022bb8a93640d266010bee43509f70c9e7d86cd5037214718de5682abeb42141d1691a1595e5ee188393c26b9ca9f31e4db2d87c3c76869c4b02d081672909268e4d53bcc850401866a84eafd9003c17f1469f1830c5c5f2976da54991f7a1ed292a8af0de2ce202d8f15cb0f362f0ae0ee8bf43886785db45fed0d77b5254503ac105e694a7ac40bfc7166d3495ad4ab540e287ec51afc0569f292e106055b13765d6dacc1ed14807eb63cfeb04b50977c2a64735a4d7496c95f361b773dc58ae29a11b8183f717f1552102486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a7021024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d2102aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e2103b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c2103b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a2102ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba5542102df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e89509357ae120000ec3bd62b0000000080000001e91406db8ce12ff273d9c04cb0f224870d43eeb53c7522a6ad47b0c2ad9614cc0000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc5005ed0b200000000606fe152cafd010c1911b9c7932b77562d13b02f01414054f533865c49ae27ee9898f18c3ad18e2bb27928af9dbfdca44713b666f343e06416fe04869c3b5355934b101ac40caa4910cebdcfc3fec7322d12b0aa4d5bd7232103dfe98cbad29e3116324a5125a32b36250679190f74dca7425c40fff589cc530cac800000012ae528ca6f1c1a740a716603aac1e167cad482d49c41e4a356565cefa50b5dbd0000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc5008d190207000000be87c8c3cb58ca27e5235c5d451474435b895386014140fe20765111b9845d7d842cf09205931ea35e0de5d7078c3831e2b36e41e2298a1cf3d8bc697676ae48a577d70757ecf262085ed314c2d077e0e7a11830dc1b7d232103f2ad7aebe26d46541cb99deb3ff06fd24f0b87efa7e52a1aba6a2d3167be6044acd1015b0600a0724e1809146063795d3b9b3cd55aef026eae992b91063db0db1458f310994f5561f8759ebbdab2e87a05fa4d256553c1087472616e7366657267f91d6b7085db7c5aaf09f19eeec1ca3c0db2c6ecf166aacd14a39b8747f90000000000000000012058f310994f5561f8759ebbdab2e87a05fa4d25650000014140664803b370fb1125fccb44b470a9062d2f1108f4b9c43b7aa35fd56eb52c0564c72e649eefacf82bfb25d252aef5e677307bd0142cecc60e369265b3d053a8d9232103a95af1ee45fe9a2cbad6358e3357da7a13e994361b385c72141ca5a47ef993f6ac800000028190ef017f831707830dd8dc2867572136e7d73bdc13a7421433072e36830c6c00008190ef017f831707830dd8dc2867572136e7d73bdc13a7421433072e36830c6c010001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c600300000000000000494a6c348bdcbf192fb1a88ee41883fcdd11ef37014140a2dc5f161bcb696deeae6f078702627280cfc360d5bf0cae13a417212da2bc87c207d58cca83deb3e6fd76c05bc135367eb520e0138fbfc25e05985ddfa514352321039beeb554e21dfdd414fd07844460d2d1117d26e6b6d18314c535ef25511cee16ac8000000144a1e8637a27d17be06f4d5e4483841c5db27420757350833e970861cf0f6c650500019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500c817a80400000034a3393450b5217977ba2efebad0dd6c37bb0a690141409f6eec2a9983ae782e3d7bdf8ce02f2c9b6db4660ee93197ed8ae85ae9ef424d421ba35a3b70738618b255ab387fe32a0dee1ccd6c0bb8d1e306e3947c383557232103994c84c3cbbc3a75be1045a2ce795d2d5733bb8425f2580e19ff7f179bb8719bac80000001e04c80df4a53b8ba9dca435630f1170d3cc6f15f508e98006ef44bf9f38de82d0000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500bca06501000000d32f28fd47cc176e3d2bf6ac30eb87dfb838ef99014140b8c50990b976e837033eb09da821dae396782bd0df404e1e0675f2db9b7fc6b681b1cb6cb717a546268363f63ae65f89a18769d201b531fee4afd78b2fffb9aa232103ef4c441d2c4cd1a2e3f255366d149553a7f8f799edf1a49a0bc1af0081cc65beac80000001a6f0562becc89fd0ab4c36e2bcc4eedeb6de9fa6bb398be22dafc4e0512b55bc0000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50001b2c4000000001decb55a65ad7d23a4d474a1e75ff24c9a71dcc4014140175ea6f8e03e7fbf4254ba16ccdd06a6d6c71b7b4d3965bc0913cf02f16ce3180dc278cde426f493225c4e51db28d934da120f5ef2b723585c5aafc8493071e4232103f3215374a4384eb8e2a60635f1e8394ccbe1e21a7b90e0063f5d5ac1836402ceacd100530800fee9e85100000014f9dfa019739920e7ab28544e979c0e6613f54536140a551a5ab4acf6a31dc6fc2a91d05684424a620e53c1087472616e7366657267fb1c540417067c270dee32f21023aa8b9b71abce0001243726662530e8d5576aced9b76cc57b078a9e2857e1ae1bd04869a608657f00000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6001000000000000000a551a5ab4acf6a31dc6fc2a91d05684424a620e014140fd662c8eeaeb3fdc5e9906277c79e31e521b2aa503f0e0684ce876283b27949b2366cd5034a74d7b0b0c47e0648b57a2d569378ee0f82d2bdb3717c4cb3d5c4c2321032204ffdc2173ee04c61f3dbe1ba1ca743106f7cccc7cf6fff86be5dcd6ac63d6ac02000134c42a75a09535438eda8df28e58f8fdc7c5d3329ed6f1d9a845627f7beb53410000000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60429415000000000046a030db679a5ce51ac083c73b44f0ff6729561c01414065eb2a2a52e6c34ce3a2925ec03b958eeda5cc310468f198ac9c7c111f9a62778214e9b8234c92aef5dba75a29536d6b58b8a074eeb547c53a0e26dc0eaadb86232102670e8d99a3c28d947ddfaa76416a4f53dbcde3ee3d271b1bc78941d5f6d7b829acd1015b0600a0724e1809146063795d3b9b3cd55aef026eae992b91063db0db1458f310994f5561f8759ebbdab2e87a05fa4d256553c1087472616e7366657267f91d6b7085db7c5aaf09f19eeec1ca3c0db2c6ecf1669fb73cc8cde6c72f0000000000000000012058f310994f5561f8759ebbdab2e87a05fa4d25650000014140a1cfd844d2623cfb2b867ec8bf24d3951bd7fcdd5de1e9d59a97b3e240f80020cc7612a3a7dfa32696b7837a1a38f85d27227f76a45b0e6c956abb8b68183177232103a95af1ee45fe9a2cbad6358e3357da7a13e994361b385c72141ca5a47ef993f6ac800000016ab96ecf9f3a32fd8e209d2b5650fb2d12c39bc89493421bdd290d69bbe74d540000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500cf14130400000088eb48d2d1c288c0982ae188b13d5a2a994ab254014140e3269b08dfc3409031a24b7493376a9597eca37a6d6da868fda33005b596accb6e2b7ad4f137d597420d29f080ee9ba545935b47e6358f3f8c1f9118b4e4a085232102e93db927a1f516b37962c4262e78ad56b20e4d349cb1908ee612526ccd0d1118acd10153088005a34c17000000147f808fa952008067570e27dfe0fdc97f647964a51439de68a3e72a015de6ea5543dc896d8609c1c45153c1087472616e7366657267fb1c540417067c270dee32f21023aa8b9b71abce00000000000000000001cd018dd92f5209d47590d74fdd3f982e1ac86d202c12bc948a2890cdb857cff1000002e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60010000000000000039de68a3e72a015de6ea5543dc896d8609c1c451e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60a9301b000000000039de68a3e72a015de6ea5543dc896d8609c1c4510141407fad0f5501e9ce3fa9bef9d378257ce233f41d5fd4955e69367ad57392f9feac7608d90553e3e285785cf87fe01b8ab1266d9c73de1e33ceff1c51133735e39b2321028ad2a0b73a8624cc027d80b6ef4af9de5167740aede9cb6401ccc0faef7244bbac0200012d5a5b03a06bbcb891054ae72e64e2d9a3e46077fecf8d2d6af4496771671d910000000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60a0490100000000008e7778b7ff900a0b82779d0d768cb63b11dcd685014140c54d9d6148503a45de3c037aa6c08ccede953246bdac680a9e9f4ca2414cb02ee130c9a246771191df6bda8796f01f432bfaa464f331137d75865d0c3310f4dc2321036f97d99a1fa298e82ab6ccdedd6febd72fa5b3fa415e09f47354f3cecec51f07acd101530800ba1dd20500000014e31c39cf87027016bf0b925cb6db0699e41d235514bd12389c3eede155f28d6f72c44cb70756aff3f253c1087472616e7366657267fb1c540417067c270dee32f21023aa8b9b71abce0000000000000000000191c12f3ad7a6dc3b8c9cfb6e47d5adb94ef31e76b8dbac538a20a103ba11931f000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c600100000000000000bd12389c3eede155f28d6f72c44cb70756aff3f201414026034a105f0a694f0320b617f112eea7b21a268c54d383e8964e9045e970b8bcc020c3c12e99d560657f2f5874d0a508748bf362bccb0d15f0c9a2c22641ceba2321036200e224b07b5f88b934e36933e5c31826d3b2dc9a5a0a72a555cd5fd70feda5acd1015308803b081117000000141be8765dcb5600ac58a6cc9be39f8d5734c4f1d3148cba604700afc229870ec93ae4f2c25e78f95c4f53c1087472616e7366657267fb1c540417067c270dee32f21023aa8b9b71abce00000000000000000001d4d309fddde1101278ec53443cabb902cbbb2330ce4a16b0876c7f2c411990b5000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6001000000000000008cba604700afc229870ec93ae4f2c25e78f95c4f01414057755879205922936aef9d641f7ac2fd59a9605c01ae5e2cf730ededcc59ef60eaf5d1a5f150c5bd33c3c78b86e441d4d464856bf30ca7b9d89f5299c86d3d7e23210237965fbbff6457d897a9763d6bf97c8f700735e938fa21236aa23e648e641494ac02000109992fadaed0cf0609e42d5fea6fc5057a340893b756c19d73bd0ed92109a0a00000000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c606027000000000000fa1f3b71b6332c5880e1b2808f86e3bf730fbdec0141409ee7a22eee8a502ea3bdd264ba81f36cf7360332456fae92f50d4d89c06cbeda083c61562af8c279e91e490bbabc2e4bee481d85887ff5a36f8dbb26d1308fa22321036980dc27f23a7e3c0ea0fe50f66f6b37a7d21ffaa66d5571ce6d4d317e22a5e7ac80000001cba3499f1640f91f7074593e632d18224e5ca94054c63a72cc3c208fe76a65960100019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500aaa0680b0000007c2f0bc324085be8b5dcf68bc8ed142620b18d850141406020880ded8ae65e6b8af680882f4c3e702cb41f9dcd8a898ea69a32077d05a0503df9d70ff1e71a400dd9a7a2222df9ab348e6cd501473b05add04fb028f960232102f4830c08c254e6e81839396c44c039639f1e30b6e53878269b567d9253590aacac" @@ -270,6 +271,7 @@ func TestBlockSizeCalculation(t *testing.T) { assert.Equal(t, 7360, len(benc)) assert.Equal(t, rawBlock, hex.EncodeToString(benc)) } +*/ func TestBlockCompare(t *testing.T) { b1 := Block{Base: Base{Index: 1}} diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index 0313aa63e..4a571e438 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -98,7 +98,7 @@ func TestScriptFromWitness(t *testing.T) { func TestGetHeader(t *testing.T) { bc := newTestChain(t) - block := bc.newBlock(newMinerTX()) + block := bc.newBlock(transaction.NewMinerTX()) err := bc.AddBlock(block) assert.Nil(t, err) diff --git a/pkg/core/dao/dao_test.go b/pkg/core/dao/dao_test.go index 4e88527f2..24ec938f5 100644 --- a/pkg/core/dao/dao_test.go +++ b/pkg/core/dao/dao_test.go @@ -276,7 +276,7 @@ func TestGetCurrentHeaderHeight_Store(t *testing.T) { func TestStoreAsTransaction(t *testing.T) { dao := NewSimple(storage.NewMemoryStore()) - tx := &transaction.Transaction{Type: transaction.IssueType, Data: &transaction.IssueTX{}} + tx := transaction.NewIssueTX() hash := tx.Hash() err := dao.StoreAsTransaction(tx, 0) require.NoError(t, err) diff --git a/pkg/core/helper_test.go b/pkg/core/helper_test.go index f1e8e1657..ed491881d 100644 --- a/pkg/core/helper_test.go +++ b/pkg/core/helper_test.go @@ -96,7 +96,7 @@ func (bc *Blockchain) genBlocks(n int) ([]*block.Block, error) { lastHash := bc.topBlock.Load().(*block.Block).Hash() lastIndex := bc.topBlock.Load().(*block.Block).Index for i := 0; i < n; i++ { - blocks[i] = newBlock(bc.config, uint32(i)+lastIndex+1, lastHash, newMinerTX()) + blocks[i] = newBlock(bc.config, uint32(i)+lastIndex+1, lastHash, transaction.NewMinerTXWithNonce(uint32(1234+i))) if err := bc.AddBlock(blocks[i]); err != nil { return blocks, err } @@ -105,13 +105,6 @@ func (bc *Blockchain) genBlocks(n int) ([]*block.Block, error) { return blocks, nil } -func newMinerTX() *transaction.Transaction { - return &transaction.Transaction{ - Type: transaction.MinerType, - Data: &transaction.MinerTX{}, - } -} - func getDecodedBlock(t *testing.T, i int) *block.Block { data, err := getBlockData(i) require.NoError(t, err) @@ -175,14 +168,28 @@ func TestCreateBasicChain(t *testing.T) { // To make enough GAS. const numOfEmptyBlocks = 200 + // To be incremented after each created transaction to keep chain constant. + var testNonce uint32 = 1 + + // Use as nonce when new transaction is created to avoid random data in tests. + getNextNonce := func() uint32 { + testNonce++ + return testNonce + } + var neoAmount = util.Fixed8FromInt64(99999000) var neoRemainder = util.Fixed8FromInt64(100000000) - neoAmount bc := newTestChain(t) // Move almost all NEO to one simple account. txMoveNeo := transaction.NewContractTX() - h, err := util.Uint256DecodeStringBE("6da730b566db183bfceb863b780cd92dee2b497e5a023c322c1eaca81cf9ad7a") + txMoveNeo.Nonce = getNextNonce() + + // use output of issue tx from genesis block as an input + genesisBlock, err := bc.GetBlock(bc.GetHeaderHash(0)) require.NoError(t, err) + require.Equal(t, 4, len(genesisBlock.Transactions)) + h := genesisBlock.Transactions[3].Hash() txMoveNeo.AddInput(&transaction.Input{ PrevHash: h, PrevIndex: 0, @@ -225,7 +232,7 @@ func TestCreateBasicChain(t *testing.T) { VerificationScript: rawScript, }} - b := bc.newBlock(newMinerTX(), txMoveNeo) + b := bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txMoveNeo) require.NoError(t, bc.AddBlock(b)) t.Logf("txMoveNeo: %s", txMoveNeo.Hash().StringLE()) @@ -244,6 +251,7 @@ func TestCreateBasicChain(t *testing.T) { // Make a NEO roundtrip (send to myself) and claim GAS. txNeoRound := transaction.NewContractTX() + txNeoRound.Nonce = getNextNonce() txNeoRound.AddInput(&transaction.Input{ PrevHash: txMoveNeo.Hash(), PrevIndex: 0, @@ -256,16 +264,17 @@ func TestCreateBasicChain(t *testing.T) { }) txNeoRound.Data = new(transaction.ContractTX) require.NoError(t, acc0.SignTx(txNeoRound)) - b = bc.newBlock(newMinerTX(), txNeoRound) + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txNeoRound) require.NoError(t, bc.AddBlock(b)) t.Logf("txNeoRound: %s", txNeoRound.Hash().StringLE()) - txClaim := &transaction.Transaction{Type: transaction.ClaimType} claim := new(transaction.ClaimTX) claim.Claims = append(claim.Claims, transaction.Input{ PrevHash: txMoveNeo.Hash(), PrevIndex: 0, }) + txClaim := transaction.NewClaimTX(claim) + txClaim.Nonce = getNextNonce() txClaim.Data = claim neoGas, sysGas, err := bc.CalculateClaimable(neoAmount, 1, bc.BlockHeight()) require.NoError(t, err) @@ -277,7 +286,7 @@ func TestCreateBasicChain(t *testing.T) { Position: 0, }) require.NoError(t, acc0.SignTx(txClaim)) - b = bc.newBlock(newMinerTX(), txClaim) + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txClaim) require.NoError(t, bc.AddBlock(b)) t.Logf("txClaim: %s", txClaim.Hash().StringLE()) @@ -305,6 +314,7 @@ func TestCreateBasicChain(t *testing.T) { invFee := util.Fixed8FromFloat(100) txDeploy := transaction.NewInvocationTX(txScript, invFee) + txDeploy.Nonce = getNextNonce() txDeploy.AddInput(&transaction.Input{ PrevHash: txClaim.Hash(), PrevIndex: 0, @@ -317,7 +327,7 @@ func TestCreateBasicChain(t *testing.T) { }) gasOwned -= invFee require.NoError(t, acc0.SignTx(txDeploy)) - b = bc.newBlock(newMinerTX(), txDeploy) + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txDeploy) require.NoError(t, bc.AddBlock(b)) t.Logf("txDeploy: %s", txDeploy.Hash().StringLE()) @@ -326,13 +336,15 @@ func TestCreateBasicChain(t *testing.T) { emit.AppCallWithOperationAndArgs(script.BinWriter, hash.Hash160(avm), "Put", "testkey", "testvalue") txInv := transaction.NewInvocationTX(script.Bytes(), 0) - b = bc.newBlock(newMinerTX(), txInv) + txInv.Nonce = getNextNonce() + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txInv) require.NoError(t, bc.AddBlock(b)) t.Logf("txInv: %s", txInv.Hash().StringLE()) priv1, err := keys.NewPrivateKeyFromWIF(privNetKeys[1]) require.NoError(t, err) txNeo0to1 := transaction.NewContractTX() + txNeo0to1.Nonce = getNextNonce() txNeo0to1.Data = new(transaction.ContractTX) txNeo0to1.AddInput(&transaction.Input{ PrevHash: txNeoRound.Hash(), @@ -350,20 +362,23 @@ func TestCreateBasicChain(t *testing.T) { }) require.NoError(t, acc0.SignTx(txNeo0to1)) - b = bc.newBlock(newMinerTX(), txNeo0to1) + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), txNeo0to1) require.NoError(t, bc.AddBlock(b)) sh := hash.Hash160(avm) w := io.NewBufBinWriter() emit.AppCallWithOperationAndArgs(w.BinWriter, sh, "init") initTx := transaction.NewInvocationTX(w.Bytes(), 0) + initTx.Nonce = getNextNonce() transferTx := newNEP5Transfer(sh, sh, priv0.GetScriptHash(), 1000) + transferTx.Nonce = getNextNonce() - b = bc.newBlock(newMinerTX(), initTx, transferTx) + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), initTx, transferTx) require.NoError(t, bc.AddBlock(b)) transferTx = newNEP5Transfer(sh, priv0.GetScriptHash(), priv1.GetScriptHash(), 123) - b = bc.newBlock(newMinerTX(), transferTx) + transferTx.Nonce = getNextNonce() + b = bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()), transferTx) require.NoError(t, bc.AddBlock(b)) if saveChain { @@ -388,14 +403,33 @@ func TestCreateBasicChain(t *testing.T) { } } + // Make a NEO roundtrip (send to myself) and claim GAS. + txNeoRound = transaction.NewContractTX() + txNeoRound.Nonce = getNextNonce() + txNeoRound.AddInput(&transaction.Input{ + PrevHash: txNeo0to1.Hash(), + PrevIndex: 1, + }) + txNeoRound.AddOutput(&transaction.Output{ + AssetID: GoverningTokenID(), + Amount: neoAmount - util.Fixed8FromInt64(1000), + ScriptHash: priv0.GetScriptHash(), + Position: 0, + }) + txNeoRound.Data = new(transaction.ContractTX) + require.NoError(t, acc0.SignTx(txNeoRound)) + bw := io.NewBufBinWriter() + txNeoRound.EncodeBinary(bw.BinWriter) + t.Logf("sendrawtransaction: %s", hex.EncodeToString(bw.Bytes())) + // Blocks for `submitblock` test. If you are planning to modify test chain from `testblocks.acc`, // please, update params value of `empty block` and `positive` tests. var blocks []*block.Block - blocks = append(blocks, bc.newBlock(), bc.newBlock(newMinerTX())) - for _, b := range blocks { + blocks = append(blocks, bc.newBlock(), bc.newBlock(transaction.NewMinerTXWithNonce(getNextNonce()))) + for i, b := range blocks { data, err := testserdes.EncodeBinary(b) require.NoError(t, err) - t.Log(hex.EncodeToString(data)) + t.Logf("\nblock %v for submitblock test:\n%s", i, hex.EncodeToString(data)) } } diff --git a/pkg/core/mempool/mem_pool_test.go b/pkg/core/mempool/mem_pool_test.go index 5cfcf7b70..bf5f2486c 100644 --- a/pkg/core/mempool/mem_pool_test.go +++ b/pkg/core/mempool/mem_pool_test.go @@ -36,7 +36,7 @@ func (fs *FeerStub) SystemFee(*transaction.Transaction) util.Fixed8 { func testMemPoolAddRemoveWithFeer(t *testing.T, fs Feer) { mp := NewMemPool(10) - tx := newMinerTX(0) + tx := transaction.NewMinerTXWithNonce(0) _, _, ok := mp.TryGetValue(tx.Hash()) require.Equal(t, false, ok) require.NoError(t, mp.Add(tx, fs)) @@ -73,7 +73,7 @@ func TestMemPoolAddRemoveWithInputsAndClaims(t *testing.T) { return mp.claims[i].Cmp(mp.claims[j]) < 0 } - txm1 := newMinerTX(1) + txm1 := transaction.NewMinerTXWithNonce(1) txc1, claim1 := newClaimTX() for i := 0; i < 5; i++ { txm1.Inputs = append(txm1.Inputs, transaction.Input{PrevHash: hash1, PrevIndex: uint16(100 - i)}) @@ -87,7 +87,7 @@ func TestMemPoolAddRemoveWithInputsAndClaims(t *testing.T) { assert.Equal(t, len(claim1.Claims), len(mp.claims)) assert.True(t, sort.SliceIsSorted(mp.claims, mpLessClaims)) - txm2 := newMinerTX(1) + txm2 := transaction.NewMinerTXWithNonce(1) txc2, claim2 := newClaimTX() for i := 0; i < 10; i++ { txm2.Inputs = append(txm2.Inputs, transaction.Input{PrevHash: hash2, PrevIndex: uint16(i)}) @@ -128,19 +128,19 @@ func TestMemPoolAddRemoveWithInputsAndClaims(t *testing.T) { func TestMemPoolVerifyInputs(t *testing.T) { mp := NewMemPool(10) - tx := newMinerTX(1) + tx := transaction.NewMinerTXWithNonce(1) inhash1 := random.Uint256() tx.Inputs = append(tx.Inputs, transaction.Input{PrevHash: inhash1, PrevIndex: 0}) require.Equal(t, true, mp.Verify(tx)) require.NoError(t, mp.Add(tx, &FeerStub{})) - tx2 := newMinerTX(2) + tx2 := transaction.NewMinerTXWithNonce(2) inhash2 := random.Uint256() tx2.Inputs = append(tx2.Inputs, transaction.Input{PrevHash: inhash2, PrevIndex: 0}) require.Equal(t, true, mp.Verify(tx2)) require.NoError(t, mp.Add(tx2, &FeerStub{})) - tx3 := newMinerTX(3) + tx3 := transaction.NewMinerTXWithNonce(3) // Different index number, but the same PrevHash as in tx1. tx3.Inputs = append(tx3.Inputs, transaction.Input{PrevHash: inhash1, PrevIndex: 1}) require.Equal(t, true, mp.Verify(tx3)) @@ -189,32 +189,20 @@ func TestMemPoolVerifyIssue(t *testing.T) { } func newIssueTX() *transaction.Transaction { - return &transaction.Transaction{ - Type: transaction.IssueType, - Data: &transaction.IssueTX{}, - Outputs: []transaction.Output{ - { - AssetID: random.Uint256(), - Amount: util.Fixed8FromInt64(42), - ScriptHash: random.Uint160(), - }, + tx := transaction.NewIssueTX() + tx.Outputs = []transaction.Output{ + { + AssetID: random.Uint256(), + Amount: util.Fixed8FromInt64(42), + ScriptHash: random.Uint160(), }, } -} - -func newMinerTX(i uint32) *transaction.Transaction { - return &transaction.Transaction{ - Type: transaction.MinerType, - Data: &transaction.MinerTX{Nonce: i}, - } + return tx } func newClaimTX() (*transaction.Transaction, *transaction.ClaimTX) { cl := &transaction.ClaimTX{} - return &transaction.Transaction{ - Type: transaction.ClaimType, - Data: cl, - }, cl + return transaction.NewClaimTX(cl), cl } func TestOverCapacity(t *testing.T) { @@ -223,7 +211,7 @@ func TestOverCapacity(t *testing.T) { mp := NewMemPool(mempoolSize) for i := 0; i < mempoolSize; i++ { - tx := newMinerTX(uint32(i)) + tx := transaction.NewMinerTXWithNonce(uint32(i)) require.NoError(t, mp.Add(tx, fs)) } txcnt := uint32(mempoolSize) @@ -243,7 +231,7 @@ func TestOverCapacity(t *testing.T) { // Fees are also prioritized. fs.netFee = util.Fixed8FromFloat(0.0001) for i := 0; i < mempoolSize-1; i++ { - tx := newMinerTX(txcnt) + tx := transaction.NewMinerTXWithNonce(txcnt) txcnt++ require.NoError(t, mp.Add(tx, fs)) require.Equal(t, mempoolSize, mp.Count()) @@ -251,7 +239,7 @@ func TestOverCapacity(t *testing.T) { } // Less prioritized txes are not allowed anymore. fs.netFee = util.Fixed8FromFloat(0.00001) - tx := newMinerTX(txcnt) + tx := transaction.NewMinerTXWithNonce(txcnt) txcnt++ require.Error(t, mp.Add(tx, fs)) require.Equal(t, mempoolSize, mp.Count()) @@ -262,7 +250,7 @@ func TestOverCapacity(t *testing.T) { // Low net fee, but higher per-byte fee is still a better combination. fs.perByteFee = util.Fixed8FromFloat(0.001) - tx = newMinerTX(txcnt) + tx = transaction.NewMinerTXWithNonce(txcnt) txcnt++ require.NoError(t, mp.Add(tx, fs)) require.Equal(t, mempoolSize, mp.Count()) @@ -271,7 +259,7 @@ func TestOverCapacity(t *testing.T) { // High priority always wins over low priority. fs.lowPriority = false for i := 0; i < mempoolSize; i++ { - tx := newMinerTX(txcnt) + tx := transaction.NewMinerTXWithNonce(txcnt) txcnt++ require.NoError(t, mp.Add(tx, fs)) require.Equal(t, mempoolSize, mp.Count()) @@ -279,7 +267,7 @@ func TestOverCapacity(t *testing.T) { } // Good luck with low priority now. fs.lowPriority = true - tx = newMinerTX(txcnt) + tx = transaction.NewMinerTXWithNonce(txcnt) require.Error(t, mp.Add(tx, fs)) require.Equal(t, mempoolSize, mp.Count()) require.Equal(t, true, sort.IsSorted(sort.Reverse(mp.verifiedTxes))) @@ -292,7 +280,7 @@ func TestGetVerified(t *testing.T) { txes := make([]*transaction.Transaction, 0, mempoolSize) for i := 0; i < mempoolSize; i++ { - tx := newMinerTX(uint32(i)) + tx := transaction.NewMinerTXWithNonce(uint32(i)) txes = append(txes, tx) require.NoError(t, mp.Add(tx, fs)) } @@ -317,7 +305,7 @@ func TestRemoveStale(t *testing.T) { txes1 := make([]*transaction.Transaction, 0, mempoolSize/2) txes2 := make([]*transaction.Transaction, 0, mempoolSize/2) for i := 0; i < mempoolSize; i++ { - tx := newMinerTX(uint32(i)) + tx := transaction.NewMinerTXWithNonce(uint32(i)) if i%2 == 0 { txes1 = append(txes1, tx) } else { diff --git a/pkg/core/transaction/claim.go b/pkg/core/transaction/claim.go index f88d43e35..67cb2f3a0 100644 --- a/pkg/core/transaction/claim.go +++ b/pkg/core/transaction/claim.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" ) @@ -9,6 +11,21 @@ type ClaimTX struct { Claims []Input } +// NewClaimTX creates Transaction of ClaimType type. +func NewClaimTX(claim *ClaimTX) *Transaction { + return &Transaction{ + Type: ClaimType, + Version: 0, + Nonce: rand.Uint32(), + Data: claim, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *ClaimTX) DecodeBinary(br *io.BinReader) { br.ReadArray(&tx.Claims) diff --git a/pkg/core/transaction/contract.go b/pkg/core/transaction/contract.go index 0444f3546..09b6a9063 100644 --- a/pkg/core/transaction/contract.go +++ b/pkg/core/transaction/contract.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" ) @@ -11,7 +13,15 @@ type ContractTX struct{} // NewContractTX creates Transaction of ContractType type. func NewContractTX() *Transaction { return &Transaction{ - Type: ContractType, + Type: ContractType, + Version: 0, + Nonce: rand.Uint32(), + Data: &ContractTX{}, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, } } diff --git a/pkg/core/transaction/contract_test.go b/pkg/core/transaction/contract_test.go index 04215b55c..f535b899c 100644 --- a/pkg/core/transaction/contract_test.go +++ b/pkg/core/transaction/contract_test.go @@ -1,15 +1,8 @@ package transaction -import ( - "encoding/hex" - "testing" - - "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" - "github.com/stretchr/testify/assert" -) - +//TODO NEO3.0: Update binary +/* func TestEncodeDecodeContract(t *testing.T) { - // mainnet transaction: bdf6cc3b9af12a7565bda80933a75ee8cef1bc771d0d58effc08e4c8b436da79 rawtx := "80000001888da99f8f497fd65c4325786a09511159c279af4e7eb532e9edd628c87cc1ee0000019b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50082167010000000a8666b4830229d6a1a9b80f6088059191c122d2b0141409e79e132290c82916a88f1a3db5cf9f3248b780cfece938ab0f0812d0e188f3a489c7d1a23def86bd69d863ae67de753b2c2392e9497eadc8eb9fc43aa52c645232103e2f6a334e05002624cf616f01a62cff2844c34a3b08ca16048c259097e315078ac" tx := decodeTransaction(rawtx, t) @@ -34,3 +27,4 @@ func TestEncodeDecodeContract(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawtx, hex.EncodeToString(data)) } +*/ diff --git a/pkg/core/transaction/enrollment.go b/pkg/core/transaction/enrollment.go index cb1bcb501..8699ef9d2 100644 --- a/pkg/core/transaction/enrollment.go +++ b/pkg/core/transaction/enrollment.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/io" ) @@ -15,6 +17,21 @@ type EnrollmentTX struct { PublicKey keys.PublicKey } +// NewEnrollmentTX creates Transaction of EnrollmentType type. +func NewEnrollmentTX(enrollment *EnrollmentTX) *Transaction { + return &Transaction{ + Type: EnrollmentType, + Version: 0, + Nonce: rand.Uint32(), + Data: enrollment, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *EnrollmentTX) DecodeBinary(r *io.BinReader) { tx.PublicKey.DecodeBinary(r) diff --git a/pkg/core/transaction/enrollment_test.go b/pkg/core/transaction/enrollment_test.go index ca8483333..21cbeeb98 100644 --- a/pkg/core/transaction/enrollment_test.go +++ b/pkg/core/transaction/enrollment_test.go @@ -1,13 +1,7 @@ package transaction -import ( - "encoding/hex" - "testing" - - "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" - "github.com/stretchr/testify/assert" -) - +//TODO NEO3.0: Update bynary +/* func TestEncodeDecodeEnrollment(t *testing.T) { rawtx := "200002ff8ac54687f36bbc31a91b730cc385da8af0b581f2d59d82b5cfef824fd271f60001d3d3b7028d61fea3b7803fda3d7f0a1f7262d38e5e1c8987b0313e0a94574151000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c60005441d11600000050ac4949596f5b62fef7be4d1c3e494e6048ed4a01414079d78189d591097b17657a62240c93595e8233dc81157ea2cd477813f09a11fd72845e6bd97c5a3dda125985ea3d5feca387e9933649a9a671a69ab3f6301df6232102ff8ac54687f36bbc31a91b730cc385da8af0b581f2d59d82b5cfef824fd271f6ac" tx := decodeTransaction(rawtx, t) @@ -20,3 +14,4 @@ func TestEncodeDecodeEnrollment(t *testing.T) { assert.Equal(t, nil, err) assert.Equal(t, rawtx, hex.EncodeToString(data)) } +*/ diff --git a/pkg/core/transaction/helper_test.go b/pkg/core/transaction/helper_test.go index de49b9f6f..9d48dc5bd 100644 --- a/pkg/core/transaction/helper_test.go +++ b/pkg/core/transaction/helper_test.go @@ -8,6 +8,7 @@ import ( ) var ( + //TODO NEO3.0: Update binary // https://neotracker.io/tx/2c6a45547b3898318e400e541628990a07acb00f3b9a15a8e966ae49525304da rawClaimTX = "020004bc67ba325d6412ff4c55b10f7e9afb54bbb2228d201b37363c3d697ac7c198f70300591cd454d7318d2087c0196abfbbd1573230380672f0f0cd004dcb4857e58cbd010031bcfbed573f5318437e95edd603922a4455ff3326a979fdd1c149a84c4cb0290000b51eb6159c58cac4fe23d90e292ad2bcb7002b0da2c474e81e1889c0649d2c490000000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c603b555f00000000005d9de59d99c0d1f6ed1496444473f4a0b538302f014140456349cec43053009accdb7781b0799c6b591c812768804ab0a0b56b5eae7a97694227fcd33e70899c075848b2cee8fae733faac6865b484d3f7df8949e2aadb232103945fae1ed3c31d778f149192b76734fcc951b400ba3598faa81ff92ebe477eacac" // https://neotracker.io/tx/fe4b3af60677204c57e573a57bdc97bc5059b05ad85b1474f84431f88d910f64 diff --git a/pkg/core/transaction/invocation.go b/pkg/core/transaction/invocation.go index a73b74bad..2b934c772 100644 --- a/pkg/core/transaction/invocation.go +++ b/pkg/core/transaction/invocation.go @@ -2,6 +2,7 @@ package transaction import ( "errors" + "math/rand" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/util" @@ -23,6 +24,7 @@ func NewInvocationTX(script []byte, gas util.Fixed8) *Transaction { return &Transaction{ Type: InvocationType, Version: 1, + Nonce: rand.Uint32(), Data: &InvocationTX{ Script: script, Gas: gas, diff --git a/pkg/core/transaction/issue.go b/pkg/core/transaction/issue.go index fec4e6fe9..151d96af7 100644 --- a/pkg/core/transaction/issue.go +++ b/pkg/core/transaction/issue.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" ) @@ -8,6 +10,21 @@ import ( // This TX has not special attributes. type IssueTX struct{} +// NewIssueTX creates Transaction of IssueType type. +func NewIssueTX() *Transaction { + return &Transaction{ + Type: IssueType, + Version: 0, + Nonce: rand.Uint32(), + Data: &IssueTX{}, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *IssueTX) DecodeBinary(r *io.BinReader) { } diff --git a/pkg/core/transaction/miner.go b/pkg/core/transaction/miner.go index 62320bf56..6fc262d8d 100644 --- a/pkg/core/transaction/miner.go +++ b/pkg/core/transaction/miner.go @@ -1,21 +1,38 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" ) // MinerTX represents a miner transaction. -type MinerTX struct { - // Random number to avoid hash collision. - Nonce uint32 +type MinerTX struct{} + +// NewMinerTX creates Transaction of MinerType type. +func NewMinerTX() *Transaction { + return NewMinerTXWithNonce(rand.Uint32()) +} + +// NewMinerTXWithNonce creates Transaction of MinerType type with specified nonce. +func NewMinerTXWithNonce(nonce uint32) *Transaction { + return &Transaction{ + Type: MinerType, + Version: 0, + Nonce: nonce, + Data: &MinerTX{}, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } } // DecodeBinary implements Serializable interface. func (tx *MinerTX) DecodeBinary(r *io.BinReader) { - tx.Nonce = r.ReadU32LE() } // EncodeBinary implements Serializable interface. func (tx *MinerTX) EncodeBinary(w *io.BinWriter) { - w.WriteU32LE(tx.Nonce) } diff --git a/pkg/core/transaction/miner_test.go b/pkg/core/transaction/miner_test.go index c1a354983..6e4d0fc3a 100644 --- a/pkg/core/transaction/miner_test.go +++ b/pkg/core/transaction/miner_test.go @@ -15,8 +15,7 @@ func TestEncodeDecodeMiner(t *testing.T) { assert.Equal(t, MinerType, tx.Type) assert.IsType(t, tx.Data, &MinerTX{}) assert.Equal(t, 0, int(tx.Version)) - m := tx.Data.(*MinerTX) - assert.Equal(t, uint32(571397116), m.Nonce) + assert.Equal(t, uint32(571397116), tx.Nonce) assert.Equal(t, "a1f219dc6be4c35eca172e65e02d4591045220221b1543f1a4b67b9e9442c264", tx.Hash().StringLE()) diff --git a/pkg/core/transaction/publish.go b/pkg/core/transaction/publish.go index 1cd89fa96..81c8c2622 100644 --- a/pkg/core/transaction/publish.go +++ b/pkg/core/transaction/publish.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/util" @@ -21,6 +23,21 @@ type PublishTX struct { Version uint8 // Version of the parent struct Transaction. Used in reading NeedStorage flag. } +// NewPublishTX creates Transaction of PublishType type. +func NewPublishTX(publish *PublishTX) *Transaction { + return &Transaction{ + Type: PublishType, + Version: 0, + Nonce: rand.Uint32(), + Data: publish, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *PublishTX) DecodeBinary(br *io.BinReader) { tx.Script = br.ReadVarBytes() diff --git a/pkg/core/transaction/register.go b/pkg/core/transaction/register.go index 3ce5be61f..0351b040d 100644 --- a/pkg/core/transaction/register.go +++ b/pkg/core/transaction/register.go @@ -2,6 +2,7 @@ package transaction import ( "encoding/json" + "math/rand" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/io" @@ -30,6 +31,21 @@ type RegisterTX struct { Admin util.Uint160 } +// NewRegisterTX creates Transaction of RegisterType type. +func NewRegisterTX(register *RegisterTX) *Transaction { + return &Transaction{ + Type: RegisterType, + Version: 0, + Nonce: rand.Uint32(), + Data: register, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *RegisterTX) DecodeBinary(br *io.BinReader) { tx.AssetType = AssetType(br.ReadB()) diff --git a/pkg/core/transaction/register_test.go b/pkg/core/transaction/register_test.go index d98818d58..23d52ab0e 100644 --- a/pkg/core/transaction/register_test.go +++ b/pkg/core/transaction/register_test.go @@ -1,39 +1,29 @@ package transaction import ( - "encoding/hex" "testing" - "github.com/nspcc-dev/neo-go/pkg/crypto/keys" - "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" "github.com/nspcc-dev/neo-go/pkg/util" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestRegisterTX(t *testing.T) { someuint160, _ := util.Uint160DecodeStringBE("4d3b96ae1bcc5a585e075e3b81920210dec16302") - tx := &Transaction{ - Type: RegisterType, - Version: 0, - Data: &RegisterTX{ - AssetType: UtilityToken, - Name: "this is some token I created", - Amount: util.Fixed8FromInt64(1000000), - Precision: 8, - Admin: someuint160, - }, - Attributes: []Attribute{}, - Inputs: []Input{}, - Outputs: []Output{}, - Scripts: []Witness{}, + registerTx := &RegisterTX{ + AssetType: UtilityToken, + Name: "this is some token I created", + Amount: util.Fixed8FromInt64(1000000), + Precision: 8, + Admin: someuint160, } + tx := NewRegisterTX(registerTx) _ = tx.Hash() testserdes.EncodeDecodeBinary(t, tx, new(Transaction)) } +//TODO NEO3.0: update binary +/* func TestDecodeRegisterTXFromRawString(t *testing.T) { rawTX := "400000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000" b, err := hex.DecodeString(rawTX) @@ -53,3 +43,4 @@ func TestDecodeRegisterTXFromRawString(t *testing.T) { testserdes.EncodeDecodeBinary(t, tx, new(Transaction)) } +*/ diff --git a/pkg/core/transaction/state.go b/pkg/core/transaction/state.go index a3783eb0c..84b205cf8 100644 --- a/pkg/core/transaction/state.go +++ b/pkg/core/transaction/state.go @@ -1,6 +1,8 @@ package transaction import ( + "math/rand" + "github.com/nspcc-dev/neo-go/pkg/io" ) @@ -9,6 +11,21 @@ type StateTX struct { Descriptors []*StateDescriptor } +// NewStateTX creates Transaction of StateType type. +func NewStateTX(state *StateTX) *Transaction { + return &Transaction{ + Type: StateType, + Version: 0, + Nonce: rand.Uint32(), + Data: state, + Attributes: []Attribute{}, + Inputs: []Input{}, + Outputs: []Output{}, + Scripts: []Witness{}, + Trimmed: false, + } +} + // DecodeBinary implements Serializable interface. func (tx *StateTX) DecodeBinary(r *io.BinReader) { r.ReadArray(&tx.Descriptors) diff --git a/pkg/core/transaction/state_test.go b/pkg/core/transaction/state_test.go index 0c8e48031..87acb1adf 100644 --- a/pkg/core/transaction/state_test.go +++ b/pkg/core/transaction/state_test.go @@ -1,13 +1,7 @@ package transaction -import ( - "encoding/hex" - "testing" - - "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" - "github.com/stretchr/testify/assert" -) - +//TODO NEO3.0: Update binary +/* func TestEncodeDecodeState(t *testing.T) { // transaction taken from testnet 8abf5ebdb9a8223b12109513647f45bd3c0a6cf1a6346d56684cff71ba308724 rawtx := "900001482103c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c10a5265676973746572656401010001cb4184f0a96e72656c1fbdd4f75cca567519e909fd43cefcec13d6c6abcb92a1000001e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6000b8fb050109000071f9cf7f0ec74ec0b0f28a92b12e1081574c0af00141408780d7b3c0aadc5398153df5e2f1cf159db21b8b0f34d3994d865433f79fafac41683783c48aef510b67660e3157b701b9ca4dd9946a385d578fba7dd26f4849232103c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c1ac" @@ -34,3 +28,4 @@ func TestEncodeDecodeState(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawtx, hex.EncodeToString(data)) } +*/ diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index 21bce78b4..49dc4e292 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -27,6 +27,9 @@ type Transaction struct { // The trading version which is currently 0. Version uint8 + // Random number to avoid hash collision. + Nonce uint32 + // Data specific to the type of the transaction. // This is always a pointer to a Transaction. Data TXer @@ -107,6 +110,7 @@ func (t *Transaction) AddVerificationHash(addr util.Uint160) { func (t *Transaction) DecodeBinary(br *io.BinReader) { t.Type = TXType(br.ReadB()) t.Version = uint8(br.ReadB()) + t.Nonce = br.ReadU32LE() t.decodeData(br) br.ReadArray(&t.Attributes) @@ -177,6 +181,7 @@ func (t *Transaction) encodeHashableFields(bw *io.BinWriter) { } bw.WriteB(byte(t.Type)) bw.WriteB(byte(t.Version)) + bw.WriteU32LE(t.Nonce) // Underlying TXer. if !noData { @@ -256,6 +261,7 @@ type transactionJSON struct { Size int `json:"size"` Type TXType `json:"type"` Version uint8 `json:"version"` + Nonce uint32 `json:"nonce"` Attributes []Attribute `json:"attributes"` Inputs []Input `json:"vin"` Outputs []Output `json:"vout"` @@ -265,7 +271,6 @@ type transactionJSON struct { PublicKey *keys.PublicKey `json:"pubkey,omitempty"` Script string `json:"script,omitempty"` Gas util.Fixed8 `json:"gas,omitempty"` - Nonce uint32 `json:"nonce,omitempty"` Contract *publishedContract `json:"contract,omitempty"` Asset *registeredAsset `json:"asset,omitempty"` Descriptors []*StateDescriptor `json:"descriptors,omitempty"` @@ -278,14 +283,13 @@ func (t *Transaction) MarshalJSON() ([]byte, error) { Size: io.GetVarSize(t), Type: t.Type, Version: t.Version, + Nonce: t.Nonce, Attributes: t.Attributes, Inputs: t.Inputs, Outputs: t.Outputs, Scripts: t.Scripts, } switch t.Type { - case MinerType: - tx.Nonce = t.Data.(*MinerTX).Nonce case ClaimType: tx.Claims = t.Data.(*ClaimTX).Claims case EnrollmentType: @@ -333,15 +337,14 @@ func (t *Transaction) UnmarshalJSON(data []byte) error { } t.Type = tx.Type t.Version = tx.Version + t.Nonce = tx.Nonce t.Attributes = tx.Attributes t.Inputs = tx.Inputs t.Outputs = tx.Outputs t.Scripts = tx.Scripts switch tx.Type { case MinerType: - t.Data = &MinerTX{ - Nonce: tx.Nonce, - } + t.Data = &MinerTX{} case ClaimType: t.Data = &ClaimTX{ Claims: tx.Claims, diff --git a/pkg/core/transaction/transaction_test.go b/pkg/core/transaction/transaction_test.go index aad72f0f0..8115a281c 100644 --- a/pkg/core/transaction/transaction_test.go +++ b/pkg/core/transaction/transaction_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" - "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/util" @@ -36,6 +35,8 @@ func TestWitnessEncodeDecode(t *testing.T) { t.Log(len(witDecode.InvocationScript)) } +// TODO NEO3.0: update binary +/* func TestDecodeEncodeClaimTX(t *testing.T) { tx := decodeTransaction(rawClaimTX, t) assert.Equal(t, tx.Type, ClaimType) @@ -85,6 +86,7 @@ func TestDecodeEncodeInvocationTX(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawInvocationTX, hex.EncodeToString(data)) } +*/ func TestNewInvocationTX(t *testing.T) { script := []byte{0x51} @@ -98,6 +100,8 @@ func TestNewInvocationTX(t *testing.T) { testserdes.EncodeDecodeBinary(t, tx, new(Transaction)) } +// TODO NEO3.0: Update binary +/* func TestDecodePublishTX(t *testing.T) { expectedTXData := &PublishTX{} expectedTXData.Name = "Lock" @@ -150,6 +154,7 @@ func TestDecodePublishTX(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawPublishTX, hex.EncodeToString(data)) } +*/ func TestEncodingTXWithNoData(t *testing.T) { _, err := testserdes.EncodeBinary(new(Transaction)) @@ -173,16 +178,7 @@ func TestMarshalUnmarshalJSONContractTX(t *testing.T) { } func TestMarshalUnmarshalJSONMinerTX(t *testing.T) { - tx := &Transaction{ - Type: MinerType, - Version: 0, - Data: &MinerTX{Nonce: 12345}, - Attributes: []Attribute{}, - Inputs: []Input{}, - Outputs: []Output{}, - Scripts: []Witness{}, - Trimmed: false, - } + tx := NewMinerTX() testserdes.MarshalUnmarshalJSON(t, tx, new(Transaction)) } diff --git a/pkg/core/util.go b/pkg/core/util.go index 22e2f8709..7cd9ed60e 100644 --- a/pkg/core/util.go +++ b/pkg/core/util.go @@ -58,39 +58,32 @@ func createGenesisBlock(cfg config.ProtocolConfiguration) (*block.Block, error) } scriptOut := hash.Hash160(rawScript) + minerTx := transaction.NewMinerTXWithNonce(2083236893) + + issueTx := transaction.NewIssueTX() + // TODO NEO3.0: nonce should be constant to avoid variability of genesis block + issueTx.Nonce = 0 + issueTx.Outputs = []transaction.Output{ + { + AssetID: governingTokenTX.Hash(), + Amount: governingTokenTX.Data.(*transaction.RegisterTX).Amount, + ScriptHash: scriptOut, + }, + } + issueTx.Scripts = []transaction.Witness{ + { + InvocationScript: []byte{}, + VerificationScript: []byte{byte(opcode.PUSHT)}, + }, + } + b := &block.Block{ Base: base, Transactions: []*transaction.Transaction{ - { - Type: transaction.MinerType, - Data: &transaction.MinerTX{ - Nonce: 2083236893, - }, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - }, + minerTx, &governingTokenTX, &utilityTokenTX, - { - Type: transaction.IssueType, - Data: &transaction.IssueTX{}, // no fields. - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{ - { - AssetID: governingTokenTX.Hash(), - Amount: governingTokenTX.Data.(*transaction.RegisterTX).Amount, - ScriptHash: scriptOut, - }, - }, - Scripts: []transaction.Witness{ - { - InvocationScript: []byte{}, - VerificationScript: []byte{byte(opcode.PUSHT)}, - }, - }, - }, + issueTx, }, } @@ -111,14 +104,9 @@ func init() { Admin: admin, } - governingTokenTX = transaction.Transaction{ - Type: transaction.RegisterType, - Data: registerTX, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - } + governingTokenTX = *transaction.NewRegisterTX(registerTX) + // TODO NEO3.0: nonce should be constant to avoid variability of token hash + governingTokenTX.Nonce = 0 admin = hash.Hash160([]byte{byte(opcode.PUSHF)}) registerTX = &transaction.RegisterTX{ @@ -128,14 +116,9 @@ func init() { Precision: 8, Admin: admin, } - utilityTokenTX = transaction.Transaction{ - Type: transaction.RegisterType, - Data: registerTX, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - } + utilityTokenTX = *transaction.NewRegisterTX(registerTX) + // TODO NEO3.0: nonce should be constant to avoid variability of token hash + utilityTokenTX.Nonce = 0 } // GoverningTokenID returns the governing token (NEO) hash. diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 41674c161..629c6f1a6 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -16,7 +16,11 @@ func TestGenesisBlockMainNet(t *testing.T) { block, err := createGenesisBlock(cfg.ProtocolConfiguration) require.NoError(t, err) - expect := "d42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf" + //TODO: After we added Nonce field to transaction.Transaction, goveringTockenTx and UtilityTockenTx hashes + // have been changed. Consequently, hash of the genesis block has been changed. + // Update expected genesis block hash for better times. + // Old hash is "d42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf" + expect := "8c5e44474b2b942286071254fd4bffddd3febd0511b101e566331b5f8f041902" assert.Equal(t, expect, block.Hash().StringLE()) } @@ -40,11 +44,17 @@ func TestGetConsensusAddressMainNet(t *testing.T) { } func TestUtilityTokenTX(t *testing.T) { - expect := "602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7" + //TODO: After we added Nonce field to transaction.Transaction, UtilityTockenTx hash + // has been changed. Update it for better times. + // Old hash is "602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7" + expect := "057ea06225860f0f7e69cca1e0052652918629929591b8138a516431be144ba8" assert.Equal(t, expect, UtilityTokenID().StringLE()) } func TestGoverningTokenTX(t *testing.T) { - expect := "c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b" + //TODO: After we added Nonce field to transaction.Transaction, GoveringTockenTx hash + // has been changed. Update it for better times. + // Old hash is "c56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b" + expect := "cd3a3b5654465238c3a4ac30eeb1bfd1171378d59b27f7d2e6893ce9d6150825" assert.Equal(t, expect, GoverningTokenID().StringLE()) } diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 6cef59d25..339a6ed1d 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -37,7 +37,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ invoke: func(c *Client) (interface{}, error) { return c.GetAccountState("") }, - serverResponse: `{"jsonrpc":"2.0","id": 1,"result":{"version":0,"script_hash":"0x1179716da2e9523d153a35fb3ad10c561b1e5b1a","frozen":false,"votes":[],"balances":[{"asset":"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b","value":"94"}]}}`, + serverResponse: `{"jsonrpc":"2.0","id": 1,"result":{"version":0,"script_hash":"0x1179716da2e9523d153a35fb3ad10c561b1e5b1a","frozen":false,"votes":[],"balances":[{"asset":"0xcd3a3b5654465238c3a4ac30eeb1bfd1171378d59b27f7d2e6893ce9d6150825","value":"94"}]}}`, result: func(c *Client) interface{} { scriptHash, err := util.Uint160DecodeStringLE("1179716da2e9523d153a35fb3ad10c561b1e5b1a") if err != nil { @@ -96,7 +96,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ invoke: func(c *Client) (interface{}, error) { return c.GetAssetState(util.Uint256{}) }, - serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"id":"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b","type":0,"name":"NEO","amount":"100000000","available":"100000000","precision":0,"owner":"00","admin":"Abf2qMs1pzQb8kYk9RuxtUb9jtRKJVuBJt","issuer":"AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM","expiration":4000000,"is_frozen":false}}`, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":{"id":"0xcd3a3b5654465238c3a4ac30eeb1bfd1171378d59b27f7d2e6893ce9d6150825","type":0,"name":"NEO","amount":"100000000","available":"100000000","precision":0,"owner":"00","admin":"Abf2qMs1pzQb8kYk9RuxtUb9jtRKJVuBJt","issuer":"AFmseVrdL9f9oyCzZefL9tG6UbvhPbdYzM","expiration":4000000,"is_frozen":false}}`, result: func(c *Client) interface{} { return &result.AssetState{ ID: core.GoverningTokenID(), @@ -180,16 +180,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ if err != nil { panic(err) } - tx := &transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: &transaction.MinerTX{Nonce: 4266257741}, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - } + tx := transaction.NewMinerTXWithNonce(4266257741) // Update hashes for correct result comparison. _ = tx.Hash() return &result.Block{ @@ -275,16 +266,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ if err != nil { panic(err) } - tx := &transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: &transaction.MinerTX{Nonce: 4266257741}, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - } + tx := transaction.NewMinerTXWithNonce(4266257741) // Update hashes for correct result comparison. _ = tx.Hash() return &result.Block{ @@ -656,16 +638,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ if err != nil { panic(err) } - tx := &transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: &transaction.MinerTX{Nonce: 4266257741}, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - } + tx := transaction.NewMinerTXWithNonce(4266257741) // Update hashes for correct result comparison. _ = tx.Hash() @@ -871,16 +844,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "positive", invoke: func(c *Client) (interface{}, error) { - return nil, c.SendRawTransaction(&transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: nil, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - }) + return nil, c.SendRawTransaction(transaction.NewMinerTX()) }, serverResponse: `{"jsonrpc":"2.0","id":1,"result":true}`, result: func(c *Client) interface{} { @@ -1001,16 +965,7 @@ var rpcClientErrorCases = map[string][]rpcClientErrorCase{ { name: "sendrawtransaction_bad_server_answer", invoke: func(c *Client) (interface{}, error) { - return nil, c.SendRawTransaction(&transaction.Transaction{ - Type: transaction.MinerType, - Version: 0, - Data: nil, - Attributes: []transaction.Attribute{}, - Inputs: []transaction.Input{}, - Outputs: []transaction.Output{}, - Scripts: []transaction.Witness{}, - Trimmed: false, - }) + return nil, c.SendRawTransaction(transaction.NewMinerTX()) }, }, { @@ -1396,16 +1351,7 @@ var rpcClientErrorCases = map[string][]rpcClientErrorCase{ { name: "sendrawtransaction_unmarshalling_error", invoke: func(c *Client) (interface{}, error) { - return nil, c.SendRawTransaction(&transaction.Transaction{ - Type: 0, - Version: 0, - Data: nil, - Attributes: nil, - Inputs: nil, - Outputs: nil, - Scripts: nil, - Trimmed: false, - }) + return nil, c.SendRawTransaction(transaction.NewMinerTX()) }, }, { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 1ffd72ed9..b4a7ff552 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -17,7 +17,6 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/address" - "github.com/nspcc-dev/neo-go/pkg/internal/random" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/rpc/response" "github.com/nspcc-dev/neo-go/pkg/rpc/response/result" @@ -50,14 +49,14 @@ var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { { name: "positive", - params: `["93670859cc8a42f6ea994869c944879678d33d7501d388f5a446a8c7de147df7"]`, + params: `["0d77a6c348097c4b29fd9d0fe8657c621bc7d804034c71272e3c4f13775138f2"]`, result: func(e *executor) interface{} { return &result.ApplicationLog{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.ApplicationLog) require.True(t, ok) - expectedTxHash, err := util.Uint256DecodeStringLE("93670859cc8a42f6ea994869c944879678d33d7501d388f5a446a8c7de147df7") + expectedTxHash, err := util.Uint256DecodeStringLE("0d77a6c348097c4b29fd9d0fe8657c621bc7d804034c71272e3c4f13775138f2") require.NoError(t, err) assert.Equal(t, expectedTxHash, res.TxHash) assert.Equal(t, 1, len(res.Executions)) @@ -252,7 +251,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getassetstate": { { name: "positive", - params: `["602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"]`, + params: `["057ea06225860f0f7e69cca1e0052652918629929591b8138a516431be144ba8"]`, result: func(e *executor) interface{} { return &result.AssetState{} }, check: func(t *testing.T, e *executor, as interface{}) { res, ok := as.(*result.AssetState) @@ -339,9 +338,9 @@ var rpcTestCases = map[string][]rpcTestCase{ tx := res.Tx[i] require.Equal(t, transaction.MinerType, tx.Transaction.Type) - miner, ok := block.Transactions[i].Data.(*transaction.MinerTX) + miner := block.Transactions[i] require.True(t, ok) - require.Equal(t, miner.Nonce, tx.Transaction.Data.(*transaction.MinerTX).Nonce) + require.Equal(t, miner.Nonce, tx.Transaction.Nonce) require.Equal(t, block.Transactions[i].Hash(), tx.Transaction.Hash()) } }, @@ -406,25 +405,25 @@ var rpcTestCases = map[string][]rpcTestCase{ "getblockheader": { { name: "positive, no verbose", - params: `["614a9085dc55fd0539ad3a9d68d8b8e7c52328da905c87bfe8cfca57a5c3c02f"]`, + params: `["7c32645dab0d87cfaddd5db053e2430c669f807e9efc2b91d1f50a824893352f"]`, result: func(e *executor) interface{} { - expected := "00000000999086db552ba8f84734bddca55b25a8d3d8c5f866f941209169c38d35376e995f2f29c4685140d85073fec705089706553eae4de3c95d9d8d425af36e597ee651cb8a5e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd04014057de8968705f020995662b60c15133846425ea2f786757f2a0fd8845f0d33f6ec35b2ef77a882e4d7560d7667dbf9a6c4b74a51d9e4c52ddce26dd6731047bb340720cd95db06a799c3d121a3b75347c002b0fdc09b45bc2dd5f7fd79c6f674ca9a97cf9c7aff2c8a6ec9f0eefab29a2ae1a758b122f83f4dc34b4d6fa1266b5ae407987727d9a5345d45966e0a6b8e372efc4ce3695c73a2d2f94ba00eee1ce0a75d86ffa60bcfc673c8abc971bf2576ed9c82d5371a235d0168a2fed1ef722f06740c2385bbb75ca72665a2d4f7a9b6ef7f529cd90d55b08bfbaccf4edeee86343e915bb25c5deca6ce2fd9114c44a8963bdfc430d987923caa8ed5f6fb20f81fabe8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" + expected := "000000002534685cc322d339f957ea368a654bf30b834be4cac0b8441375cce2a37630625507db78d2a2f3130c6073bd68f57202248fdc8966fa8706e88eb0fc61df74085384945e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd040140b622b3bdddb8c5e52ae8b4bce5665eb6e2aca950ba72386ea0d37e364af2c7fc40f009c47e1a2140bee90d1e2f81c705d6f2499fe6230b27d1f225c45f38d3c440ec01e743024c2c63dccb2ca4a555eeadb2e6115fe6bc42a8d5c17093828e4ea779b36c6d1535c70c047c709183fc1c93139153291dd0edb614dd3e17d67038dd400f7635816214254b7fba0bb480e2a0ab149c84854adcb542124e67f4cedbf551690f8048271c3f05bbe50f576dcbaf3607afffa2551480cdc24908df0fd47c60408d724d6cfb9bf99e38dc42974f084d110057d3f23a04f5bbf99f5712dad17ae842416bb3e30fee034a317280565cb772f8a61fd09cb05e76db27c5fc7722819f8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" return &expected }, }, { name: "positive, verbose 0", - params: `["614a9085dc55fd0539ad3a9d68d8b8e7c52328da905c87bfe8cfca57a5c3c02f", 0]`, + params: `["7c32645dab0d87cfaddd5db053e2430c669f807e9efc2b91d1f50a824893352f", 0]`, result: func(e *executor) interface{} { - expected := "00000000999086db552ba8f84734bddca55b25a8d3d8c5f866f941209169c38d35376e995f2f29c4685140d85073fec705089706553eae4de3c95d9d8d425af36e597ee651cb8a5e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd04014057de8968705f020995662b60c15133846425ea2f786757f2a0fd8845f0d33f6ec35b2ef77a882e4d7560d7667dbf9a6c4b74a51d9e4c52ddce26dd6731047bb340720cd95db06a799c3d121a3b75347c002b0fdc09b45bc2dd5f7fd79c6f674ca9a97cf9c7aff2c8a6ec9f0eefab29a2ae1a758b122f83f4dc34b4d6fa1266b5ae407987727d9a5345d45966e0a6b8e372efc4ce3695c73a2d2f94ba00eee1ce0a75d86ffa60bcfc673c8abc971bf2576ed9c82d5371a235d0168a2fed1ef722f06740c2385bbb75ca72665a2d4f7a9b6ef7f529cd90d55b08bfbaccf4edeee86343e915bb25c5deca6ce2fd9114c44a8963bdfc430d987923caa8ed5f6fb20f81fabe8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" + expected := "000000002534685cc322d339f957ea368a654bf30b834be4cac0b8441375cce2a37630625507db78d2a2f3130c6073bd68f57202248fdc8966fa8706e88eb0fc61df74085384945e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd040140b622b3bdddb8c5e52ae8b4bce5665eb6e2aca950ba72386ea0d37e364af2c7fc40f009c47e1a2140bee90d1e2f81c705d6f2499fe6230b27d1f225c45f38d3c440ec01e743024c2c63dccb2ca4a555eeadb2e6115fe6bc42a8d5c17093828e4ea779b36c6d1535c70c047c709183fc1c93139153291dd0edb614dd3e17d67038dd400f7635816214254b7fba0bb480e2a0ab149c84854adcb542124e67f4cedbf551690f8048271c3f05bbe50f576dcbaf3607afffa2551480cdc24908df0fd47c60408d724d6cfb9bf99e38dc42974f084d110057d3f23a04f5bbf99f5712dad17ae842416bb3e30fee034a317280565cb772f8a61fd09cb05e76db27c5fc7722819f8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" return &expected }, }, { name: "positive, verbose !=0", - params: `["614a9085dc55fd0539ad3a9d68d8b8e7c52328da905c87bfe8cfca57a5c3c02f", 2]`, + params: `["7c32645dab0d87cfaddd5db053e2430c669f807e9efc2b91d1f50a824893352f", 2]`, result: func(e *executor) interface{} { - hash, err := util.Uint256DecodeStringLE("614a9085dc55fd0539ad3a9d68d8b8e7c52328da905c87bfe8cfca57a5c3c02f") + hash, err := util.Uint256DecodeStringLE("7c32645dab0d87cfaddd5db053e2430c669f807e9efc2b91d1f50a824893352f") if err != nil { panic("can not decode hash parameter") } @@ -521,7 +520,7 @@ var rpcTestCases = map[string][]rpcTestCase{ params: `["AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU"]`, result: func(*executor) interface{} { // hash of the issueTx - h, _ := util.Uint256DecodeStringBE("6da730b566db183bfceb863b780cd92dee2b497e5a023c322c1eaca81cf9ad7a") + h, _ := util.Uint256DecodeStringBE("6a46738cd6f821d3b2d96e68c3feb5fcfe81d08a711baadbb68cbfb034fa29c5") amount := util.Fixed8FromInt64(1 * 8) // (endHeight - startHeight) * genAmount[0] return &result.ClaimableInfo{ Spents: []result.Claimable{ @@ -580,9 +579,9 @@ var rpcTestCases = map[string][]rpcTestCase{ "gettransactionheight": { { name: "poositive", - params: `["3fee783413c27849c8ee2656fd757a7483de64f4e78bd7897f30ecdf42ce788b"]`, + params: `["3fe72668fa667b8bb0a77ac2375402d52fafc18e6d0a4c12a401dc69bdf515c2"]`, result: func(e *executor) interface{} { - h := 202 + h := 1 return &h }, }, @@ -792,7 +791,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "sendrawtransaction": { { name: "positive", - params: `["d1001b00046e616d6567d3d8602814a429a91afdbaa3914884a1c90c733101201cc9c05cefffe6cdd7b182816a9152ec218d2ec000000141403387ef7940a5764259621e655b3c621a6aafd869a611ad64adcc364d8dd1edf84e00a7f8b11b630a377eaef02791d1c289d711c08b7ad04ff0d6c9caca22cfe6232103cbb45da6072c14761c9da545749d9cfd863f860c351066d16df480602a2024c6ac"]`, + params: `["80001300000000015b090ad71ea0c192adc820401b2edc6a197788ee8e5e42a9c5e5e00d700c5da1010001250815d6e93c89e6d2f7279bd5781317d1bfb1ee30aca4c338524654563b3acd0030d3dec38623002baa76ad534b886cb87c6b3720a34943d9000fa90141409646e3dd0dd87685eadac1f682fa63db83729f780a7b2e739cb372ceeaadb3f19260060b34c83fec46e48a6288b2bc5c641e75d1cb358e9c185425a2e6e3fdab232102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac"]`, result: func(e *executor) interface{} { v := true return &v @@ -821,8 +820,9 @@ var rpcTestCases = map[string][]rpcTestCase{ }, "submitblock": { { + // If you are planning to modify test chain from `testblocks.acc`, please, update param value (first block) name: "empty block", - params: `["00000000399183d238a2a5a11ae4f2263fa5372a2fc488ad1bb0782b83e66d7fc89637d9000000000000000000000000000000000000000000000000000000000000000021cc8a5ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd04014090fb6263dc6a3009947999d1320844fb08929748ef3c0a6647194a637dea2c4454bfc97cafb1ce46f7df25529ff5f195f62fc455d929b4e89d5a974ad0f6bfdd40b9d36fceb1e3cadbcc88d2d0b6f481c6c3af45fa20b91682d7aed6493bdeed7ee602aeb7f50ea09b6ee5332f9f95f180fa6b3033be4a6c1208e40d75fe73c8804005dcc45a2a94c036597381e6fd3c4f76977f61fdc25f7e99d60577a970a6eeb543b6133b9b6387ec60babe25fb8dd4bfe9874e06c864f21059664c9b4a0f214c40fde0dfd49c32920d2a17bad0acd68b25180aeb137f82fdbd5794ece3d42bf699539928a30413fc9fd367b34465189a740ff41f0861318847fbc77cbe005bb6918b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00"]`, + params: `["00000000565f6b8fab486930d5ece5feb93060f010b556b2d4aa618878326ed93604ed6400000000000000000000000000000000000000000000000000000000000000002385945ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd0401408313b36a61c137d327bec8791dfbb22ae9627fbcd2b023236f65188376f1ff4913c554b276cf7e84c5446fb495df2ed7cd34577ef9a4f9dd0dd27654aa53abe040acf3d5327c50e08bf97d794b6ec021223b8c493f9b71f8844446a01a99e555d517d30b84cbb2a5dcbafb5171373f4d0e6c8aea54f46901455d62545f75bdd2a640c359e2365bfe6f9b7b58a09e7e78f2bee85dbb4f823f9bee31b297cb2eb804eb4a5f1858a729d9676ab2c63b91bee5726c7b38086a04f3fe0ca23155331c476840dfddf4c173a374aacff6d2f37b327256556aa37d7c38c41dfda1f42d25f33d921b41da271aa27f7872f7b2b0b00f90a7ee83f5823ea1cc4f9db90a0100a8b7868b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00"]`, fail: true, }, { @@ -847,8 +847,8 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - // If you are planning to modify test chain from `testblocks.acc`, please, update param value - params: `["00000000399183d238a2a5a11ae4f2263fa5372a2fc488ad1bb0782b83e66d7fc89637d9edb908054ac1409be5f77d5369c6e03490b2f6676d68d0b3370f8159e0fdadf921cc8a5ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd0401401b2c9a188c2bf0b14c59dca4c2fccc14664d815204573824d2bc7899aed43e4023d321ce28551875e7459de494d368ffe0d8b04502694640dfe0db795a52b3c340c06924f3f0de04045ab09cb51a7944219fe9f69fbf9c9770fed7712930b1a0e58dd13e78c76afff1c7d7316cf5ff55981917f8c243a33858163557a3f7d0270f4057675127a0355f24ffa2c28b742def8d4c39b4ef79b098028da182a48385608472d3fbed598b806f60b834196222b4d1bc2a65cf465de7fcedba4103dd510ae54036f06134debb8bbecfef297fb98070e242d5eefd607622110adc645d90d40779065819871c739598f04b9ee7311ebaaa048ac403a19542c5b0d2ccf1ba5e16968b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae0100000000000000000000"]`, + // If you are planning to modify test chain from `testblocks.acc`, please, update param value (second block) + params: `["00000000565f6b8fab486930d5ece5feb93060f010b556b2d4aa618878326ed93604ed645c23aae5b26be3d759680239a4276be0d2e76de303ef3fda96da97e8a3f6a0f12385945ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd040140accd1571b3c25e4a6ec80f3bfc8ca3360f51232ed615b756e88424c1c083bd4c0d37f98156c8b87a36710467a75ff3938acea5bbd6a683d439004e2a30665562405de64537c7a411055504bec46851101a3ee9a3db02a7fb0feff781bee43a71ff7e76e03f273437bb94ad1f58dbe29eff32d9299bae0f48860a89a74ed5a48900400a337ce23f8dd767d043ba2b0886ba25d3905a1493ba70a96b297179914d096dfb8621f40e5efa63205af46b8ae71198846affcf02b9137752fcf3d54a683faa408d54fcd4d5235ff48b8dbe7d6f2e0b75ea3dc1bcd563ae44c8c8df201f5039fd30357d8c6709a0639a4aef07a223ca2ae21a74494808bc8b8f2955e7b26bdd148b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae0100001400000000000000"]`, result: func(e *executor) interface{} { v := true return &v @@ -921,7 +921,7 @@ func TestRPC(t *testing.T) { var res string err := json.Unmarshal(result, &res) require.NoErrorf(t, err, "could not parse response: %s", result) - assert.Equal(t, "400000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) + assert.Equal(t, "40000000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) }) t.Run("getrawtransaction 2 arguments", func(t *testing.T) { @@ -933,7 +933,7 @@ func TestRPC(t *testing.T) { var res string err := json.Unmarshal(result, &res) require.NoErrorf(t, err, "could not parse response: %s", result) - assert.Equal(t, "400000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) + assert.Equal(t, "40000000000000455b7b226c616e67223a227a682d434e222c226e616d65223a22e5b08fe89a81e882a1227d2c7b226c616e67223a22656e222c226e616d65223a22416e745368617265227d5d0000c16ff28623000000da1745e9b549bd0bfa1a569971c77eba30cd5a4b00000000", res) }) t.Run("getrawtransaction 2 arguments, verbose", func(t *testing.T) { @@ -973,7 +973,7 @@ func TestRPC(t *testing.T) { err := json.Unmarshal(res, &txOut) require.NoErrorf(t, err, "could not parse response: %s", res) assert.Equal(t, 0, txOut.N) - assert.Equal(t, "0x9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc5", txOut.Asset) + assert.Equal(t, "0x250815d6e93c89e6d2f7279bd5781317d1bfb1ee30aca4c338524654563b3acd", txOut.Asset) assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value) assert.Equal(t, "AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU", txOut.Address) }) @@ -986,12 +986,7 @@ func TestRPC(t *testing.T) { expected = append(expected, tx.Tx.Hash()) } for i := 0; i < 5; i++ { - tx := &transaction.Transaction{ - Type: transaction.MinerType, - Data: &transaction.MinerTX{ - Nonce: uint32(random.Int(0, 1000000000)), - }, - } + tx := transaction.NewMinerTX() assert.NoError(t, mp.Add(tx, &FeerStub{})) expected = append(expected, tx.Hash()) } diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index c513e075a48a7dfa1b31708fb59183490bff74f7..a851b16b3f6201bcc91317664b8a89156ba537e9 100644 GIT binary patch literal 111756 zcmd4ZRZJLBw>Ds)xVyW%7ni}^-K9Wjad(QlyIU#lUfkWaxH}Yg`}t1JxoPs}>t*-F zPUd1(CYdMi#q2d}5(ET90Q`M>Uli=-x;>;b+z%Q@9ATz1S8)C^JHwq#qG(Q|Ti>0T zjn$x*U8nP|(BKUn+RSh4!N{XmLd_n7ArGReo{iQWp;ZDB^g-Y2X#8)zcFCFVH&Y;J zrP;4Lp|*yub_#@fpfBK{Km%!Q+iFwaF6}{G>#mu8!&X_bVzWJ$by1kSv>zf6GWiZb%wI}n?~%b#OU&#wIZCX04;|CqA_#H1Af!;kgb8bH06FEEM!r;jr9A2G>g5Dx^AQW zeF4#AMwPzvGF9KR3#o5*xC#jvGS4@!NldlC8uQz;T)KhPaCP*3rq!$8Iyq38q-~adaQ3_^@W`p$T|rU zTX;1kf!h==IJWe5e2eTR`LGBNwf<=@X51x~5xG>UY)G`h+>p$}FhU{PA7-C$FIBYy z3>N^=`hgY)P5YbV^{z%gY0s=+> zjWK`77rHlnN0mP3iiS1SQT>~_EWd|KSzJ|}muCzFTbgP)hzx|T#JOBWCd9JI(}I)u zyOhWx2vYHXz4yRb66^gr{=b4u)rc|;^w$(^m3LCDh=VUI_TkkLH6 zAsc#T#Gv*il?n8EMN)jT?--$FR3(ztYdwt)j9tG3CQu-42KIu$jej4KGU~vj&7yk@ z3W_tkRkmUWF7(3_sUzFe!Lz5r;8At@%=l7JXAMrblT*;FZNQXN#le!Z0SYR0&U+>$ zn~9V#4Ynz%GVtaTJ^CaoI#O}FWS@6iQ}ds5AqQ8XLlr3L%rE08VK%^zu&c#4nVvw~ zK3m^G+5wO)U1B|-j#P9hX!AZts9}OQviHd7eu_(@;DAECst);7fh9q5R4|1N)00lx zP5oP~vzFnv*)`zr_%$Ny2MF)KBnaw%)PR66eT1;-Xy%7s9l+QXkn2XYE{h9M5kK!3lqwVuKoo7{Lpx+mxJhqEC zQHzRW5=MGmV&HM$Y=>1Ukzi)jyZP5t_$wKX<(f%-Fk5J~#||Qy|3wik4+*rlH~Ceo z<~)3koiu$SWBz7Lel!OQynB2%6gDtHu_$TgVYgH`js}~m%Z|7`!Z01KGEb`%1V78} zC#@y2#i^!DPi`qOXYv+57$lLIZ3H6?WBy}??W2JhyVe5mG3bY^IO#zm*)th<4&2Jk zYAj9eEib(yhcTY%MNc~S`X(jJbCr9C#zspkW{|kItrZo14IMJxu<&k)*0+<`f9d_d zr~dT+hW`Ii2s<$9Y?bfeVyDpMs6ceQ&LZ>6SUtqEmm&H_Z_{zUeJbSV+n~ch z6(ZWfnMR2}NLEy<$1qS6G{{yzsP<0bKdJOzDd=D$Z_D7UMQ+3k*7F6FjTg2m6u9+O{{*bHF#+mN2(fxi}I z_FGSU9W{BY$+DD0$Ih-fwRRg<;Qcg!)OLhXkXY^AGK}DBNCA+0g&enK%a_2-ZlMV+GeNB6S>!n)`m*F5YOgJfvFy~JcU?;ES4ex?6Bt`4 zo&A+4WdOeM>Z;ftjrlRvNd4+%Hv|fgaLOkK1XvqNt0d>L1cH#B=SFX=7z(tX(qjV$ zvFgq&NI9RniJjs%!kWZvt}e~qknmgWUB9@SO+}v1e4;b(ygP3~KL9|R4To0 z1-<)^QJDRMLZs^)RhIRjm=@2#j(wU-=d4V0o2>LhJQ7b$D9SRD-RRa3+1U&_zo{tXvro+!&rD; z#^p!KOB#;V(_f4e4+*|AHC01#v=J2b*$t;Hy9J5Hgf|N~&A7qPfGGZ$FoRh3={PTH zuiehDrs+pU4%U*6D_D)o7x>m9j?Y%>gD}v8H;F;3Qb`>MD#{Zki4f6|%}?cZGYZvm zAAni3#vxMME&A4j3pFB~&Skb((!EE|L3w5b?Ud!_-hsd@GZ_VkNHhB@RM;b4EDDL8 zl$wzGWCh>x!k$;fpn1R&OwjV7<`e<)!H{6~)9`w*%vV>?=LKUa7_{!F+J|QePvfql zO0)$q+2iDzUu6M(lA(iNOMiR5*@|LZV=LYoq_>m6adzm>W<- z6EZ(+sgJweo6tU6E-rw=mqU|r8rhlVG z_RhwGn}!(XH4p1PXuHa%l;AR{AAO0wwNg%)@^%$}TmoO9RWf+8)n-`*pLUNk{!wA} z`J??|$Rx{PQZ|$!U`Gc(C6M~Ft?t*Pqm4IrNA)~#;Fwb8CD7%X-qVq_1j--$Io&kN zpUc$aaejDTiq}wHoWA}U4U4~}Rpt`6_8+6L@COBFD}YpS*5)C5$F2cnyE?j(u+coFT;ATa6?YRa{LJ#^}qY){1bm^vX%)QGc9)m!?u0)tCHyb6~3iaLd8+X9&do>R9;L%07!N zhDWNS1WE~Np6pw1@|1RJqJm_mj-vLF1iJq+bOIlNma;Wb9fpgVCiF6ou+6NS{KqK# z`hx-%_Vs-WbLyMwT1F&?uiNIAcq15vOfPcuZN`!?9JadjCT;x2$%6&h6#-8RkgHqP zfaW*%)dd~y7u(v2bOlgPp;A~CG^gW@sJXd3>E zw6?Xy%?nVNz%YfmnppQ6b--oLEU+Xr5V^m3%T(B3a6*}Bz6x40Q_y=T=G^=>pukv- zT35iEY1TE4&yzR$3EauqFxfi(<{zW5_y>ioxRl=Em{kRc#4mXm?6?>el(_ z6s7Jr)3dhR$~YwvsDZZ6v0%22yy1qZKWeI^8x}h@lzD}1>uPFs-zmWU4FxI^bVCNX zrcxDS1$RbD8snVKyUx|OegjJox@nAGnUwn(qboJupMM!F^4-e9B07qUhO2t0G~u~F zmMqozr?~@4!4jCG-#+=ZdL^sh+m!|=<_IdL%@zqITZ0)7+UUpndZiDQ)YgW|5xm0r zy+O@wtOuV&6mXM>%6xedEV00(V5w=pauPJR&Q3@sC zwi5P1VA1rVmZ}pUG$sYBvhIvH6iAt59;IedTg2Z^n9UVvjA17WqrQDuL;S}mEd4>@ zH$Jf-w%N}SuwXL#I;*e8WuVYrOj|cndj=cW7S2sxWeWOT*fwNL*K8QumT)ULP@;u{ zc%4puJ+zNoBh^ezdhZnA{)PfS`KZxx658D$f$g)R6DfIcZW+k3@LFYy(M${47p^`A zZ+SkW<+TQxk<#hkrruTo9UMxbts#+$lP*cAhQU*S1h}!r(&C$y)ts&MN$g;s;mmPZ zchBeb4GrDtyGcR#WbRRcd!m6dV+t9|0*WfA%fKH89s>BI?D&DXBNaE6KtSJ8YFZ(t zq~)Vp0bb71UCE|wJ%%E*yDzsSsOt|GMsMO*+xayNW*;nKG?CQFH>=t zboA{SPJsDIpQ1%`1G7bV;g)Z`!M=zg72h&Ra(|Nm#e4GMczi0@ekpB032gTorrzLf zNAZNwim^7CWdeQ^&QvX>^FWD&m|#w#b& zC7RKEU)g7NYtL4%=6_ockYrLTm7Cdh!fM<-g+htRv%eR)*MFw~|2GsSpB-JuJ4bW4 zWZ_9U7TUgK3a~5_Od+Ew4htxH{{VG|(3F*>+xV#LmF$S`lK(2(zWwpoptw77{ha*i z1>$fPFrBekTJV|udA7;Ilt|etUXVjb)4*QvP|MZw`xFBj3wK9@3%cr~HrX0c`gcrY zEtSWYf>$dzNOet% zP7k~?MIa$9%RQj>CCqX=ljyXZtXD9grZeBrvA`Mq%X-3aO9=(=1bJtcwx zL>NxhW^05XRrs?EpSCXKp2??gnT7`Qo>ex;_RAP4^gM>|6cGQ0g1n?0PWL0JkcGjaR7)T_BCPdSRX79)?>Fc_bEI5@>l%=s=z>283(4UOFx#7 zaJdU(`fN>19$oOy6Uvg$8q{CmE0H0p&#UxVgc(bq!F_utuRegs{bLl?{-Cf`UU<-8 z09nko7`}T;W^5(HU}ELdJ#Vl-WTFXQ!iJ|pexW3HTJYw`Xy+fh0#g*-xf6h%7Wyo> zCpKDm?V)J&P66p}D5MxD2erMracaz>?(AKj;!Kguav*S_X#OC@3lV)5+5$4_d=;>cnq*d!&> zlZ>r(y$Vt=G{l2jW1OGmoE_W&xT~KiwP$k81$5Zv#^6X&8e(dNzu; z^6O2L`?#t1;)4O2X!uZ~g5He* z{y(=IngHjO+U^&ZdkE^6`n*!ns*z)YmQVcs{&BsGO-I>#>A|gVRuZuy2^lgnUF%Cs zSIV=iUi{2Bkgvvr{}_e!KPW^k{+v+r^3_WgwxjdXw(gHQ2&-dz0JHqE%*5@a1`_(E ziXpy<&5&=lrFUU+&_4qoTCAC9AdN?6z^%PVmes`godWXTP@tf^y!8;Ysn*Dmw;q!F zI5JPMPd4v|)8`YWbi@6V=$^NfFaNl1C3&&a9T(s>w6_t~>o}W$z(-Wz-0*hB~#8u|)`@8vr%i|Pw{llfz z`GGjKZcGDfK?oKQuFoa`I{#Ri*`X~s-?&&6PxgI&w9~Yb{Y5h-8jA#HhD7%|EtCdV z?l-Z}G-Q@^Yp3qu=s5^?v2<3^boX!q@bM+)>!=yDckUYJmj2P)U3{XRy`8>Lu-tR~ zfY#`bxPcLvbCdh*ed$=xpVPe`%RDWCwG33x;SBWf!n!}zo8(96Zo~G} zb@FoXSr(S0(iBG~CipTg2cC66d14M2iQ;8h^VBy|**Lu$YCjFHwTMlouA<-U-|=Vz zo0Sw(LF2JNVV+e)VZ~%r+$+Y}qIE>9f(&}BWD211C!V_jCQd&Z_t{wL-q;oqXc_y{ ztMK${Gz6o98()l~y{+4cb3qHC;bj%arm5WA$Vnl7-oSL0YOfgku_arJ8zfk;4@~Sb zg~7ycJraPKb}Chrtb|AvB~@a0Bq|DFu3bd8}hr%>Us z#G8N7(#J^MBS^&X>aKDWbC^c5rM8FI-eC%#^?fB0?=CdF%=ZS7m>mP0Tzp&Lm{J`i z1;c?bnxlLDA!IAq3o*->)=dF8NhYn_8U=h3Sy4%zy4wja3&^A(2BzUQe+#dl1onpfaU zE-15|V`%W>Rb+l8L=-`32!UPP4`6Gelmho=nTj{qo$S>I$^~<@q^QdhX-Xt}u!R26 zcp%MTN;03DOIugE-htn?v^L_12*Zyxm==QVs~-C>}OoVS@`*N~lEDhxR( zuka_tL}3V&ld!wU8L}4*JHrGJFw03qi?PK{5878YhmzrzaN~qkDpdmr$&pBZPgjDF z{u+DG<1H-f{j`8i^Ie5`3`4q2ikp|Vj|E2WA9yYYHrND)k4^}@4!Zr3$S+tS%@je zK24TrxNbCU+qw7N>|@v?VocZ0<~vCU89La6=u!sgHkeXqhPT_16rbozabg`zLOXg$ zcaG~I@cm;Hw*R02w>UW3SZ_N~h;h@05qagice#-?TCu6CXYG%37@ESh{=GzQcTIJh zaj)}!MRwqn@dKeZDi0! z%Efnz{?1M^uTO6l!4NouW(?M(%XD$ zR;CF708tivCF6>KC}r`mlfE$bL5R|<&}77LKj4e(l|_>}uVS5TnI9|HnKpd9?-i+H z&M40p5SIuyxzBN>IMq_g^FV@luQR#Xjt#uG#5IMKNT0YCX{w+r<@lGSo$WpakX=9D za62iyt{tHtYQPG}`&KMa9VWO4f>=EK5B;)!b#+6@P>+?GW zjK85E2@+2;5Yqp`4vRmmrk(WNXELev_NzYqZ_h&(jRgF!x@!4V{dx!njr!^XvB~NY zh)Y`F0>Ps>g<9HpPURpvKx5J*DdQo|mv$XX-o^2FVwR8|9VeXDN~>lf1HMQS$`H_5 z+pcQdfy8)_@_WE_e?7}KH?t*o+~a}F9SvlP4Dh+Y-~)OWUn0?l}7-+kP=fTOTXg zh{^vk3cG($PgEvI=i~l}&eEA=vu=fXrg?mC3efEhG+;UDEGGXob_U%Am zn^dc+PFm0gm$|@(o#gob@kFns@{I(uh#h24D3GE zEEq4a&i;J8o8}tm3w^~?eZ~$9Z#gyEYbl4#qO?XxqtXwuMRa=WV0wqY5^zhy?YcT6 z|FzbY{XZzAaNTKI3HE_GN1vxNMp)BsB~;%pcLsi{YbS|WEUmOGK$^SoNyKf)tNa4U z<@eDuEb<#8u+3fPeU4}Rz}JiP^_>Ft-%yymvlEb~gttB%>S9G-`2sEc%RXI{460CO z^-2(&Xz9_jpFv>h|kH*=U1#Ok9LW-FnnR5D*eIAxMO3+76{V=S1g;WPDygxfV-V92k;HComR`yDcnK=jhR#`sds*uts3(+?NN0S7lZ~1@`;zX zhXIc402sAQkALRSs%v}e_L+K2a{?+y0I=1fcATZ&RHcajP1@r!lo7#JIy7A1VGv$| z-Hj~OJ1VQjIvLV~uf%fmft}_#fu?zqNA!{EJ0i$e0wRTD<_MtR^{uc@H1hJ}SBl~p zv*iN|1-E=9O(?FVp@PDX1R=S|KST_Kf19fP zV-ybmpfKMTj2pJJvgC=(V8E*vp-9WQ3>V4yk%Z94i{^BH@nJg~ORiv& z_lg|ht64+V3;MZEa>@NqQo0GU{7?l)3_(J%56O?58$JHE*np1CY_IA!|6dJ7c0Fh8 z4@6d8AxgVgoV%CNxW_9RF@(@`L}%Qch&{UBJFC^HXDkQ2!&uA*dk|wkbG#bjz6b-} zWY>@f-W+pLc`35hbR|TtS|RI67iPkTa;6u#q*1)LTVu5)!!zWrn_EH(5h_&iBu_E) z)8Izz$L0^WbHAT~nEJp~u*HkiZM9`*dylcFt7eYi2tfx;{LT%y&)~rwslVj8d$oEw z^x*M|k+43`TvI?eilm9{HQ)FkDs$8RYsXPXe^7AGxlVF3*V}iz`r5zbY~9%%?to3! zF&q7)bur{Hx@_3jWz&I%2wCgB&memFon1NdC>B@QBca)z<5Fvtx3AvnodVw9P|&cD z<-}u@8=2U6f6R{AhRn^pxbpDxb`4fr^J6oe7_GTGtx$hKGz3_nXv@wkzl##Y^w zQyJ657)I`N^2UncL}yw;#~Y!E8O9DYNcB)ZeeqeZ+&TEYm&INydA7xixj}u#>&Ajz zK}UNbKZfK6=B`7J7$_LRe}oO1+;vALe1FqsJ1+c7k3Mt~_-v1_0Fz*ifjY(_<4wgJ zZ5PwMwU0|l$VgjEg7o|Fg{j#7u9;1+=c!IsZ%f9LBd85-b}2V}r7Lm7C`p~>@*hiu z<3A`|uy#LC%a6*WXQAY&Vm{#M3hQ(g_54a#_;loTLlV|~FNyqCUwLIW68YAK+I$}} zq?Zw1@paIKUA1=K%t^M!`key)-%vQ>tSGKJ6Ziya=f)x|V;N;FZNvNnxipEl#;YpV z%TAiiNUhsKApnu*HLa`%t>@M^2mH7pzyVHeM<2tpPfrQpJ+433$C1^nA}ng*{@5dx zWFmpp`dtJ2wEOou()VRNjwt>}r500{wjQ0<8zMjxF|S=VqBlMXq>JuPzr9^4hd z@GYC+jA!r9<`(6Sm{eRg)|a;zgF{QYYv=r2*Z1b2;!7$aPkL*Qy*~NBCU&OF=+$qvIE~c!>$|*i%Mc> zm+s@EsU}~&h*9*_r8MfHt!S&{)U427#EL+ zN!PQunAb055dWY4KG;-9m7h$oXlV~=TMKUe#zGaFaC>hw=t40%jKbVv*a2tiUd&!u zd1F&RpMD4sau9;o*%4ke5-}6z%oCJ#XR2kv;b_xbpi9Z*54elhJR;_g9YApX=A~TOIA2;EM_B55B5H1n5{WHT zc1EuqE-~CMg(`{B?ldTDxtD+;VPdUFWP`)HnScp@1&|a$R@2et?^P8-JN@2W$?t6W z$$v?KTi)!IldE2c%m|xs$;P{0< zxGUSO3|&sb6-%I!vVEsO_%{?lV-iB2_*;t6FqVIg+jH{Iokk^gda!jZZqsyP!i=BB z1Q1d%^)Y3bSJ`1hHk2*RNvzJdu#{h%?o-H#*NTk-!B6v}c~-J%eIV|_)@7VM_wJRh zyH_$f$3$tO6D~p|{!!b-F%9hwMy%u|?sf18+Q@-w*kjyBMfLT`od#Q7~+w_T*q>EUs2+e7my!}scAaortEf6-F6V$%(+!LTO)Y+4V==f8#@BE8?ROk9wHCohsl!=njn*n93L09r zsD{5I?|z0)9|lXYPgoXm6Rf1 zpgQRD4A-4`N8ae)GzIP80*aHXeBJYuI6N0$22`Ni8c|P7BP~cO9Z)5Xubj|Ehpy5O z67hXV;VFnQEc^zKoHQ|~ak#O)Q zd1~`W%pHDP&-U*Wi2sHHKFrRNS=u3#4Ce;Iy#N8X#MreCWsK5!5E<>5GV@Kak)TWe zn&D|&&5V_qVny-<_~oUjfbjHo4;sO8pA?!^H5e6 z`}7jbV>vi*(e2#Cm5wT#QMXG*BP_sY4N9QFGnaqB_4zcIhk7zX3Y<^ux-!?^6XI5G zc~3N%6KLc)>)VgVIgIUUd>CbN3y2J4&EoALVbHyypUIdIk^)ZTsL zmYSpY0m_4C^da*bYK84tXPiUi%VYtQ7ArX7$E~eWT8DQEB!5GJgEsilJVQWBXP{XL z>-acy2#QRQD{cFmeV>=Mi#j)LE56)#0d!Y4RJ z`_ihoy22QVE3Ln?0Gw~nk;k@NKX>t~4feco2Y89=+7>d~hh|+>J>9+0(%PgweI8k-Ft#4Coh%6&~)y8hQXo-h8OAWhg!Y-H;z zc5DOve5)Ga_H7~Y!uK$I|4AH+lRUseXs!Cq(6Ui6d~k>JWPAh#Pf!jT8j}>1$tcES zsj%9e+wq+O>EBRTziJID_>y(M%K+#d9)$TZ5yR4a5PKx}B1#9oN(}O`G|{yd(akrh z`QizQuvV_4`7CrU%~XM3hdi!3$jWjKxLC-=HM97TP~|?36AH$M**X~=oM{=!$^RLb zHX+opVY8nr&sMowHSxd#R^ zU3@p-DCVq}#`l)oFF8F@O%D@6Uu)b53s5qhjfIVOx(CqW5o;J(Vn$tT4vcI8V4pPi~?8I0b>ovCf!^e2z zGNpF^n^}72lSfl|emu{7KxY4nd?QG-kQIg)?L??Uza(E6C-fYK=b*d95F>dIVEt`; z(CV&X3tx^ytvxwuk-L_B-*%Qavmd|5x=}n|UCZ`j#zxXDla13-!!uytCrP|icVKhV z8)S(sHM4M886eGh4Ij%XtD!sbROD5C1i@`n5V$)cBFR>^x}x$(P7VU^^J~G4XfkNh zZZ%02?uNe3J~sUprfc|Q*Hg5MbcSA$X8UU zXy0AJPF1@YqNsEcn;-ABTEL|M%mHr_jywnVcRt$l=2 z6Eg?G2>5_8T(s`rxv>Q1f*mUXIAP?a5G|uYAS&>dbP)|&f zK1fK|@N>W4P6a87Zy#)B{uTun(YjMmyDfz7CzHqrG18VU7q2gv5vQJo#{>YQM66Bo zG2x!>YnbPuW-{yA{RI;JkKqzPxP3`7wJ|M*9nTa4<-GqK6;cmr!jYSp!UolYOp!-q z)}1AtMHJy5qj3EPh3-0JR$j-iokx#Rp=}x9v5JfjQG1#kVO5?Y$9-{2Zn4M(<157q zvLK}D9>Z#Hw=QXt;n+Q`Ot?`IyFazQg1B8;KQZ99@d;sWHCMx0_`(aN?9R9p*GjIMWWAX0lCB3xcM zhg|v|CGg$ilZTHv!sYyFxaNGYSom+;L}Z`!Y|A1X9m&B=tGs#Ltu_4T7oP3kALDDq zm$=ew8HYayVWl9Im}olEzeWHElaAYx5o6=6oZ@bRG3#1EipMyKo}lLG?o>`o^#j4V z9b1v^1YxcIJd7rZXud-SU1)Xhb3)7w`s;Xyx>@f2F$y<-P#FDQkv-mRK)ej4uOB%; zTDcaj#jshwUK&CMn~T8rWgCMuxaiwYXjkZVx84A=lqX88pJF6GImVQdP;wa0=jdJE zDNz0mg)qLIrK*t#$kKpMseU%qCLg~A&Tvv=2ext1C4E`*5_N7Ncl8pa_<|BpdH=-? z#f#OeQEZJUYMt=z3eNh`TSBA81}4(k$~zX0O)PJ!xgC~)tf7qg9q%{QMp%m`;uhFvLl{|L{U zva?A<=h5zaD95#OYK2U(Fh5mk=S*Ijr_T0gJxSd3g6Brs(!|p&9t5T^aQTT$2sIjJ zmoOdmuJ$f4Z2as;)mpY52kE$APu#za9(iVCpl2P0JocC)V45vrZ)B#$685ki(jtv# zsT2Z?Q>@l<`Le{C77&+ZI3ocW(;5JbgMd^(^qFmA7x1+zKmm1f+8VeqT%zv_|(7Pv&; z-Mo4t5Om!@?4*8=1Iq%IGrM-Q{M82QOj?=69LDX24g`eg!>+Z@kj8~_a)gDVZFCRC zAob_a1lkn5s;0}W`WLrq(Lcci!}OL2!gwbFKMh10n-3*pz52!&L&H35CGa-RvfI|) z;wK-ejs+<1)!xT6I9VdeR_~%f8793V^Xj)~O?{H$tk1Y26H7U_1SHqu6`2cp8b00q zSZYp8PUNo-T?rmFFD99BtQopP3MZ)~Q`8fQ>aCNgqr6fXvl$NW_mNyr+EMluY!#%r zHTcIU-2XvgohW!bzUjFi*SpZJb8W&znkd+DEy`~e);w8t=z~=ViUwM3ACct_SnlwL z#4k|Px$xx_IKoq{i4Hqkyx|GA9`6)r{)U3ja>blF39*iFit!15_X8Vx4}37uN5rP4 ztWu0)-q8rwiWVUVW~gd!LCk%BdI@~x;@tIsgrGMG7WTc^Gl40fLty#Q40>)?Qd zCJblFLh8I^{AKp7Ur`}02-7DoC?sst!YY~cR*g6zvG3DLR%RdaF2YXJ*;noNAS)HJ z0d2uJ7vi9X(ky+@vRZ$)K3<<~JOv|viGyI)#VPSqsBX#g34U5re>H4+hP6XOlac$pm*c1b8%k7Q~lvW-UZ!8G>~n~bsd0;W`byhK+zmd;O$ za}qyZEH$!=#Hn%)kheaG$>%Co8xdyr3Lc{s%m!7cBMKyk9hM(&s#t)@kRtzEL zaPl~`^33UpMtM25Q+1Ek1;m#( zz$S*OaVUU2J|A__(x2<;Q2Wtxdlsl&VXq^C^pXc+Bab@J%A6lHb;R792^Y7SslJs2 zNbGtnkPX~tP5}^H=Yqw;joa>_A(!Y2;QO=+n&~otIh{LItUU*r!#nO@#_I{^8|2Gr@N5o`| z$90n=VYAGH-F|=LRahAU>*PQ0yF*d$i%-i%q$)b`vWr#lK4edJ(;kLa=S1rIvA=}i z#{8QVdrK1+V3n>7Ipyks6|QINQ&tP*5yjS|W6dvs85ajFVfYm7XxSCOFq1sQ!E924mg;^qf+q`3G^BZA;9Sv7q4fA)*IiQJt>njP~h!I z=aNP!ayk;+$*Yue0 z2{}llLxCX}DCYLqPiWa+FnELfE`vARz)-jT-It?viZ$l(stsT4imHNPf^+tdrNZ+c z6zGTIjuB?yPMzHRJeijvWeWctlduq|3=>_CEHD{GB@U)f zRNi96d1B~g za-HXT9~7Uuw}aNYx6Am$@9Z$~a!Dg_H1Rp$9CK zkj19wfsL*6-=Xn6aFr`A1Xg$BkB+hZUyUMjG;I3rp)QY47gmAH zizN^sS9*>Ek@6;9n;!-%l1!>BLuUn-K7I>cP*?*-!&f=&e|_3l;gIm7*daFkFs)}E zykN{~tzbGvpGO5P;;gP0;;?n#o{4x6>=4?r0-dWbzGoiIZ6ok&PTpEX*VWJz{myqV1M6 zuhsx%QzNZmx{*&y-ryBQ%7Qt>H)ju39r(c?LY{K@&s4bBN6wu@2OVaIYjk@jkJ+!o z20L0EaDGyu;Opl^VuzyqV-(*0pb$7D1NyzYz+|lNshhx&Y?FKbm(I9yOi0tNbK+s$Q1`Ix-HP*}fogyOl{IrD&4={EK~6 z2gt7QK2<=DYu!eV!G(|v=dD->`qXkI*9o5zsAjfu5gXe|A#$wC=kgFf>Z!C?_RVmx zZsl%C?P9SW#OfDP^G`qw6SkFcl+hj0;U#FVSQVd4{S>b(*o9=lKnc|mM%^jZ5JlR9 z%EsTpl2|unvHRtGlPmj21RiuQbD+m2&Hfo6ouc%G)FjF?qOeLwRzUzFSiN(b@OVB+ z0rs40ARW)%0t1ndbgC4o0FOzMjJx66T2q%IEfHZDn`|S4!TsgG_9r#Se+DwYum79; z-aadE`S$;qyQl83x-AUAv6BX0*x0t!9XC!I+qP}nwi`6IZL3Kdqp|Ii>)xDR_7Ci< zXS`$Vwbq<(DZ38TbeD4v_%Y#FPy1P?&+_QO=@Vh@YZ|G54+=~l-}}GQQG0ZYL#q0x9gyVN-$<*JWq-;@NSo)LT?J)x z=gXOEk4G9NICC6fO)T0Ntjl8ks5YX#!k=3~R`H!6!_8X=u?U8z6ItNRgbKIXvCU&G}`YdUyj_VjIJ{1(gi*<6`(a; zn}CI9XWpgjkzXSKkyz{mQo&sN%nM1#ePzu z2ih@^2AhxJ7M^0 zyosIJUFpu1pZ!GX&Ns!$!?AX5OTL-`?Vp~{=EDnLn9g1zs23$Mx<+dtzfE=8C%WG% zU-TeX$h%92X%!QyQNkL^6|!tz5uU(c3g*O#P5<)nRk`Jw13-EwfWizA)3v@YlM0)t=QQQ?}*T;lz@KTUHF}w@UHyxp?Dv^CxaperZzLdF3p)+a+R4`Qp3;cG2%CmV*## zfybN7sTQ}(Zl9#KWq;Rn!>B^8=>`8|sQ~^5g?c1L<{%{6=aAwn^oYCPrYciMDm|@t zG1hzL*($0bi?2#2txo=PgHK6#vV0!9SHn4{4z>)+C~f)}a9Hx%1i>E^SpSAX#k6hf zZq8((yonuyvh`qjsPfj%t8_0C#|<(lcgvW4xLjs)2fquRn&|@7ZFTM{vc5b*SNWNp zgNp8rvIJub;PBs6(>1n{OS<0KMwvyZwiyC9|V16LbRPNKk1?1j6`k&>6Ic{$sM2;KuI{avV=W^k<;P z%e~Ga{S?#DP#2d5yoG#FVEY>iyjOA5+ms;^!-EXi7Qyng>Y{BHOE@(@7_K=An~a>S z)l(Qxs1&%E;<2>qeDRpbzmu8syTek^2LBVN^U^?9CcnVVP=36UgD*!Wk9X54dUB{ZMQUsI(w$1>C7_PZ!p}ooI zQTnUyDMkfNlsCWKhC5e=L6^XPi~{5z6g0)0g_?c#XS>58isXwk6X24ZbS)*-&Zr>D zxp@hGLHu@?*}-Zpk(>yPq^d@#=gqjwY2Xa%gU29qt51oHU=01B!2UNBT8L2^3)r$!69o7D1y4o>eP{Tyj)r_@c=d^(YJOd|JAQ;>CO4&hvH-uq%-r=_tlu z;?}H625{Rv_A_e-Vpg_rZ^0M{Saq0_HF8|EO8TGB_%~9~7xo6d=r=noG`KqqiLDZO zAk7fD%g%;j%UFqsn#)hdO@aNh3ivX_Z3qsQyyM=JB_D(!o&we z;$2&vWNHwea|sNwThlLDi>a;6rc@?%o?`%#I3UM5WZV-%qNpwRw% zhJNF|enJvF5Fi#Mx^@nsyBKFP?HvZ%G4JrFxsA)g!XI9QIVSg_3!9&c*($%>A>V&` zz*V}!H|(BP{1)~>f#Yu|G%}_Vi@+o>T1czT#-TB3PLl;^&4P@WRnY6d$pprCSvw++ z@`2;z7Ah|-grW8}Ai*QB+~V1BHVf)M{@3+<2Q-YQ2*u&tG35>&@uXNSLdSHO+vw&* z-35U*Z%TYQZedVaa1eFGxxYK~H>{y{QBtVd)Z0+$s-~KVNIN53+~lVd4 z8qOL>8E?6`>*UBkhKn_@#US;#>6y_BTj1~bc!nD)X{;*0>4p2m%tlT0XgOa>upeD=?xaMcLD`hMOTOjY3@6gdBeg2uRiCF>xICJ(#} zLE;t;hjQ=zx8m`I@G%3;#Hy%=c57vFVyX1zmL}BacpcpVUa;i~{bj7>vD4J-s$ww{U0umluNGb= zJSgXJ3HcLvtg#r++a7=_HVToLaW9`IMZ~DQ6$$B*GP;A$TK}Z#@U;wKp@c3S>IfI< z~qtErQ4_NJs9wi zm7BD?7kN*;qY$aqZENACP}JHrJSqYK5S$@ri;Xw1mOu>G1jaP#e~bdm9~AblQg$iO zX*CuKgF4 zUbE}c2fjvpP~iF-3Ms-!W{>#OvY14OOEl37xHX*6T6P7F6_mzcC(CXurXhh7>vBRn zGWRzfVL$7g48w27s(Y1h@xN1*X_0Ee0Kn(t&-@Nb@9J{l2yGuVHR7>Z@cshnJMeWA z!cse^%JEO|^dY&MxgCk`)0{4sX9U0U@@=Z$wfa_r$RO1>x4D3I^L_=Hw-LU_6y!Xx zAW!Yk2&1#H#_FzS)oPGlIUBE#&3mc2)+zc)!Fwg`MNFTeOIV)=k~2`h$|da@Sb7b> zElMB1qx7Jmrf)s?*-y!C%>lLdho(Y$%gMkvKGvx`A7%jE$y!h5QNP-7g`!?}uwj&Q zT$OBQ&ZJMBQ$3IMKSlxe4+;>;6a>6w^CUB}GQgy9~%Z)P+8waSU z_s^Rrejagyi21B1*4+DTZTay(7KdiovMzM1%HMvNgrxc}j0xR5GI)sj-Y4yFR03rP zDUt*Px+0;dYhnY9W!3Gp^s}|?Da6>>?e*B~g_PKn9R%^`X6O!cpZv^_^F^@B7IgyC z{1K|?*+sJlse*w;)k`b&KGL>_F_CR4_|QlP<`Lyd>x{Z5W{aFIP(hPdf)k!p-Td?l z((9if-fnlq)~1mpkGUz?ZOf+-E;4EW;ZMonLzprF%4|hJh*l$kE(C1tEmbA->r3nL z%Q%DJ^k@hntWBeDq2P?Py4vX25&bJgFjU}okh>NA4@H|q{}=_hKPbFuz_)@w&4nZ8 zd0-l+%$rAK&=VerxREmxa)uFtDJm;fi!$LYqiK>;#h*}OI(Rpjt4Ec+IbL(a^(*eL z>|jTIP~iC+3It7%Z&`4pYOe&>Jh9ZqJgELkIip2se!A%b?~AtQy1{tn)A)?VfPvK+ zJ7`J);z;GQwZ}OwO9r7~Q5~gyAFwuQF7)X=lLr@r!UC_au>k}M;!!o>u|3H$W*dqp z7PN2AyZUtX+j~N-M!JsTe-hgrpBEJ5gxrn4&Go3@iVFcxMr_15imfImg$xnlbf+;5 zU&Pz|Q1|ZK%sf0py4~`E)vycB1(Kn6zWC0=7Do|FeLQYXa5&>II$tTg&F<#}s*~j= z#=3)pZ)tty+~E|{`mvW{@=k|J6nO(?Y+;(6ciEvnxm(r~YEtK71mbM0{*(q0wNnC} zu|6zyhQEQ5(+7}Bdv;LAM&PK+50+C$Ys4;x5<%G45DxBT+LFsiP;emBYi zswpf>mWMNNX#!m>U7PpoGveF;g)#{#iqmfJxUjphOak#?2lO7pYX_rOUiyeg3LJvL z=$ANH#*$xdxSOcTudZ2fvw;FkfL3OsxWmXxZj+oGgfj0J+^hq9Zb#b(xQf+-Dny4zt&p=VdYZg! z=-jj(S}@(~58uX9@A_S6Zw0miwL)`fYtKoVcU%_c(@NI4W+ z(4&}uDS1#`q?e9bYz)pTp4sb<+DUX5IRix02)$nbmw#;j52fMtqhb}caG!ZtD4dfB zCQSS#wsEcSO^J={)8k53PWLKtV-do+?;0y$9JaC0gY%0Ju_t}d>&-fFz;zSB1H@d6 zw^-cmsWcqM!nmGDx`vXu*mmhg?IOQAJi<`PqllZ;>g*baUoNQ#YRxt_=k0s$exgFO zh(1h8%Rfc|@ec~(po#JMKKlF6EfBQypW!>!U3RK20v0FwP(F)ztCQ!Y1|P|q_#RIf z-&kt9w%w!jIwR&DJ;qBb9NpZfEvn(geo)~58w#~zP6!n9dm#@kc=H2sx%I<=^gPHo z6e`>@5sD-F)y%$~kF4k;9;kNkCZZxY zhQe2m*j0xl&zE6JZ|B&14akTcw;%iK2NxDg2AUE&r7VvXvW@o<Odmk*6-jwyDvf*HzWlS^6&nO(LiT=I>a z$|k{Qg~UasWb^ur8M=N}Fbbjw*LXj&o$3vEpmF-C%4kFBPiTb6-lQx)n=!vC#+o$v zTu)CWHt#ekiocNZR-px0=aXs+c_lmP9@mxHSp7;S@{!4}GD1rSHY)@z?HO}e5u^vs zTGAsfZ;D~6F5{sENrD&DN9AH_e?a3JJ$ynn(E{~dUUpSf>Zv{wk4+X_u*P#Nw(!8CTX}OAc@I zCfCZrNgdWxWduXW#WoVCq-OQx>6pos?b;L0g;CQQo|h%_(sv4|Z@2k}9rEDGdT?Kh zHhogPCf&2Ns3LG2gb27P9H45)?1Mc%OEs@jR@Jxpb~f+65GTCc(Wz$I#XGF9#J;>jL`KB(rpQ)8Slb*k8S@3+b~G%NP?8{|o1(~B1h z-!mCy<8>0Dy@kviDa8Zs17tcv%zf>##ea+f@*fn$o{=h0jF1B45Ii$>yCdiq>|4$> z5!fkzRd_t84ml5y1BZUm*|JfNM9G!~eqcwuj?!c_p>o8m)YuiK%MjQJ9~1=shQbw9 zrN(;4Z3TF%d0N=lP>XDQ_x%5Q$^^4b-FSo}7;(GKDdFB4WSouA_K^GL8ryi~8? zN1j*(>g2C)nfou+m)az@>V;OaN9lmnQ(mOo}(fg5u>Q914f{raCUgt2bA@<5R9cA`S0JB5}VTl zE(8@Kq6pd@ei3|9V34InMos>C9`XJDDc0H(Sv-2wp4BzZOqdHkkpebtH&hM7Dm;p@sB%tW*g(GK`+k@_F9>dN6E7;u$ zo`yLRjKxqBA}kC35kCyYG*fcoLCgiGr;_wQ39#?Hb}$o;sSYVy~e5 zuyYI;E-1VnK>qi;!rYl5tGttt)eNKV0t{wLOrR8Y#o=Dtp@0@AOduTc%dEo7JBUa1 z>=E-`@+%1kX3|WTCu=xUQbzglzt%pB`UeHOkG3x8twvFCi4n&|oS#c=m~@!6C`26s zi@cN$Eie!EqGDS(h!sLzg~nDrf^gB@jjSLust{Qj@Bgt#;Tzl~eNYhk8w$c5Q%O&o zAW0fJdu6fX>VibO(bl@pepuhz_?H}lz;7-<$!-@r6|hUb*iA+Cn{HpRG5hv#)vR{4 z%YX6z+zvZFgvo$Xx{~nf~mWYt?7{JC2Sdt07#YtE~!n8o7nQEE@sn6MOU<) z>n(M{$2A9Zj{^=&&kTiF$OvVuoW1)v=*b!-VNYQ7h8NVIk(kBZYgFO35Qi}rCeEPJ z2fx9I8)j4+&-+&1X6}+l4aUxvv$_Rk2b%g)%X?sOJxE>uJ{EabgoOowrwBk_x4>=s zuf}|_d#rGO#lf_o5{=?4Dp)f7602V!YfTMP%m%k$;Sr{pQ&GV}OFR{ahyNT+Wi{>z zS}ubd!1~QP;~ee=!v>PI>*W;)+vE&Ab9uNHB&;PmsY@Qk`y2S}?Kgz$UjLjpHl7D*@%RM|$mYyF^8_y+`IS z%WVZ@ASjbUT@!o@M5%JssW8Fm&w#ev9v-RFWJ2lT&h5Yl)2;}JC% zRn7cRQM{GOp=J`@-oFdL8YQA-3JTn+4g^2F0hz{-tkX_i)tZpyt4tt*c@Qx;z$4??3tsw%% zKu21Ip;<9jXuB)v08ED7v7wEK}<-v>=E?kjn(Y z6rX6>d%P zd1yfm8m@o76RrVu0M?31?el9d+aW_w_IEZ!`{WzaJ}8L&4F$QAZ(r_0pdX(_RJSya zZhg#0f0VR`3S)59aeb~?=wcM6&vUw;M-b+9{Pu$jZw)EQtv;~f?eeQT;*v7`b?-gU zbIOoN2@@<@4=0Wnt*Ziy_(Br>)*~SdfrzAIz2$HCpW*k>>ZK8+jed{;pIQre zahQBk)g;Et$pD+7&zFO%QL}{T;t%6ANC4rEoe%_2p(lRzU>wE#f>;4oF#a{|)P+9r zzm<39`b$8hnEe~bdw9~3B)WX>KxwRttZk?cuwX6-1l$#DN{nbQ~dK|%a)C`9w$4;(IL4U_z)`fn{X zb}d@Zx^*7^o&jdMQaXZia zO_Z45B|%95X6YVK)=Jg?1?|pHz_~!lE-SSNgGIZQ$#188s#eQ|X5QqHSqGwH3R)s9 z7(#eun`5?56`>*`VXk%J$%G2shZj{4@Oa!H{8ZUu7|IH@#^OMtn)hz$MOLNuRM>ws zfMeK|dVNmT*3QN{)g1gb?6R_m+8vCc_6C0XT{m^CWnB(G<{zVg{Rai>rPJCqq}z9K z)cV*#U;GFtsr~|zH`M32d!J4mQ9Ct@`j z1QG6Eag_wMgV`_(Ycd6>w^Em!J4Kbgy&wI|VA_o-hU_H-db5SX8Sbs}e*1y2dqm$trV^ao-h_XTc6dxA@o`rbI_IOQ`sL`&T zjC6x)WYIjluRY7duk0(H=#;)OtlJY6yt>o8SsxT6|AvD9nL~|L12TT7nseyXMq9;9 zX%d=6D_3GBku4q6X!$giZP5BiP*PytzVEA}Bzc6Tyq=&=5J7)MYjORvqOmgYsQ@Yt z5BYr$svP8iMBj_T#I(`{wbt|mY3L^hF~fZDwL%m9juLkAeLZb5(pybhbI_ahcQZPO zQ@H$!^)m!MV8^ObLYM1eo!?YBT}fC*ANOXamFLvW4R)-cR`BMjTF*#$q+NCFKt3)^ zn#);|;C40RZpXwZkzC8elvII_83^Ac9y$>vkFXD_2~)fXv9+}SdVb9nbPg6sG9d4T z`NE``={eBx+26-&+1p`1!5NaqTob}bEL;aO8AH97=wF+T`uqol;}hzJf%wZ%NwUp> z^S8-n1{-m&8 zvOg$D{SAc}^=Q*~-QSh5?vi_CjmXg?mI$6==_wfSI_ODr_?KI9pO`@$F!g3k{rjoJ zL+y3Ob$x#oPu(aRE?riWg|d$U9Z~K%-Xj-o*`vpLaM`3U@C)Tx09~5kK$Nth!I$qe zvc7W5ZXJn5Ezht@&!`eHwIJ|)LP#Mqn3l0nacAfAzUx$ z)`AM`rmn&X;Wut?4Mq=Z)Yv!fBb)N?bI+UR-R)WC(Z zzZLn_r*!^fset16D$(tpnDv z#wt2VZzw)1vn3X#HjXQp(|oLK%x!5D_?D#kTqUhIP2-Ku3=SHU5k?z!(8l;CK4H*1Lv_e6g~P_Lh?BVxFNB-g&}P1y6q zkFJC8ccG}*V&_b2ZcAOp%_ZP)bYCB>(@6ExY3j`kUjx-=_08|DwBL)MgbiTJ_-&#_ ztv(wX<85N7rJk!n0Gt;NaT?|8!JD_*%|dMc={x^gD&YM=!I8E*IEss4z(`86#2y!+ z+0}4IFfp2F-zV6VT>BcH`YK!`a^(md1sTwt7+Q{&w1QxH z;HHOYdS7*GzZGOK97^?tU&?E@g3D#k(+3JH_~!wKh{dJ&pn9&{ z>trEI0NJ^LcPPk44Z2;rZwNdc$DM*JdKxM{JFgv86pU|k40}@zJ0oppvGud6J znQxb&uS?Kz;Uiio%t`JH2$)hT(3bMo=YqdLG5P zi32olOnl~0ZgbGC5T-CU%u#K_cEl=WhN171GxSVdnttET57}5|fdXv?hV4}GoXP;n zhe9p(K`b`TTkBL&o|4@u+1O-IJ2l^ABC$30J00Oc{f!uVX~(U|N=#EjtE+EiD{{yT zod6!Rgrl7qlAz_(=@%Frko0n{cDyt0X9&b^wietIs?)x^R6Zwrf+o0OQ>gHxnKs90 z13st&2xUhTbpvw77hHfp_xrZNTAMy!cAC6yKjPFJHkgf>P-_E<}=mwbk2AvUgd{K&eheBT>V_6R?>y{LTAa}HaV!hUZERz1X!&H$ML92J^qU2Wr^7@@ns3DZvL%ouTjoh4qnS%d!o=0%jlmb zu7P*0SwBE#S?Mr)HI{}URenR#N`ap9Gz{2am^gB;$fyWj6cF84_+G-EOP=n+k6BPx z;zv=4j$N_~nhxXa%E^fko`DY5vaFsg#lQJ|wy@r_zMq%OQS1lur5gitikZECm7ta> zQX(SaBf-F<+)-1SM`r4rlt~>Rw z9Xu2MK>=?yiR{qr#-1{egT7EokYwq4yA+A>Yv1q+xgrU zXWoTvyG5_Ec0CI!rWjcGU~~l^6y*PgLW>EV$o8;VHtgmuYZC*uC~h`{f5`06o(Yiq z!yB^vlm{{er*Kk@37e-jiNPiP^N~{01Oo$RcB~0)?qpJQ=K%e!rFV8Jo_RC@sQou&sbJ z#j^O_ce<|Zn=|WJQbTGHzNqjQs8P*Jj`any0O#3};0{WZ^L4^(iY9GV zyfhZ`>hspAv4{rnq>HkUCJli|g@Mg$dSj69$f(%=LwCm_inGy?bgd*-a!k^f{|7%L zGZeV2>^1>iAJZ^7t$c0QyG&-eZL_`NKb8tae^3|!hq6lJ_Z%suO+3c_5rTt$_&Ix( zx&_lVfX`g^BZ)Izx#0J5$AW*do-bsKtt{9(DhkQ26#Y6ja7} z2YV2KC-vY}X|rmgf}}1y!!L(Pl;0Uk!8J_Ip~H>GKxRK*$C$V1pNQJ2lCyvH-^haq z!no>pFRBu#BLPH$k+6qp`nrkhB+h^S7cp5A5`L?ljvb~*gJp(r^`iatAQB6}XV*oY z!*H`*tW>z=>kOe|p~NR0qLSX64d(^OItSZ9w}*HDZ$#)0^ z7StQ50d&g~jGgaC(E-ZCUGf~F+wfNgl+|u%Dz-<%?3dF(M^CJ`4(+(skucQ~jj#|# z7_`9ha%I{(2@+f8VOqkH#iB#6>QHWlFwXQ>L+oWxIXcseqs!xe~be0 z9~AOV#+ab_E-2o6&;gvLOmNx8()dsa~jMKlmHl*#te zA8(cPD9c?|jtWy33OYp}6cql30(Ls3%HFqkOG)8;dzIb3x6LEmh!u_$uE;M(x9;sj zDo%&ATL}4;`UkWD1%V`yQqXy$l_%;+PYCfikg*tCT!6C<>n23)&*L(1F|M75!U`{O zv0!Pbv=`^O$XdxB-Tu-Ip~tp_#8 zu8f>){7y+H;+0{XT06e3oAhGRm`&o!FAAVyN8PRMMSyBV?(Mn44=wll< z2anyVhJD;hMCWE%vQJOS8g1fomJBoshE4=_V+$*9{aaK?}Mr??`n# zRlsAI34p81AtecoCol?!`6A(@(fL?L7t@9W&I{L-W*o&WRHn&%(eheyQ!i1PJMSb* ztHj!#MK!FZv95vUR9o5z6AIum!6akdGLwFbBUl#2`E~Ul?`fqK_9@C0KB#vlvSW!{q@npa9$`nkc@^@jtteph(SP!ahr5eqPle~bd@9~9aU zN(GEZ?|F##iI{!TuB`h5TjViB=)>;!x=%5k5pwuaq_cdFM<#GX-cg>%XID2$Ip=sk zcT{Ec?QyV9+#HmAP*D0C3a_SD^=(WiMs8~zdygD7_l*Ka>IN8CzH>8smq(zzu0(08 zFdf-^Ya_kxgF(DzEP;-r4+kcmpM$-`kKp8xU4hR(bhX?PC#urf&P#9257;q42qi?i z_SFR5+&#?{4s-UHHPom}Vf?m`j#bEEZ&pSUW{c^tRkj+1+4G*-!l8j(4@6BLQY-9{ zdP>kM%!e(fF6kR}kA93t2Xt5_w6!a>GHoz8^knjEIAW3VQJR?<)=Z~cf4n?=)(U6Q zd_s93l=HZG-U7%9k|3C+d1yO*>la4vuzw|-ym9k?P5MvS@$5JLNg#0PRKlAEQ9_2L<(%_H*swrJp;5fsje~=uoagTN?VBp~g7z)H^kE z4o>(hnzU}rz1A&arc_@|VahPHH#d1VtY4<^L6giYr*OW1P*DCG3Z`gy))T7b7a15K zZEuKi>J{!Nb*xJQJ#W|?nhhxS^Y_@z89=5QplssrCav;cWEeuBidKl1VC_@$5Q7mb zBoN_?w_KKY9nG$>&1?OQsGhA~_ga7(p1&d}+>Q=HB=p#sgi6+^!M^lYb>!`kbbHEY z;&>2my+QM5`T^hI|Goh{i&L|_-i&usKJ$ZysP0SUP8w&f$%%h)vNpP}U47oAJ=;s`QOrx-Mj&RG6nSnD2%s|B0P`8>| zI0-sSWgK!gmNt&BdCO2{BtT)@(J(6ZF1`XO{kh#+w4kSglgeg;(gPD*w`oief_apo zPp%)OQWF&8zsN&Bd5Og>3AmYfn0fSo#-zJZ?0&VUiwH5$ zwgQyxw0T})Zj^f+MK1bGr|F7=UI6`G#!Cw;#BK2ebnlak# zaZAiR#616+%b`b){$Crar}%@yR1;D!7(F6lWXMGYu^Ejxd43BieUw#)4cI8fNg|C|ofN+KP144>uKFZ%*#`yHzo9^=(s7OL?8THsGJr4@ zMP)Az%O%D2o#HsA8E4)x>bN`+k5$eEB`E8MJ_qfaZF5-0ujk^HyKocCt{(8W&h`#K zQvMlzf4G;D?uOu0_KJ02UJwnPD;4GeUL*MAPB8_SP+pVN3jyoAM&(J5#ScH%mJ!l5 zr4fW(e)PBDDbl6@kQxS={8_L*1f!zIXgFi>L?Jm;oCIx_qft5TN5wrOJ=d;xVXfV{1jzvo^b@zSXmmR2KO<2qp-~k>Tz~MG&nfPn{W-GHU z@=WNrj!i9;9d7ZI@0I}Iz0BoCP;iLJfMIbROrZV4Pi-)4y6)W3X))^XuH3l$1aMXP z&$DuoVrMS=hH{~{e%O0TV(W~|6?)2@U-faLHT}`nUotpB=THse07I8*74m)ZR~2i$ zx^KwNYtCr_s>MG>f$9$m=ADS)c%9U~Lq^mb!XS^@lk4v|+WvgDE>r@Lyt}37>7fcT z+0k&_91IFyiW|JdJtZKsT3Q}abX8Z}yABm(Dn2Nv{|$xvfx!ZFq9K)%uaEIs-fC6| zs4BzMmFd4}ZmbivbALRO+KLboMwz|6*$<(NxzkB#Z+!_Y>*rolPvem|H`>esJa;|f z`23HVAU}g!$}W-kCRu*XOVKpY(4qXozifqQN8-L9UHZ83LV~Khk>NS$0bLgtCN!Der?*x)%{4!b05Z}J+bU%)sc267 zqGXx4VVtBDV<`oB_863D^)LJEpcDZ8&rtK9i|#$E;OhsbUaD`;jU4Y$LerzB9n~f? zRg?RPV=45n?6cq6;3&fmmIx1*6EKW8-VR5(_BcRZPA2}fazW}pC>)hq1uCr?*v!ec z{l`dQ^SuBl+-GN-NxM-lU~SVY{?8}N;HK=eDduxrP6OuNJEtv@dt{p+M!@bBN9j3M z)W(kw3L1YyA+G_smrqeO?#z&IKDK2zn4ZoxY0#Rk&QJjxxKvD0K4H|M6;zn$<3w5r z6UU7jo*1J^it8}0V%VChGG=^j1~B_56th5=VK zHVbt=0G&kQOdcd$MUPWp;+}jrHmF>(DBVhe^&BXK@&46 zMrh*bAzVt*MB=eEV81W3J|}t6dP5i{T>X@n<;9&yv879nM`9uVet&$a6Hl zy$sA5nK)OaXUM#K+Q8bBa(KO(tzC$e`S1M(AKPcRW9oB>ppUBX?Y&@hsx|vU-6R>Brs6As5(0(m0{qBw6N>Bv8 zJd+{irHUWWa2h%!8cng$)TPS#ubK|%9xDENZXPa1~K;$E~-b|I$bCcY8A zoR2i}70`{vFeYO|`~rbS--3E9O8`dz-N>8q{L0nzIHiw?uG`XG*8ul!MF;%6^L6>+ z!R+0v2a&*r9m&`jhFKT_olxDJr={!r6@H+-HAv@V429GzM1z$1Gu=-bbp(AVtyT-%ucqd->RxXfXzJiSVC&wEe>tk03I2rXW9RfFR$jo~k7hQxs@>ErlU&WC5+4 z3*YQ_k8c)TnMB{Dw4KQJiNq-Z&_{vILT6O|eEl&|yof0C8Nv~$_F7b|U#kc{k;)wo zL#eM!Tj=@}zw7Wa+ij8a!XF=V&ySA8sPEWTrvg77JXF}JP-|`vs*3o?XI5;CbjIgx zgnwkyNlGlgD5SWwn2dWUYPH_P(hjs)@fWv!jhEO)@TSA&{i}2HDaw^A2!N;e7YmCO zmGMcz!C(YhaLfI7dDc@!3<1-d^d#Jo`|7#j?UOU}tCubNAZ!_C2P!ivE`siH{#%&u;jfGHLAqgdN- zjRJZdAX5bBHSl?On6E@X0|f#Yb5D9y)gKhJ|AqqUbyKkvk&ANih8-0*n>)AO^MeNd zKnEZ}oNp;*s&z$tnt0U*y<+o8e&(k1CKK&Anp$%(d)oE@T&hk{&uCh1$?lp}9z z8266zh)^l_ZvW1h)a~K32XqR9r_H9gwq_QxfuwhuWVjG(#z;=v{wKJGEi@pYajQ3W zqNEkn>2=-GQiw*mn3yhX`-FVh(eA#rRPKJNru2_dp#OtHOWVEA=ne#88%5=qOSofuFJ~g1>>_dE z2Cd|4$bid_*F%^q{dXd6+Xt@;B}pg`hC*y()Nb-r$`>#b7IQ?a5figIp(~V*rnRV0gI_X|uBE z7c~l8B87iZs-+J1yct>=2N3}iNkBXb>xp9j5qvvIM&6`xG!~Jmf#(!B2JNk9J3pVP(yw!$@ z`$B?s*HbMfYN#+-A)58v8qJg+zV?HH?%z-t-d2ZQrH}9nz7J*n8me}kPpxF!~rfSptKuYC4WSXZ*o*Qtg5VT8jZi2(VqgXCft-pU3iX(I|=%bvCMCG4H{O66~ET z{$oQbpw(%f4~xVHiVzB3G_wy0Z=|h%y6FI=+a3)Sb^8CIVCGC8ef8(z$YqMTu=;QQ zh`B_%=Rc2gD+v*K`BZ-j$yPW5mcj@pPk_>AVcBaHSE`LS(bLV7kg!%gBoW*%CKx*> zw94cJ5P)UzSS27^3gekGVP3ya>ltacY zhod?TCPay^(8OHf$HRXi5cb6iR(I`_uA?PiS6L=r^`Ox9BV_OFdZBgpEOfc5v+BP# z2f_3Q1((yNRZKhD^3;aw&LH| z;fWKYHV_LLo^eI!XLlS?E$Tlg=>H9c!?qaQn%#Ha2k*MFlXy5Y^186Tyin+v(t+an z3GT(~XEWV9H%i!Svjn$qh$eZc6LH6sRnIdkGy!VhnM$Y90NJ*|`}ciUnKRQ&Bf~C2 z-H^SLJU{!VA5W)sh-g9q+)i;_Exa~f(v)bmi3Gq<(0q`g36;}jbW+5&QG!7zRM>VJCEhngADoQf^u8y~{ulv7GM`#2I zOsc4H?%xups%`-+?nAcs62IvE)c-MekAGpdQ5?XtmbJ8H+pas?SoV|cTDEOtxt5J( z+gx6@{q(w5d%6GN`#JY@U)MRmqlZo1;%{P4M=}GgY_iRVz&z(7DOU?C;}Qq6o{1fs z;qU@d_9_XFI$rDyB`yAdZ{aZn+xo91zcYQHkhyT7YVVfWHXN^6!^>jBSN(1KP*oVM zQpOIH;Y`rTRR9#CE=_y==_%sRzzG1qM0oc!5$m$8LQ)_Ij$23HQ~yrE@NXy(zsazz zq*+NnLg{#HyMdvM+usCJMdZu;<~hY7&!g0Flg_{1+%<`24L<#m_1Nd$Y%-gfKO&HZ zuZ^Y*&z8jr;L#Pc&suoZnVCITBhs+WEP_<9#nFkY2hV7?NO7%Ja^nkG;Gcdmv&$Cz z1)t_@|DSj#&G)7p;#)0aGj6eAF90W>l14goEW&7V<^BxQTnD&uSZaeul7?3Cp7vu+ zaEF`4UN8(rt%IujL<;}yGn`{(5X+JVQB%4*Q#Q9WV=8A*ja)3 z0|jg}uG%KB-{3`WDNykVtQGu5qD|{64|Jr~Ygkd^%#th!J$cYkRuxbu{Ru-ARn^%L zF7VWX-I=|4Skt2D#8nON6pa3c!klg?+hXT7A_Ig3GHSWY=Tm(*nMtP2HhE1D(>Hy`E>IwDMVQ$JJ(~`9)M{$sN zaiScxr22^jbV=awi5RV@)O#O13gNRw9KKZwv_fjJa$S~$GQ4&rp~c&OB3Zz~c5~+ZY(uqbCN< zG0j+IL%VxAw;g{`_US2xJEio}KSqJ&1BH4=QBfRuqZtHaW#tUa=m2>&FLcrX^PB^} zW2hy+aQCpU6o2GPa(|+abLu(sl~!JGf$pNSW7C|8ZRFmIPCPZfQ~2+1DByA>la@v; ze??BgytSPBjzxY&!AG#v_!)GCJXvTUPWv`n=_g&VHuUEWbzg&(3@=4W7$d`zjIiAX zX!MNDo_m0}>%pWs(1ernXfeI+J*3ZN`P0}=ZBeO1tTc*Chi8V-*FQ?< z>vGC1smDo-8k3HrO@IfBb^aQV>=Xx`knET2DiW(O?0`@O6{EtJy@oxxA{oZs1fbBhlA$$lA+`xM=|g`%_$scjiY*u)@eeJRgAzb?f)?ftRE-{ zM97Y)X$kpy=qP0ZP+#+MrZBOb9&SN1E6=rD#qY}I)and()U(<76-T}vmnRsDeyLFO z7{~Y~oLYcV#yh~@^iIL}ZzzN`A|RR9O+0wmb(S!cyL)?!S|VMh5axySi!%3dOgKAj*k+>FHcc z?N-z>nTXKRdz8<*uY<&v#E|1|C+IRMoCBVHD0HHuKv7_k6^cE^%sB0!+No2) z*obsGAZ}c@oyP6;-TbMK2e_nZr+wqslzrV)7js1OtZ$%Lk}^3GZywnzTs;^e8ulby z9;|TT@@fR_SYegNqFVL2{>Lb=eV~w}EOp>QfRFVcOtAlDCh7Y;(H)Hnf_17;b!D03 zGn+Q!SYS`3$dB#{vW1Mr1^kYUCFbY`vPrhU^al|d-C2_6cM2wdL*eHw!Bggd;BdWy zEmAhda2u3H9Oe#UmMDxIGL#z+Yb?SO{-=d4hJ2-8_h+SJ_%(7qQ7f+?YjV6}Ov^~}3#pZ1ZcUwOMrS0>^=s4O7|C$`o#TV^WG88Y*w zx6yX)yV9*~)Re6yc^u!Pus8Onceo_ZB#!8BP zJ2dkTZIlIKj-BTB?3|G`+o{rErH_i4o^f}KffydG!8`NIm5Y5(sigciZCA9Whi_PY z&fOCI-&s3*t+9fxVS}!8a(a{yrD+=`EyX1^wT0f|Tb#VpGJIKS;{P!U>>nr?@!8#O zjuYH!6E}O(0$@0n2{LVbJuVPKa@o7vwHX!T`Ms7sJ!pDf^-)W%HPT-z{(L{9mf3to$2@R5Od8c6dHxvwGzDyl2E}X@E66RVC8c0rzDZuv*TmMY{t%we)z#&UwZqvoo zeudG|lpH0WD!?08e1%i3X=gGPh2-|@5bht~qH-Crm_^}R$-&Vhg#l9n`rm$3a@D4s7!0_n=>}g65Kz?Aip;m0Z5kd{g{_VWsZp$xmfo zC_q_pw-I`1Qone$-d*9|3#pY}&3BGkX$_Ohb(D~I8KV?f%l}$J8^;F~AOptARB>m<&aN9jH)g zztU682D(`T3W(2bEYFVWbuejYsw>oSVL#YRbR0#F|D-xE|ShG*A%yb5C)^-hDG z%YGRS9#%WpDaM!cDO$niK>(h-81sZ)G=OnFBkCw>xD$)5n+WMxLdh%PDVW@b|495M z?JQKl>$I&aROf1CIUCnSP+v+o`y6Grvc2M+Kh6&+RU{89yML|YnezjMnYkltEZO0^ zVYT!tf*aTpa4jH!a8H=wo?k&qA3Hopd*l<@xtQ)vvrZcZNid3C889Z&izkt6Pq+Gu zC79|*+dBpGzoDR??sdsHDPVzl$yPyf z1#9c>hEZop=V$z|moQg&@Dx0~{o6CD==Cv^Vych|fU&hulGrXyz8Qf=B3;V2 zs4!tF@izNG=WbS3=q=44zS~r`MExmw)?M7VjD6xuFdViTku`GdPQu=xHD!<>0+8k1 zMW<;F5#kVxqT@vZjs3Nnn43tI`l9q40`jT40xgP)OJUco#3k8D9AnZcMx6$A6VhkCL&&`nKcbE8NfxFmeJk zLC6?A5U9ju1DjVq$_`-+LG!9Fo4NF@-u5FyLlD29t8*6+3|Q&1rVd7O+5}BknmUn$ z30t=sv0BlMfwfPqSDt}E!U^49J2^)3N-#&Q<5eR>E>(5L!{BQV$y(Y6CVQFNmCoHN z_pG9^_SDs#BAq!1S_i3*oaxsv`hd%&cu4^#Fm~zYMBYE6a@~4ewEI@L@euL~7iOQ% zQ$h1|NMkyNj|mKj(l6ig&w5Y?K#iT3Cw#N|iFeg#)A#O`&LKl7ZrYlEFV zpgZ0vSpE%#ef;rzAB3pKY%_w0xjg@~gf3#`hPtY_YUpjB68nWIa@#DblZ2$rlRP6L zMsKzNj>3eb-`1{Fg;nwBVissk0Mr$B4NR);jmpXJL+c|O^sl(ES`0{oz6E)cGmqUd zZ*C-pw*9851eJzKOn--00?sJL)Y%5Sm%c}J>0_qPdcXieT5glLjPf5r$KO85Sk*kk z6_V-$EkP{47pTECSLiPCPsZIa0ea5gDHjVGyhsghEVOf7FwcXr}iA!)&! zA(`@yF_fGga+hgfvw$1#F+FfsU{)!#ocZ-m!Rl`)4LmQ^a* zw<#L2f8T!nRS1P7zOnJZzNh~N!TbH!AEhtXydaGJ&^yzSN-x{hm=eJUwb*u)##4uh zF35W42hBix*jLABC6;E@#{_%wPI3`Zj1Z)+ePx94BvCF=LTBEkW9F2w@q~JLp!cV( z(K^u(!`KmCu>nNk9#?gJ^8P2l7nAQP88<&VE8XB*EcVF8e4fhMV!;+`!qaJRS zn-iYl!Y|7W-!o)x{HBJ9(p1aaMuMclMkD zp22Wym%|Wfyk<5C9PZiD%NKWi3~GcfpM&4}h($qzzxBqf9A2tE*Mm{;-MeO}%?Nb9 zQ?ULU3M(}xGay^o3!qiyUx@U__uE}%ay7T9Sp1up<-icQs@MrhBg6+W7`FHh*E|kpDrW4m?Mnzrpo!oA9SMC;1QCzr@!pfT8bch)|MU*b` zm+)55ESg=)?LA*6QQ1{`l={g8Hwv+QvA)_es0U@Kkk6m0&6LeBJX-?k6TiiYHolMVuG+`~Xmz>3Pc zG`e~uF|eHQ@Vwi?)D__JEbc3_XPAJ>SkA$-N<==s6amu2Xk#nSm^BVwTx(LOxmSnes_l-T)OUlr(pXx z6slobJvNce2-hY|VeBE+)B1S!zhK78bQZsL)Y?s=UL=sXlABbynps&5fpV-2la)on zl5&|9TF7tT28QrrLI4?gPpSnk!fM8d05VRY$Domh75D|nr8($w5-t83P0YOljydj1 z(BQC#>smD>aqyvSNa3~wVu}~UdS{9@zVmsSn5bt+ zF*l_L2yIXVh2Dy38kRwf{e!E4Nsj`PIafDqOz3b~j3wx3^K&vu23ADQy@ zk5K?VP+;Ex^Zi|+H9jDsu=GdzB1oOp(htt(Q_dH8>Sv-ATU+)Rd@9Np+6v|%P1gdi z3C7(vCa3KF?T2F}AA?C=k*A(_3U+@(ArkJ%H>6NhS~eGy1MC>wJo7qZbS#MKTDUU3 z8pqkT88K0+a;>}>fs7k6Clx7QK>fgsCx+sas39LRg1Do1EMV-@a7rWGWYmk_Ebg_R z1bNZ?6Fne}J8Rbo;#)Qe(@!d%FFbTY&I#_LU3QNas=5QHuS&P+#+W`X8`1>MF?_%; zt7U}EmOeux_9~&&P?X!+YaW=Pc)o2B-^<2zBs|rEX~Fr*&4LP78(xNLl%W5zmN9Fv zB;amc{_JR^V!&(z!!#N?_38#C4gStgs1P~VbGKtghUtORP37SF-nR*Evjak;t3vB< zlWj{I@V)uwt(1b1SY9VQ94PrMJn4r_{}=^<4-^KaCovU`G=%ZQ3ooPkNda>p0sp_B zX}nh2!ihcgeb_=;0&fRi&$I@yr5G|QZ84vRS#C%(%1-m-CZU$cM%jDcDcJuFh4=g} zNXG6&2hq^yJ!lj77m*_4=Rcto8yAYbiTNph2x+{r0B9XHSUaP?KsJK^+%3J4f;`o4 z8+aIt0QtS&>44}rf**?$PW1Dh$1*$yyD)zEhZV0v1u|4qL%bbq;nfhM6rVNDmEqGn zo2gEDtPiaSR}6zN-cUQcF*t>Wnt}nI6;y0?+1X>rL1|YB{Z?L*4O8ASnT9{sYG9LU z&5Yl|`ud>L{TbJ&Z!aikDL_N?+&J9QCU-QbhVUuZRKVbX?2sAfmfJd~H4L#!85%7d zmZ;*0{RJ`fW)X~JMu4s`q`&FtPhGoZ7Ur#2j)I~VaGr|yWoOrMCnP1A?mqPpq4IGs)j$O}TY^0oMT6q1Ms5_UT8(v{d2Wz?5?MSo9qX?f0 zwh}Y=YUxxXEQ)SHHm1IJ3J!lmAqKD_ZkvN5;|njv1jf{JYs3}hz(q>5Ds~l-?~WfN zA-1q~UWrwX$A6d8$7w#*DSoxMb2D|aZBF7v5|cw900mNvmJl@hAC;Wn46 zGrslr%boz|F4?QUfGXxt>p=A_6{aV%^}YY31FyJqRH;*C0}J~3B})ZWxme$MhIjM^b(#FtJ6+Mlem^84S|q_= z(-Z8+L=t>p*Nhk!*P=m*<%p-I$>v(?k78p?QR$A`UXjo`)%xElIQ|Ur~v}3wt zUX9=3Sb6wv$h*iMse)HDdytLVZ!UukRS;?;{884vyR5sP;8Y&ej9i)<;bRAxp z<^Ln=iaY&61x18gADv#6;}$^i4xPUgxL7m!|mF}ap9qf z3(ONg=~iK4&Z8VmiS_Q>PRw0E8cP2(_O;IXfDaNtc~i?UtSJ@A4N|QAYqyQUA1Gjq z@U!;z2xS}{aneJ}Uny$U6@dh2{?wY`odG-Vs!xd(vU&`wJk!^j0gd7^jKIil8`)Ew z*9!`p$XXkDa*iE%r{MHA6yOp+FWnHP@L(~prZN7kD#uQEXjzXy-=;bZgcAtYg_PGO z$-lN&>hKff&OVznw`PBlu>Ep_%auFpouWG#aSx=1^&-BO2nE}e$|)(ysoJ&Ip3wN| z>D7x#?VxtN{XzS>fhO8SoA&TmaW>Fpb3e_)k|IGFB$Q@ojbqcTzF z0Vz+~KwyVgN>R4-Osd~A06?OwwDj4n(R2L~D+1HB3HR9prQEwXEsP9nek(ux4c!l> zlNkrXUlTqzh$W9h>Bv5U{f|`zkq;EgmgvwSC$9&7LntleN?D@iY${ds`j_WcD)zsJ z=%EXA#)nj07%^bvpg7{MHb#op<0d){(UQ~)p5()$p|xKS*QGaw9ixn%ZlqAU+gYb z)oN^Y7UTL*>?g1)EG%cZ_^l-~Bm>oQnvF+|0nrNw<=Fz%W3O{bG*Iwk46c-#ORI9j zZqjA1@^3(g@JE6QbEl^}*%ASbMJ%S^rPNOSTBNmvXqyHEM(GL_VeFx<3 zks^Y#a}g3cr+nVmF?XxL=Wkdy3{}w8{*iO$MS<<*}<2r=2BGZ7KlH==*UGg;&$k z<6*C2!I?hL0byaoA47pPLz3Bz0;v-3xFJCbc{4;i51VLs|Fb>@xX-o7Qu^^b_cWaM z^Tyh^t~<#@DNUo!N(;2XtzmRd^(AoKUc`@hJReH~qo%Sm7Wkjo;;n}^F`GMGppB_r zFHn9;Rr$O{I{qt|${RFjgD9jh`VwR$u2<+#;3w!k!&frqXpHIvX8!2#0y|0*;|YhS zW`>jRK~Yp83MNyY8)W|&1+fnlxQWnUo2%rNIpzN#GRzcl5jleTAH0y}7y8D9Vit~c z*TeWE$W5-c55H4z{Tm7}i^R2fjLg+As)XlY zFaQ09TxjIaAVqTdR2r=8onc)8o@5(%w=@Hm7UDgMHEUD`I+Nw8Pkz4mTa%yvhRA0C zumIIMe`Zom{Ju=qOS}8f5XMX(oAhusMq})B?HC=Tf=RWJo8*go)K|foxRdymDRxWH z)5pMYpEuKA{!SCr1jvwx2ovIcjJ~C0Z&H&AR3$5DeIAs=UMyST9<8W zk1;isoWfEG$ehgnrUC61fz(plr*P8gV#b3lz2*9!vEYC!PGI>zMnU`o1;y-9G;Wi9 zr&#E#8YBUB#~QK}=KXW3n71gMFYrn5uj4G$(-;C5J1t%8EZ^Jz^O`2jB4W!}S-p*^ z9TpDirX6{w;Py8ZRD(FMZsi2I#yvRmVX{uMEl>~wISBL|_h}I9##;F_|`(GG8C%iyX7Z0G_p;m$pth2qW>Jx{xJ#?A1Jst;<9{wQmcDNkN^6c;+U>^dRv^XnLKi6*K&@ktrte%=m z4FYM}M5S{>ejHopPig}&A5=NNC9HjMt0;Q|=8ytr_w3Un^<>3jD5?S(hme|ohD*ieiS84i*w$mLr_ogeN9~ByVftfWxVp*rhr_0Mg!j_m;ZM7V` z=5C+x$3RQmqV|X01Pm!5G37yUi+3MzK;G*e%Qlm$yOkS_ZFM|A%bOlLFh${t+#*T@ zixrvbd_VN9;pX-31nf0Vn4d|5$!XvG8&?y17+4n(Wtmy}bDG*NswmXA=!^M?Ac9YPJkP zglZ_eS!09|R{yo}S*Z^cbebtun$`(6hBpb{=LKUA65-71BnnoIS`8$=SChx?~>Y>O-v0`Tv1Rt5f@@2ri-s}XLl{~JhjlWay_!|mGv`{ll_SCA;5p3*VBkwYC zw;~87_R6^zl=q=64-$@3<8jC6f5GTf(lz=tZK#Y2uE4Nm4Fk9JIj;`MsvF#CIqExJ-3Tm|AG z??k<1q{4Is{*uVz+MJ{K`?{ErLtvr>^kVA{K*yq>ccSW$h1?;YdJ}AX-zw;`nS_07 z<2IfnVQG-P*9jc#C2*tc%Jo-}TzQ;`YQIn&EAy)}xc_4x2N=zfJvVe|R%wkDQhAYVIdx^E*F2mWB2~05Z~I_m#QYr$`B(5n;dw@44z* zFwKbXoL~G@Q7B&!Oyrsw+K5=Qw?eJZ)8bsID>=+Uwq%SOhnbd!1nYd+z5%RQGtrh| zREP(^OJ!jR;|D=HwGir2@HUslR#x_@#u`rtA~}-G5exmX?Ytpcdz&{sE3 zGgEoV^9f|98dAhT2Z5|32 zxMW)Q*6AU$gX~JWtA%*>p($=Qja@!7@88tTmXx`BdY4E*krY?>~((=pL(a@ z{Wlb%T@Va0c6kvwnD=Wn^+}$g6Ed@G@vNwcVW8W4Jz*VN?OgMlm|3zz3`%GaIf5gr z9zlP_uB!TIJ)6P_lDRAZb@a6z(u3r7WJFrN17dU6P~=1F4kib*b7?Homf{x}*gxe1 z=5XggaY(#td!N?rO6JTNQBEnGafC5*eMgeQfiz*weAGZfIjut9+F!_#>fODjfWmNt zT8R>80}oV34~l@W;VSGiyU%KqP-B328&00P+f9dhM{s8}P5?5NB!KY4&||`76>9eA z$DI3C@vhwTDWQ`ak7`(`_rng<;beDH%-2k6;(7vDNoBY?3-`cE$2}ZTH${=5l^R7u zp@)Brg4_oRzXFX7Iljx7bO6}v{eKkfa*6^oyRhgU7?ob^EVXK=dTs@6N?{82B?0@+=ffK=h#D7K+4$I zYw;MKUh^ADfSXD^mDiLm>;2*58W-}g3L?i_gWTMSNMrdtK0j;&^yPpAkQCKVv)Pz8 z%DnhDWk_6+*5isX6v9aabWIW5zHTthGW-A6&!lEkthKr@y#u$?w}&9BTqT{PHn~`f z0hA5?JR*EwgCd_a&MB~Z8FI8lq)+5O1(ckRd=qfDg*fn}Lv27Q;u@t1rcTb+qD?-{ zr240E(~A66J|Ulgx_t&&ki0_)J26Jy`j`B%twe?KyKtW?XAs3EmDh9zRu5Oa$l`x3 zYD3`zg();l2s0}~5x%iNaIz5phRbkQw@+TR?=N}buK@-Xbv$Ww9(M6^W}sTNdoyRo z8P8q4Qq+kPVt2i%0lE96X|wMX{Qic58MwrO_VYMC_h)$KGZLbmrjD8>ZjB2mD%Oj^ zQmL2H#NZVieA97;NZ!n!@~>6bmCZXSfd&KHTpgcyxfw^AfZzVH7Z-1MMWc&?c+jSy zuFm_8UMuVLaqP%m=5t!aI=Q1%5B2S{ya*)_+>9kGY>UIc)Tu}8C#p-PubsPG3zp30{K|B@41kZkQbIH-TSoQkb8Jq+ z^G{LCgRxG;%Bn)g=rg`;jTRFchwA=gRYCCsg@?8llmj0+C-c&^r|?X|Tk_SIxk9lZ zHW2WmptvN=_-U)J`Z^8eiR-|d6oOzYX{vTnAW*gcv$~swESzl>Z0JMK@{I&T6 zXE^`xEsnA~n6`{q*-waLC{k@~&g>>1Ix+aL=As<#G`fe-6d~9GAFg*WGA>eN)bhhCP50XAUkxnq7T7`O^uuQJMzy*>dL5f;NIvS-5 z$N%@UxHh7-)K;A@zw_6qbI!aQ>BC9??58FUBlBFec%aA-u}?+D+7(=6O4Iw;K^jYr zKZwsR#r=8ltGh*>2Q8ertV*6aj%iZx?0sP5@g~+1(!DCKU&__~@QjC>%rl^Z&Ig7Q zm1p_s9+o9?@z6@inSew%m3<8cBww_LmL!oWLQsTF2N69ebrsjO&K&y$rk$tsUP7i$ zm*XCl`ez;BNT~S>9Oq=TsI~(gd3cYaze?$uf_zDSVh2XFV%fgK>111F&4WU4H!$l# z*mTstBXu*!A9yn$DsIz6$s0iY$0#U&pm3|?EbRn6ZU;>OM=f`kIMtR3Jxf88LGE7> zkE*RVXG=-@ddA8m{4yJ?MiuD>n28LokPbTx6Eb_25Z0g$nJv6i2>crg^$8kqQ*SxB z?fc?#$9oH=>W>JHjbAhvnzO=SG(^4#T(vxYB~oBZ7NRs-Q?dkErOjloMwb$?yTdr+uNA!xnj-S^|KkRb1E~^=PEx^{ew~Sd6ywp3REV*) zC~uPtj|z~W3o&ZIe=A>BXKJwD@pqp8$0(?Lpx_XmkZ8fghFWR!XUa0 z7ddnGG?{od%I!5R;d%De%H5M>LF0~vA%q5F3@9rX7N%Wp7N;NlticTh$~wF=F+qJ) z9)&diYbp%}M=_<82R~x5NhcL9{cyN~-TS_$(PQsTzR^!hl#}quNd_>i)b7ZwWP`FJ zu0p>jj|ufts6qCm+FrL0nRPE?nkaOQUBTG?NfdSQ^ZrXO9UV!rGi9()x7>t9ARiTG zlq?spIdX$loMWW;9hvTGc;Kq-b|a6|&@&A?Ed}(mXslm49H~)cYeRdhCB8H-&f^~| z;l(S;!7S@N#=PyR|G;eT{xJ%wA1IjUr9Q%4z)(CaQ9A-s}b0A~V>93Y#H z<18cX2m;So_2OEG9xu?+H}g;Yg!?mHiu{rIh(U!kMleh76oUVTLidBlO0>`1@HzO~ z>f`PNhQ`Y(!jG#B7F>B{MIvr4nfZup!w%D1G9_Xe)cmVU3b3CY3zXbG{3wXWSE;v4 zasaw^;@FS96kn*Fj5n^Jf9gaIWNLUVgy_t;gZIk0&a zYL`3J3hvqz&4ldR3`&&rNS|m)8e>-3z(a+BvS&NBx&b~I<5hImb3&wCT>f4arGT7{ z$%8OMM8&GtE>mG)GKFtUJHDm0@8_9mqOm{^PG~9=9f$?qtyZ zf{f$r)9_q=rx5Zt6fEdOUy#B-*ZV#+MI^GqDY!vi#0TK;r3Skx(F4ACd63tR z&?6Dna5qJDk*$vNta%H+ksM$2#4LLv%skOxv?YLS-X8M|CjMxmil~wfsM!AXo%RBF zQJDh)?0& zqBkrI-__l#uZR4vCA6u1pm4=Jj6sHTEzLUv%BELx;Uu*Omt4S-`JLh_tE-X10{&!< z%G+(a+HySBRQyHs)LeMVhN-QmY1E}eLg?R6=#=Ad3GfgC6GK}|s#>tq zPJFrZ@-vMw#UyxN2F@Aht!jIRt??XI+k{fkjeECt6%mj-!Bt>0l)0jQvOJcc+sWT(sags4)_!z3VOJwx3x;PnX(#4Wrave#b)Y3F)uuZ3+lwkvLC97ZZR7Bq^5CLN( z!5)MtE!+X)i6JVt|G4r8t%R+|&fd89R_h`sd5SmfcQ8FtRX!#I_r}f$2F=L?7$;e~ z-QCE9*P~?A%0EUy;{%1z7wvG1A}ysi_POK})wTr0w1v2E#^dr{J(KSR26*ypgj+q( z7Bdqt3|TvNxzS4zkiA9D1yWY^DS`z-5fRC2?-auSh5`pwT#cbcUm!!j+u~Rd2<{I| z?g8*>zujzP7#95^tk-%!xVu0oIbl3cY{*@jzW17%s2M;$v(ya9i>9QS2BbMcAGZMfOqL^}>fDRdBu z=xww%dwu~uNfA6K%Gt*b9j^%}Ztt^Ph%fpFd{s^c374vKWF1?7&rL-*dJ0atHYW7$#qX@Ay;GwPcY#mQ>1CR;Noc zF@YNEoJss0?#`mxNp&0%z}HVP_pZXB)q5;hSZ15ITm3D)s9Ui)rc`&T4@~c>RrX%_ z?)2LCDGSbimE}sE%vyhXczi)mC@?S{9n9&snJPV`%fnpU*^(?gO^iK;q%&9a!0DxU zYN8kI_Wj2wXnml-q9};oiky;ss2ha}1qRj>iLkmWS5at+=;==&#*kvIf`qmr8#1(X zE{XMx_G!JDQ;N_=HcDL619IeKLr^#vjw5<|OvI2u#tl(d2rDV%Aj9lELrOw-E5Qd`sE%dbOGx|@ z;6H$a7&~cc)=OeA5}tg6*tj5N)d5v~X6Hudkp&v0NA7K&g%6bPiq=qV4hNpZWz;7aSjzP}}E=K7jhWAHy~!L}mr=!rE3HSA?#?HGPAg(9yE&P*ra4B%a7f zE@4mzx9DtD7xB0CY1FD@CL^;OFx_J>i!}Rq+kcIM_6G{bbAm2pTdqmGex(Z}(p(2K zB;;UybH#Kc9B+#0bWpNoDB_8gO894}Vhealeb-nx0|)W&U?b8`o9d;XN;Kv+-YG== z4Tbczt~qhGK1ubcJCzcx3;9l57K+~kcc+2ntJ55cHj867rZ|rkp&-ZT9Cwf~bp^y> z_+Z#zmcK>XcwEGyC#*V! z{>(bF3he}0CD(zZCU(ubwtj~ieR~jMpY?QsJCKgMQ>#Z_{r+SD7BXAhmYMO7yG!PEz*`=T}b0FfFfK)J%OqzG$Q@u zQNu4J&{f45j#La3Fra~INV?@oSP_f4oVZEkIAhM^>W{`}j|&%5sGs_4F+{WIQ4i=N zWB;+Lp!0!(JGIFC>#g$k=9dVz#HM|NZP%8Zy+g;q&&EwmM#O}ugWQq@&G}@4#A%-T zaq(XYk8lTV|2qpxzShumrg~&J+3%_iUaqi>&ly7ZL zp0J4`{LM_vXa+6!(jn8{!c|;8pDr(DMh3|^=^@QwW}pmP_hmX97@L5=8n}Ln#V25k zlQws{)OJ@xDJ^69_R}AvVwch-A)w+Q$L<+w?R#^UEwoFf80r*QYn(lJcpO-#$m)H? z9)NiG^|)`-Eu)3Dk+36)q%IF-Py0pXYehprS{* zx?p40G&YBYxAsDg0R&$!dmNk%S?Eh*b1yz)xI7=xS2fb{sf`IfYyrH`Bd;T&+p8QK+1(F-HB>ymUYnfgwYFFr{2@m9#YLQ@weLb z+)oI2F*y$VWIw>K-6sCxP_lN!GWB-4O`@=R*DHNA@jRWgTAy*Zm*)^hW~sI^K@NKV zk5SP3K!F{Iw84C8wru7@*6_9VFVRGxAPT>3?xA~Jl%)Hb@8=J(gGM0pz|8VjULhRpANcuC{0q;e5VdHmkZ7HDlWj@E`{`s($UJ?^V zoeq|6z)jJID}zBEB7(dJslx4~R%(lk_sV9#!L+5OeaF6O9JmumdlLQ6T`us5i1Oy8 zeaoNws5}wx8?n!k)3d_qd#2!S%SbA*t!G(+{K}T+sj)GYba#9^dRWPQ4&7f z=|5$1{F}fNN|RjR`BxeRS=OuCS%qO&)?uWNGCsv63i|--;#7au5CRk0k!H&>DOmd= z{`?*%rqlTx=TFC5%s6evXSwYfalwVee~g0u2MQ}RI@x`FtujYEmL35+w+Y~sB0pQ% zf|8F@8c@n>oLnj*kOAk=*~$?qchvbGQX!Y;C9+0?W@CNeBNb+7X0|);6ypAd!fHqS zz;Mr2ewe2k6tbHGw|};W1pUr8ny8~_C`wVnGaB54s8;7@S=dPVU(y*yF;~TG8p;s% z(qdnTLKa}qWdL~*mtl`@iemzfFuA|zs7FvI2#>(k{&0kxsX}&SDmom)(Po%4s@I+Q zJ~4Mco;1#*FRNes5kTLD8AD}yn{opa=Du%>-Gb5`CRIC*EoQGc)SpHQcR9ln_+61& zyw{-EktEN)rl_G>DPg7!v4U$_SK;4O^IaPVC0*B;aj&WZJwDO_1? z9`pBY^QFA@7oy7O>TDD%l*75zKR0ed#WI7x;p%q2?_1;C>6xgVZze?%gOe-$*W$hn zK2SjF6j8lDiVX@WJAeJg*jFu8Qj(yxBbG4Ml)6JQ9#PFVZK}$@y(n%o=L5 z_ta)9%a8V%kGslYMBy7o#%69v;!G}6h-*|wMGSuBuYhx50r~n9(N8l(c(6o3kcLs$ z7&hN0TMq4P=ft_k;n|55tyhy)xqj(ES=cfH`$%#;o-cN8QpC`%wC5o8Wc=fpI=8(qYu%{c%4iNa#zmrKQ;38g(Pg@>6 z5Ud+!H(q51nMj{2*|6~8@g#isCI7LiVEBPT>JBNyT6rN6ze(UDHQqknf$yIUXwOS0 zPc2!HLs;+{$Q@`&MZ4pAr){eC&06C%_)qzKz0uLht;)gY+x~1;f8Hr1{0#+eVK{II zJ1+ByW+ofMNpGAH9A#SFd$znWhy9ZHhysP+tAl2l@NeVt=5B?l_mx&P(rZ8JZlT#7 zLnY8<%EnTFi06V{S;d$8ZqN+J2>cV;G7T^E#GL6sFOr^nYTcd7wCZ+t7B=M$cqczw z`2WN{jeHmRZ_KX}`SG_+LQ~PO1n`V5iYS-<`Vv{y|CxjY!{NGSWcE}0#FXQDL?!rquAP+D!6}DTzEsR?yt@=On(b1L)&OckA zhOJgfbK#I3xeAwV5+`rg377lFC>Z@g!K`q~ySy#gE+x6vQrj^>l3UqkX^Zt)B3kkb8h?RhX`Og(WAu7eK>34cQYUxaTMxw=|% zx-`g~U8ASMvC{n@4Wn~BcwPrbV-Y*~H21YQ?X!4WQ~E&ha-0v`l6-`SpfY4M6m^^K zW=4xFpk)CE;Wj4Le8-4wyuMM~uTh`%jALbg!E*`umkaydU2l=c>pgPcZ1Wi)AzO@?NN*TJw`v z754iSHs77pAE$> zS;ty~g@c{8MHb8XjlK<^-jptd7;Ri;va^GO7zp-`g3*7lSs3)@fmee5JOy^IUPWK~ zu#Yl8pz;&s>u}oU1Z1_06aGU~dwf zB_#H_HmCeosMfowC+;xt+T#k@*K{hgndHy!mz~SXnV?ckl>&csjur&cY z5%6O()ffu9${c}t>>CoI(d)soS+7N5UH(|tGaHnEpXoXDk7&-{A*@k?;KfP~l}}YD z1<34w5P8#Nka2E;Lu}?tWkWCGHQS`k$zIrXJF!?VFGv-t`>jN+0cNPqQ?1@V$lvmhzdf$ zj1@MF`eQDl-c1X~D9jA_(hEz9Nq0;o$28|u9D@HD zaDRtDe32;so2#>Yx#9b!YTsRj)FFDW3W{h}Fo&IES$esOuDdGEiuwFJZnKkF&ee^adS%0(pStAV)ln__gH0j-Jzo z+hvckcE-He-m-h?igVvNlg#(p5wKdo)px$TVU7cR@z#PjCTf)Wf9;B=8=D1? zR$g{~cIy$=W%H#fCo_8gkb_x1A{seOj++b!*c)p>aGnu1pbpzUBp9P z3AN=E%yO2_HmgmuZbZ8|Y&;o91m8K<1K?9`Wg1ucgX&y#nF>Q{pa!qFrc*4c+pyuP zqeq<_^(7tjwNr?Dm&mr0ai0kChpx=gZXD1BUq(3YLgqLkEB`SH=6_H)RF&(PbA73R zpKvMTH}u9lU^GvefvTJBYEiaf^o6nY<~KV*THhQll*a^fM?yOmMoVcZt_E{ku1NK+ z;MFBR{h*NgHx#NjAfX+ei4O1Vbywu*+}}NNzjHZXJvHYFqKJ_hM$Ba)rM2*aESDLR zDjYE?&#L38a>D5R-fLbg2`SJhqr3;)B6qds=aZ2%0;h9N(ILqB_g9NG4D1r6Q;%CX%49USX#U z4KS!ncUdtBiX6CM#zKyD-qT<4DqP3i-;0+45z|&S4^R5}-{UY|i+w+?*+VqJ2tb;x zWI)a+UlpMTb_?&D{Wucjm%ZoFFawpxnZQ8sQZh|5i<2X+OB%C*r#Q*O(JEk=^?m1) z;YKr8>v97MgxNnv;rkyH$en`t^BeiuO|36XF}mVpRHlEfW`GKV@1mL>;lZbLW_gt+ z^&a={bSHV>ti(qN%Q=8lG`G{cG9p-0U(BdZoPAJ8`x^?d>;#-y@>B*WJQKqe(LykF z6&R!dHE3#}YUw?dM*Sm0kCR(WsDD9osF~*+1>>ugcS5M7P9+t58F7ASk&`lD%vRJX zK%4#Y>DeGXdxN6g^0~MZH65b8=aP>4j^EUjoASmrSff8Eo;R&L4Z1VC6!MQzu=s;Q@jZwp$?J((Gs@WK zL|75Mc|&LHiH_mXq&T$rFAeU4zfnP|dXdP^LF@|iVpdCh;bF3*Czz9!JuP%`jD|2I z&p#-n{|yD+@4Y|i_A1JBjMK=OYPw@+73sUtberwkocHNJ9SU7*$sEa19M(U< z8xI>4YS2|hdheF#X$#GJ)^?Eke+|ym;D6oLFzW5`jQsD7)IG?um=M*gqyS(&v=xEG zQj`I%mKa_LrR)qi=)iA3QqA&(dy<}huiofaZP<_$bD~#jA{;I|==*V(mn_e|s0h0I zjFDDUy)*n{6fFOsAeSD0m@bsm7`mZhnU&J~TZ%|kee&{@YJ;Q$G33(>_Xg!4x2c+Y zv-OVyGT42X@#gOHQRwbPRUvUax89=0*^3Vf8Gl3JXypE^EcHL`iy;rG7J0T6{cm!y zLzYChJgL2j2)Q5-i}N(f8&6%&j*?T<+n3&$mzq=JmE8pDce$QmcNuLB08i|N-&u~a zKuxFH0{-Qd#b^F&OtV{`Xhl@0DpxpbVpqr@ebA{!Jvci)9EPjT@X9Gq4ooK0M}$LD z#0f~ZU_g~LVjFcXX38T~Yb)m{kMsou`eKvgR7Lwq{&oI*h;o)(U@oWon1s zKAaE!IFy>hU~`aD2l)DB?mW;&cSaz8L=inXX&no!&Nd=?Tln3bConiC44m`#EOKAC zM^XxC&bZk&=Pu+MYr9j{bfUU{r3k(kX6)@MR`&eIC|LbL!A#5Yw8Ot%BWqW4b}BMS z!ccOWFidmx@I1|+&V!}!$nDdf60(zH7YvcK?k;1<(I8@fPNfQY8T$2;e+1t4`{f6P z%)g<~4F#NO+`gjc_D+Weye>(^kEo_oPn>QKHOPhjTrlIoyk+lg5e8AH25x&yp0Hz z6z@(jv@g2UyjWxq$06kZWv6W@9$$S>$od-!;tElDaWpQV!u0lGlR{QNY3{BzbFO)% z?hco#x$!WP!S$(PcOHFy#zi0p)dn8$iGy~TC;(NZ9qV&yacqnt@Y_?Xs%H0~tlYrY z3{l_x6}Ce6zqC@{t^yNor-0`--MyxsT-b_9$GN=Imc<={*)@g`WADitHm+>J5hQ`& z5`aY`7iy1sij@~uI6yPV2R21kZ-QaBsBO-4T9kuovY))f1fL#1CDq0x%dNyPvdwM< zp6$TfQ@0?g+9gdAGzgG$57RWrH-wqe74MOk%wY5?RTO+|fmMXr$o?A& z7iLg&lD+uX*^Viljc2qbs<}-Op?M*xi~MyRrUVYCZq^hjh|dn{Eiv*P`ix~FESgKM zXta@!b#ej~P1C~PfeC|&p+qeX?`t7d9$%(mSQAG<02tAUbx8Ov;(kcD=iI5qnT+OKCz;DplK>TGTm z<&f1sGhURl_Cmb*$WzbGvP;hW5C7{G+X_q~FwBe@AW3~&9*O{1D>auq`a+re1N{re z>-;RL*59X}uSf#$S>|*@aSbzgGG`@^~VoUdW%2PO#M2XycSWe^{rS952JF?PY8o zB+FLPprtE$eF^(Din|VHKtu%j(?8SnU+Y(}{ewd0l&HmTE%2te|IX#O<5_~4`1E6$ zZj1U*xWQrGSH^>C(i@>IK^L;j$Je~8y_F80c6-ggBRay8c76|on_}y@{h*NhHxz`c zFicXJLh+PfFm+VGg#o><1>BV{~AZl$PF+N zIkIk|)=QjB42EjOS?EbzlDiKId4EHpRT|lfOLj{58zs_By~Pg`w3Q894BJvHVbXZi zUS?uc2kG-<+AI#PczTRg_sdIn%&wFb>QPPv3)mxM@`?v*AiI2PhGD3By%x+&g{=)q zB`k^rvgoKO>PwAJwl*wH+kD;lgztZAmGSYCMSI^THJdjv2*^kj6!w}%@J73kYXDHV z<|>mthQw{r>rTlWym(bu%RcDDA_gT|n;D$uWV4E!*2=;{vVxiY%mkCMg^1KB_aNHD zLZOfL*ijcXD1Jb%9X|B4O85Nz-4ML|Irn7ln~kLsb3m1}tKgy_a#UwdU9yKtpIvBn z@Riwd5$Zwy(T(l6ve=^}bef~~=XlkBjDr0i6t3AR)e72ii8KWAV8-Bb7Tx;s7YA%8 zG8PtOriamBL#X$RDA3B;(f`Z*&qTUmAidee=CTB(x0Mrfw@q%^`t|;ULjK=SkV%uF z%^`|dw_%NAQO7)#@R2d&>E#%FP!uv?(A1$n4Uo1JksLFvRnQ-DYGTgWS{EO(-}p6X zZZ-|rE<^Dt0Mu_&hVEgyJ_`+A*qDBuV-jx+B~&7;a2V&EZE&jVk{KNaNUdtD$Y0W3 zz>qJlrX?4DDIiXD<V-y_z zpultMTf}u)y~O2Hz+TMPkFU^s5;AFo=KnblS@ms5LX?3!MY)miTSOmyir%XVp$Wda z>(BgJt_blo*)Y6_`G$uN3I%^dfnQy}^OIN1XOwpClmRnD=?WCwR(!FRjPqPyOLO}3 z0!#T;c6b2<1tX;n3gMe*aAM-YRj?R%pE$ z+M@eyYr9VY+)k4<|5W!ooP+4dSBUVvwXVFMQLeBZ%eIxtCwu-(_Fg`^@8To9Yfq8F zkMzjK{Ns&F`e|Jj!a^Ahuch{hkCpePB!C^yBtrG3=zp-NAqv){l<{w z)*1t+Y>4+@2ULm_ac`u@5q ziSIqeUD}mqb~5hd_WAY^@kf78pP_6li(>gcQ8UzhE>~&L!<~FnDv+=8fi|Q1h>ZOk0u`W zy_or>qJD_?ZWugDf{U2CuV`feTy~JJf&NNg^?Oe)cer=;9mrOQujtYpV-cS(YsOFM z`|zEhNfC6v%LF_t>nSuS8YPjTJo|lTpwA2ydiXZ;8)y~WnfHEki#ygyV;Zt3z!$WY zDHh`nZZP4@>k~CCY=t4ve;V`9@@yvR@}^K`&jq=mpBYUxP|R%{%iT8b4E)C^IQ>CE zU~bbAwtev_7>9&Hsx)M;lfcz85MbUMkQ~H(+gZNHTYMjCu4$cfTy#WDGh3AtYxN16 zfPu&(#^+hd`n6#5^g*HMZzy~vw&P+RpGJ*qd_dIZ0*Ggki8%W4nj6d6kn&aVAZx}E zB@+eMFmZO*HOH=)T|YOe6VC-%t)FY=fA!0)fqDft?69XQdeUUe5o*LAc|TW)i&0y* zO!obRYK36Nr?RoVz)KCp8DzEA|8{=3f!+9H(K}`mjob{`)5j4M?|C=dJsFv-gfFS$ji)SK7UXs{u>Gtzk9D+d$h&2 z^74Y5d>+_X-g`$gq&O~nz%4MMkFEO{JEv~BJ%evLzi^5s7N>A>m~}QfKbM+~1g|d! zH5NnxPG`n92f{rl8Y7?-lO|dWCk=jU93(V#1G^|g z_44q4C#cmm%^X8TA5LGBum(0O%HLmkz1Pwp3GubRcTdy}!&hSr z(xVu_&WSFFrU`+L86{||JY?cAkc&mGOdH!(;dl!cZQLs>dNZJkOicV^6kPtG5amU7 zeH&lJY5O^o$z;3;0z8rZm5ZkxO%1UP<$-YA7DsN)6_w_jAja#X@os$g=#m{kST4BC zRL>aaWl?m-_3}ZXx(981YM z*K>AlbX(&%iV}JA#x0-h#G%4(e1kMvAo~)?m!?s`05xYb* zV$aOrSRtq%)DjcBr7Hbn6kPwHP&7+9KEe8nHnJj+;2@voU4gWR^Sw>ZMVWGQltQ!G z(XyN)0ffo4Ttk+uT?`$JoNVQNJ&Q+BTa;I%JwnUu_4R{7>EBSm_}sa;3l5VUt^I_r zXdm6aitILPX9MU?nrq@dLg(8H)?8`51@~gT#BYFK>Ktb@8qa#H;2pV+G4_Zb20o?$ zPwD(djI&4bQ<6c=HzaaR>{Mnflv;}03L??J}wC;?mLENi*g7H(|};sk+p31ERtXBC(^CJLf>)gWT~AO_8*vU{+YS(EXL!gR;+xXcx9cdSsOWKhn*~Ekf}W6K^{3J^pYj4J z|4b|rIUCJ=J~VP&x2-8qyGcqlqv9e0q{l8Y%%xpXA`$R$9WecH?mt)dJb>JuEtE=L zUtI1|$_`8{@gE>Q>+t-ZlSRiZ4X&UE+3wy1^Duf%zb^+VNY|o-(M<( zPd$SRKH$Jz+R*}NN}BowAmmkh$UzGYWMe zeBQVF;z005u@Lr;QE>l*!s;%VP#(0+$-sM|ew;4MXXpXLx$;e7p3Hf8_0i_kkRb(? z>L=&UA7=;Kc2RQc7<(Q562aCR7+Y0FB(bpbRqr1Z%KwH!>t;Q)gJ;e%%3@^aiMkZo z_cp2lM0Vq=$vYzTV7Ma6f@^B8UrfCj=F-FiCd~uCs5=vNHnZH43}Uo#Bm&f|fsu&+ zHar7#wWNa)l3F^x(DgOo=EV8)Wfq@z@qQNHqY#Zk8a(Oo>GZqXRX$)f5184Kz$L1J zUyz=fx{8I_DF^Uuu`N=_$s9`AbA8q%a~bvqEzI<%w`aykzCUM=-Or<5JePrO>;&e2 z?+kml#YGw;h*joe;T&A?n+2VKG7Qvxg8=v*~gTj-u&Pr{x7Q_)6 zP{rs3tuvIfc(&E|c0BakmLduJcx`Y}Eyv4K=f5>>MFycb)}JX%_58#mhGTULgU;%P ze&Zniao;NbhC+mb<2Ck#LV-xJ_OemP?nAbP;u@1Crjgk8DUv+mp3nW2GzHjNt<{!$6>@JiE7~e$pN*gM_9Je>hKm|ZK%Lub zBIUDQ_uwO;G4GPLX+@etC(XUMt_54GkK&8drzr^4-iZJx#W=98HDKhf!J4O&VkQM^ z+%9sA7Y9sw ziMqnC|NLYRndQ*aroV;J!HBtyN_&>QU}4TcF;JQjPD-{bm}IUOFV0P19dm$2oj+m< z9Y>IfYdp&QYYlCle^4Nx7EBwGqB`cj0rIC{+Fpg<@4%8l=iGVqJ#UQX4(O9g)TP zHSdB9g^YXb5a-kWH;oLVa~WiUB?!pnwyw1HfhPoqx}+G&)xGvnn7S%*Fo1Uw31YXe zFgRxA+qATk+CqB;gm)$@JiCl&3#42ZkzQ!qk?p-`bwW&c4BIusO-2V9%?jt67zKqW z&Q*4mNERS`KE~?8v9%-x)ub-pRoX@_6kR=LFK;uc6=r5S;-kgBClt11D>}tE^J@vY z$GSQ|MEm?VLD0U{_N&{+7DHaZmO=d|aXQ6$Y|||u)!1La8)Pwc7JT}jXxPvT!$Cye z=Vq!Da>BDa`QEi-VkfwfEewZE+mwd`HD;WWh0XAP?Z1N89~880ws)y>CthTg&iv_q zfa*Fe`Uiq+A{XZ`?Wo08e9d>LL7x&N3HuUhlLp1k;twA6vrtC&mTEv#e&q^shmsNO zgF@BcQ1F@GK2`3Ce?Lau*h*h_``$&$@`bic<%X=dF|_hB?>2i&$HYsuRYX6T2suLQ zG0@b&C41zk{pyPo@FN@hham8?-m3Pnu9fmLa@46B4MuM)Mg|Ptd2O@tc1$2Oo$nVt zTYE4_c}W#!{XA0JuC_T&CJ`5N=AW4Rr?ZaXvz7(`bvE~0#MkO?;YaT7ao@=9Hw+?@ z)3sc1r(_!5Ckb(tW~X>FpYBVFG5xaV(MR(-4&b@G4 zQW%^b4l{Ek$)7MZN+G=Wuu3R1IHvPp%W_KJ>SF3H*mu09S+2iDb6jn;n#2EV0X#qdpg_^pVKESr`$ zn=uqL5=Gkhi-zd&vSOv!avPt-!|Acjv_yh#*=sK`W=?CYGpGlaoOC`2@IeD|gSe_9r z{;-Q)LC@I7xwqIo{2;b`gvRJVil}foDmtmgo!$+tO)o7Y&Mqf;t1AyMDzr~e`x)h7 zFdka0({C^CFN8PXmCVz{TRTK+AiOxrq^Z9$ zF$iGKAzAocI<78aqD+f`nnt+Qe`o?h|*u+9iF`R$v8m2Dasac9^(ueNT0U*6RH3;IKO_7bZ!H==Um-&N0UAtZt(C zXk3tYix`rlRSnIAA~MiWklaEm_!;{!Gnbry?1J$9gF;=1V(x@9cR7|Ed@rgc>WBr9 znHu=te>YqssL{fi$a;K6+Z9?SadXv(u((oRz7S*Y;1+TnhNVRrphFguK|w%$P^kSI z3be`l3GTkCC)lZ)R%NLAS#&R0Ustkc?p2kvV*MT~Jro;KTQPAe@n{`1bZTB_&Kh zqKXmmz63df-8a*uB4NQC;UN0sVK3L&9svJIe6`n*S|B0q`lwotYr%Ma8Sq$4On3Wb zEn%IhT^(iZYbcCAx<8xgI3WWYV6}$;VIK|G3CPp1Ud-HZmm_dwZ@s#!#EhlTZ}ne4 zh7>fj?k<)?5kXPdOSJE40y^(;(b);3(tdpH+iXTUk0{YwGT3*ar&wPOCw-BNQ~20_ zjDp`E6rOw*vS8dLnek$>V(x<)3hfNyJ_Rhh!E_K--+6zl0&|qT8Jbbxigo4P8#$54 zGloaoF80ziK)|o#tQ*kOsfPZbQ1>?!jLKGwk+yP3O5V77mPvo#!$U#G3Nzv%^hd=f zTkp)P1YE6xyqjv7A-~;`#raPu`q<48>)bi!=7L!KZj9a`1BO*PeJ>%^JS5^1^X_d0 z2<9n8yYK3$RE#_~9mLu}8LgL&GN4;!6;w9HSv9Oh9bBL6Upk;XQ~z5w(j44qrUOPB z`S*UI^<&;|UbNH|If9T3bEO4akqTRe*$R146mP&%nk4(4h)$|++z2PmjAW@7hW1Po zFCZa47+xlGTrmKFSAr1_3f{&czZGoX>Z=C3f0EN7T6XV<2I{p7Sn8%nC+O?`=MXIR zSavhl`IC8RuF@!BDdE#+4l=do29gW0e~g0v9~7o^UWWvgzhmrmXMlB){5IGLJ_r59 zF%EXc{eCV;8Mc=R;{xs~Z>=s1>%yn7(pmSVc(?4ERhLg^ZZ5j5Zci!92Zj2-p&-To zGyV~BZoYeNa}Cl9VQ}{_QG(ZthY5DtE%?lMuu>zYnm-&d9WQz{N~ZTGbJ|c1R)XZ^ z7Wl@cwU;JW6*$l%=DAn>CiYcv)sb%lDHxhAY~#nijEHXL&e<}Mg`jS6U>foC)!Ip-4o-s0rY3>8TM}8 zfYFw(&*jEc1(~2d%_5|;+y!id%QLl>vt?aFucxp+CdXO^@G%=1mjM;6=&l68Y7mUJNW3_Jcyh-%wzNpN4G{sdw+vanwy+j_)l_*>n6F&^sm=@b!}B zarOC30M-xJ??M#=yw}Y0p?aAX?_2D-6uq*|fCT$NlF1YRa9Jl*G>uUXYf$5n9EZ*Pu z=2j|{e)(2mDqhW~_vsbA`4p}*@X!EWG~4lU@#_(8MQX@Y!yHR9D6B<>D&r;%H-rZu zMmgj&ZDY783drjjir;8aY~LuF^^=AD7BlJ%3KE6V6(QaQ&KH zZ(Yv&OEIn&<8jxxCy$VMf+;b_1MDB85cmfL#dF$-A*x(^iBUc`1cr1QlcvE`D<{+H z-@Hswqx%ftqi+%HA`H&(--KbuKs#Ah`{ny5w^~liUf59iO2di)xDN`Ae?vhn^C-}V zfM_u4kqg_{ZBP%{oC0V>qswKRU`L7;tfLiiIQiu=}2RYE~! zZeEa4hK*ZQscAsyy^aC5irKRjC{t#6%@t+K+uZ?(rvF4s=;;J9z+!qfayPfT+v`Y_R`k32lyF$2S4ko&)OFU zw#Q}r(ix7uIrB2*%`c2Gseu)WTC|q1BN=C>L-BIN(8JXp_P8eTr|cH~1V|P1LKpsZ z*?gZ>M$1#94LZ#g_zwzAe?tLu5s_92O?h4}yo2V;#hG$4i5E1LFbMzH;qX?1aOI0Q zUdBKXLMy9J4dsupATGOucKXF>4z}v%4r;^#exx!$ounI~fw_vztK&ZxIJIe4-z`e` zJuwUdRPG1Iy`4wh9psgRE>lgg2Y>GKyCf;9MjaQ94!6a^->?kbL&PZuK&nkeO=xB} z6lbaC%UF99F1)6+*;;oMis(RWd;Q@>kUae)X&jC@Om#8t6)B0#&G9b~JftlhV@$T$1ui10z7`EMxr&dGii*HJTH zm?@UMA7*t8G(o19PM@n5EuF#S!4x9rmsDsbY-qf|=+1mT@8F`+vHmaW`5r&L4HhKJ zJZrEE$aYvuwX?yjAkdgWrn$+QebFY%!nT?7#<3y&5A*VvH0LqL=hNGgmf``J4@2C# zG+FQ%NT5={p6;GX^BZ^7I}mzK;(Sm7;sU@R+uTh_nU7zw-=woiXS@U?Mw zc};9gUJJ`RGd#e?bn+V8*2jD#>Ymoq7tb z6b|&je49k&E|Df8r;{TQ_~laQ@1v~iG}M?OLwyF}0o_v)yKT)+#peGQg^)ieh(`yn z(lf_tc@xf6(9FdlnZwC6Ga8ab_0lXcX>pOM=c8zf_HJ`NH`PRIHPi}dQl!0^U>hka zV3E2)-A`-#A%0M3`5Ov#!jJSBDuv3G^9P!%p0P7U!DiVgEJI=xs*&N!ioU< z=e!O0TJTWCuLt){2lxq-@h=t}&qcDuOY%zrD@M3Ax<*eQarn?yY3vPe#yBFke*2#W zwrIJ9QsO*xiD`^l>hRx{>sxRLR@8UhC6>@Xi`GpHm;_Kvqg7LM0=L3}2O^8Od>z`A zxK}H;ra2x?*|HgM*h3gc!7EX|?zfULKdJ=a7SWJGWQ+ai0%iPTnsbNJ9jEL;nUBBP zGz0A+>(!amv2Ez@GeLz_a1P2@qG+Zu8GR8(hdXpCm~F^X1#|WU#*10{icYqEn1u{< zg7e6Nat4vPe3;vA9HKmv6iF8ISDP|k12S``i5b^RGPGQQ zL5YsV-pOKTDRk8&P{GyFXP(-mXBh6CG1t8R4S#z}MEao6`ZpBfY;^g&FT>^}TixR- zzoe?~&%)QaoFId>h}UAHYDh);srA_n za8srnyWqv^gS_&Csa9WtK!LMGhD9sS=f?XDk`KLJD=U)$%D+ZAq2w$Bia^ z0!4szoC#MIUBP0^)8XJcQf->Vraoqq|!mn&QA@L@mA}W1cKN0DPs^fGT-YG zK9$YB%!;Knot+5Fiotk{HKLzsdh3u%)D4R;EYUzoKt1iIB#$Sg?{{I zc)M!rA-BZZ|2fdp)c5m<4wBYqXKHy8zcB|&Ga;Ax;uM%h=LMf_B`b9Zhx`{fR=_Ph zp8?pKrK|Q6X4rO0pd_BYC21gGBvSEhUmypR&UnXBUMyWA^;~;VvSg9tSFCBWU6xd| zD92u#VWyXrD*iDF;eSv-&?NK!^+{h<-Uy77N!8xCs$r-d{Z5VZY%4Dn^=n^TW^bbO zE6ALwGeO$2wsOkj!^G^!+M^>aYuH04b&;|l$_It^zo8)9w{M*NI!rv1!TYdDy@suJ z@umsJf_EZL0N<_;qs&B06$eb9x=@mI3lKWza*dFe>Wo45dqc=$-77Vst8oDicyZtf zvXkFJuumJu{U*q#)T1Yt?_Z&?3#XqYrE=3UrdT;o=-*n`!+ml`e&mdo%D2v4X#p(;FqRo1}bMF3Mz_tHR=)Ol6K75OkBI^ znI{n2tq}cJx3V|`FP*$=vxXoCyJ}qSoZ5I#6Z@AU2KyLe#2T}N!^gIEo&rt z6oKDhXCiQ9aB1x&@KqUrpt=L{dE5rp?N@V@*WpvWycy=mh3w)YE8i}=gz~-CSrvO@ zbe}%)G^TI&y1A19+?|cH=@OkF!x*MCWjtr?8TT^)lnmAUpr##`6@4|fNC3fZFU2#I z!OwEwY7&PIsVSV;vy%+vw>3sDP0r?xp6qb)t$jnCB+wno1WQ7TU>o`ghzp9PZRSHh zy3UGvn0cNNydO5xQ@)-M>A8+;T(H1G4;l*}93rOr{$My)S)XdA;)Wdp58d%rTrVe; zhF0%Q`j1hF{DVTc1+sCoz>s0{@?Ave>|{;bvyzhuH}l)@iU02brFkCd81@RGW3Wd) zt%F%Ris6)jJ;GsZuiwj}OPuHjnunTb9~3(OhJuWIw-MHlUei6FVlevzWswAHfdU(r zw9Q{JvmQaQ&zJ(xKE$m*D_7BzbSQ7SPMcsWjhka1)#V;3=v~5_+=qZ9#1`ImE9KGxP<^o8!7?q zZ+vDTF!HQkUGpw(SXgIzKvzM+*~oCt+Ndk)qW-R{t1VJrlOVYj0kKOSQgI1PS*IV=-SZSU}uP#R+V+g~2gWzXBe&V}_UL9~6H7 z4F!Vi=)})OgzKg=(+f@FE%R$IW&U-{u(M}B{DyUA@fSkSmDIKN}C>AXn z%9&`aD@orK*Q{dy50zGJ5T0Voi)pyh7?HHe$aj$>OOu|8-THx>E(<_ZAOcO17tCN@daNZ!qqvW;{hj+Oy{%Xa zcvJNEl@F(`w5yp4NNPh)kJNHF9&&+*X4XClxET-XB8DQMIB^#oM4g>KV}X~}7T}rN zhZ3T;q7ez_?1r>G0qVHP`gw5ADg~@p8@tq+P{2tE#4MNlTpSMG2|8XtIAbnGxryL~ z=*~xbhO+Pm_x{_EUhO9YZ!3*F&@{86mjA~n#QZ@4W1hBbxa-azUe;yz*0&b&pl(j( z7{^asd29F=*U0*^xFJR9bBj%tP9hBb^z~`6(>ty3*T)bnk^T-iDn6w^%nu6Pe?#HL zk2yof!oyZ1_h`dRUYnK6?xG~3kuKXI0Hp^l?oqxYO=mrNre$tM z5%^5@E0Gu!N+`Ad_$8+~mW8f1YyL{_drr>d&BU|ZCTdb*3vzS6wKjL<-PXv_U;i-* zv42p|%J`aKLAp^3$DQcZZ)QKbU*NMJHoeI@FdW*)@-r1T=8l#Otd4H@bfi#8=*o<~ zKFQZiyC@{(a^vKwHfulv>w`ki-%waetO67A3~>5B5q;Yw`nnXCmQq8%wLEEbjR5V^ zenD}9k@wOJ`)*2~c-aZ@y78}zk z1SIm$^+lw=WVv%PcS%t-Cp$#M1|uxsEjp(R790fa`CGBG71Do(cE$uhlZ3iLxN^uH zV)0?=R>93I156b9xo*n_@z-dRGC2%s%Mqn}R(GHAQ=JLcc{CZC({$RPM>DV@7q8N= zQY_$`$B;c#Cb?P#48Hn-?SH*)mj1^m#Qi}blC;gu=)#;+ilVkjgy)M0OG#oy(EaVe z-SDH8j~uy+Yc%h*-$FEK%*WXVgn5<X6~ zj7DYSnrSug<;0Rc8-eMT+3&&msy^GQ#3xeZ%^Y4Y=!M~9mZej-oo+ZD&^hfQ4Rq(K zxrJSRj7L&Z%!ZCY9PCTZpMNt1NFKlL8KS!D29OM@;Yn7l2qDcGjlfl#xi=}1xk+1;bs^Be#i5>|C>AWc&NVrkIxvp%91Vn zmNg{Gl4UGqE6X567-p=qh#6}kvPKaRvSbTcvM&`eM3xw9WGz_|*;845cdF0l_xpW+ zeLnU3ulvV+oX5H6yzcv)_w&5Zxp$Vs9UOFO42SdCLYmV&AhBX?P#-TP#9ac z$Zr2o%2sXu#_ZRisj|@S)zGBvg@cdO&K1r{Gd?%;8OxV>^qH_8R&UKHuLd=Ok0=wArmwn(q(I#hDG(J8+}S+*vKjCkJFvWYFB@WXkiB z$)2GH-*aAiku~zZ*4~Xy-T_umL6vvE7Zit1sF=v=QGAqO`3#-BdZUqEjP?gI2iYLUTu)*`sm|?xUEC8M5_y*VO(n6q5b}g~x>_)Q>%QJ;p*S zTs~C5kJ<x_Q?AwwtrV)Y5A))>L&@0Sv_hr?+q2u-$hC_}LRrMkY2xsREQ>&-OMwGRgS@`9)qnpMO}@RrAQW z-1e9<*M$b$ran}JY#9-@5P7n*SiW(i}aVm(^;GcJ5JTry}HL0E6KJG)f9SVtDD3QcjJsZTb`&m zteF~zI9ja0UKhOVSaw3u(w{*4FnpC|T~4`Vt}HxG4D)#+-@l-si;et#Hnm>NQz(OT zr^O<6jb9ID(qL)Hx9NSJ_)3v3ZGn4?8+&Ct3z|f9Y$vExw zfRd0Nzoh5>&c@`t)}6<}F!6JPthe~EM7D!j4a}SX3NL;Kh3z-5mKDjgo?~FNHkG@h zAAN65=`_8K(4Y(>b}W>5_dHz0nCJ)RnjbKW>a#YjGaX_u?63`vJTA&$t!OBEkrPTS zB0T};f1+!@+h+|@xb-Gzkxdj~IDN-q@P^%2o*bX+cJff~HN|jz_($?XhT8e8F2doQ zXSp};xdn|i$)?Ug`RnrR;MmT#6N=X7%0mzMwTpxo)ACQ1-d;SwwfMox5D67IF=*n& z>R0!0*upO%(z`Xy7w0uC$8aW*LYb425h@m(1EYOz#b)whJH)bfO2AvbI_gLc_ZgPf zq9PqZ;2jvpg{Y+#(Br&LsPd%5_`IC;Gsx^#=ivkav9>9_qCah)$>bj>43Yu<1CG~f2Wrsi&)y`04nNG;n~8L{^SNxulLg)-2SaVr9%Qpo z6})-m&hQ+WukPB&{0t%ERT_x?nANli?O1#{wTc-hZSG;Z*?N~UurKp#4yk{7J-FplB%#Nb-z`H2?z z%j4amjFod2y;`W*g;xD+a<;?ZVeY`Tm|eB*>k5pIHhAq}{Y1StFJHggk7{B1lcECP z{vRZOfN&;1O?bx(+j7Sx)K@x>t#U}a@sM;%T@_gC4nj;|k z0h8iMwl(BSvsd9j3@EFd5l}nYmMrHi-IT#XHPY)zze~ z%Jr;z#l3ESpm%!$>0ccI<_5s-{2j1UYsa6Y1eSjC3M31Tyc1Q8qdQ2U%Efv5gIkAR zI!s5iH&AK|ENWlBb4BRxHt+?wx+vze2V}2{LAClb6()1pp@uhVAD|Z+_q47`El%fY1@)Hu^NAa9hHZ9&a!hE5V z8JA|-BkDqi>4<%b0Z{YsfK2Upg|q7-Sx;8Mz8f3?Mj0ForX76;SfK~+3ZDZ$aGe)5 zg)3b*PYcm>%CR7a_7osnN*1#4_f!-!0s$HH%b2-}Kxq$8#Bbyp_s3lw($sI3wK_fvfjMIbT|C6M|Ju7N`N`pgY72;->3 zwQ+ZDi-pC(gej)(cew=6(}x|k&kUe=)?n&>6j1vIvTsQr!YDX$eLnOutSeR9NBZ&= zSGH5dK7z=hYn>I@Pg!P5>Ss$Zp1rl+PJGgDKUc`7I3z$85wQ*i8O}KsC-;7b?6@E8 zVn=rr%HQo-DtWv{UkVxeV9*$Ht5kR3i;0B_W?Z#bK%C*`z4?M77}uU{P(y;|*I6G+ zW!bM*XB2HyS8P%^Uhn{9cl{38j{^_Z)_YQ&w-G$O<>XWBSjH2$cne&1VlG0?_}wu@ zwIu>O>KavXN5j3$2%8}9;n$ii4)@l`3wrF-LMNz&lA#i_1ND?5?QaMLWc6ag?+4jm z7))_;oEU+KuJnGD{owktXe{wn%XV?sWNe2L#3>OS}k)@Xq2G?s(5E5EcKXt^wHU&D_pJ0C-)*oLRNPSgYxRFcPE2} zYes!2KWy`kTSDzzh@wfEuDqw_bSk$^gbPJ-)!P>()ReE+iT5npjvwyvKJY2c&p~^0 z!_cJq{gtHpOH?VcOv@f33IVRKW5)leSHS?;G(X5Df~kSjZW%ed7M#xki@|xo9dLXI zIF8R5jzVEQ`SA3vSR@qb14p}~kWvmR60nYAkxFw3`}+2 zlpHMA>gEdaZ*evDZ#nq4paUT03L>}~6JQ=DP0maPNURhLkHNX1kx~X&oQtC`9JuTS zF~Z}*5xO8}R#E{I9M%Kwgp|@o;xqxvkUluLD-2MEk#xR^k>s4||7Tf10FF0C;T`Qe zAzpMiEDnw`!MnSoe8UlkKzImLgPwG)6yimVKsvaf;V92=1RV$uBjqMTyvQ+dG%_4P z55kkf@b)NDZV1GS($g1hk41f#fSGBKvQZE(8hbbjj&VR5I))<(e_``CgG~VAO$g7x z%;^Ym5WNe=3yyL@@WBxX52UB(_jdf%Dd(_Ga6AaO5vjE%ge(8Ml|YZcT}}O4{@Vhe zjH~HCcP<{dNV2+`%!?XuF~-vo=@E|T0{?qQe>2()Fxu?9(J~;`zl;`f^uVG;er3Bc z!IuO`y17P#skd+j0a^P#6XAsstiYC0eJqU$IO1(W9ERAIjNsA z5RxD!7mO#~(b2`h1&P7&IpQ&he{{jOIti|%>VQFJ1VH3x+>tI``00%;fSMMh8^^nn zlHbY!89x*G+dZWFTp-mk_JjGE_?iBE)O=@s668hhf^h-HPRYM>=qzdC>xo06rOx;u z9q>38EanWx$p!OmjQz;MIGH$jxVYnV;GWKKS4;mE(xCa~1;A`el0pA!Ht2hq-!NJn z#Q2v#vF=C@ILVs-K++Yk2lYLXHp*3;SvM_;Xh2uTG}24!{#-D3(X_4=?WNA zPJts|Or59d_0rScQ>N~M-A(qVFc^ormetyH2;5qFD1o*3WX##-*5@*T-5`krzcVRo z|5$D|b+={6n%aN89n8VjaoSsDa&kevkUe|#&6ecm_!M@@rlkgE#qzePT~CpMoCejS)gyrk{I=I4Zl_;x#6RoYUyO{3N{H@}T6C>n%!kZU8=RC;q5lmip`$A}+ z`%^NOWN(2l$M4aN4ddQ(2hMXRzY|=3ozciB_IAG&L|kzjoU&w>3Q2l6Hhy$^frbx2 z=_MfbOO(=(w6siu5h8==&qLi_oMEaQT5CpU6;fuYsl;89RDw3iLN+$sdvfbE+(wi| zIV0~4Pq%Tz7Ug5ZT{m9$fOMcn?23zvc{HV3d05=z=dmFw^XCv#8shUCTK&;{C8sD7 zw^AeV#&-w2yvilzFgX@G{Ac<^4IcZIgIlZ{@X2}5grUc>oWgadv-7EfF4KBlp7p7D z7bRY*bW2S=ayZCayJSbAVSMo8Eo-uYNVNo^&tLcvq55fcdlYGjJ6z&DzR;(krx)C} z5BqacW?V-3WOKI5cNA}ysEwtMl&M6fIjL;GWP{2>c<1z>S&$EeFDFLt`w|>OHq`iE zZu9F^5&o$ExdS4}!5=6Dfew&TV9JmyGmO{;d&s4rLfV}EO(gzObEY26ZRcgd*aXIM z;HTzfzkDR0_tIelv@#k)Wcfb2wMtG*?_tg3E2UD82mG?`@%{7_3k_ol5j5XnB(QMrIaeyVb!dg$k|;1>bFA7SyjX8BTq_@difmt~?&xsfIEt9`72>TAll6y|G^oSZ z{ex{vJ8SZFQ|X_sdf01cH9wMBdtJ$QIV4SDql1dcWdBZhT{mRIs>EP=HQf|~SMn~a zpwZ&yk$I5{6CM~o}fR8s5VsAZ|_ zh`nLEMGyI}MUW#Y%Ed+RDYb%zr`O`#F3W0)?zC(Z8ULjC3dBSP(og^nBKQz+<^nZ+ zTQvPLoD#wGKyd@Ic?k2*)(6Z#3&$o+e=p>Is=rFIXdWS<&1iY8=&a@$su%I4oAJHx_M1^7bu(;7qhdc~ErZoktO)V>E$Nak zwbZRI@lFx$$adCM7rdPG9YbwEd2+pSvqa}kEXQ0lU@zf9G{tQsHA~u3j|6>1_*%pT z%$&X2vKQ3V`&op0d;vu?h~l<5`zij^RlU~3N?pNo!B8_(4u!sw^sM;Oh^UWNFSMs~ z0v^-5o4pGm*1RGbh-04 zy+noR^%s$$?&Gs&BQNcZklsX@d7fgQfRM{8k8;kGqmL|3#E0-o+BMN>(&&ZT>_voF n?!3SDp|X(3`X`|YxS#0<3q&v@kU9_cXZ~53{V9L{FVy}E4ZQs7 literal 111720 zcmd4ZRZtkgwk}`@?oP1a4#8aq3j}v}3GVLh?h-7x2iM^4?yf;YaEHr2weQaYHqnbo}}KtMpaz+W$~BQ+*yS&63TR+Oc6C0~QAXnLXd_S>BRVXSF)BrCgB zst!F>kBJLW+>KOT|F(bHp4PXbqs8wm^n$C-g!|ll80YZbc0#mEe zwW{MipKfg|SzPRK*Z=c;px`(Q@wAjGrvk?@9F^Yxa)qUK?jH49T?OD8Z0DJ#ATp!& zZKI%Z+wQbyj4iRB>oa{qGsvIKF<8e1>wDc_kH$Px;Qji9Ea?_sehJn`)+k}MKu~Ts{!5KJaT#RXWu~R0HcMhcWuaG>nRq!M?BP^ z^-%~R#g$~J=tRf58p-#*EnI=<12UJl=LDuwVDe280!1%o9;eKrNzPW zL>~%&DLn@TY@j5YOoBHvxN58ne8b*1ET7U-w&R-&9MvcKP@_+C3F^MS{joRfL`Tw* zpU~X1F$vtdaNeP%r`;Nnh-(tVkB(bCGF$h8V2M*K2a$l#lsJ_uNQ784dYH2l=6)4g z1VJi(^WJ?Yv5&70^MC5$?!~)(_WOqWOT9~%F|GAkK|vA^)!y|8TP73Y={zG?YGilt zPp0dbO8&)hIxJ$(<_|1vi^!w(Qt-4wv(Oi%M9C|4AI!9fEUCKUXAh$3rdLz~ zN=bmF1(V*P^vw9t(JT!70Y`_3X#sqG`2)wMLq(Pw&+GD;ZkEpr1Zp|%%zyIL0&hC^ zgB9pQ=BJqPp!&uKyouD`lOCx5@}ckO&Q}>4-)|4rj9H>2>HXcfV3NUA&I$3Pv=SI2 zu6NP|4I$nMeBZtCR50z^V2P=|HnudGs9{I)Roi$fzmtDWkN-^dW_pCi_8$L&xn>D>2ZE|aAe z$-j*?pO}CaP%KF!Nm?!rNXPj|S^m~i8K7GH6jN2ZmT_ zlrmB15>{JumFF;xLe&Brmk} z=#$YIQ%KYEA#c%V;rZ9NPBw~}Y%0SI*fEgrWE$i>-Vlcl@)U70v%IJE|4-uocl>_} z$P*9R?CGaXK52-}=v2xLg4#ak68kLzoZEvRMG3@b-=d)KN&)P3&NnISkTN$w72D|+ z>a$50Vb4K^e2*c9K-=BNCw4dOC2+*tkm7RUbDQ#Nb(?YQjEs)IFeTKHt}mSB1ot61 ziB>ZMY)FK_ChRYyJz@FL^FXYf7!Yk1rupQHtP7|_9a`+CO5|W-QRscLayRX&i9PGn z82;ih+Ac>du_6BW(c9U|3AE<7esPD9YjP|i21P{)V7?mihm?AJ&QM5f{uKVgC~Lra z0qpLJp~YsXnWv`quQ?7t>8D707zUtI)BzIQQj}eW-duQ+bPm;wy#!yiUAHA=M!x#%5EhF-FaI^r5!O zfg?MVIATFcs$8>0TTZZVGIP_>wXFc($|3n$qs{UKEgM1l`~z6RIECDWjy>dqBY_^X0Z+$TYa&| zG5ZkQ)TR0YEhrE@@B<7>zILrZ0r)WrH7=sTHMAY}DTg5JEbQSqS9$qEJ&Ji+S#>bB zzTq%e9A^Dp)Q1ZKJHv1E@(|d-RqzmzvS^r8RpGAdqq0P z?7Od2dIOKT0EsKZAZw8d-AvFotl~A6*1jS->FOK;He;3zSNBmX0Fi^iD)0JEv(EBE zUko?sEV2FIlwIpa*B}9B>9W!|P7CBo!AkA8Q>wjjQRQ$}*3+r`|4z+{zO$Gz_>U~t0Gd{TrhgPy_dGJS1QQiE$ zhI(_o&7^b84+*R9Y{an^q20~TxOg~%$EOPOmwJV)BFH`(bsdZtZ| zPwe|JumisiPRE%b32GNDFb4l55MLvcs;2t|VOZu}D(qwQ%O?Bplu}SIXm&i4D$X+X z){Sm$+Xh3oj?Xz_FI4zXn_azg3aWF(@YV*-I5j`jLK!&J8&Ey={B2fLJ@wN3-F|r6 zZM;Q6<&^@|zfef}fs}^47$TL;#z0LkX>>$sA6rCxXRbROeeSa9!3vrlWKo4*Jt18> z^gSu3htXxSw3Nv`h?KM9Y1eWRpFkOK)OW_x(Z_3P8CC*~Q?S}dM)lb0($oL zmB(Bv%1M9df1ooir9+dOPp?Sm{U}QB;He@-dFI*`71_Bo-)u?cyLA$W2!pV|+HxTh zR8$$Om0)?ss(I%W07Ad|AXVIrmqDm~wK{bzr$Xaq!V`VD^r_tRfRW|3w}Jbe8k2gP&!#+9+Tq#iCm)6kLu&<;U<*-pg*acTff6A+?0dcG?X_EGStusWH@ki3+)?-OW+?# z2iq|PW5W1dmG8$iE}nhTaE0J32g^N=1Su}2Q@QyP0EUWfci^(^ZBx-;&pbc3W|vJ? z_RcAU`R{%?;=g>X(wzGZ6)YYK(%&k}E=YtO$UElNIeO0d76r9e3NZgdVGuO>T$$ni z@7g3~#TK1$C_na$f-}|DHU>@(iVvuym99 zN}N0<9=NDcD#lw6!FmLjg@g5oIQ|Cm6D%H;{|pvw%BmHXZhJ@<*R_r@!-D+#oadrf z$#?a2i(itz8odtuQXSVstKERQtnp;R)0IHsjX2>=ikK2IW{VBz5empAi zxv$h}S{W2R5E0yP!lz{gMCAOWo~eXT)~F@VDqHM8wzH#dD?nH>LnfW?i%vxE=#0X5Za?aFt*_`6&&ur;#J)2cRjbdNw=EUy~*nKqWTYA7LhP42qyol}6t%iXqX zcbV!Iq__l|163+Whv&_gjjTo1Vtm$tUeSDug8C~3*ngqW4~OE{mHD)lGqy2YM*fT< zQ9E{&p2|HCteuG%0?g@tI-8Zu7C?fS3Rw8uaagN?_FH0PJ2)T`g*F2D+{T6*NZ8Um zj~$#mB44R{fc7y}jQsI;U({eh=$Q&Kw;5Diy6%TN@@S?;lHZs4p;ZV?a(&|T_}1`7 zNv1XK2L@=yP5{c>1`+?ZsK()e+!KCK50%Bp%P7~B4_pzSW;}@X{&1_(c|S5N3PCX& zDlRS!Uh#-UCSWu=@Wm4&N3;SWQx@1eBLva99@;BNXsHtUV-dSuH1e~h{Vt1p(nO)y zStH=vlj~w*_hp8IFwWvG zb?~5iF*jHfUWklnqArN>SL7`U8m|=K{)NJ`aX3fZX?;&8N6Oh$)^qx)+>TP?XL9WH z?Gv`DHhy3FTx4DGpOUd3?^4&n>c3sA<(FofdFPAqojT%4)-ZPhAAGH(%Zm0|o}EK$ z8R>2bg_-b}R<;uf2)noj$jo_GigXKu(ho=K{9M-13u(D+d59JRylIOBsL`h+gglL@ zfClKGain$oItq2dE77028mpz$**H37jPbTz%lq&P9j(kVUuHxSPI;BxRFnQi z&}AFqi_$;xc@Qp&!~k6C*`8tr5}>o|xyPYot<0>_w^GNCnNk=K<|%GM>0?T384idpZR!sC8gr|SduM50_)8F#A=E7D~g2d}ax zoG^L6aTSl<=eHpjpqu7n|*et zu}d1}|E9#jqGWf+o!Wf0cnE0d!>gs^9jh$0p@IkeS61aYw}&!kJ zu|zt!X_97Ud!*@#aCjm1o?=o}89KI{)-G?)Nevv(h`%bhs|=mENeV&$sH6cI6JeUN zIPxgUhv}Ae!`7 zefgz^1yo0?>zTl#ber`hgvyWQVe&;!g4n*X>tA7VVRvUb^d#^7{lI*S&lfk< z@fHQGR|*LKLZS6c8dq=t^iBaKJziz*#@o5~^JC}n)($0-be-u=`8s(Ot2g_aK0)*_ zi9gwG3O2lA2;WW%#tp~4WNv47X9|EG-e(rJ+!44eUz(_v#-13H|E$fqniRB>%-RqJ zl6Vb2=*VSm5te1wOUCpd<`>-KJUd7ziLN@|?eZ}aA5;=R-@x*ke!|9ivCWEbJ4X3G+?Tou{h~|#_bmo+C$tDg|x2ppw~j9c;JR9+SUd-U<-yQtYp%h zCGCIiTL>FB4(VL*BbRsz*SZ%n*EOA&ThD_hTlzKMow|$U{ z?4$VSj!l9-aLpWp1=<DD^t8S7%Cu7Z&vKyzg&e8f! zzHLQ#r~Sd5Xs|Wt-r`exUShNdQQH*MM3A40@A-wm|#gt;uh8X z7-i5VlNj}oD1Z8Q@i!lLbh_Do3VbXK#ppNnhS6r*BrcF!u9mT1hvq*BP|m(6ru;=o z3{rPR1qYPZA}8t)w(FuMA|cmc*AJByG8Eaxv=0^>Ox#Ll6aABJkcw`3@zqMI6bFZ1 zUP>>%!zH;F;oY;9lu#kUEj9s>(y7d_uyz^4yxC8~W=0~a(RjF((Vg)aB(+GggKjgPdID>3H5PiI9lK% zmR9b|V?|#Nwwn%1w4~AUWaJ`>%ldlEzfeyM3liQkNw8N%gx!p}`@sYbzHc2)i49PjJZ0pZin#Ux*MM3wK0`k957)CfO?XKxplZZTZuxV|+ zfAYmVHJep)AcDhL)ZkAx_-k%!A9ywDM7k<2n`!jYuT`@wQsIa*?rV5ikYsLL4*VG{ z{O~*bc+ak#M$pyf)Z*$);G=!*U;w)u-n6S2l3h&LH~+_j{p=khcTpo3Fas`{S{Uon z^UE8x08KcU>@@)57|B?>{Y&?w1$F-wD=NxB2!wabL$8f0g2S@0yDLgij4qy^U^ zOEL!Nn4brY`rQx7drznUPz7o2X|q(|n^w)$-(>i95T!UO_WJVE><^!fRb#OG=$QgT zHCAR>-F{n~G~Hpe3}UTgNmDR7Z%5xL=(F&R5`?oleGrCOqKYs>vHn?ANW1)N=gX~%S+FZHCeX$6I1KYX3o^aOweAoQhzN~Zc@ zT+$9>*m)#eVG8D}t*|$?_wE@`+EKH&p(at4ixzb_*LlI&FXu_pfuF`4YZDMey7*KB zVl+6OfKObeU`;cB2}(SEPYl5{=bHGvWM$!f23;otVq!*M)F~3{(AM(acLJ^9-{*2g z&+D~`(k@2R5Nt+g7}{nCAAoO?ZUcve&<=y;yu2^U1*?VXk0k{RgkkjsYgnWD1s1YD z(}=-4G8RX4MbA-h1t0d!15>s!hBq3u-KI;U21nm{Dhv-JM%s=RGHIG2wZ(RCQ2E~@ z+i=hQef+p?Aya@jv-lPT{Z|U8|3V??=u6dr8P|N?qx{->LwEQ3C(W$X(AH%}y}s!# zKKU!ClzJ3Tu@1S>`rxfever&?CE`E+WdqW8XEr0ZH_f3yF2u2~))UtG=OgGTArz2I zf#oXr47pQ6GL*lq_mEQ9Uz=;TKJF3Z;R?g2UIRW=F68=28Kdar6bE3;-4mC@fURxD z{?v&J*HMq);eBO}7HBV{KJAq;;#0mhC#i`L5?tJQTp=`!a$-@=#TWRZNa)<-njp$` zJ6?IugU>!~EkMdkg#?6#$`c+}ezjzb_v4KdzV%)l%Ev#-^whb(u+U5i4!yVxpNX(4 zdaPB#gPkZwnOYwm1rGZ0O;e1seBS#P1cBDs+BZtPO2H(fM7M969*;U#WRl^~OIN?z zl|#w>c;2F5@Ja#gUnmq!j`A9X&xQmazJ$~Yak*__8W~1pn>~~lCO_?wK*;{#zf?dB zc_yc#|M>G_BY35~i=L19!)jEQTwT?s!5J4|P~}b7;r2G2g1n0BPXQ&<#&vAB`<>kaIA~raBxzP=u)tE zP!g=%iSa$S>FMd^1Z=s!i{r0gi;_6O_>0Nrs4>UcB`7)uD&&Za9Y(Dwl8?noqiEzN zC6H3_N71REkvACrD&oU^rKuL(1uAF?{=n18M)SvY^zpjiW1N<~=`f7<B_*j9Dopn>l^6)YiEZ_3Wy`eb0Y=ry|Gci(SY3L$fMj7_o64$z1+nexPx4})@ZDcV1!za-?NZv19En=EBx z5qwJI!q5#@HHdh$;Ux&&7Zw0g%yz{|I#{t)Gk?+@T+d{Szx41fD?$d$)TPq9Dju$V zL>A{YYhVMLbjETnv~j>n3c6VuX74Rx^S#upZ4&SXxC2bU)O{Xy9C8W7by?ZRWJ!A< zwF#EszhD1qp>icuF6v*VruLe0U!fau8ZIw*nk`7M{Zu3wRW#BZ)=qY{1R!Nc`#m>d z3OigLq9E%QZfwq}Mdo61a30l0eaYr&Fp_NrYs^(aCXB1KbpsRDnj@Zc;$QqAzQW#o zx#U4sh5gPcK%2L-Lt6)Qc=~D><~1c_t9i{Pf?3?6$UWs8%;m)}UP)G#P zf~j7y;*^zzQi=xM`hcw`S7^`y;hz_53rp+l+8-Wus7wcf!=hQY;wq+wOs58WgIq*n zMN1^%O?h*pB?O56@K+2959?**mv@Vk58d&vAjG}%ddW>qZ%G-#jQm=tw851@n*&ft zg;Til8jLA1$TLHASo9M&_=_aUx`+d%8dr}{&ZBZ(2;G9RIhaQy?iK=Mfj5sZ)V>Pa zL^>6Z$rDerm(|Grsd~^p&!K?D%or=OK&&%mD9DU2RbC4apiwxrLvWwFBghyS5;q9A zdp35ss0lp(mY&xN!$<0bP=Hq*Q82$g_IPx?bVpvUadWH7-(I%Obx2g)<2nz2=M+80nz8nLXmk7_A{xbd?a>8T&>QY{o zb3VVTPcgpXhBW>m3SgShoN^%D50M{$_(k5CR4I67cHzD+!@cr>txd%Hhd77+v#@j( zf3eT{nFz^;$BRnrSXvND!s)YbYS;cocSu1D7VB88yjQSpLdQD~@@dM9{;Tn5$6WF|r_fMH;nZFw$D=LO zeX|g=Y)6YMK42`KgL*0ULK;`kz3>(V<5vp*+1~u-hPDvP<_!5nwC$J~|IEc;#LKoS z?QPFT=kveZHWEKvt5)|mW0cZUe=AM9a0Rl^pJn&R@^+0+Ul*?J*-Khajxqr%?%A^A z-SV0Bhl;2K$CXbCG!XcRHTrxX_-ofxD&=H2n>hTAe&oepEcNrokGJqygHBW7VF@nm=jKob#x^T?g==0YC1Oaqn!j@joa%_Jg*kkP?(yF6h6REzbEgooTP)pajSkW+<=nn3FD2i-pIlL`WZ+kXJj35gdKa*p;0sf zvjb7fFas5=9G0-_V2VmUO|16vSFWjkIq6<)Gvz|N-GJ-Z&K!iJ=ior@Mqh@KJy`>s z$`qE-(&v0^K^gcS%-fap%3z5yukz1&FqgAge!B~j$e;d3+4*z=j+hv0BlLqZ!EVji zC{1!VVVk+9=}3VH0E_L>@enkFPOCp*q2zM`<6=zRhrIa^rtZ;=rF`xwh2ph!?ioFq zQX$(YRp-eG>rRoo~G>7l`0i+G5x$KQi-^_I6L zjHm(E0g*fAH)T!S_;%^)B72V?Do>>d!?UfZu}ZXDVp#ZE8yVW4nTF*@{XC~Bsw(nX zX$DJ;#=C^5Pvz`yVY{o|IR&^|?~VPK&hmK%K_L;@R!37Ku@^D4a+WyK1n$F-UrTRM zFngtd^Dh((6o+fMsv#foAV`JeOd)rC&A?Fe%kEC6=sI(jAd`KUtrBSf1U0jOEOHVt!nT;H9d|M$)NYwN_Ojzr25MV_sH^op zc;3Cd_M@GTfFRo6(0SN;QStc|+Fv>72V+^0gRK&(Y-LRfon<=5}pYCbR)l&@zS z?p){KBfTvU$?JG})X$E!jNPxH^%%pt>a;}R+^M}HE}URyT++7N(m%Ti>H&ma%}XB0 zH_{&xdj2XB$3_QjfUDl&B9ECd%2E-%Uj_%-e#mXg#{GC&9 zBf{GK^NgX54yV>I6`Vdgs1wVhKxz$@G)&LZ=8tndVSy}+_2X-f*BC<#UMV253#{^o(gZM8(eNlkhRo}N z0UNvtx&FT@{GxghxO#Jo$&_pk+oyU=87O46ocN~vZ(JWVEm-WIr%f2*n?fLL?BPT)xsj(&h}tUF$h`++h(*a& zmR^}ZO*8b{G6Av)miEt4OzL`9*0xA9 zBH1oy`FUOV!H{)NfJnJV9m^g4BGBlb@Ju4sJ2FSf)6`+a^ytvOn9<`PTiy2Snsc5> z?jcpWIIyNyw}4=Bq5yl3?akZuJZY1`OsqJ( z(MavDXs8nNfJw_ai>o^r(J)Xt9mM!&@v*=XeB20`PQ12=_S@}Vz3!yCVIdXr0&NBJ!ZR<9KB|Aj(nCf|)Pk>%eW6^JRt=(3~ikO>_jlJX>Ay|m~6E*iV)z1Wmb!=)^0!m63Igb~qt(eSv>?Gqh0EDbd z9N}B&blx46POgxdFT)vn zO__;0gIHX#bgaEnp`l`sE-N`p(RANA1k6_|`3Hzo+0jFP`nDMn;;j^*O%`Q zRp6CN>Muu|2{L6`iOWSTD*7jv`}`-SyCL^%7_+tgJ^!FI8>PbtbhfP;_Y_2!UZ`12 z7%*&Z2#sgcP>Y(}0}>2c`i1BLfxiDQbfOHp75Wt{X^*-u_-evvr!Q@&J_C%9gKiGg zau(E)k1sus&n-tm`4DNmYG4Xlb=!oY^HVjP6WfL?wfl zKKoDZw3{}o-$-z|>mbZPy;-zf6Z%Ix!6z4U)L=q`b4y&;_Mg-e0;o1Nka z!ov!wIaJEm!}(3=yq=Gs)uWSi5GS+f?$OLxxt%v)b+|>*b}v|^&jG?1xc_AwK3@kK z(8X>natK0$gMk2dOP(2K4x2kgzNKa3EdN4Ei;6N&kml`Jm^;owkMgs%q!E%x%f;PQ zL=MgVz5imO)D0x9|H5{xl;LfhJx~?Um#Lpmpz6x~QKLv5UI+5`TNG?xDG>b&h4UX5 zy|Ge6UoX}az!LeuN=t^MsoLW}r;(gflB4=H-AB#!0)7)dgL;1=r)!d~nPKTIX5XnP zif#$3_@$v6g#a*5?M3FT!n(3_!vv$ZFK*pXSxWkHSIa6_OZ+Lw&X3nUufO%zy;1^J z{7jv90|xL>T)3}@<}oP>U~BYbKDh#DN9$A8Lu$^U+v?b}+e$d%G8+55!3-l9d53)H z#GrjkQ;XduhG`iBX7#KCeyqKu9$C3aq&%?Ol1~Dw+%6D6A|L$r3PPtrR|WI!-{*v% z(q|co&PLP%!F0ca!YxWu?1jxRNRnyNn)CFlyGq^iG|NKe^%oV`HAvP`Z_QWm-gzoS zkB(>PcV!o*PVRfymxB7dNI<%39kZQ3wtadee8{BLp z*2dR~&*%jMhV4c87Z;+wGK;rhhsb@>Kv%h<`03I!^0DoN@PuA6S4Wee(t?i_*{j|i z7N{erpz-mQrs}NjB?aE4=qb&TKV%-2AHH0T)cD9;XB=PA<=@ z*&g?1y&|_%cW4b(mLHG|a6R&D+;pr35z4B`iPNC_{u!-b$?Sv^5RzI@JgM`RGCk^z zygx_R$q&dIVu)J{`|QY53a+~HwWO0Mn@JV;l&N`hnVy6Ppxe=38AU1vvTMt0^!VtV zZZBB-=J>4hXMoE5=D?PX)!n51TvRw7ysks|^uSDKAOY6%v=IID&M7o%fQS+A?B*GM zGF|gfVvx#iS0(hhyVyY@gBefb*58R?|)YX|B;nB`&JQ;Bhd4zu9dKp&JuFhM%7E7eLN= z(s3?35C9w3wJ8U^8VO4B`VV=gr%(^D=cY9ABEDO&?OPN6Kk8U;p`-wRyx3@A_Tu~YEgfi5KmynC*;Uc>sr_@nO~O`b)X1Nk9~$^ zWlbiYd}!Qw^;H$hfyCIJ{CI{TB+WaiX)1StYxTT*jwN>8w*fFm}7Es4Rpwj~wvg z?u;@3OQIPk0DuUZF0>PpsK`o|GiPR+- zP8Ud5_u1Hdtl=SIEm03$SnToBZYWt)&=QofOe7ORepu*ZfDK!V@Ekr)rl}MG#a3p< z!qL5Mfg_-=jW?io!+45Hx<2m;!bj(09g9<1nc%1fhWfI#JpS?}Tz zS|>Sg^^09rpPby2Zsh8*tnP{5T(4%|qnTMB|>9AduM#}~qK{=B%_eqe*M|T z{A+noRUOM339=9`^@k}L?XTxxp%nO{*-`+9?;f7Mg(|&8q0&nLJ#o9%97@$sQ6u{?`%N02*5pg4Gf3*M!XPiVDco%YFyZY0<@hF9;!BBUrJi%Y z@JG)Wt=3NdMAz=?Q&M{?spzM1G+pgq`qRDjLP~hw2&)2dMQ${MtA=1n7#vpp+P{xM z0Lc%zf(5s%NlUK9i#@r$H*(M4wU+gAaD_1XSV==VJGzD2?5 zl>+&{Q1DWV)tWgBXvjEbLfY;uTWl?mPUQn=YFPiYD*15dkE+3=IoB>zmTU^pw==6D z(?^XjELJZcN%1G{N=H+E>;nXi=0!F}kij-betO%t_JD~%sgywQsxzF2*__wKLWkyO zX$Ldib8`3{jzPEn!q9^n#MDyLD6y`j53KaiB0a8_j zk|I~2iw(M2lp;K+KrdM2>R9xOl=!Ycm&ySn#I~5)a zJEo4xNdl;Sh4&-5mZ4$rh7*Q;< z5zuxr-E&}5m5kyY>_p?yX7Bwr)?2qr^?r2}E`H+n&~LSJ4gMZCsX)RjkZZ_8{mv;g zMs%{C)_6^KReSG)W|$ycMk2t*i=BAC5W%lt5~--YMZx8j0_DF@=us<}4!IHW^;_AX z`GPB0z|)-<2o>2pT`49%5>BzRakKW8mF?2iink_&H#>lbgblMCsB@azcqwF~`mF|7gO48w3uy)uQcqk#P zM%=l+BoK&i9@DXgk(-A=QtyqYi~=ri*7ETL`uTghd@1Ul$IQOIa|(QWmWJsu1s4s0 zpX(5?89sjRqS$<{=rixB*dBzo`2+hF1=m*!RR2PO;cnip*E_H|^n1rN4supj!w>O~ zs!zeLDKbNq{LXh5=Sj1jBA6dEeNGlQf0vv2d`Xv}szajxAr)et$2j8g6G(1IEb_8; zbdei9L>*jOWJi5M4Eq`9d1Om2Ib5`zHO1Ufa8=F&a*3FOe6-@|Nv{85>Rzl2*Ih*8 zv(f^u)Bya3MnmY4#C9US@c!%yMRuGdfjp*=H~fL`Pa+XL`0C;HQ{?E-8mf^2vo6lz zPiPW;^!;z=MM1dfZ>&XVFVf(Hn2?Y`0kjBPdi6h=RDpK>=CgUD zVA5otEY@~Av_F**D(K3OK#goLyI=vIiyFj7zQp;5+`22fF)em8+#$+aF!!yf69Op5 zK4wZiHd@pBFx&~c`BrL-Hka(wJ(~Xc3VmiI3ws${!VMLq09O8 z*O=VI((dRj3hu8IX#RzQaYCFR9qU?|Q*;S9$Zj@Ec*2~5kkc1Uau*ifWb$P3hW@K+ zK0kdm^Mfcz2-N5^#16&z)V4p(eZua_=`*REfNmUtCJ47tSS-}qv0@Z;>L)phKZ7K8 znh4EhnAhsiq_(8XRvnha#J5VyLj1gV$?RQLR50Hk+dlc6IxBo?GXo%MMP|8e_{EeF znQJ#VPT}o)KNIwMXGqvNX}?o#f75T2zI1+{rLK zqU8Vu5~eEi-!oiSYO9q6m_f}1z}G;+8EAXq?_K7O&#(k-3V(7Nrfl>0Hk7<)M6 z-6&YN+X~cUFFwqE@9yh==M=1h7#A(vhP(R%8UpRCiW$rlK3ZazZ9L8ARJaOPM8Dar z&*PN>?Y~f%NA_q@X8nbbDUsPhOq;;!@Cg)^tD5J_kJEt%jgPxbIngHBeJRGVtsU?N z{2D0*fzhs)ZCvpgjAXC~hII2PuN8pgkY%r&RinO%hEr@f`mB>t*6#FTF(u9rM7>+5 zo-^ zvneVw+o$WB9MZg0AOO9GjTvgG+)c{&3-gBY7(lFJZmrv$7?X7g6mGmb!0I@Oq^{_b(J8KmDTArzV(A zpf26#rx^d^%7`_-Ak?>g{5{tOrdsQw=FxEiw+pNIR<)X<wbSeFDZcd zXjC}`w0$IFdr3i7zsX7sESQbbuv*AlvsQA@pqVhuu>^laf;)SOJp$tQC)>YpJq{xZ z7=-ex%p0Z0D``URJs#b^0Q;Bg2uE%_4rZXA767i(hNP3r(#LMzlbx16o3w!Cx}QE) z`QR=StEg_@b!!-&QYwz~gfdD$pUsH8 z5!XzwiPRIPhBcq8Atwa1K%-jHxlqJ{LZ%H$pxuF})6A5n&=#8Bm-=^}3bHMujIQG$ z9}KSwn*{!*#LBTp;p;Ddr;nlm84BMLb$g3~_bUbZf1$v*bT&8di(2(d&0{6rh|bbH zP0k$YZ^?*kFJ;*yZhKa4JLjaW!WFq&b)fl*HVtAMpXd~swS?~GA;_u`gZ~AP8db!> z#ze&{@IAZS>Su}xii)j}e;4BiIQ%QFvjWO{p(ROOTGWL)GS8I84~&gAGD*#>VJ{d~ zbTawa>yR9HfNTuZvJDo!7Vf>%M7&QjH;9ABGkOXm_m{on0v`I{!at%}h=(e7g2t_Q zW^ZK*3_vO_T9_j%W;6HvRTB9g|8iPai}w{F}|#XCD8dhOHj}#2iJCbGHXw#T61< zEqw`>tcrZ9sGtF-G%PaTx>0O*O$yeeBGT;(P0+5c^-Hw0;Nl%y+MwJQ7@;c|Z#s!z zz>4+V&p1&561GPAsm_lvoNhVsWjfu*G1r)&hNewdDBjA00YR^I7h?HOD-5$$aD1-;L0wg^4bQh1_e?#-2H_Q;UauB&<&Gnv`>M^po=L(cJWE1^Pv{^1B zTh_UKE^@n}9Hhxr3YJ*?BS>sgIN`2n^O(K8{zD!xNn<`lp(1cBQchTdmR)8rT~rUr z55O!+%Ik;gjA|?P`ID&YXCA3(lsO#wIB5`=`h9bWTIBe9QTPSfb}(!`aOSs$OW>^s z+S8yMlY%m&#yfA2bkGJe6AhyULz-F|xF^wzxml~Yk&|@~MvXXLT`of58)&T+%7nD^ zl=WeA4d~}C#V0qh>R#$PnMxR6K)uK~{)4HD$QH<_W%anNS`O{woyOd(OVK8qdotX7 z7-=Z`)7`t|hir9?gWB5C#P*Ae}13_j2h2PMc@s~trgL;MeJluo*UdAtUia5}s z`nOWS@09}6zffq?$-UjeqFYXFVvARQmi$<95fiG5Mim)QHerj z+#V_>FJ4(v8(QZJJ6?(Ot&)$Jj{^qym=I!FA6j)UIqz8qpHSxxYWgE0?}vfE7^6qv z>8#*W8p7Ajntj8#sG{V)B7_P=)rT#zA=jeR*;UgyW?BK=c> zO`YbBTAzg|;u79Dg(j)~DS(T5u%X9^bcA~Wk>wem4j{Jp5s+PBn=1b6&0b9YuN0X7 zg@UYmUeDkjbV6i>=Qo7pE>&r>kEkLV{3&z%!Z4tF`RcifQM+Z;WL|Q7a+Zi~Yy&*r zaIKo$hA@yiqeX=MXGj1}5@o)(rJw-~%5R4g^lOhe`^Jf`nVX`@zi4N+`VcA?5fLN5 zD4W@QPM~U)%mDsa?;21ydj*bL5jDAN3%tCTZI3$;U(@)Qf1|%bM!~#(#2&g=N zUkLZjmh1xmRA$o@kx;>FwEeAR6hN=Mn6C;`q+FUO(f7r@sbfcO1RAuTGRNH!(<5cR zW}W)4?OM*PQw%B&waiH(#vu=@{Ar5ea3k0C%7|!XZyOzg*ELrw$x1*{)Scod_Fd7> zGJfY2P&#RI_8nSLWEy6W?vE7+@)cUeqHNBA&tBAu1Lo+XZ>2)OD+QK+p}8v5Ie3GI$_PQJW>wV_wF zCHvy3xfgh-C$zfniwQuEgW;Jao7RMbyNwUDy$CU17yz#yjGIxhFtx? z&{jlT2yx#MT;K$r{UUG_ROTm+;BpU^vQ*{uR#W80ocb0sCzY1w>JoWw7rw2<7m!e! z>fa(@uIPaXHC~YT*(}YG-dR@=RCCV*a&=cC7||-tqXRXgl=9UTe-Dpyae~}98v8)~ zbz2z_{42&wme0uD=S({?EiNHZ9u=TY?h8k?Q}Bx{)`jnz-Z=#eJ7X3v!E6_NLBHgk zwUFQ-hdMV*0uOtiI*sgU)5|Y!Q3!ga!1gZ`!mu42acBf|^t!*fwC81fwSM@2%-!=} zo^2Qg@N8q*wwLS9c3ZV{Rj19|HAWppW}Ky_kCW+xuPJl zD3Of%(){tFNNF~!R-Fx+8ef7;vZ&)QL~+B`C@>)8Tp%H1+e|B9b(d^TMYptupsdc*5r{ej#GRpJh$N3P-#Ud-s+SgJA>W{zZUqui{(2+FueH9&Yol@{d`b3@ zbLHwBfDTD}4g*8KEkkmH^7qz)U5aU;(jY)x^%9U>T*ysiVfCqjq~#~8t#bv0ehq4J zj-*W)B(Ln0=+-&19-*gjR8pU(6`+wMx#yGouJ-n$H!cb~*Ae%88bTkgQaIsm)CnI{ z(_8$yB}vc*EbklYbMJTUDbs!4EYv@LEi2N9{|#n;NdjtC4&O=}Hc&qxPlaYRQ-;8bv~0uEt5nZkz^C22-u7Rw4#a36S?-{YN)Fwy0%20Bb_YIj$E1B zH>$Z1s854)UZB*}Hz26Tw{{i)#9j~T$Dzx-FYyUP2RLEpN5Beah2^9wVlSsqWY!6_ zN>P#jN~VvsBvZYH|E$!n4jpNB@t5tM(?6auahDQwKLoFHH3PH$)!6bf75HO{>%;)$ zmg&%xVO#4PVIapdCx1x23Wpb;QAo5J{tQ_4&o31*3BecefSib`>({X+1s22GYOYq9 zGs!=6^M~NgPM(l`@B`x4o=Z6n_n0AZ`~qR(Cpj;tW5Z;g|1uz-os|<>14+-{q7e2< zf%`oaf<-a@+e;)c07;_C2H6bX*!$jdfF|b?Dk30xrxv#x)9i}W;4;@S9SBW3d;a)@ ziP!mvRQ+jks5>MI<*|bA7&tPT6Tq9n#mgz_9~H8 zBW(=>bT&(iwswV>FXn+QvzjK~>L68{QXRh!@fPTbOF51*-XbVBVvytETN8~piIarR zg~l`2!Hi0f_Z}5oDcg3h-px6IwwV;|JNP|BaPFF1V(Bz}T(}*iNB#rIueIqI8jS!q zIDUF${T0p|H*a3l+nP@3-{G)U9m)%RV|=Gi{`vgj(RS(f%mRyNCgXrD{;&K$UzkQ! zH`%q24^CmW&`i?{hk^=ss;i&c_|RQW*))>qFAZzk=&U%`E`D)t?$eTU+!l?skn2KXCKyy3|$ z5}23VE-ranTg9AMHRT|v0_<7B9spv8PI%Rp=W9jQ?AR9AQ=M?$w*?Q?Al;vClWbkS z!scj|aLx1qgbwx7ws~^!C@UMc!Vvn(Ie!fqr^+dPpX&guD$r*k3HnbLF`p*sD)*yC zH}jr!K7nz@_(@pUiiyoGiJx)8I!)mKjOC66H+purYMCK0j&VDbczWs(6A*46oC3sw zL!*zK25J)aK97LQ_{C(0NIW z^AQkubpDrJ_u2S3yL^FOq_p9j+CpcuXIG@d&I5h>OC}ff`iwnXw8$EJHtLX)lZsVzc4G-)?J`wC#rVZY;z1-Z<2rEc5?Sxk}0q_ zXca)<{9-rxxw8VMM*-VxsCE2%@SKXx-N`|1E&T_l;8NKxvA1L1Usgzy(!#7nOrB9L z+T8?-ND8rb$|fI!@fL-sR|@>^p+NDB1Pn~JqiJ=LIber}dfsI(Xp>q9Gr)Xn1Piu>G3TL*4JRD&Q!z8r#Ww=Tu;M#m z_|oeb0i2qkJVPo$NyC<1x}?5P2PgFTpZ}Jl_lRz3#dw$&)_UkXNO}DVto^56u(s2l zw|MF7;&rRSi5O8# zF0(8vL%bq`+`C7TCRLzla7pcKX?2UyEzoQ-GYe_8`wOtvHCq99JOnIC*4?@s5w@|# z72clT>&~h~TRo(m#hZ}Q=!%k~8cUi>Jv%0|Fg9W4jizSSsCUXV%ttyGA9 zr6Bko3ObkTU6_*XQYKRj);4zvUYiIw~s#*Y!3;Hh058S_Fhbl&jyg%>jy;En+X*w2bV`3xYH--K>k`R! zGxboI@du}H=4(6r6>kgi1*=6+mm2@Z40R^X0Zgo%3wFpre5v@&g+Vc|6oB_o_#|=a z!9J#SQZUzE(>06fT~b>zLmVYT+>=?^nGj!fNFXK~CM0$7UFmOnSSWm^OeJVuMU!nNxCsV+37@z%;H5hJ+XyP2gXzP~(`{lb38HQ^%l%sde04iU-xlc0v{fh!xZm5$I38sh~aR8k8)yuH*i z5|+$MO6iOK6z+p48&rS;P2}z`z$dCgI^iJ$YV2@y#?ZT1mq@a^nOd<*61CR!!70$J z!QOCKqkWdmww-oZYCHK|g0a<}g!5)^W9%yhq4!XjV+jesnmu zTB9cYNlEXpfnq1!6IOwgc{;VbbCy zFs@v}R0?xobLphb`Cq8eKd@BlJ`DqqTdY0eyfi_c*D92v*LM|~r3w-|s zP_IGR5|T+6?%JK2PykyxXvhH%dH4X1&K@o*K7|#sirbme0(+G$Eh0)_V{|(x_dS23 zq!EP(R0arcrVLBjalqp}YZD_dUC5ZhngLi%tc>(BJ|43r^D4FowO%!aWg)PY{kcN$ zWnoZZQu(itcwnoc1;6D2#_jYQmlkQ$txNpOe=A=cb?C2-lNdgKa0<>;xV7Ca5g@ZP zwgeVy*P`YQD~V|<(SPSFGmctb+ z>_4c@cF0w9xm4mn5SJ6h@z5g77YHub%(`P?={&OPc<8n)pG5LD6hm%MpszpRG_@K1 zzf>ZlBN7i6JHCG^MBuE;K-D-(ta&TKk2=1!eoD$pxJbKR=u~32!2Wx~ub;ZZJ3^dG z3R%;n27#fTqTBR4G~-F#tVPetl5iH{1`e!~WdE8RdgsEuj5KVgtgo|p1!9eJpIc@o zYgCOcC4CgHhU!SqZ!B*0wDo{1=DtFaL0*q)3z=lL@bGq&k~SC;W^SY?1y(Dpry0w? zAWuqhI_dD!DW7IY!FNMZm;x||DIE(Rschkfga>#&I0Y~!fh;iPrWX-F4hdng$tFl9A(|G!MxT5nlsln zT6#ovGYR^Gx<-2E|40kDVl4nA+9f8T5xM)EaP4`MD-!$KO#-Kl|K(E?r`EP!7W5BJ z{4z=#h8S3r1;|>-Rllkdac6-OX~EWTssg8Av%MKkET#v_$$#a#wdyEOyXGW z2cQym&I1&2wst5*bDFf6KOy+X{xDU}o!|pPt&DP^q>haP`KV4M6{M#t9^?>2+PEIqii;ZsmKZ5d;Pgku06-2t63o~~zPx}My1Qo8@B)`p3 zvH{(IofnT|l-yagjNhp;P|Y*1yR2v8_^MdL5r0P{Iq@PLuy91F&7@GJ`z+S42Nuag z<2ri6#~~+TLK^pNvD|-f3aMRJ5ns6Jq^c><|CA^2nA=bQb3c&o}49G&Y_p{w2Or5PJ`WVPA_;29vOp@d(J?g@s+I zzxpSxP8tHz!XjyUp%*2=HSR7rKtS++% z4qZFI`d;9&o&~6xDlYefTfAxL61kcfTO&J1zEj{N}!nRF4DkNloTpL>?UD+Nri$Z`(}%FdkTthG-XtMz=hEx$nw9; z2YUd5mGg-Roda1&Hj-s9hgSni>2A7QB=cf=GyL;I@pUt}*6%sPo!T;db};62xL&^j z@lqZE?(YT4U+syLE=3WP?6e;z4J9>zIHa@oxqNgp2^IOg)rC<{+%D}U&@fn zsHs^L*zWPlt_|r?^aqtPX`sa=o^OuJQ8LvU4>~+!2mblm*>#T9|4Ay5?ZU3icU*TV`rlesl_Bpv=wEb$pj{7NXK`n zbldlawzb0ruDTK^bDQXWk)LgeO{FmgqnV@)6|f3JDg7Y8kTbqbY}{F&cD zz(FnxcDM{|Q7ESlh{2s446=so(p(RCS^V04^t^@dw~0rJPVFG$428@?1La_f{!dsD z*ILuXj>HL39|lze&Fg`1PzCSqgH!lUh5F@18;Xs35GP5PFTPJ!_MCsx=M&u(JcKz*$jS9RA(6eqQxmYyLwdI?eI_=W z8Jq7`jx>IsUY%kwApbtA-I)*lPQ0RF2Cge<{6Ov=IpDoPiwTha+F{*$OzUHr3#rK) zKw8?6A==?d>OY0|QR(f(BD7C>qFst_4RGq`@t<`bYzob>tUQkqRVtelB;2YgRQL^8 z!otc`Vhn%+>?21>fvk{Nomk;w!_EF0UrSm@5)|z#F1KynHykz{xxLgj3a9$bo2zc? zaBfE#Q%fZXedcdJI0blqAC=gVM_`<-+VF&-nMRsm!CdM=VpEH-ey6t(?#(q~sjn2I z-b2CM=1*aq0H5=$Kb4Zv7!-wdGFq3y_;n&ud;B+$-Ewj?nX9mDVF&9nva~)AE9dV^ z`7OBxiY*hvftkM%)Sl-6f_$aQ^bC|W;>7mAAOoK3QT*W$@`$HNT6?RNVnJ;s-gYVU zFIpF!DXY|_@lYl5N2O-UKDj=wXUYh1$Ff#*zy@3FFE^S?Wu@VlX#$8X-a|K0)!TfA z9forG7+((oNZoBoAeV-THo>x7)?e-g#{!6XI%nGfbxz)|Ir?)M3z#S?QdBn>eiogP zR)AF^)f0tHOj;SW^XH?&{KFDlpsT|O)*JzlL~zwK(?_gTHWa6t&2)oD+THIP#6xA@mw9R z+a8^M{8}y6b&Mc~(IEF%?4ITIbEn8l9hV>Y>SUJ(3d&nUmnM!0%ZFB|%g@ylHO*R7e7%27jcq%}AtZSG-*|*LqjWqySdA_$%6JzzQMY_XnrY$+3YZ zAz?*|ta_aeHH!V9!lpjVgMJIwZh@uqX}$LOEeh$c6lC5*!9;|ly+p!&J@;BTCL$RB zGdnFFH~%qJf&xXHmp*8u>8E3QeCRp9$*>X zi_*gLOc{D+US18Vy+aVJe`unHc_5cxvWIO{$VNG7oV{(M5GHl>R6`1zPqzQU_1lPo z@y`)uod@jRz7P=dCkb`9Tv!cmnMU)fCz3qtux*>GYnZRmQjw5aKJR#1Js=2sVqk$H zijmQMs4L0inc6BYVuA7S^I!92%rS0&D9cXCyLa-T9VK3a8lkyy`QeDk(jD5wMyBP* z79g}_(!W1+!_pf7RW|( zq3+97%MRA+mt<(iR$fE4WP@*wU{29;pLKa+tb&sKeXaGJu`>U&JynJ;!GWqS-j#lImjpkU6!)!9o04cB^d**q64Vd78@W zJ^YqpAluc}Sn=@kUE#+-YU2TH%g+&E8_K_t@?xp&T#}(aQym^zZo7R9il(gpe?A0YbXCwn$Pmo`Y*zNobWre z9}RSLASaYdqL|E6M0a@9P5aUZry$a##P&eFZ0}M3)%GM>1KnO~<#KfpD`2hNN6~)| z?Au!uGG8gkzlVa)F4qcdH3>45v*p#3!^SWQJ$?_-@1@VkqkbF8lTY)c6t|iexs8@L z2ZyO~MQ*4T1gz}yihT zs4R_+K`S&|h!Xzb6rNp~Tcy9H{AF10q&ZIW;Ewz|RckN}&N9@Zl3l>AmHrlmtXB#O z@1gJ?-1Fi$YcuLr!{2=s{~hpMj=NW*`cq|AU~-*;2}oUsJN{Dhweqg#VOrZ~L4=BG zKpFc??QSZR1-_MtPhy@1jA{gFqKh3dnx~2leX8V>q&V||F-5iiBtGYSNHBt4D!h1F zcg6@?E(_A4(6XaksLyfkc;wD1{LL>|L0S_;8UWV-w28YthKo9cT!&O2K-^P;w37cY z2z!D@EeB`|7_E%=5fkUjQo|L2|{mv+7UBI{(R0GC4ze#^vWYDL87-$Oz7q`IC1 zTd+HmIwp7Ay|OuDJC)2>#4g*oBDR?$wxF32bwQ6WU9bDIx2klL$B#cCvW;<;G-(b? z?L0Z=eQE-L`prVpeg7FXI`qAp467MhzfQN=RCX}rctH5X%~FIVhGZv}p~G=BVDOB^Gw~R_KYWr3QYpl=HUi|qGY-;u0PAWdva1y7 zzvR^UVJ(ExL|#+`ZR?64=vcYZ%4mfd8ilw7f^nq<2tag&ueH9WLTf#_rLIwPQs7Gi z7tE$}{*OsEzpiVh@1~c-RCVrg6e)p!`Si%KlzlLBHm&l!DJ}@NF(|4}Q71n*1?3R` zmLw;U?{i31s1fF(p)gnAgmA+lWi=H`I%H4w1aDEud8MHA9tw?}GoD=Q@Z9QLx!k&Y zoTFu-jhqS>L?(1bEHTd%6Qmo0IisTc!MmHHxha)GK3HZ^gsPY^s#{Q=NNN=Bf}j9N z#9ifA4d#xPoy_mN6_+GLS6HN*{D;W|XmhCqR7xw2N>DOWIwpKxBzvR@ECN;r2Wb-W z5&pkC@eo(=@(GrJ1xRvBcdZK|LKFKtSc^G2^uQnhcMEDW8zL)+8jjeW=D+6Tr$zj< zRY>O~o&q{n1o~+qjBtKPUc+FcafW&(pws2aU0*YCa{&Y0jkP_iE7|HXQ}0^=ZSySw zPJYhCr8nM1wg;fBM$H8x%1(&x&H?zMs4IbNdC}N1{&u6>_}~=e;`tZXM`bVky0udd z`KfKgPdI~S1Gbip3-zC@H<;e6@XURsp!^;RrWDWqI5v@wYpF%4{q`XfvO&{Ph8q(% z^7>*nfotd?=As<(KV?h{NK(acC+?~}TNJE_gB!8Q5N9c2dJ> z{4>-3V*iD_Z_aH7Nj`pbj1SN~%wBUv{Wxh^avhNiFFLf7*qRM?=-VBhtAVF45dPd# z(SX#7g<^z*^)-)%nx%1o<>3;SnWHjIu+PFb0gG z#zmgUX{28AD=i+A#dH7^SaRDgHmcMO)KKPmlv8fN;sT|-LL982grg|Z5A{*p)-qd@?OW|_e>r@%hH z(;ZgDTow3z1l=GyrnSLbXu2?IjMe8D@v&qUDegmH9Nw+R*I?hB+~Qz>M6*d-&s$|B z|4=79WTlyRp<;yllch25A``MB9dqwy?ae;&J=0l(6BlHlGn1gGE#Qv|&|9+I1X$q0 zLaK0{Tgga5nQe~Q3vFlEl9sClscn z;#63%7CSaG|195Kr=RuN;YYtoedBZU5^*E#+bWwFQ8J`y!`wcpc3I1W1$tSX^g1N! z^wt59|4KpiJrqC}wvJ^*YLpUq*1C};x4a)WZHuCXX4S6*AVJL4U^9)s_jNibFz|EB zdrV{OOjH@Vm8@a4F068#s*i9uK&Ti zQK03a2$cL()Ezb*63_rMkI)5!0t)h7r+D6VW-cCw1;z z9k6p*cc2R3bvaAf3V;W$4-E#%&1vqmON*_bAbIlDrkD$p&D%F_@36=?`739U)^1X$ zl#C}#em}uE`TMcdo2%^Pw;`HXYLtPT(ldJiBiq;Q4I0#wG(D!^Wwb9toX%B6k6~W#7eD?wifgxv0-8qHRCMOFUHyjA za%bnd0vdamjIPGNbSgv7`~=O|Z!MhoGVk<@O`}1(6Hk`w%h2vf3HWje&V#-_q_Fld zy3Yrv5G|BdEfT6<{*&S%hmyWuT#HPB5M3t&1~xHR{hY7G+F zk|jnVt2Vzm=2i-etWIXZroVZF%;>i|32%^pxI*xb0qBG&<0w(mOzu~RP~(ycLSoV3 z)n=;}De50}uQ$!9iyn^a)*(ZFo@)t2#q$x}kEf|}FuVP$W{GZHwu8Dx`sib>*-B_d zBg3b#5p%Z)AxZ!U6bMB(nu&s|z(Qohk4xV-=M{=xDX6`N!Uf-FR3|cfNm*jnPF|H!v*DD8J(Ly8vknFd)Tn?$nLu(vIAtA z^#`(eDCK=l)2n-6s=$nDF4F29jB~zY$~M)z{(U5fD}@Cei>V!QHKkt=y{_M_7%+DE zK9$4n>Ij-IpfdHdWi6p z_khTqCMoT-9{(q}uhk^DyE3=Qt%hRo0Ag{8Gu9WUGY6WV^}Q1GZvXk_A9LoV;2UVA zL@p*YGC1%HhWqJLQcqX_V6KynAm3>&%I3YlKu~TfcHvA>l2X4u;rmR+N$S(MXC+zoGr>JM?2P1W=-D-fwTDMDePL)IJEoW@vFK6)5msDUYxVDZQqLF%$Qj<99rbK`_WW6=wEYwdjZ&)Vhp@W;mzN zJ+{vPX^Pf3pkKbkSLe$?nH@NYyQk+Rrhv(Qpk=~rQ`marR96On(tg(1_w1nL0T~w= zG|Y6oju1|$+4~RgwP4@`*d53mGuz#zyp_y0CDM|F{VpmYf$;oyPjQLtGN}8M4p!|l z=!<-H@*m7($KN;#+g@dpq0>S%gAyZr@QMDHAAQUM(Jg3yx^1%EQ2mA|6HKof zZO6Q+Zj4i4rWhkOGXEa^M+Sn$Rc{;epmT=+!g z%PD_8#rBEuemwe}6(yv>K;-6A#d&gN4ty0FSC5H&Xv=WLk^EuZZS2fBW%@KSi!Wpb zxktAigJW9o%o-xI(~1LB=X?An%R~{4g1>@+eh_Rq<+=WiuY})q6uE%QZ*dWEeDd?} z0B+on7>3*Ho&QcmrivR>L3NIiYQBcjc$F<4li#>ANci=TmHb~)rZ=}tXg$dx$jCJI zjCUJ9I0Y{XR#k}e-$3Rb)W>=hzq7z3-X(Z*ofgf)v}kNq~8If?JT?9nyi$cT>#03FDU%UB8)wsWTU z3I!uve~P<+Rs5b`vn!jloh9PZz%cD*aq4 zeSCwG6&_4o$)oHZ3zioT{NVWshG0(KzV`jH30FH4y^W3XNyC9qhOgkX!AlY;a;d-> z-d36d;}T{qvLdG8o=2j-iAS##P38sEu2Yx_Nk2L;A8L!IfH;I5hF?LHo5_e(gl9%D zxMi09D~?a!3@RN^rB$NqbtwfF%q!HM>4m1*5i|x#6DrA09?8_3`;Wk}%}`;YQN_UG z*6g+>2@}q?pbDN=zX)Nc^P`T%>;66fa;qY;yz;~91U0r3NQjE&_E`Nn1i#D(osrzy zqT~%J^vv@Do5WcSZSiRxnR+FGqrZtfSD;d!~YC{(^u(0LC9iyr{o+O|(LClZ75&z9fja3ePM;<6MV zgU{Ed7kheW|yx$bY_*2Nfa*s7|#=MtSnx2*mzvK15!_DUN(!PdEl!z zaZut&g$ch#IoILv9pUL&2+3}ls)~(B??rlRd251@BRb?AW2n|Unh^Ir2+ki=@rCZP zxd6f44U*B4ezqL)!>>YIJ7rA8vNT;%CE_C@G^+iftVP>YgI9f#yv?GReqq&Pkz;2o z)P!s`Q?e(lUmbV27jJ>0#muivg?~*(9*ZSLAQsX8z|8aS>=%F-{giyfz{unlYLIgc z5GefCsX|b%BQVuUvPe{?JZEv~kOz~Uzw=eNQX3x#6 zM;HD^?%~5k{Co3uRMjg5-S<#%A=qZ9hO-nvXSxpoQR$JzX%-t;DHBB z+L`*D3lkV_NNwrcPx{-{ZO9OOa0*LPy(3Ulr!>{T$}HhBbm-PVk?NXJUI)Lj# zw`yX$PxJU3Z-;L=>4gNI9%HeL4l#C?*er)^CHl)JX8kiFw!7+c)Jd)uN!-E)m}#Cg zx=rwj*EiuyaUcD^g1xwAK=)B>cZ3Pn!+C8BPR6)A!d?!io{8;#2&1Nm>{}FSUMc9m zhr;%`Z*J&<^Wl>?_vu>wt~14xM_n&$V7T~>(?D6C9lC|Z@zR0NPB2*&+4!J7(&d1O z%Gi@mR1Zx9LDUs$-Y>xa^*Kj+ZLWPIEe*TIs_-DDh?%UVp7w$!o5J(KW^fB?cG<6J zx2(9B&$+GPe`Va3CF}n3P!Z`%^MIGT7ffpcMYk%)J4Ms{LH5NG*}Oe^2r6!(s1$ku zS(609D3<2yl;mBHgNRexZTkBNaVLR5gnkC%4ezj{NdlZZ~MQXm!`>x z7UD0qQ^5LP^B;ef_ksenjuK;KC67Q|ak_g~5clF4=Mw^xW;DsNZ@f0PBfsA1xh0r= z4Q5DIWY5RS@+ztV#P9W4AKC%)iP&_7Xss&!tSkuw)}PDPT*7*-<|teWIQB_%Fd^jp zl*=REGQm5UCw1u!Q{0WF#^LQh!F2W-{Rx=9>Br&$u#1cDrMzc^T!~n~h+gkLRLtvw zt|W^U!vEs$?g?G0K=D%&>in;YxW>J{GcQqV*k4`rGu(f7<&=LL9&b3?Yd<)J819M3 zjDra;N1HL2n@p?0A2LWo+iT7o0|#0o@wL%(Z>2)rD+R;%P*^on)L9xb^*1U}{B0!2 z9Qhx%$L5pwr*M#(U6IycLd`UFwO-$ILrTfMV+4%@)b78{k~5;C=coBIpTM&WxMTrK z+^Lxm==|uv=g3p778=KBlvL7!jO9mUwPkf*V`&)Mg+U?Nt_gcbVb9&xWPLzwO4AW| z(oyj1r&eq)2QdI(2WtkA`qnbQfrY$vz2G5y486w9=AWO|XS8`6LT%p`+ke)3mUq4R zj%q^soaHvj7_0grpM5|Bv&XD36lU8(058bQP5(+(2}tS2RXHJ|Vy#KKaJhjMEQ@^$ zTTnbML+PoapQ1hlbhO_EbY@$Jy6vM5kW)eg$+2roJbVIbQdtl@61mR4ai6_;YRt2bT*%-)u0`F2{ z6W$Uliq@hwaW;tQ(X(8_i5E`J$PXEm%jZ#Bkd+>PP_p*41EKq zfrTng?6sU%&5VaFj_;!bV6nDCPKTw5w7v1yVeZ-t2?Ez|Ssx8j{K+s~joz>hdN%fi zTOP%O+~h}Xr~bb)vqAxZaCrL=pAqS_MEMqO{tr&!f)tmuREd^3?oPF329}RK=h>ab zc-o}?>=-^o?~mD=vyBa}6pY_P;gdLTGlyVc^Pi1JjTdK`GSCMEG9wRMnPkpn!U5gA zA0uMB5!ZPRXuKKMvikTV!UNE*+uCSq>7g>9DtPTd#}j`i&NS%)y@34st@iAVs{-Vv{b-ZH*L><4=z9`FSoHYYcRq~wj zzDenMM876Jq4@^MjLGz8#T))!&Bcsisl8C!NYY9g>*6Oas1Kc;9lc~%MUHbUQy-$9 zofZ+{HlPgwLdbW+hFSw}#MfmJE5{P0D%3LC?RGO`9=%1h5tBkLEPPx4X{GS@F;eM) zwEkrMbsW=>v1c4QzIQ~$ykomB@WCk@_2@bedp7&Ylo+SPWD)9cRzJ^Dk?VXJ`tF#y zE;uN(5o!AOl710IzIHdor3Z^{8~`$bltw2HXw7~_x(ab;_Z+_S>s%Tq!(oY z1=IIX@E~X(5B)C?R~`GltE7O@Kvj7B>7;XUHFPvi!%)xNz~W3^?EW69bFR>OfZjn& z4lT`&t)pTquD`8X)g;S361ZUvzG^*=46=>Q&I;oIl{|UGTliY`X-})B{mRxdgtEil zdIfdnw@*YNjum$IgYREJNEJ0`I&>Eq?-^o&iW^wRq;eo8@%hnsi_o>4$jsUbrL0wo z&7ue9bGzRXUyh3H>Qf;r*=b=-pFxT0BF|8|oW3ISLnsEgrViXz)UE;!Bpz7^aJrCLV9QHZmNik58nJsrm~f1XdP%@YYUo+E{&wBTeaWKjlk*pIS=(p~;D0 zsMGw>i+vpm^9GRr%nW_0z45`7Esxd9beptvAE58}p09|ku=3`n`sP;(X78ckdvxbJ zv7wTjS=WS}pcul(=e15{uVVsAll80EL#Y++)G5!8= z!>nykDEWZzsPfoXQ4LZUy7qf06M)O*)?h%l$irZXOI(iPYS2QK`Uo4*qe2q;SFA?* zNpu3c7U+bOqLsQxok1~tBPz)@m3ylDlr2Lr#=t~Im?vPM;|?VsXIuk2Bm4$iuA{jE znd_kfE3iT6zAfQJcRHK(!bdLkT19@+;Qnm)A2G>1Tpa3(Zg-Pe@`Y_Ckp)w2Ze>q2-l=`FkkzB~71)CnDwQ=MEn# z&d!m(sES$t_w=PwTFP{-{4^t`{Fgo^_lf)kWPb5Mi*Bw|XC)}bg%ZXte?kT1E>ix#v^=LU6fj<}@}m~F zyvX$*>!fM;h&?Jg+5nz42c1dVOd=wUWM*4}=EOHaIa-<~oZnE?S)YbZj8q97%lWDh zh)HDK^5pYH(FYVtI^{sc5$jbrx#F+gnmYhpaox?|Vlz>*fdiPxIzRJ;GRK%6(IBzU zj`@(0Bk);%uPfCr>C|?&2iORSmANk_N3gUuSvn%DOYbWe!ybS1iDz+qJ!)w@Vx}(E3Wj;yo0Qzt?{$#M1VxUt+1&8?YVl(_rO1 zy^i479c=$8c-z~$(zF<9xnMoSM!tX;#e1wjlIg&yo=5N2+lg&j0~xptR3k`zF+Y`T zyMD>PxwWhXXDG&cINe0GejTkGz&~T#<3> zHi5t13Ft|i2vU!L-o!PogSYFWgcd!BHn+vnNT8N9fM|2te5cU|X#|0cyiag;JXR$_0RP-ox{x_@NQ&)S&i_KTAAJN@BX@P4t ztdj-OAy8_$L~fZ|dB{hxSQ2Qc&rv(+vbxjjnflSYn35G10FBIG7!fGblK6`F``Ot9 z`^?J0A>UbsPz2)8H!sz9=)iyOvVLm2AN+t2`>eA%o6&j&Hzqw2lL3m;CemIe?>N*Lp?PRw}f=Qm}dt1$Zcm7;`Uhr6liDXyNdfTYZ}%%5BHuA`ZVsLW!J#J|P6Bj5Yf* zb?9x-eeSzD~5qEU#PwjJIGR$OYl?T!z|omV28h@*&(wgm9xe)-+_FU2arZ&xey z(eaa9!iCPPVl`9L5_x=K1LvGLYimGb#vvZ)3!>+|{CC~$F3E)Zon>ocG(1&=y`2i6 zMki}!P@BRTsbOg?PZVlfv>SzzZx3eX^cHZY&P?3ub>6fod?v{a4!V}x5G1m?pQnnf zbR8IFU%$6hfrl*k;1qJ%^J)fTBnDdBFI7f|EYEtk&UuplyDzH!qB8Vfj=auW6gplh zSigtDGt>exgN<*?t$2QF&YYTqfr+G~0-E!P@$*?R?sFyl$OPANl3kzGRbeijIznnk zr*(6|yhu(7MbEs@H9yi55T)F~3?b|uVSD$Pq}}XLW<6n(JA*q;4vwiQSQ6C?07ud$ z_Tl=UxqEI4vkk)lo{eSO*3#0mY#Xa(z1g;HYq^$IYgx;7E!(!=zCr!jclaIW^Bnhm z-q+Puuj4g}Z_c`*bZVJ1sQMh7I%s4!^;NeH4@luB4ji5>G_=WOzdENrC`>m=4Bp6E zTa1YA7_)8neF}B%Za-K!dmYy`e??&ok4iT0asOb5d!q8`*V#&Rlp$cf*QC2JOVG3W z6gJrF$X?2FDz~nAHPzM$hE|TwiRTbQbBCzWvzME|+UD-_-|~HSlFNP()6%(I`#-9` z?cX#%IEB$2+hv@n8@F$*mh~RSQkfMGX-ukhJ8OqHo}SAt3v+K#Xnmz%^&Sen7x+4_Z8 z%rIj%1wtSi?vN3ZHlvEQ?|<{(p+R6&-r;nE6xbn%_x^u8d#yC7s3WG9*B`y+`cn2i zur#0PyvuAdR)PR-SerLSHJ|pndlFmcb7%9F&07@OUMX0=heAFYWy|02=1RqdHtU&i z$c!Ze`IPjPT)*#ei4$RJ(Phi1YiVL!5ufL$pW6B0)aUuMW_~VzX$^F9 zGOvGb-e&g-omBXKquGq-#1v#|V_n$s*7FtNooXq}b2TWlN5OJx_R)sTu=3m6wylIlDXlDlqs=<_z3Qsp-BZ)hd0wmdxkovfoao zSqMMMbY&Q2-B%OYdsYmo3H25QgV%#9h)-K=VJ(cB3lOXgG6a*LGXZR5!HwNTh?N$y zIBZ5uV@(K?i;-l-lIX+imE@*XP)A^bNy~X{S@6rtvkR$+U0Koyp+27mY&K|feX=O} ze>K1}&A7hBu?ra1mx6ZooiZs~UkR$1UoJVQo+Lu^jYw-qct;GA>5N9=5~q>o+)!;j zKSZa$utzM+FUme}C{))13TxdZBGHFow-~Jgo_vV4{c}B=$6iH50Ap zc8RTYrF|9Je@gr<3LUQ$Y~Mp+`ssPE=CdfV#|~wW0_9u2r@KJmF%pt@+byi<4Z{l;HK_`4&Iq_wAJE~TXhps>8BDW zWYp-w8}W(Nl|@7&7Bkihbp&(p#M5h)jj`>I$!QC^`SF;YA<}>uv#;N_Ga%{QywfV| zNcM6O@>D<}_b>T@b>ci1^^Tr6HS&=rqD1Bs#lvx800}W(gEgdqmNCuCe>D3Me3juV zNSLm>_ou+f1IW_oBUG}}XEW(2Oa*@OaPDm*aBg~(yp$TF>jmf*)0&3AcV}79&Yzsh ziDZAqUL=<{Z6dr@abz(E%rLpQdOPkb~Mjh=_Gfk_xWyP zV$2xrczkj{!!=hd9+u$D&q3+)oN%=OJgBSZlw)*_Jvl|9-_>(*r%VsNBQreuGGG*@ zL$IVPMqn|5fvVU?ac*yTq@k7p>rQ8WHJ7R3=~aliRNA0C!0wOKwmuBDIL?ujB>@w&Dr!Yb@*ZrdzD}u1z;)B z<`YriNTArB(wvGta57k%_lKkuN3Ux zLqV+IGM!p)<=<~xjwfpbOUchO_$MMwAYRMGT+2h^^+PtSAZHw^HHnD+P!5P=G_VducS; z$8sPQKrbSHKm$A7mlVeSG_Y(|ZWze^*z{S0pLPwh>EH|bmSVX^ilydlVf+nhMCfUI z1^&+9-+Vv@*|~b^=J*M*=HU+9)A9$NiS(~hd$i@|dGYFwt~#bw80i6nzA6oAGy`*vzs#D-Zg>C$C99aXnTH)$4^@=LTSgGY>ts5Vv2WWiNgH zYyv+N&xKtx;E|Hs+g~768=<^|Ebos6EJjA)Qk5v+`{ZTFOXu^$fRea;*>>^G88%Lc zHaw=ip6?GO{#CxTkoRQrckbSs2Js26&nsg#cM|(Dsd%;dqi>(JbmPV3CZvRI4kV8cj88b((Fsie*pyphluyZbbZMIX92f1~Ev z|Na3&nKDXTrBjzaq4Ws}Jq&($f_n`78%BJ`|)l|K&HsUy#1L+27?xL=4<&m?wl()K49+kly6P26P)kHddQ zW9S5jq-v2B63eNALpu@4}C}(2E z!O&mgPZT6$6A_5Ksu%4c7xy7K#Nh)291ZfU<4~&*8qilOse)TU=z)xGCm@!s(UVpA z2menwn^rvV5BuMX4dW|y zTO~NYx)OkHLoXekE0?!VnmD=Iw)VzFbmYIQUnbm%rv&#t@KYTx&xrDb@)prpvF@tZ zvYGx6wrZ>rq82Ud`6=pnAn*9=}?&`iDo`os%^L`~5g)i8vNWj^+%m9%vw$Vk7W4e?@v zzx*Z2(-2+O9JC(g-Z$JBn1^X>!#GN&wo-u<~F$G)(+%^4MbG<5*5HW z-zsNA-bGK@2>!;+KuI0TPcvP=$dLGX8PaXdaE`p#5>2W?#+dIElH)3&6)Cm`6~EvV zPsuoD*vr{y&v>~%IEB8S{XNWo<(+SZs(#rP>+bYxlpWd@G!%7XpTYzQ>b*JGxBr!b z>w75NnTvlrd%}^J7tq1&4>s3aZ#G#kaq~3U$yV`8e-aR}P9#;%-t7C-tkd*>X25ek z3>G++K{m`U~~6 zmrhsBp6b6)bf9p{8jo2UwTXVPbJ&3V(^iD1?GL%>V>%A7{I3M^e>1w`sH6<}- zFMX`=!70qs#Ca}V`b>J?-F*H7uA<>SERLA{Uj&^)AikYDr-|eHO5Id>&=}#*}RQ87)?|XA4ma0pHyDZ+CPGyzvF^PR_>>rBULGjDrP7k zZ*yZM(;|?X1JvB7(3L=L#cYhpN=QBX4HZqDg%$Xr-zUK^NYvFLwMRS>oTjj)8XP|V zx!l9Mj8KJ`@7j2hZFkiB4-Tw&JR3k;WtADD(=Y@aeX>2vexat+E39jKmD?mg6hu)VV zf>U~Ii#@*P2p5K91X7Q7A{TPH+M~Rra8P?CDqQhgVlR6v#tOU6*_USEnSSZhwL&xY z%SCl!eH|4HnS?+YLADMu9vzJ2HRDOd?*;0nNhc#1e~~ovEzQA$G&#hqiy)~LFMA_@ z`)rte;6GC?Pv!1mDv6G#N3_-InYM4aj z>ch$4)BpJKz1ZZI`^heJCYKuD+UzX~L$4G(-a{cRvEESHVWuqgOV&U3WlfQ;tsrF* zrr&+e^XbRFqv;m20Tx_4JET_BqAsE2w(jF9ilvFh*Ee`~wah;fCimun=LK{nYO6HL z?t}81afv>gVcY&fH0fkAiv2e~!`ChFpXgKOY)AHx#Q4$o>~1V44`b zvI&g|1YxL}cQ1$eOFlXuj-J=X;zLFyij)0zC~al+rV!eL08}~}rUh~_OQjb`6tUnUQiy%M?C4;=6ZeZcqNOe+Oa$+t z?LufC6Wyr$^%>#5@y;iO;_qhy(0PE@ELiOpJ?Vo}P)(Dmwk$wgiJ7+aGQ2`CU%`Gs zHpOylt`Er(WlxwOdyB&GD+SN@P}r8KUobW0qdDgyvK*wClY(t)^W^6=p%_ouNBKAM z1tM{P^@1RJ*4}JWQ_sw+U7wpvTS#3%0;Wn*0{O*mq8l&?$ipS{ay`A%-0y5RpbP&S z-3&KTK9P1>t1z!qfRR*TGgf!@6EH6LzR=a3KxPGaB!I)w&rjW0I;2M7hDZXZN40$- zxX`!7Kqd|@$YKf9y#)|Zg4?eaAsnL57h=#XG9+js(ia6FoxqPEEg1+ZzXF%Q8MwjP6uk+2rJ z$Q8*L&ps1QOZnOQ`I)BjdVm;mk_Vv!>xiDz#}Gl-V?U5Jh2F*JYbD7UCZjM$A}nz9 ztrc(4KUFQt>t{lGb}Lb9Nbtr=wacFRcE*?ejewHa-3~(};v~D1HEk#z2X)~Fu%mq0 zlh5Dc24Oj6UMfC%`Q3)IfFm<0f~gS_dwU+8MY*d_W_bI#)bqsrrA%z&{L@<$Mqep- zzlQ=IgaqDT7Gn{e(&#p4zM?SuY!dJ6Ry8}&m&`r(EP*?!Z9e4A6HfkL1N~if8~FVW zafzUy9y48^h>2CkeR@BjjX91%RjWg*E`9ua!dq)WA^{2gHzF;Viw2Lg1WkbXD7Wl2 z@5O4Mo3vg`UCl2Ps(-s6ji2F#*7|4z;}$|&f#=OHM*`J~0KK6g#)yj*Rg)X!+_Lrz zDt4r?2y0ZL-6w)@Rz|#t?lWV!s-?eEqZfUYl0ZxXCE++P@W{=sB^IihJ5-yf0Jxl33VyfntD%(E@gP;LMd3cKlx9x4AxOtV+~HaQFU!FaAj%}I+-Z2oRqJq8#Q!Hvj>{;z6{EC#7< zHCL$M)E^MUf-JM@z*p6XYMZAB^SFEQr7wmkwP4%byW<8Ig*>17lZzrmtMEY#9*%nW z?W3g!Xra}t9`I*aSo{Fg|<%6O8jz+s<$Xiyi)Lc4+S?eanXU4pDLt^X`!Gy;=qg__R+|& zcTYpM|HK7jO(Fs){jbqf($69R23eL}dmFEnf)&I98&;WGbKCSX^LnH%^N}VheL|>nS4i}qU(G5F_gkis-Vq(H9=K` zBIcDYjWWAG-4*I223kyPX zh|=jN0fFOzH?_0{VkffUb1CSLe{?W++!VG|lk*4<3O6 z{-Rhkk=F`6K09Tl;VlZ2uN3^>Lt(9+oARgD*S%z51zxEJ=~oey$ZouO66Up89Hn^+ zL>b<6T;JIO-m+RB%smv6Ja?GlYyq{>1!DWm$-0i)c07<*@*8^H$yEv`i1a3Vay3Rw zZ)LQ=eRV8_?~x)yOUO8(%c_e_tw`56GG5ejP1q~G`)D_FFhgLY~-nc_iBO$ zF|7A5SarM-LIO?u1_Ay9WTDhn|7H+%6Fx%$^B6bu+xmaeh!KGRk&tTSOx)S z6wX|17^)pFl#J(GzJ4(LHpb3eeIJ~HGpwvw&oIZmYfiez>lHQl-8hBz{7u*dP6kHQ zv(bviTNI{VDFnQSf)d{3DErUAx!*EBL^GzJ)8mparw)%DqG7%*Hbp~Xq6k@xau2Ar zDgRU*L>E!_5Lzis_#$zIm**l!GNwmyd=HQjd4iNYTG$uZ+XOsAM})?QriYyM(HEWl z$gQr)F&Q_xiW)_=6gq_=@joJ(HQAtw-zmi{ZY5c&tj{Y3w|)jV^da+SP{E0*LCgnE zv_gokNjW6rBL9*^LxT2={D~h}r7#ukN-$r>GGd|-+W5VCh5mT6Ap2ymdu`oj=pUa8 zz_b^c_5$(EN=4}FUs`nW_K7a6`OSPq`;dn=`|!aRrAs8c#?JyXr$b_24)1!B#&kYG z#3QEjq-+ufGY>o1eQ*llp4S&uAVR}IWS&uCHx;S(&|g`_^|h%ZzkR zA@DsESa7wwEpQ70qGsWhgU-xa8hV+V$-Ik|ZsvES3}Gt6VPzvIlmpt{1Iq{!PLBUn{xerE_bOsf8-X@= zYgKDhb2>2>`cze(ptwWcU^|b~^)kd88!FO^?~I5*xe+FUOLkV3|6>z?FW(C7;VKs% zFgR(K+c)Om{QZZI+;9UgQJ2rBkX7=i*!!uFETUW2qTpXvQK&qVEZl?pi*w>l8N7G< zuiv=NADluBI#{4g8Gi|lJv3(X@tmJ6zt@SAIp0qoD&t?-$X_MjqA>GHA?Q66epX~z z6`b?ZL#DZ!TuaDQ!hr12Vc76ruenX)45FnmoF-UslW!YcNNY7Fj7|4tXy}m^8}z%< zd{SP{KB%?91adnuY|9z<0&iNB=rs$}<}IA{nw@C07WU+9(Y=rD@+FSEO7>z+F^pR+ zo=~Cl4{3tUXqR$_dP5gbJH>_az<@=s&ob$bsMqy6>;4GHkpigJhQzuLZsAeG#Wrb{ z%myUbuzx)1!Du|e4gBpGAGi-OV1{LTZ*#7`4p|l!%X|YKXFbuhBP}{&!`JXK;d#WR zF#B^E$c$~KtAW+Fm)Yw>*|CnBgp727zs+Tx!9EgYYca@~u%zEjk@9f7y+WZrI0YpG z%aOpIxoG^|w7=KiC7o+ALU#iw%rYHk7cY?D1K+%knti1Z{2mGw1hv?R_}zaL#H;16 zA5u?vsB}DUOCfIap1hORpLzMcuNWjb-FoozA#kM(Cg9^6r`GZhG8OYTVdS6EB_8vE ziVY6Hx#&b9YUbSJu3t@1kT*9O?0kF2$G)wG-HPGgDaDuI!e8~x5-PX^YK;=|8@4P# z+K6y3isgcJgm%cSsUFE~Z^_@5dfqPp{pvKuA8++5o8QBJ4< z%&Ux^`JBqb-kpe`B$kXF?^E5q;<#FCa9!Og9>;}Nr};ghbes=PVI0y<`&;E`IcEk_ zlJ+&?f1UiFi{Fi^ zWzkL@@@H&r9Mx0p35N?dZ8Uv%of(s;o9e1;S@zS%S`(yyVdkW9u+#8BFp{mw-3p%` zQbd2=ox+Yld-ji#&X<*c*@}i;8jc!se?MJf!G(=BH9%x4%Q+_7#P)n)Z^e2dSKW{g zQ_A}m2#E9FG_#>QV6L3V*#zu>_?AONikuH=?PEr zbskP1d8$X${==0tiLI02wg7ww8Z4nrxC04Fsw=o}`ESrWk*l&{L2l7EnX~4Ze?|)x zCmkK|%9cS5b?Cv(JZ)UUi5bIe29MOFTo@_e*HwRT3JOI{rzcsmGe0>tqE3*j0+h$@ zhcpaIVsf57!}^}23%^BS{*^-LdniOT`~oLAqeGhLzrT~2qWb-F6^RKX&|{YuX2;Jg zTvB7^v`+9zlDO**kPRD}k zV}u$lf(Sq0{~?ah9ao^cfNhX5Oh}?VT{F_Dm9jkSeb&)?Uy`<47u7m=HwIB4tz`Jg za2PC?t8QuQ3b3v$6*S!a)#MqegMueLg5FayYNq4ym{A1pW&!U`39qQmv)pLJa2sy@ zC?3I4Ny4=_V)JcgCj+TimX2|S{-ggkx~XviZTvn;H#)?=q#m&rl(!9wm71XnmfZW` zs*LzGZ&CR7N+Ik$6#mf4mOK#-EAcI#eESZyL7uL^jUZF3MV5%{6s!!&Nvl=|eOn&X z0=(7jdsl`Pi>ioP$BVt}6onxY-Dm0Zu^C9~Tt(WySeq^Y z63}O}_V=pXZoG0Np?7vQktit0`(?2E@*%9DLT72S`P+&I`u;6SIvc5om~f;zE&qJy zn3s05qJ-=e6gDQ5KX@t_U;NT(7?oGY)T2j{BYLv3J+aQXXHQYQn}0+JnY)E}i^9Sy zh4A-KxCAAwBkaW$7s7WK>58F(S(5EBq71D(SK8Jo)8T^k_>VpSqqZJXR&k)Dy4#Na z4@+ZRx{#x5O#v3CGmT50An+gh_P^5|yB8PIS^XO3B{re6W!sBtrORP`w-uobV)uCD zmUfsQxbr4zyi0B}WJ*Y8%Z6z>X>6fl6nD>M9+&{a*Dm(!E~aUemlmx`ajF?U6R``h zl)~sqy7|Uc{uKTrT2}8$tiJJS6iYn(yGg(Li`W+9syftfqSsqACqeOmd7?V!?CFDW zOJH3*cwAg=?Z6#qcZx>(gepmmvFPoECb>`5k|aq@)aK|j-_5Oce3UTLhqc&5 zb8xuZ2d6+SL|hT;mT&~Rnv2{jzZ*>RY$u>%s#**CB}}G%HFWDO3X884BHlv*)rAG{ z);>Mdn+!%Ik2SR(@lW|%nCLZxFsxoC8%3F0UYH2YT!2zacoP6AE{H)zgcNQ3hozFF zir~4!J(Cg=&|a`8(}eHrDU0tFL%#i;M^t!l=7rc_?NCwI)n)dg!7pOF*oJ(=8#?|(R-9syQFzTyy zmjN#m?g;s0r^=sR!qY?sqMFb8Tcr6Vm%B@L{+QEq_%p!%&G(RFlYTcuGuHv;WA2gh zx|oED!FU}QGQZZ+HVKExjR?J8YRZPH&W2p1lu)ep4K*i%TcAms`RsX*>Ir6_}qD}+5tH`i@SkiJgq`~*w zqZ(1Yb-hHRLi#frfRcFE_dYxKEf?L;^rG4ISXo-eb>Ytk$a_Tn0e*aDaGP_Lx{lMi zp}y@y%gEH(Yki9%&2XdG_|th71PPZMWWdZ&j?G9ZgZk3_3CwRC0R-NGjx@9G_^(P7 zE;iw#y_xbfQQWq0;_1#@Oa`xq8VwDMar-@KHfocoM9FQ;SN(DsQoxUUS=MZ3Tp0;}wIz-J`7lm^r1(TgBG&d9Z;vLRQx%qq|wG){Uy#4gnSSA z=t2c~mIqM-G|Xs!&`3~b1Sk}lU%uilx~r_@h27r%mi&(^EN$9}(43l)VXmTS7f<(y zfpSA{OFt*Fo^4_$@yR)7rC-W*kR z7K+?>r)6TSnx=@({zwNwJrycMh#l?sSm&Z+*F<=OcRAo@P$?tPgB$hu-xbaRu4ah2m;iXFZMGr6c+FgbDqoCxG}t2+5@?v>DInTJod7n`|89wNfD&L z2!>z-s{D?Xfg22@;9Pm74z3#?eKm+~29KpLb9Ehayy)Gqk5uvXFw!T~K~gizpT{ku z!Q2~fQCNMY5c3`ixa4RT!3Yxq{hJc1U;}f`SWGp?UJ@rVL3t|KqcAtRW@$)Jj(v5; z4~D5WN6XYkbHx!zxR9T`$=&oA*4D%_0N$?+m4H@p@C37Y7IzV`*QcAL`Hqw&XOjKW zQ!gZrs-~QRPY$^iaPlokOck{~|1bw5ZI)awx^^n0L_? zC*3G2v!tr9mHX;ZeRtVeOSd z?0YDvRHeE%W>4ff8v0y&iLFiN->A6$jJ;QLjIXhgz}A&PXZZJ>0t!?(1J(_f)Bnf9 z*AO%vBb%o}2+|h#6=fqifZ#EfX#7adMqT56ojlBs@I-z;&mx163)%8@L47;il|aCN zWQ&Ni@4u!fQc?(h_V+E+SF?vK!JM_<2@8>L}RnGfV&8jxHg z8uMvG4dqo=%qPM#E}9CP1DlMQ_3e*)*-lt-*EZ#3ruZv2@dW;#1yk-VpbA_dWt0tL+6(>Q_>w?w?#vmP%T3Pt2M6Dz&U7CWL;+@f7)|+)L)UwI+i~A1uiZP=5bbI@j_j*X0Gk%@71T8xEv!oL3qS&8~6ZB8= z)mm79>9M+~r%YDPg(UJ+k^Fzn@ziu;-iocPu**KAsJ*&rNdywK`^q65S&GdB1~n2V zkPY%0DU}Dzz~NNT<028!>&hx*@`N%W!;1|Ky)J#IRqE8Al=5Fy#IGcx>CEBtr_qC^ zYD3LZg@%{e3&{yq5!&z$PL~UZ@F{YmP;oY37e9C^II$L1q%2X10`8d^Vh|RQol0vn zrkrB`=hbzN4ep( zOD0#c2h3DYrHlxBxLY1)Fek&1%d4bxK4p=#AVNBeqn;T5hSJB1yttl7>YxD3i@&?_ zSI>>mr4)<_Eq_fFs%u+Ruq8SjhN%*-v`~Iwxy2N=*k+)xK8}XG*W=VS zkik5AM+WyENKK525OCX@}>T2NsM=e_eM%dWLIdKQBY4($Z96V+uWd@w| zMuz7=U4qflpcTClUjjR~lw=~|qfcn7;>i!0R7qd|UDt@rW1v?pGE9iFqO?t%j@}j@ zqN=y{7KQCs3Q6yw@YC@{MQ%jeNiy~k(qr+O3^ynMLTX*dmr_bqAA?8u%GE|ddC}@X z(XkOk0(fqk`RO=Nc9lMX11KofOU)ft1NDzIEoIKpG^3r1V`*{Bl?*g%gfd#Sg`%() ztk3QcIi6#Kau+04D*B_jFT2OX28u+!x7x$e>?)CIpCP*Di2>$Ex;WbVA6-7TM0Vs8 z*}Y_4Piq0xqX@?N{W%S8zT(@78g2Kr{rereX!dnukL#7G$nwR zi(|klwdo{J6*Tsg*%}-|Lmw5hEtqd}uY#}8YULy_E8|ZeaY#9>bt~kN`2zwWuD632 z!_=~!#Hp;wtJUR$rvkM=h*H(&9&6PuKnwaSJ*Ki-Nh-}((6E5>+)UdY?CLEFJFgUy z-$Q|D%QBwa#5u2n)q{l2*nAKIM@o57)<^dm9IazDN83&3`&v)pWq(>Wn5Q7+=K?0= zO{)1R8%;KyM9xoSIN0KVNphyMw&}$@h0op&Li9_j|86@Y-rxheg<2RpA}rbpp?dW@5No25Qm= zZV}G9x3Rr>sJ`fhc*xHUas}NW+f=mXneP3zW4Gm{gi(`amuraC0Ki9>rtc3mL5v+D zk(KD=`$v*`jlSW5M#6^JzHj4NBPruQ7pNlwl$SB3iFT{^=QteaQRq)QP)JSzr99T3h9S^4zgZ(dUGzEVhe4+W@%<#62rdb7@}2a4c4R}HtzZRo98X8zogA0Rb&0Vh>lPWaS{%H$UAaZ50N-9fbZC){bQpa|=iR{OT zi^@$sDxtLfQYVSErUkXzi}r#tUYlzJq>iVs16tJpbv))~@8N$p=q`(B_{p zmQ1u}SbFa9hbdF5x*hshntfLT7}W&HJ>_}~;EvmDyexPLh#-9_W} zlluefd`h1Mh1BZ4m~_H%Sa0>dMPdJyLfU&MQ2tf~SU+9P1e#cjtASbCo*1&<@)+8+ zqd%7;6z@(jxWJ-U%yT&4VKn-tagfV0rhe5kIs~@zjxCMieJ@ndfFVrh=`qEe^2x&h zFuX9=0*4^YQk6uF{7-pZ;sZV;lYTj#oH6;yVvSQ2lOf_n-UKn zpd#|cj3G#WEq^xw*Ba1S+kph0$`jPtQg2Z>c%_j39t!S6I7(v|x{3r($ELVFisz}OLR9O^7#J~@f)SH=ToLp) zrqi*>CL?qd3}4jZvw4b7JvEGbP~inP)CQOM?ZbiO*4IhvkdY|`E4o_)@u~?T4c-|y zu*f8S(mkt!S&oeBb^3KJsxzRZ3L4EIVOpg_ibTwIdH#@J$8>+^Tc*eWkTF{eYmNQM zp(>0J9#mTa*^X1SjiMy+NGEG*g*P>x4D%k%xLj*Zj8XfxASG<^O!w;d4#I)BP*~hL zq87p}!1$UKb~IYj!Lx#aqc>v@p1RLQTcc_un0B#mW>J@!odb~UL=>jOy70utN@<4mQJEa7yV@hI6r&UbEWWeI<2UVz5 z`~twpl{V~sXCnCZekd8KxFIEGq@W-AhzN@5eHE-+o81IT9pzTBt+LA1SmCV_rriHr zUS@5>i`6i^h+-Of1WB2*fu7=$iwfg(uo(9=>kxsb2{)z6nFZ1vk{LUCAhT})YKRJz zO6?Rv4^>BoWgRI)cshF+g+H|ibyL%lu;Kc$Jt4l|Qb?Ew=h3-*Lz69WlUbDgt39~& ziO#&qtLwH+;Db|e8MaSl6FD`E@X9irTCo=i4*gf%>-Ts*>FJ=+n9p+b7KNi%3YqVr zKrGnsIrcxC-9wZd+1|0%Psay5DJnl%&Ua*%xz=Uo7}8b}G0o|}7xaZJff)p`kTjE% z>cO>I8nAFKO&t@KI082##tGKVgyvmTXVrlYuwSa-_+cb3dlbG?BiMZZiuk#zU~1&Q z(Z*xBXiSRPYzl#NiC$P+FAE<9TcL~DutF#R`_f3$wo3OKr@6TTi-Ibe#V>AkFyy}( z?VH@=ioO55KA#F!dOii2~89;`Y38dQ$&E7`)x_?WRq%T$))kMhW{UF8Jt#hiE3%~otjJ#c ze)2`5eVPD}-6W~IfFJ$MG7@}5(C;YrYF1O~ zZ5HZB^whko6tk_@7mjxQIo-*IU-pxRjx-Rv?dChp7u*04;jYfkPiB3PeeZgU!s#o8ocB;L(kCA^(e*nmUZ(}In)^$PUS;X@^;=Pj zEm`Y^O+4okhj!N~rRTSs`KWa(60#9}*r3yymu8En=*_>>f7nyIfGW2Ez*{}ZqRI^H z;Bx9(W1;#oQ@f`!yfnPk`Lu1GsSlZTjc^<)`U?ic=&?=_EzF@5#<3j!<#r)c({MV5 zDDZVR=_x`Oo6OMMw>(?8o;(2M?>2-25En5fC@7r?+i6RWV?d@l&|s>=7{}Lt^{peQ zK?@@$*ME%jXXJ)pCO1Ik?rgZtH=1$5cP~5=p*sQgh(8(_ct#TRe2Y@4ZitrKmp0~? zJrG{AHDm?l#*(NE-C`F%C= zV7O_}@i?kX^5((w*(-(I_fY7-x|0)an_j8J0)s+WaiBM8#_WI=zhhHD(l{dI&t8iw z+)zZ)!+tiRNm^53amvAOU%(Dh;u^It4JA>b$)f{4BL`nBFl)QulA@t*A|Fg{w%ABh z6l8j8=l!^jL`rj#t+ECY_0L+MqhpepV}_mWW_4Bk?+YVi?ibz|=l|NTfLWX5h=lo5 zbThK;f=6k=#7uuZ*IN7k{;S0@WM^Mdm50hpLaxCRG$qnA$H+-A_=ft!n5Ln+QKnXd zM;iGQbq0_^vXNcaPaF#AMJ_<(Q)@5fIa zMvg8OLN#Nm7DA0E`za3mIF4TZPCqIqr`nCMP$!Y{j1VRoL_3PUl%MVb*g& zs>55UaQ;dm?>!V$jI92aPF7`l9_4L9lICqbB0sLbO#1$5 zdY&hEEpV>tno88?=((7kiUg6*T^SPxxV9P)yRB%7eWH2!w|6CR^E(ZxS5rYhj6?H# z9Z5#WpKzQrmRXkjo3?2TH(jzKwlNP~FDE1~v_F2jFPX$*`atitUAXyPx7^JsrMy2OJIxWVnE((j#TsN>OY_>jTp;X_BA8fI{8&E45 zD@IwC`buUewNFqlADja7H$_zQR3$x1_On|oI=ppD8>0FvtG`|9^Ke$VY@&t6xvNzw1#?ts8@|PU?Uwn|zx94GAij z41@o5@dw3TB*T5MyJPGP5ny8sqifWu_K3+?f{C8iK!Oa?2ZQde%ljN~u2h=Z#_24i z*p3QKgxd_nKw?R=a5dUO+c;zHNsU?7cp~^d#sUgKHUadw23U_(wOAV8LKt6gNv()G z$s!~9Tgi^L>MB(X@!B5vBZ~o9(g!1!k%rWyq8=>&>Q+!kNAuhV|i`m(!9{DC>XHWzp(1kl8_Xhg>&|f-R z-Vh(X#gs6Q5sIUFTru)pb4FQ8?Lu{{9hoyCta}>Go{YiD_xvpim#-A^-$UWgwk^+} z5U=Ym4{;4azTXF4l6{R&2n#sTX>G4s9uFV%Of6TtuD*;T zh(NZ$--RGM{r2?bBoiI3gWxCj0YqS&IfaQ$4G=_H%caM!>A9M|OfWh@uz|WS;e5}e zrs%BERYyXR_`Y8aqPl7!k-h3rDle@)j|~+dxStZ${|J2kg7>*m@oymbgZ}@`-DOnW z(AF?&9E!UXcZz$l(%=ror9g3am*Q^4-K7+FEACRPxVvldLa}f6*!}Lf=Y8S+WB=MC zJDHiudNS8ykYs^ww+Q#?X=cA`ZL`E|EYr45$RRGCq|;7@M7Kc0mF;EnM?x9VXtMZn z{yD3)i3xnuJ)%_ng;#~f&821NcM_D6_-L0O-{>fw86@<1y7;t19JAMnY^}IGMd1=e z;p=lKB;U$s7Nn{7WbL~$1Li6 z#2lI0ey_hLst~98Tx5==S~SgS$M2=#Ef>mGo+d!<@te;oS3-aEh~`ZN`fk!6qJ^B^ zTFVvms0NCb)Qbuu5pH13ldG7+cH{Q7R)-k&sa?%&A~~)laiAq-vyehEBBrPnnf2Kt z|3S-6ec==gycXNu4idQ<%h`^b^IA=&h_6ei;8rV{i=KclP*?3eMd1oWA^$lP%p>KO zllGF_8KBMOnKPJap>jN|w7aR-RfIQ2BC*alB@9_9i^IkhJYlD1y_UO&CtE z-WMfqZoICqGZ9)au5t5>KVseDh9tbS@(ug>BQ!b}0n-=wt(IFeMP@2wdi4+~<(PRz zQ8}*a)1odgbKw)PGrn81ifCpRwht}ZmA%Eoh%in4$RHQ0p@%xPZuJXwmd=dog;R(P zUV!nJUfC}Elgz1&i-Wr9OPo(~uq!4B*0ww?+)wxvh2J0w-=0IEOGU_rs6R*1ZqjIG zZAdZl6Yr~bLVbfYhO(M(YH#+8h8`;FW(S6(8ivWudCuyYY(=7rLw!w*Dw*wLf&ENG zpp;u?>m9DcIj=xB;`eba204tqQGGeFs8^Rk-uI{5~vT$jFwUunpa7^L5ay@u>zUx19@Z=t>*Qqk6Ns zR242?`Oi#t`fKsybfq!=)1S@*D)He$r;(i5`a!;HIfsuj+hyKMj=lKOhZm z(oXjto)i<5&)}PviC5(Z zT%se=bglQi>03G-X7;;Qo5hQ$3Y?#!a1EkR@Ei(aKEgM~NUL$2N-Hz9QTv8MVwj?f zXxW_~_@J|S-h>uiX4* zG*jnmLF00H+eG27HGWfh?L@u#qiO`ntJ<4!NQge?xi!RTQhZF&2C(#QOJ(&z;0DC+ zj(IT;0VD*jFgu#(WH%A4=^wE!sHElPeWg_roZ&#~LUOm7f@r z&4|-jF@^AYarNlQ8eE`s3V|QVrTqdNS*o1lGaD%(|_v>!gZRaq~27U=DtgRWyV`L)yU}KZmB)2rO>{j5huVKV?aChEws-FUdCAL>L z!cl^Ef14(rIbp9=S+vI(I@L^~PNu!T8-q{oHGwc$$dE$)y+HD!)ADv~4Dt9W`ayE=|{ek$G8uw7tW!@fcEqia<4`oTWpn=9Xpmqy>L z4e*a7V{4jzdV}Ok+oqf~VcU#F9s9y5{HUbE`BoR2`G(|RO7}Kie4uY zsF6mq!BZ6efG89_heClH+vV5U!oEU%Nc_OpkTmnKJ^6ZBncR_Ej#tz9R}2CsOV~tb zb$$Z1%!A(#-dh14rD|4pN3HP*>n#TIfA#<|(VqMkeLH9wpP{4fKBH=hpJN!7P`@w4 z&lxtn1-qN0EHN2pwPAb;99fe~e&w|L$SsnFo@JuCxh%^g-|tBQUX%3&*Bn;+ytoKX z0XckF>8IguyqEHqyoeGx*iF-^y%-t3;SAvgvK&pjsl$2 zz(jV@Ti?x#K-d`(^QCPPfeA)Q=BaQq{OU+U{SkMlH0(Q0@V1{{XxG-9VRP zjDD8Ms`~ObO~NcWfxmDHqb|^EZr9f#4Err~qfQBNt1!~`gd51x3qOKYT0dY?K1Jac zM4|XO6fV3M``HT*i}_JER1L!S0~(CDCzzygQoj!_9n6c`J7clD(%KK76)q>Vp1~lJ zPDy&;O&Ll0&_Oj0*?#{WsSI%c=Iw*C+k>XJ#^j%m<9OE3tXzM;iqvY%)qN$oN!e); zVK2c&>Mz>%el(Pi<@R?}n#C|4B7V%D-eKg(uWFWnsW#<7$o-si0Naw4dW^Bz0B4Ue z35o5X(~0R_J>tx0ur`@Hi$C*kHASQ0k;?ai9*dpMYIA}S&Un6YKnfH(ps3d38@1h^ zefAX-4bK;Hak9nVhwc%L=M6WWwRNej_k^E;zO{K^Q}MFk8nHf%Me2wSp{puFUCtOI z_GiPMmp-{*?A{@=bbONECl@7Ohxve3_(KayPw$}icVWx3N&@(d& zPxmkdI~dKMkz|I}?|9rF#~NK(`HIwG7e19d#4_uhDHt2t)(NW9K5(eSkgn*g2Pf^b zHbeY5bq6$1B>?$%srl9{Buq0h`>2B1;Uz;Er=!<3@LxPzaS35PamsfdR`zMOzqCE9 zzney@i}Q zbd}kQ2pvtqogz;z!J;>ru49ZUxtXY-Td@s~ONuubFF1Yz_7Nlp@rMak)=Z94d7G2J zS9OLi;m2KSSPA%wSwi&qNgIyu_~S0_=iSte$;XSS7!MUoylM#{_ZJfnTr3_RUU*f2 z+eT`wiFLj#;Yja&6mf5QEpnDjc(&?QN|+_=CujHMBQf_N3Z>7XK&#N%gg^L>%d$P= zn+(2;5YTts@BjMJsWd>CnOb7@=1PkQM%aetpqltcKTK1Np8Upc^IVlX3VJ2VPw#h3 z6ae(+p<1{8aE!>dSb0JEO7tQNpi@@XOm&8SFvx~XM{+@|#1>OFu^@URi{<+cBupFWy zyVrxYqzS_)72a9saBFJTS(?4ULLQg!R8@EYQ7C&3g#eoIMVUb&V-2GKGEQQl6+()B zg6ki&o=J$R9p{DUwkKdke?~+oMvFoT>!636xYANQP5n}eSi=z0lS>#NUafFfRi%Tk%LNrKU z<_;G_`B_@gd99D+eL>!z1rhcc;C7<%ZvFaDAzoq@^p1exJ<4Yzew}8~vJXib2%r1# zNH6+mw<^^Pzefkyp}tY9r5TiF3_*deM%xkGpq&NRb1{{tAwSh_JPaAb1pzMDJ)1#Lr{x5>#n(=pkA z1na$UOA~VJ;xYUn{ki@h?15{hSMsQ@rmg%bXvO6>H+MX1{cn^6R<18p2|Q%>pe?(v zroQta49R^$){)aC1U^Mpfel++cSQBAL!v-@qjMgng@0vHXF4p-+$W?574*59#29>2 zxiux1#CvC8Oa03fO1LW~FZ8ez^xiTT%a0dM0VkbYxz5x=lZ3zyGAw~8BQhsWbjLj+ zSb}^oT*{e|_bCcsL!sIg&!I4f4z7kz##EkB_inaqLLc376(L|m?@I>_EWg)6Rbv?c zxlI>e$!Pie40l@EIMG{)^k0W^Xo`t-2Tou*hNn6}nY*X-kidk#3_Lx9_z!Xfe!3U>$yMEkS3|rlXEr2Xd-eAD2``jP zAHe0-bQpioi@R;4~K@beH(HPi6GS`1Vs2AV3tV zoV#gIN$ugkFU^3Kc*=P5@qo-{33k)xPp#AmghTEh| zigVSwtRu?EHvJWHbju*%fc%F5r3?}W=(Ri>2zyG?nKLB`0YyHFbc~Qr8nybJ)c%|> z?_eoXD5Znf4dYo^99#C`e)$Xx$tzjuKkD|r2f!iUcAzJvmDgl)lGzIUfk?A{2%$`e zKZ!xAw+w!-hC}>rIDdS-G7fyz4_UqN-0K~BuU*^lVFU5K9pwpHBr)*t^F2GW{}ft& z7E}?p)Vujn^Rh1+xc;Pu#2zurH=SKUgg1AzE&i(26OFcNj_Ufv^gbK>u**F~0TM)^`Z*MWIW?nH z#PX!I4%oBQ@iuRh2VIcfVbMuoFiW@o_)c_Gu}jYswT}MdkIz1wgbPx-z5v`F^nBn> zU!xr^FSlhRkl=eLr@UI}fN%f1&-u&8J%q&#H(dhO{e-s0Wok>YfkcP1i^fNUnztu9 zki_{pB%yxjW=rO61^plCUZJ?fy#pY=kt0d`X%n11;~z5o6s4-Zy4h)Mca?a!=BKAZ z0e29(k0xq{RaoVPqaA$d!;v`eu~wLd%9O{U&*}!&9Oeu#J(@?UY?U(;Gm>1myDYjw zGEj(NYb=)>mSTM1FpLtD+VA#8GEVViYFPIayP?A_M^m~7y6zV~s`XO#8$n0D@T!o< zkvGObQk>8NwmDdE1+I~MAhp5mzLhrHEI&q%VEy4K3Q!;lHP4}NDpk%bI#ZnfnFwEU zh5Byx+V%GtFVJhy|3w4Vym4=Xgtw>DW#KZrv&?P8`L)<@X_SVJj&i=mehn4Y*AC7i zzy?;~XGD#(>{%xiKg6a5sUe)=fAskbWn{$QDSx={jgAK2{lE>w^4mqzCCg!U zWL)XXN;BqBro&*XPLr-YE=-OO&&SQrcN9E8+grv(GqvVuhOSKr+0zG9_FZLp&O|>I z^lr-9+p}D|>c%y~&9sECA8p4VZ)08=7$eJW>2T9sS*(FGhz|ddz=hV48BN2H5uP+&xe%CjIPzbFQ`KbH@Nwge39t?Iq5Wf zKQL%L_y(TJ^m{efF=!k$iYbi^C|V=V_x-Br!c^`u$iMg)9d(2X`;8A;G?_KvY(o;F zeF@A+C6wcfH2Q?*Xju&1PGOFHTD9}$NTX8aWBSUwf z3MFGCVS$0Celpz%V&hPH@-|l(5QVzuP|*BMyB(lf)MnYR*Q-E80mKc@{NlxR*DFgw zCLX?+Z4s0X>=8jq7|4duR=m-CoUk2`6eEPXPv1GPm#mdXZwENJYlCWd-k-Miid_#n z*y4~};05g)y2<8~B!4}H{SiTrzTzABXpreW8Oc4S+{Bi^AODq>$+?(Ui2C)4GL1=#N= zN|Ek##kL@r;GIV7fNSqj%C*~{4ngbXF^xV9bNLYPGg^?xlqn771aDKbz4a<^hhRn1 zF690WCLKjy)bwKLn@Q`9%wlnePe2Gr&C?3 zt-j&QrQ_ea0LxsQ%3CV!X?-Cz$IuNvsVXn67JXY zT5YXS0JI&H=l7=Er5~ZJBmQA7X@*O3vuON*tm^gYr+suG;`)%4NHdOSWpl}1tGi14 zv=(R9<4VQt#{tZ!l0OdUdtZ1}sP<{DOj8RVx;#M zeTo7ch(g12DEx8V&^Qn+6myrbYD!zhRrxI?HtNOGRrzUr2kbr|1U-_O-=?bk^J!0c zq|yCx@h^yJpEFbSl$5|%81pveb}N9NXNgy=Fv)|*Sw2Br<^etfvjR@Pjr8tZG2a}6 zmx6o|tJIwh)iqt`L;PH$vq~d9MP1<9EtLmzA#`>kW>7IOCWS1LhM=M%VZmgB<#8;1Gh=6 zH82Q;!CZtvB>(jDBnA8a620=KNrzpGvQTYBG z3PA;z%m^GDa+YXI=!!P;=BnQ#N|APr4ulJxrLD6>1c!&{bjZZCbA`DCP6P?Y^_^J1 z8M`dO7dU~vr@)zm-(vCuF>h9 z{D;97#IG^RBRg@>)$OflWbOO}GQ67EVE6ChxaPoC;)VJADOTq88sE2j%%t*K(xoxH z^w)h~_1(KM)8evzP3dm3(Q1j+ae(ZGX?Ccb^tq`MP_lk?459`5mQM5oEW520??DKbaFh7B(@R0#3_D0-F)Qp-qq}M-yd8q{Z)*B zp@>+X24uQ@{@C5ypOx?G45MDo^5LEcaqyfhQ&CNbog)U9b2|Z{XpO*3zV+wP9kJl& znM!spyh0C^7M;CMi5mKE+ZciBgiv`z8OLI0`3YQ82>BHKj3MKq{>6_}_A*Xpr|5AX z;wQ14n9z`UTrw`=CQXO9#K5fh{MP$^^*koF)a$cu<>$EyRC9e-3zY@IT(VG zOwAtqnCm^`29Qin+~OR`C$}0y4Wax@EAg+Ho~jB6APP;-p^(MQwBR{Z52shx(E66s z2?g5|x|UKqMA?mUV&ZP<2mNPFHfet)Pz`t6zYW*O;X8Bd1dn7D^3~>ovrCe!ZwB&* zlM<3x*!=8X+1KiLBOF&qp)a?kaD1=qj)DpFsq*XV-HC>qoM|v3@t?gGn^KKQfo)+E zt9d{`HHIIxUib-Y>V-|XzRN|XQ|O&& zHoWJKnOL`CiOT#srmtJdn>8Gb;mWQYh|Dpp4lw3KzaF!kwr|J973zgWF}_jY5Ib(y zEaCmM%6qgoW1*}iwh$t2OR(M^(%Kpu5U`DbO1{${=lX zAZyJZW^lj7p;qx-4ux5CFeXR9v<+e&F*FY{gLHk={C5P&GRKLRz(78fr#&qJFB@)nW&X)Hh(gPAD3JcP{nVauQOcA|&}#P}qa!$m3umn7IhN&qWF61_ zooCdWCDxIsdvU)!l;Dpb4PNoWcZS_4sML>;MD6TnKdg|aNgabPPNxG z*kyQJ5L~strmQWl=wwgS9Ni$|=xT#R=Q?vHeH&fuoNcv|@7`Y}?b*#~0|HY3;Tn{u zWa=Y3e0y5kUT+EsRDhfuZay{%@yflIDm)&AcK}1$Izffk^_}Wl&iZbW(5Vn;d3v?s7Jw4`2W8N1b1aj}Q&j;4 zM4|0D6w>HB11a^lKTBpsq6OA#5!%d!3ut>4g_|D!q-pmW{PMh$ za>Dng*67ODu(H>J#4X%n{eFPs20Ihz#U|A_SGV+Uc|8S};t=<>7$m#d>)ptcFpFVw zhBd7RXt+pPwH}U{KZ?F)^K)({SoN_ixHRQM;;rxy zOn$1?3EHbvbDMDh*2>Dzr?3`!Mx_Da@j}hrlnOTDqoJxFyY!Xa^p)DyJL|O&7T>kA zooh-mpI5K36dY^pj<`Rp6!XI~3#V)H07&y}c7s1tKU_Y56;HL`rwF$t8&e^2&$)Q% z57t^p^`HApJ-Qi1|A5llw7#6eJRw1GOZxs1vFv&@KBxNBVI27Ahw)(#iJG&DzJ>^* ztyp(n;Xc5hg$%bb_g4$F4|$MtH^b5eFB)kzAr+B%VW%gKfhj49V;rLN`H4Vbf#ge{ z8YK6|d41Ua2aU^Pi(yoZ`_NGvv<@u^A~&@PGVyo+Bmbu;pn)iKJcoj$DS3Id!8Ao* zO@!S>fHRgNRFKrJ?10{^QC?Ba_S@W1SN&bCd$~=B!@#RVHec!f>i|KO;%1r>1H>F* z*H3K#Wu+(X7mg!5`Xz>&x9D%dwnm*^wTFGtYt_M!*qm}7QUCf@p90O#qZ1-TvB8P& zy<7HJR2Y*es|dPoL|VENBT!y*UPmJxNNZ`rHr{fl95(AxDJ%D>t+1}myh*Qv_e+sy zbff*@=a_Tak8HUr;nadFX8QXzU*GrK^T7T#Jlz4@?Y0h9XwrV+sA3W997ybR*XssX zwAZJD2O;DHb7?-%U>{C5?jl)T=O&Y(DUw`~b&icYSWISmn~zyIG}^!PDMxDseTn6N zePe3g{pTozJ0AF>_U#QH41Aszvjl?i;DD31kRWt zE?{za8@x0C#)>u~%THi67f&M^Bm4B8=)(-W2U}+py8a6vE3{wVa=OgzWnXRT7oEfV zidt+?JMDCkSzfb&?PB)bSwBSq14NooaawjSb1Bu{(LYdNcyKYqS|yra-Vu_6CWW zWNbi)`;byyol*?aY;-E#;%5*MhfS4Z_pm_Jp+vr)v!8@WD6fCSxQv#t7x{=E0-E*$ zP&sy1&96p=a#KRjh_yej4H*i`?WSW--IQI&ApsAyzDVeUFh-KqzY*WJb!)wu9+Tl6 zjQ!bE=|}TGg8f;Y91zNeOx3O1mfnQD3@u5l6l{#E;bvHS$3bJ3R99@jJtE{fvk*m+ z(c;4#T<`Wu(3pQ?sj~s|>z|G=>*0VC;ouieVb}f*T`sOn4c+gBFELSH8bqjjLUz1} zx(GtKhovc<+Ml9;38K*b910ZC^0NM&R3CG+EVwX8B$?v~LtEu6RYZ-lzB zzYdMr#6JZEfh;9CZUCH3f-I6%)Pg+L@7rzoVL5Q`{k6vZn?Pg(0A z@tVUDP;`?7SX93EQm)=4D<|o>ySAk5EL&tC;w4Q>b2oCd%#Yq&K>vjbM23J(YUOo~ z;{3Wh&ovZ;xD8i^@7#F3BV_BeM}zEAGeQyD_loZWeyPdW$8^yT{cZ@$C;pYg&Rp3- z9-Ca>S%BjjdeUmxh2yf@99_K66ho^e)SKK|VP`#OyLmr?K1e*^AXKiXf4z~w5Y~4d zJ*v_VS&;4RxK;LIvQ^};RA74H6q;;m9}+k#9v?|Nr;^0x^LSZ%0yfx;aUC9E&UqBx zj66jF3q+ykITTQ5*b6*Jd2HYOG6*Q&Upu{qM1ytvB&2by#4B-q=uJnUoCznkG|X{x zL;(H8nWfU-NPgn+Cs|SEU_Z2Ip#CRdVq5I$4Wg!4aP2F7I@~=l>FXcP~!wwc?m`aIqY_3vvR2Gon`i-PPm_dPH#2)Zp zcIA(#DkT(<>O1Y#)xUpbC>X5;W96Y)kyBUYNF?XSx;Lcwu7tUAsh zMd!;o8Kk5MymqVAT83MtlBOw2mGwNFyz5!C5&Il0Uhc3uf8c!TuYQi+QYPLnPDBoz z4UsSX1w2t1-||vwtUQyyl)(=W9EQASdtFfyvk&o+CTValyz9wfBMyi{-*YGsYYpR# ztq19-nidGoR@9(XI@%S#H`*nDGZSjuBq}Nm>Be#6+`ZUbiab{ojuLl>a!DQ-w7T|1 zSU6M(FEf_`Qa*UBdgg0)(`LSUJch#`AoF{j@LEY(MBvgzmTcZr(O3H%{_@?Uz;Ye` zebI`EY8uNu6xm4pkQyTc3t^)*9njYhDvR)2#OcPr*rwZP+3ryWuEsZz*%_whWFZf3h2Yhr z`F?Qy!XAd>7e5#_Wf3(7e&pympBExd_Ste3>@kRFQ5aC zH9@Q{a=#CpYxY<8S?EfRUxW~IVc#w5{}kah{o$IeJ8Z#P&*pmb!YR!DytoMpV>h|| zPMR z*~|3u&K1zl#3sO|*r(oN0enR?2};g53VJ90`p6he^`gc0leqEN;wEQmBQQ#X5&e}gOl)@MUsQo~n;^W{*e^L|*aCwLz z6`Alt+g-`YX ze+{DW0~ALU>L202TE!=FFUP^mW?WUFt|=V z?N{iIS>?4yo11-a?z_YC-mau~>ZU{!!h`wByK42KdEF%rJMCzQ546#3io}}j`v9%= zo~SE(v#pp^-SDP3)}zIDfy``iuCM<1#ugl#wI&%lXuf7BBO*q|F`BGiFK3^0UWd4} zwMC=RoE)Sk6ZiwLKrFm9>1Ic5k`Z!q^W79Uwb4&-*>HCqB4Kv~*MWPZoi`MUnYB)+9jf4e+?T9AhqglQYK z539whKtcV8rTP(~@)x`)0dem)t9*p&5J3{VQqa~Rjc!1h|4X9qujc>TXx?C8;E4%U za-DbYJu(_y^>N_eppyBiUGS9(OT9e`b?l07p9igy`uTA_-=Vb(B^J3=C!jnkcI!c< zT2hk?ad_0~j?KCU3|EqRA&?x5uE?oWQ7YJ?;j{T$l3WR)IWUw$Z~?%WMEMP6G9$#J zf#irs!?&>=^vol*Qib2*s59VJwonRmQ9EK_)4(945GghIp1k(KKpKpD`^M>%fUKoQ zI*&d%DMYm%-37S&$_7qP=+P%>$M+=W9t{al*576vn!4M(B05XP|8-PX&W+^*DBaa` z*!n*S*exae-%&Ij#h=kJ58m^T%1Qmw@h;IX!oJzV`TW2V{#EkRIaVwwDfXaxHMg%L zSEXeHJ_z+7=*&Ec+Tf&F(XsEOhZ{g$O~YF#Mp7tPY<)~O&B*I(ykjR`9YH3JJ35?i zV*4(6{(W{tzg5j8gKO#T{2&-1 zOL*F)#mBvSkB=-~ul2DjDM_NNGWKUd0l6pWAt9qlCr#})$hEs9abV${vZeD|V$_fF#PTr4C99CIem-eI6Ibv?GItl!qUU#Z&gM@5Lh{Nk*(EVzjsX6s6? z)849NLkXhrKdAP?PRL~Zx+yyw=s@6*NxR$p8Qrws^5HW94V+FX{|5tEwpL)a^bsBF zy-0|?DdT3`I@Cap0+!;?<4n|ds5f%YQ5^vb+CS*S8?w8l*`PztJ!;EH&;^K#Ql{RT zB-D6Z7HMO-I~wb`zI{7G$|F{ad;%Y=EZQzvNGna4)Bcc`w3Bs$y>uW!08%{!iu0uE z&2&1#uEi~TtT^Gkrra~gFlianlkNWBCa7;AW0Cp$Q3Is3HC)lha&vW%b1MV@=pBX+ zN)?Lzms-)bpWk@a0K6U-yAbWcN-A71*9Mvq_{T-QtPA#=eJn{DO99_W`pQB?R6{%r zVQjh~y24E$;1&7;#d!Ow2(rK2@{-BjO8~tjUuapJaOYE*s^j(9DeR_faABtpQa9I| z1`l403Ndpvjy+}wbAsC8dV;oLQfJob!bJmUg}&v3+cqoKroOx%T+ zs)qZ{VZ@^%wrrUW=4{7&45#BgOVO6{DwfW57!Z`oO$e`4FXuO@4P@5Kilcfdy$fH| zgRK8osU8EruY|%C)+N!mwsNr3)psB<&~+d&(Y3I!wkL5!F|#%V3|(|BZ7d8K^{p-8 z6?Cl(tSw2z99^N98M(P(#SK9#8rsP#gTu-wL4mXPn45vQcbmz(cO(5Lpgt&=8CaK@ ze3ycqVuuO3tf4idf}@p#sih&KthIxwk*hA~XD7%Hjt)Tv5@06Se^*d+u(s1RHe?ht zbPxh%X6WLeYo-8-tnfF^KZ5-YXM*y7uL}yG>nLyGXrwm?>4e~5?VxL+=xAeO;TmLs z4CV+42%`M`tsK$`&cIOL)Kb^NKF9z8%u(U*(qu>{C@Wn{!yp3`Fh?i_M?H(bOZ_07 zVC-Ej^{g%a8A3r>@b6*^NT*kNx)!=t`i62wK?X%n6+y`>cC~|JW*E?dp_p1Z z=~|c?kmwp1*csZ}|MNKheNv>YjddNtKs)+-w2EDy|KCRmIwQJfO77kNPX?fM%#{A; zlj{ij@o(035KeHQCbqISGPDaa7y|#_PxL>MRt6=l{LiFWz_9k#|#YQ*=}M?^n$~t*?MNL77^ag07vi|J|Vp zgQBawgP|p(h>M}Vql2lnm57zGsntKOv41VHGFH^LGqrIL*R?m%HB)!*{(I50{CfK^^k&b2?z-XF%{!V@FzBG&+7lxmrjio z?Im{w2x+gM*bhiToKRan2pd8=IBv=ku(vM{1|6m`2_0PpLuYn#nhEsU&(M9dt8t;{ z-pK?XOhOmqV8xzdU^q2I0~9vvI`J6Pk}htYl3S<@>7%{?jIPOjM;Ww}T6%XU9ye>0{+@9}yp^a?aqk zkT*X%$?Z3Fh8FzXg}NI_K>Q?v@J@?Yqyr!0v|<#9HCx#WXKmZ9d&8wB?iFWirK5At z)(P_`^&8I~Q?!=-T}JP>j40K}9(@P0+V3nBckJh;Qjof{;u!(869=KE09Jq+xWG18 z&iJ4Y(N#L?d_>-XGrN{+yNDlCh&rq~PuZ4gX}l(aJhZjyqX?I7Ba$kvFLDg}ICft{gIZh0KKQTo^3-Ik-9At56;HOSp7m zu)7?;2Lpq6@=x$xCvhB*gv>TSHj-cFJq*ih57w%&HH@juo=2j>Y@k*GrmON$f$Junx0Lv$%n1Ol=P}x{hAXv zT9{7_hJYuvoxC zpTa|hG7Y70&=fprA|yMmy~47x)93!y!Gr2&Jr{Z`=B$;{dSj1Ts$ryNBfEkRh%7Ss zl7gAh=6Q-zBh49TWRVJAceCQy?&K}d7cpO*rXET{V%Vi~tby}IiHnYdiKxfAPLRc> zUoVMiQm1g10`_w=5Lh4ct?reZ?bDV7+i=cA>WCVZ6lqx0Npz`KO;OeERaFF`DgqOI zz{FyC?$KQsaiB&V@1A#oA0ie?P_>E05OZ{B(H|sZ_el4ERm3&{r?%g7{ZG1hpL47&rk~$3F&2 zPnOX!a9N05NX-8>9>Dx>C0McJKLfY_8vFF`{{Q{a{};(cIF5E?6CQZZK#Z8JMq9R4 zu6phqxgB<`1i%^+d@mHBGk>Q9s*8M+Mlvjxb z>I16d88AMrxv*!npktuC1?B;)?4JaDD_<_K1iF0b*)gW{W5vUS8gaH7uuMZBo8Q`8 z)~H&&(d#bs-H514vAH-7FtC$ElAaS>4SMadBn3=ofAQslsMJMI3VIBZ^ziccT`ixR zgU8vSr_eD!Pxltd*peIBt@NOJ1r;wB)WwM|xgHmon}~EpG_;MK=#K!*$)l-D?U()p z?orUas6~TCFdA~u1(u!5JyQLQmk`!{jc`^e=++%<(F}w