From 772ff6f11f2c8a948e0d49f2339bace089605aaa Mon Sep 17 00:00:00 2001 From: jiujiteiro Date: Mon, 14 Nov 2022 18:26:55 +0000 Subject: [PATCH] realio staking fork and proto rebuild --- client/grpc/tmservice/query.pb.go | 2 +- client/grpc/tmservice/types.pb.go | 2 +- crypto/hd/hd.pb.go | 2 +- crypto/keyring/record.pb.go | 2 +- crypto/keys/ed25519/keys.pb.go | 2 +- crypto/keys/multisig/keys.pb.go | 2 +- crypto/keys/secp256k1/keys.pb.go | 2 +- crypto/keys/secp256r1/keys.pb.go | 2 +- crypto/types/multisig.pb.go | 2 +- go.mod | 1 + go.sum | 2 + proto/buf.lock | 4 +- proto/buf.yaml | 2 +- proto/cosmos/staking/v1beta1/staking.proto | 23 +- simapp/test_helpers.go | 4 +- snapshots/types/snapshot.pb.go | 2 +- store/types/commit_info.pb.go | 2 +- types/abci.pb.go | 2 +- types/coin.pb.go | 2 +- types/kv/kv.pb.go | 2 +- types/tx/tx.pb.go | 2 +- x/auth/migrations/v043/store.go | 2 +- x/auth/migrations/v043/store_test.go | 120 +- x/auth/types/auth.pb.go | 2 +- x/auth/types/genesis.pb.go | 2 +- x/auth/types/query.pb.go | 2 +- x/auth/vesting/types/tx.pb.go | 2 +- x/auth/vesting/types/vesting.pb.go | 2 +- x/authz/authz.pb.go | 2 +- x/authz/genesis.pb.go | 2 +- x/authz/tx.pb.go | 2 +- x/bank/types/authz.pb.go | 2 +- x/bank/types/bank.pb.go | 2 +- x/bank/types/genesis.pb.go | 2 +- x/bank/types/query.pb.go | 2 +- x/bank/types/tx.pb.go | 2 +- x/capability/types/capability.pb.go | 2 +- x/capability/types/genesis.pb.go | 2 +- x/crisis/types/genesis.pb.go | 2 +- x/crisis/types/tx.pb.go | 2 +- x/distribution/types/distribution.pb.go | 2 +- x/distribution/types/genesis.pb.go | 2 +- x/distribution/types/query.pb.go | 2 +- x/distribution/types/tx.pb.go | 2 +- x/evidence/types/evidence.pb.go | 2 +- x/evidence/types/query.pb.go | 2 +- x/evidence/types/tx.pb.go | 2 +- x/feegrant/feegrant.pb.go | 2 +- x/feegrant/genesis.pb.go | 2 +- x/genutil/gentx.go | 6 +- x/genutil/types/genesis.pb.go | 2 +- x/gov/keeper/common_test.go | 6 +- x/gov/keeper/tally_test.go | 18 +- x/gov/types/v1/gov.pb.go | 2 +- x/gov/types/v1/tx.pb.go | 2 +- x/gov/types/v1beta1/genesis.pb.go | 2 +- x/gov/types/v1beta1/gov.pb.go | 2 +- x/gov/types/v1beta1/query.pb.go | 2 +- x/gov/types/v1beta1/tx.pb.go | 2 +- x/group/query.pb.go | 2 +- x/group/tx.pb.go | 2 +- x/group/types.pb.go | 2 +- x/mint/types/genesis.pb.go | 2 +- x/mint/types/mint.pb.go | 2 +- x/mint/types/query.pb.go | 2 +- x/params/types/proposal/params.pb.go | 2 +- x/params/types/proposal/query.pb.go | 2 +- x/slashing/types/genesis.pb.go | 2 +- x/slashing/types/query.pb.go | 2 +- x/slashing/types/slashing.pb.go | 2 +- x/slashing/types/tx.pb.go | 2 +- x/staking/keeper/delegation.go | 41 +- x/staking/keeper/delegation_test.go | 72 +- x/staking/keeper/genesis.go | 25 +- x/staking/keeper/genesis_test.go | 4 + x/staking/keeper/grpc_query_test.go | 18 +- x/staking/keeper/invariants.go | 21 +- x/staking/keeper/msg_server.go | 51 +- x/staking/keeper/msg_server_test.go | 7 +- x/staking/keeper/params.go | 25 + x/staking/keeper/params_test.go | 61 + x/staking/keeper/pool.go | 35 +- x/staking/keeper/querier.go | 18 +- x/staking/keeper/querier_test.go | 18 +- x/staking/keeper/slash.go | 33 +- x/staking/keeper/slash_test.go | 52 +- x/staking/keeper/val_state_change.go | 12 +- x/staking/keeper/validator_test.go | 5 +- x/staking/simulation/decoder_test.go | 4 +- x/staking/simulation/operations.go | 2 +- x/staking/simulation/operations_test.go | 5 +- x/staking/types/authz.pb.go | 2 +- x/staking/types/delegation.go | 14 +- x/staking/types/delegation_test.go | 14 +- x/staking/types/genesis.pb.go | 2 +- x/staking/types/params.go | 14 +- x/staking/types/params_test.go | 26 + x/staking/types/query.pb.go | 2 +- x/staking/types/staking.pb.go | 1263 ++++++++++---------- x/staking/types/tx.pb.go | 2 +- x/staking/types/validator.go | 6 +- x/upgrade/types/tx.pb.go | 2 +- x/upgrade/types/upgrade.pb.go | 2 +- 103 files changed, 1196 insertions(+), 970 deletions(-) create mode 100644 x/staking/keeper/params_test.go diff --git a/client/grpc/tmservice/query.pb.go b/client/grpc/tmservice/query.pb.go index 6aa415fab1f9..47c0bba9bb69 100644 --- a/client/grpc/tmservice/query.pb.go +++ b/client/grpc/tmservice/query.pb.go @@ -9,7 +9,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" p2p "github.com/tendermint/tendermint/proto/tendermint/p2p" diff --git a/client/grpc/tmservice/types.pb.go b/client/grpc/tmservice/types.pb.go index e9bb255f2190..761230e16ee6 100644 --- a/client/grpc/tmservice/types.pb.go +++ b/client/grpc/tmservice/types.pb.go @@ -5,7 +5,7 @@ package tmservice import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types "github.com/tendermint/tendermint/proto/tendermint/types" diff --git a/crypto/hd/hd.pb.go b/crypto/hd/hd.pb.go index bc262474aa25..1b66752c2d18 100644 --- a/crypto/hd/hd.pb.go +++ b/crypto/hd/hd.pb.go @@ -5,7 +5,7 @@ package hd import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/keyring/record.pb.go b/crypto/keyring/record.pb.go index 5e8df719a5c6..23b63c1f8999 100644 --- a/crypto/keyring/record.pb.go +++ b/crypto/keyring/record.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" hd "github.com/cosmos/cosmos-sdk/crypto/hd" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/keys/ed25519/keys.pb.go b/crypto/keys/ed25519/keys.pb.go index 227b18701306..0522bf55d171 100644 --- a/crypto/keys/ed25519/keys.pb.go +++ b/crypto/keys/ed25519/keys.pb.go @@ -6,7 +6,7 @@ package ed25519 import ( crypto_ed25519 "crypto/ed25519" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go index 0016efa8a545..5f5ca903b30c 100644 --- a/crypto/keys/multisig/keys.pb.go +++ b/crypto/keys/multisig/keys.pb.go @@ -6,7 +6,7 @@ package multisig import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/keys/secp256k1/keys.pb.go b/crypto/keys/secp256k1/keys.pb.go index afcbab54b05d..1b5c1607541e 100644 --- a/crypto/keys/secp256k1/keys.pb.go +++ b/crypto/keys/secp256k1/keys.pb.go @@ -5,7 +5,7 @@ package secp256k1 import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/keys/secp256r1/keys.pb.go b/crypto/keys/secp256r1/keys.pb.go index 898f19a123cf..39d7a53d46d4 100644 --- a/crypto/keys/secp256r1/keys.pb.go +++ b/crypto/keys/secp256r1/keys.pb.go @@ -5,7 +5,7 @@ package secp256r1 import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/crypto/types/multisig.pb.go b/crypto/types/multisig.pb.go index b9c907ade0a4..347de9fcfee0 100644 --- a/crypto/types/multisig.pb.go +++ b/crypto/types/multisig.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/go.mod b/go.mod index 318487fe4c25..89b4325ca245 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-alpha7 github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1 github.com/cosmos/go-bip39 v1.0.0 + github.com/cosmos/gogoproto v1.4.2 github.com/cosmos/iavl v0.19.4 github.com/cosmos/ledger-cosmos-go v0.11.1 github.com/gogo/gateway v1.1.0 diff --git a/go.sum b/go.sum index 07d7539027cd..9022df26ea01 100644 --- a/go.sum +++ b/go.sum @@ -235,6 +235,8 @@ github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1/go.mod h1:JUMM2MxF9wuwzRWZJjb8BjXs github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogoproto v1.4.2 h1:UeGRcmFW41l0G0MiefWhkPEVEwvu78SZsHBvI78dAYw= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= diff --git a/proto/buf.lock b/proto/buf.lock index f9f761d2bd20..9f8f38607e61 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -8,8 +8,8 @@ deps: - remote: buf.build owner: cosmos repository: gogo-proto - commit: bee5511075b7499da6178d9e4aaa628b + commit: 34d970b699f84aa382f3c29773a60836 - remote: buf.build owner: googleapis repository: googleapis - commit: 8d7204855ec14631a499bd7393ce1970 + commit: 5abafbf55b5c4c07ad5fb06d2599560f diff --git a/proto/buf.yaml b/proto/buf.yaml index a665c57e19ea..e6b3ecdcdc6e 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -4,7 +4,7 @@ # This module represents the "proto" root found in # the previous configuration. version: v1 -name: buf.build/cosmos/cosmos-sdk +name: buf.build/realiotech/cosmos-sdk deps: - buf.build/cosmos/cosmos-proto - buf.build/cosmos/gogo-proto diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 6dc965feab47..61647d4ae4e0 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -124,6 +124,8 @@ message Validator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + // bond_denom defines the bondable coin denomination. + string bond_denom = 12; } // BondStatus is the status of a validator. @@ -229,17 +231,11 @@ message UnbondingDelegationEntry { // completion_time is the unix time for unbonding completion. google.protobuf.Timestamp completion_time = 2 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // initial_balance defines the tokens initially scheduled to receive at completion. - string initial_balance = 3 [ - (cosmos_proto.scalar) = "cosmos.Int", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; + cosmos.base.v1beta1.Coin initial_balance = 3 + [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Coin", (gogoproto.nullable) = false]; // balance defines the tokens to receive at completion. - string balance = 4 [ - (cosmos_proto.scalar) = "cosmos.Int", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; + cosmos.base.v1beta1.Coin balance = 4 + [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Coin", (gogoproto.nullable) = false]; } // RedelegationEntry defines a redelegation object with relevant metadata. @@ -252,11 +248,8 @@ message RedelegationEntry { // completion_time defines the unix time for redelegation completion. google.protobuf.Timestamp completion_time = 2 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; // initial_balance defines the initial balance when redelegation started. - string initial_balance = 3 [ - (cosmos_proto.scalar) = "cosmos.Int", - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; + cosmos.base.v1beta1.Coin initial_balance = 3 + [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Coin", (gogoproto.nullable) = false]; // shares_dst is the amount of destination-validator shares created by redelegation. string shares_dst = 4 [ (cosmos_proto.scalar) = "cosmos.Dec", diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index f43d80f710e0..5656ff1045bb 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -134,9 +134,10 @@ func Setup(t *testing.T, isCheckTx bool) *SimApp { // generate genesis account senderPrivKey := secp256k1.GenPrivKey() acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) + amount, _ := sdk.NewIntFromString("100000000000000000000000000") balance := banktypes.Balance{ Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100000000000000))), + Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amount)), } app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, balance) @@ -175,6 +176,7 @@ func genesisStateWithValSet(t *testing.T, UnbondingTime: time.Unix(0, 0).UTC(), Commission: stakingtypes.NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), MinSelfDelegation: sdk.ZeroInt(), + BondDenom: sdk.DefaultBondDenom, } validators = append(validators, validator) delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), sdk.OneDec())) diff --git a/snapshots/types/snapshot.pb.go b/snapshots/types/snapshot.pb.go index 703e9769e9cb..f9c6ddb63aff 100644 --- a/snapshots/types/snapshot.pb.go +++ b/snapshots/types/snapshot.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/store/types/commit_info.pb.go b/store/types/commit_info.pb.go index 988804d2f307..c7549e979577 100644 --- a/store/types/commit_info.pb.go +++ b/store/types/commit_info.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/types/abci.pb.go b/types/abci.pb.go index 80d0bf6fb486..44e3e7a8f704 100644 --- a/types/abci.pb.go +++ b/types/abci.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" types1 "github.com/tendermint/tendermint/abci/types" io "io" diff --git a/types/coin.pb.go b/types/coin.pb.go index 4df295645b85..992cab346c83 100644 --- a/types/coin.pb.go +++ b/types/coin.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/types/kv/kv.pb.go b/types/kv/kv.pb.go index eedb948bf5ae..17e4a8b552bf 100644 --- a/types/kv/kv.pb.go +++ b/types/kv/kv.pb.go @@ -5,7 +5,7 @@ package kv import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/types/tx/tx.pb.go b/types/tx/tx.pb.go index 75abd48f283a..5a59f65bedc8 100644 --- a/types/tx/tx.pb.go +++ b/types/tx/tx.pb.go @@ -11,7 +11,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types2 "github.com/cosmos/cosmos-sdk/types" signing "github.com/cosmos/cosmos-sdk/types/tx/signing" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/auth/migrations/v043/store.go b/x/auth/migrations/v043/store.go index a097d0ef0400..384b6572f83b 100644 --- a/x/auth/migrations/v043/store.go +++ b/x/auth/migrations/v043/store.go @@ -209,7 +209,7 @@ func getDelegatorUnbondingDelegationsSum(ctx sdk.Context, address, bondDenom str res := sdk.NewCoins() for _, i := range balance.UnbondingResponses { for _, r := range i.Entries { - res = res.Add(sdk.NewCoin(bondDenom, r.Balance)) + res = res.Add(sdk.NewCoin(bondDenom, r.Balance.Amount)) } } diff --git a/x/auth/migrations/v043/store_test.go b/x/auth/migrations/v043/store_test.go index df7902c191bd..4f860b4a9245 100644 --- a/x/auth/migrations/v043/store_test.go +++ b/x/auth/migrations/v043/store_test.go @@ -33,18 +33,18 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has vested, multiple delegations less than the total account balance", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(200))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(200))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().Unix()) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -57,14 +57,14 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has vested, single delegations which exceed the vested amount", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(200))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(200))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().Unix()) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -77,18 +77,18 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has vested, multiple delegations which exceed the vested amount", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(200))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(200))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().Unix()) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -101,12 +101,12 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has not vested, single delegations which exceed the vested amount", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(200))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(200))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(1, 0, 0).Unix()) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -119,16 +119,16 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has not vested, multiple delegations which exceed the vested amount", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(200))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(200))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(1, 0, 0).Unix()) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -141,16 +141,16 @@ func TestMigrateVestingAccounts(t *testing.T) { "not end time", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(1, 0, 0).Unix()) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(100), stakingtypes.Unbonded, validator, true) + _, err = app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -163,12 +163,12 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has not vested, single delegation greater than the total account balance", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(1, 0, 0).Unix()) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -181,14 +181,14 @@ func TestMigrateVestingAccounts(t *testing.T) { "delayed vesting has vested, single delegation greater than the total account balance", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().Unix()) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -203,14 +203,14 @@ func TestMigrateVestingAccounts(t *testing.T) { startTime := ctx.BlockTime().AddDate(1, 0, 0).Unix() endTime := ctx.BlockTime().AddDate(2, 0, 0).Unix() baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewContinuousVestingAccount(baseAccount, vestedCoins, startTime, endTime) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -225,14 +225,14 @@ func TestMigrateVestingAccounts(t *testing.T) { startTime := ctx.BlockTime().AddDate(-1, 0, 0).Unix() endTime := ctx.BlockTime().AddDate(2, 0, 0).Unix() baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewContinuousVestingAccount(baseAccount, vestedCoins, startTime, endTime) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -247,14 +247,14 @@ func TestMigrateVestingAccounts(t *testing.T) { startTime := ctx.BlockTime().AddDate(-2, 0, 0).Unix() endTime := ctx.BlockTime().AddDate(-1, 0, 0).Unix() baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewContinuousVestingAccount(baseAccount, vestedCoins, startTime, endTime) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) app.AccountKeeper.SetAccount(ctx, delayedAccount) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -267,7 +267,7 @@ func TestMigrateVestingAccounts(t *testing.T) { "periodic vesting account, yet to be vested, some rewards delegated", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(100))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))) start := ctx.BlockTime().Unix() + int64(time.Hour/time.Second) @@ -282,7 +282,7 @@ func TestMigrateVestingAccounts(t *testing.T) { app.AccountKeeper.SetAccount(ctx, account) - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(150), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(150)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -305,19 +305,19 @@ func TestMigrateVestingAccounts(t *testing.T) { */ startTime := int64(1601042400) baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(3666666670000))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000))) periods := []types.Period{ { Length: 31536000, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(1833333335000))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1833333335000))), }, { Length: 15638400, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, { Length: 15897600, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, } @@ -326,7 +326,7 @@ func TestMigrateVestingAccounts(t *testing.T) { app.AccountKeeper.SetAccount(ctx, delayedAccount) // delegation of the original vesting - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(3666666670000), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -349,19 +349,19 @@ func TestMigrateVestingAccounts(t *testing.T) { */ startTime := int64(1601042400) baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(3666666670000))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000))) periods := []types.Period{ { Length: 31536000, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(1833333335000))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1833333335000))), }, { Length: 15638400, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, { Length: 15897600, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, } @@ -372,7 +372,7 @@ func TestMigrateVestingAccounts(t *testing.T) { app.AccountKeeper.SetAccount(ctx, delayedAccount) // delegation of the original vesting - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(3666666670000), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -395,19 +395,19 @@ func TestMigrateVestingAccounts(t *testing.T) { */ startTime := int64(1601042400) baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(3666666670000))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000))) periods := []types.Period{ { Length: 31536000, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(1833333335000))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1833333335000))), }, { Length: 15638400, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, { Length: 15897600, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, } @@ -418,7 +418,7 @@ func TestMigrateVestingAccounts(t *testing.T) { app.AccountKeeper.SetAccount(ctx, delayedAccount) // delegation of the original vesting - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(3666666670000), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -441,19 +441,19 @@ func TestMigrateVestingAccounts(t *testing.T) { */ startTime := int64(1601042400) baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(3666666670000))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000))) periods := []types.Period{ { Length: 31536000, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(1833333335000))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1833333335000))), }, { Length: 15638400, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, { Length: 15897600, - Amount: sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(916666667500))), + Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(916666667500))), }, } @@ -464,7 +464,7 @@ func TestMigrateVestingAccounts(t *testing.T) { app.AccountKeeper.SetAccount(ctx, delayedAccount) // delegation of the original vesting - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(3666666670000), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(3666666670000)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) }, cleartTrackingFields, @@ -477,14 +477,14 @@ func TestMigrateVestingAccounts(t *testing.T) { "vesting account has unbonding delegations in place", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(10, 0, 0).Unix()) app.AccountKeeper.SetAccount(ctx, delayedAccount) // delegation of the original vesting - _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewInt(300), stakingtypes.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, delegatorAddr, sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300)), stakingtypes.Unbonded, validator, true) require.NoError(t, err) ctx = ctx.WithBlockTime(ctx.BlockTime().AddDate(1, 0, 0)) @@ -493,7 +493,7 @@ func TestMigrateVestingAccounts(t *testing.T) { require.NoError(t, err) // un-delegation of the original vesting - _, err = app.StakingKeeper.Undelegate(ctx, delegatorAddr, valAddr, sdk.NewDecFromInt(sdk.NewInt(300))) + _, err = app.StakingKeeper.Undelegate(ctx, delegatorAddr, valAddr, sdk.NewDecFromInt(sdk.NewInt(300)), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) require.NoError(t, err) }, cleartTrackingFields, @@ -506,7 +506,7 @@ func TestMigrateVestingAccounts(t *testing.T) { "vesting account has never delegated anything", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(10, 0, 0).Unix()) @@ -522,7 +522,7 @@ func TestMigrateVestingAccounts(t *testing.T) { "vesting account has no delegation but dirty DelegatedFree and DelegatedVesting fields", func(app *simapp.SimApp, ctx sdk.Context, validator stakingtypes.Validator, delegatorAddr sdk.AccAddress) { baseAccount := authtypes.NewBaseAccountWithAddress(delegatorAddr) - vestedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(300))) + vestedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(300))) delayedAccount := types.NewDelayedVestingAccount(baseAccount, vestedCoins, ctx.BlockTime().AddDate(10, 0, 0).Unix()) @@ -570,11 +570,11 @@ func TestMigrateVestingAccounts(t *testing.T) { var expFree sdk.Coins if tc.expVested != 0 { - expVested = sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(tc.expVested))) + expVested = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(tc.expVested))) } if tc.expFree != 0 { - expFree = sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), sdk.NewInt(tc.expFree))) + expFree = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(tc.expFree))) } trackingCorrected( @@ -667,7 +667,7 @@ func createValidator(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers i require.NoError(t, app.StakingKeeper.SetValidatorByConsAddr(ctx, val1)) app.StakingKeeper.SetNewValidatorByPowerIndex(ctx, val1) - _, err = app.StakingKeeper.Delegate(ctx, addrs[0], valTokens, stakingtypes.Unbonded, val1, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[0], sdk.NewCoin(sdk.DefaultBondDenom, valTokens), stakingtypes.Unbonded, val1, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index 7391b2188ae4..92aa202edeef 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/auth/types/genesis.pb.go b/x/auth/types/genesis.pb.go index 4e7396ab7cb3..ea875fbbeb9c 100644 --- a/x/auth/types/genesis.pb.go +++ b/x/auth/types/genesis.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/auth/types/query.pb.go b/x/auth/types/query.pb.go index 20aebd41bc57..bc47684e19d1 100644 --- a/x/auth/types/query.pb.go +++ b/x/auth/types/query.pb.go @@ -9,7 +9,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/auth/vesting/types/tx.pb.go b/x/auth/vesting/types/tx.pb.go index 96b06cdb922b..6f43ecbbf640 100644 --- a/x/auth/vesting/types/tx.pb.go +++ b/x/auth/vesting/types/tx.pb.go @@ -10,7 +10,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/auth/vesting/types/vesting.pb.go b/x/auth/vesting/types/vesting.pb.go index 1404b5891cc6..0daec372f12a 100644 --- a/x/auth/vesting/types/vesting.pb.go +++ b/x/auth/vesting/types/vesting.pb.go @@ -8,7 +8,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/x/auth/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/authz/authz.pb.go b/x/authz/authz.pb.go index 7ffbadd83512..7540f6804b72 100644 --- a/x/authz/authz.pb.go +++ b/x/authz/authz.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/timestamppb" diff --git a/x/authz/genesis.pb.go b/x/authz/genesis.pb.go index 56f2157a92ee..52f9af4d369f 100644 --- a/x/authz/genesis.pb.go +++ b/x/authz/genesis.pb.go @@ -5,7 +5,7 @@ package authz import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/authz/tx.pb.go b/x/authz/tx.pb.go index fd3ef5443fb0..7dd4e303a6fc 100644 --- a/x/authz/tx.pb.go +++ b/x/authz/tx.pb.go @@ -9,7 +9,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/bank/types/authz.pb.go b/x/bank/types/authz.pb.go index 904a7f9ce793..e160e23f039a 100644 --- a/x/bank/types/authz.pb.go +++ b/x/bank/types/authz.pb.go @@ -8,7 +8,7 @@ import ( _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/bank/types/bank.pb.go b/x/bank/types/bank.pb.go index 93feea14672b..d359095af33f 100644 --- a/x/bank/types/bank.pb.go +++ b/x/bank/types/bank.pb.go @@ -9,7 +9,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/bank/types/genesis.pb.go b/x/bank/types/genesis.pb.go index 1e8ecae3d0b5..d27069d78fcf 100644 --- a/x/bank/types/genesis.pb.go +++ b/x/bank/types/genesis.pb.go @@ -8,7 +8,7 @@ import ( _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/bank/types/query.pb.go b/x/bank/types/query.pb.go index 80f94f5ec6ff..4c4df08f31ad 100644 --- a/x/bank/types/query.pb.go +++ b/x/bank/types/query.pb.go @@ -10,7 +10,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/bank/types/tx.pb.go b/x/bank/types/tx.pb.go index 874c3dd8d862..b30d2271e199 100644 --- a/x/bank/types/tx.pb.go +++ b/x/bank/types/tx.pb.go @@ -10,7 +10,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/capability/types/capability.pb.go b/x/capability/types/capability.pb.go index 332666df70a4..4b15278b338c 100644 --- a/x/capability/types/capability.pb.go +++ b/x/capability/types/capability.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/capability/types/genesis.pb.go b/x/capability/types/genesis.pb.go index 051e9f260e25..984fea86ca4a 100644 --- a/x/capability/types/genesis.pb.go +++ b/x/capability/types/genesis.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/crisis/types/genesis.pb.go b/x/crisis/types/genesis.pb.go index 4356d61e0ef5..3556a87df02b 100644 --- a/x/crisis/types/genesis.pb.go +++ b/x/crisis/types/genesis.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/crisis/types/tx.pb.go b/x/crisis/types/tx.pb.go index 412311aace83..2d0ee9497c5e 100644 --- a/x/crisis/types/tx.pb.go +++ b/x/crisis/types/tx.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/distribution/types/distribution.pb.go b/x/distribution/types/distribution.pb.go index 714525f71f09..a1d4e49c4c75 100644 --- a/x/distribution/types/distribution.pb.go +++ b/x/distribution/types/distribution.pb.go @@ -8,7 +8,7 @@ import ( _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/distribution/types/genesis.pb.go b/x/distribution/types/genesis.pb.go index a1f2d7ba7b70..7375cc4c0ae8 100644 --- a/x/distribution/types/genesis.pb.go +++ b/x/distribution/types/genesis.pb.go @@ -8,7 +8,7 @@ import ( _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/distribution/types/query.pb.go b/x/distribution/types/query.pb.go index b6a794bfbf45..773d2482b97c 100644 --- a/x/distribution/types/query.pb.go +++ b/x/distribution/types/query.pb.go @@ -10,7 +10,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/distribution/types/tx.pb.go b/x/distribution/types/tx.pb.go index 0eaca3be21c9..ed24c8e59ac8 100644 --- a/x/distribution/types/tx.pb.go +++ b/x/distribution/types/tx.pb.go @@ -10,7 +10,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/evidence/types/evidence.pb.go b/x/evidence/types/evidence.pb.go index 52189e758405..1a41c566473e 100644 --- a/x/evidence/types/evidence.pb.go +++ b/x/evidence/types/evidence.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/timestamppb" diff --git a/x/evidence/types/query.pb.go b/x/evidence/types/query.pb.go index e084ea29c899..c693ac6b814d 100644 --- a/x/evidence/types/query.pb.go +++ b/x/evidence/types/query.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" github_com_tendermint_tendermint_libs_bytes "github.com/tendermint/tendermint/libs/bytes" diff --git a/x/evidence/types/tx.pb.go b/x/evidence/types/tx.pb.go index edae6d9b1c89..5e3328e4769e 100644 --- a/x/evidence/types/tx.pb.go +++ b/x/evidence/types/tx.pb.go @@ -10,7 +10,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/feegrant/feegrant.pb.go b/x/feegrant/feegrant.pb.go index 42d6b0f03982..d9cb2a4aa0c2 100644 --- a/x/feegrant/feegrant.pb.go +++ b/x/feegrant/feegrant.pb.go @@ -9,7 +9,7 @@ import ( types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/durationpb" diff --git a/x/feegrant/genesis.pb.go b/x/feegrant/genesis.pb.go index 36593a2c8ec4..d8aa154b9f24 100644 --- a/x/feegrant/genesis.pb.go +++ b/x/feegrant/genesis.pb.go @@ -5,7 +5,7 @@ package feegrant import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/genutil/gentx.go b/x/genutil/gentx.go index f7e4250def1d..19d7f33efe1b 100644 --- a/x/genutil/gentx.go +++ b/x/genutil/gentx.go @@ -42,7 +42,6 @@ func ValidateAccountInGenesis( ) error { var stakingData stakingtypes.GenesisState cdc.MustUnmarshalJSON(appGenesisState[stakingtypes.ModuleName], &stakingData) - bondDenom := stakingData.Params.BondDenom var err error @@ -56,10 +55,9 @@ func ValidateAccountInGenesis( // ensure that account is in genesis if accAddress.Equals(addr) { // ensure account contains enough funds of default bond denom - if coins.AmountOf(bondDenom).GT(accCoins.AmountOf(bondDenom)) { + if coins.IsAnyGT(accCoins) { err = fmt.Errorf( - "account %s has a balance in genesis, but it only has %v%s available to stake, not %v%s", - addr, accCoins.AmountOf(bondDenom), bondDenom, coins.AmountOf(bondDenom), bondDenom, + "account %s has a balance in genesis, but it does not have enough to stake", addr, ) return true diff --git a/x/genutil/types/genesis.pb.go b/x/genutil/types/genesis.pb.go index e1cd6af76145..916b7d36998b 100644 --- a/x/genutil/types/genesis.pb.go +++ b/x/genutil/types/genesis.pb.go @@ -6,7 +6,7 @@ package types import ( encoding_json "encoding/json" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/gov/keeper/common_test.go b/x/gov/keeper/common_test.go index e5e5bf183109..487546d3f6b4 100644 --- a/x/gov/keeper/common_test.go +++ b/x/gov/keeper/common_test.go @@ -67,9 +67,9 @@ func createValidators(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers app.StakingKeeper.SetNewValidatorByPowerIndex(ctx, val2) app.StakingKeeper.SetNewValidatorByPowerIndex(ctx, val3) - _, _ = app.StakingKeeper.Delegate(ctx, addrs[0], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[0]), stakingtypes.Unbonded, val1, true) - _, _ = app.StakingKeeper.Delegate(ctx, addrs[1], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[1]), stakingtypes.Unbonded, val2, true) - _, _ = app.StakingKeeper.Delegate(ctx, addrs[2], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[2]), stakingtypes.Unbonded, val3, true) + _, _ = app.StakingKeeper.Delegate(ctx, addrs[0], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[0])), stakingtypes.Unbonded, val1, true) + _, _ = app.StakingKeeper.Delegate(ctx, addrs[1], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[1])), stakingtypes.Unbonded, val2, true) + _, _ = app.StakingKeeper.Delegate(ctx, addrs[2], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[2])), stakingtypes.Unbonded, val3, true) _ = staking.EndBlocker(ctx, app.StakingKeeper) diff --git a/x/gov/keeper/tally_test.go b/x/gov/keeper/tally_test.go index adb0d5a41609..c3d65eaad497 100644 --- a/x/gov/keeper/tally_test.go +++ b/x/gov/keeper/tally_test.go @@ -249,7 +249,7 @@ func TestTallyDelgatorOverride(t *testing.T) { val1, found := app.StakingKeeper.GetValidator(ctx, valAddrs[0]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[4], delTokens, stakingtypes.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[4], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val1, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) @@ -285,7 +285,7 @@ func TestTallyDelgatorInherit(t *testing.T) { val3, found := app.StakingKeeper.GetValidator(ctx, vals[2]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val3, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val3, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) @@ -322,9 +322,9 @@ func TestTallyDelgatorMultipleOverride(t *testing.T) { val2, found := app.StakingKeeper.GetValidator(ctx, vals[1]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val1, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val2, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val2, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) @@ -364,9 +364,9 @@ func TestTallyDelgatorMultipleInherit(t *testing.T) { val3, found := app.StakingKeeper.GetValidator(ctx, vals[2]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val2, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val2, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val3, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val3, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) @@ -403,9 +403,9 @@ func TestTallyJailedValidator(t *testing.T) { val3, found := app.StakingKeeper.GetValidator(ctx, valAddrs[2]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val2, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val2, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, addrs[3], delTokens, stakingtypes.Unbonded, val3, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[3], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val3, true) require.NoError(t, err) _ = staking.EndBlocker(ctx, app.StakingKeeper) @@ -444,7 +444,7 @@ func TestTallyValidatorMultipleDelegations(t *testing.T) { val2, found := app.StakingKeeper.GetValidator(ctx, valAddrs[1]) require.True(t, found) - _, err := app.StakingKeeper.Delegate(ctx, addrs[0], delTokens, stakingtypes.Unbonded, val2, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[0], sdk.NewCoin(sdk.DefaultBondDenom, delTokens), stakingtypes.Unbonded, val2, true) require.NoError(t, err) tp := TestProposal diff --git a/x/gov/types/v1/gov.pb.go b/x/gov/types/v1/gov.pb.go index 36b207454fff..d2d4a7449021 100644 --- a/x/gov/types/v1/gov.pb.go +++ b/x/gov/types/v1/gov.pb.go @@ -8,7 +8,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types1 "github.com/cosmos/cosmos-sdk/codec/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/durationpb" diff --git a/x/gov/types/v1/tx.pb.go b/x/gov/types/v1/tx.pb.go index 25696059d988..c27e02f763e5 100644 --- a/x/gov/types/v1/tx.pb.go +++ b/x/gov/types/v1/tx.pb.go @@ -10,7 +10,7 @@ import ( types "github.com/cosmos/cosmos-sdk/codec/types" types1 "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/gov/types/v1beta1/genesis.pb.go b/x/gov/types/v1beta1/genesis.pb.go index 0efefab9c4cf..e46a8b037c18 100644 --- a/x/gov/types/v1beta1/genesis.pb.go +++ b/x/gov/types/v1beta1/genesis.pb.go @@ -5,7 +5,7 @@ package v1beta1 import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/gov/types/v1beta1/gov.pb.go b/x/gov/types/v1beta1/gov.pb.go index 3fc60128b151..c8a54b519ad7 100644 --- a/x/gov/types/v1beta1/gov.pb.go +++ b/x/gov/types/v1beta1/gov.pb.go @@ -9,7 +9,7 @@ import ( types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/durationpb" diff --git a/x/gov/types/v1beta1/query.pb.go b/x/gov/types/v1beta1/query.pb.go index d50d02d22af8..34298c8620e1 100644 --- a/x/gov/types/v1beta1/query.pb.go +++ b/x/gov/types/v1beta1/query.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/gov/types/v1beta1/tx.pb.go b/x/gov/types/v1beta1/tx.pb.go index c77485922895..a7a6c51d9b7b 100644 --- a/x/gov/types/v1beta1/tx.pb.go +++ b/x/gov/types/v1beta1/tx.pb.go @@ -11,7 +11,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/group/query.pb.go b/x/group/query.pb.go index 47cfd7fccd98..83056fe205dd 100644 --- a/x/group/query.pb.go +++ b/x/group/query.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/group/tx.pb.go b/x/group/tx.pb.go index a2407e87dc44..94aab07ac68e 100644 --- a/x/group/tx.pb.go +++ b/x/group/tx.pb.go @@ -9,7 +9,7 @@ import ( _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/group/types.pb.go b/x/group/types.pb.go index 5815d7da7138..76010d43b92f 100644 --- a/x/group/types.pb.go +++ b/x/group/types.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/durationpb" diff --git a/x/mint/types/genesis.pb.go b/x/mint/types/genesis.pb.go index 1486c35f2232..1820bb2091c2 100644 --- a/x/mint/types/genesis.pb.go +++ b/x/mint/types/genesis.pb.go @@ -5,7 +5,7 @@ package types import ( fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/mint/types/mint.pb.go b/x/mint/types/mint.pb.go index a5f33f381d32..aa8807da23c5 100644 --- a/x/mint/types/mint.pb.go +++ b/x/mint/types/mint.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/mint/types/query.pb.go b/x/mint/types/query.pb.go index f707eb810d2d..04201a360dba 100644 --- a/x/mint/types/query.pb.go +++ b/x/mint/types/query.pb.go @@ -7,7 +7,7 @@ import ( context "context" fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/params/types/proposal/params.pb.go b/x/params/types/proposal/params.pb.go index 332b3bc27e11..7826e67db461 100644 --- a/x/params/types/proposal/params.pb.go +++ b/x/params/types/proposal/params.pb.go @@ -6,7 +6,7 @@ package proposal import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/params/types/proposal/query.pb.go b/x/params/types/proposal/query.pb.go index 25bacb04795e..e340f44f0efa 100644 --- a/x/params/types/proposal/query.pb.go +++ b/x/params/types/proposal/query.pb.go @@ -6,7 +6,7 @@ package proposal import ( context "context" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/slashing/types/genesis.pb.go b/x/slashing/types/genesis.pb.go index 43240e134db5..12e534334f16 100644 --- a/x/slashing/types/genesis.pb.go +++ b/x/slashing/types/genesis.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/slashing/types/query.pb.go b/x/slashing/types/query.pb.go index 76b0dbf79bd3..da4d77173152 100644 --- a/x/slashing/types/query.pb.go +++ b/x/slashing/types/query.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/slashing/types/slashing.pb.go b/x/slashing/types/slashing.pb.go index 3a0e9448e37e..056cc94b51d0 100644 --- a/x/slashing/types/slashing.pb.go +++ b/x/slashing/types/slashing.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/durationpb" diff --git a/x/slashing/types/tx.pb.go b/x/slashing/types/tx.pb.go index 0ecb663dc21f..d207dd6dd87d 100644 --- a/x/slashing/types/tx.pb.go +++ b/x/slashing/types/tx.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 2c6de7a59d66..00784907c04a 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -6,6 +6,7 @@ import ( "time" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -186,7 +187,7 @@ func (k Keeper) GetDelegatorUnbonding(ctx sdk.Context, delegator sdk.AccAddress) unbonding := sdk.ZeroInt() k.IterateDelegatorUnbondingDelegations(ctx, delegator, func(ubd types.UnbondingDelegation) bool { for _, entry := range ubd.Entries { - unbonding = unbonding.Add(entry.Balance) + unbonding = unbonding.Add(entry.Balance.Amount) } return false }) @@ -302,7 +303,7 @@ func (k Keeper) RemoveUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDe // the given addresses. It creates the unbonding delegation if it does not exist. func (k Keeper) SetUnbondingDelegationEntry( ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, + creationHeight int64, minTime time.Time, balance sdk.Coin, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) if found { @@ -484,7 +485,7 @@ func (k Keeper) SetRedelegation(ctx sdk.Context, red types.Redelegation) { func (k Keeper) SetRedelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, - minTime time.Time, balance math.Int, + minTime time.Time, balance sdk.Coin, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) @@ -612,7 +613,7 @@ func (k Keeper) DequeueAllMatureRedelegationQueue(ctx sdk.Context, currTime time // Delegate performs a delegation, set/update everything necessary within the store. // tokenSrc indicates the bond status of the incoming funds. func (k Keeper) Delegate( - ctx sdk.Context, delAddr sdk.AccAddress, bondAmt math.Int, tokenSrc types.BondStatus, + ctx sdk.Context, delAddr sdk.AccAddress, coin sdk.Coin, tokenSrc types.BondStatus, validator types.Validator, subtractAccount bool, ) (newShares sdk.Dec, err error) { // In some situations, the exchange rate becomes invalid, e.g. if @@ -644,6 +645,7 @@ func (k Keeper) Delegate( // if subtractAccount is true then we are // performing a delegation and not a redelegation, thus the source tokens are // all non bonded + coins := sdk.NewCoins(sdk.NewCoin(coin.Denom, coin.Amount)) if subtractAccount { if tokenSrc == types.Bonded { panic("delegation token source cannot be bonded") @@ -660,7 +662,6 @@ func (k Keeper) Delegate( panic("invalid validator status") } - coins := sdk.NewCoins(sdk.NewCoin(k.BondDenom(ctx), bondAmt)) if err := k.bankKeeper.DelegateCoinsFromAccountToModule(ctx, delegatorAddress, sendName, coins); err != nil { return sdk.Dec{}, err } @@ -673,16 +674,16 @@ func (k Keeper) Delegate( // do nothing case (tokenSrc == types.Unbonded || tokenSrc == types.Unbonding) && validator.IsBonded(): // transfer pools - k.notBondedTokensToBonded(ctx, bondAmt) + k.notBondedTokensToBonded(ctx, coins) case tokenSrc == types.Bonded && !validator.IsBonded(): // transfer pools - k.bondedTokensToNotBonded(ctx, bondAmt) + k.bondedTokensToNotBonded(ctx, coins) default: panic("unknown token source bond status") } } - _, newShares = k.AddValidatorTokensAndShares(ctx, validator, bondAmt) + _, newShares = k.AddValidatorTokensAndShares(ctx, validator, coin.Amount) // Update delegation delegation.Shares = delegation.Shares.Add(newShares) @@ -797,7 +798,7 @@ func (k Keeper) getBeginInfo( // an unbonding object and inserting it into the unbonding queue which will be // processed during the staking EndBlocker. func (k Keeper) Undelegate( - ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, sharesAmount sdk.Dec, + ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress, sharesAmount sdk.Dec, coin sdk.Coin, ) (time.Time, error) { validator, found := k.GetValidator(ctx, valAddr) if !found { @@ -814,12 +815,13 @@ func (k Keeper) Undelegate( } // transfer the validator tokens to the not bonded pool + returnCoin := sdk.NewCoin(coin.Denom, returnAmount) if validator.IsBonded() { - k.bondedTokensToNotBonded(ctx, returnAmount) + k.bondedTokensToNotBonded(ctx, sdk.NewCoins(returnCoin)) } completionTime := ctx.BlockHeader().Time.Add(k.UnbondingTime(ctx)) - ubd := k.SetUnbondingDelegationEntry(ctx, delAddr, valAddr, ctx.BlockHeight(), completionTime, returnAmount) + ubd := k.SetUnbondingDelegationEntry(ctx, delAddr, valAddr, ctx.BlockHeight(), completionTime, returnCoin) k.InsertUBDQueue(ctx, ubd, completionTime) return completionTime, nil @@ -834,7 +836,6 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd return nil, types.ErrNoUnbondingDelegation } - bondDenom := k.GetParams(ctx).BondDenom balances := sdk.NewCoins() ctxTime := ctx.BlockHeader().Time @@ -852,14 +853,13 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd // track undelegation only when remaining or truncated shares are non-zero if !entry.Balance.IsZero() { - amt := sdk.NewCoin(bondDenom, entry.Balance) if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( - ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), + ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(entry.Balance), ); err != nil { return nil, err } - balances = balances.Add(amt) + balances = balances.Add(entry.Balance) } } } @@ -877,7 +877,7 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd // BeginRedelegation begins unbonding / redelegation and creates a redelegation // record. func (k Keeper) BeginRedelegation( - ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress, sharesAmount sdk.Dec, + ctx sdk.Context, delAddr sdk.AccAddress, valSrcAddr, valDstAddr sdk.ValAddress, sharesAmount sdk.Dec, coin sdk.Coin, ) (completionTime time.Time, err error) { if bytes.Equal(valSrcAddr, valDstAddr) { return time.Time{}, types.ErrSelfRedelegation @@ -911,7 +911,9 @@ func (k Keeper) BeginRedelegation( return time.Time{}, types.ErrTinyRedelegationAmount } - sharesCreated, err := k.Delegate(ctx, delAddr, returnAmount, srcValidator.GetStatus(), dstValidator, false) + returnCoin := sdk.NewCoin(coin.Denom, returnAmount) + + sharesCreated, err := k.Delegate(ctx, delAddr, returnCoin, srcValidator.GetStatus(), dstValidator, false) if err != nil { return time.Time{}, err } @@ -925,7 +927,7 @@ func (k Keeper) BeginRedelegation( red := k.SetRedelegationEntry( ctx, delAddr, valSrcAddr, valDstAddr, - height, completionTime, returnAmount, sharesAmount, sharesCreated, + height, completionTime, returnCoin, sharesAmount, sharesCreated, ) k.InsertRedelegationQueue(ctx, red, completionTime) @@ -943,7 +945,6 @@ func (k Keeper) CompleteRedelegation( return nil, types.ErrNoRedelegation } - bondDenom := k.GetParams(ctx).BondDenom balances := sdk.NewCoins() ctxTime := ctx.BlockHeader().Time @@ -955,7 +956,7 @@ func (k Keeper) CompleteRedelegation( i-- if !entry.InitialBalance.IsZero() { - balances = balances.Add(sdk.NewCoin(bondDenom, entry.InitialBalance)) + balances = balances.Add(entry.InitialBalance) } } } diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 6190df425c40..b3bdb71e3afd 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -157,7 +157,7 @@ func TestUnbondingDelegation(t *testing.T) { valAddrs[0], 0, time.Unix(0, 0).UTC(), - sdk.NewInt(5), + sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5)), ) // set and retrieve a record @@ -168,7 +168,7 @@ func TestUnbondingDelegation(t *testing.T) { // modify a records, save, and retrieve expUnbond := sdk.NewInt(21) - ubd.Entries[0].Balance = expUnbond + ubd.Entries[0].Balance.Amount = expUnbond app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) resUnbonds := app.StakingKeeper.GetUnbondingDelegations(ctx, delAddrs[0], 5) @@ -205,7 +205,7 @@ func TestUnbondDelegation(t *testing.T) { startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) - require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)))) + require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens)))) app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) // create a validator and a delegator to that validator @@ -243,7 +243,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - bondDenom := app.StakingKeeper.BondDenom(ctx) + bondDenom := sdk.DefaultBondDenom notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) @@ -271,7 +271,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { var completionTime time.Time for i := uint32(0); i < maxEntries; i++ { var err error - completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.NoError(t, err) } @@ -284,7 +284,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { oldNotBonded = app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount // an additional unbond should fail due to max entries - _, err := app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + _, err := app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.Error(t, err) newBonded = app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount @@ -306,7 +306,7 @@ func TestUnbondingDelegationsMaxEntries(t *testing.T) { oldNotBonded = app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount // unbonding should work again - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.NoError(t, err) newBonded = app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount @@ -323,7 +323,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { addrDels := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.NewInt(10000)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) + delCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) // create a validator with a self-delegation validator := teststaking.NewValidator(t, addrVals[0], PKs[0]) @@ -364,7 +364,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { app.StakingKeeper.SetDelegation(ctx, delegation) val0AccAddr := sdk.AccAddress(addrVals[0].Bytes()) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 6))) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 6)), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))) require.NoError(t, err) // end block @@ -380,7 +380,7 @@ func TestUndelegateSelfDelegationBelowMinSelfDelegation(t *testing.T) { func TestUndelegateFromUnbondingValidator(t *testing.T) { _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) + delCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -433,7 +433,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { // unbond the all self-delegation to put validator in unbonding state val0AccAddr := sdk.AccAddress(addrVals[0]) - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) // end block @@ -451,14 +451,14 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { ctx = ctx.WithBlockTime(blockTime2) // unbond some of the other delegation's shares - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDec(6)) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDec(6), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(6))) require.NoError(t, err) // retrieve the unbonding delegation ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[1], addrVals[0]) require.True(t, found) require.Len(t, ubd.Entries, 1) - require.True(t, ubd.Entries[0].Balance.Equal(sdk.NewInt(6))) + require.True(t, ubd.Entries[0].Balance.Amount.Equal(sdk.NewInt(6))) assert.Equal(t, blockHeight2, ubd.Entries[0].CreationHeight) assert.True(t, blockTime2.Add(params.UnbondingTime).Equal(ubd.Entries[0].CompletionTime)) } @@ -466,7 +466,7 @@ func TestUndelegateFromUnbondingValidator(t *testing.T) { func TestUndelegateFromUnbondedValidator(t *testing.T) { _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) + delCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -508,7 +508,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens), sdk.NewCoin(sdk.DefaultBondDenom, valTokens)) require.NoError(t, err) // end block @@ -531,12 +531,12 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { // unbond some of the other delegation's shares unbondTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(unbondTokens)) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(unbondTokens), sdk.NewCoin(sdk.DefaultBondDenom, unbondTokens)) require.NoError(t, err) // unbond rest of the other delegation's shares remainingTokens := delTokens.Sub(unbondTokens) - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(remainingTokens)) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(remainingTokens), sdk.NewCoin(sdk.DefaultBondDenom, remainingTokens)) require.NoError(t, err) // now validator should be deleted from state @@ -547,7 +547,7 @@ func TestUndelegateFromUnbondedValidator(t *testing.T) { func TestUnbondingAllDelegationFromValidator(t *testing.T) { _, app, ctx := createTestInput(t) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - delCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), delTokens)) + delCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) addrDels := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(0)) addrVals := simapp.ConvertAddrsToValAddrs(addrDels) @@ -592,14 +592,14 @@ func TestUnbondingAllDelegationFromValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(valTokens), sdk.NewCoin(sdk.DefaultBondDenom, valTokens)) require.NoError(t, err) // end block applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // unbond all the remaining delegation - _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(delTokens)) + _, err = app.StakingKeeper.Undelegate(ctx, addrDels[1], addrVals[0], sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) // validator should still be in state and still be in unbonding state @@ -624,7 +624,7 @@ func TestGetRedelegationsFromSrcValidator(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(0, 0), sdk.NewInt(5), + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewDec(5)) // set and retrieve a record @@ -651,7 +651,7 @@ func TestRedelegation(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(0, 0).UTC(), sdk.NewInt(5), + time.Unix(0, 0).UTC(), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewDec(5)) // test shouldn't have and redelegations @@ -714,7 +714,7 @@ func TestRedelegateToSameValidator(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), valTokens)) + startCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, valTokens)) // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) @@ -732,7 +732,7 @@ func TestRedelegateToSameValidator(t *testing.T) { selfDelegation := types.NewDelegation(val0AccAddr, addrVals[0], issuedShares) app.StakingKeeper.SetDelegation(ctx, selfDelegation) - _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[0], sdk.NewDec(5)) + _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[0], sdk.NewDec(5), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5))) require.Error(t, err) } @@ -743,7 +743,7 @@ func TestRedelegationMaxEntries(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) + startCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens)) // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) @@ -774,12 +774,12 @@ func TestRedelegationMaxEntries(t *testing.T) { var completionTime time.Time for i := uint32(0); i < maxEntries; i++ { var err error - completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1)) + completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.NoError(t, err) } // an additional redelegation should fail due to max entries - _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1)) + _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.Error(t, err) // mature redelegations @@ -788,7 +788,7 @@ func TestRedelegationMaxEntries(t *testing.T) { require.NoError(t, err) // redelegation should work again - _, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDec(1), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1))) require.NoError(t, err) } @@ -799,7 +799,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) + startCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens)) // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) @@ -836,7 +836,7 @@ func TestRedelegateSelfDelegation(t *testing.T) { delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares) app.StakingKeeper.SetDelegation(ctx, delegation) - _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDecFromInt(delTokens)) + _, err := app.StakingKeeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) // end block @@ -855,7 +855,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) + startCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens)) // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) @@ -897,7 +897,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { ctx = ctx.WithBlockHeader(header) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) // end block @@ -919,7 +919,7 @@ func TestRedelegateFromUnbondingValidator(t *testing.T) { // unbond some of the other delegation's shares redelegateTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegateTokens)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegateTokens), sdk.NewCoin(sdk.DefaultBondDenom, redelegateTokens)) require.NoError(t, err) // retrieve the unbonding delegation @@ -937,7 +937,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { addrVals := simapp.ConvertAddrsToValAddrs(addrDels) startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 30) - startCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), startTokens)) + startCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens)) // add bonded tokens to pool for delegations notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) @@ -976,7 +976,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { ctx = ctx.WithBlockTime(time.Unix(333, 0)) // unbond the all self-delegation to put validator in unbonding state - _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, val0AccAddr, addrVals[0], sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) // end block @@ -993,7 +993,7 @@ func TestRedelegateFromUnbondedValidator(t *testing.T) { // redelegate some of the delegation's shares redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegationTokens)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], sdk.NewDecFromInt(redelegationTokens), sdk.NewCoin(sdk.DefaultBondDenom, redelegationTokens)) require.NoError(t, err) // no red should have been found diff --git a/x/staking/keeper/genesis.go b/x/staking/keeper/genesis.go index b47e32de1b3e..728ac0e1d9a5 100644 --- a/x/staking/keeper/genesis.go +++ b/x/staking/keeper/genesis.go @@ -84,7 +84,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) (res []ab for _, entry := range ubd.Entries { k.InsertUBDQueue(ctx, ubd, entry.CompletionTime) - notBondedTokens = notBondedTokens.Add(entry.Balance) + notBondedTokens = notBondedTokens.Add(entry.Balance.Amount) } } @@ -96,9 +96,6 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) (res []ab } } - bondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, bondedTokens)) - notBondedCoins := sdk.NewCoins(sdk.NewCoin(data.Params.BondDenom, notBondedTokens)) - // check if the unbonded and bonded pools accounts exists bondedPool := k.GetBondedPool(ctx) if bondedPool == nil { @@ -111,9 +108,14 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) (res []ab k.authKeeper.SetModuleAccount(ctx, bondedPool) } + bondedBalanceSum := sdk.ZeroInt() + for _, c := range bondedBalance { + bondedBalanceSum = bondedBalanceSum.Add(c.Amount) + } + // if balance is different from bonded coins panic because genesis is most likely malformed - if !bondedBalance.IsEqual(bondedCoins) { - panic(fmt.Sprintf("bonded pool balance is different from bonded coins: %s <-> %s", bondedBalance, bondedCoins)) + if !bondedBalanceSum.Equal(bondedTokens) { + panic(fmt.Sprintf("bonded pool balance is different from bonded coins: %s <-> %s", bondedBalanceSum, bondedTokens)) } notBondedPool := k.GetNotBondedPool(ctx) @@ -126,10 +128,13 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) (res []ab k.authKeeper.SetModuleAccount(ctx, notBondedPool) } - // If balance is different from non bonded coins panic because genesis is most - // likely malformed. - if !notBondedBalance.IsEqual(notBondedCoins) { - panic(fmt.Sprintf("not bonded pool balance is different from not bonded coins: %s <-> %s", notBondedBalance, notBondedCoins)) + unBondedBalanceSum := sdk.ZeroInt() + for _, c := range notBondedBalance { + unBondedBalanceSum = unBondedBalanceSum.Add(c.Amount) + } + // if balance is different from non bonded coins panic because genesis is most likely malformed + if !unBondedBalanceSum.Equal(notBondedTokens) { + panic(fmt.Sprintf("not bonded pool balance is different from not bonded coins: %s <-> %s", unBondedBalanceSum, notBondedTokens)) } // don't need to run Tendermint updates if we exported diff --git a/x/staking/keeper/genesis_test.go b/x/staking/keeper/genesis_test.go index 908e301decfa..9b56d45c9f8b 100644 --- a/x/staking/keeper/genesis_test.go +++ b/x/staking/keeper/genesis_test.go @@ -48,6 +48,7 @@ func TestInitGenesis(t *testing.T) { Tokens: valTokens, DelegatorShares: sdk.NewDecFromInt(valTokens), Description: types.NewDescription("hoop", "", "", "", ""), + BondDenom: sdk.DefaultBondDenom, } bondedVal2 := types.Validator{ OperatorAddress: sdk.ValAddress(addrs[1]).String(), @@ -56,6 +57,7 @@ func TestInitGenesis(t *testing.T) { Tokens: valTokens, DelegatorShares: sdk.NewDecFromInt(valTokens), Description: types.NewDescription("bloop", "", "", "", ""), + BondDenom: sdk.DefaultBondDenom, } // append new bonded validators to the list @@ -126,6 +128,7 @@ func TestInitGenesis_PoolsBalanceMismatch(t *testing.T) { Tokens: sdk.NewInt(10), DelegatorShares: sdk.NewDecFromInt(sdk.NewInt(10)), Description: types.NewDescription("bloop", "", "", "", ""), + BondDenom: sdk.DefaultBondDenom, } params := types.Params{ @@ -180,6 +183,7 @@ func TestInitGenesisLargeValidatorSet(t *testing.T) { ) require.NoError(t, err) validators[i].Status = types.Bonded + validators[i].BondDenom = sdk.DefaultBondDenom tokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) if i < 100 { diff --git a/x/staking/keeper/grpc_query_test.go b/x/staking/keeper/grpc_query_test.go index 09cdb5e47cea..c3b978f175c2 100644 --- a/x/staking/keeper/grpc_query_test.go +++ b/x/staking/keeper/grpc_query_test.go @@ -429,7 +429,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryUnbondingDelegation() { unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) valAddr, err1 := sdk.ValAddressFromBech32(addrVal2) suite.NoError(err1) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc2, valAddr, sdk.NewDecFromInt(unbondingTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc2, valAddr, sdk.NewDecFromInt(unbondingTokens), sdk.NewCoin(sdk.DefaultBondDenom, unbondingTokens)) suite.NoError(err) unbond, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc2, valAddr) @@ -488,11 +488,11 @@ func (suite *KeeperTestSuite) TestGRPCQueryDelegatorUnbondingDelegations() { unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) valAddr1, err1 := sdk.ValAddressFromBech32(addrVal) suite.NoError(err1) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr1, sdk.NewDecFromInt(unbondingTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr1, sdk.NewDecFromInt(unbondingTokens), sdk.NewCoin(sdk.DefaultBondDenom, unbondingTokens)) suite.NoError(err) valAddr2, err1 := sdk.ValAddressFromBech32(addrVal2) suite.NoError(err1) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr2, sdk.NewDecFromInt(unbondingTokens)) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc, valAddr2, sdk.NewDecFromInt(unbondingTokens), sdk.NewCoin(sdk.DefaultBondDenom, unbondingTokens)) suite.NoError(err) unbond, found := app.StakingKeeper.GetUnbondingDelegation(ctx, addrAcc, valAddr1) @@ -637,12 +637,12 @@ func (suite *KeeperTestSuite) TestGRPCQueryRedelegations() { valAddrs := simapp.ConvertAddrsToValAddrs(addrs) val1, val2, val3, val4 := vals[0], vals[1], valAddrs[3], valAddrs[4] delAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) - _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, delAmount, types.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, sdk.NewCoin(sdk.DefaultBondDenom, delAmount), types.Unbonded, val1, true) suite.NoError(err) applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) rdAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 1) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc1, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount), sdk.NewCoin(sdk.DefaultBondDenom, rdAmount)) suite.NoError(err) applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) @@ -739,7 +739,7 @@ func (suite *KeeperTestSuite) TestGRPCQueryValidatorUnbondingDelegations() { // undelegate undelAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 2) - _, err := app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount)) + _, err := app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount), sdk.NewCoin(sdk.DefaultBondDenom, undelAmount)) suite.NoError(err) applyValidatorSetUpdates(suite.T(), ctx, app.StakingKeeper, -1) @@ -809,11 +809,11 @@ func createValidators(t *testing.T, ctx sdk.Context, app *simapp.SimApp, powers app.StakingKeeper.SetNewValidatorByPowerIndex(ctx, val1) app.StakingKeeper.SetNewValidatorByPowerIndex(ctx, val2) - _, err := app.StakingKeeper.Delegate(ctx, addrs[0], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[0]), types.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrs[0], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[0])), types.Unbonded, val1, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, addrs[1], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[1]), types.Unbonded, val2, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[1], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[1])), types.Unbonded, val2, true) require.NoError(t, err) - _, err = app.StakingKeeper.Delegate(ctx, addrs[0], app.StakingKeeper.TokensFromConsensusPower(ctx, powers[2]), types.Unbonded, val2, true) + _, err = app.StakingKeeper.Delegate(ctx, addrs[0], sdk.NewCoin(sdk.DefaultBondDenom, app.StakingKeeper.TokensFromConsensusPower(ctx, powers[2])), types.Unbonded, val2, true) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) diff --git a/x/staking/keeper/invariants.go b/x/staking/keeper/invariants.go index 7ebc427c11b0..e2b297e217b7 100644 --- a/x/staking/keeper/invariants.go +++ b/x/staking/keeper/invariants.go @@ -50,7 +50,6 @@ func ModuleAccountInvariants(k Keeper) sdk.Invariant { notBonded := sdk.ZeroInt() bondedPool := k.GetBondedPool(ctx) notBondedPool := k.GetNotBondedPool(ctx) - bondDenom := k.BondDenom(ctx) k.IterateValidators(ctx, func(_ int64, validator types.ValidatorI) bool { switch validator.GetStatus() { @@ -66,14 +65,24 @@ func ModuleAccountInvariants(k Keeper) sdk.Invariant { k.IterateUnbondingDelegations(ctx, func(_ int64, ubd types.UnbondingDelegation) bool { for _, entry := range ubd.Entries { - notBonded = notBonded.Add(entry.Balance) + notBonded = notBonded.Add(entry.Balance.Amount) } return false }) - poolBonded := k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), bondDenom) - poolNotBonded := k.bankKeeper.GetBalance(ctx, notBondedPool.GetAddress(), bondDenom) - broken := !poolBonded.Amount.Equal(bonded) || !poolNotBonded.Amount.Equal(notBonded) + poolBonded := k.bankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) + poolBondedSum := sdk.ZeroInt() + for _, c := range poolBonded { + poolBondedSum = poolBondedSum.Add(c.Amount) + } + + poolNotBonded := k.bankKeeper.GetAllBalances(ctx, notBondedPool.GetAddress()) + poolNotBondedSum := sdk.ZeroInt() + for _, c := range poolNotBonded { + poolNotBondedSum = poolNotBondedSum.Add(c.Amount) + } + + broken := !poolBondedSum.Equal(bonded) || !poolNotBondedSum.Equal(notBonded) // Bonded tokens should equal sum of tokens with bonded validators // Not-bonded tokens should equal unbonding delegations plus tokens on unbonded validators @@ -86,7 +95,7 @@ func ModuleAccountInvariants(k Keeper) sdk.Invariant { "module accounts total (bonded + not bonded):\n"+ "\tModule Accounts' tokens: %v\n"+ "\tsum tokens: %v\n", - poolBonded, bonded, poolNotBonded, notBonded, poolBonded.Add(poolNotBonded), bonded.Add(notBonded))), broken + poolBonded, bonded, poolNotBonded, notBonded, poolBondedSum.Add(poolNotBondedSum), bonded.Add(notBonded))), broken } } diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index cf74b61ea02f..874eddf740e1 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -56,10 +56,9 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa return nil, types.ErrValidatorPubKeyExists } - bondDenom := k.BondDenom(ctx) - if msg.Value.Denom != bondDenom { + if supported := k.IsBondDenomSupported(ctx, msg.Value.Denom); !supported { return nil, sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Value.Denom, bondDenom, + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s", msg.Value.Denom, ) } @@ -107,6 +106,8 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa validator.MinSelfDelegation = msg.MinSelfDelegation + validator.BondDenom = msg.Value.Denom + k.SetValidator(ctx, validator) k.SetValidatorByConsAddr(ctx, validator) k.SetNewValidatorByPowerIndex(ctx, validator) @@ -119,7 +120,7 @@ func (k msgServer) CreateValidator(goCtx context.Context, msg *types.MsgCreateVa // move coins from the msg.Address account to a (self-delegation) delegator account // the validator account and global shares are updated within here // NOTE source will always be from a wallet which are unbonded - _, err = k.Keeper.Delegate(ctx, delegatorAddress, msg.Value.Amount, types.Unbonded, validator, true) + _, err = k.Keeper.Delegate(ctx, delegatorAddress, msg.Value, types.Unbonded, validator, true) if err != nil { return nil, err } @@ -223,15 +224,14 @@ func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*typ return nil, err } - bondDenom := k.BondDenom(ctx) - if msg.Amount.Denom != bondDenom { + if supported := k.IsBondDenomSupported(ctx, msg.Amount.Denom); !supported { return nil, sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, bondDenom, + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s", msg.Amount.Denom, ) } // NOTE: source funds are always unbonded - newShares, err := k.Keeper.Delegate(ctx, delegatorAddress, msg.Amount.Amount, types.Unbonded, validator, true) + newShares, err := k.Keeper.Delegate(ctx, delegatorAddress, msg.Amount, types.Unbonded, validator, true) if err != nil { return nil, err } @@ -282,10 +282,9 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed return nil, err } - bondDenom := k.BondDenom(ctx) - if msg.Amount.Denom != bondDenom { + if supported := k.IsBondDenomSupported(ctx, msg.Amount.Denom); !supported { return nil, sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, bondDenom, + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s", msg.Amount.Denom, ) } @@ -295,7 +294,7 @@ func (k msgServer) BeginRedelegate(goCtx context.Context, msg *types.MsgBeginRed } completionTime, err := k.BeginRedelegation( - ctx, delegatorAddress, valSrcAddr, valDstAddr, shares, + ctx, delegatorAddress, valSrcAddr, valDstAddr, shares, msg.Amount, ) if err != nil { return nil, err @@ -351,14 +350,13 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( return nil, err } - bondDenom := k.BondDenom(ctx) - if msg.Amount.Denom != bondDenom { + if supported := k.IsBondDenomSupported(ctx, msg.Amount.Denom); !supported { return nil, sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, bondDenom, + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s", msg.Amount.Denom, ) } - completionTime, err := k.Keeper.Undelegate(ctx, delegatorAddress, addr, shares) + completionTime, err := k.Keeper.Undelegate(ctx, delegatorAddress, addr, shares, msg.Amount) if err != nil { return nil, err } @@ -408,18 +406,17 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M return nil, err } - bondDenom := k.BondDenom(ctx) - if msg.Amount.Denom != bondDenom { - return nil, sdkerrors.Wrapf( - sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, bondDenom, - ) - } - validator, found := k.GetValidator(ctx, valAddr) if !found { return nil, types.ErrNoValidatorFound } + if msg.Amount.Denom != validator.BondDenom { + return nil, sdkerrors.Wrapf( + sdkerrors.ErrInvalidRequest, "invalid coin denomination: got %s, expected %s", msg.Amount.Denom, validator.BondDenom, + ) + } + // In some situations, the exchange rate becomes invalid, e.g. if // Validator loses all tokens due to slashing. In this case, // make all future delegations invalid. @@ -456,7 +453,7 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M return nil, sdkerrors.ErrNotFound.Wrapf("unbonding delegation entry is not found at block height %d", msg.CreationHeight) } - if unbondEntry.Balance.LT(msg.Amount.Amount) { + if unbondEntry.Balance.Amount.LT(msg.Amount.Amount) { return nil, sdkerrors.ErrInvalidRequest.Wrap("amount is greater than the unbonding delegation entry balance") } @@ -465,18 +462,18 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M } // delegate back the unbonding delegation amount to the validator - _, err = k.Keeper.Delegate(ctx, delegatorAddress, msg.Amount.Amount, types.Unbonding, validator, false) + _, err = k.Keeper.Delegate(ctx, delegatorAddress, msg.Amount, types.Unbonding, validator, false) if err != nil { return nil, err } - amount := unbondEntry.Balance.Sub(msg.Amount.Amount) + amount := unbondEntry.Balance.Sub(msg.Amount) if amount.IsZero() { ubd.RemoveEntry(unbondEntryIndex) } else { // update the unbondingDelegationEntryBalance and InitialBalance for ubd entry unbondEntry.Balance = amount - unbondEntry.InitialBalance = unbondEntry.InitialBalance.Sub(msg.Amount.Amount) + unbondEntry.InitialBalance = unbondEntry.InitialBalance.Sub(msg.Amount) ubd.Entries[unbondEntryIndex] = unbondEntry } diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go index 44538be4d4ae..2119e8f5447b 100644 --- a/x/staking/keeper/msg_server_test.go +++ b/x/staking/keeper/msg_server_test.go @@ -4,13 +4,14 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank/testutil" "github.com/cosmos/cosmos-sdk/x/staking/keeper" "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/stretchr/testify/require" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) func TestCancelUnbondingDelegation(t *testing.T) { @@ -44,7 +45,7 @@ func TestCancelUnbondingDelegation(t *testing.T) { ubd := types.NewUnbondingDelegation( delegatorAddr, validatorAddr, 10, ctx.BlockTime().Add(time.Minute*10), - unbondingAmount.Amount, + unbondingAmount, ) // set and retrieve a record diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index b26477b8a46c..057b7726c84d 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -1,9 +1,11 @@ package keeper import ( + "strings" "time" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -40,6 +42,29 @@ func (k Keeper) BondDenom(ctx sdk.Context) (res string) { return } +func (k Keeper) BondDenomSlice(ctx sdk.Context) (res []string) { + var supportedDenom string + k.paramstore.Get(ctx, types.KeyBondDenom, &supportedDenom) + res = strings.Split(supportedDenom, ",") + + return res +} + +func (k Keeper) IsBondDenomSupported(ctx sdk.Context, denom string) bool { + var supportedDenom string + k.paramstore.Get(ctx, types.KeyBondDenom, &supportedDenom) + s := strings.Split(supportedDenom, ",") + + var result = false + for _, x := range s { + if x == denom { + result = true + break + } + } + return result +} + // PowerReduction - is the amount of staking tokens required for 1 unit of consensus-engine power. // Currently, this returns a global variable that the app developer can tweak. // TODO: we might turn this into an on-chain param: diff --git a/x/staking/keeper/params_test.go b/x/staking/keeper/params_test.go new file mode 100644 index 000000000000..dbad6b6cd626 --- /dev/null +++ b/x/staking/keeper/params_test.go @@ -0,0 +1,61 @@ +package keeper_test + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func (suite *KeeperTestSuite) TestDefaultParams() { + suite.SetupTest() + + expParams := types.DefaultParams() + + //check that the empty keeper loads the default + resParams := suite.app.StakingKeeper.GetParams(suite.ctx) + suite.Require().True(expParams.Equal(resParams)) +} + +func (suite *KeeperTestSuite) TestSetParamsSetMultiTokenBondDenom() { + suite.SetupTest() + + //validate for default sdk bond denom + expParams := types.DefaultParams() + suite.Require().Equal(expParams.BondDenom, sdk.DefaultBondDenom) + + expParams.BondDenom = "ario,arst" + suite.app.StakingKeeper.SetParams(suite.ctx, expParams) + + //validate save + resParams := suite.app.StakingKeeper.GetParams(suite.ctx) + suite.Require().Equal(resParams.BondDenom, "ario,arst") +} + +func (suite *KeeperTestSuite) TestIsBondDenomSupported() { + suite.SetupTest() + + //validate for default sdk bond denom + expParams := types.DefaultParams() + expParams.BondDenom = "ario,arst" + suite.app.StakingKeeper.SetParams(suite.ctx, expParams) + + res := suite.app.StakingKeeper.IsBondDenomSupported(suite.ctx, "ario") + suite.Require().True(res) + suite.Require().True(suite.app.StakingKeeper.IsBondDenomSupported(suite.ctx, "ario")) + suite.Require().True(suite.app.StakingKeeper.IsBondDenomSupported(suite.ctx, "arst")) + suite.Require().False(suite.app.StakingKeeper.IsBondDenomSupported(suite.ctx, "stake")) +} + +func (suite *KeeperTestSuite) TestBondDenomSlice() { + suite.SetupTest() + + //validate for default sdk bond denom + expParams := types.DefaultParams() + var expected = []string{"stake"} + suite.Require().Equal(suite.app.StakingKeeper.BondDenomSlice(suite.ctx), expected) + + expParams.BondDenom = "ario,arst" + suite.app.StakingKeeper.SetParams(suite.ctx, expParams) + + expected = []string{"ario", "arst"} + suite.Require().Equal(suite.app.StakingKeeper.BondDenomSlice(suite.ctx), expected) +} diff --git a/x/staking/keeper/pool.go b/x/staking/keeper/pool.go index 06d87422da44..600f020b6ec3 100644 --- a/x/staking/keeper/pool.go +++ b/x/staking/keeper/pool.go @@ -2,6 +2,7 @@ package keeper import ( "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -18,41 +19,39 @@ func (k Keeper) GetNotBondedPool(ctx sdk.Context) (notBondedPool authtypes.Modul } // bondedTokensToNotBonded transfers coins from the bonded to the not bonded pool within staking -func (k Keeper) bondedTokensToNotBonded(ctx sdk.Context, tokens math.Int) { - coins := sdk.NewCoins(sdk.NewCoin(k.BondDenom(ctx), tokens)) +func (k Keeper) bondedTokensToNotBonded(ctx sdk.Context, coins sdk.Coins) { if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.BondedPoolName, types.NotBondedPoolName, coins); err != nil { panic(err) } } // notBondedTokensToBonded transfers coins from the not bonded to the bonded pool within staking -func (k Keeper) notBondedTokensToBonded(ctx sdk.Context, tokens math.Int) { - coins := sdk.NewCoins(sdk.NewCoin(k.BondDenom(ctx), tokens)) +func (k Keeper) notBondedTokensToBonded(ctx sdk.Context, coins sdk.Coins) { if err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, types.NotBondedPoolName, types.BondedPoolName, coins); err != nil { panic(err) } } // burnBondedTokens removes coins from the bonded pool module account -func (k Keeper) burnBondedTokens(ctx sdk.Context, amt math.Int) error { - if !amt.IsPositive() { +func (k Keeper) burnBondedTokens(ctx sdk.Context, coin sdk.Coin) error { + if !coin.IsPositive() { // skip as no coins need to be burned return nil } - coins := sdk.NewCoins(sdk.NewCoin(k.BondDenom(ctx), amt)) + coins := sdk.NewCoins(coin) return k.bankKeeper.BurnCoins(ctx, types.BondedPoolName, coins) } // burnNotBondedTokens removes coins from the not bonded pool module account -func (k Keeper) burnNotBondedTokens(ctx sdk.Context, amt math.Int) error { - if !amt.IsPositive() { +func (k Keeper) burnNotBondedTokens(ctx sdk.Context, coin sdk.Coin) error { + if !coin.IsPositive() { // skip as no coins need to be burned return nil } - coins := sdk.NewCoins(sdk.NewCoin(k.BondDenom(ctx), amt)) + coins := sdk.NewCoins(coin) return k.bankKeeper.BurnCoins(ctx, types.NotBondedPoolName, coins) } @@ -60,12 +59,24 @@ func (k Keeper) burnNotBondedTokens(ctx sdk.Context, amt math.Int) error { // TotalBondedTokens total staking tokens supply which is bonded func (k Keeper) TotalBondedTokens(ctx sdk.Context) math.Int { bondedPool := k.GetBondedPool(ctx) - return k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), k.BondDenom(ctx)).Amount + bondableTokens := k.BondDenomSlice(ctx) + balanceSum := sdk.ZeroInt() + for _, x := range bondableTokens { + balance := k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), x) + balanceSum = balanceSum.Add(balance.Amount) + } + return balanceSum } // StakingTokenSupply staking tokens from the total supply func (k Keeper) StakingTokenSupply(ctx sdk.Context) math.Int { - return k.bankKeeper.GetSupply(ctx, k.BondDenom(ctx)).Amount + bondableTokens := k.BondDenomSlice(ctx) + totalSum := sdk.ZeroInt() + for _, x := range bondableTokens { + sum := k.bankKeeper.GetSupply(ctx, x) + totalSum = totalSum.Add(sum.Amount) + } + return totalSum } // BondedRatio the fraction of the staking tokens which are currently bonded diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index b3ec7e18d92f..812abcadf5d9 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -411,7 +411,6 @@ func queryHistoricalInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper, legac } func queryPool(ctx sdk.Context, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ([]byte, error) { - bondDenom := k.BondDenom(ctx) bondedPool := k.GetBondedPool(ctx) notBondedPool := k.GetNotBondedPool(ctx) @@ -419,10 +418,17 @@ func queryPool(ctx sdk.Context, k Keeper, legacyQuerierCdc *codec.LegacyAmino) ( return nil, errors.New("pool accounts haven't been set") } - pool := types.NewPool( - k.bankKeeper.GetBalance(ctx, notBondedPool.GetAddress(), bondDenom).Amount, - k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), bondDenom).Amount, - ) + bondableTokens := k.BondDenomSlice(ctx) + bondedBalanceSum := sdk.ZeroInt() + notBondedBalanceSum := sdk.ZeroInt() + for _, x := range bondableTokens { + bondedBalance := k.bankKeeper.GetBalance(ctx, bondedPool.GetAddress(), x) + notBondedBalance := k.bankKeeper.GetBalance(ctx, notBondedPool.GetAddress(), x) + bondedBalanceSum = bondedBalanceSum.Add(bondedBalance.Amount) + notBondedBalanceSum = notBondedBalanceSum.Add(notBondedBalance.Amount) + } + + pool := types.NewPool(notBondedBalanceSum, bondedBalanceSum) res, err := codec.MarshalJSONIndent(legacyQuerierCdc, pool) if err != nil { @@ -460,7 +466,7 @@ func DelegationToDelegationResponse(ctx sdk.Context, k Keeper, del types.Delegat delegatorAddress, del.GetValidatorAddr(), del.Shares, - sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()), + sdk.NewCoin(val.BondDenom, val.TokensFromShares(del.Shares).TruncateInt()), ), nil } diff --git a/x/staking/keeper/querier_test.go b/x/staking/keeper/querier_test.go index ac5b1eed5a56..4cec2a941077 100644 --- a/x/staking/keeper/querier_test.go +++ b/x/staking/keeper/querier_test.go @@ -224,7 +224,7 @@ func TestQueryDelegation(t *testing.T) { app.StakingKeeper.SetValidatorByPowerIndex(ctx, val2) delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err := app.StakingKeeper.Delegate(ctx, addrAcc2, delTokens, types.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrAcc2, sdk.NewCoin(sdk.DefaultBondDenom, delTokens), types.Unbonded, val1, true) require.NoError(t, err) // apply TM updates @@ -351,7 +351,7 @@ func TestQueryDelegation(t *testing.T) { // Query unbonding delegation unbondingTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc2, val1.GetOperator(), sdk.NewDecFromInt(unbondingTokens)) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc2, val1.GetOperator(), sdk.NewDecFromInt(unbondingTokens), sdk.NewCoin(sdk.DefaultBondDenom, unbondingTokens)) require.NoError(t, err) queryBondParams = types.QueryDelegatorValidatorRequest{DelegatorAddr: addrAcc2.String(), ValidatorAddr: addrVal1.String()} @@ -404,7 +404,7 @@ func TestQueryDelegation(t *testing.T) { // Query redelegation redelegationTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(redelegationTokens)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(redelegationTokens), sdk.NewCoin(sdk.DefaultBondDenom, redelegationTokens)) require.NoError(t, err) redel, found := app.StakingKeeper.GetRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator()) require.True(t, found) @@ -474,7 +474,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { } delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err := app.StakingKeeper.Delegate(ctx, addr, delTokens, types.Unbonded, validator, true) + _, err := app.StakingKeeper.Delegate(ctx, addr, sdk.NewCoin(sdk.DefaultBondDenom, delTokens), types.Unbonded, validator, true) require.NoError(t, err) } @@ -508,7 +508,7 @@ func TestQueryValidatorDelegations_Pagination(t *testing.T) { // Undelegate for _, addr := range addrs { delTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err := app.StakingKeeper.Undelegate(ctx, addr, val1.GetOperator(), sdk.NewDecFromInt(delTokens)) + _, err := app.StakingKeeper.Undelegate(ctx, addr, val1.GetOperator(), sdk.NewDecFromInt(delTokens), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) require.NoError(t, err) } @@ -553,12 +553,12 @@ func TestQueryRedelegations(t *testing.T) { app.StakingKeeper.SetValidator(ctx, val2) delAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 100) - _, err := app.StakingKeeper.Delegate(ctx, addrAcc2, delAmount, types.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrAcc2, sdk.NewCoin(sdk.DefaultBondDenom, delAmount), types.Unbonded, val1, true) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) rdAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount)) + _, err = app.StakingKeeper.BeginRedelegation(ctx, addrAcc2, val1.GetOperator(), val2.GetOperator(), sdk.NewDecFromInt(rdAmount), sdk.NewCoin(sdk.DefaultBondDenom, rdAmount)) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) @@ -624,13 +624,13 @@ func TestQueryUnbondingDelegation(t *testing.T) { // delegate delAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 100) - _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, delAmount, types.Unbonded, val1, true) + _, err := app.StakingKeeper.Delegate(ctx, addrAcc1, sdk.NewCoin(sdk.DefaultBondDenom, delAmount), types.Unbonded, val1, true) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // undelegate undelAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) - _, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount)) + _, err = app.StakingKeeper.Undelegate(ctx, addrAcc1, val1.GetOperator(), sdk.NewDecFromInt(undelAmount), sdk.NewCoin(sdk.DefaultBondDenom, undelAmount)) require.NoError(t, err) applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 40f5d85e8195..f5e49ea6d12b 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -4,6 +4,7 @@ import ( "fmt" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/x/staking/types" ) @@ -129,13 +130,14 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh // Burn the slashed tokens from the pool account and decrease the total supply. validator = k.RemoveValidatorTokens(ctx, validator, tokensToBurn) + coinToBurn := sdk.NewCoin(validator.BondDenom, tokensToBurn) switch validator.GetStatus() { case types.Bonded: - if err := k.burnBondedTokens(ctx, tokensToBurn); err != nil { + if err := k.burnBondedTokens(ctx, coinToBurn); err != nil { panic(err) } case types.Unbonding, types.Unbonded: - if err := k.burnNotBondedTokens(ctx, tokensToBurn); err != nil { + if err := k.burnNotBondedTokens(ctx, coinToBurn); err != nil { panic(err) } default: @@ -146,7 +148,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeigh "validator slashed by slash factor", "validator", validator.GetOperator().String(), "slash_factor", slashFactor.String(), - "burned", tokensToBurn, + "burned", coinToBurn.String(), ) return tokensToBurn } @@ -178,9 +180,13 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty now := ctx.BlockHeader().Time totalSlashAmount = sdk.ZeroInt() burnedAmount := sdk.ZeroInt() + var burnDenom string // perform slashing on all entries within the unbonding delegation for i, entry := range unbondingDelegation.Entries { + // Capture the denom so we can create the coin later for burning + burnDenom = entry.InitialBalance.Denom + // If unbonding started before this height, stake didn't contribute to infraction if entry.CreationHeight < infractionHeight { continue @@ -192,7 +198,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty } // Calculate slash amount proportional to stake contributing to infraction - slashAmountDec := slashFactor.MulInt(entry.InitialBalance) + slashAmountDec := slashFactor.MulInt(entry.InitialBalance.Amount) slashAmount := slashAmountDec.TruncateInt() totalSlashAmount = totalSlashAmount.Add(slashAmount) @@ -200,7 +206,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty // Possible since the unbonding delegation may already // have been slashed, and slash amounts are calculated // according to stake held at time of infraction - unbondingSlashAmount := sdk.MinInt(slashAmount, entry.Balance) + unbondingSlashAmount := sdk.MinInt(slashAmount, entry.Balance.Amount) // Update unbonding delegation if necessary if unbondingSlashAmount.IsZero() { @@ -208,12 +214,13 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty } burnedAmount = burnedAmount.Add(unbondingSlashAmount) - entry.Balance = entry.Balance.Sub(unbondingSlashAmount) + entry.Balance = entry.Balance.SubAmount(unbondingSlashAmount) unbondingDelegation.Entries[i] = entry k.SetUnbondingDelegation(ctx, unbondingDelegation) } - if err := k.burnNotBondedTokens(ctx, burnedAmount); err != nil { + burnCoin := sdk.NewCoin(burnDenom, burnedAmount) + if err := k.burnNotBondedTokens(ctx, burnCoin); err != nil { panic(err) } @@ -232,9 +239,13 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, now := ctx.BlockHeader().Time totalSlashAmount = sdk.ZeroInt() bondedBurnedAmount, notBondedBurnedAmount := sdk.ZeroInt(), sdk.ZeroInt() + var burnDenom string // perform slashing on all entries within the redelegation for _, entry := range redelegation.Entries { + // Capture the denom so we can create the coin later for burning + burnDenom = entry.InitialBalance.Denom + // If redelegation started before this height, stake didn't contribute to infraction if entry.CreationHeight < infractionHeight { continue @@ -246,7 +257,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, } // Calculate slash amount proportional to stake contributing to infraction - slashAmountDec := slashFactor.MulInt(entry.InitialBalance) + slashAmountDec := slashFactor.MulInt(entry.InitialBalance.Amount) slashAmount := slashAmountDec.TruncateInt() totalSlashAmount = totalSlashAmount.Add(slashAmount) @@ -295,11 +306,13 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, } } - if err := k.burnBondedTokens(ctx, bondedBurnedAmount); err != nil { + burnBondedCoin := sdk.NewCoin(burnDenom, bondedBurnedAmount) + if err := k.burnBondedTokens(ctx, burnBondedCoin); err != nil { panic(err) } - if err := k.burnNotBondedTokens(ctx, notBondedBurnedAmount); err != nil { + burnNotBondedCoin := sdk.NewCoin(burnDenom, notBondedBurnedAmount) + if err := k.burnNotBondedTokens(ctx, burnNotBondedCoin); err != nil { panic(err) } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index ea83aab9dce2..150ef56154b6 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -23,7 +23,7 @@ func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, addrDels, addrVals := generateAddresses(app, ctx, 100) amt := app.StakingKeeper.TokensFromConsensusPower(ctx, power) - totalSupply := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), amt.MulRaw(int64(len(addrDels))))) + totalSupply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amt.MulRaw(int64(len(addrDels))))) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) require.NoError(t, testutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), totalSupply)) @@ -31,7 +31,7 @@ func bootstrapSlashTest(t *testing.T, power int64) (*simapp.SimApp, sdk.Context, app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) numVals := int64(3) - bondedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), amt.MulRaw(numVals))) + bondedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amt.MulRaw(numVals))) bondedPool := app.StakingKeeper.GetBondedPool(ctx) // set bonded pool balance @@ -81,7 +81,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), sdk.NewInt(10)) + time.Unix(5, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10))) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) @@ -107,13 +107,13 @@ func TestSlashUnbondingDelegation(t *testing.T) { require.Len(t, ubd.Entries, 1) // initial balance unchanged - require.Equal(t, sdk.NewInt(10), ubd.Entries[0].InitialBalance) + require.Equal(t, sdk.NewInt(10), ubd.Entries[0].InitialBalance.Amount) // balance decreased - require.Equal(t, sdk.NewInt(5), ubd.Entries[0].Balance) + require.Equal(t, sdk.NewInt(5), ubd.Entries[0].Balance.Amount) newUnbondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, notBondedPool.GetAddress()) diffTokens := oldUnbondedPoolBalances.Sub(newUnbondedPoolBalances...) - require.True(t, diffTokens.AmountOf(app.StakingKeeper.BondDenom(ctx)).Equal(sdk.NewInt(5))) + require.True(t, diffTokens.AmountOf(sdk.DefaultBondDenom).Equal(sdk.NewInt(5))) } // tests slashRedelegation @@ -122,7 +122,7 @@ func TestSlashRedelegation(t *testing.T) { fraction := sdk.NewDecWithPrec(5, 1) // add bonded tokens to pool for (re)delegations - startCoins := sdk.NewCoins(sdk.NewInt64Coin(app.StakingKeeper.BondDenom(ctx), 15)) + startCoins := sdk.NewCoins(sdk.NewInt64Coin(sdk.DefaultBondDenom, 15)) bondedPool := app.StakingKeeper.GetBondedPool(ctx) balances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) @@ -132,7 +132,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), sdk.NewInt(10), sdk.NewDec(10)) + time.Unix(5, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), sdk.NewDec(10)) app.StakingKeeper.SetRedelegation(ctx, rd) @@ -171,7 +171,7 @@ func TestSlashRedelegation(t *testing.T) { applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) // initialbalance unchanged - require.Equal(t, sdk.NewInt(10), rd.Entries[0].InitialBalance) + require.Equal(t, sdk.NewInt(10), rd.Entries[0].InitialBalance.Amount) // shares decreased del, found = app.StakingKeeper.GetDelegation(ctx, addrDels[0], addrVals[1]) @@ -179,7 +179,7 @@ func TestSlashRedelegation(t *testing.T) { require.Equal(t, int64(5), del.Shares.RoundInt64()) // pool bonded tokens should decrease - burnedCoins := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), slashAmount)) + burnedCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, slashAmount)) require.Equal(t, balances.Sub(burnedCoins...), app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress())) } @@ -220,7 +220,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { // pool bonded shares decreased newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 5).String(), diffTokens.String()) } @@ -251,7 +251,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { // pool bonded shares decreased newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 5).String(), diffTokens.String()) } @@ -265,7 +265,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, ubdTokens)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) // slash validator for the first time @@ -286,11 +286,11 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { require.Len(t, ubd.Entries, 1) // balance decreased - require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 2), ubd.Entries[0].Balance) + require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 2), ubd.Entries[0].Balance.Amount) // bonded tokens burned newBondedPoolBalances := app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens := oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 3), diffTokens) // read updated validator @@ -312,11 +312,11 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { require.Len(t, ubd.Entries, 1) // balance decreased again - require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance) + require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance.Amount) // bonded tokens burned again newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 6), diffTokens) // read updated validator @@ -338,11 +338,11 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { require.Len(t, ubd.Entries, 1) // balance unchanged - require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance) + require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance.Amount) // bonded tokens burned again newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 9), diffTokens) // read updated validator @@ -364,11 +364,11 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { require.Len(t, ubd.Entries, 1) // balance unchanged - require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance) + require.Equal(t, sdk.NewInt(0), ubd.Entries[0].Balance.Amount) // just 1 bonded token burned again since that's all the validator now has newBondedPoolBalances = app.BankKeeper.GetAllBalances(ctx, bondedPool.GetAddress()) - diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(app.StakingKeeper.BondDenom(ctx)) + diffTokens = oldBondedPoolBalances.Sub(newBondedPoolBalances...).AmountOf(sdk.DefaultBondDenom) require.Equal(t, app.StakingKeeper.TokensFromConsensusPower(ctx, 10), diffTokens) // apply TM updates @@ -386,11 +386,11 @@ func TestSlashWithRedelegation(t *testing.T) { app, ctx, addrDels, addrVals := bootstrapSlashTest(t, 10) consAddr := sdk.ConsAddress(PKs[0].Address()) fraction := sdk.NewDecWithPrec(5, 1) - bondDenom := app.StakingKeeper.BondDenom(ctx) + bondDenom := sdk.DefaultBondDenom // set a redelegation rdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, sdk.NewDecFromInt(rdTokens)) + rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, rdTokens), sdk.NewDecFromInt(rdTokens)) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation @@ -537,12 +537,12 @@ func TestSlashWithRedelegation(t *testing.T) { func TestSlashBoth(t *testing.T) { app, ctx, addrDels, addrVals := bootstrapSlashTest(t, 10) fraction := sdk.NewDecWithPrec(5, 1) - bondDenom := app.StakingKeeper.BondDenom(ctx) + bondDenom := sdk.DefaultBondDenom // set a redelegation with expiration timestamp beyond which the // redelegation shouldn't be slashed rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, sdk.NewDecFromInt(rdATokens)) + rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, rdATokens), sdk.NewDecFromInt(rdATokens)) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation @@ -553,7 +553,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens) + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, ubdATokens)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubdA) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 22f699366119..ebc0bd6a063d 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -112,6 +112,11 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab totalPower := sdk.ZeroInt() amtFromBondedToNotBonded, amtFromNotBondedToBonded := sdk.ZeroInt(), sdk.ZeroInt() + // set up Coins set. We need to sum up all bondable coins downstream + // to move them appropriately + coinsNotBondedToBonded := sdk.NewCoins() + coinsBondedToNotBonded := sdk.NewCoins() + // Retrieve the last validator set. // The persistent set is updated later in this function. // (see LastValidatorPowerKey). @@ -148,12 +153,14 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab return } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) + coinsNotBondedToBonded = coinsNotBondedToBonded.Add(sdk.NewCoin(validator.BondDenom, validator.GetTokens())) case validator.IsUnbonding(): validator, err = k.unbondingToBonded(ctx, validator) if err != nil { return } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) + coinsNotBondedToBonded = coinsNotBondedToBonded.Add(sdk.NewCoin(validator.BondDenom, validator.GetTokens())) case validator.IsBonded(): // no state change default: @@ -194,6 +201,7 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab return } amtFromBondedToNotBonded = amtFromBondedToNotBonded.Add(validator.GetTokens()) + coinsBondedToNotBonded = coinsBondedToNotBonded.Add(sdk.NewCoin(validator.BondDenom, validator.GetTokens())) k.DeleteLastValidatorPower(ctx, validator.GetOperator()) updates = append(updates, validator.ABCIValidatorUpdateZero()) } @@ -207,9 +215,9 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab // Compare and subtract the respective amounts to only perform one transfer. // This is done in order to avoid doing multiple updates inside each iterator/loop. case amtFromNotBondedToBonded.GT(amtFromBondedToNotBonded): - k.notBondedTokensToBonded(ctx, amtFromNotBondedToBonded.Sub(amtFromBondedToNotBonded)) + k.notBondedTokensToBonded(ctx, coinsNotBondedToBonded.Sub(coinsBondedToNotBonded...)) case amtFromNotBondedToBonded.LT(amtFromBondedToNotBonded): - k.bondedTokensToNotBonded(ctx, amtFromBondedToNotBonded.Sub(amtFromNotBondedToBonded)) + k.bondedTokensToNotBonded(ctx, coinsBondedToNotBonded.Sub(coinsNotBondedToBonded...)) default: // equal amounts of tokens; no update required } diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index ffa6d595854f..c6c3f46ea844 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -32,7 +32,7 @@ func bootstrapValidatorTest(t testing.TB, power int64, numAddrs int) (*simapp.Si addrDels, addrVals := generateAddresses(app, ctx, numAddrs) amt := app.StakingKeeper.TokensFromConsensusPower(ctx, power) - totalSupply := sdk.NewCoins(sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), amt.MulRaw(int64(len(addrDels))))) + totalSupply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amt.MulRaw(int64(len(addrDels))))) notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) // set bonded pool supply @@ -45,7 +45,8 @@ func bootstrapValidatorTest(t testing.TB, power int64, numAddrs int) (*simapp.Si require.Len(t, delegations, 1) delegation := delegations[0] - _, err := app.StakingKeeper.Undelegate(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr(), delegation.Shares) + _, err := app.StakingKeeper.Undelegate(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr(), + delegation.Shares, sdk.NewCoin(sdk.DefaultBondDenom, totalSupply.AmountOfNoDenomValidation(sdk.DefaultBondDenom))) require.NoError(t, err) // end block to unbond genesis validator diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 3d7546369d6b..4a6c184d0d22 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -39,8 +39,8 @@ func TestDecodeStore(t *testing.T) { val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec()) - ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt()) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec()) + ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.NewCoin(sdk.DefaultBondDenom, sdk.OneInt())) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.NewCoin(sdk.DefaultBondDenom, sdk.OneInt()), sdk.OneDec()) kvPairs := kv.Pairs{ Pairs: []kv.Pair{ diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 1e54e2db3c5a..942ee1e2d214 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -435,7 +435,7 @@ func SimulateMsgCancelUnbondingDelegate(ak types.AccountKeeper, bk types.BankKee return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCancelUnbondingDelegation, "delegator receiving balance is negative"), nil, nil } - cancelBondAmt := simtypes.RandomAmount(r, unbondingDelegationEntry.Balance) + cancelBondAmt := simtypes.RandomAmount(r, unbondingDelegationEntry.Balance.Amount) if cancelBondAmt.IsZero() { return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCancelUnbondingDelegation, "cancelBondAmt amount is zero"), nil, nil diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index aa07bafe0649..b58bb3446c50 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -6,12 +6,13 @@ import ( "testing" "time" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/simapp" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" @@ -122,7 +123,7 @@ func TestSimulateMsgCancelUnbondingDelegation(t *testing.T) { setupValidatorRewards(app, ctx, validator0.GetOperator()) // unbonding delegation - udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), app.LastBlockHeight(), blockTime.Add(2*time.Minute), delTokens) + udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), app.LastBlockHeight(), blockTime.Add(2*time.Minute), sdk.NewCoin(sdk.DefaultBondDenom, delTokens)) app.StakingKeeper.SetUnbondingDelegation(ctx, udb) setupValidatorRewards(app, ctx, validator0.GetOperator()) diff --git a/x/staking/types/authz.pb.go b/x/staking/types/authz.pb.go index ac9c88271f25..473d6400b00a 100644 --- a/x/staking/types/authz.pb.go +++ b/x/staking/types/authz.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index dea36d07f4b9..82d20128ee62 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -93,7 +93,7 @@ func (d Delegations) String() (out string) { return strings.TrimSpace(out) } -func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int) UnbondingDelegationEntry { +func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Coin) UnbondingDelegationEntry { return UnbondingDelegationEntry{ CreationHeight: creationHeight, CompletionTime: completionTime, @@ -118,7 +118,7 @@ func (e UnbondingDelegationEntry) IsMature(currentTime time.Time) bool { //nolint:interfacer func NewUnbondingDelegation( delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, + creationHeight int64, minTime time.Time, balance sdk.Coin, ) UnbondingDelegation { return UnbondingDelegation{ DelegatorAddress: delegatorAddr.String(), @@ -130,7 +130,7 @@ func NewUnbondingDelegation( } // AddEntry - append entry to the unbonding delegation -func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int) { +func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Coin) { entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance) ubd.Entries = append(ubd.Entries, entry) } @@ -189,7 +189,7 @@ func (ubds UnbondingDelegations) String() (out string) { return strings.TrimSpace(out) } -func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, sharesDst sdk.Dec) RedelegationEntry { +func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Coin, sharesDst sdk.Dec) RedelegationEntry { return RedelegationEntry{ CreationHeight: creationHeight, CompletionTime: completionTime, @@ -212,7 +212,7 @@ func (e RedelegationEntry) IsMature(currentTime time.Time) bool { //nolint:interfacer func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, + creationHeight int64, minTime time.Time, balance sdk.Coin, sharesDst sdk.Dec, ) Redelegation { return Redelegation{ DelegatorAddress: delegatorAddr.String(), @@ -225,7 +225,7 @@ func NewRedelegation( } // AddEntry - append entry to the unbonding delegation -func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec) { +func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Coin, sharesDst sdk.Dec) { entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst) red.Entries = append(red.Entries, entry) } @@ -353,7 +353,7 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, + creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance sdk.Coin, balance math.Int, ) RedelegationEntryResponse { return RedelegationEntryResponse{ RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst), diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 7ca5e8132eb4..b01c4725f053 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -33,7 +33,7 @@ func TestDelegationString(t *testing.T) { func TestUnbondingDelegationEqual(t *testing.T) { ubd1 := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))) ubd2 := ubd1 ok := ubd1.String() == ubd2.String() @@ -48,17 +48,17 @@ func TestUnbondingDelegationEqual(t *testing.T) { func TestUnbondingDelegationString(t *testing.T) { ubd := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))) require.NotEmpty(t, ubd.String()) } func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, - time.Unix(0, 0), sdk.NewInt(0), + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewDec(0)) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, - time.Unix(0, 0), sdk.NewInt(0), + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewDec(0)) ok := r1.String() == r2.String() @@ -73,7 +73,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, - time.Unix(0, 0), sdk.NewInt(0), + time.Unix(0, 0), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewDec(10)) require.NotEmpty(t, r.String()) @@ -111,8 +111,8 @@ func TestDelegationResponses(t *testing.T) { func TestRedelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() entries := []types.RedelegationEntryResponse{ - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewInt(100)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), sdk.NewInt(100)), } rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) diff --git a/x/staking/types/genesis.pb.go b/x/staking/types/genesis.pb.go index 51a94e79d85b..c9ae0e266b5d 100644 --- a/x/staking/types/genesis.pb.go +++ b/x/staking/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/x/staking/types/params.go b/x/staking/types/params.go index 46405e3ad308..32e206a17e65 100644 --- a/x/staking/types/params.go +++ b/x/staking/types/params.go @@ -3,6 +3,7 @@ package types import ( "errors" "fmt" + "regexp" "strings" "time" @@ -47,6 +48,10 @@ var ( var _ paramtypes.ParamSet = (*Params)(nil) +// ReBondDemon regex, Bond denominations can be N letters long and support lowercase letters, +//followed by a comma and more letters. +var ReBondDemon = regexp.MustCompile(`(^[a-z]+([,][a-z]+)?)+$`) + // ParamTable for staking module func ParamKeyTable() paramtypes.KeyTable { return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) @@ -197,13 +202,20 @@ func validateBondDenom(i interface{}) error { return errors.New("bond denom cannot be blank") } - if err := sdk.ValidateDenom(v); err != nil { + if err := ValidateBondDenom(v); err != nil { return err } return nil } +func ValidateBondDenom(denom string) error { + if !ReBondDemon.MatchString(denom) { + return fmt.Errorf("invalid denom: %s", denom) + } + return nil +} + func ValidatePowerReduction(i interface{}) error { v, ok := i.(math.Int) if !ok { diff --git a/x/staking/types/params_test.go b/x/staking/types/params_test.go index ead0266759b5..3e68524ad0a8 100644 --- a/x/staking/types/params_test.go +++ b/x/staking/types/params_test.go @@ -36,3 +36,29 @@ func Test_validateParams(t *testing.T) { params.MinCommissionRate = sdk.NewDec(2) require.Error(t, params.Validate()) } + +func TestValidateBondDenom(t *testing.T) { + p1 := types.DefaultParams() + err := types.ValidateBondDenom(p1.BondDenom) + require.Nil(t, err) + + p1.BondDenom = "stake,rio" + err = types.ValidateBondDenom(p1.BondDenom) + require.Nil(t, err) + + p1.BondDenom = "stake,stake," + err = types.ValidateBondDenom(p1.BondDenom) + require.Error(t, err, "invalid denom: stake,stake,") + + p1.BondDenom = "stake,,stake," + err = types.ValidateBondDenom(p1.BondDenom) + require.Error(t, err, "invalid denom: stake,stake,") + + p1.BondDenom = "stake,," + err = types.ValidateBondDenom(p1.BondDenom) + require.Error(t, err, "invalid denom: stake,stake,") + + p1.BondDenom = ",stake" + err = types.ValidateBondDenom(p1.BondDenom) + require.Error(t, err, "invalid denom: stake,stake,") +} diff --git a/x/staking/types/query.pb.go b/x/staking/types/query.pb.go index 2e40de8c6f20..24b43a281dcb 100644 --- a/x/staking/types/query.pb.go +++ b/x/staking/types/query.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 65ce8b308086..4918ab09b3ee 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -11,7 +11,7 @@ import ( types1 "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types2 "github.com/cosmos/cosmos-sdk/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" @@ -336,6 +336,8 @@ type Validator struct { // // Since: cosmos-sdk 0.46 MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation"` + // bond_denom defines the bondable coin denomination. + BondDenom string `protobuf:"bytes,12,opt,name=bond_denom,json=bondDenom,proto3" json:"bond_denom,omitempty"` } func (m *Validator) Reset() { *m = Validator{} } @@ -680,9 +682,9 @@ type UnbondingDelegationEntry struct { // completion_time is the unix time for unbonding completion. CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time"` // initial_balance defines the tokens initially scheduled to receive at completion. - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance"` + InitialBalance github_com_cosmos_cosmos_sdk_types.Coin `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Coin" json:"initial_balance"` // balance defines the tokens to receive at completion. - Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` + Balance github_com_cosmos_cosmos_sdk_types.Coin `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Coin" json:"balance"` } func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } @@ -738,7 +740,7 @@ type RedelegationEntry struct { // completion_time defines the unix time for redelegation completion. CompletionTime time.Time `protobuf:"bytes,2,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time"` // initial_balance defines the initial balance when redelegation started. - InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance"` + InitialBalance github_com_cosmos_cosmos_sdk_types.Coin `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Coin" json:"initial_balance"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` } @@ -1142,112 +1144,114 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1669 bytes of a gzipped FileDescriptorProto + // 1700 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4d, 0x6c, 0x1b, 0xc7, - 0x15, 0xe6, 0x52, 0x0c, 0x45, 0x3d, 0x4a, 0xa2, 0x34, 0x56, 0x52, 0x9a, 0x68, 0x49, 0x96, 0x4d, - 0x13, 0xa7, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x28, 0x50, 0x98, 0x22, 0x53, 0xab, 0x4e, 0x5c, + 0x15, 0xe6, 0x52, 0x34, 0x45, 0x3d, 0x4a, 0xa2, 0x34, 0x56, 0x52, 0x9a, 0x68, 0x49, 0x96, 0x4d, + 0x63, 0xa7, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x28, 0x50, 0x98, 0x22, 0x53, 0xab, 0x4e, 0x5c, 0x86, 0x94, 0x55, 0xf4, 0x07, 0x5d, 0x0c, 0x77, 0x47, 0xd4, 0x54, 0xbb, 0xb3, 0xc4, 0xce, 0xd0, 0x15, 0x81, 0x16, 0x28, 0xd0, 0x4b, 0xea, 0x53, 0x8e, 0xb9, 0x18, 0x30, 0x90, 0x1e, 0x73, 0x0c, - 0x7a, 0xe9, 0xa1, 0xd7, 0x34, 0x27, 0x23, 0xa7, 0xa6, 0x2d, 0xd4, 0xc2, 0xbe, 0x14, 0x3d, 0x15, - 0xb9, 0xb7, 0x28, 0xe6, 0x67, 0x7f, 0x4c, 0x8a, 0x8a, 0x14, 0xa8, 0x40, 0x00, 0x5f, 0xec, 0x9d, - 0x99, 0xf7, 0xbe, 0x79, 0xef, 0x7b, 0x3f, 0x7a, 0x43, 0x78, 0xd1, 0x09, 0xb8, 0x1f, 0xf0, 0x4d, - 0x2e, 0xf0, 0x11, 0x65, 0xc3, 0xcd, 0x7b, 0x37, 0x06, 0x44, 0xe0, 0x1b, 0xd1, 0xba, 0x39, 0x0a, - 0x03, 0x11, 0xa0, 0x17, 0xb4, 0x54, 0x33, 0xda, 0x35, 0x52, 0x95, 0x8d, 0x61, 0x30, 0x0c, 0x94, - 0xc8, 0xa6, 0xfc, 0xd2, 0xd2, 0x95, 0xab, 0xc3, 0x20, 0x18, 0x7a, 0x64, 0x53, 0xad, 0x06, 0xe3, - 0x83, 0x4d, 0xcc, 0x26, 0xe6, 0xa8, 0x3a, 0x7d, 0xe4, 0x8e, 0x43, 0x2c, 0x68, 0xc0, 0xcc, 0x79, - 0x6d, 0xfa, 0x5c, 0x50, 0x9f, 0x70, 0x81, 0xfd, 0x51, 0x84, 0xad, 0x2d, 0xb1, 0xf5, 0xa5, 0xc6, - 0x2c, 0x83, 0x6d, 0x5c, 0x19, 0x60, 0x4e, 0x62, 0x3f, 0x9c, 0x80, 0x46, 0xd8, 0x5f, 0x16, 0x84, - 0xb9, 0x24, 0xf4, 0x29, 0x13, 0x9b, 0x62, 0x32, 0x22, 0x5c, 0xff, 0xab, 0x4f, 0x1b, 0xbf, 0xb5, - 0x60, 0xf5, 0x16, 0xe5, 0x22, 0x08, 0xa9, 0x83, 0xbd, 0x5d, 0x76, 0x10, 0xa0, 0xd7, 0x20, 0x7f, - 0x48, 0xb0, 0x4b, 0xc2, 0xb2, 0x55, 0xb7, 0xae, 0x15, 0xb7, 0xca, 0xcd, 0x04, 0xa1, 0xa9, 0x75, - 0x6f, 0xa9, 0xf3, 0x56, 0xee, 0xc3, 0x93, 0x5a, 0xa6, 0x67, 0xa4, 0xd1, 0x77, 0x21, 0x7f, 0x0f, - 0x7b, 0x9c, 0x88, 0x72, 0xb6, 0xbe, 0x70, 0xad, 0xb8, 0xf5, 0xd5, 0xe6, 0xe9, 0xf4, 0x35, 0xf7, - 0xb1, 0x47, 0x5d, 0x2c, 0x82, 0x18, 0x40, 0xab, 0x35, 0xde, 0xcf, 0x42, 0x69, 0x27, 0xf0, 0x7d, - 0xca, 0x39, 0x0d, 0x58, 0x0f, 0x0b, 0xc2, 0x51, 0x17, 0x72, 0x21, 0x16, 0x44, 0x99, 0xb2, 0xd4, - 0xfa, 0x8e, 0x94, 0xff, 0xcb, 0x49, 0xed, 0xa5, 0x21, 0x15, 0x87, 0xe3, 0x41, 0xd3, 0x09, 0x7c, - 0x43, 0x86, 0xf9, 0xef, 0x3a, 0x77, 0x8f, 0x8c, 0x7f, 0x6d, 0xe2, 0x7c, 0xfc, 0xc1, 0x75, 0x30, - 0x36, 0xb4, 0x89, 0xd3, 0x53, 0x48, 0xe8, 0x87, 0x50, 0xf0, 0xf1, 0xb1, 0xad, 0x50, 0xb3, 0x97, - 0x80, 0xba, 0xe8, 0xe3, 0x63, 0x69, 0x2b, 0x72, 0xa1, 0x24, 0x81, 0x9d, 0x43, 0xcc, 0x86, 0x44, - 0xe3, 0x2f, 0x5c, 0x02, 0xfe, 0x8a, 0x8f, 0x8f, 0x77, 0x14, 0xa6, 0xbc, 0x65, 0xbb, 0xf0, 0xee, - 0xc3, 0x5a, 0xe6, 0x9f, 0x0f, 0x6b, 0x56, 0xe3, 0x0f, 0x16, 0x40, 0x42, 0x17, 0xfa, 0x29, 0xac, - 0x39, 0xf1, 0x4a, 0x5d, 0xcf, 0x4d, 0x00, 0x5f, 0x9e, 0x17, 0x88, 0x29, 0xb2, 0x5b, 0x05, 0x69, - 0xe8, 0xa3, 0x93, 0x9a, 0xd5, 0x2b, 0x39, 0x53, 0x71, 0xe8, 0x40, 0x71, 0x3c, 0x72, 0xb1, 0x20, - 0xb6, 0x4c, 0x4d, 0x45, 0x5c, 0x71, 0xab, 0xd2, 0xd4, 0x79, 0xdb, 0x8c, 0xf2, 0xb6, 0xb9, 0x17, - 0xe5, 0xad, 0xc6, 0x7a, 0xe7, 0xef, 0x35, 0xab, 0x07, 0x5a, 0x51, 0x1e, 0xa5, 0xac, 0x7f, 0xdf, - 0x82, 0x62, 0x9b, 0x70, 0x27, 0xa4, 0x23, 0x59, 0x08, 0xa8, 0x0c, 0x8b, 0x7e, 0xc0, 0xe8, 0x91, - 0x49, 0xbb, 0xa5, 0x5e, 0xb4, 0x44, 0x15, 0x28, 0x50, 0x97, 0x30, 0x41, 0xc5, 0x44, 0x07, 0xac, - 0x17, 0xaf, 0xa5, 0xd6, 0x2f, 0xc8, 0x80, 0xd3, 0x88, 0xeb, 0x5e, 0xb4, 0x44, 0xaf, 0xc0, 0x1a, - 0x27, 0xce, 0x38, 0xa4, 0x62, 0x62, 0x3b, 0x01, 0x13, 0xd8, 0x11, 0xe5, 0x9c, 0x12, 0x29, 0x45, - 0xfb, 0x3b, 0x7a, 0x5b, 0x82, 0xb8, 0x44, 0x60, 0xea, 0xf1, 0xf2, 0x73, 0x1a, 0xc4, 0x2c, 0x53, - 0xe6, 0xfe, 0x29, 0x0f, 0x4b, 0x71, 0xde, 0xa2, 0x1d, 0x58, 0x0b, 0x46, 0x24, 0x94, 0xdf, 0x36, - 0x76, 0xdd, 0x90, 0x70, 0x6e, 0x32, 0xb4, 0xfc, 0xf1, 0x07, 0xd7, 0x37, 0x0c, 0xdd, 0x37, 0xf5, - 0x49, 0x5f, 0x84, 0x94, 0x0d, 0x7b, 0xa5, 0x48, 0xc3, 0x6c, 0xa3, 0x1f, 0xc9, 0x80, 0x31, 0x4e, - 0x18, 0x1f, 0x73, 0x7b, 0x34, 0x1e, 0x1c, 0x91, 0x89, 0xe1, 0x75, 0x63, 0x86, 0xd7, 0x9b, 0x6c, - 0xd2, 0x2a, 0x7f, 0x94, 0x40, 0x3b, 0xe1, 0x64, 0x24, 0x82, 0x66, 0x77, 0x3c, 0xb8, 0x4d, 0x26, - 0x32, 0x5a, 0x06, 0xa7, 0xab, 0x60, 0xd0, 0x0b, 0x90, 0xff, 0x39, 0xa6, 0x1e, 0x71, 0x15, 0x2b, - 0x85, 0x9e, 0x59, 0xa1, 0x6d, 0xc8, 0x73, 0x81, 0xc5, 0x98, 0x2b, 0x2a, 0x56, 0xb7, 0x1a, 0xf3, - 0x32, 0xa3, 0x15, 0x30, 0xb7, 0xaf, 0x24, 0x7b, 0x46, 0x03, 0xed, 0x41, 0x5e, 0x04, 0x47, 0x84, - 0x19, 0x92, 0x2e, 0x94, 0xd5, 0xbb, 0x4c, 0xa4, 0xb2, 0x7a, 0x97, 0x89, 0x9e, 0xc1, 0x42, 0x43, - 0x58, 0x73, 0x89, 0x47, 0x86, 0x8a, 0x4a, 0x7e, 0x88, 0x43, 0xc2, 0xcb, 0xf9, 0x4b, 0xa8, 0x9a, - 0x52, 0x8c, 0xda, 0x57, 0xa0, 0xe8, 0x36, 0x14, 0xdd, 0x24, 0xdd, 0xca, 0x8b, 0x8a, 0xe8, 0xaf, - 0xcd, 0xf3, 0x3f, 0x95, 0x99, 0xa6, 0x49, 0xa5, 0xb5, 0x65, 0x72, 0x8d, 0xd9, 0x20, 0x60, 0x2e, - 0x65, 0x43, 0xfb, 0x90, 0xd0, 0xe1, 0xa1, 0x28, 0x17, 0xea, 0xd6, 0xb5, 0x85, 0x5e, 0x29, 0xde, - 0xbf, 0xa5, 0xb6, 0xd1, 0x6d, 0x58, 0x4d, 0x44, 0x55, 0xed, 0x2c, 0x5d, 0xa0, 0x76, 0x56, 0x62, - 0x5d, 0x79, 0x8a, 0x6e, 0x01, 0x24, 0x85, 0x59, 0x06, 0x05, 0xd4, 0xf8, 0xec, 0xea, 0x36, 0x2e, - 0xa4, 0x74, 0x91, 0x07, 0x57, 0x7c, 0xca, 0x6c, 0x4e, 0xbc, 0x03, 0xdb, 0x50, 0x25, 0x21, 0x8b, - 0x97, 0x10, 0xda, 0x75, 0x9f, 0xb2, 0x3e, 0xf1, 0x0e, 0xda, 0x31, 0xec, 0xf6, 0xf2, 0xdb, 0x0f, - 0x6b, 0x19, 0x53, 0x4b, 0x99, 0x46, 0x17, 0x96, 0xf7, 0xb1, 0x67, 0xca, 0x80, 0x70, 0xf4, 0x1a, - 0x2c, 0xe1, 0x68, 0x51, 0xb6, 0xea, 0x0b, 0x67, 0x96, 0x51, 0x22, 0xaa, 0xab, 0xf3, 0xd7, 0x7f, - 0xab, 0x5b, 0x8d, 0xdf, 0x59, 0x90, 0x6f, 0xef, 0x77, 0x31, 0x0d, 0x51, 0x07, 0xd6, 0x93, 0x84, - 0x3a, 0x6f, 0x6d, 0x26, 0x39, 0x18, 0x15, 0x67, 0x07, 0xd6, 0xef, 0x45, 0xe5, 0x1e, 0xc3, 0x64, - 0x3f, 0x0b, 0x26, 0x56, 0x31, 0xfb, 0x53, 0x8e, 0x77, 0x60, 0x51, 0x5b, 0xc9, 0xd1, 0x36, 0x3c, - 0x37, 0x92, 0x1f, 0xca, 0xdf, 0xe2, 0x56, 0x75, 0x6e, 0x22, 0x2a, 0x79, 0x13, 0x40, 0xad, 0xd2, - 0xf8, 0x8f, 0x05, 0xd0, 0xde, 0xdf, 0xdf, 0x0b, 0xe9, 0xc8, 0x23, 0xe2, 0xb2, 0x3c, 0x7e, 0x03, - 0x9e, 0x4f, 0x3c, 0xe6, 0xa1, 0x73, 0x6e, 0xaf, 0xaf, 0xc4, 0x6a, 0xfd, 0xd0, 0x39, 0x15, 0xcd, - 0xe5, 0x22, 0x46, 0x5b, 0x38, 0x37, 0x5a, 0x9b, 0x8b, 0xd3, 0x69, 0xec, 0x43, 0x31, 0x71, 0x9f, - 0xa3, 0x36, 0x14, 0x84, 0xf9, 0x36, 0x6c, 0x36, 0xe6, 0xb3, 0x19, 0xa9, 0x19, 0x46, 0x63, 0xcd, - 0xc6, 0x7f, 0x25, 0xa9, 0x71, 0xc6, 0x7e, 0xb1, 0xd2, 0x48, 0xf6, 0x5e, 0xd3, 0x1b, 0x2f, 0x63, - 0xa2, 0x30, 0x58, 0x53, 0xac, 0xfe, 0x26, 0x0b, 0x57, 0xee, 0x46, 0xdd, 0xe6, 0x0b, 0xcb, 0x44, - 0x17, 0x16, 0x09, 0x13, 0x21, 0x55, 0x54, 0xc8, 0x58, 0x7f, 0x73, 0x5e, 0xac, 0x4f, 0xf1, 0xa5, - 0xc3, 0x44, 0x38, 0x31, 0x91, 0x8f, 0x60, 0xa6, 0x58, 0xf8, 0x6b, 0x16, 0xca, 0xf3, 0x34, 0xd1, - 0xcb, 0x50, 0x72, 0x42, 0xa2, 0x36, 0xa2, 0xae, 0x6f, 0xa9, 0xae, 0xbf, 0x1a, 0x6d, 0x9b, 0xa6, - 0xff, 0x26, 0xc8, 0x01, 0x4a, 0x26, 0x96, 0x14, 0xbd, 0xf0, 0xc4, 0xb4, 0x9a, 0x28, 0xab, 0xb6, - 0x4f, 0xa0, 0x44, 0x19, 0x15, 0x14, 0x7b, 0xf6, 0x00, 0x7b, 0x98, 0x39, 0x9f, 0x67, 0xb2, 0x9c, - 0x6d, 0xd4, 0xab, 0x06, 0xb4, 0xa5, 0x31, 0xd1, 0x3e, 0x2c, 0x46, 0xf0, 0xb9, 0x4b, 0x80, 0x8f, - 0xc0, 0x52, 0x53, 0xd4, 0x27, 0x59, 0x58, 0xef, 0x11, 0xf7, 0xd9, 0xa2, 0xf5, 0x27, 0x00, 0xba, - 0xe0, 0x64, 0x1f, 0xfc, 0x1c, 0xcc, 0xce, 0x16, 0xf0, 0x92, 0xc6, 0x6b, 0x73, 0x91, 0xe2, 0xf6, - 0xa3, 0x2c, 0x2c, 0xa7, 0xb9, 0x7d, 0x06, 0xfe, 0x2e, 0xa0, 0xdd, 0xa4, 0x1b, 0xe4, 0x54, 0x37, - 0x78, 0x65, 0x5e, 0x37, 0x98, 0xc9, 0xba, 0xb3, 0xdb, 0xc0, 0xa7, 0x59, 0xc8, 0x77, 0x71, 0x88, - 0x7d, 0x8e, 0xbe, 0x3f, 0x33, 0xc0, 0xe9, 0x57, 0xd5, 0xd5, 0x99, 0x9c, 0x6b, 0x9b, 0x47, 0xbd, - 0x4e, 0xb9, 0x77, 0x4f, 0x99, 0xdf, 0xbe, 0x0e, 0xab, 0xf2, 0x89, 0x18, 0xbb, 0xa2, 0x49, 0x5c, - 0x51, 0x6f, 0xbc, 0xf8, 0x75, 0xc1, 0x51, 0x0d, 0x8a, 0x52, 0x2c, 0x69, 0x74, 0x52, 0x06, 0x7c, - 0x7c, 0xdc, 0xd1, 0x3b, 0xe8, 0x3a, 0xa0, 0xc3, 0xf8, 0xd1, 0x6e, 0x27, 0x14, 0x48, 0xb9, 0xf5, - 0xe4, 0x24, 0x12, 0xff, 0x0a, 0x80, 0xb4, 0xc2, 0x76, 0x09, 0x0b, 0x7c, 0xf3, 0xc6, 0x59, 0x92, - 0x3b, 0x6d, 0xb9, 0x81, 0x7e, 0xa9, 0x67, 0xc1, 0xa9, 0xd7, 0xa3, 0x19, 0xc3, 0xdf, 0xb8, 0x58, - 0xa6, 0x7e, 0x7a, 0x52, 0xab, 0x4c, 0xb0, 0xef, 0x6d, 0x37, 0x4e, 0x81, 0x6c, 0xa8, 0xd9, 0xf0, - 0xe9, 0x57, 0x67, 0x2a, 0x83, 0xdf, 0xb3, 0x00, 0x25, 0x2d, 0xb7, 0x47, 0xf8, 0x48, 0x3e, 0x6b, - 0xe4, 0xd0, 0x9b, 0x9a, 0x50, 0xad, 0xb3, 0x87, 0xde, 0x44, 0x3f, 0x1a, 0x7a, 0x53, 0x15, 0xf1, - 0xed, 0xa4, 0xc1, 0x65, 0x4d, 0x0c, 0x0d, 0xcc, 0x00, 0x73, 0x92, 0x1a, 0x9c, 0x69, 0xa4, 0x3d, - 0xd3, 0xc3, 0x32, 0x8d, 0x4f, 0x2c, 0xb8, 0x3a, 0x93, 0x4d, 0xb1, 0xb1, 0x3f, 0x03, 0x14, 0xa6, - 0x0e, 0x55, 0x6c, 0x26, 0xc6, 0xe8, 0x0b, 0x27, 0xe7, 0x7a, 0x38, 0xd3, 0x2b, 0xff, 0x5f, 0x3d, - 0x3a, 0xa7, 0x22, 0xf0, 0x47, 0x0b, 0x36, 0xd2, 0xc6, 0xc4, 0x6e, 0xdd, 0x81, 0xe5, 0xb4, 0x2d, - 0xc6, 0xa1, 0x17, 0xcf, 0xe3, 0x90, 0xf1, 0xe5, 0x29, 0x7d, 0xf4, 0x56, 0x52, 0xb8, 0xfa, 0xc7, - 0xa2, 0x1b, 0xe7, 0xe6, 0x26, 0xb2, 0x69, 0xba, 0x80, 0x73, 0xd1, 0x14, 0x93, 0xeb, 0x06, 0x81, - 0x87, 0x7e, 0x05, 0xeb, 0x2c, 0x10, 0xb6, 0xcc, 0x72, 0xe2, 0xda, 0xe6, 0xe5, 0xaa, 0xbb, 0xdf, - 0x5b, 0x17, 0xa3, 0xec, 0x5f, 0x27, 0xb5, 0x59, 0xa8, 0x29, 0x1e, 0x4b, 0x2c, 0x10, 0x2d, 0x75, - 0xbe, 0xa7, 0xdf, 0xb5, 0x21, 0xac, 0x3c, 0x7d, 0xb5, 0xee, 0x96, 0x6f, 0x5e, 0xf8, 0xea, 0x95, - 0xb3, 0xae, 0x5d, 0x1e, 0xa4, 0xee, 0xdc, 0x2e, 0xc8, 0x18, 0xfe, 0xfb, 0x61, 0xcd, 0xfa, 0xc6, - 0xef, 0x2d, 0x80, 0xe4, 0x09, 0x8f, 0x5e, 0x85, 0x2f, 0xb5, 0x7e, 0x70, 0xa7, 0x6d, 0xf7, 0xf7, - 0x6e, 0xee, 0xdd, 0xed, 0xdb, 0x77, 0xef, 0xf4, 0xbb, 0x9d, 0x9d, 0xdd, 0xd7, 0x77, 0x3b, 0xed, - 0xb5, 0x4c, 0xa5, 0x74, 0xff, 0x41, 0xbd, 0x78, 0x97, 0xf1, 0x11, 0x71, 0xe8, 0x01, 0x25, 0x2e, - 0x7a, 0x09, 0x36, 0x9e, 0x96, 0x96, 0xab, 0x4e, 0x7b, 0xcd, 0xaa, 0x2c, 0xdf, 0x7f, 0x50, 0x2f, - 0xe8, 0xe9, 0x88, 0xb8, 0xe8, 0x1a, 0x3c, 0x3f, 0x2b, 0xb7, 0x7b, 0xe7, 0x7b, 0x6b, 0xd9, 0xca, - 0xca, 0xfd, 0x07, 0xf5, 0xa5, 0x78, 0x8c, 0x42, 0x0d, 0x40, 0x69, 0x49, 0x83, 0xb7, 0x50, 0x81, - 0xfb, 0x0f, 0xea, 0x79, 0x4d, 0x5b, 0x25, 0xf7, 0xf6, 0x7b, 0xd5, 0x4c, 0xeb, 0xf5, 0x0f, 0x1f, - 0x57, 0xad, 0x47, 0x8f, 0xab, 0xd6, 0x3f, 0x1e, 0x57, 0xad, 0x77, 0x9e, 0x54, 0x33, 0x8f, 0x9e, - 0x54, 0x33, 0x7f, 0x7e, 0x52, 0xcd, 0xfc, 0xf8, 0xd5, 0x33, 0x19, 0x3b, 0x8e, 0x7f, 0xc9, 0x55, - 0xdc, 0x0d, 0xf2, 0xaa, 0x29, 0x7f, 0xeb, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x49, 0x0e, 0x8f, - 0x94, 0xe8, 0x15, 0x00, 0x00, + 0x7a, 0xe9, 0xa1, 0xd7, 0x20, 0x27, 0x23, 0xa7, 0xb6, 0x28, 0xd4, 0xc2, 0x3e, 0x34, 0xe8, 0xa9, + 0xc8, 0xa5, 0xa7, 0x16, 0xc1, 0xfc, 0xec, 0x8f, 0x28, 0x51, 0x96, 0x10, 0x1d, 0x02, 0xe4, 0x62, + 0x6b, 0x66, 0xde, 0xfb, 0x66, 0xde, 0x37, 0xdf, 0x7b, 0xfb, 0x86, 0xf0, 0x92, 0x13, 0x70, 0x3f, + 0xe0, 0xeb, 0x5c, 0xe0, 0x03, 0xca, 0x86, 0xeb, 0x0f, 0x6e, 0x0d, 0x88, 0xc0, 0xb7, 0xa2, 0x71, + 0x73, 0x14, 0x06, 0x22, 0x40, 0x2f, 0x6a, 0xab, 0x66, 0x34, 0x6b, 0xac, 0x2a, 0x6b, 0xc3, 0x60, + 0x18, 0x28, 0x93, 0x75, 0xf9, 0x97, 0xb6, 0xae, 0x5c, 0x1b, 0x06, 0xc1, 0xd0, 0x23, 0xeb, 0x6a, + 0x34, 0x18, 0xef, 0xad, 0x63, 0x36, 0x31, 0x4b, 0xd5, 0xe9, 0x25, 0x77, 0x1c, 0x62, 0x41, 0x03, + 0x66, 0xd6, 0x6b, 0xd3, 0xeb, 0x82, 0xfa, 0x84, 0x0b, 0xec, 0x8f, 0x22, 0x6c, 0x7d, 0x12, 0x5b, + 0x6f, 0x6a, 0x8e, 0x65, 0xb0, 0x4d, 0x28, 0x03, 0xcc, 0x49, 0x1c, 0x87, 0x13, 0xd0, 0x08, 0xfb, + 0xab, 0x82, 0x30, 0x97, 0x84, 0x3e, 0x65, 0x62, 0x5d, 0x4c, 0x46, 0x84, 0xeb, 0x7f, 0xf5, 0x6a, + 0xe3, 0xf7, 0x16, 0x2c, 0xdf, 0xa1, 0x5c, 0x04, 0x21, 0x75, 0xb0, 0xb7, 0xcd, 0xf6, 0x02, 0xf4, + 0x1a, 0xe4, 0xf7, 0x09, 0x76, 0x49, 0x58, 0xb6, 0xea, 0xd6, 0x8d, 0xe2, 0x46, 0xb9, 0x99, 0x20, + 0x34, 0xb5, 0xef, 0x1d, 0xb5, 0xde, 0xca, 0x7d, 0x78, 0x54, 0xcb, 0xf4, 0x8c, 0x35, 0xfa, 0x3e, + 0xe4, 0x1f, 0x60, 0x8f, 0x13, 0x51, 0xce, 0xd6, 0xe7, 0x6e, 0x14, 0x37, 0xbe, 0xde, 0x3c, 0x9d, + 0xbe, 0xe6, 0x2e, 0xf6, 0xa8, 0x8b, 0x45, 0x10, 0x03, 0x68, 0xb7, 0xc6, 0xfb, 0x59, 0x28, 0x6d, + 0x05, 0xbe, 0x4f, 0x39, 0xa7, 0x01, 0xeb, 0x61, 0x41, 0x38, 0xea, 0x42, 0x2e, 0xc4, 0x82, 0xa8, + 0xa3, 0x2c, 0xb4, 0xbe, 0x27, 0xed, 0xff, 0x76, 0x54, 0x7b, 0x79, 0x48, 0xc5, 0xfe, 0x78, 0xd0, + 0x74, 0x02, 0xdf, 0x90, 0x61, 0xfe, 0xbb, 0xc9, 0xdd, 0x03, 0x13, 0x5f, 0x9b, 0x38, 0x1f, 0x7f, + 0x70, 0x13, 0xcc, 0x19, 0xda, 0xc4, 0xe9, 0x29, 0x24, 0xf4, 0x63, 0x28, 0xf8, 0xf8, 0xd0, 0x56, + 0xa8, 0xd9, 0x4b, 0x40, 0x9d, 0xf7, 0xf1, 0xa1, 0x3c, 0x2b, 0x72, 0xa1, 0x24, 0x81, 0x9d, 0x7d, + 0xcc, 0x86, 0x44, 0xe3, 0xcf, 0x5d, 0x02, 0xfe, 0x92, 0x8f, 0x0f, 0xb7, 0x14, 0xa6, 0xdc, 0x65, + 0xb3, 0xf0, 0xee, 0xe3, 0x5a, 0xe6, 0x93, 0xc7, 0x35, 0xab, 0xf1, 0x27, 0x0b, 0x20, 0xa1, 0x0b, + 0xfd, 0x1c, 0x56, 0x9c, 0x78, 0xa4, 0xb6, 0xe7, 0xe6, 0x02, 0xaf, 0xcf, 0xba, 0x88, 0x29, 0xb2, + 0x5b, 0x05, 0x79, 0xd0, 0x27, 0x47, 0x35, 0xab, 0x57, 0x72, 0xa6, 0xee, 0xa1, 0x03, 0xc5, 0xf1, + 0xc8, 0xc5, 0x82, 0xd8, 0x52, 0x9a, 0x8a, 0xb8, 0xe2, 0x46, 0xa5, 0xa9, 0x75, 0xdb, 0x8c, 0x74, + 0xdb, 0xdc, 0x89, 0x74, 0xab, 0xb1, 0xde, 0xf9, 0x47, 0xcd, 0xea, 0x81, 0x76, 0x94, 0x4b, 0xa9, + 0xd3, 0xbf, 0x6f, 0x41, 0xb1, 0x4d, 0xb8, 0x13, 0xd2, 0x91, 0x4c, 0x04, 0x54, 0x86, 0x79, 0x3f, + 0x60, 0xf4, 0xc0, 0xc8, 0x6e, 0xa1, 0x17, 0x0d, 0x51, 0x05, 0x0a, 0xd4, 0x25, 0x4c, 0x50, 0x31, + 0xd1, 0x17, 0xd6, 0x8b, 0xc7, 0xd2, 0xeb, 0x57, 0x64, 0xc0, 0x69, 0xc4, 0x75, 0x2f, 0x1a, 0xa2, + 0x57, 0x60, 0x85, 0x13, 0x67, 0x1c, 0x52, 0x31, 0xb1, 0x9d, 0x80, 0x09, 0xec, 0x88, 0x72, 0x4e, + 0x99, 0x94, 0xa2, 0xf9, 0x2d, 0x3d, 0x2d, 0x41, 0x5c, 0x22, 0x30, 0xf5, 0x78, 0xf9, 0x8a, 0x06, + 0x31, 0xc3, 0xd4, 0x71, 0x3f, 0xc9, 0xc3, 0x42, 0xac, 0x5b, 0xb4, 0x05, 0x2b, 0xc1, 0x88, 0x84, + 0xf2, 0x6f, 0x1b, 0xbb, 0x6e, 0x48, 0x38, 0x37, 0x0a, 0x2d, 0x7f, 0xfc, 0xc1, 0xcd, 0x35, 0x43, + 0xf7, 0x6d, 0xbd, 0xd2, 0x17, 0x21, 0x65, 0xc3, 0x5e, 0x29, 0xf2, 0x30, 0xd3, 0xe8, 0x27, 0xf2, + 0xc2, 0x18, 0x27, 0x8c, 0x8f, 0xb9, 0x3d, 0x1a, 0x0f, 0x0e, 0xc8, 0xc4, 0xf0, 0xba, 0x76, 0x82, + 0xd7, 0xdb, 0x6c, 0xd2, 0x2a, 0x7f, 0x94, 0x40, 0x3b, 0xe1, 0x64, 0x24, 0x82, 0x66, 0x77, 0x3c, + 0xb8, 0x4b, 0x26, 0xf2, 0xb6, 0x0c, 0x4e, 0x57, 0xc1, 0xa0, 0x17, 0x21, 0xff, 0x4b, 0x4c, 0x3d, + 0xe2, 0x2a, 0x56, 0x0a, 0x3d, 0x33, 0x42, 0x9b, 0x90, 0xe7, 0x02, 0x8b, 0x31, 0x57, 0x54, 0x2c, + 0x6f, 0x34, 0x66, 0x29, 0xa3, 0x15, 0x30, 0xb7, 0xaf, 0x2c, 0x7b, 0xc6, 0x03, 0xed, 0x40, 0x5e, + 0x04, 0x07, 0x84, 0x19, 0x92, 0x2e, 0xa4, 0xea, 0x6d, 0x26, 0x52, 0xaa, 0xde, 0x66, 0xa2, 0x67, + 0xb0, 0xd0, 0x10, 0x56, 0x5c, 0xe2, 0x91, 0xa1, 0xa2, 0x92, 0xef, 0xe3, 0x90, 0xf0, 0x72, 0xfe, + 0x12, 0xb2, 0xa6, 0x14, 0xa3, 0xf6, 0x15, 0x28, 0xba, 0x0b, 0x45, 0x37, 0x91, 0x5b, 0x79, 0x5e, + 0x11, 0xfd, 0x8d, 0x59, 0xf1, 0xa7, 0x94, 0x69, 0x8a, 0x54, 0xda, 0x5b, 0x8a, 0x6b, 0xcc, 0x06, + 0x01, 0x73, 0x29, 0x1b, 0xda, 0xfb, 0x84, 0x0e, 0xf7, 0x45, 0xb9, 0x50, 0xb7, 0x6e, 0xcc, 0xf5, + 0x4a, 0xf1, 0xfc, 0x1d, 0x35, 0x8d, 0xee, 0xc2, 0x72, 0x62, 0xaa, 0x72, 0x67, 0xe1, 0x02, 0xb9, + 0xb3, 0x14, 0xfb, 0xca, 0x55, 0x74, 0x07, 0x20, 0x49, 0xcc, 0x32, 0x28, 0xa0, 0xc6, 0xf3, 0xb3, + 0xdb, 0x84, 0x90, 0xf2, 0x45, 0x1e, 0x5c, 0xf5, 0x29, 0xb3, 0x39, 0xf1, 0xf6, 0x6c, 0x43, 0x95, + 0x84, 0x2c, 0x5e, 0xc2, 0xd5, 0xae, 0xfa, 0x94, 0xf5, 0x89, 0xb7, 0xd7, 0x8e, 0x61, 0xd1, 0xd7, + 0x00, 0x64, 0x18, 0xb6, 0x4b, 0x58, 0xe0, 0x97, 0x17, 0x55, 0x92, 0x2d, 0xc8, 0x99, 0xb6, 0x9c, + 0xd8, 0x5c, 0x7c, 0xfb, 0x71, 0x2d, 0x63, 0x52, 0x2d, 0xd3, 0xe8, 0xc2, 0xe2, 0x2e, 0xf6, 0x4c, + 0x96, 0x10, 0x8e, 0x5e, 0x83, 0x05, 0x1c, 0x0d, 0xca, 0x56, 0x7d, 0xee, 0xcc, 0x2c, 0x4b, 0x4c, + 0x75, 0xf2, 0xfe, 0xf6, 0xef, 0x75, 0xab, 0xf1, 0x07, 0x0b, 0xf2, 0xed, 0xdd, 0x2e, 0xa6, 0x21, + 0xea, 0xc0, 0x6a, 0xa2, 0xb7, 0xf3, 0xa6, 0x6e, 0x22, 0xd1, 0x28, 0x77, 0x3b, 0xb0, 0xfa, 0x20, + 0xaa, 0x06, 0x31, 0x4c, 0xf6, 0x79, 0x30, 0xb1, 0x8b, 0x99, 0x9f, 0x0a, 0xbc, 0x03, 0xf3, 0xfa, + 0x94, 0x1c, 0x6d, 0xc2, 0x95, 0x91, 0xfc, 0x43, 0xc5, 0x5b, 0xdc, 0xa8, 0xce, 0xd4, 0xa9, 0xb2, + 0x37, 0xf7, 0xab, 0x5d, 0x1a, 0xff, 0xb3, 0x00, 0xda, 0xbb, 0xbb, 0x3b, 0x21, 0x1d, 0x79, 0x44, + 0x5c, 0x56, 0xc4, 0x6f, 0xc0, 0x0b, 0x49, 0xc4, 0x3c, 0x74, 0xce, 0x1d, 0xf5, 0xd5, 0xd8, 0xad, + 0x1f, 0x3a, 0xa7, 0xa2, 0xb9, 0x5c, 0xc4, 0x68, 0x73, 0xe7, 0x46, 0x6b, 0x73, 0x71, 0x3a, 0x8d, + 0x7d, 0x28, 0x26, 0xe1, 0x73, 0xd4, 0x86, 0x82, 0x30, 0x7f, 0x1b, 0x36, 0x1b, 0xb3, 0xd9, 0x8c, + 0xdc, 0x0c, 0xa3, 0xb1, 0x67, 0xe3, 0xff, 0x92, 0xd4, 0x44, 0xd0, 0x5f, 0x28, 0x19, 0xc9, 0xd2, + 0x6c, 0x4a, 0xe7, 0x65, 0x34, 0x1c, 0x06, 0x6b, 0x8a, 0xd5, 0xdf, 0x65, 0xe1, 0xea, 0xfd, 0xa8, + 0x18, 0x7d, 0x61, 0x99, 0xe8, 0xc2, 0x3c, 0x61, 0x22, 0xa4, 0x8a, 0x0a, 0x79, 0xd7, 0xdf, 0x9e, + 0x75, 0xd7, 0xa7, 0xc4, 0xd2, 0x61, 0x22, 0x9c, 0x98, 0x9b, 0x8f, 0x60, 0xa6, 0x58, 0xf8, 0x6f, + 0x16, 0xca, 0xb3, 0x3c, 0xd1, 0x75, 0x28, 0x39, 0x21, 0x51, 0x13, 0xd1, 0x47, 0xc1, 0x52, 0x1f, + 0x85, 0xe5, 0x68, 0xda, 0x7c, 0x13, 0xde, 0x04, 0xd9, 0x5f, 0x49, 0x61, 0x49, 0xd3, 0x0b, 0x37, + 0x54, 0xcb, 0x89, 0xb3, 0xfa, 0x2a, 0x70, 0x28, 0x51, 0x46, 0x05, 0xc5, 0x9e, 0x3d, 0xc0, 0x1e, + 0x66, 0x8e, 0x6e, 0x86, 0x8a, 0x1b, 0xd7, 0xa2, 0xe0, 0xe5, 0xdb, 0x20, 0xf5, 0x5d, 0xa0, 0xac, + 0xb5, 0x6e, 0x24, 0x72, 0xfd, 0x1c, 0x12, 0x91, 0x0e, 0xbd, 0x65, 0xb3, 0x45, 0x4b, 0xef, 0x80, + 0x5c, 0x98, 0x8f, 0x36, 0xcb, 0x5d, 0xfa, 0x66, 0x11, 0x74, 0xaa, 0x01, 0xfb, 0x57, 0x16, 0x56, + 0x7b, 0xc4, 0xfd, 0x32, 0x53, 0xfe, 0x33, 0x00, 0x9d, 0x9a, 0xb2, 0x62, 0xea, 0x66, 0xf6, 0x73, + 0xa6, 0xfa, 0x82, 0xc6, 0x6b, 0x73, 0x91, 0x62, 0xfa, 0xa3, 0x2c, 0x2c, 0xa6, 0x99, 0xfe, 0x12, + 0x7c, 0x41, 0xd0, 0x76, 0x52, 0x37, 0x72, 0xaa, 0x6e, 0xbc, 0x32, 0xab, 0x6e, 0x9c, 0xd0, 0xe0, + 0xd9, 0x05, 0xe3, 0xd3, 0x2c, 0xe4, 0xbb, 0x38, 0xc4, 0x3e, 0x47, 0x3f, 0x3c, 0xd1, 0x09, 0x5a, + 0x46, 0x32, 0xd3, 0x0a, 0x6c, 0x9b, 0x5f, 0x07, 0xb4, 0x00, 0xdf, 0x3d, 0xa5, 0x11, 0xfc, 0x26, + 0x2c, 0xcb, 0xb7, 0x66, 0x1c, 0x8a, 0x26, 0x71, 0x49, 0x3d, 0x16, 0xe3, 0x67, 0x0a, 0x47, 0x35, + 0x28, 0x4a, 0xb3, 0xa4, 0x24, 0x4a, 0x1b, 0xf0, 0xf1, 0x61, 0x47, 0xcf, 0xa0, 0x9b, 0x80, 0xf6, + 0xe3, 0xd7, 0xbf, 0x9d, 0x50, 0x20, 0xed, 0x56, 0x93, 0x95, 0xc8, 0xfc, 0x78, 0x1f, 0x77, 0x65, + 0xaa, 0x8f, 0x43, 0xbf, 0xd6, 0x4d, 0xe5, 0xd4, 0x33, 0xd4, 0xf4, 0xf3, 0x6f, 0x5c, 0x4c, 0xa9, + 0x9f, 0x1e, 0xd5, 0x2a, 0x13, 0xec, 0x7b, 0x9b, 0x8d, 0x53, 0x20, 0x1b, 0xaa, 0xc9, 0x3c, 0xfe, + 0x7c, 0x4d, 0x29, 0xf8, 0x3d, 0x0b, 0x50, 0x52, 0x9c, 0x7b, 0x84, 0x8f, 0xe4, 0xfb, 0x48, 0x76, + 0xcf, 0xa9, 0x56, 0xd7, 0x3a, 0xbb, 0x7b, 0x4e, 0xfc, 0xa3, 0xee, 0x39, 0x95, 0x11, 0xdf, 0x4d, + 0x8a, 0x5f, 0xf6, 0x79, 0x69, 0x6f, 0xe4, 0x31, 0x5d, 0xd1, 0x32, 0x8d, 0xbf, 0x5a, 0x70, 0xed, + 0x84, 0x9a, 0xe2, 0xc3, 0xfe, 0x02, 0x50, 0x98, 0x5a, 0x54, 0x77, 0x33, 0x31, 0x87, 0xbe, 0xb0, + 0x38, 0x57, 0xc3, 0x13, 0x95, 0x73, 0xf7, 0x78, 0xfd, 0xfe, 0xbc, 0x4d, 0x7f, 0x1c, 0x5f, 0x4e, + 0xdd, 0xc0, 0x9f, 0x2d, 0x58, 0x4b, 0x1f, 0x26, 0x0e, 0xeb, 0x1e, 0x2c, 0xa6, 0xcf, 0x62, 0x02, + 0x7a, 0xe9, 0x3c, 0x01, 0x99, 0x58, 0x8e, 0xf9, 0xa3, 0xb7, 0x92, 0xc4, 0xd5, 0xbf, 0x3a, 0xdd, + 0x3a, 0x37, 0x37, 0xd1, 0x99, 0xa6, 0x13, 0x38, 0x17, 0xf5, 0x3b, 0xb9, 0x6e, 0x10, 0x78, 0xe8, + 0x37, 0xb0, 0xca, 0x02, 0x61, 0x4b, 0x95, 0x13, 0xd7, 0x36, 0x4f, 0x60, 0x5d, 0xfd, 0xde, 0xba, + 0x18, 0x65, 0xff, 0x3e, 0xaa, 0x9d, 0x84, 0x9a, 0xe2, 0xb1, 0xc4, 0x02, 0xd1, 0x52, 0xeb, 0x3b, + 0xfa, 0x81, 0x1c, 0xc2, 0xd2, 0xf1, 0xad, 0x75, 0xb5, 0x7c, 0xf3, 0xc2, 0x5b, 0x2f, 0x9d, 0xb5, + 0xed, 0xe2, 0x20, 0xb5, 0xe7, 0x66, 0x41, 0xde, 0xe1, 0x7f, 0x1e, 0xd7, 0xac, 0x6f, 0xfd, 0xd1, + 0x02, 0x48, 0x7e, 0x0b, 0x40, 0xaf, 0xc2, 0x57, 0x5a, 0x3f, 0xba, 0xd7, 0xb6, 0xfb, 0x3b, 0xb7, + 0x77, 0xee, 0xf7, 0xed, 0xfb, 0xf7, 0xfa, 0xdd, 0xce, 0xd6, 0xf6, 0xeb, 0xdb, 0x9d, 0xf6, 0x4a, + 0xa6, 0x52, 0x7a, 0xf8, 0xa8, 0x5e, 0xbc, 0xcf, 0xf8, 0x88, 0x38, 0x74, 0x8f, 0x12, 0x17, 0xbd, + 0x0c, 0x6b, 0xc7, 0xad, 0xe5, 0xa8, 0xd3, 0x5e, 0xb1, 0x2a, 0x8b, 0x0f, 0x1f, 0xd5, 0x0b, 0xba, + 0x8f, 0x22, 0x2e, 0xba, 0x01, 0x2f, 0x9c, 0xb4, 0xdb, 0xbe, 0xf7, 0x83, 0x95, 0x6c, 0x65, 0xe9, + 0xe1, 0xa3, 0xfa, 0x42, 0xdc, 0x70, 0xa1, 0x06, 0xa0, 0xb4, 0xa5, 0xc1, 0x9b, 0xab, 0xc0, 0xc3, + 0x47, 0xf5, 0xbc, 0xa6, 0xad, 0x92, 0x7b, 0xfb, 0xbd, 0x6a, 0xa6, 0xf5, 0xfa, 0x87, 0x4f, 0xab, + 0xd6, 0x93, 0xa7, 0x55, 0xeb, 0x9f, 0x4f, 0xab, 0xd6, 0x3b, 0xcf, 0xaa, 0x99, 0x27, 0xcf, 0xaa, + 0x99, 0xbf, 0x3c, 0xab, 0x66, 0x7e, 0xfa, 0xea, 0x99, 0x8c, 0x1d, 0xc6, 0x3f, 0x09, 0x2b, 0xee, + 0x06, 0x79, 0x55, 0x94, 0xbf, 0xf3, 0x59, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x49, 0x9d, 0x67, + 0x31, 0x16, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1256,478 +1260,479 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 7521 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x6b, 0x90, 0x24, 0xd9, - 0x75, 0x56, 0xd7, 0xa3, 0xab, 0xab, 0x4e, 0x55, 0x57, 0x67, 0xdf, 0xee, 0x99, 0xa9, 0xe9, 0xdd, - 0xed, 0xee, 0xad, 0x7d, 0xcc, 0xec, 0xab, 0x67, 0x77, 0x76, 0x67, 0x66, 0xa7, 0xc6, 0xd2, 0x52, - 0xaf, 0x99, 0xe9, 0x99, 0x7e, 0xd4, 0x66, 0x75, 0xcf, 0x3e, 0x8c, 0xc9, 0xc8, 0xce, 0xba, 0x5d, - 0x9d, 0xdb, 0x59, 0x99, 0xe9, 0xcc, 0xac, 0x99, 0xe9, 0x0d, 0x43, 0xac, 0x42, 0x3c, 0xa4, 0x21, - 0x00, 0x19, 0x13, 0x58, 0x96, 0x35, 0x62, 0xd7, 0x32, 0xc8, 0x08, 0x01, 0xb6, 0x25, 0x04, 0xc6, - 0x01, 0x08, 0x08, 0x40, 0xd6, 0x0f, 0x42, 0xf6, 0x0f, 0x6c, 0x83, 0x59, 0xcc, 0x4a, 0x01, 0x8b, - 0x10, 0x58, 0x88, 0x25, 0x02, 0x42, 0x61, 0x82, 0xb8, 0xaf, 0x7c, 0xd4, 0xa3, 0xab, 0x7a, 0x98, - 0x95, 0x1d, 0xe1, 0x5f, 0x5d, 0x79, 0xee, 0xf9, 0xbe, 0x3c, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, 0xf7, - 0x66, 0x66, 0xc3, 0x3f, 0xbf, 0x04, 0xcb, 0x6d, 0xcb, 0x6a, 0x1b, 0xf8, 0x8c, 0xed, 0x58, 0x9e, - 0xb5, 0xd3, 0xdd, 0x3d, 0xd3, 0xc2, 0xae, 0xe6, 0xe8, 0xb6, 0x67, 0x39, 0x2b, 0x54, 0x86, 0x66, - 0x98, 0xc6, 0x8a, 0xd0, 0x28, 0xae, 0xc3, 0xec, 0x65, 0xdd, 0xc0, 0x35, 0x5f, 0xb1, 0x89, 0x3d, - 0xf4, 0x22, 0x24, 0x77, 0x75, 0x03, 0x17, 0x62, 0xcb, 0x89, 0xd3, 0xd9, 0xb3, 0x8f, 0xae, 0xf4, - 0x80, 0x56, 0xa2, 0x88, 0x06, 0x11, 0xcb, 0x14, 0x51, 0xfc, 0x76, 0x12, 0xe6, 0x06, 0xb4, 0x22, - 0x04, 0x49, 0x53, 0xed, 0x10, 0xc6, 0xd8, 0xe9, 0x8c, 0x4c, 0x7f, 0xa3, 0x02, 0x4c, 0xd9, 0xaa, - 0xb6, 0xaf, 0xb6, 0x71, 0x21, 0x4e, 0xc5, 0xe2, 0x12, 0x2d, 0x02, 0xb4, 0xb0, 0x8d, 0xcd, 0x16, - 0x36, 0xb5, 0x83, 0x42, 0x62, 0x39, 0x71, 0x3a, 0x23, 0x87, 0x24, 0xe8, 0x29, 0x98, 0xb5, 0xbb, - 0x3b, 0x86, 0xae, 0x29, 0x21, 0x35, 0x58, 0x4e, 0x9c, 0x9e, 0x94, 0x25, 0xd6, 0x50, 0x0b, 0x94, - 0x4f, 0xc1, 0xcc, 0x2d, 0xac, 0xee, 0x87, 0x55, 0xb3, 0x54, 0x35, 0x4f, 0xc4, 0x21, 0xc5, 0x2a, - 0xe4, 0x3a, 0xd8, 0x75, 0xd5, 0x36, 0x56, 0xbc, 0x03, 0x1b, 0x17, 0x92, 0xb4, 0xf7, 0xcb, 0x7d, - 0xbd, 0xef, 0xed, 0x79, 0x96, 0xa3, 0xb6, 0x0e, 0x6c, 0x8c, 0xca, 0x90, 0xc1, 0x66, 0xb7, 0xc3, - 0x18, 0x26, 0x87, 0xf8, 0xaf, 0x6e, 0x76, 0x3b, 0xbd, 0x2c, 0x69, 0x02, 0xe3, 0x14, 0x53, 0x2e, - 0x76, 0x6e, 0xea, 0x1a, 0x2e, 0xa4, 0x28, 0xc1, 0xa9, 0x3e, 0x82, 0x26, 0x6b, 0xef, 0xe5, 0x10, - 0x38, 0x54, 0x85, 0x0c, 0xbe, 0xed, 0x61, 0xd3, 0xd5, 0x2d, 0xb3, 0x30, 0x45, 0x49, 0x1e, 0x1b, - 0x30, 0x8a, 0xd8, 0x68, 0xf5, 0x52, 0x04, 0x38, 0x74, 0x1e, 0xa6, 0x2c, 0xdb, 0xd3, 0x2d, 0xd3, - 0x2d, 0xa4, 0x97, 0x63, 0xa7, 0xb3, 0x67, 0x1f, 0x1c, 0x18, 0x08, 0x9b, 0x4c, 0x47, 0x16, 0xca, - 0x68, 0x15, 0x24, 0xd7, 0xea, 0x3a, 0x1a, 0x56, 0x34, 0xab, 0x85, 0x15, 0xdd, 0xdc, 0xb5, 0x0a, - 0x19, 0x4a, 0xb0, 0xd4, 0xdf, 0x11, 0xaa, 0x58, 0xb5, 0x5a, 0x78, 0xd5, 0xdc, 0xb5, 0xe4, 0xbc, - 0x1b, 0xb9, 0x46, 0xc7, 0x21, 0xe5, 0x1e, 0x98, 0x9e, 0x7a, 0xbb, 0x90, 0xa3, 0x11, 0xc2, 0xaf, - 0x8a, 0xbf, 0x92, 0x82, 0x99, 0x71, 0x42, 0xec, 0x12, 0x4c, 0xee, 0x92, 0x5e, 0x16, 0xe2, 0x47, - 0xf1, 0x01, 0xc3, 0x44, 0x9d, 0x98, 0xba, 0x47, 0x27, 0x96, 0x21, 0x6b, 0x62, 0xd7, 0xc3, 0x2d, - 0x16, 0x11, 0x89, 0x31, 0x63, 0x0a, 0x18, 0xa8, 0x3f, 0xa4, 0x92, 0xf7, 0x14, 0x52, 0xaf, 0xc2, - 0x8c, 0x6f, 0x92, 0xe2, 0xa8, 0x66, 0x5b, 0xc4, 0xe6, 0x99, 0x51, 0x96, 0xac, 0xd4, 0x05, 0x4e, - 0x26, 0x30, 0x39, 0x8f, 0x23, 0xd7, 0xa8, 0x06, 0x60, 0x99, 0xd8, 0xda, 0x55, 0x5a, 0x58, 0x33, - 0x0a, 0xe9, 0x21, 0x5e, 0xda, 0x24, 0x2a, 0x7d, 0x5e, 0xb2, 0x98, 0x54, 0x33, 0xd0, 0xc5, 0x20, - 0xd4, 0xa6, 0x86, 0x44, 0xca, 0x3a, 0x9b, 0x64, 0x7d, 0xd1, 0xb6, 0x0d, 0x79, 0x07, 0x93, 0xb8, - 0xc7, 0x2d, 0xde, 0xb3, 0x0c, 0x35, 0x62, 0x65, 0x64, 0xcf, 0x64, 0x0e, 0x63, 0x1d, 0x9b, 0x76, - 0xc2, 0x97, 0xe8, 0x11, 0xf0, 0x05, 0x0a, 0x0d, 0x2b, 0xa0, 0x59, 0x28, 0x27, 0x84, 0x1b, 0x6a, - 0x07, 0x2f, 0xbc, 0x09, 0xf9, 0xa8, 0x7b, 0xd0, 0x3c, 0x4c, 0xba, 0x9e, 0xea, 0x78, 0x34, 0x0a, - 0x27, 0x65, 0x76, 0x81, 0x24, 0x48, 0x60, 0xb3, 0x45, 0xb3, 0xdc, 0xa4, 0x4c, 0x7e, 0xa2, 0x3f, - 0x16, 0x74, 0x38, 0x41, 0x3b, 0xfc, 0x78, 0xff, 0x88, 0x46, 0x98, 0x7b, 0xfb, 0xbd, 0x70, 0x01, - 0xa6, 0x23, 0x1d, 0x18, 0xf7, 0xd6, 0xc5, 0x9f, 0x80, 0x63, 0x03, 0xa9, 0xd1, 0xab, 0x30, 0xdf, - 0x35, 0x75, 0xd3, 0xc3, 0x8e, 0xed, 0x60, 0x12, 0xb1, 0xec, 0x56, 0x85, 0xff, 0x3c, 0x35, 0x24, - 0xe6, 0xb6, 0xc3, 0xda, 0x8c, 0x45, 0x9e, 0xeb, 0xf6, 0x0b, 0x9f, 0xcc, 0xa4, 0xdf, 0x9f, 0x92, - 0xde, 0x7a, 0xeb, 0xad, 0xb7, 0xe2, 0xc5, 0x7f, 0x9a, 0x82, 0xf9, 0x41, 0x73, 0x66, 0xe0, 0xf4, - 0x3d, 0x0e, 0x29, 0xb3, 0xdb, 0xd9, 0xc1, 0x0e, 0x75, 0xd2, 0xa4, 0xcc, 0xaf, 0x50, 0x19, 0x26, - 0x0d, 0x75, 0x07, 0x1b, 0x85, 0xe4, 0x72, 0xec, 0x74, 0xfe, 0xec, 0x53, 0x63, 0xcd, 0xca, 0x95, - 0x35, 0x02, 0x91, 0x19, 0x12, 0x7d, 0x14, 0x92, 0x3c, 0x45, 0x13, 0x86, 0x27, 0xc7, 0x63, 0x20, - 0x73, 0x49, 0xa6, 0x38, 0xf4, 0x00, 0x64, 0xc8, 0x5f, 0x16, 0x1b, 0x29, 0x6a, 0x73, 0x9a, 0x08, - 0x48, 0x5c, 0xa0, 0x05, 0x48, 0xd3, 0x69, 0xd2, 0xc2, 0x62, 0x69, 0xf3, 0xaf, 0x49, 0x60, 0xb5, - 0xf0, 0xae, 0xda, 0x35, 0x3c, 0xe5, 0xa6, 0x6a, 0x74, 0x31, 0x0d, 0xf8, 0x8c, 0x9c, 0xe3, 0xc2, - 0x1b, 0x44, 0x86, 0x96, 0x20, 0xcb, 0x66, 0x95, 0x6e, 0xb6, 0xf0, 0x6d, 0x9a, 0x3d, 0x27, 0x65, - 0x36, 0xd1, 0x56, 0x89, 0x84, 0xdc, 0xfe, 0x0d, 0xd7, 0x32, 0x45, 0x68, 0xd2, 0x5b, 0x10, 0x01, - 0xbd, 0xfd, 0x85, 0xde, 0xc4, 0xfd, 0xd0, 0xe0, 0xee, 0xf5, 0xcd, 0xa5, 0x53, 0x30, 0x43, 0x35, - 0x9e, 0xe7, 0x43, 0xaf, 0x1a, 0x85, 0xd9, 0xe5, 0xd8, 0xe9, 0xb4, 0x9c, 0x67, 0xe2, 0x4d, 0x2e, - 0x2d, 0x7e, 0x35, 0x0e, 0x49, 0x9a, 0x58, 0x66, 0x20, 0xbb, 0xf5, 0x5a, 0xa3, 0xae, 0xd4, 0x36, - 0xb7, 0x2b, 0x6b, 0x75, 0x29, 0x86, 0xf2, 0x00, 0x54, 0x70, 0x79, 0x6d, 0xb3, 0xbc, 0x25, 0xc5, - 0xfd, 0xeb, 0xd5, 0x8d, 0xad, 0xf3, 0x2f, 0x48, 0x09, 0x1f, 0xb0, 0xcd, 0x04, 0xc9, 0xb0, 0xc2, - 0xf3, 0x67, 0xa5, 0x49, 0x24, 0x41, 0x8e, 0x11, 0xac, 0xbe, 0x5a, 0xaf, 0x9d, 0x7f, 0x41, 0x4a, - 0x45, 0x25, 0xcf, 0x9f, 0x95, 0xa6, 0xd0, 0x34, 0x64, 0xa8, 0xa4, 0xb2, 0xb9, 0xb9, 0x26, 0xa5, - 0x7d, 0xce, 0xe6, 0x96, 0xbc, 0xba, 0x71, 0x45, 0xca, 0xf8, 0x9c, 0x57, 0xe4, 0xcd, 0xed, 0x86, - 0x04, 0x3e, 0xc3, 0x7a, 0xbd, 0xd9, 0x2c, 0x5f, 0xa9, 0x4b, 0x59, 0x5f, 0xa3, 0xf2, 0xda, 0x56, - 0xbd, 0x29, 0xe5, 0x22, 0x66, 0x3d, 0x7f, 0x56, 0x9a, 0xf6, 0x6f, 0x51, 0xdf, 0xd8, 0x5e, 0x97, - 0xf2, 0x68, 0x16, 0xa6, 0xd9, 0x2d, 0x84, 0x11, 0x33, 0x3d, 0xa2, 0xf3, 0x2f, 0x48, 0x52, 0x60, - 0x08, 0x63, 0x99, 0x8d, 0x08, 0xce, 0xbf, 0x20, 0xa1, 0x62, 0x15, 0x26, 0x69, 0x18, 0x22, 0x04, - 0xf9, 0xb5, 0x72, 0xa5, 0xbe, 0xa6, 0x6c, 0x36, 0xb6, 0x56, 0x37, 0x37, 0xca, 0x6b, 0x52, 0x2c, - 0x90, 0xc9, 0xf5, 0x97, 0xb7, 0x57, 0xe5, 0x7a, 0x4d, 0x8a, 0x87, 0x65, 0x8d, 0x7a, 0x79, 0xab, - 0x5e, 0x93, 0x12, 0x45, 0x0d, 0xe6, 0x07, 0x25, 0xd4, 0x81, 0x53, 0x28, 0x14, 0x0b, 0xf1, 0x21, - 0xb1, 0x40, 0xb9, 0x7a, 0x63, 0xa1, 0xf8, 0xad, 0x38, 0xcc, 0x0d, 0x58, 0x54, 0x06, 0xde, 0xe4, - 0x25, 0x98, 0x64, 0xb1, 0xcc, 0x96, 0xd9, 0x27, 0x06, 0xae, 0x4e, 0x34, 0xb2, 0xfb, 0x96, 0x5a, - 0x8a, 0x0b, 0x97, 0x1a, 0x89, 0x21, 0xa5, 0x06, 0xa1, 0xe8, 0x0b, 0xd8, 0x1f, 0xeb, 0x4b, 0xfe, - 0x6c, 0x7d, 0x3c, 0x3f, 0xce, 0xfa, 0x48, 0x65, 0x47, 0x5b, 0x04, 0x26, 0x07, 0x2c, 0x02, 0x97, - 0x60, 0xb6, 0x8f, 0x68, 0xec, 0x64, 0xfc, 0xf1, 0x18, 0x14, 0x86, 0x39, 0x67, 0x44, 0x4a, 0x8c, - 0x47, 0x52, 0xe2, 0xa5, 0x5e, 0x0f, 0x3e, 0x3c, 0x7c, 0x10, 0xfa, 0xc6, 0xfa, 0x0b, 0x31, 0x38, - 0x3e, 0xb8, 0xa4, 0x1c, 0x68, 0xc3, 0x47, 0x21, 0xd5, 0xc1, 0xde, 0x9e, 0x25, 0xca, 0xaa, 0xc7, - 0x07, 0x2c, 0xd6, 0xa4, 0xb9, 0x77, 0xb0, 0x39, 0x2a, 0xbc, 0xda, 0x27, 0x86, 0xd5, 0x85, 0xcc, - 0x9a, 0x3e, 0x4b, 0x3f, 0x19, 0x87, 0x63, 0x03, 0xc9, 0x07, 0x1a, 0xfa, 0x10, 0x80, 0x6e, 0xda, - 0x5d, 0x8f, 0x95, 0x4e, 0x2c, 0x13, 0x67, 0xa8, 0x84, 0x26, 0x2f, 0x92, 0x65, 0xbb, 0x9e, 0xdf, - 0x9e, 0xa0, 0xed, 0xc0, 0x44, 0x54, 0xe1, 0xc5, 0xc0, 0xd0, 0x24, 0x35, 0x74, 0x71, 0x48, 0x4f, - 0xfb, 0x02, 0xf3, 0x59, 0x90, 0x34, 0x43, 0xc7, 0xa6, 0xa7, 0xb8, 0x9e, 0x83, 0xd5, 0x8e, 0x6e, - 0xb6, 0xe9, 0x52, 0x93, 0x2e, 0x4d, 0xee, 0xaa, 0x86, 0x8b, 0xe5, 0x19, 0xd6, 0xdc, 0x14, 0xad, - 0x04, 0x41, 0x03, 0xc8, 0x09, 0x21, 0x52, 0x11, 0x04, 0x6b, 0xf6, 0x11, 0xc5, 0x9f, 0xcc, 0x40, - 0x36, 0x54, 0x80, 0xa3, 0x87, 0x21, 0xf7, 0x86, 0x7a, 0x53, 0x55, 0xc4, 0xa6, 0x8a, 0x79, 0x22, - 0x4b, 0x64, 0x0d, 0xbe, 0xb1, 0x7a, 0x16, 0xe6, 0xa9, 0x8a, 0xd5, 0xf5, 0xb0, 0xa3, 0x68, 0x86, - 0xea, 0xba, 0xd4, 0x69, 0x69, 0xaa, 0x8a, 0x48, 0xdb, 0x26, 0x69, 0xaa, 0x8a, 0x16, 0x74, 0x0e, - 0xe6, 0x28, 0xa2, 0xd3, 0x35, 0x3c, 0xdd, 0x36, 0xb0, 0x42, 0xb6, 0x79, 0x2e, 0x5d, 0x72, 0x7c, - 0xcb, 0x66, 0x89, 0xc6, 0x3a, 0x57, 0x20, 0x16, 0xb9, 0xa8, 0x06, 0x0f, 0x51, 0x58, 0x1b, 0x9b, - 0xd8, 0x51, 0x3d, 0xac, 0xe0, 0x1f, 0xef, 0xaa, 0x86, 0xab, 0xa8, 0x66, 0x4b, 0xd9, 0x53, 0xdd, - 0xbd, 0xc2, 0x3c, 0x21, 0xa8, 0xc4, 0x0b, 0x31, 0xf9, 0x24, 0x51, 0xbc, 0xc2, 0xf5, 0xea, 0x54, - 0xad, 0x6c, 0xb6, 0xae, 0xaa, 0xee, 0x1e, 0x2a, 0xc1, 0x71, 0xca, 0xe2, 0x7a, 0x8e, 0x6e, 0xb6, - 0x15, 0x6d, 0x0f, 0x6b, 0xfb, 0x4a, 0xd7, 0xdb, 0x7d, 0xb1, 0xf0, 0x40, 0xf8, 0xfe, 0xd4, 0xc2, - 0x26, 0xd5, 0xa9, 0x12, 0x95, 0x6d, 0x6f, 0xf7, 0x45, 0xd4, 0x84, 0x1c, 0x19, 0x8c, 0x8e, 0xfe, - 0x26, 0x56, 0x76, 0x2d, 0x87, 0xae, 0xa1, 0xf9, 0x01, 0xa9, 0x29, 0xe4, 0xc1, 0x95, 0x4d, 0x0e, - 0x58, 0xb7, 0x5a, 0xb8, 0x34, 0xd9, 0x6c, 0xd4, 0xeb, 0x35, 0x39, 0x2b, 0x58, 0x2e, 0x5b, 0x0e, - 0x09, 0xa8, 0xb6, 0xe5, 0x3b, 0x38, 0xcb, 0x02, 0xaa, 0x6d, 0x09, 0xf7, 0x9e, 0x83, 0x39, 0x4d, - 0x63, 0x7d, 0xd6, 0x35, 0x85, 0x6f, 0xc6, 0xdc, 0x82, 0x14, 0x71, 0x96, 0xa6, 0x5d, 0x61, 0x0a, - 0x3c, 0xc6, 0x5d, 0x74, 0x11, 0x8e, 0x05, 0xce, 0x0a, 0x03, 0x67, 0xfb, 0x7a, 0xd9, 0x0b, 0x3d, - 0x07, 0x73, 0xf6, 0x41, 0x3f, 0x10, 0x45, 0xee, 0x68, 0x1f, 0xf4, 0xc2, 0x2e, 0xc0, 0xbc, 0xbd, - 0x67, 0xf7, 0xe3, 0x9e, 0x0c, 0xe3, 0x90, 0xbd, 0x67, 0xf7, 0x02, 0x1f, 0xa3, 0x3b, 0x73, 0x07, - 0x6b, 0xaa, 0x87, 0x5b, 0x85, 0x13, 0x61, 0xf5, 0x50, 0x03, 0x5a, 0x01, 0x49, 0xd3, 0x14, 0x6c, - 0xaa, 0x3b, 0x06, 0x56, 0x54, 0x07, 0x9b, 0xaa, 0x5b, 0x58, 0xa2, 0xca, 0x49, 0xcf, 0xe9, 0x62, - 0x39, 0xaf, 0x69, 0x75, 0xda, 0x58, 0xa6, 0x6d, 0xe8, 0x49, 0x98, 0xb5, 0x76, 0xde, 0xd0, 0x58, - 0x44, 0x2a, 0xb6, 0x83, 0x77, 0xf5, 0xdb, 0x85, 0x47, 0xa9, 0x7b, 0x67, 0x48, 0x03, 0x8d, 0xc7, - 0x06, 0x15, 0xa3, 0x27, 0x40, 0xd2, 0xdc, 0x3d, 0xd5, 0xb1, 0x69, 0x4a, 0x76, 0x6d, 0x55, 0xc3, - 0x85, 0xc7, 0x98, 0x2a, 0x93, 0x6f, 0x08, 0x31, 0x99, 0x11, 0xee, 0x2d, 0x7d, 0xd7, 0x13, 0x8c, - 0xa7, 0xd8, 0x8c, 0xa0, 0x32, 0xce, 0x76, 0x1a, 0x24, 0xe2, 0x89, 0xc8, 0x8d, 0x4f, 0x53, 0xb5, - 0xbc, 0xbd, 0x67, 0x87, 0xef, 0xfb, 0x08, 0x4c, 0x13, 0xcd, 0xe0, 0xa6, 0x4f, 0xb0, 0xc2, 0xcd, - 0xde, 0x0b, 0xdd, 0xf1, 0x05, 0x38, 0x4e, 0x94, 0x3a, 0xd8, 0x53, 0x5b, 0xaa, 0xa7, 0x86, 0xb4, - 0x9f, 0xa6, 0xda, 0xc4, 0xed, 0xeb, 0xbc, 0x31, 0x62, 0xa7, 0xd3, 0xdd, 0x39, 0xf0, 0x03, 0xeb, - 0x19, 0x66, 0x27, 0x91, 0x89, 0xd0, 0xfa, 0xd0, 0x8a, 0xf3, 0x62, 0x09, 0x72, 0xe1, 0xb8, 0x47, - 0x19, 0x60, 0x91, 0x2f, 0xc5, 0x48, 0x11, 0x54, 0xdd, 0xac, 0x91, 0xf2, 0xe5, 0xf5, 0xba, 0x14, - 0x27, 0x65, 0xd4, 0xda, 0xea, 0x56, 0x5d, 0x91, 0xb7, 0x37, 0xb6, 0x56, 0xd7, 0xeb, 0x52, 0x22, - 0x54, 0xd8, 0x5f, 0x4b, 0xa6, 0x1f, 0x97, 0x4e, 0x91, 0xaa, 0x21, 0x1f, 0xdd, 0xa9, 0xa1, 0x1f, - 0x81, 0x13, 0xe2, 0x58, 0xc5, 0xc5, 0x9e, 0x72, 0x4b, 0x77, 0xe8, 0x84, 0xec, 0xa8, 0x6c, 0x71, - 0xf4, 0xe3, 0x67, 0x9e, 0x6b, 0x35, 0xb1, 0xf7, 0x8a, 0xee, 0x90, 0xe9, 0xd6, 0x51, 0x3d, 0xb4, - 0x06, 0x4b, 0xa6, 0xa5, 0xb8, 0x9e, 0x6a, 0xb6, 0x54, 0xa7, 0xa5, 0x04, 0x07, 0x5a, 0x8a, 0xaa, - 0x69, 0xd8, 0x75, 0x2d, 0xb6, 0x10, 0xfa, 0x2c, 0x0f, 0x9a, 0x56, 0x93, 0x2b, 0x07, 0x2b, 0x44, - 0x99, 0xab, 0xf6, 0x84, 0x6f, 0x62, 0x58, 0xf8, 0x3e, 0x00, 0x99, 0x8e, 0x6a, 0x2b, 0xd8, 0xf4, - 0x9c, 0x03, 0x5a, 0x9f, 0xa7, 0xe5, 0x74, 0x47, 0xb5, 0xeb, 0xe4, 0xfa, 0x87, 0xb2, 0x4d, 0xba, - 0x96, 0x4c, 0x27, 0xa5, 0xc9, 0x6b, 0xc9, 0xf4, 0xa4, 0x94, 0xba, 0x96, 0x4c, 0xa7, 0xa4, 0xa9, - 0x6b, 0xc9, 0x74, 0x5a, 0xca, 0x5c, 0x4b, 0xa6, 0x33, 0x12, 0x14, 0xdf, 0x4b, 0x40, 0x2e, 0x5c, - 0xc1, 0x93, 0x0d, 0x91, 0x46, 0xd7, 0xb0, 0x18, 0xcd, 0x72, 0x8f, 0x1c, 0x5a, 0xef, 0xaf, 0x54, - 0xc9, 0xe2, 0x56, 0x4a, 0xb1, 0x72, 0x59, 0x66, 0x48, 0x52, 0x58, 0x90, 0xf0, 0xc3, 0xac, 0x3c, - 0x49, 0xcb, 0xfc, 0x0a, 0x5d, 0x81, 0xd4, 0x1b, 0x2e, 0xe5, 0x4e, 0x51, 0xee, 0x47, 0x0f, 0xe7, - 0xbe, 0xd6, 0xa4, 0xe4, 0x99, 0x6b, 0x4d, 0x65, 0x63, 0x53, 0x5e, 0x2f, 0xaf, 0xc9, 0x1c, 0x8e, - 0x4e, 0x42, 0xd2, 0x50, 0xdf, 0x3c, 0x88, 0x2e, 0x83, 0x54, 0x34, 0xee, 0xb0, 0x9c, 0x84, 0xe4, - 0x2d, 0xac, 0xee, 0x47, 0x17, 0x1f, 0x2a, 0xfa, 0x10, 0xa7, 0xc7, 0x19, 0x98, 0xa4, 0xfe, 0x42, - 0x00, 0xdc, 0x63, 0xd2, 0x04, 0x4a, 0x43, 0xb2, 0xba, 0x29, 0x93, 0x29, 0x22, 0x41, 0x8e, 0x49, - 0x95, 0xc6, 0x6a, 0xbd, 0x5a, 0x97, 0xe2, 0xc5, 0x73, 0x90, 0x62, 0x4e, 0x20, 0xd3, 0xc7, 0x77, - 0x83, 0x34, 0xc1, 0x2f, 0x39, 0x47, 0x4c, 0xb4, 0x6e, 0xaf, 0x57, 0xea, 0xb2, 0x14, 0xef, 0x1b, - 0xfc, 0xa2, 0x0b, 0xb9, 0x70, 0x65, 0xfe, 0xc3, 0xd9, 0x9e, 0x7f, 0x2d, 0x06, 0xd9, 0x50, 0xa5, - 0x4d, 0x4a, 0x24, 0xd5, 0x30, 0xac, 0x5b, 0x8a, 0x6a, 0xe8, 0xaa, 0xcb, 0x43, 0x03, 0xa8, 0xa8, - 0x4c, 0x24, 0xe3, 0x0e, 0xdd, 0x0f, 0x69, 0xd2, 0x4c, 0x4a, 0xa9, 0xe2, 0xe7, 0x62, 0x20, 0xf5, - 0x96, 0xba, 0x3d, 0x66, 0xc6, 0xfe, 0x20, 0xcd, 0x2c, 0x7e, 0x36, 0x06, 0xf9, 0x68, 0x7d, 0xdb, - 0x63, 0xde, 0xc3, 0x7f, 0xa0, 0xe6, 0xfd, 0x6e, 0x1c, 0xa6, 0x23, 0x55, 0xed, 0xb8, 0xd6, 0xfd, - 0x38, 0xcc, 0xea, 0x2d, 0xdc, 0xb1, 0x2d, 0x0f, 0x9b, 0xda, 0x81, 0x62, 0xe0, 0x9b, 0xd8, 0x28, - 0x14, 0x69, 0xd2, 0x38, 0x73, 0x78, 0xdd, 0xbc, 0xb2, 0x1a, 0xe0, 0xd6, 0x08, 0xac, 0x34, 0xb7, - 0x5a, 0xab, 0xaf, 0x37, 0x36, 0xb7, 0xea, 0x1b, 0xd5, 0xd7, 0x94, 0xed, 0x8d, 0xeb, 0x1b, 0x9b, - 0xaf, 0x6c, 0xc8, 0x92, 0xde, 0xa3, 0xf6, 0x21, 0x4e, 0xfb, 0x06, 0x48, 0xbd, 0x46, 0xa1, 0x13, - 0x30, 0xc8, 0x2c, 0x69, 0x02, 0xcd, 0xc1, 0xcc, 0xc6, 0xa6, 0xd2, 0x5c, 0xad, 0xd5, 0x95, 0xfa, - 0xe5, 0xcb, 0xf5, 0xea, 0x56, 0x93, 0x9d, 0x84, 0xf8, 0xda, 0x5b, 0x91, 0x09, 0x5e, 0xfc, 0x4c, - 0x02, 0xe6, 0x06, 0x58, 0x82, 0xca, 0x7c, 0x0f, 0xc3, 0xb6, 0x55, 0xcf, 0x8c, 0x63, 0xfd, 0x0a, - 0xa9, 0x22, 0x1a, 0xaa, 0xe3, 0xf1, 0x2d, 0xcf, 0x13, 0x40, 0xbc, 0x64, 0x7a, 0xfa, 0xae, 0x8e, - 0x1d, 0x7e, 0xc2, 0xc4, 0x36, 0x36, 0x33, 0x81, 0x9c, 0x1d, 0x32, 0x3d, 0x0d, 0xc8, 0xb6, 0x5c, - 0xdd, 0xd3, 0x6f, 0x62, 0x45, 0x37, 0xc5, 0x71, 0x14, 0xd9, 0xe8, 0x24, 0x65, 0x49, 0xb4, 0xac, - 0x9a, 0x9e, 0xaf, 0x6d, 0xe2, 0xb6, 0xda, 0xa3, 0x4d, 0x92, 0x79, 0x42, 0x96, 0x44, 0x8b, 0xaf, - 0xfd, 0x30, 0xe4, 0x5a, 0x56, 0x97, 0x54, 0x7f, 0x4c, 0x8f, 0xac, 0x1d, 0x31, 0x39, 0xcb, 0x64, - 0xbe, 0x0a, 0xaf, 0xeb, 0x83, 0x73, 0xb0, 0x9c, 0x9c, 0x65, 0x32, 0xa6, 0x72, 0x0a, 0x66, 0xd4, - 0x76, 0xdb, 0x21, 0xe4, 0x82, 0x88, 0xed, 0x54, 0xf2, 0xbe, 0x98, 0x2a, 0x2e, 0x5c, 0x83, 0xb4, - 0xf0, 0x03, 0x59, 0xbc, 0x89, 0x27, 0x14, 0x9b, 0x6d, 0xbf, 0xe3, 0xa7, 0x33, 0x72, 0xda, 0x14, - 0x8d, 0x0f, 0x43, 0x4e, 0x77, 0x95, 0xe0, 0x58, 0x3f, 0xbe, 0x1c, 0x3f, 0x9d, 0x96, 0xb3, 0xba, - 0xeb, 0x1f, 0x89, 0x16, 0xbf, 0x10, 0x87, 0x7c, 0xf4, 0xb1, 0x04, 0xaa, 0x41, 0xda, 0xb0, 0x34, - 0x95, 0x86, 0x16, 0x7b, 0x26, 0x76, 0x7a, 0xc4, 0x93, 0x8c, 0x95, 0x35, 0xae, 0x2f, 0xfb, 0xc8, - 0x85, 0x7f, 0x1d, 0x83, 0xb4, 0x10, 0xa3, 0xe3, 0x90, 0xb4, 0x55, 0x6f, 0x8f, 0xd2, 0x4d, 0x56, - 0xe2, 0x52, 0x4c, 0xa6, 0xd7, 0x44, 0xee, 0xda, 0xaa, 0x49, 0x43, 0x80, 0xcb, 0xc9, 0x35, 0x19, - 0x57, 0x03, 0xab, 0x2d, 0xba, 0x0d, 0xb2, 0x3a, 0x1d, 0x6c, 0x7a, 0xae, 0x18, 0x57, 0x2e, 0xaf, - 0x72, 0x31, 0x7a, 0x0a, 0x66, 0x3d, 0x47, 0xd5, 0x8d, 0x88, 0x6e, 0x92, 0xea, 0x4a, 0xa2, 0xc1, - 0x57, 0x2e, 0xc1, 0x49, 0xc1, 0xdb, 0xc2, 0x9e, 0xaa, 0xed, 0xe1, 0x56, 0x00, 0x4a, 0xd1, 0xe3, - 0x8e, 0x13, 0x5c, 0xa1, 0xc6, 0xdb, 0x05, 0xb6, 0xf8, 0xeb, 0x31, 0x98, 0x15, 0x1b, 0xb7, 0x96, - 0xef, 0xac, 0x75, 0x00, 0xd5, 0x34, 0x2d, 0x2f, 0xec, 0xae, 0xfe, 0x50, 0xee, 0xc3, 0xad, 0x94, - 0x7d, 0x90, 0x1c, 0x22, 0x58, 0xe8, 0x00, 0x04, 0x2d, 0x43, 0xdd, 0xb6, 0x04, 0x59, 0xfe, 0xcc, - 0x89, 0x3e, 0xb8, 0x64, 0x5b, 0x7d, 0x60, 0x22, 0xb2, 0xc3, 0x43, 0xf3, 0x30, 0xb9, 0x83, 0xdb, - 0xba, 0xc9, 0x4f, 0x92, 0xd9, 0x85, 0x38, 0x90, 0x49, 0xfa, 0x07, 0x32, 0x95, 0x3f, 0x05, 0x73, - 0x9a, 0xd5, 0xe9, 0x35, 0xb7, 0x22, 0xf5, 0x1c, 0x37, 0xb8, 0x57, 0x63, 0xaf, 0x3f, 0xc3, 0x95, - 0xda, 0x96, 0xa1, 0x9a, 0xed, 0x15, 0xcb, 0x69, 0x07, 0x0f, 0x5e, 0x49, 0xc5, 0xe3, 0x86, 0x1e, - 0xbf, 0xda, 0x3b, 0xff, 0x3b, 0x16, 0xfb, 0xb9, 0x78, 0xe2, 0x4a, 0xa3, 0xf2, 0xc5, 0xf8, 0xc2, - 0x15, 0x06, 0x6c, 0x08, 0x67, 0xc8, 0x78, 0xd7, 0xc0, 0x1a, 0xe9, 0x20, 0x7c, 0xe7, 0x29, 0x98, - 0x6f, 0x5b, 0x6d, 0x8b, 0x32, 0x9d, 0x21, 0xbf, 0xf8, 0x93, 0xdb, 0x8c, 0x2f, 0x5d, 0x18, 0xf9, - 0x98, 0xb7, 0xb4, 0x01, 0x73, 0x5c, 0x59, 0xa1, 0x8f, 0x8e, 0xd8, 0xc6, 0x06, 0x1d, 0x7a, 0xaa, - 0x56, 0xf8, 0xa5, 0x6f, 0xd3, 0xe5, 0x5b, 0x9e, 0xe5, 0x50, 0xd2, 0xc6, 0xf6, 0x3e, 0x25, 0x19, - 0x8e, 0x45, 0xf8, 0xd8, 0x24, 0xc5, 0xce, 0x08, 0xc6, 0x7f, 0xc1, 0x19, 0xe7, 0x42, 0x8c, 0x4d, - 0x0e, 0x2d, 0x55, 0x61, 0xfa, 0x28, 0x5c, 0xff, 0x92, 0x73, 0xe5, 0x70, 0x98, 0xe4, 0x0a, 0xcc, - 0x50, 0x12, 0xad, 0xeb, 0x7a, 0x56, 0x87, 0x66, 0xc0, 0xc3, 0x69, 0xfe, 0xd5, 0xb7, 0xd9, 0xac, - 0xc9, 0x13, 0x58, 0xd5, 0x47, 0x95, 0x4a, 0x40, 0x9f, 0x96, 0xb5, 0xb0, 0x66, 0x8c, 0x60, 0xf8, - 0x3a, 0x37, 0xc4, 0xd7, 0x2f, 0xdd, 0x80, 0x79, 0xf2, 0x9b, 0x26, 0xa8, 0xb0, 0x25, 0xa3, 0x8f, - 0xe0, 0x0a, 0xbf, 0xfe, 0x71, 0x36, 0x31, 0xe7, 0x7c, 0x82, 0x90, 0x4d, 0xa1, 0x51, 0x6c, 0x63, - 0xcf, 0xc3, 0x8e, 0xab, 0xa8, 0xc6, 0x20, 0xf3, 0x42, 0x67, 0x18, 0x85, 0x9f, 0xf9, 0x6e, 0x74, - 0x14, 0xaf, 0x30, 0x64, 0xd9, 0x30, 0x4a, 0xdb, 0x70, 0x62, 0x40, 0x54, 0x8c, 0xc1, 0xf9, 0x19, - 0xce, 0x39, 0xdf, 0x17, 0x19, 0x84, 0xb6, 0x01, 0x42, 0xee, 0x8f, 0xe5, 0x18, 0x9c, 0x3f, 0xcb, - 0x39, 0x11, 0xc7, 0x8a, 0x21, 0x25, 0x8c, 0xd7, 0x60, 0xf6, 0x26, 0x76, 0x76, 0x2c, 0x97, 0x9f, - 0x1b, 0x8d, 0x41, 0xf7, 0x59, 0x4e, 0x37, 0xc3, 0x81, 0xf4, 0x20, 0x89, 0x70, 0x5d, 0x84, 0xf4, - 0xae, 0xaa, 0xe1, 0x31, 0x28, 0xee, 0x72, 0x8a, 0x29, 0xa2, 0x4f, 0xa0, 0x65, 0xc8, 0xb5, 0x2d, - 0xbe, 0x46, 0x8d, 0x86, 0x7f, 0x8e, 0xc3, 0xb3, 0x02, 0xc3, 0x29, 0x6c, 0xcb, 0xee, 0x1a, 0x64, - 0x01, 0x1b, 0x4d, 0xf1, 0xd7, 0x04, 0x85, 0xc0, 0x70, 0x8a, 0x23, 0xb8, 0xf5, 0x6d, 0x41, 0xe1, - 0x86, 0xfc, 0xf9, 0x12, 0x64, 0x2d, 0xd3, 0x38, 0xb0, 0xcc, 0x71, 0x8c, 0x78, 0x87, 0x33, 0x00, - 0x87, 0x10, 0x82, 0x4b, 0x90, 0x19, 0x77, 0x20, 0xfe, 0xfa, 0x77, 0xc5, 0xf4, 0x10, 0x23, 0x70, - 0x05, 0x66, 0x44, 0x82, 0xd2, 0x2d, 0x73, 0x0c, 0x8a, 0xbf, 0xc1, 0x29, 0xf2, 0x21, 0x18, 0xef, - 0x86, 0x87, 0x5d, 0xaf, 0x8d, 0xc7, 0x21, 0xf9, 0x82, 0xe8, 0x06, 0x87, 0x70, 0x57, 0xee, 0x60, - 0x53, 0xdb, 0x1b, 0x8f, 0xe1, 0x17, 0x84, 0x2b, 0x05, 0x86, 0x50, 0x54, 0x61, 0xba, 0xa3, 0x3a, - 0xee, 0x9e, 0x6a, 0x8c, 0x35, 0x1c, 0x7f, 0x93, 0x73, 0xe4, 0x7c, 0x10, 0xf7, 0x48, 0xd7, 0x3c, - 0x0a, 0xcd, 0x17, 0x85, 0x47, 0x42, 0x30, 0x3e, 0xf5, 0x5c, 0x8f, 0x1e, 0xb2, 0x1d, 0x85, 0xed, - 0x6f, 0x89, 0xa9, 0xc7, 0xb0, 0xeb, 0x61, 0xc6, 0x4b, 0x90, 0x71, 0xf5, 0x37, 0xc7, 0xa2, 0xf9, - 0x92, 0x18, 0x69, 0x0a, 0x20, 0xe0, 0xd7, 0xe0, 0xe4, 0xc0, 0x65, 0x62, 0x0c, 0xb2, 0xbf, 0xcd, - 0xc9, 0x8e, 0x0f, 0x58, 0x2a, 0x78, 0x4a, 0x38, 0x2a, 0xe5, 0xdf, 0x11, 0x29, 0x01, 0xf7, 0x70, - 0x35, 0xc8, 0xae, 0xc1, 0x55, 0x77, 0x8f, 0xe6, 0xb5, 0xbf, 0x2b, 0xbc, 0xc6, 0xb0, 0x11, 0xaf, - 0x6d, 0xc1, 0x71, 0xce, 0x78, 0xb4, 0x71, 0xfd, 0x45, 0x91, 0x58, 0x19, 0x7a, 0x3b, 0x3a, 0xba, - 0x3f, 0x0a, 0x0b, 0xbe, 0x3b, 0x45, 0x79, 0xea, 0x2a, 0x1d, 0xd5, 0x1e, 0x83, 0xf9, 0x97, 0x38, - 0xb3, 0xc8, 0xf8, 0x7e, 0x7d, 0xeb, 0xae, 0xab, 0x36, 0x21, 0x7f, 0x15, 0x0a, 0x82, 0xbc, 0x6b, - 0x3a, 0x58, 0xb3, 0xda, 0xa6, 0xfe, 0x26, 0x6e, 0x8d, 0x41, 0xfd, 0xcb, 0x3d, 0x43, 0xb5, 0x1d, - 0x82, 0x13, 0xe6, 0x55, 0x90, 0xfc, 0x5a, 0x45, 0xd1, 0x3b, 0xb6, 0xe5, 0x78, 0x23, 0x18, 0xbf, - 0x2c, 0x46, 0xca, 0xc7, 0xad, 0x52, 0x58, 0xa9, 0x0e, 0xec, 0xc9, 0xf3, 0xb8, 0x21, 0xf9, 0x15, - 0x4e, 0x34, 0x1d, 0xa0, 0x78, 0xe2, 0xd0, 0xac, 0x8e, 0xad, 0x3a, 0xe3, 0xe4, 0xbf, 0xbf, 0x27, - 0x12, 0x07, 0x87, 0xf0, 0xc4, 0x41, 0x2a, 0x3a, 0xb2, 0xda, 0x8f, 0xc1, 0xf0, 0x55, 0x91, 0x38, - 0x04, 0x86, 0x53, 0x88, 0x82, 0x61, 0x0c, 0x8a, 0xbf, 0x2f, 0x28, 0x04, 0x86, 0x50, 0xbc, 0x1c, - 0x2c, 0xb4, 0x0e, 0x6e, 0xeb, 0xae, 0xe7, 0xb0, 0xa2, 0xf8, 0x70, 0xaa, 0x7f, 0xf0, 0xdd, 0x68, - 0x11, 0x26, 0x87, 0xa0, 0x24, 0x13, 0xf1, 0x63, 0x57, 0xba, 0x67, 0x1a, 0x6d, 0xd8, 0xaf, 0x88, - 0x4c, 0x14, 0x82, 0x11, 0xdb, 0x42, 0x15, 0x22, 0x71, 0xbb, 0x46, 0x76, 0x0a, 0x63, 0xd0, 0xfd, - 0xc3, 0x1e, 0xe3, 0x9a, 0x02, 0x4b, 0x38, 0x43, 0xf5, 0x4f, 0xd7, 0xdc, 0xc7, 0x07, 0x63, 0x45, - 0xe7, 0xaf, 0xf6, 0xd4, 0x3f, 0xdb, 0x0c, 0xc9, 0x72, 0xc8, 0x4c, 0x4f, 0x3d, 0x85, 0x46, 0xbd, - 0x67, 0x54, 0xf8, 0xd8, 0x07, 0xbc, 0xbf, 0xd1, 0x72, 0xaa, 0xb4, 0x46, 0x82, 0x3c, 0x5a, 0xf4, - 0x8c, 0x26, 0xfb, 0xf8, 0x07, 0x7e, 0x9c, 0x47, 0x6a, 0x9e, 0xd2, 0x65, 0x98, 0x8e, 0x14, 0x3c, - 0xa3, 0xa9, 0xfe, 0x34, 0xa7, 0xca, 0x85, 0xeb, 0x9d, 0xd2, 0x39, 0x48, 0x92, 0xe2, 0x65, 0x34, - 0xfc, 0xcf, 0x70, 0x38, 0x55, 0x2f, 0x7d, 0x04, 0xd2, 0xa2, 0x68, 0x19, 0x0d, 0xfd, 0xb3, 0x1c, - 0xea, 0x43, 0x08, 0x5c, 0x14, 0x2c, 0xa3, 0xe1, 0x7f, 0x4e, 0xc0, 0x05, 0x84, 0xc0, 0xc7, 0x77, - 0xe1, 0xd7, 0xfe, 0x7c, 0x92, 0x2f, 0x3a, 0xc2, 0x77, 0x97, 0x60, 0x8a, 0x57, 0x2a, 0xa3, 0xd1, - 0x9f, 0xe4, 0x37, 0x17, 0x88, 0xd2, 0x05, 0x98, 0x1c, 0xd3, 0xe1, 0x7f, 0x81, 0x43, 0x99, 0x7e, - 0xa9, 0x0a, 0xd9, 0x50, 0x75, 0x32, 0x1a, 0xfe, 0x17, 0x39, 0x3c, 0x8c, 0x22, 0xa6, 0xf3, 0xea, - 0x64, 0x34, 0xc1, 0x5f, 0x12, 0xa6, 0x73, 0x04, 0x71, 0x9b, 0x28, 0x4c, 0x46, 0xa3, 0x3f, 0x25, - 0xbc, 0x2e, 0x20, 0xa5, 0x97, 0x20, 0xe3, 0x2f, 0x36, 0xa3, 0xf1, 0x3f, 0xc9, 0xf1, 0x01, 0x86, - 0x78, 0x20, 0xb4, 0xd8, 0x8d, 0xa6, 0xf8, 0xcb, 0xc2, 0x03, 0x21, 0x14, 0x99, 0x46, 0xbd, 0x05, - 0xcc, 0x68, 0xa6, 0x9f, 0x12, 0xd3, 0xa8, 0xa7, 0x7e, 0x21, 0xa3, 0x49, 0x73, 0xfe, 0x68, 0x8a, - 0xbf, 0x22, 0x46, 0x93, 0xea, 0x13, 0x33, 0x7a, 0x2b, 0x82, 0xd1, 0x1c, 0x3f, 0x2d, 0xcc, 0xe8, - 0x29, 0x08, 0x4a, 0x0d, 0x40, 0xfd, 0xd5, 0xc0, 0x68, 0xbe, 0x4f, 0x73, 0xbe, 0xd9, 0xbe, 0x62, - 0xa0, 0xf4, 0x0a, 0x1c, 0x1f, 0x5c, 0x09, 0x8c, 0x66, 0xfd, 0x99, 0x0f, 0x7a, 0xf6, 0x6e, 0xe1, - 0x42, 0xa0, 0xb4, 0x15, 0x2c, 0x29, 0xe1, 0x2a, 0x60, 0x34, 0xed, 0x67, 0x3e, 0x88, 0x26, 0xee, - 0x70, 0x11, 0x50, 0x2a, 0x03, 0x04, 0x0b, 0xf0, 0x68, 0xae, 0xcf, 0x72, 0xae, 0x10, 0x88, 0x4c, - 0x0d, 0xbe, 0xfe, 0x8e, 0xc6, 0xdf, 0x15, 0x53, 0x83, 0x23, 0xc8, 0xd4, 0x10, 0x4b, 0xef, 0x68, - 0xf4, 0xe7, 0xc4, 0xd4, 0x10, 0x10, 0x12, 0xd9, 0xa1, 0xd5, 0x6d, 0x34, 0xc3, 0x3b, 0x22, 0xb2, - 0x43, 0xa8, 0xd2, 0x06, 0xcc, 0xf6, 0x2d, 0x88, 0xa3, 0xa9, 0x7e, 0x8e, 0x53, 0x49, 0xbd, 0xeb, - 0x61, 0x78, 0xf1, 0xe2, 0x8b, 0xe1, 0x68, 0xb6, 0xcf, 0xf7, 0x2c, 0x5e, 0x7c, 0x2d, 0x2c, 0x5d, - 0x82, 0xb4, 0xd9, 0x35, 0x0c, 0x32, 0x79, 0xd0, 0xe1, 0xef, 0x06, 0x16, 0xfe, 0xcb, 0x0f, 0xb8, - 0x77, 0x04, 0xa0, 0x74, 0x0e, 0x26, 0x71, 0x67, 0x07, 0xb7, 0x46, 0x21, 0xbf, 0xf3, 0x03, 0x91, - 0x30, 0x89, 0x76, 0xe9, 0x25, 0x00, 0x76, 0x34, 0x42, 0x1f, 0x06, 0x8e, 0xc0, 0xfe, 0xd7, 0x1f, - 0xf0, 0x97, 0x71, 0x02, 0x48, 0x40, 0xc0, 0x5e, 0xed, 0x39, 0x9c, 0xe0, 0xbb, 0x51, 0x02, 0x3a, - 0x22, 0x17, 0x61, 0xea, 0x0d, 0xd7, 0x32, 0x3d, 0xb5, 0x3d, 0x0a, 0xfd, 0xdf, 0x38, 0x5a, 0xe8, - 0x13, 0x87, 0x75, 0x2c, 0x07, 0x7b, 0x6a, 0xdb, 0x1d, 0x85, 0xfd, 0xef, 0x1c, 0xeb, 0x03, 0x08, - 0x58, 0x53, 0x5d, 0x6f, 0x9c, 0x7e, 0xff, 0x9e, 0x00, 0x0b, 0x00, 0x31, 0x9a, 0xfc, 0xde, 0xc7, - 0x07, 0xa3, 0xb0, 0xdf, 0x13, 0x46, 0x73, 0xfd, 0xd2, 0x47, 0x20, 0x43, 0x7e, 0xb2, 0x37, 0xec, - 0x46, 0x80, 0xff, 0x07, 0x07, 0x07, 0x08, 0x72, 0x67, 0xd7, 0x6b, 0x79, 0xfa, 0x68, 0x67, 0x7f, - 0x9f, 0x8f, 0xb4, 0xd0, 0x2f, 0x95, 0x21, 0xeb, 0x7a, 0xad, 0x56, 0x97, 0xd7, 0xa7, 0x23, 0xe0, - 0xff, 0xf3, 0x07, 0xfe, 0x91, 0x85, 0x8f, 0x21, 0xa3, 0x7d, 0x6b, 0xdf, 0xb3, 0x2d, 0xfa, 0xc0, - 0x63, 0x14, 0xc3, 0x07, 0x9c, 0x21, 0x04, 0x29, 0x55, 0x21, 0x47, 0xfa, 0xe2, 0x60, 0x1b, 0xd3, - 0xa7, 0x53, 0x23, 0x28, 0xfe, 0x17, 0x77, 0x40, 0x04, 0x54, 0xf9, 0xb1, 0xaf, 0xbf, 0xb7, 0x18, - 0xfb, 0xe6, 0x7b, 0x8b, 0xb1, 0xdf, 0x7d, 0x6f, 0x31, 0xf6, 0xa9, 0x6f, 0x2d, 0x4e, 0x7c, 0xf3, - 0x5b, 0x8b, 0x13, 0xbf, 0xf5, 0xad, 0xc5, 0x89, 0xc1, 0xa7, 0xc4, 0x70, 0xc5, 0xba, 0x62, 0xb1, - 0xf3, 0xe1, 0xd7, 0x8b, 0x6d, 0xdd, 0xdb, 0xeb, 0xee, 0xac, 0x68, 0x56, 0x87, 0x1e, 0xe3, 0x06, - 0xa7, 0xb5, 0xfe, 0x26, 0x07, 0x3e, 0x16, 0x27, 0x1b, 0xe6, 0xe8, 0x59, 0xae, 0x6a, 0x1e, 0x0c, - 0xf9, 0x56, 0x67, 0x61, 0xe0, 0xc1, 0x70, 0xf1, 0x2a, 0x24, 0xca, 0xe6, 0x01, 0x3a, 0xc9, 0x72, - 0x9e, 0xd2, 0x75, 0x0c, 0xfe, 0xe6, 0xd7, 0x14, 0xb9, 0xde, 0x76, 0x0c, 0x34, 0x1f, 0xbc, 0x9e, - 0x19, 0x3b, 0x9d, 0xe3, 0xef, 0x5c, 0x96, 0xa4, 0x4f, 0xbf, 0xbd, 0x34, 0xf1, 0x8b, 0x6f, 0x2f, - 0x4d, 0x7c, 0xef, 0x9d, 0xa5, 0x89, 0xb7, 0x7e, 0x67, 0x79, 0xa2, 0xb2, 0xdf, 0xdb, 0xdb, 0xaf, - 0x8d, 0xec, 0x71, 0xba, 0x6c, 0x1e, 0xd0, 0x0e, 0x37, 0x62, 0xaf, 0x4f, 0xd2, 0x43, 0x6f, 0x71, - 0xc8, 0xbd, 0xd8, 0x7b, 0xc8, 0xfd, 0x0a, 0x36, 0x8c, 0xeb, 0xa6, 0x75, 0xcb, 0xdc, 0x22, 0x6a, - 0x3b, 0x29, 0xf6, 0x4a, 0x31, 0xfc, 0x54, 0x1c, 0x16, 0xfb, 0xce, 0xb3, 0x79, 0x14, 0x0c, 0xfb, - 0x68, 0xa9, 0x04, 0xe9, 0x9a, 0x08, 0xae, 0x02, 0x4c, 0xb9, 0x58, 0xb3, 0xcc, 0x96, 0x4b, 0xbb, - 0x9d, 0x90, 0xc5, 0x25, 0xe9, 0xb6, 0xa9, 0x9a, 0x96, 0xcb, 0xdf, 0x94, 0x64, 0x17, 0x95, 0x9f, - 0x8d, 0x1d, 0x6d, 0x4c, 0xa7, 0xc5, 0x9d, 0x44, 0x37, 0x9f, 0x1b, 0x79, 0xec, 0xbf, 0x4f, 0x7a, - 0xe9, 0x77, 0x22, 0x72, 0xf4, 0x3f, 0xae, 0x57, 0x7e, 0x3a, 0x0e, 0x4b, 0xbd, 0x5e, 0x21, 0x53, - 0xcb, 0xf5, 0xd4, 0x8e, 0x3d, 0xcc, 0x2d, 0x97, 0x20, 0xb3, 0x25, 0x74, 0x8e, 0xec, 0x97, 0xbb, - 0x47, 0xf4, 0x4b, 0xde, 0xbf, 0x95, 0x70, 0xcc, 0xd9, 0x31, 0x1d, 0xe3, 0xf7, 0xe3, 0x9e, 0x3c, - 0xf3, 0x7f, 0x52, 0x70, 0x52, 0xb3, 0xdc, 0x8e, 0xe5, 0x2a, 0x6c, 0x2a, 0xb0, 0x0b, 0xee, 0x93, - 0x5c, 0xb8, 0x69, 0xf4, 0x83, 0x92, 0xe2, 0x75, 0x98, 0x5b, 0x25, 0xe9, 0x82, 0x6c, 0x83, 0x82, - 0x47, 0x3c, 0x03, 0x5f, 0x26, 0x5d, 0x8e, 0x54, 0xfc, 0xfc, 0x11, 0x53, 0x58, 0x54, 0xfc, 0x58, - 0x0c, 0xa4, 0xa6, 0xa6, 0x1a, 0xaa, 0xf3, 0xff, 0x4b, 0x85, 0x2e, 0x00, 0xd0, 0x8f, 0x90, 0x82, - 0xaf, 0x86, 0xf2, 0x67, 0x0b, 0x2b, 0xe1, 0xce, 0xad, 0xb0, 0x3b, 0xd1, 0x4f, 0x12, 0x32, 0x54, - 0x97, 0xfc, 0x7c, 0xf2, 0x55, 0x80, 0xa0, 0x01, 0x3d, 0x00, 0x27, 0x9a, 0xd5, 0xf2, 0x5a, 0x59, - 0x56, 0xd8, 0xdb, 0xed, 0x1b, 0xcd, 0x46, 0xbd, 0xba, 0x7a, 0x79, 0xb5, 0x5e, 0x93, 0x26, 0xd0, - 0x71, 0x40, 0xe1, 0x46, 0xff, 0xc5, 0x94, 0x63, 0x30, 0x1b, 0x96, 0xb3, 0x57, 0xe4, 0xe3, 0xa4, - 0x54, 0xd4, 0x3b, 0xb6, 0x81, 0xe9, 0xb3, 0x3f, 0x45, 0x17, 0x5e, 0x1b, 0x5d, 0x85, 0xfc, 0xda, - 0xbf, 0x61, 0xaf, 0x4d, 0xcf, 0x05, 0x70, 0xdf, 0xe7, 0xa5, 0x35, 0x98, 0x55, 0x35, 0x0d, 0xdb, - 0x11, 0xca, 0x11, 0xb9, 0x9a, 0x10, 0xd2, 0xa7, 0x99, 0x1c, 0x19, 0xb0, 0x5d, 0x80, 0x94, 0x4b, - 0x7b, 0x3f, 0x8a, 0xe2, 0x1b, 0x9c, 0x82, 0xab, 0x97, 0x4c, 0x98, 0x25, 0xa5, 0x9f, 0xea, 0xe0, - 0x90, 0x19, 0x87, 0x1f, 0x34, 0xfc, 0xa3, 0x2f, 0x3f, 0x4b, 0x9f, 0x6d, 0x3e, 0x1c, 0x1d, 0x96, - 0x01, 0xe1, 0x24, 0x4b, 0x9c, 0x3b, 0x30, 0x14, 0x43, 0x5e, 0xdc, 0x8f, 0x1b, 0x7c, 0xf8, 0xcd, - 0xfe, 0x31, 0xbf, 0xd9, 0xe2, 0xa0, 0x18, 0x08, 0xdd, 0x69, 0x9a, 0xb3, 0xb2, 0x86, 0x4a, 0x7d, - 0xd8, 0x9c, 0x7e, 0xfd, 0xa9, 0xd0, 0xf2, 0xc4, 0x28, 0xf9, 0x9f, 0x67, 0x28, 0xf3, 0xa5, 0xf0, - 0x6d, 0xfc, 0xb9, 0xf7, 0x9b, 0x09, 0x58, 0xe4, 0xca, 0x3b, 0xaa, 0x8b, 0xcf, 0xdc, 0x7c, 0x6e, - 0x07, 0x7b, 0xea, 0x73, 0x67, 0x34, 0x4b, 0x17, 0xb9, 0x7a, 0x8e, 0x4f, 0x47, 0xd2, 0xbe, 0xc2, - 0xdb, 0x07, 0x2f, 0x5c, 0x0b, 0xc3, 0xa7, 0x71, 0x71, 0x1b, 0x92, 0x55, 0x4b, 0x37, 0x49, 0xaa, - 0x6a, 0x61, 0xd3, 0xea, 0xf0, 0xd9, 0xc3, 0x2e, 0xd0, 0x73, 0x90, 0x52, 0x3b, 0x56, 0xd7, 0xf4, - 0xd8, 0xcc, 0xa9, 0x9c, 0xfc, 0xfa, 0xbb, 0x4b, 0x13, 0xff, 0xf6, 0xdd, 0xa5, 0xc4, 0xaa, 0xe9, - 0xfd, 0xc6, 0x57, 0x9e, 0x01, 0x4e, 0xb5, 0x6a, 0x7a, 0x32, 0x57, 0x2c, 0x25, 0xdf, 0x7f, 0x7b, - 0x29, 0x56, 0x7c, 0x15, 0xa6, 0x6a, 0x58, 0xbb, 0x17, 0xe6, 0x1a, 0xd6, 0x42, 0xcc, 0x35, 0xac, - 0xf5, 0x30, 0x5f, 0x80, 0xf4, 0xaa, 0xe9, 0xb1, 0x37, 0xd1, 0x9f, 0x82, 0x84, 0x6e, 0xb2, 0x97, - 0x1b, 0x0f, 0xb5, 0x8d, 0x68, 0x11, 0x60, 0x0d, 0x6b, 0x3e, 0xb0, 0x85, 0xb5, 0x5e, 0x60, 0xff, - 0xad, 0x89, 0x56, 0xa5, 0xf6, 0x5b, 0xff, 0x71, 0x71, 0xe2, 0xad, 0xf7, 0x16, 0x27, 0x86, 0x0e, - 0x71, 0x71, 0xe8, 0x10, 0xbb, 0xad, 0x7d, 0x96, 0x91, 0xfd, 0x91, 0xfd, 0x62, 0x12, 0x1e, 0xa2, - 0x1f, 0x28, 0x39, 0x1d, 0xdd, 0xf4, 0xce, 0x68, 0xce, 0x81, 0xed, 0xd1, 0x92, 0xc5, 0xda, 0xe5, - 0x03, 0x3b, 0x1b, 0x34, 0xaf, 0xb0, 0xe6, 0x21, 0xf5, 0xc8, 0x2e, 0x4c, 0x36, 0x08, 0x8e, 0xb8, - 0xd8, 0xb3, 0x3c, 0xd5, 0xe0, 0xeb, 0x0f, 0xbb, 0x20, 0x52, 0xf6, 0x51, 0x53, 0x9c, 0x49, 0x75, - 0xf1, 0x3d, 0x93, 0x81, 0xd5, 0x5d, 0xf6, 0x6e, 0x78, 0x82, 0x96, 0x29, 0x69, 0x22, 0xa0, 0xaf, - 0x81, 0xcf, 0xc3, 0xa4, 0xda, 0x65, 0x2f, 0x31, 0x24, 0x48, 0xfd, 0x42, 0x2f, 0x8a, 0xd7, 0x61, - 0x8a, 0x3f, 0x4a, 0x45, 0x12, 0x24, 0xf6, 0xf1, 0x01, 0xbd, 0x4f, 0x4e, 0x26, 0x3f, 0xd1, 0x0a, - 0x4c, 0x52, 0xe3, 0xf9, 0x47, 0x2f, 0x85, 0x95, 0x3e, 0xeb, 0x57, 0xa8, 0x91, 0x32, 0x53, 0x2b, - 0x5e, 0x83, 0x74, 0xcd, 0xea, 0xe8, 0xa6, 0x15, 0x65, 0xcb, 0x30, 0x36, 0x6a, 0xb3, 0xdd, 0xe5, - 0x51, 0x21, 0xb3, 0x0b, 0x74, 0x1c, 0x52, 0xec, 0x5b, 0x01, 0xfe, 0x22, 0x06, 0xbf, 0x2a, 0x56, - 0x61, 0x8a, 0x72, 0x6f, 0xda, 0x24, 0xf9, 0xfb, 0xaf, 0x65, 0x66, 0xf8, 0x97, 0x63, 0x9c, 0x3e, - 0x1e, 0x18, 0x8b, 0x20, 0xd9, 0x52, 0x3d, 0x95, 0xf7, 0x9b, 0xfe, 0x2e, 0x7e, 0x14, 0xd2, 0x9c, - 0xc4, 0x45, 0x67, 0x21, 0x61, 0xd9, 0x2e, 0x7f, 0x95, 0x62, 0x61, 0x58, 0x57, 0x36, 0xed, 0x4a, - 0x92, 0xc4, 0x8c, 0x4c, 0x94, 0x2b, 0xf2, 0xd0, 0xb0, 0x78, 0x31, 0x14, 0x16, 0xa1, 0x21, 0x0f, - 0xfd, 0x64, 0x43, 0xda, 0x17, 0x0e, 0x7e, 0xb0, 0xbc, 0x13, 0x87, 0xc5, 0x50, 0xeb, 0x4d, 0xec, - 0xb8, 0xba, 0x65, 0xb2, 0x88, 0xe2, 0xd1, 0x82, 0x42, 0x46, 0xf2, 0xf6, 0x21, 0xe1, 0xf2, 0x11, - 0x48, 0x94, 0x6d, 0x1b, 0x2d, 0x40, 0x9a, 0x5e, 0x6b, 0x16, 0x8b, 0x97, 0xa4, 0xec, 0x5f, 0x93, - 0x36, 0xd7, 0xda, 0xf5, 0x6e, 0xa9, 0x8e, 0xff, 0x39, 0x9d, 0xb8, 0x2e, 0x5e, 0x84, 0x4c, 0xd5, - 0x32, 0x5d, 0x6c, 0xba, 0x5d, 0x5a, 0xd9, 0xec, 0x18, 0x96, 0xb6, 0xcf, 0x19, 0xd8, 0x05, 0x71, - 0xb8, 0x6a, 0xdb, 0x14, 0x99, 0x94, 0xc9, 0x4f, 0x36, 0x67, 0x2b, 0xcd, 0xa1, 0x2e, 0xba, 0x78, - 0x74, 0x17, 0xf1, 0x4e, 0xfa, 0x3e, 0xfa, 0xfd, 0x18, 0x3c, 0xd8, 0x3f, 0xa1, 0xf6, 0xf1, 0x81, - 0x7b, 0xd4, 0xf9, 0xf4, 0x2a, 0x64, 0x1a, 0xf4, 0x9b, 0xf6, 0xeb, 0xf8, 0x00, 0x2d, 0xc0, 0x14, - 0x6e, 0x9d, 0x3d, 0x77, 0xee, 0xb9, 0x8b, 0x2c, 0xda, 0xaf, 0x4e, 0xc8, 0x42, 0x80, 0x16, 0x21, - 0xe3, 0x62, 0xcd, 0x3e, 0x7b, 0xee, 0xfc, 0xfe, 0x73, 0x2c, 0xbc, 0xae, 0x4e, 0xc8, 0x81, 0xa8, - 0x94, 0x26, 0xbd, 0x7e, 0xff, 0x9d, 0xa5, 0x58, 0x65, 0x12, 0x12, 0x6e, 0xb7, 0xf3, 0xa1, 0xc6, - 0xc8, 0x67, 0x26, 0x61, 0x39, 0x8c, 0xa4, 0xf5, 0xdf, 0x4d, 0xd5, 0xd0, 0x5b, 0x6a, 0xf0, 0xdf, - 0x08, 0xa4, 0x90, 0x0f, 0xa8, 0xc6, 0x90, 0x95, 0xe2, 0x50, 0x4f, 0x16, 0x7f, 0x39, 0x06, 0xb9, - 0x1b, 0x82, 0xb9, 0x89, 0x3d, 0x74, 0x09, 0xc0, 0xbf, 0x93, 0x98, 0x36, 0x0f, 0xac, 0xf4, 0xde, - 0x6b, 0xc5, 0xc7, 0xc8, 0x21, 0x75, 0x74, 0x81, 0x06, 0xa2, 0x6d, 0xb9, 0xfc, 0x13, 0xab, 0x11, - 0x50, 0x5f, 0x19, 0x3d, 0x0d, 0x88, 0x66, 0x38, 0xe5, 0xa6, 0xe5, 0xe9, 0x66, 0x5b, 0xb1, 0xad, - 0x5b, 0xfc, 0xc3, 0xd5, 0x84, 0x2c, 0xd1, 0x96, 0x1b, 0xb4, 0xa1, 0x41, 0xe4, 0xc4, 0xe8, 0x8c, - 0xcf, 0x42, 0x8a, 0x75, 0xb5, 0xd5, 0x72, 0xb0, 0xeb, 0xf2, 0x24, 0x26, 0x2e, 0xd1, 0x25, 0x98, - 0xb2, 0xbb, 0x3b, 0x8a, 0xc8, 0x18, 0xd9, 0xb3, 0x0f, 0x0e, 0x9a, 0xff, 0x22, 0x3e, 0x78, 0x06, - 0x48, 0xd9, 0xdd, 0x1d, 0x12, 0x2d, 0x0f, 0x43, 0x6e, 0x80, 0x31, 0xd9, 0x9b, 0x81, 0x1d, 0xf4, - 0x5f, 0x29, 0xf0, 0x1e, 0x28, 0xb6, 0xa3, 0x5b, 0x8e, 0xee, 0x1d, 0xd0, 0xf7, 0xa1, 0x12, 0xb2, - 0x24, 0x1a, 0x1a, 0x5c, 0x5e, 0xdc, 0x87, 0x99, 0x26, 0x2d, 0xe2, 0x02, 0xcb, 0xcf, 0x05, 0xf6, - 0xc5, 0x46, 0xdb, 0x37, 0xd4, 0xb2, 0x78, 0x9f, 0x65, 0x95, 0x97, 0x87, 0x46, 0xe7, 0x85, 0xa3, - 0x47, 0x67, 0x74, 0xb5, 0xfb, 0xbd, 0x93, 0x91, 0xc9, 0xc9, 0x82, 0x33, 0x9c, 0xbe, 0xc6, 0x0d, - 0xcc, 0x51, 0x7b, 0xb4, 0x85, 0xc3, 0x17, 0xd5, 0x85, 0x11, 0x69, 0x74, 0x61, 0xe4, 0x14, 0x2a, - 0x5e, 0x84, 0xe9, 0x86, 0xea, 0x78, 0x4d, 0xec, 0x5d, 0xc5, 0x6a, 0x0b, 0x3b, 0xd1, 0x55, 0x77, - 0x5a, 0xac, 0xba, 0x08, 0x92, 0x74, 0x69, 0x65, 0xab, 0x0e, 0xfd, 0x5d, 0xdc, 0x83, 0x24, 0x7d, - 0x27, 0xd2, 0x5f, 0x91, 0x39, 0x82, 0xad, 0xc8, 0x24, 0x97, 0x1e, 0x78, 0xd8, 0x15, 0x87, 0x06, - 0xf4, 0x02, 0xbd, 0x20, 0xd6, 0xd5, 0xc4, 0xe1, 0xeb, 0x2a, 0x0f, 0x44, 0xbe, 0xba, 0x1a, 0x30, - 0x55, 0x21, 0xa9, 0x78, 0xb5, 0xe6, 0x1b, 0x12, 0x0b, 0x0c, 0x41, 0xeb, 0x30, 0x63, 0xab, 0x8e, - 0x47, 0x3f, 0x0f, 0xd9, 0xa3, 0xbd, 0xe0, 0xb1, 0xbe, 0xd4, 0x3f, 0xf3, 0x22, 0x9d, 0xe5, 0x77, - 0x99, 0xb6, 0xc3, 0xc2, 0xe2, 0x7f, 0x4a, 0x42, 0x8a, 0x3b, 0xe3, 0x23, 0x30, 0xc5, 0xdd, 0xca, - 0xa3, 0xf3, 0xa1, 0x95, 0xfe, 0x85, 0x69, 0xc5, 0x5f, 0x40, 0x38, 0x9f, 0xc0, 0xa0, 0xc7, 0x21, - 0xad, 0xed, 0xa9, 0xba, 0xa9, 0xe8, 0x2d, 0x5e, 0x10, 0x66, 0xdf, 0x7b, 0x77, 0x69, 0xaa, 0x4a, - 0x64, 0xab, 0x35, 0x79, 0x8a, 0x36, 0xae, 0xb6, 0x48, 0x25, 0xb0, 0x87, 0xf5, 0xf6, 0x9e, 0xc7, - 0x67, 0x18, 0xbf, 0x42, 0x2f, 0x42, 0x92, 0x04, 0x04, 0xff, 0x78, 0x70, 0xa1, 0xaf, 0xc2, 0xf7, - 0xb7, 0xd0, 0x95, 0x34, 0xb9, 0xf1, 0xa7, 0xfe, 0xc3, 0x52, 0x4c, 0xa6, 0x08, 0x54, 0x85, 0x69, - 0x43, 0x75, 0x3d, 0x85, 0xae, 0x60, 0xe4, 0xf6, 0x93, 0x94, 0xe2, 0x64, 0xbf, 0x43, 0xb8, 0x63, - 0xb9, 0xe9, 0x59, 0x82, 0x62, 0xa2, 0x16, 0x3a, 0x0d, 0x12, 0x25, 0xd1, 0xac, 0x4e, 0x47, 0xf7, - 0x58, 0x6d, 0x95, 0xa2, 0x7e, 0xcf, 0x13, 0x79, 0x95, 0x8a, 0x69, 0x85, 0xf5, 0x00, 0x64, 0xe8, - 0xe7, 0x4a, 0x54, 0x85, 0xbd, 0x88, 0x9b, 0x26, 0x02, 0xda, 0x78, 0x0a, 0x66, 0x82, 0xfc, 0xc8, - 0x54, 0xd2, 0x8c, 0x25, 0x10, 0x53, 0xc5, 0x67, 0x61, 0xde, 0xc4, 0xb7, 0xe9, 0xab, 0xc1, 0x11, - 0xed, 0x0c, 0xd5, 0x46, 0xa4, 0xed, 0x46, 0x14, 0xf1, 0x18, 0xe4, 0x35, 0xe1, 0x7c, 0xa6, 0x0b, - 0x54, 0x77, 0xda, 0x97, 0x52, 0xb5, 0x93, 0x90, 0x56, 0x6d, 0x9b, 0x29, 0x64, 0x79, 0x7e, 0xb4, - 0x6d, 0xda, 0xf4, 0x24, 0xcc, 0xd2, 0x3e, 0x3a, 0xd8, 0xed, 0x1a, 0x1e, 0x27, 0xc9, 0x51, 0x9d, - 0x19, 0xd2, 0x20, 0x33, 0x39, 0xd5, 0x7d, 0x04, 0xa6, 0xf1, 0x4d, 0xbd, 0x85, 0x4d, 0x0d, 0x33, - 0xbd, 0x69, 0xaa, 0x97, 0x13, 0x42, 0xaa, 0xf4, 0x04, 0xf8, 0x79, 0x4f, 0x11, 0x39, 0x39, 0xcf, - 0xf8, 0x84, 0xbc, 0xcc, 0xc4, 0xc5, 0x02, 0x24, 0x6b, 0xaa, 0xa7, 0x92, 0x02, 0xc3, 0xbb, 0xcd, - 0x16, 0x9a, 0x9c, 0x4c, 0x7e, 0x16, 0xdf, 0x8f, 0x43, 0xf2, 0x86, 0xe5, 0x61, 0xf4, 0x7c, 0xa8, - 0x00, 0xcc, 0x0f, 0x8a, 0xe7, 0xa6, 0xde, 0x36, 0x71, 0x6b, 0xdd, 0x6d, 0x87, 0xfe, 0xb7, 0x40, - 0x10, 0x4e, 0xf1, 0x48, 0x38, 0xcd, 0xc3, 0xa4, 0x63, 0x75, 0xcd, 0x96, 0x78, 0x87, 0x95, 0x5e, - 0xa0, 0x3a, 0xa4, 0xfd, 0x28, 0x49, 0x8e, 0x8a, 0x92, 0x19, 0x12, 0x25, 0x24, 0x86, 0xb9, 0x40, - 0x9e, 0xda, 0xe1, 0xc1, 0x52, 0x81, 0x8c, 0x9f, 0xbc, 0x78, 0xb4, 0x8d, 0x17, 0xb0, 0x01, 0x8c, - 0x2c, 0x26, 0xfe, 0xd8, 0xfb, 0xce, 0x63, 0x11, 0x27, 0xf9, 0x0d, 0xdc, 0x7b, 0x91, 0xb0, 0xe2, - 0xff, 0xe7, 0x60, 0x8a, 0xf6, 0x2b, 0x08, 0x2b, 0xf6, 0xbf, 0x0e, 0x1e, 0x84, 0x8c, 0xab, 0xb7, - 0x4d, 0xd5, 0xeb, 0x3a, 0x98, 0x47, 0x5e, 0x20, 0x28, 0x7e, 0x2d, 0x06, 0x29, 0x16, 0xc9, 0x21, - 0xbf, 0xc5, 0x06, 0xfb, 0x2d, 0x3e, 0xcc, 0x6f, 0x89, 0x7b, 0xf7, 0x5b, 0x19, 0xc0, 0x37, 0xc6, - 0xe5, 0x9f, 0x9f, 0x0f, 0xa8, 0x18, 0x98, 0x89, 0x4d, 0xbd, 0xcd, 0x27, 0x6a, 0x08, 0x54, 0xfc, - 0xf7, 0x31, 0x52, 0xc4, 0xf2, 0x76, 0x54, 0x86, 0x69, 0x61, 0x97, 0xb2, 0x6b, 0xa8, 0x6d, 0x1e, - 0x3b, 0x0f, 0x0d, 0x35, 0xee, 0xb2, 0xa1, 0xb6, 0xe5, 0x2c, 0xb7, 0x87, 0x5c, 0x0c, 0x1e, 0x87, - 0xf8, 0x90, 0x71, 0x88, 0x0c, 0x7c, 0xe2, 0xde, 0x06, 0x3e, 0x32, 0x44, 0xc9, 0xde, 0x21, 0xfa, - 0x72, 0x9c, 0x6e, 0x66, 0x6c, 0xcb, 0x55, 0x8d, 0x1f, 0xc6, 0x8c, 0x78, 0x00, 0x32, 0xb6, 0x65, - 0x28, 0xac, 0x85, 0xbd, 0xdb, 0x9d, 0xb6, 0x2d, 0x43, 0xee, 0x1b, 0xf6, 0xc9, 0xfb, 0x34, 0x5d, - 0x52, 0xf7, 0xc1, 0x6b, 0x53, 0xbd, 0x5e, 0x73, 0x20, 0xc7, 0x5c, 0xc1, 0xd7, 0xb2, 0x67, 0x89, - 0x0f, 0xe8, 0xe2, 0x18, 0xeb, 0x5f, 0x7b, 0x99, 0xd9, 0x4c, 0x53, 0xe6, 0x7a, 0x04, 0xc1, 0x52, - 0xff, 0xa0, 0x5d, 0x70, 0x38, 0x2c, 0x65, 0xae, 0x57, 0xfc, 0xab, 0x31, 0x80, 0x35, 0xe2, 0x59, - 0xda, 0x5f, 0xb2, 0x0a, 0xb9, 0xd4, 0x04, 0x25, 0x72, 0xe7, 0xc5, 0x61, 0x83, 0xc6, 0xef, 0x9f, - 0x73, 0xc3, 0x76, 0x57, 0x61, 0x3a, 0x08, 0x46, 0x17, 0x0b, 0x63, 0x16, 0x0f, 0xa9, 0xaa, 0x9b, - 0xd8, 0x93, 0x73, 0x37, 0x43, 0x57, 0xc5, 0x7f, 0x16, 0x83, 0x0c, 0xb5, 0x69, 0x1d, 0x7b, 0x6a, - 0x64, 0x0c, 0x63, 0xf7, 0x3e, 0x86, 0x0f, 0x01, 0x30, 0x1a, 0x57, 0x7f, 0x13, 0xf3, 0xc8, 0xca, - 0x50, 0x49, 0x53, 0x7f, 0x13, 0xa3, 0xf3, 0xbe, 0xc3, 0x13, 0x87, 0x3b, 0x5c, 0x54, 0xdd, 0xdc, - 0xed, 0x27, 0x60, 0x8a, 0xfe, 0xbb, 0xa6, 0xdb, 0x2e, 0x2f, 0xa4, 0x53, 0x66, 0xb7, 0xb3, 0x75, - 0xdb, 0x2d, 0xbe, 0x01, 0x53, 0x5b, 0xb7, 0xd9, 0xd9, 0xc8, 0x03, 0x90, 0x71, 0x2c, 0x8b, 0xaf, - 0xc9, 0xac, 0x16, 0x4a, 0x13, 0x01, 0x5d, 0x82, 0xc4, 0x79, 0x40, 0x3c, 0x38, 0x0f, 0x08, 0x0e, - 0x34, 0x12, 0x63, 0x1d, 0x68, 0x3c, 0xf9, 0x9b, 0x31, 0xc8, 0x86, 0xf2, 0x03, 0x7a, 0x0e, 0x8e, - 0x55, 0xd6, 0x36, 0xab, 0xd7, 0x95, 0xd5, 0x9a, 0x72, 0x79, 0xad, 0x7c, 0x25, 0xf8, 0x7a, 0x69, - 0xe1, 0xf8, 0x9d, 0xbb, 0xcb, 0x28, 0xa4, 0xbb, 0x6d, 0xd2, 0x73, 0x7a, 0x74, 0x06, 0xe6, 0xa3, - 0x90, 0x72, 0xa5, 0x59, 0xdf, 0xd8, 0x92, 0x62, 0x0b, 0xc7, 0xee, 0xdc, 0x5d, 0x9e, 0x0d, 0x21, - 0xca, 0x3b, 0x2e, 0x36, 0xbd, 0x7e, 0x40, 0x75, 0x73, 0x7d, 0x7d, 0x75, 0x4b, 0x8a, 0xf7, 0x01, - 0x78, 0xc2, 0x7e, 0x02, 0x66, 0xa3, 0x80, 0x8d, 0xd5, 0x35, 0x29, 0xb1, 0x80, 0xee, 0xdc, 0x5d, - 0xce, 0x87, 0xb4, 0x37, 0x74, 0x63, 0x21, 0xfd, 0x89, 0xcf, 0x2f, 0x4e, 0xfc, 0xc2, 0xcf, 0x2f, - 0xc6, 0x48, 0xcf, 0xa6, 0x23, 0x39, 0x02, 0x3d, 0x0d, 0x27, 0x9a, 0xab, 0x57, 0x36, 0xea, 0x35, - 0x65, 0xbd, 0x79, 0x45, 0x9c, 0x74, 0x8b, 0xde, 0xcd, 0xdc, 0xb9, 0xbb, 0x9c, 0xe5, 0x5d, 0x1a, - 0xa6, 0xdd, 0x90, 0xeb, 0x37, 0x36, 0xb7, 0xea, 0x52, 0x8c, 0x69, 0x37, 0x1c, 0x7c, 0xd3, 0xf2, - 0xd8, 0xff, 0x73, 0x7b, 0x16, 0x4e, 0x0e, 0xd0, 0xf6, 0x3b, 0x36, 0x7b, 0xe7, 0xee, 0xf2, 0x74, - 0xc3, 0xc1, 0x6c, 0xfe, 0x50, 0xc4, 0x0a, 0x14, 0xfa, 0x11, 0x9b, 0x8d, 0xcd, 0x66, 0x79, 0x4d, - 0x5a, 0x5e, 0x90, 0xee, 0xdc, 0x5d, 0xce, 0x89, 0x64, 0x48, 0xf4, 0x83, 0x9e, 0x7d, 0x98, 0x3b, - 0x9e, 0xf7, 0x9f, 0x82, 0x47, 0xf9, 0x19, 0xa0, 0xeb, 0xa9, 0xfb, 0xba, 0xd9, 0xf6, 0x0f, 0x6f, - 0xf9, 0x35, 0xdf, 0xf9, 0x1c, 0xe7, 0xe7, 0x8c, 0x42, 0x3a, 0xe2, 0x08, 0x77, 0xe8, 0xd3, 0xcb, - 0x85, 0x11, 0x0f, 0xf5, 0x46, 0x6f, 0x9d, 0x86, 0x1f, 0x0f, 0x2f, 0x8c, 0x38, 0x84, 0x5e, 0x38, - 0x74, 0x73, 0x57, 0xfc, 0x64, 0x0c, 0xf2, 0x57, 0x75, 0xd7, 0xb3, 0x1c, 0x5d, 0x53, 0x0d, 0xfa, - 0xcd, 0xd2, 0xf9, 0x71, 0x73, 0x6b, 0xcf, 0x54, 0x7f, 0x09, 0x52, 0x37, 0x55, 0x83, 0x25, 0xb5, - 0xf0, 0xb3, 0x80, 0x5e, 0xf7, 0x05, 0xa9, 0x4d, 0x10, 0x30, 0x58, 0xf1, 0x4b, 0x71, 0x98, 0xa1, - 0x93, 0xc1, 0x65, 0xff, 0x8e, 0x8b, 0xec, 0xb1, 0x1a, 0x90, 0x74, 0x54, 0x8f, 0x1f, 0x1a, 0x56, - 0x7e, 0x84, 0x9f, 0x03, 0x3f, 0x3e, 0xfa, 0x34, 0x77, 0xa5, 0xff, 0xa8, 0x98, 0x32, 0xa1, 0x57, - 0x20, 0xdd, 0x51, 0x6f, 0x2b, 0x94, 0x35, 0x7e, 0x1f, 0x58, 0xa7, 0x3a, 0xea, 0x6d, 0x62, 0x2b, - 0x6a, 0xc1, 0x0c, 0x21, 0xd6, 0xf6, 0x54, 0xb3, 0x8d, 0x19, 0x7f, 0xe2, 0x3e, 0xf0, 0x4f, 0x77, - 0xd4, 0xdb, 0x55, 0xca, 0x49, 0xee, 0x52, 0x4a, 0x7f, 0xfa, 0xed, 0xa5, 0x09, 0x7a, 0xcc, 0xfe, - 0xab, 0x31, 0x80, 0xc0, 0x5d, 0xe8, 0x8f, 0x83, 0xa4, 0xf9, 0x57, 0xf4, 0xf6, 0x2e, 0x1f, 0xc0, - 0x53, 0xc3, 0x06, 0xa2, 0xc7, 0xd9, 0x6c, 0x61, 0xfe, 0xe6, 0xbb, 0x4b, 0x31, 0x79, 0x46, 0xeb, - 0x19, 0x87, 0x3a, 0x64, 0xbb, 0x76, 0x4b, 0xf5, 0xb0, 0x42, 0x37, 0x71, 0xf1, 0x23, 0x2c, 0xf2, - 0xc0, 0x80, 0xa4, 0x29, 0x64, 0xfd, 0x97, 0x62, 0x90, 0xad, 0x85, 0x1e, 0xf2, 0x15, 0x60, 0xaa, - 0x63, 0x99, 0xfa, 0x3e, 0x0f, 0xbb, 0x8c, 0x2c, 0x2e, 0xd1, 0x02, 0xa4, 0xd9, 0xd7, 0x9a, 0xde, - 0x81, 0x38, 0xf1, 0x14, 0xd7, 0x04, 0x75, 0x0b, 0xef, 0xb8, 0xba, 0xf0, 0xb5, 0x2c, 0x2e, 0xc9, - 0xd6, 0xc5, 0xc5, 0x5a, 0xd7, 0xd1, 0xbd, 0x03, 0x45, 0xb3, 0x4c, 0x4f, 0xd5, 0x3c, 0xfe, 0xdd, - 0xdf, 0x8c, 0x90, 0x57, 0x99, 0x98, 0x90, 0xb4, 0xb0, 0xa7, 0xea, 0x86, 0x5b, 0x60, 0x0f, 0xc2, - 0xc4, 0x65, 0xc8, 0xdc, 0x5f, 0x4b, 0x85, 0x8f, 0xa8, 0xaa, 0x20, 0x59, 0x36, 0x76, 0x22, 0x25, - 0x25, 0x8b, 0xd0, 0xc2, 0x6f, 0x7c, 0xe5, 0x99, 0x79, 0xee, 0x6e, 0x5e, 0x54, 0xb2, 0x17, 0x5b, - 0xe5, 0x19, 0x81, 0x10, 0xb5, 0xe6, 0x6b, 0x64, 0xc0, 0xc4, 0x7e, 0xcf, 0xee, 0xee, 0x04, 0xc7, - 0x5a, 0xf3, 0x7d, 0x7e, 0x2d, 0x9b, 0x07, 0x95, 0xc2, 0x37, 0x02, 0xea, 0xe0, 0x2c, 0xe9, 0x3a, - 0x3e, 0x20, 0xa3, 0xc5, 0x79, 0x1a, 0x94, 0x86, 0x94, 0x88, 0x6f, 0xa8, 0xba, 0x21, 0x3e, 0x42, - 0x97, 0xf9, 0x15, 0x2a, 0x41, 0xca, 0xf5, 0x54, 0xaf, 0xeb, 0xf2, 0x7f, 0x16, 0x57, 0x1c, 0x16, - 0x19, 0x15, 0xcb, 0x6c, 0x35, 0xa9, 0xa6, 0xcc, 0x11, 0x68, 0x0b, 0x52, 0x9e, 0xb5, 0x8f, 0x4d, - 0xee, 0xa4, 0x23, 0x45, 0xf5, 0x80, 0x67, 0x51, 0x8c, 0x0b, 0xb5, 0x41, 0x6a, 0x61, 0x03, 0xb7, - 0x59, 0x41, 0xb4, 0xa7, 0x92, 0x7d, 0x43, 0xea, 0x3e, 0xcc, 0x9a, 0x19, 0x9f, 0xb5, 0x49, 0x49, - 0xd1, 0xf5, 0xe8, 0x63, 0x66, 0xf6, 0x9f, 0x15, 0x1f, 0x19, 0xd6, 0xff, 0x50, 0x64, 0x8a, 0xc3, - 0x84, 0xf0, 0x13, 0xe9, 0x27, 0x40, 0xea, 0x9a, 0x3b, 0x96, 0x49, 0x3f, 0x15, 0xe5, 0xc5, 0x78, - 0x9a, 0x96, 0x37, 0x33, 0xbe, 0xfc, 0x2a, 0xab, 0xca, 0xaf, 0x43, 0x3e, 0x50, 0xa5, 0x73, 0x27, - 0x73, 0x84, 0xb9, 0x33, 0xed, 0x63, 0x49, 0x2b, 0xba, 0x0a, 0x10, 0x4c, 0x4c, 0x7a, 0x3c, 0x90, - 0x1d, 0x3e, 0x86, 0xc1, 0xec, 0x16, 0xdb, 0xac, 0x00, 0x8b, 0x0c, 0x98, 0xeb, 0xe8, 0xa6, 0xe2, - 0x62, 0x63, 0x57, 0xe1, 0xae, 0x22, 0x94, 0xd9, 0xfb, 0x30, 0xb4, 0xb3, 0x1d, 0xdd, 0x6c, 0x62, - 0x63, 0xb7, 0xe6, 0xd3, 0x96, 0x72, 0x9f, 0x78, 0x7b, 0x69, 0x82, 0xcf, 0xa5, 0x89, 0x62, 0x83, - 0x1e, 0x51, 0xf3, 0x69, 0x80, 0x5d, 0x74, 0x1e, 0x32, 0xaa, 0xb8, 0xa0, 0x07, 0x07, 0x87, 0x4d, - 0xa3, 0x40, 0x95, 0xcd, 0xce, 0xb7, 0x7e, 0x67, 0x39, 0x56, 0xfc, 0xf9, 0x18, 0xa4, 0x6a, 0x37, - 0x1a, 0xaa, 0xee, 0xa0, 0x3a, 0xcc, 0x06, 0x01, 0x35, 0xee, 0xdc, 0x0c, 0x62, 0x50, 0x4c, 0xce, - 0xfa, 0xb0, 0x5d, 0xe3, 0xa1, 0x34, 0xbd, 0xfb, 0xc9, 0x9e, 0x8e, 0xd7, 0x61, 0x8a, 0x59, 0xe9, - 0xa2, 0x12, 0x4c, 0xda, 0xe4, 0x07, 0x3f, 0x91, 0x5f, 0x1c, 0x1a, 0x88, 0x54, 0xdf, 0x3f, 0x41, - 0x24, 0x90, 0xe2, 0xef, 0xc7, 0x00, 0x6a, 0x37, 0x6e, 0x6c, 0x39, 0xba, 0x6d, 0x60, 0xef, 0x7e, - 0xf5, 0x78, 0x0d, 0x8e, 0x85, 0xb6, 0x26, 0x8e, 0x36, 0x76, 0xaf, 0xe7, 0x82, 0xcd, 0x89, 0xa3, - 0x0d, 0x64, 0x6b, 0xb9, 0x9e, 0xcf, 0x96, 0x18, 0x9b, 0xad, 0xe6, 0x7a, 0x83, 0xdd, 0xd8, 0x84, - 0x6c, 0xd0, 0x7d, 0x17, 0xd5, 0x20, 0xed, 0xf1, 0xdf, 0xdc, 0x9b, 0xc5, 0xe1, 0xde, 0x14, 0x30, - 0xee, 0x51, 0x1f, 0x59, 0xfc, 0xbf, 0xc4, 0xa9, 0x7e, 0xc4, 0xfe, 0xe1, 0x0a, 0x23, 0x92, 0x7b, - 0x79, 0x6e, 0xbc, 0x1f, 0x15, 0x05, 0xe7, 0xea, 0xf1, 0xea, 0xc7, 0xe3, 0x30, 0xb7, 0x2d, 0xb2, - 0xcd, 0x1f, 0x5a, 0x4f, 0x34, 0x60, 0x0a, 0x9b, 0x9e, 0xa3, 0x53, 0x57, 0x90, 0xb1, 0x7e, 0x76, - 0xd8, 0x58, 0x0f, 0xe8, 0x0b, 0xfd, 0x9f, 0x45, 0xe2, 0x5c, 0x9b, 0xd3, 0xf4, 0x78, 0xe1, 0xdf, - 0xc5, 0xa1, 0x30, 0x0c, 0x89, 0x4e, 0xc1, 0x8c, 0xe6, 0x60, 0x2a, 0x50, 0x22, 0x87, 0x6b, 0x79, - 0x21, 0xe6, 0x49, 0x7f, 0x1d, 0x48, 0x01, 0x45, 0x02, 0x8b, 0xa8, 0x1e, 0xb9, 0x62, 0xca, 0x07, - 0x60, 0x9a, 0xf6, 0x31, 0xcc, 0xe8, 0xa6, 0xee, 0xe9, 0xaa, 0xa1, 0xec, 0xa8, 0x86, 0x6a, 0x6a, - 0xf7, 0x52, 0x59, 0xf6, 0x27, 0xea, 0x3c, 0x27, 0xad, 0x30, 0x4e, 0x74, 0x03, 0xa6, 0x04, 0x7d, - 0xf2, 0x3e, 0xd0, 0x0b, 0xb2, 0x50, 0x15, 0xf5, 0xdb, 0x71, 0x98, 0x95, 0x71, 0xeb, 0x8f, 0x96, - 0x5b, 0x7f, 0x14, 0x80, 0x4d, 0x38, 0x92, 0x07, 0xef, 0xc1, 0xb3, 0xfd, 0x13, 0x38, 0xc3, 0xf8, - 0x6a, 0xae, 0x17, 0xf2, 0xed, 0x37, 0xe2, 0x90, 0x0b, 0xfb, 0xf6, 0x8f, 0xc0, 0xba, 0x80, 0x56, - 0x83, 0x6c, 0x90, 0xe4, 0xff, 0x6d, 0x75, 0x48, 0x36, 0xe8, 0x8b, 0xba, 0xc3, 0xd3, 0xc0, 0xf7, - 0xe3, 0x90, 0x6a, 0xa8, 0x8e, 0xda, 0x71, 0xd1, 0xb5, 0xbe, 0x02, 0x4e, 0x9c, 0xb2, 0xf5, 0xfd, - 0x4f, 0x6d, 0xbe, 0xa9, 0x67, 0x21, 0xf7, 0xe9, 0x01, 0xf5, 0xdb, 0x63, 0x90, 0x27, 0x5b, 0xc4, - 0xd0, 0x03, 0xf9, 0x38, 0x7d, 0xcc, 0x48, 0xf6, 0x78, 0xc1, 0xd3, 0x20, 0xb4, 0x04, 0x59, 0xa2, - 0x16, 0x24, 0x3a, 0xa2, 0x03, 0x1d, 0xf5, 0x76, 0x9d, 0x49, 0xd0, 0x33, 0x80, 0xf6, 0xfc, 0x4d, - 0xbb, 0x12, 0xb8, 0x80, 0xe8, 0xcd, 0x06, 0x2d, 0x42, 0xfd, 0x21, 0x00, 0x62, 0x85, 0xc2, 0x5e, - 0xf2, 0x62, 0x7b, 0x9c, 0x0c, 0x91, 0xd4, 0xe8, 0x8b, 0x5e, 0x3f, 0xc1, 0x6a, 0xc1, 0x9e, 0xdd, - 0x23, 0x2f, 0xc3, 0xd7, 0x8e, 0x16, 0xa9, 0xdf, 0x7f, 0x77, 0x69, 0xe1, 0x40, 0xed, 0x18, 0xa5, - 0xe2, 0x00, 0xca, 0x22, 0xad, 0x0d, 0xa3, 0xbb, 0xce, 0x50, 0x04, 0x7f, 0x3e, 0x06, 0x28, 0x48, - 0xb9, 0x32, 0x76, 0x6d, 0xb2, 0xad, 0x21, 0x45, 0x6f, 0xa8, 0x42, 0x8d, 0x1d, 0x5e, 0xf4, 0x06, - 0x78, 0x51, 0xf4, 0x86, 0x66, 0xc4, 0xc5, 0x20, 0xc1, 0xc5, 0xf9, 0x18, 0x0e, 0x78, 0x43, 0x6f, - 0xa5, 0x6a, 0xe9, 0x02, 0xdd, 0x97, 0xc3, 0x26, 0x8a, 0xbf, 0x1d, 0x83, 0x93, 0x7d, 0xd1, 0xe4, - 0x1b, 0xfb, 0x27, 0x00, 0x39, 0xa1, 0x46, 0xfe, 0x6f, 0xf3, 0x98, 0xd1, 0x47, 0x0e, 0xce, 0x59, - 0xa7, 0x2f, 0x57, 0x7e, 0x58, 0x39, 0x9a, 0xbd, 0xb9, 0xf7, 0x4f, 0x62, 0x30, 0x1f, 0x36, 0xc6, - 0xef, 0xd6, 0x06, 0xe4, 0xc2, 0xb6, 0xf0, 0x0e, 0x3d, 0x3a, 0x4e, 0x87, 0x78, 0x5f, 0x22, 0x78, - 0xf4, 0x72, 0x30, 0x71, 0xd9, 0x61, 0xd1, 0x73, 0x63, 0xfb, 0x46, 0xd8, 0xd4, 0x3b, 0x81, 0x93, - 0xa2, 0x8a, 0x49, 0x36, 0x2c, 0xcb, 0x40, 0x7f, 0x12, 0x66, 0x4d, 0xcb, 0x53, 0x48, 0x94, 0xe3, - 0x96, 0xc2, 0x77, 0xae, 0x2c, 0xfb, 0xbd, 0x7c, 0x34, 0x97, 0x7d, 0xe7, 0xdd, 0xa5, 0x7e, 0xaa, - 0x1e, 0x3f, 0xce, 0x98, 0x96, 0x57, 0xa1, 0xed, 0x5b, 0x6c, 0x5f, 0xeb, 0xc0, 0x74, 0xf4, 0xd6, - 0x2c, 0x5b, 0xae, 0x1f, 0xf9, 0xd6, 0xd3, 0x87, 0xdd, 0x36, 0xb7, 0x13, 0xba, 0x27, 0x7b, 0xa7, - 0xe9, 0x7b, 0x6f, 0x2f, 0xc5, 0x9e, 0xfc, 0x6a, 0x0c, 0x20, 0xd8, 0xc2, 0xa3, 0xa7, 0xe1, 0x44, - 0x65, 0x73, 0xa3, 0xa6, 0x34, 0xb7, 0xca, 0x5b, 0xdb, 0xcd, 0xe8, 0x9b, 0xcf, 0xe2, 0x4c, 0xd8, - 0xb5, 0xb1, 0xa6, 0xef, 0xea, 0xb8, 0x85, 0x1e, 0x87, 0xf9, 0xa8, 0x36, 0xb9, 0xaa, 0xd7, 0xa4, - 0xd8, 0x42, 0xee, 0xce, 0xdd, 0xe5, 0x34, 0xab, 0x8e, 0x70, 0x0b, 0x9d, 0x86, 0x63, 0xfd, 0x7a, - 0xab, 0x1b, 0x57, 0xa4, 0xf8, 0xc2, 0xf4, 0x9d, 0xbb, 0xcb, 0x19, 0xbf, 0x8c, 0x42, 0x45, 0x40, - 0x61, 0x4d, 0xce, 0x97, 0x58, 0x80, 0x3b, 0x77, 0x97, 0x53, 0xcc, 0x6d, 0x0b, 0xc9, 0x4f, 0x7c, - 0x7e, 0x71, 0xa2, 0x72, 0x79, 0xe8, 0xa9, 0xef, 0xd3, 0x87, 0x7a, 0xec, 0xb6, 0x7f, 0x92, 0x1b, - 0x39, 0xea, 0xfd, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8c, 0xb0, 0x45, 0xd1, 0x08, 0x66, 0x00, - 0x00, + // 7545 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x7b, 0x90, 0x24, 0xc9, + 0x79, 0xd7, 0xf4, 0x73, 0xba, 0xbf, 0xee, 0x99, 0xa9, 0xc9, 0x99, 0xdd, 0xed, 0x9d, 0xbb, 0x9b, + 0x99, 0xeb, 0x7b, 0xec, 0xde, 0x6b, 0xf6, 0x6e, 0xef, 0x76, 0xf7, 0xb6, 0xd7, 0xd2, 0xd1, 0xaf, + 0xdd, 0x9d, 0xdd, 0x79, 0xf4, 0x55, 0xcf, 0xec, 0x3d, 0x0c, 0x14, 0x35, 0xd5, 0x39, 0x3d, 0x75, + 0x53, 0x5d, 0x55, 0xae, 0xaa, 0xde, 0xdd, 0xb9, 0x30, 0xc4, 0x29, 0xc4, 0x43, 0x5a, 0x02, 0x90, + 0x31, 0x81, 0x65, 0x59, 0x2b, 0xee, 0x2c, 0x83, 0x8c, 0x10, 0x60, 0x59, 0x42, 0x60, 0x1c, 0x80, + 0x80, 0x00, 0x84, 0xfe, 0x20, 0x64, 0xff, 0x81, 0x0d, 0x61, 0x0e, 0x73, 0x52, 0xe0, 0xc3, 0xc8, + 0x58, 0x88, 0x23, 0x80, 0x50, 0x98, 0x70, 0xe4, 0xab, 0x1e, 0xfd, 0x98, 0xee, 0x39, 0xed, 0x9d, + 0x1d, 0xe1, 0xbf, 0xa6, 0xf3, 0xcb, 0xef, 0xf7, 0xcb, 0x2f, 0xbf, 0xfc, 0x32, 0xf3, 0xcb, 0xac, + 0xaa, 0x81, 0x7f, 0x79, 0x09, 0x96, 0xdb, 0x96, 0xd5, 0x36, 0xf0, 0x19, 0xdb, 0xb1, 0x3c, 0x6b, + 0xa7, 0xbb, 0x7b, 0xa6, 0x85, 0x5d, 0xcd, 0xd1, 0x6d, 0xcf, 0x72, 0x56, 0xa8, 0x0c, 0xcd, 0x30, + 0x8d, 0x15, 0xa1, 0x51, 0x5c, 0x87, 0xd9, 0xcb, 0xba, 0x81, 0x6b, 0xbe, 0x62, 0x13, 0x7b, 0xe8, + 0x79, 0x48, 0xee, 0xea, 0x06, 0x2e, 0xc4, 0x96, 0x13, 0xa7, 0x73, 0x67, 0x1f, 0x5e, 0xe9, 0x01, + 0xad, 0x44, 0x11, 0x0d, 0x22, 0x96, 0x29, 0xa2, 0xf8, 0x9d, 0x24, 0xcc, 0x0d, 0xa8, 0x45, 0x08, + 0x92, 0xa6, 0xda, 0x21, 0x8c, 0xb1, 0xd3, 0x59, 0x99, 0xfe, 0x46, 0x05, 0x98, 0xb4, 0x55, 0x6d, + 0x5f, 0x6d, 0xe3, 0x42, 0x9c, 0x8a, 0x45, 0x11, 0x2d, 0x02, 0xb4, 0xb0, 0x8d, 0xcd, 0x16, 0x36, + 0xb5, 0x83, 0x42, 0x62, 0x39, 0x71, 0x3a, 0x2b, 0x87, 0x24, 0xe8, 0x09, 0x98, 0xb5, 0xbb, 0x3b, + 0x86, 0xae, 0x29, 0x21, 0x35, 0x58, 0x4e, 0x9c, 0x4e, 0xc9, 0x12, 0xab, 0xa8, 0x05, 0xca, 0xa7, + 0x60, 0xe6, 0x16, 0x56, 0xf7, 0xc3, 0xaa, 0x39, 0xaa, 0x3a, 0x4d, 0xc4, 0x21, 0xc5, 0x2a, 0xe4, + 0x3b, 0xd8, 0x75, 0xd5, 0x36, 0x56, 0xbc, 0x03, 0x1b, 0x17, 0x92, 0xb4, 0xf7, 0xcb, 0x7d, 0xbd, + 0xef, 0xed, 0x79, 0x8e, 0xa3, 0xb6, 0x0e, 0x6c, 0x8c, 0xca, 0x90, 0xc5, 0x66, 0xb7, 0xc3, 0x18, + 0x52, 0x43, 0xfc, 0x57, 0x37, 0xbb, 0x9d, 0x5e, 0x96, 0x0c, 0x81, 0x71, 0x8a, 0x49, 0x17, 0x3b, + 0x37, 0x75, 0x0d, 0x17, 0xd2, 0x94, 0xe0, 0x54, 0x1f, 0x41, 0x93, 0xd5, 0xf7, 0x72, 0x08, 0x1c, + 0xaa, 0x42, 0x16, 0xdf, 0xf6, 0xb0, 0xe9, 0xea, 0x96, 0x59, 0x98, 0xa4, 0x24, 0x8f, 0x0c, 0x18, + 0x45, 0x6c, 0xb4, 0x7a, 0x29, 0x02, 0x1c, 0x3a, 0x0f, 0x93, 0x96, 0xed, 0xe9, 0x96, 0xe9, 0x16, + 0x32, 0xcb, 0xb1, 0xd3, 0xb9, 0xb3, 0xf7, 0x0f, 0x0c, 0x84, 0x4d, 0xa6, 0x23, 0x0b, 0x65, 0xb4, + 0x0a, 0x92, 0x6b, 0x75, 0x1d, 0x0d, 0x2b, 0x9a, 0xd5, 0xc2, 0x8a, 0x6e, 0xee, 0x5a, 0x85, 0x2c, + 0x25, 0x58, 0xea, 0xef, 0x08, 0x55, 0xac, 0x5a, 0x2d, 0xbc, 0x6a, 0xee, 0x5a, 0xf2, 0xb4, 0x1b, + 0x29, 0xa3, 0xe3, 0x90, 0x76, 0x0f, 0x4c, 0x4f, 0xbd, 0x5d, 0xc8, 0xd3, 0x08, 0xe1, 0xa5, 0xe2, + 0x2f, 0xa5, 0x61, 0x66, 0x9c, 0x10, 0xbb, 0x04, 0xa9, 0x5d, 0xd2, 0xcb, 0x42, 0xfc, 0x28, 0x3e, + 0x60, 0x98, 0xa8, 0x13, 0xd3, 0xef, 0xd3, 0x89, 0x65, 0xc8, 0x99, 0xd8, 0xf5, 0x70, 0x8b, 0x45, + 0x44, 0x62, 0xcc, 0x98, 0x02, 0x06, 0xea, 0x0f, 0xa9, 0xe4, 0xfb, 0x0a, 0xa9, 0x97, 0x61, 0xc6, + 0x37, 0x49, 0x71, 0x54, 0xb3, 0x2d, 0x62, 0xf3, 0xcc, 0x28, 0x4b, 0x56, 0xea, 0x02, 0x27, 0x13, + 0x98, 0x3c, 0x8d, 0x23, 0x65, 0x54, 0x03, 0xb0, 0x4c, 0x6c, 0xed, 0x2a, 0x2d, 0xac, 0x19, 0x85, + 0xcc, 0x10, 0x2f, 0x6d, 0x12, 0x95, 0x3e, 0x2f, 0x59, 0x4c, 0xaa, 0x19, 0xe8, 0x62, 0x10, 0x6a, + 0x93, 0x43, 0x22, 0x65, 0x9d, 0x4d, 0xb2, 0xbe, 0x68, 0xdb, 0x86, 0x69, 0x07, 0x93, 0xb8, 0xc7, + 0x2d, 0xde, 0xb3, 0x2c, 0x35, 0x62, 0x65, 0x64, 0xcf, 0x64, 0x0e, 0x63, 0x1d, 0x9b, 0x72, 0xc2, + 0x45, 0xf4, 0x10, 0xf8, 0x02, 0x85, 0x86, 0x15, 0xd0, 0x55, 0x28, 0x2f, 0x84, 0x1b, 0x6a, 0x07, + 0x2f, 0xbc, 0x0e, 0xd3, 0x51, 0xf7, 0xa0, 0x79, 0x48, 0xb9, 0x9e, 0xea, 0x78, 0x34, 0x0a, 0x53, + 0x32, 0x2b, 0x20, 0x09, 0x12, 0xd8, 0x6c, 0xd1, 0x55, 0x2e, 0x25, 0x93, 0x9f, 0xe8, 0x8f, 0x05, + 0x1d, 0x4e, 0xd0, 0x0e, 0x3f, 0xda, 0x3f, 0xa2, 0x11, 0xe6, 0xde, 0x7e, 0x2f, 0x5c, 0x80, 0xa9, + 0x48, 0x07, 0xc6, 0x6d, 0xba, 0xf8, 0xe3, 0x70, 0x6c, 0x20, 0x35, 0x7a, 0x19, 0xe6, 0xbb, 0xa6, + 0x6e, 0x7a, 0xd8, 0xb1, 0x1d, 0x4c, 0x22, 0x96, 0x35, 0x55, 0xf8, 0xad, 0xc9, 0x21, 0x31, 0xb7, + 0x1d, 0xd6, 0x66, 0x2c, 0xf2, 0x5c, 0xb7, 0x5f, 0xf8, 0x78, 0x36, 0xf3, 0xee, 0xa4, 0xf4, 0xc6, + 0x1b, 0x6f, 0xbc, 0x11, 0x2f, 0xfe, 0xf3, 0x34, 0xcc, 0x0f, 0x9a, 0x33, 0x03, 0xa7, 0xef, 0x71, + 0x48, 0x9b, 0xdd, 0xce, 0x0e, 0x76, 0xa8, 0x93, 0x52, 0x32, 0x2f, 0xa1, 0x32, 0xa4, 0x0c, 0x75, + 0x07, 0x1b, 0x85, 0xe4, 0x72, 0xec, 0xf4, 0xf4, 0xd9, 0x27, 0xc6, 0x9a, 0x95, 0x2b, 0x6b, 0x04, + 0x22, 0x33, 0x24, 0xfa, 0x28, 0x24, 0xf9, 0x12, 0x4d, 0x18, 0x1e, 0x1f, 0x8f, 0x81, 0xcc, 0x25, + 0x99, 0xe2, 0xd0, 0x7d, 0x90, 0x25, 0x7f, 0x59, 0x6c, 0xa4, 0xa9, 0xcd, 0x19, 0x22, 0x20, 0x71, + 0x81, 0x16, 0x20, 0x43, 0xa7, 0x49, 0x0b, 0x8b, 0xad, 0xcd, 0x2f, 0x93, 0xc0, 0x6a, 0xe1, 0x5d, + 0xb5, 0x6b, 0x78, 0xca, 0x4d, 0xd5, 0xe8, 0x62, 0x1a, 0xf0, 0x59, 0x39, 0xcf, 0x85, 0x37, 0x88, + 0x0c, 0x2d, 0x41, 0x8e, 0xcd, 0x2a, 0xdd, 0x6c, 0xe1, 0xdb, 0x74, 0xf5, 0x4c, 0xc9, 0x6c, 0xa2, + 0xad, 0x12, 0x09, 0x69, 0xfe, 0x35, 0xd7, 0x32, 0x45, 0x68, 0xd2, 0x26, 0x88, 0x80, 0x36, 0x7f, + 0xa1, 0x77, 0xe1, 0x7e, 0x60, 0x70, 0xf7, 0xfa, 0xe6, 0xd2, 0x29, 0x98, 0xa1, 0x1a, 0xcf, 0xf2, + 0xa1, 0x57, 0x8d, 0xc2, 0xec, 0x72, 0xec, 0x74, 0x46, 0x9e, 0x66, 0xe2, 0x4d, 0x2e, 0x2d, 0x7e, + 0x2d, 0x0e, 0x49, 0xba, 0xb0, 0xcc, 0x40, 0x6e, 0xeb, 0x95, 0x46, 0x5d, 0xa9, 0x6d, 0x6e, 0x57, + 0xd6, 0xea, 0x52, 0x0c, 0x4d, 0x03, 0x50, 0xc1, 0xe5, 0xb5, 0xcd, 0xf2, 0x96, 0x14, 0xf7, 0xcb, + 0xab, 0x1b, 0x5b, 0xe7, 0x9f, 0x93, 0x12, 0x3e, 0x60, 0x9b, 0x09, 0x92, 0x61, 0x85, 0x67, 0xcf, + 0x4a, 0x29, 0x24, 0x41, 0x9e, 0x11, 0xac, 0xbe, 0x5c, 0xaf, 0x9d, 0x7f, 0x4e, 0x4a, 0x47, 0x25, + 0xcf, 0x9e, 0x95, 0x26, 0xd1, 0x14, 0x64, 0xa9, 0xa4, 0xb2, 0xb9, 0xb9, 0x26, 0x65, 0x7c, 0xce, + 0xe6, 0x96, 0xbc, 0xba, 0x71, 0x45, 0xca, 0xfa, 0x9c, 0x57, 0xe4, 0xcd, 0xed, 0x86, 0x04, 0x3e, + 0xc3, 0x7a, 0xbd, 0xd9, 0x2c, 0x5f, 0xa9, 0x4b, 0x39, 0x5f, 0xa3, 0xf2, 0xca, 0x56, 0xbd, 0x29, + 0xe5, 0x23, 0x66, 0x3d, 0x7b, 0x56, 0x9a, 0xf2, 0x9b, 0xa8, 0x6f, 0x6c, 0xaf, 0x4b, 0xd3, 0x68, + 0x16, 0xa6, 0x58, 0x13, 0xc2, 0x88, 0x99, 0x1e, 0xd1, 0xf9, 0xe7, 0x24, 0x29, 0x30, 0x84, 0xb1, + 0xcc, 0x46, 0x04, 0xe7, 0x9f, 0x93, 0x50, 0xb1, 0x0a, 0x29, 0x1a, 0x86, 0x08, 0xc1, 0xf4, 0x5a, + 0xb9, 0x52, 0x5f, 0x53, 0x36, 0x1b, 0x5b, 0xab, 0x9b, 0x1b, 0xe5, 0x35, 0x29, 0x16, 0xc8, 0xe4, + 0xfa, 0x8b, 0xdb, 0xab, 0x72, 0xbd, 0x26, 0xc5, 0xc3, 0xb2, 0x46, 0xbd, 0xbc, 0x55, 0xaf, 0x49, + 0x89, 0xa2, 0x06, 0xf3, 0x83, 0x16, 0xd4, 0x81, 0x53, 0x28, 0x14, 0x0b, 0xf1, 0x21, 0xb1, 0x40, + 0xb9, 0x7a, 0x63, 0xa1, 0xf8, 0xed, 0x38, 0xcc, 0x0d, 0xd8, 0x54, 0x06, 0x36, 0xf2, 0x02, 0xa4, + 0x58, 0x2c, 0xb3, 0x6d, 0xf6, 0xb1, 0x81, 0xbb, 0x13, 0x8d, 0xec, 0xbe, 0xad, 0x96, 0xe2, 0xc2, + 0xa9, 0x46, 0x62, 0x48, 0xaa, 0x41, 0x28, 0xfa, 0x02, 0xf6, 0x4f, 0xf4, 0x2d, 0xfe, 0x6c, 0x7f, + 0x3c, 0x3f, 0xce, 0xfe, 0x48, 0x65, 0x47, 0xdb, 0x04, 0x52, 0x03, 0x36, 0x81, 0x4b, 0x30, 0xdb, + 0x47, 0x34, 0xf6, 0x62, 0xfc, 0xf1, 0x18, 0x14, 0x86, 0x39, 0x67, 0xc4, 0x92, 0x18, 0x8f, 0x2c, + 0x89, 0x97, 0x7a, 0x3d, 0xf8, 0xe0, 0xf0, 0x41, 0xe8, 0x1b, 0xeb, 0x2f, 0xc4, 0xe0, 0xf8, 0xe0, + 0x94, 0x72, 0xa0, 0x0d, 0x1f, 0x85, 0x74, 0x07, 0x7b, 0x7b, 0x96, 0x48, 0xab, 0x1e, 0x1d, 0xb0, + 0x59, 0x93, 0xea, 0xde, 0xc1, 0xe6, 0xa8, 0xf0, 0x6e, 0x9f, 0x18, 0x96, 0x17, 0x32, 0x6b, 0xfa, + 0x2c, 0xfd, 0x64, 0x1c, 0x8e, 0x0d, 0x24, 0x1f, 0x68, 0xe8, 0x03, 0x00, 0xba, 0x69, 0x77, 0x3d, + 0x96, 0x3a, 0xb1, 0x95, 0x38, 0x4b, 0x25, 0x74, 0xf1, 0x22, 0xab, 0x6c, 0xd7, 0xf3, 0xeb, 0x13, + 0xb4, 0x1e, 0x98, 0x88, 0x2a, 0x3c, 0x1f, 0x18, 0x9a, 0xa4, 0x86, 0x2e, 0x0e, 0xe9, 0x69, 0x5f, + 0x60, 0x3e, 0x0d, 0x92, 0x66, 0xe8, 0xd8, 0xf4, 0x14, 0xd7, 0x73, 0xb0, 0xda, 0xd1, 0xcd, 0x36, + 0xdd, 0x6a, 0x32, 0xa5, 0xd4, 0xae, 0x6a, 0xb8, 0x58, 0x9e, 0x61, 0xd5, 0x4d, 0x51, 0x4b, 0x10, + 0x34, 0x80, 0x9c, 0x10, 0x22, 0x1d, 0x41, 0xb0, 0x6a, 0x1f, 0x51, 0xfc, 0x89, 0x2c, 0xe4, 0x42, + 0x09, 0x38, 0x7a, 0x10, 0xf2, 0xaf, 0xa9, 0x37, 0x55, 0x45, 0x1c, 0xaa, 0x98, 0x27, 0x72, 0x44, + 0xd6, 0xe0, 0x07, 0xab, 0xa7, 0x61, 0x9e, 0xaa, 0x58, 0x5d, 0x0f, 0x3b, 0x8a, 0x66, 0xa8, 0xae, + 0x4b, 0x9d, 0x96, 0xa1, 0xaa, 0x88, 0xd4, 0x6d, 0x92, 0xaa, 0xaa, 0xa8, 0x41, 0xe7, 0x60, 0x8e, + 0x22, 0x3a, 0x5d, 0xc3, 0xd3, 0x6d, 0x03, 0x2b, 0xe4, 0x98, 0xe7, 0xd2, 0x2d, 0xc7, 0xb7, 0x6c, + 0x96, 0x68, 0xac, 0x73, 0x05, 0x62, 0x91, 0x8b, 0x6a, 0xf0, 0x00, 0x85, 0xb5, 0xb1, 0x89, 0x1d, + 0xd5, 0xc3, 0x0a, 0xfe, 0xb1, 0xae, 0x6a, 0xb8, 0x8a, 0x6a, 0xb6, 0x94, 0x3d, 0xd5, 0xdd, 0x2b, + 0xcc, 0x13, 0x82, 0x4a, 0xbc, 0x10, 0x93, 0x4f, 0x12, 0xc5, 0x2b, 0x5c, 0xaf, 0x4e, 0xd5, 0xca, + 0x66, 0xeb, 0xaa, 0xea, 0xee, 0xa1, 0x12, 0x1c, 0xa7, 0x2c, 0xae, 0xe7, 0xe8, 0x66, 0x5b, 0xd1, + 0xf6, 0xb0, 0xb6, 0xaf, 0x74, 0xbd, 0xdd, 0xe7, 0x0b, 0xf7, 0x85, 0xdb, 0xa7, 0x16, 0x36, 0xa9, + 0x4e, 0x95, 0xa8, 0x6c, 0x7b, 0xbb, 0xcf, 0xa3, 0x26, 0xe4, 0xc9, 0x60, 0x74, 0xf4, 0xd7, 0xb1, + 0xb2, 0x6b, 0x39, 0x74, 0x0f, 0x9d, 0x1e, 0xb0, 0x34, 0x85, 0x3c, 0xb8, 0xb2, 0xc9, 0x01, 0xeb, + 0x56, 0x0b, 0x97, 0x52, 0xcd, 0x46, 0xbd, 0x5e, 0x93, 0x73, 0x82, 0xe5, 0xb2, 0xe5, 0x90, 0x80, + 0x6a, 0x5b, 0xbe, 0x83, 0x73, 0x2c, 0xa0, 0xda, 0x96, 0x70, 0xef, 0x39, 0x98, 0xd3, 0x34, 0xd6, + 0x67, 0x5d, 0x53, 0xf8, 0x61, 0xcc, 0x2d, 0x48, 0x11, 0x67, 0x69, 0xda, 0x15, 0xa6, 0xc0, 0x63, + 0xdc, 0x45, 0x17, 0xe1, 0x58, 0xe0, 0xac, 0x30, 0x70, 0xb6, 0xaf, 0x97, 0xbd, 0xd0, 0x73, 0x30, + 0x67, 0x1f, 0xf4, 0x03, 0x51, 0xa4, 0x45, 0xfb, 0xa0, 0x17, 0x76, 0x01, 0xe6, 0xed, 0x3d, 0xbb, + 0x1f, 0xf7, 0x78, 0x18, 0x87, 0xec, 0x3d, 0xbb, 0x17, 0xf8, 0x08, 0x3d, 0x99, 0x3b, 0x58, 0x53, + 0x3d, 0xdc, 0x2a, 0x9c, 0x08, 0xab, 0x87, 0x2a, 0xd0, 0x0a, 0x48, 0x9a, 0xa6, 0x60, 0x53, 0xdd, + 0x31, 0xb0, 0xa2, 0x3a, 0xd8, 0x54, 0xdd, 0xc2, 0x12, 0x55, 0x4e, 0x7a, 0x4e, 0x17, 0xcb, 0xd3, + 0x9a, 0x56, 0xa7, 0x95, 0x65, 0x5a, 0x87, 0x1e, 0x87, 0x59, 0x6b, 0xe7, 0x35, 0x8d, 0x45, 0xa4, + 0x62, 0x3b, 0x78, 0x57, 0xbf, 0x5d, 0x78, 0x98, 0xba, 0x77, 0x86, 0x54, 0xd0, 0x78, 0x6c, 0x50, + 0x31, 0x7a, 0x0c, 0x24, 0xcd, 0xdd, 0x53, 0x1d, 0x9b, 0x2e, 0xc9, 0xae, 0xad, 0x6a, 0xb8, 0xf0, + 0x08, 0x53, 0x65, 0xf2, 0x0d, 0x21, 0x26, 0x33, 0xc2, 0xbd, 0xa5, 0xef, 0x7a, 0x82, 0xf1, 0x14, + 0x9b, 0x11, 0x54, 0xc6, 0xd9, 0x4e, 0x83, 0x44, 0x3c, 0x11, 0x69, 0xf8, 0x34, 0x55, 0x9b, 0xb6, + 0xf7, 0xec, 0x70, 0xbb, 0x0f, 0xc1, 0x14, 0xd1, 0x0c, 0x1a, 0x7d, 0x8c, 0x25, 0x6e, 0xf6, 0x5e, + 0xa8, 0xc5, 0xe7, 0xe0, 0x38, 0x51, 0xea, 0x60, 0x4f, 0x6d, 0xa9, 0x9e, 0x1a, 0xd2, 0x7e, 0x92, + 0x6a, 0x13, 0xb7, 0xaf, 0xf3, 0xca, 0x88, 0x9d, 0x4e, 0x77, 0xe7, 0xc0, 0x0f, 0xac, 0xa7, 0x98, + 0x9d, 0x44, 0x26, 0x42, 0xeb, 0x03, 0x4b, 0xce, 0x8b, 0x25, 0xc8, 0x87, 0xe3, 0x1e, 0x65, 0x81, + 0x45, 0xbe, 0x14, 0x23, 0x49, 0x50, 0x75, 0xb3, 0x46, 0xd2, 0x97, 0x57, 0xeb, 0x52, 0x9c, 0xa4, + 0x51, 0x6b, 0xab, 0x5b, 0x75, 0x45, 0xde, 0xde, 0xd8, 0x5a, 0x5d, 0xaf, 0x4b, 0x89, 0x50, 0x62, + 0x7f, 0x2d, 0x99, 0x79, 0x54, 0x3a, 0x45, 0xb2, 0x86, 0xe9, 0xe8, 0x49, 0x0d, 0xfd, 0x08, 0x9c, + 0x10, 0xd7, 0x2a, 0x2e, 0xf6, 0x94, 0x5b, 0xba, 0x43, 0x27, 0x64, 0x47, 0x65, 0x9b, 0xa3, 0x1f, + 0x3f, 0xf3, 0x5c, 0xab, 0x89, 0xbd, 0x97, 0x74, 0x87, 0x4c, 0xb7, 0x8e, 0xea, 0xa1, 0x35, 0x58, + 0x32, 0x2d, 0xc5, 0xf5, 0x54, 0xb3, 0xa5, 0x3a, 0x2d, 0x25, 0xb8, 0xd0, 0x52, 0x54, 0x4d, 0xc3, + 0xae, 0x6b, 0xb1, 0x8d, 0xd0, 0x67, 0xb9, 0xdf, 0xb4, 0x9a, 0x5c, 0x39, 0xd8, 0x21, 0xca, 0x5c, + 0xb5, 0x27, 0x7c, 0x13, 0xc3, 0xc2, 0xf7, 0x3e, 0xc8, 0x76, 0x54, 0x5b, 0xc1, 0xa6, 0xe7, 0x1c, + 0xd0, 0xfc, 0x3c, 0x23, 0x67, 0x3a, 0xaa, 0x5d, 0x27, 0xe5, 0x0f, 0xe5, 0x98, 0x74, 0x2d, 0x99, + 0x49, 0x4a, 0xa9, 0x6b, 0xc9, 0x4c, 0x4a, 0x4a, 0x5f, 0x4b, 0x66, 0xd2, 0xd2, 0xe4, 0xb5, 0x64, + 0x26, 0x23, 0x65, 0xaf, 0x25, 0x33, 0x59, 0x09, 0x8a, 0xef, 0x24, 0x20, 0x1f, 0xce, 0xe0, 0xc9, + 0x81, 0x48, 0xa3, 0x7b, 0x58, 0x8c, 0xae, 0x72, 0x0f, 0x1d, 0x9a, 0xef, 0xaf, 0x54, 0xc9, 0xe6, + 0x56, 0x4a, 0xb3, 0x74, 0x59, 0x66, 0x48, 0x92, 0x58, 0x90, 0xf0, 0xc3, 0x2c, 0x3d, 0xc9, 0xc8, + 0xbc, 0x84, 0xae, 0x40, 0xfa, 0x35, 0x97, 0x72, 0xa7, 0x29, 0xf7, 0xc3, 0x87, 0x73, 0x5f, 0x6b, + 0x52, 0xf2, 0xec, 0xb5, 0xa6, 0xb2, 0xb1, 0x29, 0xaf, 0x97, 0xd7, 0x64, 0x0e, 0x47, 0x27, 0x21, + 0x69, 0xa8, 0xaf, 0x1f, 0x44, 0xb7, 0x41, 0x2a, 0x1a, 0x77, 0x58, 0x4e, 0x42, 0xf2, 0x16, 0x56, + 0xf7, 0xa3, 0x9b, 0x0f, 0x15, 0x7d, 0x80, 0xd3, 0xe3, 0x0c, 0xa4, 0xa8, 0xbf, 0x10, 0x00, 0xf7, + 0x98, 0x34, 0x81, 0x32, 0x90, 0xac, 0x6e, 0xca, 0x64, 0x8a, 0x48, 0x90, 0x67, 0x52, 0xa5, 0xb1, + 0x5a, 0xaf, 0xd6, 0xa5, 0x78, 0xf1, 0x1c, 0xa4, 0x99, 0x13, 0xc8, 0xf4, 0xf1, 0xdd, 0x20, 0x4d, + 0xf0, 0x22, 0xe7, 0x88, 0x89, 0xda, 0xed, 0xf5, 0x4a, 0x5d, 0x96, 0xe2, 0x7d, 0x83, 0x5f, 0x74, + 0x21, 0x1f, 0xce, 0xcc, 0x3f, 0x9c, 0xe3, 0xf9, 0xd7, 0x63, 0x90, 0x0b, 0x65, 0xda, 0x24, 0x45, + 0x52, 0x0d, 0xc3, 0xba, 0xa5, 0xa8, 0x86, 0xae, 0xba, 0x3c, 0x34, 0x80, 0x8a, 0xca, 0x44, 0x32, + 0xee, 0xd0, 0x7d, 0x48, 0x93, 0x26, 0x25, 0xa5, 0x8b, 0x9f, 0x8b, 0x81, 0xd4, 0x9b, 0xea, 0xf6, + 0x98, 0x19, 0xfb, 0x83, 0x34, 0xb3, 0xf8, 0xd9, 0x18, 0x4c, 0x47, 0xf3, 0xdb, 0x1e, 0xf3, 0x1e, + 0xfc, 0x03, 0x35, 0xef, 0x37, 0xe3, 0x30, 0x15, 0xc9, 0x6a, 0xc7, 0xb5, 0xee, 0xc7, 0x60, 0x56, + 0x6f, 0xe1, 0x8e, 0x6d, 0x79, 0xd8, 0xd4, 0x0e, 0x14, 0x03, 0xdf, 0xc4, 0x46, 0xa1, 0x48, 0x17, + 0x8d, 0x33, 0x87, 0xe7, 0xcd, 0x2b, 0xab, 0x01, 0x6e, 0x8d, 0xc0, 0x4a, 0x73, 0xab, 0xb5, 0xfa, + 0x7a, 0x63, 0x73, 0xab, 0xbe, 0x51, 0x7d, 0x45, 0xd9, 0xde, 0xb8, 0xbe, 0xb1, 0xf9, 0xd2, 0x86, + 0x2c, 0xe9, 0x3d, 0x6a, 0x1f, 0xe0, 0xb4, 0x6f, 0x80, 0xd4, 0x6b, 0x14, 0x3a, 0x01, 0x83, 0xcc, + 0x92, 0x26, 0xd0, 0x1c, 0xcc, 0x6c, 0x6c, 0x2a, 0xcd, 0xd5, 0x5a, 0x5d, 0xa9, 0x5f, 0xbe, 0x5c, + 0xaf, 0x6e, 0x35, 0xd9, 0x4d, 0x88, 0xaf, 0xbd, 0x15, 0x99, 0xe0, 0xc5, 0xcf, 0x24, 0x60, 0x6e, + 0x80, 0x25, 0xa8, 0xcc, 0xcf, 0x30, 0xec, 0x58, 0xf5, 0xd4, 0x38, 0xd6, 0xaf, 0x90, 0x2c, 0xa2, + 0xa1, 0x3a, 0x1e, 0x3f, 0xf2, 0x3c, 0x06, 0xc4, 0x4b, 0xa6, 0xa7, 0xef, 0xea, 0xd8, 0xe1, 0x37, + 0x4c, 0xec, 0x60, 0x33, 0x13, 0xc8, 0xd9, 0x25, 0xd3, 0x93, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, + 0x26, 0x56, 0x74, 0x53, 0x5c, 0x47, 0x91, 0x83, 0x4e, 0x52, 0x96, 0x44, 0xcd, 0xaa, 0xe9, 0xf9, + 0xda, 0x26, 0x6e, 0xab, 0x3d, 0xda, 0x64, 0x31, 0x4f, 0xc8, 0x92, 0xa8, 0xf1, 0xb5, 0x1f, 0x84, + 0x7c, 0xcb, 0xea, 0x92, 0xec, 0x8f, 0xe9, 0x91, 0xbd, 0x23, 0x26, 0xe7, 0x98, 0xcc, 0x57, 0xe1, + 0x79, 0x7d, 0x70, 0x0f, 0x96, 0x97, 0x73, 0x4c, 0xc6, 0x54, 0x4e, 0xc1, 0x8c, 0xda, 0x6e, 0x3b, + 0x84, 0x5c, 0x10, 0xb1, 0x93, 0xca, 0xb4, 0x2f, 0xa6, 0x8a, 0x0b, 0xd7, 0x20, 0x23, 0xfc, 0x40, + 0x36, 0x6f, 0xe2, 0x09, 0xc5, 0x66, 0xc7, 0xef, 0xf8, 0xe9, 0xac, 0x9c, 0x31, 0x45, 0xe5, 0x83, + 0x90, 0xd7, 0x5d, 0x25, 0xb8, 0xd6, 0x8f, 0x2f, 0xc7, 0x4f, 0x67, 0xe4, 0x9c, 0xee, 0xfa, 0x57, + 0xa2, 0xc5, 0x2f, 0xc4, 0x61, 0x3a, 0xfa, 0x58, 0x02, 0xd5, 0x20, 0x63, 0x58, 0x9a, 0x4a, 0x43, + 0x8b, 0x3d, 0x13, 0x3b, 0x3d, 0xe2, 0x49, 0xc6, 0xca, 0x1a, 0xd7, 0x97, 0x7d, 0xe4, 0xc2, 0xbf, + 0x8b, 0x41, 0x46, 0x88, 0xd1, 0x71, 0x48, 0xda, 0xaa, 0xb7, 0x47, 0xe9, 0x52, 0x95, 0xb8, 0x14, + 0x93, 0x69, 0x99, 0xc8, 0x5d, 0x5b, 0x35, 0x69, 0x08, 0x70, 0x39, 0x29, 0x93, 0x71, 0x35, 0xb0, + 0xda, 0xa2, 0xc7, 0x20, 0xab, 0xd3, 0xc1, 0xa6, 0xe7, 0x8a, 0x71, 0xe5, 0xf2, 0x2a, 0x17, 0xa3, + 0x27, 0x60, 0xd6, 0x73, 0x54, 0xdd, 0x88, 0xe8, 0x26, 0xa9, 0xae, 0x24, 0x2a, 0x7c, 0xe5, 0x12, + 0x9c, 0x14, 0xbc, 0x2d, 0xec, 0xa9, 0xda, 0x1e, 0x6e, 0x05, 0xa0, 0x34, 0xbd, 0xee, 0x38, 0xc1, + 0x15, 0x6a, 0xbc, 0x5e, 0x60, 0x8b, 0xbf, 0x12, 0x83, 0x59, 0x71, 0x70, 0x6b, 0xf9, 0xce, 0x5a, + 0x07, 0x50, 0x4d, 0xd3, 0xf2, 0xc2, 0xee, 0xea, 0x0f, 0xe5, 0x3e, 0xdc, 0x4a, 0xd9, 0x07, 0xc9, + 0x21, 0x82, 0x85, 0x0e, 0x40, 0x50, 0x33, 0xd4, 0x6d, 0x4b, 0x90, 0xe3, 0xcf, 0x9c, 0xe8, 0x83, + 0x4b, 0x76, 0xd4, 0x07, 0x26, 0x22, 0x27, 0x3c, 0x34, 0x0f, 0xa9, 0x1d, 0xdc, 0xd6, 0x4d, 0x7e, + 0x93, 0xcc, 0x0a, 0xe2, 0x42, 0x26, 0xe9, 0x5f, 0xc8, 0x54, 0xfe, 0x0c, 0xcc, 0x69, 0x56, 0xa7, + 0xd7, 0xdc, 0x8a, 0xd4, 0x73, 0xdd, 0xe0, 0x5e, 0x8d, 0xbd, 0xfa, 0x14, 0x57, 0x6a, 0x5b, 0x86, + 0x6a, 0xb6, 0x57, 0x2c, 0xa7, 0x1d, 0x3c, 0x78, 0x25, 0x19, 0x8f, 0x1b, 0x7a, 0xfc, 0x6a, 0xef, + 0xfc, 0xdf, 0x58, 0xec, 0x67, 0xe3, 0x89, 0x2b, 0x8d, 0xca, 0x17, 0xe3, 0x0b, 0x57, 0x18, 0xb0, + 0x21, 0x9c, 0x21, 0xe3, 0x5d, 0x03, 0x6b, 0xa4, 0x83, 0xf0, 0x3b, 0x4f, 0xc0, 0x7c, 0xdb, 0x6a, + 0x5b, 0x94, 0xe9, 0x0c, 0xf9, 0xc5, 0x9f, 0xdc, 0x66, 0x7d, 0xe9, 0xc2, 0xc8, 0xc7, 0xbc, 0xa5, + 0x0d, 0x98, 0xe3, 0xca, 0x0a, 0x7d, 0x74, 0xc4, 0x0e, 0x36, 0xe8, 0xd0, 0x5b, 0xb5, 0xc2, 0x97, + 0xbf, 0x43, 0xb7, 0x6f, 0x79, 0x96, 0x43, 0x49, 0x1d, 0x3b, 0xfb, 0x94, 0x64, 0x38, 0x16, 0xe1, + 0x63, 0x93, 0x14, 0x3b, 0x23, 0x18, 0xff, 0x15, 0x67, 0x9c, 0x0b, 0x31, 0x36, 0x39, 0xb4, 0x54, + 0x85, 0xa9, 0xa3, 0x70, 0xfd, 0x6b, 0xce, 0x95, 0xc7, 0x61, 0x92, 0x2b, 0x30, 0x43, 0x49, 0xb4, + 0xae, 0xeb, 0x59, 0x1d, 0xba, 0x02, 0x1e, 0x4e, 0xf3, 0x6f, 0xbe, 0xc3, 0x66, 0xcd, 0x34, 0x81, + 0x55, 0x7d, 0x54, 0xa9, 0x04, 0xf4, 0x69, 0x59, 0x0b, 0x6b, 0xc6, 0x08, 0x86, 0x6f, 0x70, 0x43, + 0x7c, 0xfd, 0xd2, 0x0d, 0x98, 0x27, 0xbf, 0xe9, 0x02, 0x15, 0xb6, 0x64, 0xf4, 0x15, 0x5c, 0xe1, + 0x57, 0x3e, 0xce, 0x26, 0xe6, 0x9c, 0x4f, 0x10, 0xb2, 0x29, 0x34, 0x8a, 0x6d, 0xec, 0x79, 0xd8, + 0x71, 0x15, 0xd5, 0x18, 0x64, 0x5e, 0xe8, 0x0e, 0xa3, 0xf0, 0xd3, 0xdf, 0x8d, 0x8e, 0xe2, 0x15, + 0x86, 0x2c, 0x1b, 0x46, 0x69, 0x1b, 0x4e, 0x0c, 0x88, 0x8a, 0x31, 0x38, 0x3f, 0xc3, 0x39, 0xe7, + 0xfb, 0x22, 0x83, 0xd0, 0x36, 0x40, 0xc8, 0xfd, 0xb1, 0x1c, 0x83, 0xf3, 0x67, 0x38, 0x27, 0xe2, + 0x58, 0x31, 0xa4, 0x84, 0xf1, 0x1a, 0xcc, 0xde, 0xc4, 0xce, 0x8e, 0xe5, 0xf2, 0x7b, 0xa3, 0x31, + 0xe8, 0x3e, 0xcb, 0xe9, 0x66, 0x38, 0x90, 0x5e, 0x24, 0x11, 0xae, 0x8b, 0x90, 0xd9, 0x55, 0x35, + 0x3c, 0x06, 0xc5, 0x5d, 0x4e, 0x31, 0x49, 0xf4, 0x09, 0xb4, 0x0c, 0xf9, 0xb6, 0xc5, 0xf7, 0xa8, + 0xd1, 0xf0, 0xcf, 0x71, 0x78, 0x4e, 0x60, 0x38, 0x85, 0x6d, 0xd9, 0x5d, 0x83, 0x6c, 0x60, 0xa3, + 0x29, 0xfe, 0x86, 0xa0, 0x10, 0x18, 0x4e, 0x71, 0x04, 0xb7, 0xbe, 0x29, 0x28, 0xdc, 0x90, 0x3f, + 0x5f, 0x80, 0x9c, 0x65, 0x1a, 0x07, 0x96, 0x39, 0x8e, 0x11, 0x6f, 0x71, 0x06, 0xe0, 0x10, 0x42, + 0x70, 0x09, 0xb2, 0xe3, 0x0e, 0xc4, 0xdf, 0xfc, 0xae, 0x98, 0x1e, 0x62, 0x04, 0xae, 0xc0, 0x8c, + 0x58, 0xa0, 0x74, 0xcb, 0x1c, 0x83, 0xe2, 0x6f, 0x71, 0x8a, 0xe9, 0x10, 0x8c, 0x77, 0xc3, 0xc3, + 0xae, 0xd7, 0xc6, 0xe3, 0x90, 0x7c, 0x41, 0x74, 0x83, 0x43, 0xb8, 0x2b, 0x77, 0xb0, 0xa9, 0xed, + 0x8d, 0xc7, 0xf0, 0xf3, 0xc2, 0x95, 0x02, 0x43, 0x28, 0xaa, 0x30, 0xd5, 0x51, 0x1d, 0x77, 0x4f, + 0x35, 0xc6, 0x1a, 0x8e, 0xbf, 0xcd, 0x39, 0xf2, 0x3e, 0x88, 0x7b, 0xa4, 0x6b, 0x1e, 0x85, 0xe6, + 0x8b, 0xc2, 0x23, 0x21, 0x18, 0x9f, 0x7a, 0xae, 0x47, 0x2f, 0xd9, 0x8e, 0xc2, 0xf6, 0x77, 0xc4, + 0xd4, 0x63, 0xd8, 0xf5, 0x30, 0xe3, 0x25, 0xc8, 0xba, 0xfa, 0xeb, 0x63, 0xd1, 0x7c, 0x49, 0x8c, + 0x34, 0x05, 0x10, 0xf0, 0x2b, 0x70, 0x72, 0xe0, 0x36, 0x31, 0x06, 0xd9, 0xdf, 0xe5, 0x64, 0xc7, + 0x07, 0x6c, 0x15, 0x7c, 0x49, 0x38, 0x2a, 0xe5, 0xdf, 0x13, 0x4b, 0x02, 0xee, 0xe1, 0x6a, 0x90, + 0x53, 0x83, 0xab, 0xee, 0x1e, 0xcd, 0x6b, 0x7f, 0x5f, 0x78, 0x8d, 0x61, 0x23, 0x5e, 0xdb, 0x82, + 0xe3, 0x9c, 0xf1, 0x68, 0xe3, 0xfa, 0x0b, 0x62, 0x61, 0x65, 0xe8, 0xed, 0xe8, 0xe8, 0xfe, 0x28, + 0x2c, 0xf8, 0xee, 0x14, 0xe9, 0xa9, 0xab, 0x74, 0x54, 0x7b, 0x0c, 0xe6, 0x2f, 0x73, 0x66, 0xb1, + 0xe2, 0xfb, 0xf9, 0xad, 0xbb, 0xae, 0xda, 0x84, 0xfc, 0x65, 0x28, 0x08, 0xf2, 0xae, 0xe9, 0x60, + 0xcd, 0x6a, 0x9b, 0xfa, 0xeb, 0xb8, 0x35, 0x06, 0xf5, 0x2f, 0xf6, 0x0c, 0xd5, 0x76, 0x08, 0x4e, + 0x98, 0x57, 0x41, 0xf2, 0x73, 0x15, 0x45, 0xef, 0xd8, 0x96, 0xe3, 0x8d, 0x60, 0xfc, 0x8a, 0x18, + 0x29, 0x1f, 0xb7, 0x4a, 0x61, 0xa5, 0x3a, 0xb0, 0x27, 0xcf, 0xe3, 0x86, 0xe4, 0x57, 0x39, 0xd1, + 0x54, 0x80, 0xe2, 0x0b, 0x87, 0x66, 0x75, 0x6c, 0xd5, 0x19, 0x67, 0xfd, 0xfb, 0x07, 0x62, 0xe1, + 0xe0, 0x10, 0xbe, 0x70, 0x90, 0x8c, 0x8e, 0xec, 0xf6, 0x63, 0x30, 0x7c, 0x4d, 0x2c, 0x1c, 0x02, + 0xc3, 0x29, 0x44, 0xc2, 0x30, 0x06, 0xc5, 0x3f, 0x14, 0x14, 0x02, 0x43, 0x28, 0x5e, 0x0c, 0x36, + 0x5a, 0x07, 0xb7, 0x75, 0xd7, 0x73, 0x58, 0x52, 0x7c, 0x38, 0xd5, 0x3f, 0xfa, 0x6e, 0x34, 0x09, + 0x93, 0x43, 0x50, 0xb2, 0x12, 0xf1, 0x6b, 0x57, 0x7a, 0x66, 0x1a, 0x6d, 0xd8, 0x2f, 0x89, 0x95, + 0x28, 0x04, 0x23, 0xb6, 0x85, 0x32, 0x44, 0xe2, 0x76, 0x8d, 0x9c, 0x14, 0xc6, 0xa0, 0xfb, 0xc7, + 0x3d, 0xc6, 0x35, 0x05, 0x96, 0x70, 0x86, 0xf2, 0x9f, 0xae, 0xb9, 0x8f, 0x0f, 0xc6, 0x8a, 0xce, + 0x5f, 0xee, 0xc9, 0x7f, 0xb6, 0x19, 0x92, 0xad, 0x21, 0x33, 0x3d, 0xf9, 0x14, 0x1a, 0xf5, 0x9e, + 0x51, 0xe1, 0x63, 0xef, 0xf1, 0xfe, 0x46, 0xd3, 0xa9, 0xd2, 0x1a, 0x09, 0xf2, 0x68, 0xd2, 0x33, + 0x9a, 0xec, 0xe3, 0xef, 0xf9, 0x71, 0x1e, 0xc9, 0x79, 0x4a, 0x97, 0x61, 0x2a, 0x92, 0xf0, 0x8c, + 0xa6, 0xfa, 0xb3, 0x9c, 0x2a, 0x1f, 0xce, 0x77, 0x4a, 0xe7, 0x20, 0x49, 0x92, 0x97, 0xd1, 0xf0, + 0x3f, 0xc7, 0xe1, 0x54, 0xbd, 0xf4, 0x11, 0xc8, 0x88, 0xa4, 0x65, 0x34, 0xf4, 0xcf, 0x73, 0xa8, + 0x0f, 0x21, 0x70, 0x91, 0xb0, 0x8c, 0x86, 0xff, 0x05, 0x01, 0x17, 0x10, 0x02, 0x1f, 0xdf, 0x85, + 0x5f, 0xff, 0x8b, 0x49, 0xbe, 0xe9, 0x08, 0xdf, 0x5d, 0x82, 0x49, 0x9e, 0xa9, 0x8c, 0x46, 0x7f, + 0x92, 0x37, 0x2e, 0x10, 0xa5, 0x0b, 0x90, 0x1a, 0xd3, 0xe1, 0x7f, 0x89, 0x43, 0x99, 0x7e, 0xa9, + 0x0a, 0xb9, 0x50, 0x76, 0x32, 0x1a, 0xfe, 0x97, 0x39, 0x3c, 0x8c, 0x22, 0xa6, 0xf3, 0xec, 0x64, + 0x34, 0xc1, 0x5f, 0x11, 0xa6, 0x73, 0x04, 0x71, 0x9b, 0x48, 0x4c, 0x46, 0xa3, 0x3f, 0x25, 0xbc, + 0x2e, 0x20, 0xa5, 0x17, 0x20, 0xeb, 0x6f, 0x36, 0xa3, 0xf1, 0x3f, 0xc1, 0xf1, 0x01, 0x86, 0x78, + 0x20, 0xb4, 0xd9, 0x8d, 0xa6, 0xf8, 0xab, 0xc2, 0x03, 0x21, 0x14, 0x99, 0x46, 0xbd, 0x09, 0xcc, + 0x68, 0xa6, 0x9f, 0x14, 0xd3, 0xa8, 0x27, 0x7f, 0x21, 0xa3, 0x49, 0xd7, 0xfc, 0xd1, 0x14, 0x7f, + 0x4d, 0x8c, 0x26, 0xd5, 0x27, 0x66, 0xf4, 0x66, 0x04, 0xa3, 0x39, 0x7e, 0x4a, 0x98, 0xd1, 0x93, + 0x10, 0x94, 0x1a, 0x80, 0xfa, 0xb3, 0x81, 0xd1, 0x7c, 0x9f, 0xe6, 0x7c, 0xb3, 0x7d, 0xc9, 0x40, + 0xe9, 0x25, 0x38, 0x3e, 0x38, 0x13, 0x18, 0xcd, 0xfa, 0xd3, 0xef, 0xf5, 0x9c, 0xdd, 0xc2, 0x89, + 0x40, 0x69, 0x2b, 0xd8, 0x52, 0xc2, 0x59, 0xc0, 0x68, 0xda, 0xcf, 0xbc, 0x17, 0x5d, 0xb8, 0xc3, + 0x49, 0x40, 0xa9, 0x0c, 0x10, 0x6c, 0xc0, 0xa3, 0xb9, 0x3e, 0xcb, 0xb9, 0x42, 0x20, 0x32, 0x35, + 0xf8, 0xfe, 0x3b, 0x1a, 0x7f, 0x57, 0x4c, 0x0d, 0x8e, 0x20, 0x53, 0x43, 0x6c, 0xbd, 0xa3, 0xd1, + 0x9f, 0x13, 0x53, 0x43, 0x40, 0x48, 0x64, 0x87, 0x76, 0xb7, 0xd1, 0x0c, 0x6f, 0x89, 0xc8, 0x0e, + 0xa1, 0x4a, 0x1b, 0x30, 0xdb, 0xb7, 0x21, 0x8e, 0xa6, 0xfa, 0x59, 0x4e, 0x25, 0xf5, 0xee, 0x87, + 0xe1, 0xcd, 0x8b, 0x6f, 0x86, 0xa3, 0xd9, 0x3e, 0xdf, 0xb3, 0x79, 0xf1, 0xbd, 0xb0, 0x74, 0x09, + 0x32, 0x66, 0xd7, 0x30, 0xc8, 0xe4, 0x41, 0x87, 0xbf, 0x1b, 0x58, 0xf8, 0x6f, 0x3f, 0xe0, 0xde, + 0x11, 0x80, 0xd2, 0x39, 0x48, 0xe1, 0xce, 0x0e, 0x6e, 0x8d, 0x42, 0xfe, 0xf6, 0x0f, 0xc4, 0x82, + 0x49, 0xb4, 0x4b, 0x2f, 0x00, 0xb0, 0xab, 0x11, 0xfa, 0x30, 0x70, 0x04, 0xf6, 0xbf, 0xff, 0x80, + 0xbf, 0x8c, 0x13, 0x40, 0x02, 0x02, 0xf6, 0x6a, 0xcf, 0xe1, 0x04, 0xdf, 0x8d, 0x12, 0xd0, 0x11, + 0xb9, 0x08, 0x93, 0xaf, 0xb9, 0x96, 0xe9, 0xa9, 0xed, 0x51, 0xe8, 0xdf, 0xe1, 0x68, 0xa1, 0x4f, + 0x1c, 0xd6, 0xb1, 0x1c, 0xec, 0xa9, 0x6d, 0x77, 0x14, 0xf6, 0x7f, 0x70, 0xac, 0x0f, 0x20, 0x60, + 0x4d, 0x75, 0xbd, 0x71, 0xfa, 0xfd, 0xbb, 0x02, 0x2c, 0x00, 0xc4, 0x68, 0xf2, 0x7b, 0x1f, 0x1f, + 0x8c, 0xc2, 0x7e, 0x4f, 0x18, 0xcd, 0xf5, 0x4b, 0x1f, 0x81, 0x2c, 0xf9, 0xc9, 0xde, 0xb0, 0x1b, + 0x01, 0xfe, 0x9f, 0x1c, 0x1c, 0x20, 0x48, 0xcb, 0xae, 0xd7, 0xf2, 0xf4, 0xd1, 0xce, 0xfe, 0x3e, + 0x1f, 0x69, 0xa1, 0x5f, 0x2a, 0x43, 0xce, 0xf5, 0x5a, 0xad, 0x2e, 0xcf, 0x4f, 0x47, 0xc0, 0xff, + 0xd7, 0x0f, 0xfc, 0x2b, 0x0b, 0x1f, 0x43, 0x46, 0xfb, 0xd6, 0xbe, 0x67, 0x5b, 0xf4, 0x81, 0xc7, + 0x28, 0x86, 0xf7, 0x38, 0x43, 0x08, 0x52, 0xaa, 0x42, 0x9e, 0xf4, 0xc5, 0xc1, 0x36, 0xa6, 0x4f, + 0xa7, 0x46, 0x50, 0xfc, 0x6f, 0xee, 0x80, 0x08, 0xa8, 0xf2, 0xa7, 0xbe, 0xf1, 0xce, 0x62, 0xec, + 0x5b, 0xef, 0x2c, 0xc6, 0x7e, 0xf3, 0x9d, 0xc5, 0xd8, 0xa7, 0xbe, 0xbd, 0x38, 0xf1, 0xad, 0x6f, + 0x2f, 0x4e, 0xfc, 0xfa, 0xb7, 0x17, 0x27, 0x06, 0xdf, 0x12, 0xc3, 0x15, 0xeb, 0x8a, 0xc5, 0xee, + 0x87, 0x5f, 0x7d, 0xa4, 0xad, 0x7b, 0x7b, 0xdd, 0x9d, 0x15, 0xcd, 0xea, 0x9c, 0xd1, 0x2c, 0xb7, + 0x63, 0xb9, 0x67, 0xa2, 0xf7, 0xba, 0xf4, 0x17, 0x7c, 0x2c, 0x4e, 0xce, 0xcc, 0xd1, 0xeb, 0x5c, + 0xd5, 0x3c, 0x18, 0xf2, 0xb9, 0xce, 0xc2, 0xc0, 0xbb, 0xe1, 0xe2, 0x55, 0x48, 0x94, 0xcd, 0x03, + 0x74, 0x92, 0x2d, 0x7b, 0x4a, 0xd7, 0x31, 0xf8, 0xcb, 0x5f, 0x93, 0xa4, 0xbc, 0xed, 0x18, 0x68, + 0x3e, 0x78, 0x43, 0x33, 0x76, 0x3a, 0xcf, 0x5f, 0xbb, 0x2c, 0x49, 0x9f, 0x7e, 0x73, 0x69, 0xe2, + 0x17, 0xde, 0x5c, 0x9a, 0xf8, 0xde, 0x5b, 0x4b, 0x13, 0x6f, 0xfc, 0xc6, 0xf2, 0x44, 0x65, 0xbf, + 0xb7, 0xc3, 0x5f, 0x1f, 0xd9, 0xe9, 0x4c, 0xd9, 0x3c, 0xa0, 0x7d, 0x6e, 0xc4, 0x5e, 0x4d, 0xd1, + 0x7b, 0x6f, 0x71, 0xcf, 0xbd, 0xd8, 0x7b, 0xcf, 0xfd, 0x12, 0x36, 0x8c, 0xeb, 0xa6, 0x75, 0xcb, + 0xdc, 0x22, 0x6a, 0x3b, 0x69, 0xf6, 0x56, 0x31, 0xfc, 0x64, 0x1c, 0x16, 0xfb, 0xae, 0xb4, 0x79, + 0x20, 0x0c, 0xfb, 0x6e, 0xa9, 0x04, 0x99, 0x9a, 0x88, 0xaf, 0x02, 0x4c, 0xba, 0x58, 0xb3, 0xcc, + 0x96, 0x4b, 0xbb, 0x9d, 0x90, 0x45, 0x91, 0x74, 0xdb, 0x54, 0x4d, 0xcb, 0xe5, 0x2f, 0x4b, 0xb2, + 0x42, 0xe5, 0x67, 0x62, 0x47, 0x1b, 0xd6, 0x29, 0xd1, 0x92, 0xe8, 0xe6, 0x33, 0x23, 0x6f, 0xfe, + 0xf7, 0x49, 0x2f, 0xfd, 0x4e, 0x44, 0x6e, 0xff, 0xc7, 0xf5, 0xca, 0x4f, 0xc5, 0x61, 0xa9, 0xd7, + 0x2b, 0x64, 0x76, 0xb9, 0x9e, 0xda, 0xb1, 0x87, 0xb9, 0xe5, 0x12, 0x64, 0xb7, 0x84, 0xce, 0x91, + 0xfd, 0x72, 0xf7, 0x88, 0x7e, 0x99, 0xf6, 0x9b, 0x12, 0x8e, 0x39, 0x3b, 0xa6, 0x63, 0xfc, 0x7e, + 0xbc, 0x2f, 0xcf, 0xfc, 0xbf, 0x34, 0x9c, 0x64, 0x53, 0x4a, 0x61, 0x53, 0x81, 0x15, 0xb8, 0x4f, + 0xf2, 0xe1, 0xaa, 0xd1, 0xcf, 0x4a, 0x8a, 0xd7, 0x61, 0x6e, 0x95, 0xac, 0x18, 0xe4, 0x24, 0x14, + 0x3c, 0xe5, 0x19, 0xf8, 0x3e, 0xe9, 0x72, 0x24, 0xe9, 0xe7, 0x4f, 0x99, 0xc2, 0xa2, 0xe2, 0xc7, + 0x62, 0x20, 0x35, 0x35, 0xd5, 0x50, 0x9d, 0x1f, 0x96, 0x0a, 0x5d, 0x00, 0xa0, 0xdf, 0x21, 0x05, + 0x1f, 0x0e, 0x4d, 0x9f, 0x2d, 0xac, 0x84, 0x3b, 0xb7, 0xc2, 0x5a, 0xa2, 0x5f, 0x25, 0x64, 0xa9, + 0x2e, 0xf9, 0xf9, 0xf8, 0xcb, 0x00, 0x41, 0x05, 0xba, 0x0f, 0x4e, 0x34, 0xab, 0xe5, 0xb5, 0xb2, + 0xac, 0xb0, 0x17, 0xdc, 0x37, 0x9a, 0x8d, 0x7a, 0x75, 0xf5, 0xf2, 0x6a, 0xbd, 0x26, 0x4d, 0xa0, + 0xe3, 0x80, 0xc2, 0x95, 0xfe, 0xbb, 0x29, 0xc7, 0x60, 0x36, 0x2c, 0x67, 0x6f, 0xc9, 0xc7, 0x49, + 0xb6, 0xa8, 0x77, 0x6c, 0x03, 0xd3, 0xc7, 0x7f, 0x8a, 0x2e, 0xbc, 0x36, 0x3a, 0x11, 0xf9, 0xb7, + 0xff, 0x9e, 0xbd, 0x39, 0x3d, 0x17, 0xc0, 0x7d, 0x9f, 0x97, 0xd6, 0x60, 0x56, 0xd5, 0x34, 0x6c, + 0x47, 0x28, 0x47, 0x2c, 0xd7, 0x84, 0x90, 0x3e, 0xd0, 0xe4, 0xc8, 0x80, 0xed, 0x02, 0xa4, 0x5d, + 0xda, 0xfb, 0x51, 0x14, 0xdf, 0xe4, 0x14, 0x5c, 0xbd, 0x64, 0xc2, 0x2c, 0xc9, 0xfe, 0x54, 0x07, + 0x87, 0xcc, 0x38, 0xfc, 0xae, 0xe1, 0x9f, 0x7c, 0xe5, 0x69, 0xfa, 0x78, 0xf3, 0xc1, 0xe8, 0xb0, + 0x0c, 0x08, 0x27, 0x59, 0xe2, 0xdc, 0x81, 0xa1, 0x18, 0xa6, 0x45, 0x7b, 0xdc, 0xe0, 0xc3, 0x1b, + 0xfb, 0xa7, 0xbc, 0xb1, 0xc5, 0x41, 0x31, 0x10, 0x6a, 0x69, 0x8a, 0xb3, 0xb2, 0x8a, 0x4a, 0x7d, + 0xd8, 0x9c, 0x7e, 0xf5, 0x89, 0xfe, 0x1d, 0x8a, 0xfd, 0x79, 0x8a, 0x32, 0x5f, 0x0a, 0x37, 0xe3, + 0xcf, 0xbd, 0x5f, 0x4b, 0xc0, 0x22, 0x57, 0xde, 0x51, 0x5d, 0x7c, 0xe6, 0xe6, 0x33, 0x3b, 0xd8, + 0x53, 0x9f, 0x39, 0xa3, 0x59, 0xba, 0x58, 0xab, 0xe7, 0xf8, 0x74, 0x24, 0xf5, 0x2b, 0xbc, 0x7e, + 0xf0, 0xc6, 0xb5, 0x30, 0x7c, 0x1a, 0x17, 0xb7, 0x21, 0x59, 0xb5, 0x74, 0x93, 0x2c, 0x55, 0x2d, + 0x6c, 0x5a, 0x1d, 0x3e, 0x7b, 0x58, 0x01, 0x3d, 0x03, 0x69, 0xb5, 0x63, 0x75, 0x4d, 0x8f, 0xcd, + 0x9c, 0xca, 0xc9, 0x6f, 0xbc, 0xbd, 0x34, 0xf1, 0x1f, 0xdf, 0x5e, 0x4a, 0xac, 0x9a, 0xde, 0xaf, + 0x7e, 0xf5, 0x29, 0xe0, 0x54, 0xab, 0xa6, 0x27, 0x73, 0xc5, 0x52, 0xf2, 0xdd, 0x37, 0x97, 0x62, + 0xc5, 0x97, 0x61, 0xb2, 0x86, 0xb5, 0xf7, 0xc3, 0x5c, 0xc3, 0x5a, 0x88, 0xb9, 0x86, 0xb5, 0x1e, + 0xe6, 0x0b, 0x90, 0x59, 0x35, 0x3d, 0xf6, 0x32, 0xfa, 0x13, 0x90, 0xd0, 0x4d, 0xf6, 0x7e, 0xe3, + 0xa1, 0xb6, 0x11, 0x2d, 0x02, 0xac, 0x61, 0xcd, 0x07, 0xb6, 0xb0, 0xd6, 0x0b, 0xec, 0x6f, 0x9a, + 0x68, 0x55, 0x6a, 0xbf, 0xfe, 0x5f, 0x16, 0x27, 0xde, 0x78, 0x67, 0x71, 0x62, 0xe8, 0x10, 0x17, + 0x87, 0x0e, 0xb1, 0xdb, 0xda, 0x67, 0x2b, 0xb2, 0x3f, 0xb2, 0x5f, 0x4c, 0xc2, 0x03, 0xf4, 0x1b, + 0x25, 0xa7, 0xa3, 0x9b, 0xde, 0x19, 0xcd, 0x39, 0xb0, 0x3d, 0x8b, 0xac, 0x9b, 0xd6, 0x2e, 0x1f, + 0xd8, 0xd9, 0xa0, 0x7a, 0x85, 0x55, 0x0f, 0xc9, 0x47, 0x76, 0x21, 0xd5, 0x20, 0x38, 0xe2, 0x62, + 0xcf, 0xf2, 0x54, 0x83, 0xef, 0x3f, 0xac, 0x40, 0xa4, 0xec, 0xbb, 0xa6, 0x38, 0x93, 0xea, 0xe2, + 0x93, 0x26, 0x03, 0xab, 0xbb, 0xec, 0xf5, 0xf0, 0x04, 0x4d, 0x53, 0x32, 0x44, 0x40, 0xdf, 0x04, + 0x9f, 0x87, 0x94, 0xda, 0x65, 0xef, 0x31, 0x24, 0x48, 0xfe, 0x42, 0x0b, 0xc5, 0xeb, 0x30, 0xc9, + 0x9f, 0xa6, 0x22, 0x09, 0x12, 0xfb, 0xf8, 0x80, 0xb6, 0x93, 0x97, 0xc9, 0x4f, 0xb4, 0x02, 0x29, + 0x6a, 0x3c, 0xff, 0xee, 0xa5, 0xb0, 0xd2, 0x67, 0xfd, 0x0a, 0x35, 0x52, 0x66, 0x6a, 0xc5, 0x6b, + 0x90, 0xa9, 0x59, 0x1d, 0xdd, 0xb4, 0xa2, 0x6c, 0x59, 0xc6, 0x46, 0x6d, 0xb6, 0xbb, 0x3c, 0x2a, + 0x64, 0x56, 0x40, 0xc7, 0x21, 0xcd, 0x3e, 0x17, 0xe0, 0xef, 0x62, 0xf0, 0x52, 0xb1, 0x0a, 0x93, + 0x94, 0x7b, 0xd3, 0x26, 0x8b, 0xbf, 0xff, 0x66, 0x66, 0x96, 0x7f, 0x3c, 0xc6, 0xe9, 0xe3, 0x81, + 0xb1, 0x08, 0x92, 0x2d, 0xd5, 0x53, 0x79, 0xbf, 0xe9, 0xef, 0xe2, 0x47, 0x21, 0xc3, 0x49, 0x5c, + 0x74, 0x16, 0x12, 0x96, 0xed, 0xf2, 0xb7, 0x29, 0x16, 0x86, 0x75, 0x65, 0xd3, 0xae, 0x24, 0x49, + 0xcc, 0xc8, 0x44, 0xb9, 0x22, 0x0f, 0x0d, 0x8b, 0xe7, 0x43, 0x61, 0x11, 0x1a, 0xf2, 0xd0, 0x4f, + 0x36, 0xa4, 0x7d, 0xe1, 0xe0, 0x07, 0xcb, 0x5b, 0x71, 0x58, 0x0c, 0xd5, 0xde, 0xc4, 0x8e, 0xab, + 0x5b, 0x26, 0x8b, 0x28, 0x1e, 0x2d, 0x28, 0x64, 0x24, 0xaf, 0x1f, 0x12, 0x2e, 0x1f, 0x81, 0x44, + 0xd9, 0xb6, 0xd1, 0x02, 0x64, 0x68, 0x59, 0xb3, 0x58, 0xbc, 0x24, 0x65, 0xbf, 0x4c, 0xea, 0x5c, + 0x6b, 0xd7, 0xbb, 0xa5, 0x3a, 0xfe, 0x17, 0x75, 0xa2, 0x5c, 0xbc, 0x08, 0xd9, 0xaa, 0x65, 0xba, + 0xd8, 0x74, 0xbb, 0x34, 0xb3, 0xd9, 0x31, 0x2c, 0x6d, 0x9f, 0x33, 0xb0, 0x02, 0x71, 0xb8, 0x6a, + 0xdb, 0x14, 0x99, 0x94, 0xc9, 0x4f, 0x36, 0x67, 0x2b, 0xcd, 0xa1, 0x2e, 0xba, 0x78, 0x74, 0x17, + 0xf1, 0x4e, 0xfa, 0x3e, 0xfa, 0xbd, 0x18, 0xdc, 0xdf, 0x3f, 0xa1, 0xf6, 0xf1, 0x81, 0x7b, 0xd4, + 0xf9, 0xf4, 0x32, 0x64, 0x1b, 0xf4, 0xb3, 0xf6, 0xeb, 0xf8, 0x00, 0x2d, 0xc0, 0x24, 0x6e, 0x9d, + 0x3d, 0x77, 0xee, 0x99, 0x8b, 0x2c, 0xda, 0xaf, 0x4e, 0xc8, 0x42, 0x80, 0x16, 0x21, 0xeb, 0x62, + 0xcd, 0x3e, 0x7b, 0xee, 0xfc, 0xfe, 0x33, 0x2c, 0xbc, 0xae, 0x4e, 0xc8, 0x81, 0xa8, 0x94, 0x21, + 0xbd, 0x7e, 0xf7, 0xad, 0xa5, 0x58, 0x25, 0x05, 0x09, 0xb7, 0xdb, 0xf9, 0x40, 0x63, 0xe4, 0x33, + 0x29, 0x58, 0x0e, 0x23, 0x69, 0xfe, 0x77, 0x53, 0x35, 0xf4, 0x96, 0x1a, 0xfc, 0x43, 0x02, 0x29, + 0xe4, 0x03, 0xaa, 0x31, 0x64, 0xa7, 0x38, 0xd4, 0x93, 0xc5, 0x5f, 0x8c, 0x41, 0xfe, 0x86, 0x60, + 0x6e, 0x62, 0x0f, 0x5d, 0x02, 0xf0, 0x5b, 0x12, 0xd3, 0xe6, 0xbe, 0x95, 0xde, 0xb6, 0x56, 0x7c, + 0x8c, 0x1c, 0x52, 0x47, 0x17, 0x68, 0x20, 0xda, 0x96, 0xcb, 0xbf, 0xb2, 0x1a, 0x01, 0xf5, 0x95, + 0xd1, 0x93, 0x80, 0xe8, 0x0a, 0xa7, 0xdc, 0xb4, 0x3c, 0xdd, 0x6c, 0x2b, 0xb6, 0x75, 0x8b, 0x7f, + 0xbb, 0x9a, 0x90, 0x25, 0x5a, 0x73, 0x83, 0x56, 0x34, 0x88, 0x9c, 0x18, 0x9d, 0xf5, 0x59, 0x48, + 0xb2, 0xae, 0xb6, 0x5a, 0x0e, 0x76, 0x5d, 0xbe, 0x88, 0x89, 0x22, 0xba, 0x04, 0x93, 0x76, 0x77, + 0x47, 0x11, 0x2b, 0x46, 0xee, 0xec, 0xfd, 0x83, 0xe6, 0xbf, 0x88, 0x0f, 0xbe, 0x02, 0xa4, 0xed, + 0xee, 0x0e, 0x89, 0x96, 0x07, 0x21, 0x3f, 0xc0, 0x98, 0xdc, 0xcd, 0xc0, 0x0e, 0xfa, 0xdf, 0x14, + 0x78, 0x0f, 0x14, 0xdb, 0xd1, 0x2d, 0x47, 0xf7, 0x0e, 0xe8, 0x2b, 0x51, 0x09, 0x59, 0x12, 0x15, + 0x0d, 0x2e, 0x2f, 0xee, 0xc3, 0x4c, 0x93, 0x26, 0x71, 0x81, 0xe5, 0xe7, 0x02, 0xfb, 0x62, 0xa3, + 0xed, 0x1b, 0x6a, 0x59, 0xbc, 0xcf, 0xb2, 0xca, 0x8b, 0x43, 0xa3, 0xf3, 0xc2, 0xd1, 0xa3, 0x33, + 0xba, 0xdb, 0xfd, 0xee, 0xc9, 0xc8, 0xe4, 0x64, 0xc1, 0x19, 0x5e, 0xbe, 0xc6, 0x0d, 0xcc, 0x51, + 0x67, 0xb4, 0x85, 0xc3, 0x37, 0xd5, 0x85, 0x11, 0xcb, 0xe8, 0xc2, 0xc8, 0x29, 0x54, 0xbc, 0x08, + 0x53, 0x0d, 0xd5, 0xf1, 0x9a, 0xd8, 0xbb, 0x8a, 0xd5, 0x16, 0x76, 0xa2, 0xbb, 0xee, 0x94, 0xd8, + 0x75, 0x11, 0x24, 0xe9, 0xd6, 0xca, 0x76, 0x1d, 0xfa, 0xbb, 0xb8, 0x07, 0x49, 0xfa, 0x5a, 0xa4, + 0xbf, 0x23, 0x73, 0x04, 0xdb, 0x91, 0xc9, 0x5a, 0x7a, 0xe0, 0x61, 0x57, 0x5c, 0x1a, 0xd0, 0x02, + 0x7a, 0x4e, 0xec, 0xab, 0x89, 0xc3, 0xf7, 0x55, 0x1e, 0x88, 0x7c, 0x77, 0x35, 0x60, 0xb2, 0x42, + 0x96, 0xe2, 0xd5, 0x9a, 0x6f, 0x48, 0x2c, 0x30, 0x04, 0xad, 0xc3, 0x8c, 0xad, 0x3a, 0x1e, 0xfd, + 0x42, 0x64, 0x8f, 0xf6, 0x82, 0xc7, 0xfa, 0x52, 0xff, 0xcc, 0x8b, 0x74, 0x96, 0xb7, 0x32, 0x65, + 0x87, 0x85, 0xc5, 0xff, 0x9a, 0x84, 0x34, 0x77, 0xc6, 0x47, 0x60, 0x92, 0xbb, 0x95, 0x47, 0xe7, + 0x03, 0x2b, 0xfd, 0x1b, 0xd3, 0x8a, 0xbf, 0x81, 0x70, 0x3e, 0x81, 0x41, 0x8f, 0x42, 0x46, 0xdb, + 0x53, 0x75, 0x53, 0xd1, 0x5b, 0x3c, 0x21, 0xcc, 0xbd, 0xf3, 0xf6, 0xd2, 0x64, 0x95, 0xc8, 0x56, + 0x6b, 0xf2, 0x24, 0xad, 0x5c, 0x6d, 0x91, 0x4c, 0x60, 0x0f, 0xeb, 0xed, 0x3d, 0x8f, 0xcf, 0x30, + 0x5e, 0x42, 0xcf, 0x43, 0x92, 0x04, 0x04, 0xff, 0x7e, 0x70, 0xa1, 0x2f, 0xc3, 0xf7, 0x8f, 0xd0, + 0x95, 0x0c, 0x69, 0xf8, 0x53, 0xff, 0x79, 0x29, 0x26, 0x53, 0x04, 0xaa, 0xc2, 0x94, 0xa1, 0xba, + 0x9e, 0x42, 0x77, 0x30, 0xd2, 0x7c, 0x8a, 0x52, 0x9c, 0xec, 0x77, 0x08, 0x77, 0x2c, 0x37, 0x3d, + 0x47, 0x50, 0x4c, 0xd4, 0x42, 0xa7, 0x41, 0xa2, 0x24, 0x9a, 0xd5, 0xe9, 0xe8, 0x1e, 0xcb, 0xad, + 0xd2, 0xd4, 0xef, 0xd3, 0x44, 0x5e, 0xa5, 0x62, 0x9a, 0x61, 0xdd, 0x07, 0x59, 0xfa, 0xc5, 0x12, + 0x55, 0x61, 0xef, 0xe2, 0x66, 0x88, 0x80, 0x56, 0x9e, 0x82, 0x99, 0x60, 0x7d, 0x64, 0x2a, 0x19, + 0xc6, 0x12, 0x88, 0xa9, 0xe2, 0xd3, 0x30, 0x6f, 0xe2, 0xdb, 0xf4, 0xed, 0xe0, 0x88, 0x76, 0x96, + 0x6a, 0x23, 0x52, 0x77, 0x23, 0x8a, 0x78, 0x04, 0xa6, 0x35, 0xe1, 0x7c, 0xa6, 0x0b, 0x54, 0x77, + 0xca, 0x97, 0x52, 0xb5, 0x93, 0x90, 0x51, 0x6d, 0x9b, 0x29, 0xe4, 0xf8, 0xfa, 0x68, 0xdb, 0xb4, + 0xea, 0x71, 0x98, 0xa5, 0x7d, 0x74, 0xb0, 0xdb, 0x35, 0x3c, 0x4e, 0x92, 0xa7, 0x3a, 0x33, 0xa4, + 0x42, 0x66, 0x72, 0xaa, 0xfb, 0x10, 0x4c, 0xe1, 0x9b, 0x7a, 0x0b, 0x9b, 0x1a, 0x66, 0x7a, 0x53, + 0x54, 0x2f, 0x2f, 0x84, 0x54, 0xe9, 0x31, 0xf0, 0xd7, 0x3d, 0x45, 0xac, 0xc9, 0xd3, 0x8c, 0x4f, + 0xc8, 0xcb, 0x4c, 0x5c, 0x2c, 0x40, 0xb2, 0xa6, 0x7a, 0x2a, 0x49, 0x30, 0xbc, 0xdb, 0x6c, 0xa3, + 0xc9, 0xcb, 0xe4, 0x67, 0xf1, 0xdd, 0x38, 0x24, 0x6f, 0x58, 0x1e, 0x46, 0xcf, 0x86, 0x12, 0xc0, + 0xe9, 0x41, 0xf1, 0xdc, 0xd4, 0xdb, 0x26, 0x6e, 0xad, 0xbb, 0xed, 0xd0, 0xbf, 0x17, 0x08, 0xc2, + 0x29, 0x1e, 0x09, 0xa7, 0x79, 0x48, 0x39, 0x56, 0xd7, 0x6c, 0x89, 0xd7, 0x58, 0x69, 0x01, 0xd5, + 0x21, 0xe3, 0x47, 0x49, 0x72, 0x54, 0x94, 0xcc, 0x90, 0x28, 0x21, 0x31, 0xcc, 0x05, 0xf2, 0xe4, + 0x0e, 0x0f, 0x96, 0x0a, 0x64, 0xfd, 0xc5, 0x8b, 0x47, 0xdb, 0x78, 0x01, 0x1b, 0xc0, 0xc8, 0x66, + 0xe2, 0x8f, 0xbd, 0xef, 0x3c, 0x16, 0x71, 0x92, 0x5f, 0xc1, 0xbd, 0x17, 0x09, 0x2b, 0xfe, 0xaf, + 0x0e, 0x26, 0x69, 0xbf, 0x82, 0xb0, 0x62, 0xff, 0xee, 0xe0, 0x7e, 0xc8, 0xba, 0x7a, 0xdb, 0x54, + 0xbd, 0xae, 0x83, 0x79, 0xe4, 0x05, 0x82, 0xe2, 0xd7, 0x63, 0x90, 0x66, 0x91, 0x1c, 0xf2, 0x5b, + 0x6c, 0xb0, 0xdf, 0xe2, 0xc3, 0xfc, 0x96, 0x78, 0xff, 0x7e, 0x2b, 0x03, 0xf8, 0xc6, 0xb8, 0xfc, + 0x0b, 0xf4, 0x01, 0x19, 0x03, 0x33, 0xb1, 0xa9, 0xb7, 0xf9, 0x44, 0x0d, 0x81, 0x8a, 0xff, 0x29, + 0x46, 0x92, 0x58, 0x5e, 0x8f, 0xca, 0x30, 0x25, 0xec, 0x52, 0x76, 0x0d, 0xb5, 0xcd, 0x63, 0xe7, + 0x81, 0xa1, 0xc6, 0x5d, 0x36, 0xd4, 0xb6, 0x9c, 0xe3, 0xf6, 0x90, 0xc2, 0xe0, 0x71, 0x88, 0x0f, + 0x19, 0x87, 0xc8, 0xc0, 0x27, 0xde, 0xdf, 0xc0, 0x47, 0x86, 0x28, 0xd9, 0x3b, 0x44, 0x5f, 0x89, + 0xd3, 0xc3, 0x8c, 0x6d, 0xb9, 0xaa, 0xf1, 0x61, 0xcc, 0x88, 0xfb, 0x20, 0x6b, 0x5b, 0x86, 0xc2, + 0x6a, 0xd8, 0xeb, 0xdd, 0x19, 0xdb, 0x32, 0xe4, 0xbe, 0x61, 0x4f, 0xdd, 0xa3, 0xe9, 0x92, 0xbe, + 0x07, 0x5e, 0x9b, 0xec, 0xf5, 0x9a, 0x03, 0x79, 0xe6, 0x0a, 0xbe, 0x97, 0x3d, 0x4d, 0x7c, 0x40, + 0x37, 0xc7, 0x58, 0xff, 0xde, 0xcb, 0xcc, 0x66, 0x9a, 0x32, 0xd7, 0x23, 0x08, 0xb6, 0xf4, 0x0f, + 0x3a, 0x05, 0x87, 0xc3, 0x52, 0xe6, 0x7a, 0xc5, 0xbf, 0x1e, 0x03, 0x58, 0x23, 0x9e, 0xa5, 0xfd, + 0x25, 0xbb, 0x90, 0x4b, 0x4d, 0x50, 0x22, 0x2d, 0x2f, 0x0e, 0x1b, 0x34, 0xde, 0x7e, 0xde, 0x0d, + 0xdb, 0x5d, 0x85, 0xa9, 0x20, 0x18, 0x5d, 0x2c, 0x8c, 0x59, 0x3c, 0x24, 0xab, 0x6e, 0x62, 0x4f, + 0xce, 0xdf, 0x0c, 0x95, 0x8a, 0xff, 0x22, 0x06, 0x59, 0x6a, 0xd3, 0x3a, 0xf6, 0xd4, 0xc8, 0x18, + 0xc6, 0xde, 0xff, 0x18, 0x3e, 0x00, 0xc0, 0x68, 0x5c, 0xfd, 0x75, 0xcc, 0x23, 0x2b, 0x4b, 0x25, + 0x4d, 0xfd, 0x75, 0x8c, 0xce, 0xfb, 0x0e, 0x4f, 0x1c, 0xee, 0x70, 0x91, 0x75, 0x73, 0xb7, 0x9f, + 0x80, 0x49, 0xfa, 0x1f, 0x9b, 0x6e, 0xbb, 0x3c, 0x91, 0x4e, 0x9b, 0xdd, 0xce, 0xd6, 0x6d, 0xb7, + 0xf8, 0x1a, 0x4c, 0x6e, 0xdd, 0x66, 0x77, 0x23, 0xf7, 0x41, 0xd6, 0xb1, 0x2c, 0xbe, 0x27, 0xb3, + 0x5c, 0x28, 0x43, 0x04, 0x74, 0x0b, 0x12, 0xf7, 0x01, 0xf1, 0xe0, 0x3e, 0x20, 0xb8, 0xd0, 0x48, + 0x8c, 0x75, 0xa1, 0xf1, 0xf8, 0xaf, 0xc5, 0x20, 0x17, 0x5a, 0x1f, 0xd0, 0x33, 0x70, 0xac, 0xb2, + 0xb6, 0x59, 0xbd, 0xae, 0xac, 0xd6, 0x94, 0xcb, 0x6b, 0xe5, 0x2b, 0xc1, 0x07, 0x4c, 0x0b, 0xc7, + 0xef, 0xdc, 0x5d, 0x46, 0x21, 0xdd, 0x6d, 0x93, 0xde, 0xd3, 0xa3, 0x33, 0x30, 0x1f, 0x85, 0x94, + 0x2b, 0xcd, 0xfa, 0xc6, 0x96, 0x14, 0x5b, 0x38, 0x76, 0xe7, 0xee, 0xf2, 0x6c, 0x08, 0x51, 0xde, + 0x71, 0xb1, 0xe9, 0xf5, 0x03, 0xaa, 0x9b, 0xeb, 0xeb, 0xab, 0x5b, 0x52, 0xbc, 0x0f, 0xc0, 0x17, + 0xec, 0xc7, 0x60, 0x36, 0x0a, 0xd8, 0x58, 0x5d, 0x93, 0x12, 0x0b, 0xe8, 0xce, 0xdd, 0xe5, 0xe9, + 0x90, 0xf6, 0x86, 0x6e, 0x2c, 0x64, 0x3e, 0xf1, 0xf9, 0xc5, 0x89, 0x9f, 0xff, 0xb9, 0xc5, 0x18, + 0xe9, 0xd9, 0x54, 0x64, 0x8d, 0x40, 0x4f, 0xc2, 0x89, 0xe6, 0xea, 0x95, 0x8d, 0x7a, 0x4d, 0x59, + 0x6f, 0x5e, 0x11, 0x37, 0xdd, 0xa2, 0x77, 0x33, 0x77, 0xee, 0x2e, 0xe7, 0x78, 0x97, 0x86, 0x69, + 0x37, 0xe4, 0xfa, 0x8d, 0xcd, 0xad, 0xba, 0x14, 0x63, 0xda, 0x0d, 0x07, 0xdf, 0xb4, 0x3c, 0xf6, + 0x2f, 0xdd, 0x9e, 0x86, 0x93, 0x03, 0xb4, 0xfd, 0x8e, 0xcd, 0xde, 0xb9, 0xbb, 0x3c, 0xd5, 0x70, + 0x30, 0x9b, 0x3f, 0x14, 0xb1, 0x02, 0x85, 0x7e, 0xc4, 0x66, 0x63, 0xb3, 0x59, 0x5e, 0x93, 0x96, + 0x17, 0xa4, 0x3b, 0x77, 0x97, 0xf3, 0x62, 0x31, 0x24, 0xfa, 0x41, 0xcf, 0x3e, 0xc8, 0x13, 0xcf, + 0x97, 0x9f, 0x84, 0x87, 0xf9, 0x1d, 0xa0, 0xeb, 0xa9, 0xfb, 0xba, 0xd9, 0xf6, 0x2f, 0x6f, 0x79, + 0x99, 0x9f, 0x7c, 0x8e, 0xf3, 0x7b, 0x46, 0x21, 0x1d, 0x71, 0x85, 0x3b, 0xf4, 0xe9, 0xe5, 0xc2, + 0x88, 0x87, 0x7a, 0xa3, 0x8f, 0x4e, 0xc3, 0xaf, 0x87, 0x17, 0x46, 0x5c, 0x42, 0x2f, 0x1c, 0x7a, + 0xb8, 0x2b, 0x7e, 0x32, 0x06, 0xd3, 0x57, 0x75, 0xd7, 0xb3, 0x1c, 0x5d, 0x53, 0x0d, 0xfa, 0xd9, + 0xd2, 0xf9, 0x71, 0xd7, 0xd6, 0x9e, 0xa9, 0xfe, 0x02, 0xa4, 0x6f, 0xaa, 0x06, 0x5b, 0xd4, 0xc2, + 0xcf, 0x02, 0x7a, 0xdd, 0x17, 0x2c, 0x6d, 0x82, 0x80, 0xc1, 0x8a, 0x5f, 0x8a, 0xc3, 0x0c, 0x9d, + 0x0c, 0x2e, 0xfb, 0x8f, 0x5c, 0xe4, 0x8c, 0xd5, 0x80, 0xa4, 0xa3, 0x7a, 0xfc, 0xd2, 0xb0, 0xf2, + 0x23, 0xfc, 0x1e, 0xf8, 0xd1, 0xd1, 0xb7, 0xb9, 0x2b, 0xfd, 0x57, 0xc5, 0x94, 0x09, 0xbd, 0x04, + 0x99, 0x8e, 0x7a, 0x5b, 0xa1, 0xac, 0xf1, 0x7b, 0xc0, 0x3a, 0xd9, 0x51, 0x6f, 0x13, 0x5b, 0x51, + 0x0b, 0x66, 0x08, 0xb1, 0xb6, 0xa7, 0x9a, 0x6d, 0xcc, 0xf8, 0x13, 0xf7, 0x80, 0x7f, 0xaa, 0xa3, + 0xde, 0xae, 0x52, 0x4e, 0xd2, 0x4a, 0x29, 0xf3, 0xe9, 0x37, 0x97, 0x26, 0xe8, 0x35, 0xfb, 0x2f, + 0xc7, 0x00, 0x02, 0x77, 0xa1, 0x3f, 0x0e, 0x92, 0xe6, 0x97, 0x68, 0xf3, 0x2e, 0x1f, 0xc0, 0x53, + 0xc3, 0x06, 0xa2, 0xc7, 0xd9, 0x6c, 0x63, 0xfe, 0xd6, 0xdb, 0x4b, 0x31, 0x79, 0x46, 0xeb, 0x19, + 0x87, 0x3a, 0xe4, 0xba, 0x76, 0x4b, 0xf5, 0xb0, 0x42, 0x0f, 0x71, 0xf1, 0x23, 0x6c, 0xf2, 0xc0, + 0x80, 0xa4, 0x2a, 0x64, 0xfd, 0x97, 0x62, 0x90, 0xab, 0x85, 0x1e, 0xf2, 0x15, 0x60, 0xb2, 0x63, + 0x99, 0xfa, 0x3e, 0x0f, 0xbb, 0xac, 0x2c, 0x8a, 0x68, 0x01, 0x32, 0xec, 0x83, 0x4d, 0xef, 0x40, + 0xdc, 0x78, 0x8a, 0x32, 0x41, 0xdd, 0xc2, 0x3b, 0xae, 0x2e, 0x7c, 0x2d, 0x8b, 0x22, 0x39, 0xba, + 0xb8, 0x58, 0xeb, 0x3a, 0xba, 0x77, 0xa0, 0x68, 0x96, 0xe9, 0xa9, 0x9a, 0xc7, 0x3f, 0xfd, 0x9b, + 0x11, 0xf2, 0x2a, 0x13, 0x13, 0x92, 0x16, 0xf6, 0x54, 0xdd, 0x70, 0x0b, 0xec, 0x41, 0x98, 0x28, + 0x86, 0xcc, 0x7d, 0x37, 0x1d, 0xbe, 0xa2, 0xaa, 0x82, 0x64, 0xd9, 0xd8, 0x89, 0xa4, 0x94, 0x2c, + 0x42, 0x0b, 0xbf, 0xfa, 0xd5, 0xa7, 0xe6, 0xb9, 0xbb, 0x79, 0x52, 0xc9, 0xde, 0x6d, 0x95, 0x67, + 0x04, 0x42, 0xe4, 0x9a, 0xaf, 0x90, 0x01, 0x13, 0xe7, 0x3d, 0xbb, 0xbb, 0x13, 0x5c, 0x6b, 0xcd, + 0xf7, 0xf9, 0xb5, 0x6c, 0x1e, 0x54, 0x0a, 0xdf, 0x0c, 0xa8, 0x83, 0xbb, 0xa4, 0xeb, 0xf8, 0x80, + 0x8c, 0x16, 0xe7, 0x69, 0x50, 0x1a, 0x92, 0x22, 0xbe, 0xa6, 0xea, 0x86, 0xf8, 0x0e, 0x5d, 0xe6, + 0x25, 0x54, 0x82, 0xb4, 0xeb, 0xa9, 0x5e, 0xd7, 0xe5, 0xff, 0x2f, 0xae, 0x38, 0x2c, 0x32, 0x2a, + 0x96, 0xd9, 0x6a, 0x52, 0x4d, 0x99, 0x23, 0xd0, 0x16, 0xa4, 0x3d, 0x6b, 0x1f, 0x9b, 0xdc, 0x49, + 0x47, 0x8a, 0xea, 0x01, 0xcf, 0xa2, 0x18, 0x17, 0x6a, 0x83, 0xd4, 0xc2, 0x06, 0x6e, 0xb3, 0x84, + 0x68, 0x4f, 0x25, 0xe7, 0x86, 0xf4, 0x3d, 0x98, 0x35, 0x33, 0x3e, 0x6b, 0x93, 0x92, 0xa2, 0xeb, + 0xd1, 0xc7, 0xcc, 0xec, 0x9f, 0x2b, 0x3e, 0x34, 0xac, 0xff, 0xa1, 0xc8, 0x14, 0x97, 0x09, 0xe1, + 0x27, 0xd2, 0x8f, 0x81, 0xd4, 0x35, 0x77, 0x2c, 0x93, 0x7e, 0x2d, 0xca, 0x93, 0xf1, 0x0c, 0x4d, + 0x6f, 0x66, 0x7c, 0xf9, 0x55, 0x96, 0x95, 0x5f, 0x87, 0xe9, 0x40, 0x95, 0xce, 0x9d, 0xec, 0x11, + 0xe6, 0xce, 0x94, 0x8f, 0x25, 0xb5, 0xe8, 0x2a, 0x40, 0x30, 0x31, 0xe9, 0xf5, 0x40, 0x6e, 0xf8, + 0x18, 0x06, 0xb3, 0x5b, 0x1c, 0xb3, 0x02, 0x2c, 0x32, 0x60, 0xae, 0xa3, 0x9b, 0x8a, 0x8b, 0x8d, + 0x5d, 0x85, 0xbb, 0x8a, 0x50, 0xe6, 0xee, 0xc1, 0xd0, 0xce, 0x76, 0x74, 0xb3, 0x89, 0x8d, 0xdd, + 0x9a, 0x4f, 0x4b, 0x93, 0x4b, 0xcb, 0x6c, 0x29, 0xec, 0x29, 0x23, 0xfb, 0x0f, 0xa6, 0x59, 0x22, + 0xa9, 0x11, 0x41, 0x29, 0xff, 0x89, 0x37, 0x97, 0x26, 0xf8, 0x54, 0x9b, 0x28, 0x36, 0xe8, 0x0d, + 0x36, 0x9f, 0x25, 0xd8, 0x45, 0xe7, 0x21, 0xab, 0x8a, 0x02, 0xbd, 0x57, 0x38, 0x6c, 0x96, 0x05, + 0xaa, 0x6c, 0xf2, 0xbe, 0xf1, 0x1b, 0xcb, 0xb1, 0xe2, 0xcf, 0xc5, 0x20, 0x5d, 0xbb, 0xd1, 0x50, + 0x75, 0x07, 0xd5, 0x61, 0x36, 0x88, 0xb7, 0x71, 0xa7, 0x6e, 0x10, 0xa2, 0x62, 0xee, 0xd6, 0x87, + 0x1d, 0x2a, 0x0f, 0xa5, 0xe9, 0x3d, 0x6e, 0xf6, 0x74, 0xbc, 0x0e, 0x93, 0xcc, 0x4a, 0x17, 0x95, + 0x20, 0x65, 0x93, 0x1f, 0xfc, 0xc2, 0x7e, 0x71, 0x68, 0x9c, 0x52, 0x7d, 0xff, 0x82, 0x91, 0x40, + 0x8a, 0xbf, 0x17, 0x03, 0xa8, 0xdd, 0xb8, 0xb1, 0xe5, 0xe8, 0xb6, 0x81, 0xbd, 0x7b, 0xd5, 0xe3, + 0x35, 0x38, 0x16, 0x3a, 0xb9, 0x38, 0xda, 0xd8, 0xbd, 0x9e, 0x0b, 0xce, 0x2e, 0x8e, 0x36, 0x90, + 0xad, 0xe5, 0x7a, 0x3e, 0x5b, 0x62, 0x6c, 0xb6, 0x9a, 0xeb, 0x0d, 0x76, 0x63, 0x13, 0x72, 0x41, + 0xf7, 0x5d, 0x54, 0x83, 0x8c, 0xc7, 0x7f, 0x73, 0x6f, 0x16, 0x87, 0x7b, 0x53, 0xc0, 0xb8, 0x47, + 0x7d, 0x64, 0xf1, 0xff, 0x13, 0xa7, 0x06, 0x01, 0xfd, 0x87, 0x2a, 0x8c, 0xc8, 0xd2, 0xcc, 0x97, + 0xce, 0x7b, 0x91, 0x70, 0x70, 0xae, 0x1e, 0xaf, 0x7e, 0x3c, 0x0e, 0x73, 0xdb, 0x62, 0x31, 0xfa, + 0x43, 0xeb, 0x89, 0x06, 0x4c, 0x62, 0xd3, 0x73, 0x74, 0xea, 0x0a, 0x32, 0xd6, 0x4f, 0x0f, 0x1b, + 0xeb, 0x01, 0x7d, 0xa1, 0xff, 0xd5, 0x48, 0x5c, 0x7b, 0x73, 0x9a, 0x1e, 0x2f, 0xfc, 0x9f, 0x38, + 0x14, 0x86, 0x21, 0xd1, 0x29, 0x98, 0xd1, 0x1c, 0x4c, 0x05, 0x4a, 0xe4, 0xee, 0x6d, 0x5a, 0x88, + 0xf9, 0x9e, 0xb0, 0x0e, 0x24, 0xbf, 0x22, 0x81, 0x45, 0x54, 0x8f, 0x9c, 0x50, 0x4d, 0x07, 0x60, + 0xba, 0x2b, 0xb8, 0x30, 0xa3, 0x9b, 0xba, 0xa7, 0xab, 0x86, 0xb2, 0xa3, 0x1a, 0xaa, 0xa9, 0x61, + 0xff, 0x0e, 0x6f, 0xc0, 0x0b, 0x28, 0x2b, 0x55, 0x4b, 0x37, 0x2b, 0x67, 0x78, 0x88, 0x9c, 0x1a, + 0x23, 0x44, 0x08, 0x40, 0x9e, 0xe6, 0x4d, 0x54, 0x58, 0x0b, 0xa8, 0x05, 0x93, 0xa2, 0xb1, 0xe4, + 0x3d, 0x6f, 0x4c, 0x50, 0x87, 0x12, 0xb0, 0xdf, 0x8a, 0xc3, 0xac, 0x8c, 0x5b, 0x7f, 0x94, 0x5d, + 0xfe, 0xa3, 0x00, 0x6c, 0x6a, 0x92, 0x15, 0x93, 0x25, 0xb3, 0x3f, 0xe4, 0x54, 0xcf, 0x32, 0xbe, + 0x9a, 0xeb, 0x85, 0x3c, 0xfd, 0xcd, 0x38, 0xe4, 0xc3, 0x9e, 0xfe, 0x23, 0xb0, 0x83, 0xa0, 0xd5, + 0x60, 0xdd, 0x48, 0xf2, 0xff, 0xdc, 0x3a, 0x64, 0xdd, 0xe8, 0x8b, 0xc1, 0xc3, 0x17, 0x8c, 0xef, + 0xc7, 0x21, 0xdd, 0x50, 0x1d, 0xb5, 0xe3, 0xa2, 0x6b, 0x7d, 0x99, 0xa0, 0xb8, 0xae, 0xeb, 0xfb, + 0xff, 0xdc, 0xfc, 0x76, 0x80, 0x05, 0xe0, 0xa7, 0x07, 0x24, 0x82, 0x8f, 0xc0, 0x34, 0x39, 0x6b, + 0x86, 0x9e, 0xec, 0xc7, 0xe9, 0xf3, 0x4a, 0x72, 0x58, 0x0c, 0x1e, 0x2b, 0xa1, 0x25, 0xc8, 0x11, + 0xb5, 0x60, 0x49, 0x24, 0x3a, 0xd0, 0x51, 0x6f, 0xd7, 0x99, 0x04, 0x3d, 0x05, 0x68, 0xcf, 0x3f, + 0xfd, 0x2b, 0x81, 0x0b, 0x88, 0xde, 0x6c, 0x50, 0x23, 0xd4, 0xa3, 0x79, 0x5c, 0xaa, 0x27, 0x8f, + 0x43, 0x3f, 0xce, 0x92, 0xca, 0x9e, 0x63, 0x28, 0xcf, 0xe7, 0xd7, 0x8e, 0x16, 0xa9, 0xdf, 0x7f, + 0x7b, 0x69, 0xe1, 0x40, 0xed, 0x18, 0xa5, 0xe2, 0x00, 0xca, 0x22, 0x4d, 0x32, 0xa3, 0xc7, 0xd7, + 0x50, 0x04, 0x7f, 0x3e, 0x06, 0x28, 0x58, 0x9c, 0x65, 0xec, 0xda, 0xe4, 0x7c, 0x44, 0xb2, 0xe7, + 0x50, 0xaa, 0x1b, 0x3b, 0x3c, 0x7b, 0x0e, 0xf0, 0x22, 0x7b, 0x0e, 0xcd, 0x88, 0x8b, 0xc1, 0xe2, + 0x17, 0x1f, 0x35, 0xed, 0x79, 0x78, 0xf4, 0xae, 0x68, 0x13, 0xc5, 0xff, 0x10, 0x83, 0x93, 0x7d, + 0xd1, 0xe4, 0x1b, 0xfb, 0x27, 0x01, 0x39, 0xa1, 0x4a, 0xfe, 0x2f, 0xf8, 0x98, 0xd1, 0x47, 0x0e, + 0xce, 0x59, 0xa7, 0x6f, 0xe5, 0xbc, 0x11, 0x5d, 0xbf, 0x7f, 0xd8, 0xa4, 0xdf, 0xef, 0x1f, 0x7b, + 0x05, 0xf0, 0x9f, 0xc5, 0x60, 0x3e, 0x6c, 0x8c, 0xdf, 0xad, 0x0d, 0xc8, 0x87, 0x6d, 0xe1, 0x1d, + 0x7a, 0x78, 0x9c, 0x0e, 0xf1, 0xbe, 0x44, 0xf0, 0xe8, 0xc5, 0x60, 0xe2, 0xb2, 0x5b, 0xa7, 0x67, + 0xc6, 0xf6, 0x8d, 0xb0, 0xa9, 0x77, 0x02, 0x27, 0x45, 0xbe, 0x93, 0x6c, 0x58, 0x96, 0x81, 0xfe, + 0x34, 0xcc, 0x9a, 0x96, 0xa7, 0x90, 0x28, 0xc7, 0x2d, 0x85, 0x1f, 0x81, 0xd9, 0xea, 0xf7, 0xe2, + 0xd1, 0x5c, 0xf6, 0xdb, 0x6f, 0x2f, 0xf5, 0x53, 0xf5, 0xf8, 0x71, 0xc6, 0xb4, 0xbc, 0x0a, 0xad, + 0xdf, 0x62, 0x07, 0x64, 0x07, 0xa6, 0xa2, 0x4d, 0xb3, 0xd5, 0x72, 0xfd, 0xc8, 0x4d, 0x4f, 0x1d, + 0xd6, 0x6c, 0x7e, 0x27, 0xd4, 0x26, 0x7b, 0x39, 0xea, 0x7b, 0x6f, 0x2e, 0xc5, 0x1e, 0xff, 0x5a, + 0x0c, 0x20, 0xb8, 0x0b, 0x40, 0x4f, 0xc2, 0x89, 0xca, 0xe6, 0x46, 0x4d, 0x69, 0x6e, 0x95, 0xb7, + 0xb6, 0x9b, 0xd1, 0x57, 0xa8, 0xc5, 0xe5, 0xb2, 0x6b, 0x63, 0x4d, 0xdf, 0xd5, 0x71, 0x0b, 0x3d, + 0x0a, 0xf3, 0x51, 0x6d, 0x52, 0xaa, 0xd7, 0xa4, 0xd8, 0x42, 0xfe, 0xce, 0xdd, 0xe5, 0x0c, 0xcb, + 0xa3, 0x70, 0x0b, 0x9d, 0x86, 0x63, 0xfd, 0x7a, 0xab, 0x1b, 0x57, 0xa4, 0xf8, 0xc2, 0xd4, 0x9d, + 0xbb, 0xcb, 0x59, 0x3f, 0xe1, 0x42, 0x45, 0x40, 0x61, 0x4d, 0xce, 0x97, 0x58, 0x80, 0x3b, 0x77, + 0x97, 0xd3, 0xcc, 0x6d, 0x0b, 0xc9, 0x4f, 0x7c, 0x7e, 0x71, 0xa2, 0x72, 0x79, 0xe8, 0xf5, 0xf1, + 0x93, 0x87, 0x7a, 0xec, 0xb6, 0x7f, 0x25, 0x1c, 0xb9, 0x33, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x4c, 0x91, 0xb0, 0x01, 0x54, 0x66, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2214,6 +2219,13 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.BondDenom) > 0 { + i -= len(m.BondDenom) + copy(dAtA[i:], m.BondDenom) + i = encodeVarintStaking(dAtA, i, uint64(len(m.BondDenom))) + i-- + dAtA[i] = 0x62 + } { size := m.MinSelfDelegation.Size() i -= size @@ -2639,12 +2651,12 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 + n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err10 != nil { + return 0, err10 } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2695,12 +2707,12 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 + n12, err12 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err12 != nil { + return 0, err12 } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) + i -= n12 + i = encodeVarintStaking(dAtA, i, uint64(n12)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2821,12 +2833,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 + n13, err13 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) + if err13 != nil { + return 0, err13 } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) + i -= n13 + i = encodeVarintStaking(dAtA, i, uint64(n13)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3128,6 +3140,10 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.MinSelfDelegation.Size() n += 1 + l + sovStaking(uint64(l)) + l = len(m.BondDenom) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } return n } @@ -4376,6 +4392,38 @@ func (m *Validator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BondDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BondDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5288,7 +5336,7 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowStaking @@ -5298,16 +5346,15 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthStaking } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthStaking } @@ -5322,7 +5369,7 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowStaking @@ -5332,16 +5379,15 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthStaking } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthStaking } @@ -5458,7 +5504,7 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field InitialBalance", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowStaking @@ -5468,16 +5514,15 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthStaking } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthStaking } diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index de558ee1a458..316635c73aa9 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -11,7 +11,7 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types1 "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 421be9f95356..8ea9a34212fa 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -59,6 +59,7 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio UnbondingTime: time.Unix(0, 0).UTC(), Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), MinSelfDelegation: sdk.OneInt(), + BondDenom: sdk.DefaultBondDenom, }, nil } @@ -454,7 +455,9 @@ func (v *Validator) MinEqual(other *Validator) bool { v.Commission.Equal(other.Commission) && v.Jailed == other.Jailed && v.MinSelfDelegation.Equal(other.MinSelfDelegation) && - v.ConsensusPubkey.Equal(other.ConsensusPubkey) + v.ConsensusPubkey.Equal(other.ConsensusPubkey) && + v.BondDenom == other.BondDenom + } // Equal checks if the receiver equals the parameter @@ -467,6 +470,7 @@ func (v *Validator) Equal(v2 *Validator) bool { func (v Validator) IsJailed() bool { return v.Jailed } func (v Validator) GetMoniker() string { return v.Description.Moniker } func (v Validator) GetStatus() BondStatus { return v.Status } +func (v Validator) GetBondDenom() string { return v.BondDenom } func (v Validator) GetOperator() sdk.ValAddress { if v.OperatorAddress == "" { return nil diff --git a/x/upgrade/types/tx.pb.go b/x/upgrade/types/tx.pb.go index 47d9edbfd715..e74fbe166b9e 100644 --- a/x/upgrade/types/tx.pb.go +++ b/x/upgrade/types/tx.pb.go @@ -8,7 +8,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" grpc "google.golang.org/grpc" diff --git a/x/upgrade/types/upgrade.pb.go b/x/upgrade/types/upgrade.pb.go index 1c4167f9fdd3..aaaae123f2d9 100644 --- a/x/upgrade/types/upgrade.pb.go +++ b/x/upgrade/types/upgrade.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "google.golang.org/protobuf/types/known/timestamppb"