From e20e717aa5ce206b9bd5e2e29af6a455d22e9150 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 27 Jul 2020 10:41:10 -0400 Subject: [PATCH 01/28] Remove HybridCodec --- codec/hybrid_codec.go | 69 ------------------ codec/hybrid_codec_test.go | 108 ----------------------------- simapp/params/amino.go | 2 +- simapp/params/proto.go | 2 +- x/auth/tx/builder_test.go | 2 +- x/auth/types/codec.go | 2 +- x/bank/types/codec.go | 2 +- x/crisis/types/codec.go | 2 +- x/distribution/types/codec.go | 2 +- x/evidence/types/codec.go | 2 +- x/gov/types/codec.go | 2 +- x/ibc-transfer/types/codec.go | 2 +- x/ibc/03-connection/types/codec.go | 2 +- x/ibc/04-channel/types/codec.go | 2 +- x/ibc/23-commitment/types/codec.go | 3 +- x/params/types/proposal/codec.go | 2 +- x/slashing/types/codec.go | 2 +- x/staking/types/codec.go | 2 +- 18 files changed, 16 insertions(+), 194 deletions(-) delete mode 100644 codec/hybrid_codec.go delete mode 100644 codec/hybrid_codec_test.go diff --git a/codec/hybrid_codec.go b/codec/hybrid_codec.go deleted file mode 100644 index 7fbd109a3db0..000000000000 --- a/codec/hybrid_codec.go +++ /dev/null @@ -1,69 +0,0 @@ -package codec - -import "github.com/cosmos/cosmos-sdk/codec/types" - -// HybridCodec defines a codec that utilizes Protobuf for binary encoding -// and Amino for JSON encoding. -type HybridCodec struct { - proto Marshaler - amino Marshaler -} - -func NewHybridCodec(amino *Codec, unpacker types.AnyUnpacker) Marshaler { - return &HybridCodec{ - proto: NewProtoCodec(unpacker), - amino: NewAminoCodec(amino), - } -} - -func (hc *HybridCodec) MarshalBinaryBare(o ProtoMarshaler) ([]byte, error) { - return hc.proto.MarshalBinaryBare(o) -} - -func (hc *HybridCodec) MustMarshalBinaryBare(o ProtoMarshaler) []byte { - return hc.proto.MustMarshalBinaryBare(o) -} - -func (hc *HybridCodec) MarshalBinaryLengthPrefixed(o ProtoMarshaler) ([]byte, error) { - return hc.proto.MarshalBinaryLengthPrefixed(o) -} - -func (hc *HybridCodec) MustMarshalBinaryLengthPrefixed(o ProtoMarshaler) []byte { - return hc.proto.MustMarshalBinaryLengthPrefixed(o) -} - -func (hc *HybridCodec) UnmarshalBinaryBare(bz []byte, ptr ProtoMarshaler) error { - return hc.proto.UnmarshalBinaryBare(bz, ptr) -} - -func (hc *HybridCodec) MustUnmarshalBinaryBare(bz []byte, ptr ProtoMarshaler) { - hc.proto.MustUnmarshalBinaryBare(bz, ptr) -} - -func (hc *HybridCodec) UnmarshalBinaryLengthPrefixed(bz []byte, ptr ProtoMarshaler) error { - return hc.proto.UnmarshalBinaryLengthPrefixed(bz, ptr) -} - -func (hc *HybridCodec) MustUnmarshalBinaryLengthPrefixed(bz []byte, ptr ProtoMarshaler) { - hc.proto.MustUnmarshalBinaryLengthPrefixed(bz, ptr) -} - -func (hc *HybridCodec) MarshalJSON(o interface{}) ([]byte, error) { - return hc.amino.MarshalJSON(o) -} - -func (hc *HybridCodec) MustMarshalJSON(o interface{}) []byte { - return hc.amino.MustMarshalJSON(o) -} - -func (hc *HybridCodec) UnmarshalJSON(bz []byte, ptr interface{}) error { - return hc.amino.UnmarshalJSON(bz, ptr) -} - -func (hc *HybridCodec) MustUnmarshalJSON(bz []byte, ptr interface{}) { - hc.amino.MustUnmarshalJSON(bz, ptr) -} - -func (hc *HybridCodec) UnpackAny(any *types.Any, iface interface{}) error { - return hc.proto.UnpackAny(any, iface) -} diff --git a/codec/hybrid_codec_test.go b/codec/hybrid_codec_test.go deleted file mode 100644 index bb02c17d838a..000000000000 --- a/codec/hybrid_codec_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package codec_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/testutil/testdata" -) - -func TestHybridCodec(t *testing.T) { - testCases := []struct { - name string - codec codec.Marshaler - input codec.ProtoMarshaler - recv codec.ProtoMarshaler - marshalErr bool - unmarshalErr bool - }{ - { - "valid encoding and decoding", - codec.NewHybridCodec(createTestCodec(), createTestInterfaceRegistry()), - &testdata.Dog{Name: "rufus"}, - &testdata.Dog{}, - false, - false, - }, - { - "invalid decode type", - codec.NewHybridCodec(createTestCodec(), createTestInterfaceRegistry()), - &testdata.Dog{Name: "rufus"}, - &testdata.Cat{}, - false, - true, - }, - } - - for _, tc := range testCases { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - bz, err := tc.codec.MarshalBinaryBare(tc.input) - - if tc.marshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustMarshalBinaryBare(tc.input) }) - } else { - var bz2 []byte - require.NoError(t, err) - require.NotPanics(t, func() { bz2 = tc.codec.MustMarshalBinaryBare(tc.input) }) - require.Equal(t, bz, bz2) - - err := tc.codec.UnmarshalBinaryBare(bz, tc.recv) - if tc.unmarshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustUnmarshalBinaryBare(bz, tc.recv) }) - } else { - require.NoError(t, err) - require.NotPanics(t, func() { tc.codec.MustUnmarshalBinaryBare(bz, tc.recv) }) - require.Equal(t, tc.input, tc.recv) - } - } - - bz, err = tc.codec.MarshalBinaryLengthPrefixed(tc.input) - if tc.marshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustMarshalBinaryLengthPrefixed(tc.input) }) - } else { - var bz2 []byte - require.NoError(t, err) - require.NotPanics(t, func() { bz2 = tc.codec.MustMarshalBinaryLengthPrefixed(tc.input) }) - require.Equal(t, bz, bz2) - - err := tc.codec.UnmarshalBinaryLengthPrefixed(bz, tc.recv) - if tc.unmarshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustUnmarshalBinaryLengthPrefixed(bz, tc.recv) }) - } else { - require.NoError(t, err) - require.NotPanics(t, func() { tc.codec.MustUnmarshalBinaryLengthPrefixed(bz, tc.recv) }) - require.Equal(t, tc.input, tc.recv) - } - } - - bz, err = tc.codec.MarshalJSON(tc.input) - if tc.marshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustMarshalJSON(tc.input) }) - } else { - var bz2 []byte - require.NoError(t, err) - require.NotPanics(t, func() { bz2 = tc.codec.MustMarshalJSON(tc.input) }) - require.Equal(t, bz, bz2) - - err := tc.codec.UnmarshalJSON(bz, tc.recv) - if tc.unmarshalErr { - require.Error(t, err) - require.Panics(t, func() { tc.codec.MustUnmarshalJSON(bz, tc.recv) }) - } else { - require.NoError(t, err) - require.NotPanics(t, func() { tc.codec.MustUnmarshalJSON(bz, tc.recv) }) - require.Equal(t, tc.input, tc.recv) - } - } - }) - } -} diff --git a/simapp/params/amino.go b/simapp/params/amino.go index 871dba814e64..a06d06a5747d 100644 --- a/simapp/params/amino.go +++ b/simapp/params/amino.go @@ -14,7 +14,7 @@ func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() // TODO: switch to using AminoCodec here once amino compatibility is fixed - marshaler := codec.NewHybridCodec(cdc, interfaceRegistry) + marshaler := codec.NewProtoCodec(interfaceRegistry) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, diff --git a/simapp/params/proto.go b/simapp/params/proto.go index a5c859ada421..72d5e00bb3c7 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -14,7 +14,7 @@ import ( func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() - marshaler := codec.NewHybridCodec(cdc, interfaceRegistry) + marshaler := codec.NewProtoCodec(interfaceRegistry) txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) return EncodingConfig{ diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index c115f474ac83..2f7556ec2e0a 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -21,7 +21,7 @@ import ( func TestTxBuilder(t *testing.T) { _, pubkey, addr := testdata.KeyTestPubAddr() - marshaler := codec.NewHybridCodec(codec.New(), codectypes.NewInterfaceRegistry()) + marshaler := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) tx := newBuilder(std.DefaultPublicKeyCodec{}) cdc := std.DefaultPublicKeyCodec{} diff --git a/x/auth/types/codec.go b/x/auth/types/codec.go index 30ebf84a043a..83bd1dd7f7cd 100644 --- a/x/auth/types/codec.go +++ b/x/auth/types/codec.go @@ -37,7 +37,7 @@ func RegisterKeyTypeCodec(o interface{}, name string) { var ( amino = codec.New() - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/bank/types/codec.go b/x/bank/types/codec.go index ce5c48388008..abfea5ddb367 100644 --- a/x/bank/types/codec.go +++ b/x/bank/types/codec.go @@ -39,7 +39,7 @@ var ( // // The actual codec used for serialization should be provided to x/staking and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/crisis/types/codec.go b/x/crisis/types/codec.go index b35dd6d9a351..a9050a34c487 100644 --- a/x/crisis/types/codec.go +++ b/x/crisis/types/codec.go @@ -28,7 +28,7 @@ var ( // // The actual codec used for serialization should be provided to x/crisis and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, codectypes.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/distribution/types/codec.go b/x/distribution/types/codec.go index 0e587ce2f1d6..9b49eeb77603 100644 --- a/x/distribution/types/codec.go +++ b/x/distribution/types/codec.go @@ -40,7 +40,7 @@ var ( // // The actual codec used for serialization should be provided to x/distribution and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/evidence/types/codec.go b/x/evidence/types/codec.go index bee5be2cf9da..8fdaac5e3693 100644 --- a/x/evidence/types/codec.go +++ b/x/evidence/types/codec.go @@ -34,7 +34,7 @@ var ( // // The actual codec used for serialization should be provided to x/evidence and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/gov/types/codec.go b/x/gov/types/codec.go index 6fdb45821823..e6a7ef0ef1a6 100644 --- a/x/gov/types/codec.go +++ b/x/gov/types/codec.go @@ -49,7 +49,7 @@ var ( // // The actual codec used for serialization should be provided to x/gov and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/ibc-transfer/types/codec.go b/x/ibc-transfer/types/codec.go index 66db072e6467..265150d782d7 100644 --- a/x/ibc-transfer/types/codec.go +++ b/x/ibc-transfer/types/codec.go @@ -29,7 +29,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc-transfer and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, cdctypes.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/ibc/03-connection/types/codec.go b/x/ibc/03-connection/types/codec.go index f5ebbbe6bdb1..a09c6735eb8c 100644 --- a/x/ibc/03-connection/types/codec.go +++ b/x/ibc/03-connection/types/codec.go @@ -41,7 +41,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc/03-connectionl and // defined at the application level. - SubModuleCdc = codec.NewHybridCodec(amino, cdctypes.NewInterfaceRegistry()) + SubModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/ibc/04-channel/types/codec.go b/x/ibc/04-channel/types/codec.go index 37397e750fc1..0e1b63a2674f 100644 --- a/x/ibc/04-channel/types/codec.go +++ b/x/ibc/04-channel/types/codec.go @@ -50,7 +50,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc/04-channel and // defined at the application level. - SubModuleCdc = codec.NewHybridCodec(amino, cdctypes.NewInterfaceRegistry()) + SubModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/ibc/23-commitment/types/codec.go b/x/ibc/23-commitment/types/codec.go index a1579a944dc4..ea67969401d1 100644 --- a/x/ibc/23-commitment/types/codec.go +++ b/x/ibc/23-commitment/types/codec.go @@ -2,7 +2,6 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/exported" ) @@ -29,7 +28,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc/23-commitmentl and // defined at the application level. - SubModuleCdc = codec.NewHybridCodec(amino, cdctypes.NewInterfaceRegistry()) + SubModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/params/types/proposal/codec.go b/x/params/types/proposal/codec.go index a6bae4968ed1..dcbb3607290c 100644 --- a/x/params/types/proposal/codec.go +++ b/x/params/types/proposal/codec.go @@ -15,7 +15,7 @@ type Codec struct { } func NewCodec(amino *codec.Codec) *Codec { - return &Codec{Marshaler: codec.NewHybridCodec(amino, types.NewInterfaceRegistry()), amino: amino} + return &Codec{Marshaler: codec.NewAminoCodec(amino), amino: amino} } // ModuleCdc is the module codec. diff --git a/x/slashing/types/codec.go b/x/slashing/types/codec.go index 256e39f5aa7d..f9b8b995b266 100644 --- a/x/slashing/types/codec.go +++ b/x/slashing/types/codec.go @@ -27,7 +27,7 @@ var ( // // The actual codec used for serialization should be provided to x/slashing and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { diff --git a/x/staking/types/codec.go b/x/staking/types/codec.go index 57d77e15d17d..6fe0537f0278 100644 --- a/x/staking/types/codec.go +++ b/x/staking/types/codec.go @@ -37,7 +37,7 @@ var ( // // The actual codec used for serialization should be provided to x/staking and // defined at the application level. - ModuleCdc = codec.NewHybridCodec(amino, types.NewInterfaceRegistry()) + ModuleCdc = codec.NewAminoCodec(amino) ) func init() { From 6bd19c46e01a3920f5fd51f4149a62e5663ed653 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Fri, 7 Aug 2020 13:45:48 -0400 Subject: [PATCH 02/28] WIP on fixing proto JSON issues --- client/cmd.go | 17 +++++++++++++++ client/legacy.go | 14 ++++++++++++ server/export.go | 11 +++++----- server/export_test.go | 9 ++++---- server/start.go | 11 ++++++---- simapp/app.go | 8 +++---- simapp/export.go | 5 ++--- simapp/genesis.go | 6 ++---- testutil/network/util.go | 8 +++---- x/auth/genesis.go | 2 +- x/auth/types/codec.go | 9 +++++++- x/auth/types/genesis.go | 6 +++--- x/auth/vesting/types/codec.go | 8 +++++++ x/bank/keeper/genesis.go | 2 +- x/bank/keeper/keeper.go | 2 +- x/bank/types/genesis.go | 10 ++++----- x/capability/genesis.go | 4 ++-- x/capability/types/genesis.go | 4 ++-- x/capability/types/genesis_test.go | 2 +- x/crisis/keeper/genesis.go | 4 ++-- x/crisis/module.go | 4 ++-- x/crisis/types/genesis.go | 10 ++++----- x/distribution/keeper/genesis.go | 2 +- x/distribution/module.go | 2 +- x/distribution/types/genesis.go | 10 ++++----- x/evidence/genesis.go | 6 +++--- x/evidence/genesis_test.go | 2 +- x/evidence/module.go | 2 +- x/evidence/types/genesis.go | 8 +++---- x/evidence/types/genesis_test.go | 4 ++-- x/genutil/client/rest/query.go | 2 +- x/genutil/collect.go | 6 +++--- x/genutil/module.go | 2 +- x/genutil/types/genesis_state.go | 25 +++++++++++----------- x/gov/genesis.go | 6 +++--- x/gov/module.go | 4 ++-- x/gov/types/genesis.go | 8 +++---- x/ibc-transfer/genesis.go | 4 ++-- x/ibc-transfer/types/genesis.go | 4 ++-- x/ibc-transfer/types/genesis_test.go | 6 +++--- x/ibc/07-tendermint/types/codec.go | 2 +- x/ibc/23-commitment/types/codec.go | 2 +- x/ibc/genesis.go | 6 +++--- x/ibc/genesis_test.go | 18 ++++++++-------- x/ibc/module.go | 2 +- x/ibc/types/genesis.go | 6 +++--- x/mint/genesis.go | 4 ++-- x/mint/module.go | 2 +- x/mint/types/genesis.go | 8 +++---- x/params/keeper/keeper.go | 22 ++++++++++--------- x/params/types/subspace.go | 32 +++++++++++++++------------- x/slashing/genesis.go | 2 +- x/slashing/module.go | 2 +- x/slashing/types/genesis.go | 8 +++---- x/staking/genesis.go | 4 ++-- x/staking/types/genesis.go | 12 +++++------ 56 files changed, 219 insertions(+), 172 deletions(-) create mode 100644 client/legacy.go diff --git a/client/cmd.go b/client/cmd.go index 1502cfab33a9..cafb4b627c81 100644 --- a/client/cmd.go +++ b/client/cmd.go @@ -231,3 +231,20 @@ func SetCmdClientContext(cmd *cobra.Command, clientCtx Context) error { return nil } + +// AddPreRunEHook adds a PreRunE middleware hook to the command. It wraps any existing PreRunE +// hook and calls it first instead of replacing it. +func AddPreRunEHook(cmd *cobra.Command, preRunHook func(cmd *cobra.Command, args []string) error) { + existing := cmd.PreRunE + if existing != nil { + cmd.PreRunE = func(cmd *cobra.Command, args []string) error { + err := existing(cmd, args) + if err != nil { + return err + } + return preRunHook(cmd, args) + } + } else { + cmd.PreRunE = preRunHook + } +} diff --git a/client/legacy.go b/client/legacy.go new file mode 100644 index 000000000000..9cb3676838fa --- /dev/null +++ b/client/legacy.go @@ -0,0 +1,14 @@ +package client + +import "github.com/spf13/cobra" + +// WithLegacyAminoJSON configures the command's client Context to use the legacy +// amino *codec.Codec as its JSONMarshaler. This is to be used for commands that +// need to always use amino JSON for legacy compatibility reasons. +func WithLegacyAminoJSON(cmd *cobra.Command) { + AddPreRunEHook(cmd, func(cmd *cobra.Command, args []string) error { + clientCtx := GetClientContextFromCmd(cmd) + clientCtx = clientCtx.WithJSONMarshaler(clientCtx.Codec) + return SetCmdClientContext(cmd, clientCtx) + }) +} diff --git a/server/export.go b/server/export.go index 5be74127d789..fed418b97a69 100644 --- a/server/export.go +++ b/server/export.go @@ -3,6 +3,7 @@ package server // DONTCOVER import ( + "encoding/json" "fmt" "io/ioutil" "os" @@ -10,9 +11,7 @@ import ( "github.com/spf13/cobra" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -29,9 +28,6 @@ func ExportCmd(appExporter types.AppExporter, defaultNodeHome string) *cobra.Com Use: "export", Short: "Export state to JSON", RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - cdc := clientCtx.JSONMarshaler - serverCtx := GetServerContextFromCmd(cmd) config := serverCtx.Config @@ -94,7 +90,10 @@ func ExportCmd(appExporter types.AppExporter, defaultNodeHome string) *cobra.Com }, } - encoded, err := codec.MarshalJSONIndent(cdc, doc) + // NOTE: for now we're just using standard JSON marshaling for the root GenesisDoc. + // These types are in Tendermint, don't support proto and as far as we know, don't need it. + // All of the protobuf/amino state is inside AppState + encoded, err := json.MarshalIndent(doc, "", " ") if err != nil { return err } diff --git a/server/export_test.go b/server/export_test.go index a65163dec60b..009698114fda 100644 --- a/server/export_test.go +++ b/server/export_test.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/types/errors" @@ -41,9 +40,9 @@ func TestExportCmd_ConsensusParams(t *testing.T) { serverCtx := NewDefaultContext() serverCtx.Config.RootDir = tempDir - clientCtx := client.Context{}.WithJSONMarshaler(app.Codec()) + clientCtx := client.Context{}.WithJSONMarshaler(app.AppCodec()) - genDoc := newDefaultGenesisDoc(app.Codec()) + genDoc := newDefaultGenesisDoc() err = saveGenesisFile(genDoc, serverCtx.Config.GenesisFile()) app.InitChain( @@ -90,10 +89,10 @@ func createConfigFolder(dir string) error { return os.Mkdir(path.Join(dir, "config"), 0700) } -func newDefaultGenesisDoc(cdc *codec.Codec) *tmtypes.GenesisDoc { +func newDefaultGenesisDoc() *tmtypes.GenesisDoc { genesisState := simapp.NewDefaultGenesisState() - stateBytes, err := codec.MarshalJSONIndent(cdc, genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { panic(err) } diff --git a/server/start.go b/server/start.go index 64dba2d3c6c6..8a4a95c2f8de 100644 --- a/server/start.go +++ b/server/start.go @@ -8,6 +8,8 @@ import ( "runtime/pprof" "time" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/spf13/cobra" "github.com/tendermint/tendermint/abci/server" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" @@ -21,7 +23,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" @@ -106,7 +107,7 @@ which accepts a path for the resulting pprof file. serverCtx.Logger.Info("starting ABCI with Tendermint") - err := startInProcess(serverCtx, clientCtx.JSONMarshaler, appCreator) + err := startInProcess(serverCtx, clientCtx.Codec, appCreator) return err }, } @@ -177,7 +178,8 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { select {} } -func startInProcess(ctx *Context, cdc codec.JSONMarshaler, appCreator types.AppCreator) error { +// legacyAminoCdc is used for the legacy REST API +func startInProcess(ctx *Context, legacyAminoCdc *codec.Codec, appCreator types.AppCreator) error { cfg := ctx.Config home := cfg.RootDir @@ -230,7 +232,8 @@ func startInProcess(ctx *Context, cdc codec.JSONMarshaler, appCreator types.AppC clientCtx := client.Context{}. WithHomeDir(home). WithChainID(genDoc.ChainID). - WithJSONMarshaler(cdc). + WithJSONMarshaler(legacyAminoCdc). + WithCodec(legacyAminoCdc). WithClient(local.New(tmNode)) apiSrv = api.New(clientCtx, ctx.Logger.With("module", "api-server")) diff --git a/simapp/app.go b/simapp/app.go index 992725a077a6..58d2fc27888f 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -203,7 +203,7 @@ func NewSimApp( memKeys: memKeys, } - app.ParamsKeeper = initParamsKeeper(appCodec, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) + app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) // set the BaseApp's parameter store bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(std.ConsensusParamsKeyTable())) @@ -417,7 +417,7 @@ func (app *SimApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.Re func (app *SimApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { var genesisState GenesisState app.cdc.MustUnmarshalJSON(req.AppStateBytes, &genesisState) - return app.mm.InitGenesis(ctx, app.cdc, genesisState) + return app.mm.InitGenesis(ctx, app.appCodec, genesisState) } // LoadHeight loads a particular height @@ -519,8 +519,8 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.Marshaler, key, tkey sdk.StoreKey) paramskeeper.Keeper { - paramsKeeper := paramskeeper.NewKeeper(appCodec, key, tkey) +func initParamsKeeper(appCodec codec.Marshaler, legacyAmino *codec.Codec, key, tkey sdk.StoreKey) paramskeeper.Keeper { + paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) paramsKeeper.Subspace(banktypes.ModuleName) diff --git a/simapp/export.go b/simapp/export.go index 363bc13954a5..673130658534 100644 --- a/simapp/export.go +++ b/simapp/export.go @@ -7,7 +7,6 @@ import ( abci "github.com/tendermint/tendermint/abci/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" @@ -28,8 +27,8 @@ func (app *SimApp) ExportAppStateAndValidators( app.prepForZeroHeightGenesis(ctx, jailWhiteList) } - genState := app.mm.ExportGenesis(ctx, app.cdc) - appState, err = codec.MarshalJSONIndent(app.cdc, genState) + genState := app.mm.ExportGenesis(ctx, app.appCodec) + appState, err = json.MarshalIndent(genState, "", " ") if err != nil { return nil, nil, nil, err } diff --git a/simapp/genesis.go b/simapp/genesis.go index d3ff8cda93a4..5a8f18b1aae4 100644 --- a/simapp/genesis.go +++ b/simapp/genesis.go @@ -2,8 +2,6 @@ package simapp import ( "encoding/json" - - "github.com/cosmos/cosmos-sdk/std" ) // The genesis state of the blockchain is represented here as a map of raw json @@ -17,6 +15,6 @@ type GenesisState map[string]json.RawMessage // NewDefaultGenesisState generates the default state for the application. func NewDefaultGenesisState() GenesisState { - cdc := std.MakeCodec(ModuleBasics) - return ModuleBasics.DefaultGenesis(cdc) + encCfg := MakeEncodingConfig() + return ModuleBasics.DefaultGenesis(encCfg.Marshaler) } diff --git a/testutil/network/util.go b/testutil/network/util.go index 59ec3dca4394..952f7a8d0d55 100644 --- a/testutil/network/util.go +++ b/testutil/network/util.go @@ -1,6 +1,7 @@ package network import ( + "encoding/json" "path/filepath" "time" @@ -13,7 +14,6 @@ import ( "github.com/tendermint/tendermint/types" tmtime "github.com/tendermint/tendermint/types/time" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/api" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -142,16 +142,16 @@ func initGenFiles(cfg Config, genAccounts []authtypes.GenesisAccount, genBalance } authGenState.Accounts = accounts - cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(authGenState) + cfg.GenesisState[authtypes.ModuleName] = cfg.Codec.MustMarshalJSON(&authGenState) // set the balances in the genesis state var bankGenState banktypes.GenesisState cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[banktypes.ModuleName], &bankGenState) bankGenState.Balances = genBalances - cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(bankGenState) + cfg.GenesisState[banktypes.ModuleName] = cfg.Codec.MustMarshalJSON(&bankGenState) - appGenStateJSON, err := codec.MarshalJSONIndent(cfg.Codec, cfg.GenesisState) + appGenStateJSON, err := json.MarshalIndent(cfg.GenesisState, "", " ") if err != nil { return err } diff --git a/x/auth/genesis.go b/x/auth/genesis.go index a0a2a96001d7..851b588083d4 100644 --- a/x/auth/genesis.go +++ b/x/auth/genesis.go @@ -28,7 +28,7 @@ func InitGenesis(ctx sdk.Context, ak keeper.AccountKeeper, data types.GenesisSta } // ExportGenesis returns a GenesisState for a given context and keeper -func ExportGenesis(ctx sdk.Context, ak keeper.AccountKeeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, ak keeper.AccountKeeper) *types.GenesisState { params := ak.GetParams(ctx) var genAccounts types.GenesisAccounts diff --git a/x/auth/types/codec.go b/x/auth/types/codec.go index 83bd1dd7f7cd..033c9d7d3f5b 100644 --- a/x/auth/types/codec.go +++ b/x/auth/types/codec.go @@ -21,11 +21,18 @@ func RegisterCodec(cdc *codec.Codec) { // and creates a registry of it's concrete implementations func RegisterInterfaces(registry types.InterfaceRegistry) { registry.RegisterInterface( - "cosmos_sdk.auth.v1.AccountI", + "cosmos.auth.AccountI", (*AccountI)(nil), &BaseAccount{}, &ModuleAccount{}, ) + + registry.RegisterInterface( + "cosmos.auth.GenesisAccount", + (*GenesisAccount)(nil), + &BaseAccount{}, + &ModuleAccount{}, + ) } // RegisterKeyTypeCodec registers an external concrete type defined in diff --git a/x/auth/types/genesis.go b/x/auth/types/genesis.go index 51e7871500c2..9dc9e3323b11 100644 --- a/x/auth/types/genesis.go +++ b/x/auth/types/genesis.go @@ -14,12 +14,12 @@ import ( var _ types.UnpackInterfacesMessage = GenesisState{} // NewGenesisState - Create a new genesis state -func NewGenesisState(params Params, accounts GenesisAccounts) GenesisState { +func NewGenesisState(params Params, accounts GenesisAccounts) *GenesisState { genAccounts, err := PackAccounts(accounts) if err != nil { panic(err) } - return GenesisState{ + return &GenesisState{ Params: params, Accounts: genAccounts, } @@ -38,7 +38,7 @@ func (g GenesisState) UnpackInterfaces(unpacker types.AnyUnpacker) error { } // DefaultGenesisState - Return a default genesis state -func DefaultGenesisState() GenesisState { +func DefaultGenesisState() *GenesisState { return NewGenesisState(DefaultParams(), GenesisAccounts{}) } diff --git a/x/auth/vesting/types/codec.go b/x/auth/vesting/types/codec.go index ac94ba2b6777..ab5174d5bac9 100644 --- a/x/auth/vesting/types/codec.go +++ b/x/auth/vesting/types/codec.go @@ -27,12 +27,20 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &DelayedVestingAccount{}, &PeriodicVestingAccount{}, ) + registry.RegisterImplementations( (*authtypes.AccountI)(nil), &DelayedVestingAccount{}, &ContinuousVestingAccount{}, &PeriodicVestingAccount{}, ) + + registry.RegisterImplementations( + (*authtypes.GenesisAccount)(nil), + &DelayedVestingAccount{}, + &ContinuousVestingAccount{}, + &PeriodicVestingAccount{}, + ) } var amino = codec.New() diff --git a/x/bank/keeper/genesis.go b/x/bank/keeper/genesis.go index 185084f62088..35dea7068bf0 100644 --- a/x/bank/keeper/genesis.go +++ b/x/bank/keeper/genesis.go @@ -34,7 +34,7 @@ func (k BaseKeeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) { } // ExportGenesis returns the bank module's genesis state. -func (k BaseKeeper) ExportGenesis(ctx sdk.Context) types.GenesisState { +func (k BaseKeeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { return types.NewGenesisState( k.GetParams(ctx), k.GetAccountsBalances(ctx), diff --git a/x/bank/keeper/keeper.go b/x/bank/keeper/keeper.go index 0856df181b92..9a1dc2fcc493 100644 --- a/x/bank/keeper/keeper.go +++ b/x/bank/keeper/keeper.go @@ -23,7 +23,7 @@ type Keeper interface { SendKeeper InitGenesis(sdk.Context, types.GenesisState) - ExportGenesis(sdk.Context) types.GenesisState + ExportGenesis(sdk.Context) *types.GenesisState GetSupply(ctx sdk.Context) exported.SupplyI SetSupply(ctx sdk.Context, supply exported.SupplyI) diff --git a/x/bank/types/genesis.go b/x/bank/types/genesis.go index b81948c54cb3..cc70b8c572b3 100644 --- a/x/bank/types/genesis.go +++ b/x/bank/types/genesis.go @@ -46,8 +46,8 @@ func ValidateGenesis(data GenesisState) error { } // NewGenesisState creates a new genesis state. -func NewGenesisState(params Params, balances []Balance, supply sdk.Coins, denomMetaData []Metadata) GenesisState { - return GenesisState{ +func NewGenesisState(params Params, balances []Balance, supply sdk.Coins, denomMetaData []Metadata) *GenesisState { + return &GenesisState{ Params: params, Balances: balances, Supply: supply, @@ -56,20 +56,20 @@ func NewGenesisState(params Params, balances []Balance, supply sdk.Coins, denomM } // DefaultGenesisState returns a default bank module genesis state. -func DefaultGenesisState() GenesisState { +func DefaultGenesisState() *GenesisState { return NewGenesisState(DefaultParams(), []Balance{}, DefaultSupply().GetTotal(), []Metadata{}) } // GetGenesisStateFromAppState returns x/bank GenesisState given raw application // genesis state. -func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) GenesisState { +func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) *GenesisState { var genesisState GenesisState if appState[ModuleName] != nil { cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) } - return genesisState + return &genesisState } // GenesisAccountIterator implements genesis account iteration. diff --git a/x/capability/genesis.go b/x/capability/genesis.go index 3122a2a55d0c..d733efa86b58 100644 --- a/x/capability/genesis.go +++ b/x/capability/genesis.go @@ -19,7 +19,7 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) } // ExportGenesis returns the capability module's exported genesis. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { index := k.GetLatestIndex(ctx) owners := []types.GenesisOwners{} @@ -36,7 +36,7 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { owners = append(owners, genOwner) } - return types.GenesisState{ + return &types.GenesisState{ Index: index, Owners: owners, } diff --git a/x/capability/types/genesis.go b/x/capability/types/genesis.go index 609de701b81b..95a734826b80 100644 --- a/x/capability/types/genesis.go +++ b/x/capability/types/genesis.go @@ -9,8 +9,8 @@ import ( const DefaultIndex uint64 = 1 // DefaultGenesis returns the default Capability genesis state -func DefaultGenesis() GenesisState { - return GenesisState{ +func DefaultGenesis() *GenesisState { + return &GenesisState{ Index: DefaultIndex, Owners: []GenesisOwners{}, } diff --git a/x/capability/types/genesis_test.go b/x/capability/types/genesis_test.go index 5741de1ac2cf..0820ba4a3669 100644 --- a/x/capability/types/genesis_test.go +++ b/x/capability/types/genesis_test.go @@ -120,7 +120,7 @@ func TestValidateGenesis(t *testing.T) { for _, tc := range testCases { tc := tc genState := DefaultGenesis() - tc.malleate(&genState) + tc.malleate(genState) err := genState.Validate() if tc.expPass { require.NoError(t, err, tc.name) diff --git a/x/crisis/keeper/genesis.go b/x/crisis/keeper/genesis.go index 2426217ed285..8420201d4e96 100644 --- a/x/crisis/keeper/genesis.go +++ b/x/crisis/keeper/genesis.go @@ -6,12 +6,12 @@ import ( ) // new crisis genesis -func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { +func (k Keeper) InitGenesis(ctx sdk.Context, data *types.GenesisState) { k.SetConstantFee(ctx, data.ConstantFee) } // ExportGenesis returns a GenesisState for a given context and keeper. -func (k Keeper) ExportGenesis(ctx sdk.Context) types.GenesisState { +func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { constantFee := k.GetConstantFee(ctx) return types.NewGenesisState(constantFee) } diff --git a/x/crisis/module.go b/x/crisis/module.go index cc0922b37a3f..20791a0cbd2a 100644 --- a/x/crisis/module.go +++ b/x/crisis/module.go @@ -50,7 +50,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, config client.TxE return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - return types.ValidateGenesis(data) + return types.ValidateGenesis(&data) } // RegisterRESTRoutes registers no REST routes for the crisis module. @@ -118,7 +118,7 @@ func (am AppModule) RegisterQueryService(grpc.Server) {} func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - am.keeper.InitGenesis(ctx, genesisState) + am.keeper.InitGenesis(ctx, &genesisState) am.keeper.AssertInvariants(ctx) return []abci.ValidatorUpdate{} } diff --git a/x/crisis/types/genesis.go b/x/crisis/types/genesis.go index 3de8ab6ff817..f53099130277 100644 --- a/x/crisis/types/genesis.go +++ b/x/crisis/types/genesis.go @@ -7,21 +7,21 @@ import ( ) // NewGenesisState creates a new GenesisState object -func NewGenesisState(constantFee sdk.Coin) GenesisState { - return GenesisState{ +func NewGenesisState(constantFee sdk.Coin) *GenesisState { + return &GenesisState{ ConstantFee: constantFee, } } // DefaultGenesisState creates a default GenesisState object -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ ConstantFee: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000)), } } // ValidateGenesis - validate crisis genesis data -func ValidateGenesis(data GenesisState) error { +func ValidateGenesis(data *GenesisState) error { if !data.ConstantFee.IsPositive() { return fmt.Errorf("constant fee must be positive: %s", data.ConstantFee) } diff --git a/x/distribution/keeper/genesis.go b/x/distribution/keeper/genesis.go index 8b8e19ff0a71..54c70c9f66c5 100644 --- a/x/distribution/keeper/genesis.go +++ b/x/distribution/keeper/genesis.go @@ -60,7 +60,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, data types.GenesisState) { } // ExportGenesis returns a GenesisState for a given context and keeper. -func (k Keeper) ExportGenesis(ctx sdk.Context) types.GenesisState { +func (k Keeper) ExportGenesis(ctx sdk.Context) *types.GenesisState { feePool := k.GetFeePool(ctx) params := k.GetParams(ctx) diff --git a/x/distribution/module.go b/x/distribution/module.go index cd91fad11cae..990c8144c554 100644 --- a/x/distribution/module.go +++ b/x/distribution/module.go @@ -59,7 +59,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, config sdkclient. return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - return types.ValidateGenesis(data) + return types.ValidateGenesis(&data) } // RegisterRESTRoutes registers the REST routes for the distribution module. diff --git a/x/distribution/types/genesis.go b/x/distribution/types/genesis.go index 3caaa9a91b00..b7e6aaa62862 100644 --- a/x/distribution/types/genesis.go +++ b/x/distribution/types/genesis.go @@ -8,9 +8,9 @@ func NewGenesisState( params Params, fp FeePool, dwis []DelegatorWithdrawInfo, pp sdk.ConsAddress, r []ValidatorOutstandingRewardsRecord, acc []ValidatorAccumulatedCommissionRecord, historical []ValidatorHistoricalRewardsRecord, cur []ValidatorCurrentRewardsRecord, dels []DelegatorStartingInfoRecord, slashes []ValidatorSlashEventRecord, -) GenesisState { +) *GenesisState { - return GenesisState{ + return &GenesisState{ Params: params, FeePool: fp, DelegatorWithdrawInfos: dwis, @@ -25,8 +25,8 @@ func NewGenesisState( } // get raw genesis raw message for testing -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ FeePool: InitialFeePool(), Params: DefaultParams(), DelegatorWithdrawInfos: []DelegatorWithdrawInfo{}, @@ -41,7 +41,7 @@ func DefaultGenesisState() GenesisState { } // ValidateGenesis validates the genesis state of distribution genesis input -func ValidateGenesis(gs GenesisState) error { +func ValidateGenesis(gs *GenesisState) error { if err := gs.Params.ValidateBasic(); err != nil { return err } diff --git a/x/evidence/genesis.go b/x/evidence/genesis.go index 6ca5d4315812..2be3fee88276 100644 --- a/x/evidence/genesis.go +++ b/x/evidence/genesis.go @@ -14,7 +14,7 @@ import ( // InitGenesis initializes the evidence module's state from a provided genesis // state. -func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { +func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs *types.GenesisState) { if err := gs.Validate(); err != nil { panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err)) } @@ -33,7 +33,7 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { } // ExportGenesis returns the evidence module's exported genesis. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { e := k.GetAllEvidence(ctx) evidence := make([]*codectypes.Any, len(e)) for i, evi := range e { @@ -47,7 +47,7 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { } evidence[i] = any } - return types.GenesisState{ + return &types.GenesisState{ Evidence: evidence, } } diff --git a/x/evidence/genesis_test.go b/x/evidence/genesis_test.go index 866da26f9a59..28da9c49bc59 100644 --- a/x/evidence/genesis_test.go +++ b/x/evidence/genesis_test.go @@ -34,7 +34,7 @@ func (suite *GenesisTestSuite) SetupTest() { func (suite *GenesisTestSuite) TestInitGenesis() { var ( - genesisState types.GenesisState + genesisState *types.GenesisState testEvidence []exported.Evidence pk = ed25519.GenPrivKey() ) diff --git a/x/evidence/module.go b/x/evidence/module.go index 01009b5a3471..a7a2e5cc932a 100644 --- a/x/evidence/module.go +++ b/x/evidence/module.go @@ -160,7 +160,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, bz jso panic(fmt.Sprintf("failed to unmarshal %s genesis state: %s", types.ModuleName, err)) } - InitGenesis(ctx, am.keeper, gs) + InitGenesis(ctx, am.keeper, &gs) return []abci.ValidatorUpdate{} } diff --git a/x/evidence/types/genesis.go b/x/evidence/types/genesis.go index 4ccd924c4b4e..b274ea20714f 100644 --- a/x/evidence/types/genesis.go +++ b/x/evidence/types/genesis.go @@ -12,7 +12,7 @@ import ( var _ types.UnpackInterfacesMessage = GenesisState{} // NewGenesisState creates a new genesis state for the evidence module. -func NewGenesisState(e []exported.Evidence) GenesisState { +func NewGenesisState(e []exported.Evidence) *GenesisState { evidence := make([]*types.Any, len(e)) for i, evi := range e { msg, ok := evi.(proto.Message) @@ -25,14 +25,14 @@ func NewGenesisState(e []exported.Evidence) GenesisState { } evidence[i] = any } - return GenesisState{ + return &GenesisState{ Evidence: evidence, } } // DefaultGenesisState returns the evidence module's default genesis state. -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ Evidence: []*types.Any{}, } } diff --git a/x/evidence/types/genesis_test.go b/x/evidence/types/genesis_test.go index 4aed3366eb31..b8b8ee0e1a16 100644 --- a/x/evidence/types/genesis_test.go +++ b/x/evidence/types/genesis_test.go @@ -59,7 +59,7 @@ func TestNewGenesisState(t *testing.T) { func TestGenesisStateValidate(t *testing.T) { var ( - genesisState types.GenesisState + genesisState *types.GenesisState testEvidence []exported.Evidence pk = ed25519.GenPrivKey() ) @@ -104,7 +104,7 @@ func TestGenesisStateValidate(t *testing.T) { { "expected evidence", func() { - genesisState = types.GenesisState{ + genesisState = &types.GenesisState{ Evidence: []*codectypes.Any{{}}, } }, diff --git a/x/genutil/client/rest/query.go b/x/genutil/client/rest/query.go index 62fe40546269..5e9db1af357e 100644 --- a/x/genutil/client/rest/query.go +++ b/x/genutil/client/rest/query.go @@ -22,7 +22,7 @@ func QueryGenesisTxs(clientCtx client.Context, w http.ResponseWriter) { return } - appState, err := types.GenesisStateFromGenDoc(clientCtx.Codec, *resultGenesis.Genesis) + appState, err := types.GenesisStateFromGenDoc(*resultGenesis.Genesis) if err != nil { rest.WriteErrorResponse( w, http.StatusInternalServerError, diff --git a/x/genutil/collect.go b/x/genutil/collect.go index d1d69c8d9902..24def89162c6 100644 --- a/x/genutil/collect.go +++ b/x/genutil/collect.go @@ -45,7 +45,7 @@ func GenAppStateFromConfig(cdc codec.JSONMarshaler, txEncodingConfig client.TxEn } // create the app state - appGenesisState, err := types.GenesisStateFromGenDoc(cdc, genDoc) + appGenesisState, err := types.GenesisStateFromGenDoc(genDoc) if err != nil { return appState, err } @@ -55,7 +55,7 @@ func GenAppStateFromConfig(cdc codec.JSONMarshaler, txEncodingConfig client.TxEn return appState, err } - appState, err = codec.MarshalJSONIndent(cdc, appGenesisState) + appState, err = json.MarshalIndent(appGenesisState, "", " ") if err != nil { return appState, err } @@ -81,7 +81,7 @@ func CollectTxs(cdc codec.JSONMarshaler, txJSONDecoder sdk.TxDecoder, moniker, g // prepare a map of all balances in genesis state to then validate // against the validators addresses var appState map[string]json.RawMessage - if err := cdc.UnmarshalJSON(genDoc.AppState, &appState); err != nil { + if err := json.Unmarshal(genDoc.AppState, &appState); err != nil { return appGenTxs, persistentPeers, err } diff --git a/x/genutil/module.go b/x/genutil/module.go index dc7bd72e57c6..a05ba12121bb 100644 --- a/x/genutil/module.go +++ b/x/genutil/module.go @@ -49,7 +49,7 @@ func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, txEncodingConfi return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - return types.ValidateGenesis(data, txEncodingConfig.TxJSONDecoder()) + return types.ValidateGenesis(&data, txEncodingConfig.TxJSONDecoder()) } // RegisterRESTRoutes registers the REST routes for the genutil module. diff --git a/x/genutil/types/genesis_state.go b/x/genutil/types/genesis_state.go index 971b6dbe0581..a7915b717ff1 100644 --- a/x/genutil/types/genesis_state.go +++ b/x/genutil/types/genesis_state.go @@ -14,26 +14,26 @@ import ( ) // NewGenesisState creates a new GenesisState object -func NewGenesisState(genTxs []json.RawMessage) GenesisState { +func NewGenesisState(genTxs []json.RawMessage) *GenesisState { // Ensure genTxs is never nil, https://github.com/cosmos/cosmos-sdk/issues/5086 if len(genTxs) == 0 { genTxs = make([]json.RawMessage, 0) } - return GenesisState{ + return &GenesisState{ GenTxs: genTxs, } } // DefaultGenesisState returns the genutil module's default genesis state. -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ GenTxs: []json.RawMessage{}, } } // NewGenesisStateFromTx creates a new GenesisState object // from auth transactions -func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) GenesisState { +func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) *GenesisState { genTxsBz := make([]json.RawMessage, len(genTxs)) for i, genTx := range genTxs { var err error @@ -46,17 +46,17 @@ func NewGenesisStateFromTx(txJSONEncoder sdk.TxEncoder, genTxs []sdk.Tx) Genesis } // GetGenesisStateFromAppState gets the genutil genesis state from the expected app state -func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) GenesisState { +func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) *GenesisState { var genesisState GenesisState if appState[ModuleName] != nil { cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) } - return genesisState + return &genesisState } // SetGenesisStateInAppState sets the genutil genesis state within the expected app state func SetGenesisStateInAppState( - cdc codec.JSONMarshaler, appState map[string]json.RawMessage, genesisState GenesisState, + cdc codec.JSONMarshaler, appState map[string]json.RawMessage, genesisState *GenesisState, ) map[string]json.RawMessage { genesisStateBz := cdc.MustMarshalJSON(genesisState) @@ -68,10 +68,9 @@ func SetGenesisStateInAppState( // for the application. // // NOTE: The pubkey input is this machines pubkey. -func GenesisStateFromGenDoc(cdc codec.JSONMarshaler, genDoc tmtypes.GenesisDoc, -) (genesisState map[string]json.RawMessage, err error) { +func GenesisStateFromGenDoc(genDoc tmtypes.GenesisDoc) (genesisState map[string]json.RawMessage, err error) { - if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil { + if err = json.Unmarshal(genDoc.AppState, &genesisState); err != nil { return genesisState, err } return genesisState, nil @@ -92,12 +91,12 @@ func GenesisStateFromGenFile(cdc codec.JSONMarshaler, genFile string) (genesisSt return genesisState, genDoc, err } - genesisState, err = GenesisStateFromGenDoc(cdc, *genDoc) + genesisState, err = GenesisStateFromGenDoc(*genDoc) return genesisState, genDoc, err } // ValidateGenesis validates GenTx transactions -func ValidateGenesis(genesisState GenesisState, txJSONDecoder sdk.TxDecoder) error { +func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder) error { for i, genTx := range genesisState.GenTxs { var tx sdk.Tx tx, err := txJSONDecoder(genTx) diff --git a/x/gov/genesis.go b/x/gov/genesis.go index bf2ff27e5d5f..ee544f4688cc 100644 --- a/x/gov/genesis.go +++ b/x/gov/genesis.go @@ -9,7 +9,7 @@ import ( ) // InitGenesis - store genesis parameters -func InitGenesis(ctx sdk.Context, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, data types.GenesisState) { +func InitGenesis(ctx sdk.Context, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, data *types.GenesisState) { k.SetProposalID(ctx, data.StartingProposalID) k.SetDepositParams(ctx, data.DepositParams) k.SetVotingParams(ctx, data.VotingParams) @@ -52,7 +52,7 @@ func InitGenesis(ctx sdk.Context, ak types.AccountKeeper, bk types.BankKeeper, k } // ExportGenesis - output genesis parameters -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { startingProposalID, _ := k.GetProposalID(ctx) depositParams := k.GetDepositParams(ctx) votingParams := k.GetVotingParams(ctx) @@ -69,7 +69,7 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { proposalsVotes = append(proposalsVotes, votes...) } - return types.GenesisState{ + return &types.GenesisState{ StartingProposalID: startingProposalID, Deposits: proposalsDeposits, Votes: proposalsVotes, diff --git a/x/gov/module.go b/x/gov/module.go index 17c9265dc50f..81c76b88c209 100644 --- a/x/gov/module.go +++ b/x/gov/module.go @@ -70,7 +70,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, config client.TxE return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - return types.ValidateGenesis(data) + return types.ValidateGenesis(&data) } // RegisterRESTRoutes registers the REST routes for the gov module. @@ -160,7 +160,7 @@ func (am AppModule) RegisterQueryService(server grpc.Server) { func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.accountKeeper, am.bankKeeper, am.keeper, genesisState) + InitGenesis(ctx, am.accountKeeper, am.bankKeeper, am.keeper, &genesisState) return []abci.ValidatorUpdate{} } diff --git a/x/gov/types/genesis.go b/x/gov/types/genesis.go index e289ee57dc47..daaabeaa2f9c 100644 --- a/x/gov/types/genesis.go +++ b/x/gov/types/genesis.go @@ -8,8 +8,8 @@ import ( ) // NewGenesisState creates a new genesis state for the governance module -func NewGenesisState(startingProposalID uint64, dp DepositParams, vp VotingParams, tp TallyParams) GenesisState { - return GenesisState{ +func NewGenesisState(startingProposalID uint64, dp DepositParams, vp VotingParams, tp TallyParams) *GenesisState { + return &GenesisState{ StartingProposalID: startingProposalID, DepositParams: dp, VotingParams: vp, @@ -18,7 +18,7 @@ func NewGenesisState(startingProposalID uint64, dp DepositParams, vp VotingParam } // DefaultGenesisState defines the default governance genesis state -func DefaultGenesisState() GenesisState { +func DefaultGenesisState() *GenesisState { return NewGenesisState( DefaultStartingProposalID, DefaultDepositParams(), @@ -43,7 +43,7 @@ func (data GenesisState) Empty() bool { } // ValidateGenesis checks if parameters are within valid ranges -func ValidateGenesis(data GenesisState) error { +func ValidateGenesis(data *GenesisState) error { threshold := data.TallyParams.Threshold if threshold.IsNegative() || threshold.GT(sdk.OneDec()) { return fmt.Errorf("governance vote threshold should be positive and less or equal to one, is %s", diff --git a/x/ibc-transfer/genesis.go b/x/ibc-transfer/genesis.go index 99aaa4ea9fed..75d6a204f8af 100644 --- a/x/ibc-transfer/genesis.go +++ b/x/ibc-transfer/genesis.go @@ -31,8 +31,8 @@ func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, state types.GenesisState } // ExportGenesis exports transfer module's portID into its geneis state -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) types.GenesisState { - return types.GenesisState{ +func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { + return &types.GenesisState{ PortID: keeper.GetPort(ctx), } } diff --git a/x/ibc-transfer/types/genesis.go b/x/ibc-transfer/types/genesis.go index e5ac802cb86d..9665a4005ae4 100644 --- a/x/ibc-transfer/types/genesis.go +++ b/x/ibc-transfer/types/genesis.go @@ -5,8 +5,8 @@ import ( ) // DefaultGenesisState returns a GenesisState with "transfer" as the default PortID. -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ PortID: PortID, } } diff --git a/x/ibc-transfer/types/genesis_test.go b/x/ibc-transfer/types/genesis_test.go index bd687c5561d3..7e006cf0227a 100644 --- a/x/ibc-transfer/types/genesis_test.go +++ b/x/ibc-transfer/types/genesis_test.go @@ -11,7 +11,7 @@ import ( func TestValidateGenesis(t *testing.T) { testCases := []struct { name string - genState types.GenesisState + genState *types.GenesisState expPass bool }{ { @@ -21,14 +21,14 @@ func TestValidateGenesis(t *testing.T) { }, { "valid genesis", - types.GenesisState{ + &types.GenesisState{ PortID: "portidone", }, true, }, { "invalid client", - types.GenesisState{ + &types.GenesisState{ PortID: "(INVALIDPORT)", }, false, diff --git a/x/ibc/07-tendermint/types/codec.go b/x/ibc/07-tendermint/types/codec.go index 06b75aa40c3b..ea2093924ca1 100644 --- a/x/ibc/07-tendermint/types/codec.go +++ b/x/ibc/07-tendermint/types/codec.go @@ -41,7 +41,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc/07-tendermint and // defined at the application level. - SubModuleCdc = codec.NewHybridCodec(amino, codectypes.NewInterfaceRegistry()) + SubModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) ) func init() { diff --git a/x/ibc/23-commitment/types/codec.go b/x/ibc/23-commitment/types/codec.go index 412daf58fdd9..669cab1b401f 100644 --- a/x/ibc/23-commitment/types/codec.go +++ b/x/ibc/23-commitment/types/codec.go @@ -66,7 +66,7 @@ var ( // // The actual codec used for serialization should be provided to x/ibc/23-commitmentl and // defined at the application level. - SubModuleCdc = codec.NewHybridCodec(amino, codectypes.NewInterfaceRegistry()) + SubModuleCdc = codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) ) func init() { diff --git a/x/ibc/genesis.go b/x/ibc/genesis.go index a2383dde6530..d31c668f20fa 100644 --- a/x/ibc/genesis.go +++ b/x/ibc/genesis.go @@ -11,15 +11,15 @@ import ( // InitGenesis initializes the ibc state from a provided genesis // state. -func InitGenesis(ctx sdk.Context, k keeper.Keeper, createLocalhost bool, gs types.GenesisState) { +func InitGenesis(ctx sdk.Context, k keeper.Keeper, createLocalhost bool, gs *types.GenesisState) { client.InitGenesis(ctx, k.ClientKeeper, gs.ClientGenesis) connection.InitGenesis(ctx, k.ConnectionKeeper, gs.ConnectionGenesis) channel.InitGenesis(ctx, k.ChannelKeeper, gs.ChannelGenesis) } // ExportGenesis returns the ibc exported genesis. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { - return types.GenesisState{ +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + return &types.GenesisState{ ClientGenesis: client.ExportGenesis(ctx, k.ClientKeeper), ConnectionGenesis: connection.ExportGenesis(ctx, k.ConnectionKeeper), ChannelGenesis: channel.ExportGenesis(ctx, k.ChannelKeeper), diff --git a/x/ibc/genesis_test.go b/x/ibc/genesis_test.go index fe51ab8acd31..9332ab1b4139 100644 --- a/x/ibc/genesis_test.go +++ b/x/ibc/genesis_test.go @@ -23,7 +23,7 @@ import ( func (suite *IBCTestSuite) TestValidateGenesis() { testCases := []struct { name string - genState types.GenesisState + genState *types.GenesisState expPass bool }{ { @@ -33,7 +33,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, { name: "valid genesis", - genState: types.GenesisState{ + genState: &types.GenesisState{ ClientGenesis: clienttypes.NewGenesisState( []clienttypes.GenesisClientState{ clienttypes.NewGenesisClientState( @@ -93,7 +93,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, { name: "invalid client genesis", - genState: types.GenesisState{ + genState: &types.GenesisState{ ClientGenesis: clienttypes.NewGenesisState( []clienttypes.GenesisClientState{ clienttypes.NewGenesisClientState( @@ -112,7 +112,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, { name: "invalid connection genesis", - genState: types.GenesisState{ + genState: &types.GenesisState{ ClientGenesis: clienttypes.DefaultGenesisState(), ConnectionGenesis: connectiontypes.NewGenesisState( []connectiontypes.IdentifiedConnection{ @@ -127,7 +127,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, { name: "invalid channel genesis", - genState: types.GenesisState{ + genState: &types.GenesisState{ ClientGenesis: clienttypes.DefaultGenesisState(), ConnectionGenesis: connectiontypes.DefaultGenesisState(), ChannelGenesis: channeltypes.GenesisState{ @@ -154,7 +154,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { func (suite *IBCTestSuite) TestInitGenesis() { testCases := []struct { name string - genState types.GenesisState + genState *types.GenesisState }{ { name: "default", @@ -162,7 +162,7 @@ func (suite *IBCTestSuite) TestInitGenesis() { }, { name: "valid genesis", - genState: types.GenesisState{ + genState: &types.GenesisState{ ClientGenesis: clienttypes.NewGenesisState( []clienttypes.GenesisClientState{ clienttypes.NewGenesisClientState( @@ -261,7 +261,7 @@ func (suite *HandlerTestSuite) TestExportGenesis() { // init genesis based on export suite.NotPanics(func() { - ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, gs) + ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, &gs) }) suite.NotPanics(func() { @@ -272,7 +272,7 @@ func (suite *HandlerTestSuite) TestExportGenesis() { // init genesis based on marshal and unmarshal suite.NotPanics(func() { - ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, gs) + ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, &gs) }) }) } diff --git a/x/ibc/module.go b/x/ibc/module.go index a7e85c7c7dcd..fc3a181330b3 100644 --- a/x/ibc/module.go +++ b/x/ibc/module.go @@ -137,7 +137,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, bz jso if err != nil { panic(fmt.Sprintf("failed to unmarshal %s genesis state: %s", host.ModuleName, err)) } - InitGenesis(ctx, *am.keeper, am.createLocalhost, gs) + InitGenesis(ctx, *am.keeper, am.createLocalhost, &gs) return []abci.ValidatorUpdate{} } diff --git a/x/ibc/types/genesis.go b/x/ibc/types/genesis.go index 4f997283ae40..9bdb25b30478 100644 --- a/x/ibc/types/genesis.go +++ b/x/ibc/types/genesis.go @@ -10,8 +10,8 @@ import ( var _ codectypes.UnpackInterfacesMessage = GenesisState{} // DefaultGenesisState returns the ibc module's default genesis state. -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ ClientGenesis: clienttypes.DefaultGenesisState(), ConnectionGenesis: connectiontypes.DefaultGenesisState(), ChannelGenesis: channeltypes.DefaultGenesisState(), @@ -25,7 +25,7 @@ func (gs GenesisState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // Validate performs basic genesis state validation returning an error upon any // failure. -func (gs GenesisState) Validate() error { +func (gs *GenesisState) Validate() error { if err := gs.ClientGenesis.Validate(); err != nil { return err } diff --git a/x/mint/genesis.go b/x/mint/genesis.go index c7de6127ffc6..be7ac61d5019 100644 --- a/x/mint/genesis.go +++ b/x/mint/genesis.go @@ -7,14 +7,14 @@ import ( ) // InitGenesis new mint genesis -func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, ak types.AccountKeeper, data types.GenesisState) { +func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, ak types.AccountKeeper, data *types.GenesisState) { keeper.SetMinter(ctx, data.Minter) keeper.SetParams(ctx, data.Params) ak.GetModuleAccount(ctx, types.ModuleName) } // ExportGenesis returns a GenesisState for a given context and keeper. -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { minter := keeper.GetMinter(ctx) params := keeper.GetParams(ctx) return types.NewGenesisState(minter, params) diff --git a/x/mint/module.go b/x/mint/module.go index 99375854da62..aa897221c3cd 100644 --- a/x/mint/module.go +++ b/x/mint/module.go @@ -128,7 +128,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data j var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, am.authKeeper, genesisState) + InitGenesis(ctx, am.keeper, am.authKeeper, &genesisState) return []abci.ValidatorUpdate{} } diff --git a/x/mint/types/genesis.go b/x/mint/types/genesis.go index c0dc4e91ae1d..3d2f761b4a6b 100644 --- a/x/mint/types/genesis.go +++ b/x/mint/types/genesis.go @@ -1,16 +1,16 @@ package types // NewGenesisState creates a new GenesisState object -func NewGenesisState(minter Minter, params Params) GenesisState { - return GenesisState{ +func NewGenesisState(minter Minter, params Params) *GenesisState { + return &GenesisState{ Minter: minter, Params: params, } } // DefaultGenesisState creates a default GenesisState object -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ Minter: DefaultInitialMinter(), Params: DefaultParams(), } diff --git a/x/params/keeper/keeper.go b/x/params/keeper/keeper.go index 628548acb109..fe7c4c1d4c3b 100644 --- a/x/params/keeper/keeper.go +++ b/x/params/keeper/keeper.go @@ -13,19 +13,21 @@ import ( // Keeper of the global paramstore type Keeper struct { - cdc codec.Marshaler - key sdk.StoreKey - tkey sdk.StoreKey - spaces map[string]*types.Subspace + cdc codec.BinaryMarshaler + legacyAmino *codec.Codec + key sdk.StoreKey + tkey sdk.StoreKey + spaces map[string]*types.Subspace } // NewKeeper constructs a params keeper -func NewKeeper(cdc codec.Marshaler, key, tkey sdk.StoreKey) Keeper { +func NewKeeper(cdc codec.BinaryMarshaler, legacyAmino *codec.Codec, key, tkey sdk.StoreKey) Keeper { return Keeper{ - cdc: cdc, - key: key, - tkey: tkey, - spaces: make(map[string]*types.Subspace), + cdc: cdc, + legacyAmino: legacyAmino, + key: key, + tkey: tkey, + spaces: make(map[string]*types.Subspace), } } @@ -45,7 +47,7 @@ func (k Keeper) Subspace(s string) types.Subspace { panic("cannot use empty string for subspace") } - space := types.NewSubspace(k.cdc, k.key, k.tkey, s) + space := types.NewSubspace(k.cdc, k.legacyAmino, k.key, k.tkey, s) k.spaces[s] = &space return space diff --git a/x/params/types/subspace.go b/x/params/types/subspace.go index 4f086b368435..09f6032b562b 100644 --- a/x/params/types/subspace.go +++ b/x/params/types/subspace.go @@ -21,21 +21,23 @@ const ( // Transient store persists for a block, so we use it for // recording whether the parameter has been changed or not type Subspace struct { - cdc codec.Marshaler - key sdk.StoreKey // []byte -> []byte, stores parameter - tkey sdk.StoreKey // []byte -> bool, stores parameter change - name []byte - table KeyTable + cdc codec.BinaryMarshaler + legacyAmino *codec.Codec + key sdk.StoreKey // []byte -> []byte, stores parameter + tkey sdk.StoreKey // []byte -> bool, stores parameter change + name []byte + table KeyTable } // NewSubspace constructs a store with namestore -func NewSubspace(cdc codec.Marshaler, key sdk.StoreKey, tkey sdk.StoreKey, name string) Subspace { +func NewSubspace(cdc codec.BinaryMarshaler, legacyAmino *codec.Codec, key sdk.StoreKey, tkey sdk.StoreKey, name string) Subspace { return Subspace{ - cdc: cdc, - key: key, - tkey: tkey, - name: []byte(name), - table: NewKeyTable(), + cdc: cdc, + legacyAmino: legacyAmino, + key: key, + tkey: tkey, + name: []byte(name), + table: NewKeyTable(), } } @@ -103,7 +105,7 @@ func (s Subspace) Get(ctx sdk.Context, key []byte, ptr interface{}) { store := s.kvStore(ctx) bz := store.Get(key) - if err := s.cdc.UnmarshalJSON(bz, ptr); err != nil { + if err := s.legacyAmino.UnmarshalJSON(bz, ptr); err != nil { panic(err) } } @@ -120,7 +122,7 @@ func (s Subspace) GetIfExists(ctx sdk.Context, key []byte, ptr interface{}) { s.checkType(key, ptr) - if err := s.cdc.UnmarshalJSON(bz, ptr); err != nil { + if err := s.legacyAmino.UnmarshalJSON(bz, ptr); err != nil { panic(err) } } @@ -170,7 +172,7 @@ func (s Subspace) Set(ctx sdk.Context, key []byte, value interface{}) { s.checkType(key, value) store := s.kvStore(ctx) - bz, err := s.cdc.MarshalJSON(value) + bz, err := s.legacyAmino.MarshalJSON(value) if err != nil { panic(err) } @@ -197,7 +199,7 @@ func (s Subspace) Update(ctx sdk.Context, key, value []byte) error { dest := reflect.New(ty).Interface() s.GetIfExists(ctx, key, dest) - if err := s.cdc.UnmarshalJSON(value, dest); err != nil { + if err := s.legacyAmino.UnmarshalJSON(value, dest); err != nil { return err } diff --git a/x/slashing/genesis.go b/x/slashing/genesis.go index 3b25bbe08c19..9e6781791436 100644 --- a/x/slashing/genesis.go +++ b/x/slashing/genesis.go @@ -41,7 +41,7 @@ func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.Stak // ExportGenesis writes the current store values // to a genesis file, which can be imported again // with InitGenesis -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) (data types.GenesisState) { +func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) (data *types.GenesisState) { params := keeper.GetParams(ctx) signingInfos := make([]types.SigningInfo, 0) missedBlocks := make([]types.ValidatorMissedBlocks, 0) diff --git a/x/slashing/module.go b/x/slashing/module.go index 038416ffa9fa..27046bbd7989 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -141,7 +141,7 @@ func (am AppModule) RegisterQueryService(server grpc.Server) { // no validator updates. func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState - types.ModuleCdc.MustUnmarshalJSON(data, &genesisState) + cdc.MustUnmarshalJSON(data, &genesisState) InitGenesis(ctx, am.keeper, am.stakingKeeper, genesisState) return []abci.ValidatorUpdate{} } diff --git a/x/slashing/types/genesis.go b/x/slashing/types/genesis.go index 745ab2d63911..ee765c8c37e6 100644 --- a/x/slashing/types/genesis.go +++ b/x/slashing/types/genesis.go @@ -10,9 +10,9 @@ import ( // NewGenesisState creates a new GenesisState object func NewGenesisState( params Params, signingInfos []SigningInfo, missedBlocks []ValidatorMissedBlocks, -) GenesisState { +) *GenesisState { - return GenesisState{ + return &GenesisState{ Params: params, SigningInfos: signingInfos, MissedBlocks: missedBlocks, @@ -28,8 +28,8 @@ func NewMissedBlock(index int64, missed bool) MissedBlock { } // DefaultGenesisState - default GenesisState used by Cosmos Hub -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ Params: DefaultParams(), SigningInfos: []SigningInfo{}, MissedBlocks: []ValidatorMissedBlocks{}, diff --git a/x/staking/genesis.go b/x/staking/genesis.go index 753b5836f2f2..a0d9095a3322 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -147,7 +147,7 @@ func InitGenesis( // ExportGenesis returns a GenesisState for a given context and keeper. The // GenesisState will contain the pool, params, validators, and bonds found in // the keeper. -func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) types.GenesisState { +func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { var unbondingDelegations []types.UnbondingDelegation keeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd types.UnbondingDelegation) (stop bool) { @@ -169,7 +169,7 @@ func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) types.GenesisState { return false }) - return types.GenesisState{ + return &types.GenesisState{ Params: keeper.GetParams(ctx), LastTotalPower: keeper.GetLastTotalPower(ctx), LastValidatorPowers: lastValidatorPowers, diff --git a/x/staking/types/genesis.go b/x/staking/types/genesis.go index 2e1a3a15f4db..7c838929b95f 100644 --- a/x/staking/types/genesis.go +++ b/x/staking/types/genesis.go @@ -7,8 +7,8 @@ import ( ) // NewGenesisState creates a new GenesisState instanc e -func NewGenesisState(params Params, validators []Validator, delegations []Delegation) GenesisState { - return GenesisState{ +func NewGenesisState(params Params, validators []Validator, delegations []Delegation) *GenesisState { + return &GenesisState{ Params: params, Validators: validators, Delegations: delegations, @@ -16,20 +16,20 @@ func NewGenesisState(params Params, validators []Validator, delegations []Delega } // DefaultGenesisState gets the raw genesis raw message for testing -func DefaultGenesisState() GenesisState { - return GenesisState{ +func DefaultGenesisState() *GenesisState { + return &GenesisState{ Params: DefaultParams(), } } // GetGenesisStateFromAppState returns x/staking GenesisState given raw application // genesis state. -func GetGenesisStateFromAppState(cdc *codec.Codec, appState map[string]json.RawMessage) GenesisState { +func GetGenesisStateFromAppState(cdc *codec.Codec, appState map[string]json.RawMessage) *GenesisState { var genesisState GenesisState if appState[ModuleName] != nil { cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) } - return genesisState + return &genesisState } From 4b41af5376e246de11f032996b1c66b24e679adb Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Fri, 7 Aug 2020 15:11:33 -0400 Subject: [PATCH 03/28] WIP on fixing proto JSON issues --- client/cmd.go | 17 ------------- client/context.go | 18 +++++++++++++- client/legacy.go | 14 ----------- client/rpc/validators.go | 2 +- server/export_test.go | 2 +- simapp/simd/cmd/root.go | 2 +- simapp/test_helpers.go | 7 +++--- testutil/network/network.go | 2 +- types/rest/rest.go | 14 +++-------- types/rest/rest_test.go | 3 ++- x/auth/client/cli/query.go | 10 ++------ x/auth/client/cli/tx_multisign.go | 3 +-- x/auth/client/rest/query.go | 2 +- x/auth/types/account_retriever.go | 4 ++-- x/auth/types/account_retriever_test.go | 4 ++-- x/auth/types/common_test.go | 4 ++-- x/bank/client/cli/query.go | 4 ++-- x/bank/client/rest/query_test.go | 4 ++-- x/bank/client/rest/tx_test.go | 2 +- x/distribution/client/cli/query.go | 10 ++++---- x/evidence/client/cli/query.go | 23 +++++------------- x/gov/client/cli/query.go | 33 ++++++++++++++++++-------- x/ibc/02-client/client/cli/query.go | 21 ++++++++++++---- x/ibc/02-client/exported/exported.go | 4 ++++ x/ibc/04-channel/client/cli/query.go | 10 +++++++- x/ibc/genesis_test.go | 6 ++--- x/mint/client/cli/query.go | 6 ++--- x/params/client/cli/query.go | 2 +- x/params/keeper/common_test.go | 3 ++- x/params/proposal_handler_test.go | 5 +++- x/params/types/subspace_test.go | 19 ++++++++------- x/slashing/client/cli/query.go | 4 ++-- x/slashing/genesis.go | 2 +- x/slashing/module.go | 2 +- x/staking/client/cli/query.go | 18 +++++++------- x/staking/genesis.go | 4 ++-- x/staking/genesis_test.go | 2 +- x/staking/module.go | 4 ++-- x/upgrade/client/cli/query.go | 2 +- 39 files changed, 153 insertions(+), 145 deletions(-) delete mode 100644 client/legacy.go diff --git a/client/cmd.go b/client/cmd.go index cafb4b627c81..1502cfab33a9 100644 --- a/client/cmd.go +++ b/client/cmd.go @@ -231,20 +231,3 @@ func SetCmdClientContext(cmd *cobra.Command, clientCtx Context) error { return nil } - -// AddPreRunEHook adds a PreRunE middleware hook to the command. It wraps any existing PreRunE -// hook and calls it first instead of replacing it. -func AddPreRunEHook(cmd *cobra.Command, preRunHook func(cmd *cobra.Command, args []string) error) { - existing := cmd.PreRunE - if existing != nil { - cmd.PreRunE = func(cmd *cobra.Command, args []string) error { - err := existing(cmd, args) - if err != nil { - return err - } - return preRunHook(cmd, args) - } - } else { - cmd.PreRunE = preRunHook - } -} diff --git a/client/context.go b/client/context.go index 21e5a29ac79a..7e25290be693 100644 --- a/client/context.go +++ b/client/context.go @@ -5,6 +5,8 @@ import ( "io" "os" + "github.com/gogo/protobuf/proto" + "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" @@ -209,7 +211,17 @@ func (ctx Context) PrintString(str string) error { // PrintOutput outputs toPrint to the ctx.Output based on ctx.OutputFormat which is // either text or json. If text, toPrint will be YAML encoded. Otherwise, toPrint // will be JSON encoded using ctx.JSONMarshaler. An error is returned upon failure. -func (ctx Context) PrintOutput(toPrint interface{}) error { +func (ctx Context) PrintOutput(toPrint proto.Message) error { + return ctx.printOutput(toPrint) +} + +// PrintOutputLegacy is a variant of PrintOutput that doesn't require a proto type +// and uses amino JSON encoding. It will be removed in the near future! +func (ctx Context) PrintOutputLegacy(toPrint interface{}) error { + return ctx.WithJSONMarshaler(ctx.Codec).printOutput(toPrint) +} + +func (ctx Context) printOutput(toPrint interface{}) error { // always serialize JSON initially because proto json can't be directly YAML encoded out, err := ctx.JSONMarshaler.MarshalJSON(toPrint) if err != nil { @@ -252,6 +264,10 @@ func (ctx Context) PrintOutput(toPrint interface{}) error { return nil } +func (ctx Context) PrintOutputArray(toPrint []proto.Message) error { + panic("TODO") +} + // GetFromFields returns a from account address and Keybase name given either // an address or key name. If genOnly is true, only a valid Bech32 cosmos // address is returned. diff --git a/client/legacy.go b/client/legacy.go deleted file mode 100644 index 9cb3676838fa..000000000000 --- a/client/legacy.go +++ /dev/null @@ -1,14 +0,0 @@ -package client - -import "github.com/spf13/cobra" - -// WithLegacyAminoJSON configures the command's client Context to use the legacy -// amino *codec.Codec as its JSONMarshaler. This is to be used for commands that -// need to always use amino JSON for legacy compatibility reasons. -func WithLegacyAminoJSON(cmd *cobra.Command) { - AddPreRunEHook(cmd, func(cmd *cobra.Command, args []string) error { - clientCtx := GetClientContextFromCmd(cmd) - clientCtx = clientCtx.WithJSONMarshaler(clientCtx.Codec) - return SetCmdClientContext(cmd, clientCtx) - }) -} diff --git a/client/rpc/validators.go b/client/rpc/validators.go index 8038ff923f6e..481177247d56 100644 --- a/client/rpc/validators.go +++ b/client/rpc/validators.go @@ -50,7 +50,7 @@ func ValidatorCommand() *cobra.Command { return err } - return clientCtx.PrintOutput(result) + return clientCtx.PrintOutputLegacy(result) }, } diff --git a/server/export_test.go b/server/export_test.go index 009698114fda..ea8228e3aff6 100644 --- a/server/export_test.go +++ b/server/export_test.go @@ -70,7 +70,7 @@ func TestExportCmd_ConsensusParams(t *testing.T) { require.NoError(t, cmd.ExecuteContext(ctx)) var exportedGenDoc tmtypes.GenesisDoc - err = app.Codec().UnmarshalJSON(output.Bytes(), &exportedGenDoc) + err = json.Unmarshal(output.Bytes(), &exportedGenDoc) if err != nil { t.Fatalf("error unmarshaling exported genesis doc: %s", err) } diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index efb5ca648499..0c413f7b7a62 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -52,7 +52,7 @@ var ( WithTxConfig(encodingConfig.TxConfig). WithCodec(encodingConfig.Amino). WithInput(os.Stdin). - WithAccountRetriever(types.NewAccountRetriever(encodingConfig.Marshaler)). + WithAccountRetriever(types.NewAccountRetriever(encodingConfig.Amino)). WithBroadcastMode(flags.BroadcastBlock). WithHomeDir(simapp.DefaultNodeHome) ) diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 4901eb8cc494..75021a8e69a0 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -3,6 +3,7 @@ package simapp import ( "bytes" "encoding/hex" + "encoding/json" "fmt" "strconv" "testing" @@ -156,7 +157,7 @@ func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...ba genesisState := NewDefaultGenesisState() authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) - genesisState[authtypes.ModuleName] = app.Codec().MustMarshalJSON(authGenesis) + genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) totalSupply := sdk.NewCoins() for _, b := range balances { @@ -164,9 +165,9 @@ func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...ba } bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) - genesisState[banktypes.ModuleName] = app.Codec().MustMarshalJSON(bankGenesis) + genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) - stateBytes, err := codec.MarshalJSONIndent(app.Codec(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { panic(err) } diff --git a/testutil/network/network.go b/testutil/network/network.go index 5e6c2f5d87d1..d6798606f398 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -90,7 +90,7 @@ func DefaultConfig() Config { Codec: encCfg.Marshaler, TxConfig: encCfg.TxConfig, LegacyAmino: encCfg.Amino, - AccountRetriever: authtypes.NewAccountRetriever(encCfg.Marshaler), + AccountRetriever: authtypes.NewAccountRetriever(encCfg.Amino), AppConstructor: NewSimApp, GenesisState: simapp.ModuleBasics.DefaultGenesis(encCfg.Marshaler), TimeoutCommit: 2 * time.Second, diff --git a/types/rest/rest.go b/types/rest/rest.go index fd089f1a73ce..07036fe007e3 100644 --- a/types/rest/rest.go +++ b/types/rest/rest.go @@ -45,7 +45,7 @@ func NewResponseWithHeight(height int64, result json.RawMessage) ResponseWithHei // ParseResponseWithHeight returns the raw result from a JSON-encoded // ResponseWithHeight object. -func ParseResponseWithHeight(cdc codec.JSONMarshaler, bz []byte) ([]byte, error) { +func ParseResponseWithHeight(cdc *codec.Codec, bz []byte) ([]byte, error) { r := ResponseWithHeight{} if err := cdc.UnmarshalJSON(bz, &r); err != nil { return nil, err @@ -278,7 +278,7 @@ func PostProcessResponseBare(w http.ResponseWriter, ctx client.Context, body int resp = b default: - resp, err = ctx.JSONMarshaler.MarshalJSON(body) + resp, err = ctx.Codec.MarshalJSON(body) if CheckInternalServerError(w, err) { return } @@ -302,15 +302,7 @@ func PostProcessResponse(w http.ResponseWriter, ctx client.Context, resp interfa return } - // TODO: Remove once PubKey Protobuf migration has been completed. - // ref: https://github.com/cosmos/cosmos-sdk/issues/6886 - var marshaler codec.JSONMarshaler - - if ctx.JSONMarshaler != nil { - marshaler = ctx.JSONMarshaler - } else { - marshaler = ctx.Codec - } + marshaler := ctx.Codec switch res := resp.(type) { case []byte: diff --git a/types/rest/rest_test.go b/types/rest/rest_test.go index 1cd0b10ea572..7900bf05db54 100644 --- a/types/rest/rest_test.go +++ b/types/rest/rest_test.go @@ -310,7 +310,8 @@ func TestPostProcessResponseBare(t *testing.T) { encodingConfig := simappparams.MakeEncodingConfig() clientCtx := client.Context{}. WithTxConfig(encodingConfig.TxConfig). - WithJSONMarshaler(encodingConfig.Marshaler) + WithJSONMarshaler(encodingConfig.Amino). // amino used intentionally here + WithCodec(encodingConfig.Amino) // amino used intentionally here // write bytes w := httptest.NewRecorder() bs := []byte("text string") diff --git a/x/auth/client/cli/query.go b/x/auth/client/cli/query.go index 1641873cadda..22a8bef431b9 100644 --- a/x/auth/client/cli/query.go +++ b/x/auth/client/cli/query.go @@ -64,7 +64,7 @@ $ query auth params return err } - return clientCtx.PrintOutput(res.Params) + return clientCtx.PrintOutput(res) }, } @@ -98,13 +98,7 @@ func GetAccountCmd() *cobra.Command { return err } - var account types.AccountI - err = clientCtx.InterfaceRegistry.UnpackAny(res.Account, &account) - if err != nil { - return err - } - - return clientCtx.PrintOutput(account) + return clientCtx.PrintOutput(res.Account) }, } diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 39c28e28391a..523153e5b3ff 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/cosmos-sdk/version" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/cosmos/cosmos-sdk/x/auth/types" ) // GetSignCommand returns the sign command @@ -101,7 +100,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { multisigPub := multisigInfo.GetPubKey().(multisig.PubKeyMultisigThreshold) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) if !clientCtx.Offline { - accnum, seq, err := types.NewAccountRetriever(clientCtx.JSONMarshaler).GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) + accnum, seq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) if err != nil { return err } diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 07c440e6935d..6f6fdabc480e 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -32,7 +32,7 @@ func QueryAccountRequestHandlerFn(storeName string, clientCtx client.Context) ht return } - accGetter := types.NewAccountRetriever(authclient.Codec) + accGetter := types.NewAccountRetriever(clientCtx.Codec) account, height, err := accGetter.GetAccountWithHeight(clientCtx, addr) if err != nil { diff --git a/x/auth/types/account_retriever.go b/x/auth/types/account_retriever.go index 78a8df6dc9d1..263ac3bd6a35 100644 --- a/x/auth/types/account_retriever.go +++ b/x/auth/types/account_retriever.go @@ -11,11 +11,11 @@ import ( // AccountRetriever defines the properties of a type that can be used to // retrieve accounts. type AccountRetriever struct { - codec codec.JSONMarshaler + codec *codec.Codec } // NewAccountRetriever initialises a new AccountRetriever instance. -func NewAccountRetriever(codec codec.JSONMarshaler) AccountRetriever { +func NewAccountRetriever(codec *codec.Codec) AccountRetriever { return AccountRetriever{codec: codec} } diff --git a/x/auth/types/account_retriever_test.go b/x/auth/types/account_retriever_test.go index 1b3c7660139b..127dd719703c 100644 --- a/x/auth/types/account_retriever_test.go +++ b/x/auth/types/account_retriever_test.go @@ -19,9 +19,9 @@ func TestAccountRetriever(t *testing.T) { defer mockCtrl.Finish() mockNodeQuerier := mocks.NewMockNodeQuerier(mockCtrl) - accRetr := types.NewAccountRetriever(appCodec) + accRetr := types.NewAccountRetriever(legacyAmino) addr := []byte("test") - bs, err := appCodec.MarshalJSON(types.QueryAccountRequest{Address: addr}) + bs, err := legacyAmino.MarshalJSON(types.QueryAccountRequest{Address: addr}) require.NoError(t, err) route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryAccount) diff --git a/x/auth/types/common_test.go b/x/auth/types/common_test.go index 4f361059ad3c..5c6ff0fb6488 100644 --- a/x/auth/types/common_test.go +++ b/x/auth/types/common_test.go @@ -5,6 +5,6 @@ import ( ) var ( - app = simapp.Setup(false) - appCodec, _ = simapp.MakeCodecs() + app = simapp.Setup(false) + appCodec, legacyAmino = simapp.MakeCodecs() ) diff --git a/x/bank/client/cli/query.go b/x/bank/client/cli/query.go index fb00993bbc03..03db196e22e1 100644 --- a/x/bank/client/cli/query.go +++ b/x/bank/client/cli/query.go @@ -140,7 +140,7 @@ To query for the total supply of a specific coin denomination use: return err } - return clientCtx.PrintOutput(res.Supply) + return clientCtx.PrintOutput(res) } res, err := queryClient.SupplyOf(context.Background(), &types.QuerySupplyOfRequest{Denom: denom}) @@ -148,7 +148,7 @@ To query for the total supply of a specific coin denomination use: return err } - return clientCtx.PrintOutput(res.Amount) + return clientCtx.PrintOutput(res) }, } diff --git a/x/bank/client/rest/query_test.go b/x/bank/client/rest/query_test.go index 8f9c1241b130..d3b40aa16084 100644 --- a/x/bank/client/rest/query_test.go +++ b/x/bank/client/rest/query_test.go @@ -75,7 +75,7 @@ func (s *IntegrationTestSuite) TestQueryBalancesRequestHandlerFn() { resp, err := rest.GetRequest(tc.url) s.Require().NoError(err) - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.JSONMarshaler, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) s.Require().NoError(err) s.Require().NoError(val.ClientCtx.JSONMarshaler.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) @@ -122,7 +122,7 @@ func (s *IntegrationTestSuite) TestTotalSupplyHandlerFn() { resp, err := rest.GetRequest(tc.url) s.Require().NoError(err) - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.JSONMarshaler, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) s.Require().NoError(err) s.Require().NoError(val.ClientCtx.JSONMarshaler.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) diff --git a/x/bank/client/rest/tx_test.go b/x/bank/client/rest/tx_test.go index 2bc2cd4b4dfb..b32dc486bb8f 100644 --- a/x/bank/client/rest/tx_test.go +++ b/x/bank/client/rest/tx_test.go @@ -93,7 +93,7 @@ func getAccountInfo(val *network.Validator) (authtypes.AccountI, error) { return nil, err } - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.JSONMarshaler, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) if err != nil { return nil, err } diff --git a/x/distribution/client/cli/query.go b/x/distribution/client/cli/query.go index 14138e1b8310..d6bc622f10c2 100644 --- a/x/distribution/client/cli/query.go +++ b/x/distribution/client/cli/query.go @@ -56,7 +56,7 @@ func GetCmdQueryParams() *cobra.Command { return err } - return clientCtx.PrintOutput(res.GetParams()) + return clientCtx.PrintOutput(&res.Params) }, } @@ -101,7 +101,7 @@ $ %s query distribution validator-outstanding-rewards cosmosvaloper1lwjmdnks33xw return err } - return clientCtx.PrintOutput(res.GetRewards()) + return clientCtx.PrintOutput(&res.Rewards) }, } @@ -145,7 +145,7 @@ $ %s query distribution commission cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9l return err } - return clientCtx.PrintOutput(res.GetCommission()) + return clientCtx.PrintOutput(&res.Commission) }, } @@ -262,7 +262,7 @@ $ %s query distribution rewards cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p co return err } - return clientCtx.PrintOutput(res.GetRewards()) + return clientCtx.PrintOutput(res) } res, err := queryClient.DelegationTotalRewards( @@ -309,7 +309,7 @@ $ %s query distribution community-pool return err } - return clientCtx.PrintOutput(res.GetPool()) + return clientCtx.PrintOutput(res) }, } diff --git a/x/evidence/client/cli/query.go b/x/evidence/client/cli/query.go index db9fd0da1da3..f5adf0f0208a 100644 --- a/x/evidence/client/cli/query.go +++ b/x/evidence/client/cli/query.go @@ -6,13 +6,14 @@ import ( "fmt" "strings" + "github.com/gogo/protobuf/proto" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/version" - "github.com/cosmos/cosmos-sdk/x/evidence/exported" "github.com/cosmos/cosmos-sdk/x/evidence/types" ) @@ -86,13 +87,7 @@ func queryEvidence(clientCtx client.Context, hash string) error { return err } - var evidence exported.Evidence - err = clientCtx.InterfaceRegistry.UnpackAny(res.Evidence, &evidence) - if err != nil { - return err - } - - return clientCtx.PrintOutput(evidence) + return clientCtx.PrintOutput(res.Evidence) } func queryAllEvidence(clientCtx client.Context, pageReq *query.PageRequest) error { @@ -108,16 +103,10 @@ func queryAllEvidence(clientCtx client.Context, pageReq *query.PageRequest) erro return err } - evidence := make([]exported.Evidence, 0, len(res.Evidence)) + outputArray := make([]proto.Message, 0, len(res.Evidence)) for _, eviAny := range res.Evidence { - var evi exported.Evidence - err = clientCtx.InterfaceRegistry.UnpackAny(eviAny, &evi) - if err != nil { - return err - } - - evidence = append(evidence, evi) + outputArray = append(outputArray, eviAny) } - return clientCtx.PrintOutput(evidence) + return clientCtx.PrintOutputArray(outputArray) } diff --git a/x/gov/client/cli/query.go b/x/gov/client/cli/query.go index 095cfa5fda8e..7a5a243da23e 100644 --- a/x/gov/client/cli/query.go +++ b/x/gov/client/cli/query.go @@ -6,6 +6,8 @@ import ( "strconv" "strings" + "github.com/gogo/protobuf/proto" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -82,7 +84,7 @@ $ %s query gov proposal 1 return err } - return clientCtx.PrintOutput(res.GetProposal()) + return clientCtx.PrintOutput(&res.Proposal) }, } @@ -237,7 +239,7 @@ $ %s query gov vote 1 cosmos1skjwj5whet0lpe65qaq4rpq03hjxlwd9nf39lk } } - return clientCtx.PrintOutput(res.GetVote()) + return clientCtx.PrintOutput(&res.Vote) }, } @@ -298,7 +300,11 @@ $ %[1]s query gov votes 1 --page=2 --limit=100 var votes types.Votes clientCtx.JSONMarshaler.MustUnmarshalJSON(resByTxQuery, &votes) - return clientCtx.PrintOutput(votes) + toPrint := make([]proto.Message, len(votes)) + for i, vote := range votes { + toPrint[i] = &vote + } + return clientCtx.PrintOutputArray(toPrint) } @@ -389,7 +395,7 @@ $ %s query gov deposit 1 cosmos1skjwj5whet0lpe65qaq4rpq03hjxlwd9nf39lk clientCtx.JSONMarshaler.MustUnmarshalJSON(resByTxQuery, &deposit) } - return clientCtx.PrintOutput(deposit) + return clientCtx.PrintOutput(&deposit) }, } @@ -447,7 +453,12 @@ $ %s query gov deposits 1 var dep types.Deposits clientCtx.JSONMarshaler.MustUnmarshalJSON(resByTxQuery, &dep) - return clientCtx.PrintOutput(dep) + + toPrint := make([]proto.Message, len(dep)) + for i, d := range dep { + toPrint[i] = &d + } + return clientCtx.PrintOutputArray(toPrint) } pageReq, err := client.ReadPageRequest(cmd.Flags()) @@ -522,7 +533,7 @@ $ %s query gov tally 1 return err } - return clientCtx.PrintOutput(res.GetTally()) + return clientCtx.PrintOutput(&res.Tally) }, } @@ -579,11 +590,13 @@ $ %s query gov params return err } - return clientCtx.PrintOutput(types.NewParams( + params := types.NewParams( votingRes.GetVotingParams(), tallyRes.GetTallyParams(), depositRes.GetDepositParams(), - )) + ) + + return clientCtx.PrintOutputLegacy(params) }, } @@ -638,7 +651,7 @@ $ %s query gov param deposit return fmt.Errorf("argument must be one of (voting|tallying|deposit), was %s", args[0]) } - return clientCtx.PrintOutput(out) + return clientCtx.PrintString(fmt.Sprintf("%s\n", out)) }, } @@ -680,7 +693,7 @@ $ %s query gov proposer 1 return err } - return clientCtx.PrintOutput(prop) + return clientCtx.PrintOutputLegacy(prop) }, } diff --git a/x/ibc/02-client/client/cli/query.go b/x/ibc/02-client/client/cli/query.go index 17fb9e7e8537..57ca1f859645 100644 --- a/x/ibc/02-client/client/cli/query.go +++ b/x/ibc/02-client/client/cli/query.go @@ -6,6 +6,9 @@ import ( "strconv" "strings" + types2 "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/gogo/protobuf/proto" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -41,7 +44,17 @@ func GetCmdQueryClientStates() *cobra.Command { } clientCtx = clientCtx.WithHeight(height) - return clientCtx.PrintOutput(clientStates) + + toPrint := make([]proto.Message, len(clientStates)) + for i, st := range clientStates { + any, err := types2.NewAnyWithValue(st) + if err != nil { + return err + } + toPrint[i] = any + } + + return clientCtx.PrintOutputArray(toPrint) }, } @@ -81,7 +94,7 @@ func GetCmdQueryClientState() *cobra.Command { } clientCtx = clientCtx.WithHeight(int64(clientStateRes.ProofHeight)) - return clientCtx.PrintOutput(clientStateRes) + return clientCtx.PrintOutputLegacy(clientStateRes) }, } @@ -125,7 +138,7 @@ func GetCmdQueryConsensusState() *cobra.Command { } clientCtx = clientCtx.WithHeight(int64(csRes.ProofHeight)) - return clientCtx.PrintOutput(csRes) + return clientCtx.PrintOutputLegacy(csRes) }, } @@ -155,7 +168,7 @@ func GetCmdQueryHeader() *cobra.Command { } clientCtx = clientCtx.WithHeight(height) - return clientCtx.PrintOutput(header) + return clientCtx.PrintOutputLegacy(header) }, } diff --git a/x/ibc/02-client/exported/exported.go b/x/ibc/02-client/exported/exported.go index 405433f188e3..28abce81ef73 100644 --- a/x/ibc/02-client/exported/exported.go +++ b/x/ibc/02-client/exported/exported.go @@ -3,6 +3,8 @@ package exported import ( "encoding/json" + "github.com/gogo/protobuf/proto" + ics23 "github.com/confio/ics23/go" sdk "github.com/cosmos/cosmos-sdk/types" @@ -17,6 +19,8 @@ import ( // ClientState defines the required common functions for light clients. type ClientState interface { + proto.Message + GetChainID() string ClientType() ClientType GetLatestHeight() uint64 diff --git a/x/ibc/04-channel/client/cli/query.go b/x/ibc/04-channel/client/cli/query.go index 5cb4def99eec..e6f0e0148b0c 100644 --- a/x/ibc/04-channel/client/cli/query.go +++ b/x/ibc/04-channel/client/cli/query.go @@ -5,6 +5,8 @@ import ( "fmt" "strconv" + types2 "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -165,7 +167,13 @@ func GetCmdQueryChannelClientState() *cobra.Command { } clientCtx = clientCtx.WithHeight(height) - return clientCtx.PrintOutput(clientStateRes) + + any, err := types2.NewAnyWithValue(clientStateRes) + if err != nil { + return err + } + + return clientCtx.PrintOutput(any) }, } diff --git a/x/ibc/genesis_test.go b/x/ibc/genesis_test.go index 9332ab1b4139..7099bfc7704b 100644 --- a/x/ibc/genesis_test.go +++ b/x/ibc/genesis_test.go @@ -254,14 +254,14 @@ func (suite *HandlerTestSuite) TestExportGenesis() { tc.malleate() - var gs types.GenesisState + var gs *types.GenesisState suite.NotPanics(func() { gs = ibc.ExportGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper) }) // init genesis based on export suite.NotPanics(func() { - ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, &gs) + ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, gs) }) suite.NotPanics(func() { @@ -272,7 +272,7 @@ func (suite *HandlerTestSuite) TestExportGenesis() { // init genesis based on marshal and unmarshal suite.NotPanics(func() { - ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, &gs) + ibc.InitGenesis(suite.chainA.GetContext(), *suite.chainA.App.IBCKeeper, true, gs) }) }) } diff --git a/x/mint/client/cli/query.go b/x/mint/client/cli/query.go index 7390cbce38a3..7d57f9df3a92 100644 --- a/x/mint/client/cli/query.go +++ b/x/mint/client/cli/query.go @@ -52,7 +52,7 @@ func GetCmdQueryParams() *cobra.Command { return err } - return clientCtx.PrintOutput(res.GetParams()) + return clientCtx.PrintOutput(res) }, } @@ -84,7 +84,7 @@ func GetCmdQueryInflation() *cobra.Command { return err } - return clientCtx.PrintOutput(res.Inflation) + return clientCtx.PrintOutput(res) }, } @@ -116,7 +116,7 @@ func GetCmdQueryAnnualProvisions() *cobra.Command { return err } - return clientCtx.PrintOutput(res.AnnualProvisions) + return clientCtx.PrintOutput(res) }, } diff --git a/x/params/client/cli/query.go b/x/params/client/cli/query.go index 0da586a03696..1817e46c2ec3 100644 --- a/x/params/client/cli/query.go +++ b/x/params/client/cli/query.go @@ -47,7 +47,7 @@ func NewQuerySubspaceParamsCmd() *cobra.Command { return err } - return clientCtx.PrintOutput(res.GetParams()) + return clientCtx.PrintOutput(&res.Params) }, } diff --git a/x/params/keeper/common_test.go b/x/params/keeper/common_test.go index c6c151809c37..5c026dd851f3 100644 --- a/x/params/keeper/common_test.go +++ b/x/params/keeper/common_test.go @@ -17,7 +17,8 @@ func testComponents() (codec.Marshaler, sdk.Context, sdk.StoreKey, sdk.StoreKey, mkey := sdk.NewKVStoreKey("test") tkey := sdk.NewTransientStoreKey("transient_test") ctx := defaultContext(mkey, tkey) - keeper := paramskeeper.NewKeeper(cdc, mkey, tkey) + amino := codec.New() + keeper := paramskeeper.NewKeeper(cdc, amino, mkey, tkey) return cdc, ctx, mkey, tkey, keeper } diff --git a/x/params/proposal_handler_test.go b/x/params/proposal_handler_test.go index ddbb81fb7cc4..830463fe1832 100644 --- a/x/params/proposal_handler_test.go +++ b/x/params/proposal_handler_test.go @@ -3,6 +3,8 @@ package params_test import ( "testing" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" @@ -75,7 +77,8 @@ func newTestInput(t *testing.T) testInput { err := cms.LoadLatestVersion() require.Nil(t, err) - keeper := keeper.NewKeeper(proposal.ModuleCdc, keyParams, tKeyParams) + encCfg := simapp.MakeEncodingConfig() + keeper := keeper.NewKeeper(encCfg.Marshaler, encCfg.Amino, keyParams, tKeyParams) ctx := sdk.NewContext(cms, abci.Header{}, false, log.NewNopLogger()) return testInput{ctx, cdc, keeper} diff --git a/x/params/types/subspace_test.go b/x/params/types/subspace_test.go index d7c30ba18f65..eb0f6e4a90ae 100644 --- a/x/params/types/subspace_test.go +++ b/x/params/types/subspace_test.go @@ -5,6 +5,8 @@ import ( "testing" "time" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/stretchr/testify/suite" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" @@ -14,19 +16,18 @@ import ( "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params/types" - "github.com/cosmos/cosmos-sdk/x/params/types/proposal" ) type SubspaceTestSuite struct { suite.Suite - cdc codec.Marshaler - ctx sdk.Context - ss types.Subspace + cdc codec.Marshaler + amino *codec.Codec + ctx sdk.Context + ss types.Subspace } func (suite *SubspaceTestSuite) SetupTest() { - cdc := proposal.ModuleCdc db := dbm.NewMemDB() ms := store.NewCommitMultiStore(db) @@ -34,9 +35,11 @@ func (suite *SubspaceTestSuite) SetupTest() { ms.MountStoreWithDB(tkey, sdk.StoreTypeTransient, db) suite.NoError(ms.LoadLatestVersion()) - ss := types.NewSubspace(cdc, key, tkey, "testsubspace") + encCfg := simapp.MakeEncodingConfig() + ss := types.NewSubspace(encCfg.Marshaler, encCfg.Amino, key, tkey, "testsubspace") - suite.cdc = cdc + suite.cdc = encCfg.Marshaler + suite.amino = encCfg.Amino suite.ctx = sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) suite.ss = ss.WithKeyTable(paramKeyTable()) } @@ -47,7 +50,7 @@ func (suite *SubspaceTestSuite) TestKeyTable() { suite.ss.WithKeyTable(paramKeyTable()) }) suite.Require().NotPanics(func() { - ss := types.NewSubspace(proposal.ModuleCdc, key, tkey, "testsubspace2") + ss := types.NewSubspace(suite.cdc, suite.amino, key, tkey, "testsubspace2") ss = ss.WithKeyTable(paramKeyTable()) }) } diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index c174616cf06a..33ee5d3eb1d1 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -65,7 +65,7 @@ $ query slashing signing-info cosmosvalconspub1zcjduepqfhvwcmt7p06fvdge return err } - return clientCtx.PrintOutput(res.ValSigningInfo) + return clientCtx.PrintOutput(res) }, } @@ -139,7 +139,7 @@ $ query slashing params return err } - return clientCtx.PrintOutput(res.Params) + return clientCtx.PrintOutput(res) }, } diff --git a/x/slashing/genesis.go b/x/slashing/genesis.go index 9e6781791436..3c38fa431c53 100644 --- a/x/slashing/genesis.go +++ b/x/slashing/genesis.go @@ -9,7 +9,7 @@ import ( // InitGenesis initialize default parameters // and the keeper's address to pubkey map -func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.StakingKeeper, data types.GenesisState) { +func InitGenesis(ctx sdk.Context, keeper keeper.Keeper, stakingKeeper types.StakingKeeper, data *types.GenesisState) { stakingKeeper.IterateValidators(ctx, func(index int64, validator exported.ValidatorI) bool { keeper.AddPubkey(ctx, validator.GetConsPubKey()) diff --git a/x/slashing/module.go b/x/slashing/module.go index 27046bbd7989..760992c20119 100644 --- a/x/slashing/module.go +++ b/x/slashing/module.go @@ -142,7 +142,7 @@ func (am AppModule) RegisterQueryService(server grpc.Server) { func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data json.RawMessage) []abci.ValidatorUpdate { var genesisState types.GenesisState cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, am.stakingKeeper, genesisState) + InitGenesis(ctx, am.keeper, am.stakingKeeper, &genesisState) return []abci.ValidatorUpdate{} } diff --git a/x/staking/client/cli/query.go b/x/staking/client/cli/query.go index 295ea79cc1c8..101fa72aa5f6 100644 --- a/x/staking/client/cli/query.go +++ b/x/staking/client/cli/query.go @@ -6,6 +6,8 @@ import ( "strconv" "strings" + "github.com/gogo/protobuf/proto" + "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -80,7 +82,7 @@ $ %s query staking validator cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhff return err } - return clientCtx.PrintOutput(res.Validator) + return clientCtx.PrintOutput(&res.Validator) }, } @@ -116,17 +118,17 @@ $ %s query staking validators return err } - var validators types.Validators + var validators []proto.Message for _, kv := range resKVs { validator, err := types.UnmarshalValidator(types.ModuleCdc, kv.Value) if err != nil { return err } - validators = append(validators, validator) + validators = append(validators, &validator) } - return clientCtx.PrintOutput(validators) + return clientCtx.PrintOutputArray(validators) }, } @@ -452,7 +454,7 @@ $ %s query staking unbonding-delegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld7 return err } - return clientCtx.PrintOutput(res.Unbond) + return clientCtx.PrintOutput(&res.Unbond) }, } @@ -567,7 +569,7 @@ $ %s query staking redelegation cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p co return err } - return clientCtx.PrintOutput(res.RedelegationResponses) + return clientCtx.PrintOutput(res) }, } @@ -705,7 +707,7 @@ $ %s query staking pool return err } - return clientCtx.PrintOutput(res.Pool) + return clientCtx.PrintOutput(&res.Pool) }, } @@ -743,7 +745,7 @@ $ %s query staking params return err } - return clientCtx.PrintOutput(res.Params) + return clientCtx.PrintOutput(&res.Params) }, } diff --git a/x/staking/genesis.go b/x/staking/genesis.go index a0d9095a3322..ebba834dbbd1 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -19,7 +19,7 @@ import ( // Returns final validator set after applying all declaration and delegations func InitGenesis( ctx sdk.Context, keeper keeper.Keeper, accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, data types.GenesisState, + bankKeeper types.BankKeeper, data *types.GenesisState, ) (res []abci.ValidatorUpdate) { bondedTokens := sdk.ZeroInt() notBondedTokens := sdk.ZeroInt() @@ -199,7 +199,7 @@ func WriteValidators(ctx sdk.Context, keeper keeper.Keeper) (vals []tmtypes.Gene // ValidateGenesis validates the provided staking genesis state to ensure the // expected invariants holds. (i.e. params in correct bounds, no duplicate validators) -func ValidateGenesis(data types.GenesisState) error { +func ValidateGenesis(data *types.GenesisState) error { if err := validateGenesisStateValidators(data.Validators); err != nil { return err } diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index d67f66b9a8cc..989bf56bf00d 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -161,7 +161,7 @@ func TestValidateGenesis(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { genesisState := types.DefaultGenesisState() - tt.mutate(&genesisState) + tt.mutate(genesisState) if tt.wantErr { assert.Error(t, staking.ValidateGenesis(genesisState)) } else { diff --git a/x/staking/module.go b/x/staking/module.go index dffecd95ed01..8550e796af3b 100644 --- a/x/staking/module.go +++ b/x/staking/module.go @@ -65,7 +65,7 @@ func (AppModuleBasic) ValidateGenesis(cdc codec.JSONMarshaler, config client.TxE return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) } - return ValidateGenesis(data) + return ValidateGenesis(&data) } // RegisterRESTRoutes registers the REST routes for the staking module. @@ -141,7 +141,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONMarshaler, data j cdc.MustUnmarshalJSON(data, &genesisState) - return InitGenesis(ctx, am.keeper, am.accountKeeper, am.bankKeeper, genesisState) + return InitGenesis(ctx, am.keeper, am.accountKeeper, am.bankKeeper, &genesisState) } // ExportGenesis returns the exported genesis state as raw bytes for the staking diff --git a/x/upgrade/client/cli/query.go b/x/upgrade/client/cli/query.go index a555cfc90089..a2c4dc943b5b 100644 --- a/x/upgrade/client/cli/query.go +++ b/x/upgrade/client/cli/query.go @@ -105,7 +105,7 @@ func GetAppliedPlanCmd() *cobra.Command { if err != nil { return err } - return clientCtx.PrintOutput(string(bz)) + return clientCtx.PrintString(fmt.Sprintf("%s\n", string(bz))) }, } From 675d9f756c7828684015823ca78e50d2a6ad7f22 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Fri, 7 Aug 2020 15:58:12 -0400 Subject: [PATCH 04/28] WIP on fixing proto JSON issues --- simapp/app.go | 8 ++++--- x/bank/client/cli/cli_test.go | 44 +++++++++++++++++------------------ x/bank/client/cli/query.go | 2 +- x/bank/client/rest/tx_test.go | 2 +- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/simapp/app.go b/simapp/app.go index 58d2fc27888f..8fa72e1684e1 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -504,9 +504,11 @@ func (app *SimApp) SimulationManager() *module.SimulationManager { // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server) { - rpc.RegisterRoutes(apiSvr.ClientCtx, apiSvr.Router) - authrest.RegisterTxRoutes(apiSvr.ClientCtx, apiSvr.Router) - ModuleBasics.RegisterRESTRoutes(apiSvr.ClientCtx, apiSvr.Router) + clientCtx := apiSvr.ClientCtx + clientCtx = clientCtx.WithJSONMarshaler(clientCtx.Codec) + rpc.RegisterRoutes(clientCtx, apiSvr.Router) + authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) + ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) } // GetMaccPerms returns a copy of the module account permissions diff --git a/x/bank/client/cli/cli_test.go b/x/bank/client/cli/cli_test.go index ca4e328005d2..d8c1b8b4b223 100644 --- a/x/bank/client/cli/cli_test.go +++ b/x/bank/client/cli/cli_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" @@ -128,43 +130,41 @@ func (s *IntegrationTestSuite) TestGetCmdQueryTotalSupply() { name string args []string expectErr bool - respType fmt.Stringer - expected fmt.Stringer + respType proto.Message + expected proto.Message }{ { - "total supply", - []string{ + name: "total supply", + args: []string{ fmt.Sprintf("--%s=1", flags.FlagHeight), fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, - false, - &sdk.Coins{}, - sdk.NewCoins( - sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), s.cfg.AccountTokens), - sdk.NewCoin(s.cfg.BondDenom, s.cfg.StakingTokens.Add(sdk.NewInt(10))), - ), + respType: &types.QueryTotalSupplyResponse{}, + expected: &types.QueryTotalSupplyResponse{ + Supply: sdk.NewCoins( + sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), s.cfg.AccountTokens), + sdk.NewCoin(s.cfg.BondDenom, s.cfg.StakingTokens.Add(sdk.NewInt(10))), + )}, }, { - "total supply of a specific denomination", - []string{ + name: "total supply of a specific denomination", + args: []string{ fmt.Sprintf("--%s=1", flags.FlagHeight), fmt.Sprintf("--%s=%s", cli.FlagDenom, s.cfg.BondDenom), fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, - false, - &sdk.Coin{}, - sdk.NewCoin(s.cfg.BondDenom, s.cfg.StakingTokens.Add(sdk.NewInt(10))), + respType: &sdk.Coin{}, + expected: &sdk.Coin{s.cfg.BondDenom, s.cfg.StakingTokens.Add(sdk.NewInt(10))}, }, { - "total supply of a bogus denom", - []string{ + name: "total supply of a bogus denom", + args: []string{ fmt.Sprintf("--%s=1", flags.FlagHeight), fmt.Sprintf("--%s=foobar", cli.FlagDenom), fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, - false, - &sdk.Coin{}, - sdk.NewCoin("foobar", sdk.ZeroInt()), + respType: &sdk.Coin{}, + expected: &sdk.Coin{"foobar", sdk.ZeroInt()}, }, } @@ -188,8 +188,8 @@ func (s *IntegrationTestSuite) TestGetCmdQueryTotalSupply() { s.Require().Error(err) } else { s.Require().NoError(err) - s.Require().NoError(clientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - s.Require().Equal(tc.expected.String(), tc.respType.String()) + s.Require().NoError(clientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), tc.respType)) + s.Require().Equal(tc.expected, tc.respType) } }) } diff --git a/x/bank/client/cli/query.go b/x/bank/client/cli/query.go index 03db196e22e1..ad4cfcca13dc 100644 --- a/x/bank/client/cli/query.go +++ b/x/bank/client/cli/query.go @@ -148,7 +148,7 @@ To query for the total supply of a specific coin denomination use: return err } - return clientCtx.PrintOutput(res) + return clientCtx.PrintOutput(&res.Amount) }, } diff --git a/x/bank/client/rest/tx_test.go b/x/bank/client/rest/tx_test.go index b32dc486bb8f..11ef299ce6e2 100644 --- a/x/bank/client/rest/tx_test.go +++ b/x/bank/client/rest/tx_test.go @@ -99,7 +99,7 @@ func getAccountInfo(val *network.Validator) (authtypes.AccountI, error) { } var acc authtypes.AccountI - err = val.ClientCtx.JSONMarshaler.UnmarshalJSON(bz, &acc) + err = val.ClientCtx.Codec.UnmarshalJSON(bz, &acc) if err != nil { return nil, err } From ce3ae5511621f66c442a191ca0589111b9330166 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Fri, 7 Aug 2020 17:00:17 -0400 Subject: [PATCH 05/28] WIP on fixing proto JSON issues --- client/context.go | 4 ---- x/evidence/client/cli/query.go | 10 +--------- x/gov/client/cli/query.go | 14 ++------------ x/ibc/02-client/client/cli/query.go | 14 +------------- x/staking/client/cli/query.go | 8 +++----- 5 files changed, 7 insertions(+), 43 deletions(-) diff --git a/client/context.go b/client/context.go index 7e25290be693..bd3b9b86949f 100644 --- a/client/context.go +++ b/client/context.go @@ -264,10 +264,6 @@ func (ctx Context) printOutput(toPrint interface{}) error { return nil } -func (ctx Context) PrintOutputArray(toPrint []proto.Message) error { - panic("TODO") -} - // GetFromFields returns a from account address and Keybase name given either // an address or key name. If genOnly is true, only a valid Bech32 cosmos // address is returned. diff --git a/x/evidence/client/cli/query.go b/x/evidence/client/cli/query.go index f5adf0f0208a..31365648558f 100644 --- a/x/evidence/client/cli/query.go +++ b/x/evidence/client/cli/query.go @@ -6,8 +6,6 @@ import ( "fmt" "strings" - "github.com/gogo/protobuf/proto" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -98,15 +96,9 @@ func queryAllEvidence(clientCtx client.Context, pageReq *query.PageRequest) erro } res, err := queryClient.AllEvidence(context.Background(), params) - if err != nil { return err } - outputArray := make([]proto.Message, 0, len(res.Evidence)) - for _, eviAny := range res.Evidence { - outputArray = append(outputArray, eviAny) - } - - return clientCtx.PrintOutputArray(outputArray) + return clientCtx.PrintOutput(res) } diff --git a/x/gov/client/cli/query.go b/x/gov/client/cli/query.go index 7a5a243da23e..328ada98ae1b 100644 --- a/x/gov/client/cli/query.go +++ b/x/gov/client/cli/query.go @@ -6,8 +6,6 @@ import ( "strconv" "strings" - "github.com/gogo/protobuf/proto" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -300,11 +298,7 @@ $ %[1]s query gov votes 1 --page=2 --limit=100 var votes types.Votes clientCtx.JSONMarshaler.MustUnmarshalJSON(resByTxQuery, &votes) - toPrint := make([]proto.Message, len(votes)) - for i, vote := range votes { - toPrint[i] = &vote - } - return clientCtx.PrintOutputArray(toPrint) + return clientCtx.PrintOutputLegacy(votes) } @@ -454,11 +448,7 @@ $ %s query gov deposits 1 var dep types.Deposits clientCtx.JSONMarshaler.MustUnmarshalJSON(resByTxQuery, &dep) - toPrint := make([]proto.Message, len(dep)) - for i, d := range dep { - toPrint[i] = &d - } - return clientCtx.PrintOutputArray(toPrint) + return clientCtx.PrintOutputLegacy(dep) } pageReq, err := client.ReadPageRequest(cmd.Flags()) diff --git a/x/ibc/02-client/client/cli/query.go b/x/ibc/02-client/client/cli/query.go index 57ca1f859645..d59e43a553a7 100644 --- a/x/ibc/02-client/client/cli/query.go +++ b/x/ibc/02-client/client/cli/query.go @@ -6,9 +6,6 @@ import ( "strconv" "strings" - types2 "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/gogo/protobuf/proto" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -45,16 +42,7 @@ func GetCmdQueryClientStates() *cobra.Command { clientCtx = clientCtx.WithHeight(height) - toPrint := make([]proto.Message, len(clientStates)) - for i, st := range clientStates { - any, err := types2.NewAnyWithValue(st) - if err != nil { - return err - } - toPrint[i] = any - } - - return clientCtx.PrintOutputArray(toPrint) + return clientCtx.PrintOutputLegacy(clientStates) }, } diff --git a/x/staking/client/cli/query.go b/x/staking/client/cli/query.go index 101fa72aa5f6..c23ebd9bac88 100644 --- a/x/staking/client/cli/query.go +++ b/x/staking/client/cli/query.go @@ -6,8 +6,6 @@ import ( "strconv" "strings" - "github.com/gogo/protobuf/proto" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -118,17 +116,17 @@ $ %s query staking validators return err } - var validators []proto.Message + var validators []types.Validator for _, kv := range resKVs { validator, err := types.UnmarshalValidator(types.ModuleCdc, kv.Value) if err != nil { return err } - validators = append(validators, &validator) + validators = append(validators, validator) } - return clientCtx.PrintOutputArray(validators) + return clientCtx.PrintOutputLegacy(validators) }, } From c208575f8becd6d37de018fad5eac86e843415c2 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Fri, 7 Aug 2020 17:56:07 -0400 Subject: [PATCH 06/28] WIP on fixing proto JSON issues --- codec/json.go | 4 +++- x/bank/client/rest/query_test.go | 4 ++-- x/distribution/client/cli/cli_test.go | 16 +++++++++------- x/distribution/client/cli/tx.go | 2 +- x/distribution/client/cli/utils.go | 3 ++- x/distribution/client/common/common.go | 4 ++-- x/evidence/keeper/querier_test.go | 6 +++--- x/ibc/02-client/exported/exported.go | 4 ---- x/ibc/04-channel/client/cli/query.go | 9 +-------- 9 files changed, 23 insertions(+), 29 deletions(-) diff --git a/codec/json.go b/codec/json.go index cab6993cae5d..f291e229b598 100644 --- a/codec/json.go +++ b/codec/json.go @@ -12,7 +12,9 @@ import ( // ProtoMarshalJSON provides an auxiliary function to return Proto3 JSON encoded // bytes of a message. func ProtoMarshalJSON(msg proto.Message) ([]byte, error) { - jm := &jsonpb.Marshaler{OrigName: true} + // we use the original proto name because camel case just doesn't make sense + // EmitDefaults is also the more expected behavior for CLI users. + jm := &jsonpb.Marshaler{OrigName: true, EmitDefaults: true} err := types.UnpackInterfaces(msg, types.ProtoJSONPacker{JSONPBMarshaler: jm}) if err != nil { return nil, err diff --git a/x/bank/client/rest/query_test.go b/x/bank/client/rest/query_test.go index d3b40aa16084..098ec9cb0c73 100644 --- a/x/bank/client/rest/query_test.go +++ b/x/bank/client/rest/query_test.go @@ -77,7 +77,7 @@ func (s *IntegrationTestSuite) TestQueryBalancesRequestHandlerFn() { bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.JSONMarshaler.UnmarshalJSON(bz, tc.respType)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) }) } @@ -124,7 +124,7 @@ func (s *IntegrationTestSuite) TestTotalSupplyHandlerFn() { bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.JSONMarshaler.UnmarshalJSON(bz, tc.respType)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) }) } diff --git a/x/distribution/client/cli/cli_test.go b/x/distribution/client/cli/cli_test.go index 7aba70e57276..8d76c3ee4335 100644 --- a/x/distribution/client/cli/cli_test.go +++ b/x/distribution/client/cli/cli_test.go @@ -48,7 +48,7 @@ func (s *IntegrationTestSuite) SetupTest() { mintData.Params.InflationMin = inflation mintData.Params.InflationMax = inflation - mintDataBz, err := cfg.Codec.MarshalJSON(mintData) + mintDataBz, err := cfg.Codec.MarshalJSON(&mintData) s.Require().NoError(err) genesisState[minttypes.ModuleName] = mintDataBz cfg.GenesisState = genesisState @@ -299,7 +299,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorSlashes() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - "{\"slashes\":null,\"pagination\":{}}", + "{\"slashes\":[],\"pagination\":{\"next_key\":null,\"total\":\"0\"}}", }, { "text output", @@ -309,7 +309,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryValidatorSlashes() { sdk.ValAddress(val.Address).String(), "1", "3", }, false, - "pagination: {}\nslashes: null", + "pagination:\n next_key: null\n total: \"0\"\nslashes: []", }, } @@ -389,7 +389,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() { fmt.Sprintf("--%s=json", tmcli.OutputFlag), }, false, - `[{"denom":"stake","amount":"387.100000000000000000"}]`, + `{"rewards":[{"denom":"stake","amount":"387.100000000000000000"}]}`, }, { "text output", @@ -416,7 +416,8 @@ total: addr.String(), valAddr.String(), }, false, - `- amount: "387.100000000000000000" + `rewards: +- amount: "387.100000000000000000" denom: stake`, }, } @@ -461,12 +462,13 @@ func (s *IntegrationTestSuite) TestGetCmdQueryCommunityPool() { { "json output", []string{fmt.Sprintf("--%s=3", flags.FlagHeight), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, - `[{"denom":"stake","amount":"4.740000000000000000"}]`, + `{"pool":[{"denom":"stake","amount":"4.740000000000000000"}]}`, }, { "text output", []string{fmt.Sprintf("--%s=text", tmcli.OutputFlag), fmt.Sprintf("--%s=3", flags.FlagHeight)}, - `- amount: "4.740000000000000000" + `pool: +- amount: "4.740000000000000000" denom: stake`, }, } diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index 4df081a99f90..6c55d1d5d9e2 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -287,7 +287,7 @@ Where proposal.json contains: return err } - proposal, err := ParseCommunityPoolSpendProposalJSON(clientCtx.JSONMarshaler, args[0]) + proposal, err := ParseCommunityPoolSpendProposalJSON(clientCtx.Codec, args[0]) if err != nil { return err } diff --git a/x/distribution/client/cli/utils.go b/x/distribution/client/cli/utils.go index 078085c2ae1b..4da6d0e0871b 100644 --- a/x/distribution/client/cli/utils.go +++ b/x/distribution/client/cli/utils.go @@ -19,7 +19,8 @@ type ( ) // ParseCommunityPoolSpendProposalJSON reads and parses a CommunityPoolSpendProposalJSON from a file. -func ParseCommunityPoolSpendProposalJSON(cdc codec.JSONMarshaler, proposalFile string) (CommunityPoolSpendProposalJSON, error) { +// TODO: migrate this to protobuf +func ParseCommunityPoolSpendProposalJSON(cdc *codec.Codec, proposalFile string) (CommunityPoolSpendProposalJSON, error) { proposal := CommunityPoolSpendProposalJSON{} contents, err := ioutil.ReadFile(proposalFile) diff --git a/x/distribution/client/common/common.go b/x/distribution/client/common/common.go index f18f0d7756f9..ec10e616470d 100644 --- a/x/distribution/client/common/common.go +++ b/x/distribution/client/common/common.go @@ -36,7 +36,7 @@ func QueryDelegationRewards(clientCtx client.Context, delAddr, valAddr string) ( func QueryDelegatorValidators(clientCtx client.Context, delegatorAddr sdk.AccAddress) ([]byte, error) { res, _, err := clientCtx.QueryWithData( fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorValidators), - clientCtx.JSONMarshaler.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)), + clientCtx.Codec.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)), ) return res, err } @@ -61,7 +61,7 @@ func WithdrawAllDelegatorRewards(clientCtx client.Context, delegatorAddr sdk.Acc } var validators []sdk.ValAddress - if err := clientCtx.JSONMarshaler.UnmarshalJSON(bz, &validators); err != nil { + if err := clientCtx.Codec.UnmarshalJSON(bz, &validators); err != nil { return nil, err } diff --git a/x/evidence/keeper/querier_test.go b/x/evidence/keeper/querier_test.go index 2d80be1b2681..58a1ff81bb3e 100644 --- a/x/evidence/keeper/querier_test.go +++ b/x/evidence/keeper/querier_test.go @@ -18,7 +18,7 @@ const ( func (suite *KeeperTestSuite) TestQuerier_QueryEvidence_Existing() { ctx := suite.ctx.WithIsCheckTx(false) numEvidence := 100 - cdc, _ := simapp.MakeCodecs() + _, cdc := simapp.MakeCodecs() evidence := suite.populateEvidence(ctx, numEvidence) query := abci.RequestQuery{ @@ -53,7 +53,7 @@ func (suite *KeeperTestSuite) TestQuerier_QueryEvidence_NonExisting() { func (suite *KeeperTestSuite) TestQuerier_QueryAllEvidence() { ctx := suite.ctx.WithIsCheckTx(false) - cdc, _ := simapp.MakeCodecs() + _, cdc := simapp.MakeCodecs() numEvidence := 100 suite.populateEvidence(ctx, numEvidence) @@ -73,7 +73,7 @@ func (suite *KeeperTestSuite) TestQuerier_QueryAllEvidence() { func (suite *KeeperTestSuite) TestQuerier_QueryAllEvidence_InvalidPagination() { ctx := suite.ctx.WithIsCheckTx(false) - cdc, _ := simapp.MakeCodecs() + _, cdc := simapp.MakeCodecs() numEvidence := 100 suite.populateEvidence(ctx, numEvidence) diff --git a/x/ibc/02-client/exported/exported.go b/x/ibc/02-client/exported/exported.go index 28abce81ef73..405433f188e3 100644 --- a/x/ibc/02-client/exported/exported.go +++ b/x/ibc/02-client/exported/exported.go @@ -3,8 +3,6 @@ package exported import ( "encoding/json" - "github.com/gogo/protobuf/proto" - ics23 "github.com/confio/ics23/go" sdk "github.com/cosmos/cosmos-sdk/types" @@ -19,8 +17,6 @@ import ( // ClientState defines the required common functions for light clients. type ClientState interface { - proto.Message - GetChainID() string ClientType() ClientType GetLatestHeight() uint64 diff --git a/x/ibc/04-channel/client/cli/query.go b/x/ibc/04-channel/client/cli/query.go index e6f0e0148b0c..71c9bb122e72 100644 --- a/x/ibc/04-channel/client/cli/query.go +++ b/x/ibc/04-channel/client/cli/query.go @@ -5,8 +5,6 @@ import ( "fmt" "strconv" - types2 "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" @@ -168,12 +166,7 @@ func GetCmdQueryChannelClientState() *cobra.Command { clientCtx = clientCtx.WithHeight(height) - any, err := types2.NewAnyWithValue(clientStateRes) - if err != nil { - return err - } - - return clientCtx.PrintOutput(any) + return clientCtx.PrintOutputLegacy(clientStateRes) }, } From 81beade5ccba8d9fe34ddd099309ad6a16514bcc Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 10 Aug 2020 10:59:13 -0400 Subject: [PATCH 07/28] Test fixes --- proto/cosmos/gov/gov.proto | 2 - x/genutil/client/cli/gentx.go | 2 +- x/gov/genesis_test.go | 4 +- x/gov/keeper/querier_test.go | 2 +- x/gov/types/gov.pb.go | 190 +++--- x/gov/types/proposal.go | 46 -- x/staking/types/staking.pb.go | 1215 +++++++++++++++++---------------- 7 files changed, 709 insertions(+), 752 deletions(-) diff --git a/proto/cosmos/gov/gov.proto b/proto/cosmos/gov/gov.proto index ea47e818d90d..5f4f466b3045 100644 --- a/proto/cosmos/gov/gov.proto +++ b/proto/cosmos/gov/gov.proto @@ -120,8 +120,6 @@ message Proposal { // ProposalStatus is a type alias that represents a proposal status as a byte enum ProposalStatus { - option (gogoproto.enum_stringer) = false; - option (gogoproto.goproto_enum_stringer) = false; option (gogoproto.goproto_enum_prefix) = false; // PROPOSAL_STATUS_UNSPECIFIED defines the default propopsal status. diff --git a/x/genutil/client/cli/gentx.go b/x/genutil/client/cli/gentx.go index f99303cc29c9..b151290e5dfd 100644 --- a/x/genutil/client/cli/gentx.go +++ b/x/genutil/client/cli/gentx.go @@ -88,7 +88,7 @@ $ %s gentx my-key-name --home=/path/to/home/dir --keyring-backend=os --chain-id= } var genesisState map[string]json.RawMessage - if err = cdc.UnmarshalJSON(genDoc.AppState, &genesisState); err != nil { + if err = json.Unmarshal(genDoc.AppState, &genesisState); err != nil { return errors.Wrap(err, "failed to unmarshal genesis state") } diff --git a/x/gov/genesis_test.go b/x/gov/genesis_test.go index 0d1a0d5a9a66..4dd3c5bd743a 100644 --- a/x/gov/genesis_test.go +++ b/x/gov/genesis_test.go @@ -1,6 +1,7 @@ package gov_test import ( + "encoding/json" "testing" "github.com/stretchr/testify/require" @@ -8,7 +9,6 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/x/auth" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -61,7 +61,7 @@ func TestImportExportQueues(t *testing.T) { genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenState) genesisState[types.ModuleName] = app.AppCodec().MustMarshalJSON(govGenState) - stateBytes, err := codec.MarshalJSONIndent(app.Codec(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { panic(err) } diff --git a/x/gov/keeper/querier_test.go b/x/gov/keeper/querier_test.go index db86e896795a..98fdf888fa68 100644 --- a/x/gov/keeper/querier_test.go +++ b/x/gov/keeper/querier_test.go @@ -146,8 +146,8 @@ func getQueriedVotes(t *testing.T, ctx sdk.Context, cdc codec.JSONMarshaler, que func TestQueries(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, abci.Header{}) - appCodec := app.AppCodec() legacyQuerierCdc := codec.NewAminoCodec(app.Codec()) + appCodec := legacyQuerierCdc querier := keeper.NewQuerier(app.GovKeeper, legacyQuerierCdc) TestAddrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(20000001)) diff --git a/x/gov/types/gov.pb.go b/x/gov/types/gov.pb.go index 6e0d3ec8b92a..6ea3a3f933e6 100644 --- a/x/gov/types/gov.pb.go +++ b/x/gov/types/gov.pb.go @@ -105,6 +105,10 @@ var ProposalStatus_value = map[string]int32{ "PROPOSAL_STATUS_FAILED": 5, } +func (x ProposalStatus) String() string { + return proto.EnumName(ProposalStatus_name, int32(x)) +} + func (ProposalStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_67fb57f9a603bed5, []int{1} } @@ -569,99 +573,99 @@ func init() { func init() { proto.RegisterFile("cosmos/gov/gov.proto", fileDescriptor_67fb57f9a603bed5) } var fileDescriptor_67fb57f9a603bed5 = []byte{ - // 1468 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6b, 0x1b, 0xd7, - 0x16, 0xd6, 0xc8, 0xbf, 0x8f, 0x64, 0x7b, 0x72, 0xed, 0x67, 0x2b, 0xf3, 0xde, 0x9b, 0x51, 0xf4, - 0xc2, 0xc3, 0x84, 0x44, 0xce, 0x73, 0x56, 0x2f, 0x81, 0x47, 0x24, 0x6b, 0x92, 0x28, 0xc4, 0x92, - 0x18, 0x4d, 0x14, 0x92, 0xb7, 0x18, 0xc6, 0xd2, 0x44, 0x9e, 0x56, 0x33, 0x57, 0xd5, 0x5c, 0xb9, - 0x36, 0xd9, 0xb4, 0xbb, 0xa2, 0x42, 0x48, 0x77, 0xdd, 0x08, 0x0a, 0xcd, 0xa2, 0xed, 0xaa, 0x85, - 0xfe, 0x11, 0xa6, 0x74, 0x11, 0x4a, 0x17, 0xa1, 0x0b, 0xa5, 0x71, 0xa0, 0x14, 0x2f, 0xba, 0xc8, - 0xb2, 0x9b, 0x96, 0xb9, 0xf7, 0x8e, 0x35, 0x92, 0x4d, 0x1d, 0xf5, 0x07, 0x85, 0x2e, 0x02, 0xd2, - 0xb9, 0xe7, 0xfb, 0xee, 0x39, 0x9f, 0xce, 0x77, 0x66, 0x62, 0x58, 0xac, 0x62, 0xcf, 0xc1, 0xde, - 0x6a, 0x1d, 0x6f, 0xfb, 0xff, 0xd2, 0xcd, 0x16, 0x26, 0x18, 0x01, 0x8b, 0xa6, 0xeb, 0x78, 0x5b, - 0x5a, 0xe0, 0x19, 0x3c, 0x44, 0x13, 0xa4, 0xc5, 0x3a, 0xae, 0x63, 0xfa, 0x71, 0xd5, 0xff, 0xc4, - 0xa3, 0xa7, 0x59, 0x8e, 0xc1, 0x0e, 0x06, 0x00, 0x4a, 0x1d, 0xe3, 0x7a, 0xc3, 0x5a, 0xa5, 0xdf, - 0x36, 0xdb, 0xf7, 0x57, 0x89, 0xed, 0x58, 0x1e, 0x31, 0x9d, 0x66, 0x80, 0x1d, 0x4e, 0x30, 0xdd, - 0x5d, 0x7e, 0x24, 0x0f, 0x1f, 0xd5, 0xda, 0x2d, 0x93, 0xd8, 0xd8, 0x65, 0xe7, 0xa9, 0x8f, 0xa3, - 0x70, 0x6a, 0xc3, 0xab, 0x97, 0xdb, 0x9b, 0x8e, 0x4d, 0x4a, 0x2d, 0xdc, 0xc4, 0x9e, 0xd9, 0x40, - 0x57, 0x60, 0xaa, 0x8a, 0x5d, 0x62, 0xb9, 0x24, 0x21, 0x24, 0x85, 0x95, 0xd8, 0xda, 0x62, 0x9a, - 0xf1, 0xa4, 0x03, 0x9e, 0x74, 0xc6, 0xdd, 0xcd, 0xc6, 0xbe, 0xf8, 0xfc, 0xc2, 0xd4, 0x3a, 0x4b, - 0xd4, 0x02, 0x04, 0x7a, 0x5b, 0x80, 0x79, 0xdb, 0xb5, 0x89, 0x6d, 0x36, 0x8c, 0x9a, 0xd5, 0xc4, - 0x9e, 0x4d, 0x12, 0xd1, 0xe4, 0xd8, 0x4a, 0x6c, 0x2d, 0x9e, 0xe6, 0x7d, 0xad, 0x63, 0xdb, 0xcd, - 0xde, 0xdc, 0xeb, 0x29, 0x91, 0x97, 0x3d, 0x65, 0x69, 0xd7, 0x74, 0x1a, 0x97, 0x53, 0x43, 0x90, - 0xd4, 0x27, 0xcf, 0x94, 0x95, 0xba, 0x4d, 0xb6, 0xda, 0x9b, 0xe9, 0x2a, 0x76, 0x56, 0x07, 0x94, - 0xbc, 0xe0, 0xd5, 0x5e, 0x5f, 0x25, 0xbb, 0x4d, 0x8b, 0x51, 0x79, 0xda, 0x1c, 0x47, 0xe7, 0x18, - 0x18, 0x6d, 0xc0, 0x74, 0x93, 0x36, 0x63, 0xb5, 0x12, 0x63, 0x49, 0x61, 0x25, 0x9e, 0xfd, 0xcf, - 0x8f, 0x3d, 0xe5, 0xc2, 0x2b, 0xf0, 0x65, 0xaa, 0xd5, 0x4c, 0xad, 0xd6, 0xb2, 0x3c, 0x4f, 0x3b, - 0xa4, 0xb8, 0x3c, 0xfe, 0xfd, 0x07, 0x8a, 0x90, 0xea, 0x09, 0x30, 0xb5, 0xe1, 0xd5, 0x2b, 0x98, - 0x58, 0x48, 0x87, 0x58, 0x93, 0xab, 0x65, 0xd8, 0x35, 0xaa, 0xd2, 0x78, 0xf6, 0xd2, 0x7e, 0x4f, - 0x81, 0x40, 0xc4, 0x7c, 0xee, 0xa0, 0xa7, 0x84, 0x93, 0x5e, 0xf6, 0x14, 0xc4, 0x5a, 0x0d, 0x05, - 0x53, 0x1a, 0x04, 0xdf, 0xf2, 0x35, 0x74, 0x1d, 0x26, 0xb6, 0x31, 0xb1, 0x5a, 0x89, 0xe8, 0xaf, - 0xad, 0x99, 0xe1, 0x51, 0x1a, 0x26, 0x71, 0xd3, 0xff, 0x99, 0x69, 0xf7, 0x73, 0x6b, 0x4b, 0xe9, - 0xfe, 0x54, 0xa6, 0xfd, 0x06, 0x8a, 0xf4, 0x54, 0xe3, 0x59, 0xbc, 0xc1, 0xf7, 0xa2, 0x00, 0x1b, - 0x5e, 0x3d, 0x10, 0xf1, 0x8f, 0xe9, 0xb1, 0x08, 0x33, 0xfc, 0x27, 0xc6, 0xbf, 0xa1, 0xcf, 0x3e, - 0x07, 0xaa, 0xc0, 0xa4, 0xe9, 0xe0, 0xb6, 0x4b, 0x12, 0x63, 0xc7, 0x4c, 0xd9, 0x45, 0x7f, 0xca, - 0x46, 0x9a, 0x25, 0xce, 0xc6, 0x35, 0xb9, 0x03, 0x71, 0xdd, 0xda, 0xe9, 0x5b, 0x63, 0x11, 0x26, - 0x88, 0x4d, 0x1a, 0x16, 0x95, 0x63, 0x46, 0x63, 0x5f, 0x50, 0x12, 0x62, 0x35, 0xcb, 0xab, 0xb6, - 0x6c, 0x26, 0x7a, 0x94, 0x9e, 0x85, 0x43, 0x97, 0xe7, 0x7d, 0xb6, 0xaf, 0xfa, 0x7e, 0x49, 0xfd, - 0x24, 0xc0, 0x54, 0xa0, 0xb4, 0x7a, 0x9c, 0xd2, 0x67, 0x07, 0x95, 0xfe, 0xeb, 0x49, 0xfb, 0xdd, - 0x24, 0x4c, 0x1f, 0xea, 0x9a, 0x3d, 0x4e, 0x82, 0x33, 0x47, 0x86, 0x2d, 0x4a, 0x67, 0x6c, 0x86, - 0xaf, 0x8c, 0xa1, 0xfe, 0x43, 0x6b, 0x2b, 0x3a, 0xf2, 0xda, 0x2a, 0xc0, 0xa4, 0x47, 0x4c, 0xd2, - 0xf6, 0xb8, 0x65, 0xa4, 0xb0, 0x65, 0x82, 0x1a, 0xca, 0x34, 0x23, 0x2b, 0xf5, 0xd7, 0xd6, 0x61, - 0xd1, 0x0c, 0x9c, 0xd2, 0x38, 0x0b, 0xda, 0x02, 0x74, 0xdf, 0x76, 0xcd, 0x86, 0x41, 0xcc, 0x46, - 0x63, 0xd7, 0x68, 0x59, 0x5e, 0xbb, 0x41, 0x12, 0xe3, 0xb4, 0xae, 0xe5, 0x30, 0xb7, 0xee, 0x9f, - 0x6b, 0xf4, 0x38, 0x7b, 0x86, 0xef, 0xc4, 0xd3, 0x8c, 0xfc, 0x28, 0x41, 0x4a, 0x13, 0x69, 0x30, - 0x04, 0x42, 0xff, 0x87, 0x98, 0x47, 0xf7, 0xb7, 0xe1, 0x3f, 0x18, 0x12, 0x13, 0xf4, 0x0a, 0xe9, - 0x48, 0xeb, 0x7a, 0xf0, 0xd4, 0xc8, 0xca, 0xfc, 0x16, 0x3e, 0x4f, 0x21, 0x70, 0xea, 0xd1, 0x33, - 0x45, 0xd0, 0x80, 0x45, 0x7c, 0x00, 0xb2, 0x41, 0xe4, 0xf3, 0x60, 0x58, 0x6e, 0x8d, 0xdd, 0x30, - 0x79, 0xe2, 0x0d, 0xff, 0xe2, 0x37, 0x2c, 0xb3, 0x1b, 0x86, 0x19, 0xd8, 0x35, 0x73, 0x3c, 0xac, - 0xba, 0x35, 0x7a, 0xd5, 0x03, 0x98, 0x25, 0x98, 0x84, 0x9e, 0x1a, 0x53, 0xc7, 0x0c, 0xdd, 0x0d, - 0xce, 0xbc, 0xc8, 0x98, 0x07, 0x00, 0xa3, 0x3d, 0x33, 0xe2, 0x14, 0x1b, 0x58, 0xb0, 0x01, 0xa7, - 0xb6, 0x31, 0xb1, 0xdd, 0xba, 0xff, 0x43, 0xb6, 0xb8, 0x94, 0xd3, 0x27, 0x36, 0x7a, 0x96, 0x97, - 0x93, 0x60, 0xe5, 0x1c, 0xa1, 0x60, 0x9d, 0xce, 0xb3, 0x78, 0xd9, 0x0f, 0xd3, 0x56, 0xef, 0x03, - 0x0f, 0xf5, 0x45, 0x9d, 0x39, 0xf1, 0xae, 0xd4, 0xe0, 0x03, 0x73, 0x88, 0x80, 0xdd, 0x34, 0xcb, - 0xa2, 0x5c, 0x52, 0x6e, 0xb4, 0xbd, 0x28, 0xc4, 0xc2, 0x03, 0x73, 0x15, 0xc6, 0x76, 0x2d, 0x8f, - 0x6d, 0xb0, 0x6c, 0xda, 0x67, 0xfd, 0xa6, 0xa7, 0xfc, 0xfb, 0x15, 0x84, 0xcb, 0xbb, 0x44, 0xf3, - 0xa1, 0xe8, 0x06, 0x4c, 0x99, 0x9b, 0x1e, 0x31, 0x6d, 0xbe, 0xeb, 0x46, 0x66, 0x09, 0xe0, 0xe8, - 0x7f, 0x10, 0x75, 0x31, 0xb5, 0xdc, 0xe8, 0x24, 0x51, 0x17, 0xa3, 0x3a, 0xc4, 0x5d, 0x6c, 0xbc, - 0x69, 0x93, 0x2d, 0x63, 0xdb, 0x22, 0x98, 0x1a, 0x6c, 0x26, 0xab, 0x8e, 0xc6, 0xf4, 0xb2, 0xa7, - 0x2c, 0x30, 0x51, 0xc3, 0x5c, 0x29, 0x0d, 0x5c, 0x7c, 0xc7, 0x26, 0x5b, 0x15, 0x8b, 0x60, 0x2e, - 0xe5, 0x97, 0x02, 0x8c, 0xd3, 0x17, 0x80, 0xdf, 0x69, 0x65, 0xff, 0xc9, 0x4f, 0xfc, 0xcf, 0xa2, - 0x30, 0xcb, 0x1d, 0x50, 0x32, 0x5b, 0xa6, 0xe3, 0xa1, 0x87, 0x02, 0xc4, 0x1c, 0xdb, 0x3d, 0xf4, - 0xa0, 0x70, 0x8c, 0x07, 0x0d, 0x5f, 0xdd, 0x83, 0x9e, 0xf2, 0xb7, 0x50, 0xe2, 0x79, 0xec, 0xd8, - 0xc4, 0x72, 0x9a, 0x64, 0xb7, 0xdf, 0x75, 0xe8, 0x78, 0x34, 0x6b, 0x82, 0x63, 0xbb, 0x81, 0x31, - 0x1f, 0x0a, 0x80, 0x1c, 0x73, 0x27, 0x20, 0x32, 0x9a, 0x56, 0xcb, 0xc6, 0x35, 0xbe, 0xe0, 0x4f, - 0x1f, 0xb1, 0x4b, 0x8e, 0xbf, 0xdf, 0xb2, 0x11, 0x38, 0xe8, 0x29, 0xff, 0x38, 0x0a, 0x1e, 0xa8, - 0x95, 0xaf, 0xda, 0xa3, 0x59, 0xa9, 0xf7, 0x7d, 0x43, 0x89, 0x8e, 0xb9, 0x13, 0x28, 0xc4, 0xc2, - 0xef, 0x0a, 0x10, 0xaf, 0x50, 0x97, 0x71, 0xc9, 0x1e, 0x00, 0x77, 0x5d, 0x50, 0x9b, 0x70, 0x52, - 0x6d, 0x57, 0x78, 0x6d, 0xcb, 0x03, 0xb8, 0x81, 0xb2, 0x16, 0x07, 0x4c, 0x1e, 0xae, 0x28, 0xce, - 0x62, 0xbc, 0x9a, 0xc7, 0x81, 0xb7, 0x79, 0x31, 0xf7, 0x60, 0xf2, 0x8d, 0x36, 0x6e, 0xb5, 0x1d, - 0x5a, 0x45, 0x3c, 0x9b, 0x1d, 0xc1, 0x09, 0x39, 0xab, 0x7a, 0xd0, 0x53, 0x44, 0x86, 0xef, 0x57, - 0xa3, 0x71, 0x46, 0x54, 0x85, 0x19, 0xb2, 0xd5, 0xb2, 0xbc, 0x2d, 0xdc, 0xa8, 0xf1, 0x81, 0x55, - 0x47, 0xa6, 0x5f, 0x38, 0xa4, 0x08, 0xdd, 0xd0, 0xe7, 0x45, 0x3a, 0x8c, 0x53, 0x23, 0xb3, 0xd7, - 0xf6, 0xab, 0x23, 0xf3, 0xcf, 0xf9, 0xe8, 0x10, 0x35, 0x65, 0x3b, 0xf7, 0x83, 0x00, 0xd0, 0x77, - 0x01, 0x3a, 0x0f, 0xcb, 0x95, 0xa2, 0xae, 0x1a, 0xc5, 0x92, 0x9e, 0x2f, 0x16, 0x8c, 0xdb, 0x85, - 0x72, 0x49, 0x5d, 0xcf, 0x5f, 0xcb, 0xab, 0x39, 0x31, 0x22, 0xcd, 0x77, 0xba, 0xc9, 0x18, 0x4b, - 0x54, 0x7d, 0x0a, 0x94, 0x82, 0xf9, 0x70, 0xf6, 0x5d, 0xb5, 0x2c, 0x0a, 0xd2, 0x6c, 0xa7, 0x9b, - 0x9c, 0x61, 0x59, 0x77, 0x2d, 0x0f, 0x9d, 0x83, 0x85, 0x70, 0x4e, 0x26, 0x5b, 0xd6, 0x33, 0xf9, - 0x82, 0x18, 0x95, 0x4e, 0x75, 0xba, 0xc9, 0x59, 0x96, 0x97, 0xe1, 0x3b, 0x2f, 0x09, 0x73, 0xe1, - 0xdc, 0x42, 0x51, 0x1c, 0x93, 0xe2, 0x9d, 0x6e, 0x72, 0x9a, 0xa5, 0x15, 0x30, 0x5a, 0x83, 0xc4, - 0x60, 0x86, 0x71, 0x27, 0xaf, 0xdf, 0x30, 0x2a, 0xaa, 0x5e, 0x14, 0xc7, 0xa5, 0xc5, 0x4e, 0x37, - 0x29, 0x06, 0xb9, 0xc1, 0x82, 0x92, 0xe2, 0xef, 0x7c, 0x28, 0x47, 0x3e, 0x7a, 0x2c, 0x47, 0x3e, - 0x7d, 0x2c, 0x47, 0xce, 0x7d, 0x1d, 0x85, 0xb9, 0xc1, 0xb7, 0x16, 0x94, 0x86, 0xbf, 0x97, 0xb4, - 0x62, 0xa9, 0x58, 0xce, 0xdc, 0x32, 0xca, 0x7a, 0x46, 0xbf, 0x5d, 0x1e, 0x6a, 0x9c, 0xb6, 0xc4, - 0x92, 0x0b, 0xb6, 0xff, 0xbf, 0x40, 0x79, 0x38, 0x3f, 0xa7, 0x96, 0x8a, 0xe5, 0xbc, 0x6e, 0x94, - 0x54, 0x2d, 0x5f, 0xcc, 0x89, 0x82, 0xb4, 0xdc, 0xe9, 0x26, 0x17, 0x18, 0x64, 0xc0, 0x25, 0xe8, - 0xbf, 0xf0, 0xcf, 0x61, 0x70, 0xa5, 0xa8, 0xe7, 0x0b, 0xd7, 0x03, 0x6c, 0x54, 0x5a, 0xea, 0x74, - 0x93, 0x88, 0x61, 0x2b, 0xa1, 0x91, 0x46, 0xe7, 0x61, 0x69, 0x18, 0x5a, 0xca, 0x94, 0xcb, 0x6a, - 0x4e, 0x1c, 0x93, 0xc4, 0x4e, 0x37, 0x19, 0x67, 0x98, 0x92, 0xe9, 0x79, 0x56, 0x0d, 0x5d, 0x84, - 0xc4, 0x70, 0xb6, 0xa6, 0xde, 0x54, 0xd7, 0x75, 0x35, 0x27, 0x8e, 0x4b, 0xa8, 0xd3, 0x4d, 0xce, - 0xb1, 0x7c, 0xcd, 0x7a, 0xcd, 0xaa, 0x12, 0xeb, 0x58, 0xfe, 0x6b, 0x99, 0xfc, 0x2d, 0x35, 0x27, - 0x4e, 0x84, 0xf9, 0xaf, 0x99, 0x76, 0xc3, 0xaa, 0x0d, 0xca, 0x9a, 0x2d, 0xec, 0x3d, 0x97, 0x23, - 0x4f, 0x9f, 0xcb, 0x91, 0xb7, 0xf6, 0xe5, 0xc8, 0xde, 0xbe, 0x2c, 0x3c, 0xd9, 0x97, 0x85, 0x6f, - 0xf7, 0x65, 0xe1, 0xd1, 0x0b, 0x39, 0xf2, 0xe4, 0x85, 0x1c, 0x79, 0xfa, 0x42, 0x8e, 0xdc, 0xfb, - 0xe5, 0x4d, 0xb7, 0x43, 0xff, 0x62, 0x40, 0x67, 0x76, 0x73, 0x92, 0x2e, 0x87, 0x4b, 0x3f, 0x07, - 0x00, 0x00, 0xff, 0xff, 0xc6, 0x9e, 0x45, 0x50, 0x4c, 0x10, 0x00, 0x00, + // 1467 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x1b, 0xd5, + 0x17, 0xf5, 0x38, 0xce, 0xd7, 0xb5, 0x93, 0xb8, 0x2f, 0xf9, 0x25, 0xee, 0xfc, 0x60, 0xc6, 0x35, + 0x15, 0x8a, 0xaa, 0xd6, 0x29, 0xe9, 0x8a, 0x56, 0x42, 0xb5, 0xe3, 0x69, 0xeb, 0xaa, 0xb1, 0xad, + 0xf1, 0xd4, 0x55, 0xcb, 0x62, 0x34, 0xb1, 0xa7, 0xce, 0x80, 0x67, 0x9e, 0xf1, 0x3c, 0x87, 0x44, + 0xdd, 0xc0, 0x0e, 0x19, 0xa9, 0x2a, 0x3b, 0x36, 0x96, 0x90, 0xe8, 0x02, 0x58, 0x81, 0xc4, 0x1f, + 0x11, 0xa1, 0x2e, 0x2a, 0x56, 0x15, 0x0b, 0x97, 0xa6, 0x12, 0x42, 0x59, 0xb0, 0xe8, 0x92, 0x0d, + 0x68, 0xde, 0x7b, 0x13, 0x8f, 0x9d, 0x88, 0xd4, 0x7c, 0x08, 0x89, 0x45, 0x25, 0xfb, 0xbe, 0x7b, + 0xce, 0xbb, 0xf7, 0xf8, 0x9e, 0x3b, 0xd3, 0xc0, 0x42, 0x15, 0xbb, 0x36, 0x76, 0x57, 0xea, 0x78, + 0xcb, 0xfb, 0x97, 0x6e, 0xb6, 0x30, 0xc1, 0x08, 0x58, 0x34, 0x5d, 0xc7, 0x5b, 0xe2, 0x3c, 0xcf, + 0xe0, 0x21, 0x9a, 0x20, 0x2e, 0xd4, 0x71, 0x1d, 0xd3, 0x8f, 0x2b, 0xde, 0x27, 0x1e, 0x3d, 0xc9, + 0x72, 0x74, 0x76, 0x30, 0x00, 0x90, 0xeb, 0x18, 0xd7, 0x1b, 0xe6, 0x0a, 0xfd, 0xb6, 0xd1, 0xbe, + 0xbb, 0x42, 0x2c, 0xdb, 0x74, 0x89, 0x61, 0x37, 0x7d, 0xec, 0x70, 0x82, 0xe1, 0xec, 0xf0, 0x23, + 0x69, 0xf8, 0xa8, 0xd6, 0x6e, 0x19, 0xc4, 0xc2, 0x0e, 0x3b, 0x4f, 0x7d, 0x19, 0x86, 0x13, 0xeb, + 0x6e, 0xbd, 0xdc, 0xde, 0xb0, 0x2d, 0x52, 0x6a, 0xe1, 0x26, 0x76, 0x8d, 0x06, 0xba, 0x04, 0x93, + 0x55, 0xec, 0x10, 0xd3, 0x21, 0x09, 0x21, 0x29, 0x2c, 0x47, 0x57, 0x17, 0xd2, 0x8c, 0x27, 0xed, + 0xf3, 0xa4, 0x33, 0xce, 0x4e, 0x36, 0xfa, 0xdd, 0xb7, 0xe7, 0x26, 0xd7, 0x58, 0xa2, 0xea, 0x23, + 0xd0, 0x87, 0x02, 0xcc, 0x59, 0x8e, 0x45, 0x2c, 0xa3, 0xa1, 0xd7, 0xcc, 0x26, 0x76, 0x2d, 0x92, + 0x08, 0x27, 0xc7, 0x96, 0xa3, 0xab, 0xb1, 0x34, 0xef, 0x6b, 0x0d, 0x5b, 0x4e, 0xf6, 0xfa, 0x6e, + 0x4f, 0x0e, 0xbd, 0xe8, 0xc9, 0x8b, 0x3b, 0x86, 0xdd, 0xb8, 0x98, 0x1a, 0x82, 0xa4, 0xbe, 0x7a, + 0x2a, 0x2f, 0xd7, 0x2d, 0xb2, 0xd9, 0xde, 0x48, 0x57, 0xb1, 0xbd, 0x32, 0xa0, 0xe4, 0x39, 0xb7, + 0xf6, 0xee, 0x0a, 0xd9, 0x69, 0x9a, 0x8c, 0xca, 0x55, 0x67, 0x39, 0x3a, 0xc7, 0xc0, 0x68, 0x1d, + 0xa6, 0x9a, 0xb4, 0x19, 0xb3, 0x95, 0x18, 0x4b, 0x0a, 0xcb, 0xb1, 0xec, 0x1b, 0xbf, 0xf6, 0xe4, + 0x73, 0x2f, 0xc1, 0x97, 0xa9, 0x56, 0x33, 0xb5, 0x5a, 0xcb, 0x74, 0x5d, 0xf5, 0x80, 0xe2, 0x62, + 0xe4, 0xe7, 0xcf, 0x64, 0x21, 0xd5, 0x13, 0x60, 0x72, 0xdd, 0xad, 0x57, 0x30, 0x31, 0x91, 0x06, + 0xd1, 0x26, 0x57, 0x4b, 0xb7, 0x6a, 0x54, 0xa5, 0x48, 0xf6, 0xc2, 0x5e, 0x4f, 0x06, 0x5f, 0xc4, + 0x7c, 0x6e, 0xbf, 0x27, 0x07, 0x93, 0x5e, 0xf4, 0x64, 0xc4, 0x5a, 0x0d, 0x04, 0x53, 0x2a, 0xf8, + 0xdf, 0xf2, 0x35, 0x74, 0x15, 0xc6, 0xb7, 0x30, 0x31, 0x5b, 0x89, 0xf0, 0x9f, 0xad, 0x99, 0xe1, + 0x51, 0x1a, 0x26, 0x70, 0xd3, 0xfb, 0x99, 0x69, 0xf7, 0xb3, 0xab, 0x8b, 0xe9, 0xfe, 0x54, 0xa6, + 0xbd, 0x06, 0x8a, 0xf4, 0x54, 0xe5, 0x59, 0xbc, 0xc1, 0x4f, 0xc2, 0x00, 0xeb, 0x6e, 0xdd, 0x17, + 0xf1, 0x9f, 0xe9, 0xb1, 0x08, 0xd3, 0xfc, 0x27, 0xc6, 0x7f, 0xa1, 0xcf, 0x3e, 0x07, 0xaa, 0xc0, + 0x84, 0x61, 0xe3, 0xb6, 0x43, 0x12, 0x63, 0x47, 0x4c, 0xd9, 0x79, 0x6f, 0xca, 0x46, 0x9a, 0x25, + 0xce, 0xc6, 0x35, 0xb9, 0x05, 0x31, 0xcd, 0xdc, 0xee, 0x5b, 0x63, 0x01, 0xc6, 0x89, 0x45, 0x1a, + 0x26, 0x95, 0x63, 0x5a, 0x65, 0x5f, 0x50, 0x12, 0xa2, 0x35, 0xd3, 0xad, 0xb6, 0x2c, 0x26, 0x7a, + 0x98, 0x9e, 0x05, 0x43, 0x17, 0xe7, 0x3c, 0xb6, 0xef, 0xfb, 0x7e, 0x49, 0xfd, 0x26, 0xc0, 0xa4, + 0xaf, 0xb4, 0x72, 0x94, 0xd2, 0xa7, 0x07, 0x95, 0xfe, 0xef, 0x49, 0xfb, 0xd3, 0x04, 0x4c, 0x1d, + 0xe8, 0x9a, 0x3d, 0x4a, 0x82, 0x53, 0x87, 0x86, 0x2d, 0x4c, 0x67, 0x6c, 0x9a, 0xaf, 0x8c, 0xa1, + 0xfe, 0x03, 0x6b, 0x2b, 0x3c, 0xf2, 0xda, 0x2a, 0xc0, 0x84, 0x4b, 0x0c, 0xd2, 0x76, 0xb9, 0x65, + 0xc4, 0xa0, 0x65, 0xfc, 0x1a, 0xca, 0x34, 0x23, 0x2b, 0xf6, 0xd7, 0xd6, 0x41, 0xd1, 0x0c, 0x9c, + 0x52, 0x39, 0x0b, 0xda, 0x04, 0x74, 0xd7, 0x72, 0x8c, 0x86, 0x4e, 0x8c, 0x46, 0x63, 0x47, 0x6f, + 0x99, 0x6e, 0xbb, 0x41, 0x12, 0x11, 0x5a, 0xd7, 0x52, 0x90, 0x5b, 0xf3, 0xce, 0x55, 0x7a, 0x9c, + 0x3d, 0xc5, 0x77, 0xe2, 0x49, 0x46, 0x7e, 0x98, 0x20, 0xa5, 0xc6, 0x69, 0x30, 0x00, 0x42, 0x6f, + 0x43, 0xd4, 0xa5, 0xfb, 0x5b, 0xf7, 0x1e, 0x0c, 0x89, 0x71, 0x7a, 0x85, 0x78, 0xa8, 0x75, 0xcd, + 0x7f, 0x6a, 0x64, 0x25, 0x7e, 0x0b, 0x9f, 0xa7, 0x00, 0x38, 0xf5, 0xe0, 0xa9, 0x2c, 0xa8, 0xc0, + 0x22, 0x1e, 0x00, 0x59, 0x10, 0xe7, 0xf3, 0xa0, 0x9b, 0x4e, 0x8d, 0xdd, 0x30, 0x71, 0xec, 0x0d, + 0xaf, 0xf1, 0x1b, 0x96, 0xd8, 0x0d, 0xc3, 0x0c, 0xec, 0x9a, 0x59, 0x1e, 0x56, 0x9c, 0x1a, 0xbd, + 0xea, 0x1e, 0xcc, 0x10, 0x4c, 0x02, 0x4f, 0x8d, 0xc9, 0x23, 0x86, 0xee, 0x1a, 0x67, 0x5e, 0x60, + 0xcc, 0x03, 0x80, 0xd1, 0x9e, 0x19, 0x31, 0x8a, 0xf5, 0x2d, 0xd8, 0x80, 0x13, 0x5b, 0x98, 0x58, + 0x4e, 0xdd, 0xfb, 0x21, 0x5b, 0x5c, 0xca, 0xa9, 0x63, 0x1b, 0x3d, 0xcd, 0xcb, 0x49, 0xb0, 0x72, + 0x0e, 0x51, 0xb0, 0x4e, 0xe7, 0x58, 0xbc, 0xec, 0x85, 0x69, 0xab, 0x77, 0x81, 0x87, 0xfa, 0xa2, + 0x4e, 0x1f, 0x7b, 0x57, 0x6a, 0xf0, 0x81, 0x39, 0x44, 0xc0, 0x6e, 0x9a, 0x61, 0x51, 0x2e, 0x29, + 0x37, 0xda, 0x6e, 0x18, 0xa2, 0xc1, 0x81, 0xb9, 0x0c, 0x63, 0x3b, 0xa6, 0xcb, 0x36, 0x58, 0x36, + 0xed, 0xb1, 0xfe, 0xd0, 0x93, 0x5f, 0x7f, 0x09, 0xe1, 0xf2, 0x0e, 0x51, 0x3d, 0x28, 0xba, 0x06, + 0x93, 0xc6, 0x86, 0x4b, 0x0c, 0x8b, 0xef, 0xba, 0x91, 0x59, 0x7c, 0x38, 0x7a, 0x0b, 0xc2, 0x0e, + 0xa6, 0x96, 0x1b, 0x9d, 0x24, 0xec, 0x60, 0x54, 0x87, 0x98, 0x83, 0xf5, 0xf7, 0x2d, 0xb2, 0xa9, + 0x6f, 0x99, 0x04, 0x53, 0x83, 0x4d, 0x67, 0x95, 0xd1, 0x98, 0x5e, 0xf4, 0xe4, 0x79, 0x26, 0x6a, + 0x90, 0x2b, 0xa5, 0x82, 0x83, 0x6f, 0x59, 0x64, 0xb3, 0x62, 0x12, 0xcc, 0xa5, 0x7c, 0x24, 0x40, + 0x84, 0xbe, 0x00, 0xfc, 0x4d, 0x2b, 0xfb, 0x5f, 0x7e, 0xe2, 0x7f, 0x13, 0x86, 0x19, 0xee, 0x80, + 0x92, 0xd1, 0x32, 0x6c, 0x17, 0xdd, 0x17, 0x20, 0x6a, 0x5b, 0xce, 0x81, 0x07, 0x85, 0x23, 0x3c, + 0xa8, 0x7b, 0xea, 0xee, 0xf7, 0xe4, 0xff, 0x05, 0x12, 0xcf, 0x62, 0xdb, 0x22, 0xa6, 0xdd, 0x24, + 0x3b, 0xfd, 0xae, 0x03, 0xc7, 0xa3, 0x59, 0x13, 0x6c, 0xcb, 0xf1, 0x8d, 0x79, 0x5f, 0x00, 0x64, + 0x1b, 0xdb, 0x3e, 0x91, 0xde, 0x34, 0x5b, 0x16, 0xae, 0xf1, 0x05, 0x7f, 0xf2, 0x90, 0x5d, 0x72, + 0xfc, 0xfd, 0x96, 0x8d, 0xc0, 0x7e, 0x4f, 0x7e, 0xe5, 0x30, 0x78, 0xa0, 0x56, 0xbe, 0x6a, 0x0f, + 0x67, 0xa5, 0x3e, 0xf5, 0x0c, 0x15, 0xb7, 0x8d, 0x6d, 0x5f, 0x21, 0x16, 0xfe, 0x58, 0x80, 0x58, + 0x85, 0xba, 0x8c, 0x4b, 0x76, 0x0f, 0xb8, 0xeb, 0xfc, 0xda, 0x84, 0xe3, 0x6a, 0xbb, 0xc4, 0x6b, + 0x5b, 0x1a, 0xc0, 0x0d, 0x94, 0xb5, 0x30, 0x60, 0xf2, 0x60, 0x45, 0x31, 0x16, 0xe3, 0xd5, 0x3c, + 0xf4, 0xbd, 0xcd, 0x8b, 0xb9, 0x03, 0x13, 0xef, 0xb5, 0x71, 0xab, 0x6d, 0xd3, 0x2a, 0x62, 0xd9, + 0xec, 0x08, 0x4e, 0xc8, 0x99, 0xd5, 0xfd, 0x9e, 0x1c, 0x67, 0xf8, 0x7e, 0x35, 0x2a, 0x67, 0x44, + 0x55, 0x98, 0x26, 0x9b, 0x2d, 0xd3, 0xdd, 0xc4, 0x8d, 0x1a, 0x1f, 0x58, 0x65, 0x64, 0xfa, 0xf9, + 0x03, 0x8a, 0xc0, 0x0d, 0x7d, 0x5e, 0xa4, 0x41, 0x84, 0x1a, 0x99, 0xbd, 0xb6, 0x5f, 0x1e, 0x99, + 0x7f, 0xd6, 0x43, 0x07, 0xa8, 0x29, 0xdb, 0x99, 0x5f, 0x04, 0x80, 0xbe, 0x0b, 0xd0, 0x59, 0x58, + 0xaa, 0x14, 0x35, 0x45, 0x2f, 0x96, 0xb4, 0x7c, 0xb1, 0xa0, 0xdf, 0x2c, 0x94, 0x4b, 0xca, 0x5a, + 0xfe, 0x4a, 0x5e, 0xc9, 0xc5, 0x43, 0xe2, 0x5c, 0xa7, 0x9b, 0x8c, 0xb2, 0x44, 0xc5, 0xa3, 0x40, + 0x29, 0x98, 0x0b, 0x66, 0xdf, 0x56, 0xca, 0x71, 0x41, 0x9c, 0xe9, 0x74, 0x93, 0xd3, 0x2c, 0xeb, + 0xb6, 0xe9, 0xa2, 0x33, 0x30, 0x1f, 0xcc, 0xc9, 0x64, 0xcb, 0x5a, 0x26, 0x5f, 0x88, 0x87, 0xc5, + 0x13, 0x9d, 0x6e, 0x72, 0x86, 0xe5, 0x65, 0xf8, 0xce, 0x4b, 0xc2, 0x6c, 0x30, 0xb7, 0x50, 0x8c, + 0x8f, 0x89, 0xb1, 0x4e, 0x37, 0x39, 0xc5, 0xd2, 0x0a, 0x18, 0xad, 0x42, 0x62, 0x30, 0x43, 0xbf, + 0x95, 0xd7, 0xae, 0xe9, 0x15, 0x45, 0x2b, 0xc6, 0x23, 0xe2, 0x42, 0xa7, 0x9b, 0x8c, 0xfb, 0xb9, + 0xfe, 0x82, 0x12, 0x63, 0x1f, 0x7d, 0x2e, 0x85, 0xbe, 0x78, 0x28, 0x85, 0xbe, 0x7e, 0x28, 0x85, + 0xce, 0x3c, 0x0a, 0xc3, 0xec, 0xe0, 0x5b, 0x0b, 0x4a, 0xc3, 0xff, 0x4b, 0x6a, 0xb1, 0x54, 0x2c, + 0x67, 0x6e, 0xe8, 0x65, 0x2d, 0xa3, 0xdd, 0x2c, 0x0f, 0x35, 0x4e, 0x5b, 0x62, 0xc9, 0x05, 0xcb, + 0xfb, 0x5f, 0xa0, 0x34, 0x9c, 0x9f, 0x53, 0x4a, 0xc5, 0x72, 0x5e, 0xd3, 0x4b, 0x8a, 0x9a, 0x2f, + 0xe6, 0xe2, 0x82, 0xb8, 0xd4, 0xe9, 0x26, 0xe7, 0x19, 0x64, 0xc0, 0x25, 0xe8, 0x4d, 0x78, 0x75, + 0x18, 0x5c, 0x29, 0x6a, 0xf9, 0xc2, 0x55, 0x1f, 0x1b, 0x16, 0x17, 0x3b, 0xdd, 0x24, 0x62, 0xd8, + 0x4a, 0x60, 0xa4, 0xd1, 0x59, 0x58, 0x1c, 0x86, 0x96, 0x32, 0xe5, 0xb2, 0x92, 0x8b, 0x8f, 0x89, + 0xf1, 0x4e, 0x37, 0x19, 0x63, 0x98, 0x92, 0xe1, 0xba, 0x66, 0x0d, 0x9d, 0x87, 0xc4, 0x70, 0xb6, + 0xaa, 0x5c, 0x57, 0xd6, 0x34, 0x25, 0x17, 0x8f, 0x88, 0xa8, 0xd3, 0x4d, 0xce, 0xb2, 0x7c, 0xd5, + 0x7c, 0xc7, 0xac, 0x12, 0xf3, 0x48, 0xfe, 0x2b, 0x99, 0xfc, 0x0d, 0x25, 0x17, 0x1f, 0x0f, 0xf2, + 0x5f, 0x31, 0xac, 0x86, 0x59, 0x13, 0x23, 0x9e, 0xac, 0xd9, 0xc2, 0xee, 0x33, 0x29, 0xf4, 0xe4, + 0x99, 0x14, 0xfa, 0x60, 0x4f, 0x0a, 0xed, 0xee, 0x49, 0xc2, 0xe3, 0x3d, 0x49, 0xf8, 0x71, 0x4f, + 0x12, 0x1e, 0x3c, 0x97, 0x42, 0x8f, 0x9f, 0x4b, 0xa1, 0x27, 0xcf, 0xa5, 0xd0, 0x9d, 0x3f, 0xde, + 0x70, 0xdb, 0xf4, 0x2f, 0x05, 0x74, 0x56, 0x37, 0x26, 0xe8, 0x52, 0xb8, 0xf0, 0x7b, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x2e, 0xca, 0x9a, 0x96, 0x44, 0x10, 0x00, 0x00, } func (this *MsgSubmitProposal) Equal(that interface{}) bool { diff --git a/x/gov/types/proposal.go b/x/gov/types/proposal.go index f550e881a553..729c5986a832 100644 --- a/x/gov/types/proposal.go +++ b/x/gov/types/proposal.go @@ -1,7 +1,6 @@ package types import ( - "encoding/json" "fmt" "strings" "time" @@ -185,51 +184,6 @@ func (status *ProposalStatus) Unmarshal(data []byte) error { return nil } -// MarshalJSON Marshals to JSON using string representation of the status -func (status ProposalStatus) MarshalJSON() ([]byte, error) { - return json.Marshal(status.String()) -} - -// UnmarshalJSON Unmarshals from JSON assuming Bech32 encoding -func (status *ProposalStatus) UnmarshalJSON(data []byte) error { - var s string - err := json.Unmarshal(data, &s) - if err != nil { - return err - } - - bz2, err := ProposalStatusFromString(s) - if err != nil { - return err - } - - *status = bz2 - return nil -} - -// String implements the Stringer interface. -func (status ProposalStatus) String() string { - switch status { - case StatusDepositPeriod: - return "DepositPeriod" - - case StatusVotingPeriod: - return "VotingPeriod" - - case StatusPassed: - return "Passed" - - case StatusRejected: - return "Rejected" - - case StatusFailed: - return "Failed" - - default: - return "" - } -} - // Format implements the fmt.Formatter interface. // nolint: errcheck func (status ProposalStatus) Format(s fmt.State, verb rune) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index cb554a4b074f..578f164dd543 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1569,613 +1569,614 @@ 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{ - // 9685 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x7b, 0x70, 0x24, 0xc7, - 0x79, 0x1f, 0xf6, 0x81, 0xc5, 0xee, 0xb7, 0x8b, 0xc5, 0xa2, 0x81, 0xbb, 0xdb, 0x5b, 0x92, 0xb7, - 0xc7, 0x39, 0x3e, 0xee, 0xf8, 0xc0, 0x51, 0x27, 0x3e, 0xf7, 0x28, 0x52, 0x58, 0x00, 0x77, 0x07, - 0x12, 0xb8, 0x03, 0x07, 0xc0, 0x91, 0xa2, 0x6c, 0x8f, 0x07, 0xb3, 0x8d, 0xc5, 0xf0, 0x76, 0x67, - 0x96, 0x33, 0xb3, 0x77, 0x00, 0x4b, 0xa9, 0x62, 0x4a, 0xb2, 0x2d, 0x39, 0xb2, 0xa5, 0x28, 0xb6, - 0x43, 0xcb, 0x92, 0x4c, 0x29, 0x95, 0xc8, 0x51, 0x12, 0x3f, 0x12, 0x45, 0x0f, 0x3b, 0x7f, 0xa8, - 0x2a, 0x0f, 0x2b, 0x55, 0xae, 0x94, 0x94, 0x38, 0x29, 0x57, 0x2a, 0x05, 0x5b, 0xa4, 0xaa, 0xec, - 0x28, 0x4c, 0xa2, 0x5c, 0x68, 0x97, 0x4b, 0xfa, 0x23, 0xa9, 0x7e, 0xcd, 0x6b, 0x67, 0x77, 0x06, - 0xc7, 0x23, 0x45, 0x97, 0xf4, 0x17, 0x76, 0x7a, 0xbe, 0xef, 0xd7, 0xdd, 0x5f, 0x7f, 0xfd, 0x7d, - 0x5f, 0x7f, 0xdd, 0x3d, 0x80, 0x2f, 0xa5, 0xe1, 0x36, 0xcd, 0xb4, 0xbb, 0xa6, 0x7d, 0xfa, 0xc5, - 0x3e, 0xb6, 0xf6, 0x4e, 0xf7, 0xd4, 0xb6, 0x6e, 0xa8, 0x8e, 0x6e, 0x1a, 0x73, 0x3d, 0xcb, 0x74, - 0x4c, 0x54, 0x62, 0xaf, 0xe7, 0xe8, 0x6b, 0xc9, 0x80, 0xe2, 0x9a, 0xda, 0xc6, 0x32, 0x7e, 0xb1, - 0x8f, 0x6d, 0x07, 0x55, 0x20, 0x73, 0x05, 0xef, 0x55, 0x53, 0xc7, 0x53, 0x27, 0x4b, 0x32, 0xf9, - 0x89, 0x0e, 0x43, 0xce, 0xdc, 0xde, 0xb6, 0xb1, 0x53, 0x4d, 0x1f, 0x4f, 0x9d, 0xcc, 0xca, 0xfc, - 0x09, 0xcd, 0xc2, 0x78, 0x47, 0xef, 0xea, 0x4e, 0x35, 0x43, 0x8b, 0xd9, 0x03, 0xaa, 0x43, 0x51, - 0x33, 0xfb, 0x86, 0xa3, 0x38, 0xa6, 0xa3, 0x76, 0xaa, 0xd9, 0xe3, 0xa9, 0x93, 0x79, 0x19, 0x68, - 0xd1, 0x06, 0x29, 0x91, 0x9e, 0x84, 0x12, 0xab, 0xcf, 0xee, 0x99, 0x86, 0x8d, 0xd1, 0x51, 0xc8, - 0x1b, 0x78, 0xd7, 0x51, 0xbc, 0x5a, 0x27, 0xc8, 0xf3, 0xd3, 0x78, 0x8f, 0xd4, 0xc0, 0x50, 0x58, - 0xc5, 0xec, 0xa1, 0xd9, 0xfc, 0xe6, 0x6b, 0xc7, 0x52, 0xdf, 0x7a, 0xed, 0x58, 0xea, 0xcf, 0x5e, - 0x3b, 0x96, 0xfa, 0xe4, 0xeb, 0xc7, 0xc6, 0xbe, 0xf5, 0xfa, 0xb1, 0xb1, 0x3f, 0x79, 0xfd, 0xd8, - 0xd8, 0xf3, 0x27, 0xdb, 0xba, 0xb3, 0xd3, 0xdf, 0x9a, 0xd3, 0xcc, 0xee, 0x69, 0x2e, 0x02, 0xf6, - 0xe7, 0x7e, 0xbb, 0x75, 0xe5, 0xb4, 0xb3, 0xd7, 0xc3, 0x5c, 0x26, 0x5b, 0x39, 0x2a, 0x89, 0xf7, - 0xc2, 0x6f, 0x9c, 0x85, 0xe3, 0x6d, 0xd3, 0x6c, 0x77, 0xf0, 0x69, 0x5a, 0xb2, 0xd5, 0xdf, 0x3e, - 0xdd, 0xc2, 0xb6, 0x66, 0xe9, 0x3d, 0xc7, 0xb4, 0xb8, 0xbc, 0xa6, 0x18, 0xc5, 0x9c, 0xa0, 0x90, - 0x56, 0x61, 0xfa, 0x9c, 0xde, 0xc1, 0x8b, 0x2e, 0xe1, 0x3a, 0x76, 0xd0, 0xa3, 0x90, 0xdd, 0xd6, - 0x3b, 0xb8, 0x9a, 0x3a, 0x9e, 0x39, 0x59, 0x3c, 0x73, 0xc7, 0x5c, 0x88, 0x69, 0x2e, 0xc8, 0xb1, - 0x46, 0x8a, 0x65, 0xca, 0x21, 0x7d, 0x37, 0x0b, 0x33, 0x11, 0x6f, 0x11, 0x82, 0xac, 0xa1, 0x76, - 0x31, 0x95, 0x4a, 0x41, 0xa6, 0xbf, 0x51, 0x15, 0x26, 0x7a, 0xaa, 0x76, 0x45, 0x6d, 0x63, 0x2a, - 0x94, 0x82, 0x2c, 0x1e, 0xd1, 0x31, 0x80, 0x16, 0xee, 0x61, 0xa3, 0x85, 0x0d, 0x6d, 0xaf, 0x9a, - 0x39, 0x9e, 0x39, 0x59, 0x90, 0x7d, 0x25, 0xe8, 0x5e, 0x98, 0xee, 0xf5, 0xb7, 0x3a, 0xba, 0xa6, - 0xf8, 0xc8, 0xe0, 0x78, 0xe6, 0xe4, 0xb8, 0x5c, 0x61, 0x2f, 0x16, 0x3d, 0xe2, 0xbb, 0x61, 0xea, - 0x1a, 0x56, 0xaf, 0xf8, 0x49, 0x8b, 0x94, 0xb4, 0x4c, 0x8a, 0x7d, 0x84, 0x0b, 0x50, 0xea, 0x62, - 0xdb, 0x56, 0xdb, 0x58, 0x21, 0xf2, 0xad, 0x66, 0x69, 0xef, 0x8f, 0x0f, 0xf4, 0x3e, 0xdc, 0xf3, - 0x22, 0xe7, 0xda, 0xd8, 0xeb, 0x61, 0x34, 0x0f, 0x05, 0x6c, 0xf4, 0xbb, 0x0c, 0x61, 0x7c, 0x88, - 0xfc, 0x96, 0x8c, 0x7e, 0x37, 0x8c, 0x92, 0x27, 0x6c, 0x1c, 0x62, 0xc2, 0xc6, 0xd6, 0x55, 0x5d, - 0xc3, 0xd5, 0x1c, 0x05, 0xb8, 0x7b, 0x00, 0x60, 0x9d, 0xbd, 0x0f, 0x63, 0x08, 0x3e, 0xb4, 0x00, - 0x05, 0xbc, 0xeb, 0x60, 0xc3, 0xd6, 0x4d, 0xa3, 0x3a, 0x41, 0x41, 0xee, 0x8c, 0x18, 0x45, 0xdc, - 0x69, 0x85, 0x21, 0x3c, 0x3e, 0xf4, 0x30, 0x4c, 0x98, 0x3d, 0x32, 0xd7, 0xec, 0x6a, 0xfe, 0x78, - 0xea, 0x64, 0xf1, 0xcc, 0xad, 0x91, 0x8a, 0x70, 0x89, 0xd1, 0xc8, 0x82, 0x18, 0x2d, 0x43, 0xc5, - 0x36, 0xfb, 0x96, 0x86, 0x15, 0xcd, 0x6c, 0x61, 0x45, 0x37, 0xb6, 0xcd, 0x6a, 0x81, 0x02, 0xd4, - 0x07, 0x3b, 0x42, 0x09, 0x17, 0xcc, 0x16, 0x5e, 0x36, 0xb6, 0x4d, 0xb9, 0x6c, 0x07, 0x9e, 0xc9, - 0x7c, 0xb5, 0xf7, 0x0c, 0x47, 0xdd, 0xad, 0x96, 0xa8, 0x86, 0xf0, 0x27, 0xe9, 0xeb, 0x39, 0x98, - 0x4a, 0xa2, 0x62, 0x67, 0x61, 0x7c, 0x9b, 0xf4, 0xb2, 0x9a, 0x3e, 0x88, 0x0c, 0x18, 0x4f, 0x50, - 0x88, 0xb9, 0x1b, 0x14, 0xe2, 0x3c, 0x14, 0x0d, 0x6c, 0x3b, 0xb8, 0xc5, 0x34, 0x22, 0x93, 0x50, - 0xa7, 0x80, 0x31, 0x0d, 0xaa, 0x54, 0xf6, 0x86, 0x54, 0xea, 0x39, 0x98, 0x72, 0x9b, 0xa4, 0x58, - 0xaa, 0xd1, 0x16, 0xba, 0x79, 0x3a, 0xae, 0x25, 0x73, 0x4b, 0x82, 0x4f, 0x26, 0x6c, 0x72, 0x19, - 0x07, 0x9e, 0xd1, 0x22, 0x80, 0x69, 0x60, 0x73, 0x5b, 0x69, 0x61, 0xad, 0x53, 0xcd, 0x0f, 0x91, - 0xd2, 0x25, 0x42, 0x32, 0x20, 0x25, 0x93, 0x95, 0x6a, 0x1d, 0xf4, 0x98, 0xa7, 0x6a, 0x13, 0x43, - 0x34, 0x65, 0x95, 0x4d, 0xb2, 0x01, 0x6d, 0xdb, 0x84, 0xb2, 0x85, 0x89, 0xde, 0xe3, 0x16, 0xef, - 0x59, 0x81, 0x36, 0x62, 0x2e, 0xb6, 0x67, 0x32, 0x67, 0x63, 0x1d, 0x9b, 0xb4, 0xfc, 0x8f, 0xe8, - 0x04, 0xb8, 0x05, 0x0a, 0x55, 0x2b, 0xa0, 0x56, 0xa8, 0x24, 0x0a, 0x2f, 0xaa, 0x5d, 0x5c, 0x7b, - 0x09, 0xca, 0x41, 0xf1, 0x10, 0x33, 0x6f, 0x3b, 0xaa, 0xe5, 0x50, 0x2d, 0x1c, 0x97, 0xd9, 0x03, - 0x71, 0x44, 0xd8, 0x68, 0x51, 0x2b, 0x37, 0x2e, 0x93, 0x9f, 0xe8, 0xfd, 0x5e, 0x87, 0x33, 0xb4, - 0xc3, 0x77, 0x0d, 0x8e, 0x68, 0x00, 0x39, 0xdc, 0xef, 0xda, 0x23, 0x30, 0x19, 0xe8, 0x40, 0xd2, - 0xaa, 0xa5, 0x0f, 0xc1, 0xa1, 0x48, 0x68, 0xf4, 0x1c, 0xcc, 0xf6, 0x0d, 0xdd, 0x70, 0xb0, 0xd5, - 0xb3, 0x30, 0xd1, 0x58, 0x56, 0x55, 0xf5, 0xcf, 0x27, 0x86, 0xe8, 0xdc, 0xa6, 0x9f, 0x9a, 0xa1, - 0xc8, 0x33, 0xfd, 0xc1, 0xc2, 0x7b, 0x0a, 0xf9, 0xbf, 0x98, 0xa8, 0xbc, 0xfc, 0xf2, 0xcb, 0x2f, - 0xa7, 0xa5, 0x57, 0x72, 0x30, 0x1b, 0x35, 0x67, 0x22, 0xa7, 0xef, 0x61, 0xc8, 0x19, 0xfd, 0xee, - 0x16, 0xb6, 0xa8, 0x90, 0xc6, 0x65, 0xfe, 0x84, 0xe6, 0x61, 0xbc, 0xa3, 0x6e, 0x61, 0xe6, 0x92, - 0xcb, 0x67, 0xee, 0x4d, 0x34, 0x2b, 0xe7, 0x56, 0x08, 0x8b, 0xcc, 0x38, 0xd1, 0x13, 0x90, 0xe5, - 0x26, 0x9a, 0x20, 0xdc, 0x93, 0x0c, 0x81, 0xcc, 0x25, 0x99, 0xf2, 0xa1, 0x5b, 0xa0, 0x40, 0xfe, - 0x32, 0xdd, 0xc8, 0xd1, 0x36, 0xe7, 0x49, 0x01, 0xd1, 0x0b, 0x54, 0x83, 0x3c, 0x9d, 0x26, 0x2d, - 0x2c, 0x5c, 0x9b, 0xfb, 0x4c, 0x14, 0xab, 0x85, 0xb7, 0xd5, 0x7e, 0xc7, 0x51, 0xae, 0xaa, 0x9d, - 0x3e, 0xa6, 0x0a, 0x5f, 0x90, 0x4b, 0xbc, 0xf0, 0x32, 0x29, 0x23, 0x91, 0x07, 0x9b, 0x55, 0xba, - 0xd1, 0xc2, 0xbb, 0xd4, 0x7a, 0x8e, 0xcb, 0x6c, 0xa2, 0x2d, 0x93, 0x12, 0x52, 0xfd, 0x0b, 0xb6, - 0x69, 0x08, 0xd5, 0xa4, 0x55, 0x90, 0x02, 0x5a, 0xfd, 0x23, 0x61, 0xc3, 0x7d, 0x5b, 0x74, 0xf7, - 0xc2, 0x3a, 0x25, 0x7d, 0x25, 0x0d, 0x59, 0x6a, 0x2f, 0xa6, 0xa0, 0xb8, 0xf1, 0x81, 0xb5, 0x25, - 0x65, 0xf1, 0xd2, 0x66, 0x73, 0x65, 0xa9, 0x92, 0x42, 0x65, 0x00, 0x5a, 0x70, 0x6e, 0xe5, 0xd2, - 0xfc, 0x46, 0x25, 0xed, 0x3e, 0x2f, 0x5f, 0xdc, 0x78, 0xf8, 0xc1, 0x4a, 0xc6, 0x65, 0xd8, 0x64, - 0x05, 0x59, 0x3f, 0xc1, 0x7b, 0xcf, 0x54, 0xc6, 0x51, 0x05, 0x4a, 0x0c, 0x60, 0xf9, 0xb9, 0xa5, - 0xc5, 0x87, 0x1f, 0xac, 0xe4, 0x82, 0x25, 0xef, 0x3d, 0x53, 0x99, 0x40, 0x93, 0x50, 0xa0, 0x25, - 0xcd, 0x4b, 0x97, 0x56, 0x2a, 0x79, 0x17, 0x73, 0x7d, 0x43, 0x5e, 0xbe, 0x78, 0xbe, 0x52, 0x70, - 0x31, 0xcf, 0xcb, 0x97, 0x36, 0xd7, 0x2a, 0xe0, 0x22, 0xac, 0x2e, 0xad, 0xaf, 0xcf, 0x9f, 0x5f, - 0xaa, 0x14, 0x5d, 0x8a, 0xe6, 0x07, 0x36, 0x96, 0xd6, 0x2b, 0xa5, 0x40, 0xb3, 0xde, 0x7b, 0xa6, - 0x32, 0xe9, 0x56, 0xb1, 0x74, 0x71, 0x73, 0xb5, 0x52, 0x46, 0xd3, 0x30, 0xc9, 0xaa, 0x10, 0x8d, - 0x98, 0x0a, 0x15, 0x3d, 0xfc, 0x60, 0xa5, 0xe2, 0x35, 0x84, 0xa1, 0x4c, 0x07, 0x0a, 0x1e, 0x7e, - 0xb0, 0x82, 0xa4, 0x05, 0x18, 0xa7, 0xda, 0x85, 0x10, 0x94, 0x57, 0xe6, 0x9b, 0x4b, 0x2b, 0xca, - 0xa5, 0xb5, 0x8d, 0xe5, 0x4b, 0x17, 0xe7, 0x57, 0x2a, 0x29, 0xaf, 0x4c, 0x5e, 0x7a, 0x66, 0x73, - 0x59, 0x5e, 0x5a, 0xac, 0xa4, 0xfd, 0x65, 0x6b, 0x4b, 0xf3, 0x1b, 0x4b, 0x8b, 0x95, 0x8c, 0xa4, - 0xc1, 0x6c, 0x94, 0x9d, 0x8c, 0x9c, 0x19, 0xbe, 0x21, 0x4e, 0x0f, 0x19, 0x62, 0x8a, 0x35, 0x30, - 0xc4, 0xaf, 0xa7, 0x61, 0x26, 0xc2, 0x57, 0x44, 0x56, 0xf2, 0x24, 0x8c, 0x33, 0x15, 0x65, 0xde, - 0xf3, 0x54, 0xa4, 0xd3, 0xa1, 0x0a, 0x3b, 0xe0, 0x41, 0x29, 0x9f, 0x3f, 0x82, 0xc8, 0x0c, 0x89, - 0x20, 0x08, 0xc4, 0x80, 0x4d, 0xff, 0xe9, 0x01, 0x9b, 0xce, 0xdc, 0xde, 0xc3, 0x49, 0xdc, 0x1e, - 0x2d, 0x3b, 0x98, 0x6d, 0x1f, 0x8f, 0xb0, 0xed, 0x67, 0x61, 0x7a, 0x00, 0x28, 0xb1, 0x8d, 0xfd, - 0x70, 0x0a, 0xaa, 0xc3, 0x84, 0x13, 0x63, 0xe9, 0xd2, 0x01, 0x4b, 0x77, 0x36, 0x2c, 0xc1, 0xdb, - 0x87, 0x0f, 0xc2, 0xc0, 0x58, 0x7f, 0x31, 0x05, 0x87, 0xa3, 0x23, 0xc5, 0xc8, 0x36, 0x3c, 0x01, - 0xb9, 0x2e, 0x76, 0x76, 0x4c, 0x11, 0x2d, 0xdd, 0x15, 0xe1, 0x83, 0xc9, 0xeb, 0xf0, 0x60, 0x73, - 0x2e, 0xbf, 0x13, 0xcf, 0x0c, 0x0b, 0xf7, 0x58, 0x6b, 0x06, 0x5a, 0xfa, 0xb1, 0x34, 0x1c, 0x8a, - 0x04, 0x8f, 0x6c, 0xe8, 0x6d, 0x00, 0xba, 0xd1, 0xeb, 0x3b, 0x2c, 0x22, 0x62, 0x06, 0xb6, 0x40, - 0x4b, 0xa8, 0xf1, 0x22, 0xc6, 0xb3, 0xef, 0xb8, 0xef, 0x33, 0xf4, 0x3d, 0xb0, 0x22, 0x4a, 0xf0, - 0xa8, 0xd7, 0xd0, 0x2c, 0x6d, 0xe8, 0xb1, 0x21, 0x3d, 0x1d, 0x50, 0xcc, 0x07, 0xa0, 0xa2, 0x75, - 0x74, 0x6c, 0x38, 0x8a, 0xed, 0x58, 0x58, 0xed, 0xea, 0x46, 0x9b, 0x7a, 0x90, 0x7c, 0x63, 0x7c, - 0x5b, 0xed, 0xd8, 0x58, 0x9e, 0x62, 0xaf, 0xd7, 0xc5, 0x5b, 0xc2, 0x41, 0x15, 0xc8, 0xf2, 0x71, - 0xe4, 0x02, 0x1c, 0xec, 0xb5, 0xcb, 0x21, 0x7d, 0xaa, 0x00, 0x45, 0x5f, 0x5c, 0x8d, 0x6e, 0x87, - 0xd2, 0x0b, 0xea, 0x55, 0x55, 0x11, 0x6b, 0x25, 0x26, 0x89, 0x22, 0x29, 0x5b, 0xe3, 0xeb, 0xa5, - 0x07, 0x60, 0x96, 0x92, 0x98, 0x7d, 0x07, 0x5b, 0x8a, 0xd6, 0x51, 0x6d, 0x9b, 0x0a, 0x2d, 0x4f, - 0x49, 0x11, 0x79, 0x77, 0x89, 0xbc, 0x5a, 0x10, 0x6f, 0xd0, 0x43, 0x30, 0x43, 0x39, 0xba, 0xfd, - 0x8e, 0xa3, 0xf7, 0x3a, 0x58, 0x21, 0xab, 0x37, 0x9b, 0x7a, 0x12, 0xb7, 0x65, 0xd3, 0x84, 0x62, - 0x95, 0x13, 0x90, 0x16, 0xd9, 0x68, 0x11, 0x6e, 0xa3, 0x6c, 0x6d, 0x6c, 0x60, 0x4b, 0x75, 0xb0, - 0x82, 0x5f, 0xec, 0xab, 0x1d, 0x5b, 0x51, 0x8d, 0x96, 0xb2, 0xa3, 0xda, 0x3b, 0xd5, 0x59, 0x02, - 0xd0, 0x4c, 0x57, 0x53, 0xf2, 0x51, 0x42, 0x78, 0x9e, 0xd3, 0x2d, 0x51, 0xb2, 0x79, 0xa3, 0x75, - 0x41, 0xb5, 0x77, 0x50, 0x03, 0x0e, 0x53, 0x14, 0xdb, 0xb1, 0x74, 0xa3, 0xad, 0x68, 0x3b, 0x58, - 0xbb, 0xa2, 0xf4, 0x9d, 0xed, 0x47, 0xab, 0xb7, 0xf8, 0xeb, 0xa7, 0x2d, 0x5c, 0xa7, 0x34, 0x0b, - 0x84, 0x64, 0xd3, 0xd9, 0x7e, 0x14, 0xad, 0x43, 0x89, 0x0c, 0x46, 0x57, 0x7f, 0x09, 0x2b, 0xdb, - 0xa6, 0x45, 0x5d, 0x63, 0x39, 0xc2, 0x34, 0xf9, 0x24, 0x38, 0x77, 0x89, 0x33, 0xac, 0x9a, 0x2d, - 0xdc, 0x18, 0x5f, 0x5f, 0x5b, 0x5a, 0x5a, 0x94, 0x8b, 0x02, 0xe5, 0x9c, 0x69, 0x11, 0x85, 0x6a, - 0x9b, 0xae, 0x80, 0x8b, 0x4c, 0xa1, 0xda, 0xa6, 0x10, 0xef, 0x43, 0x30, 0xa3, 0x69, 0xac, 0xcf, - 0xba, 0xa6, 0xf0, 0x35, 0x96, 0x5d, 0xad, 0x04, 0x84, 0xa5, 0x69, 0xe7, 0x19, 0x01, 0xd7, 0x71, - 0x1b, 0x3d, 0x06, 0x87, 0x3c, 0x61, 0xf9, 0x19, 0xa7, 0x07, 0x7a, 0x19, 0x66, 0x7d, 0x08, 0x66, - 0x7a, 0x7b, 0x83, 0x8c, 0x28, 0x50, 0x63, 0x6f, 0x2f, 0xcc, 0xf6, 0x08, 0xcc, 0xf6, 0x76, 0x7a, - 0x83, 0x7c, 0xf7, 0xf8, 0xf9, 0x50, 0x6f, 0xa7, 0x17, 0x66, 0xbc, 0x93, 0x2e, 0xb8, 0x2d, 0xac, - 0xa9, 0x0e, 0x6e, 0x55, 0x8f, 0xf8, 0xc9, 0x7d, 0x2f, 0xd0, 0x69, 0xa8, 0x68, 0x9a, 0x82, 0x0d, - 0x75, 0xab, 0x83, 0x15, 0xd5, 0xc2, 0x86, 0x6a, 0x57, 0xeb, 0x7e, 0xe2, 0xb2, 0xa6, 0x2d, 0xd1, - 0xb7, 0xf3, 0xf4, 0x25, 0xba, 0x07, 0xa6, 0xcd, 0xad, 0x17, 0x34, 0xa6, 0x92, 0x4a, 0xcf, 0xc2, - 0xdb, 0xfa, 0x6e, 0xf5, 0x0e, 0x2a, 0xdf, 0x29, 0xf2, 0x82, 0x2a, 0xe4, 0x1a, 0x2d, 0x46, 0xa7, - 0xa0, 0xa2, 0xd9, 0x3b, 0xaa, 0xd5, 0xa3, 0x36, 0xd9, 0xee, 0xa9, 0x1a, 0xae, 0xde, 0xc9, 0x48, - 0x59, 0xf9, 0x45, 0x51, 0x4c, 0xa6, 0x84, 0x7d, 0x4d, 0xdf, 0x76, 0x04, 0xe2, 0xdd, 0x6c, 0x4a, - 0xd0, 0x32, 0x8e, 0x76, 0x12, 0x2a, 0x44, 0x14, 0x81, 0x8a, 0x4f, 0x52, 0xb2, 0x72, 0x6f, 0xa7, - 0xe7, 0xaf, 0xf7, 0x04, 0x4c, 0x12, 0x4a, 0xaf, 0xd2, 0x53, 0x2c, 0x20, 0xeb, 0xed, 0xf8, 0x6a, - 0x7c, 0x10, 0x0e, 0x13, 0xa2, 0x2e, 0x76, 0xd4, 0x96, 0xea, 0xa8, 0x3e, 0xea, 0xfb, 0x28, 0x35, - 0x91, 0xfb, 0x2a, 0x7f, 0x19, 0x68, 0xa7, 0xd5, 0xdf, 0xda, 0x73, 0x35, 0xeb, 0x7e, 0xd6, 0x4e, - 0x52, 0x26, 0x74, 0xeb, 0x6d, 0x0b, 0xba, 0xa5, 0x06, 0x94, 0xfc, 0x8a, 0x8f, 0x0a, 0xc0, 0x54, - 0xbf, 0x92, 0x22, 0x51, 0xd0, 0xc2, 0xa5, 0x45, 0x12, 0xbf, 0x3c, 0xbf, 0x54, 0x49, 0x93, 0x38, - 0x6a, 0x65, 0x79, 0x63, 0x49, 0x91, 0x37, 0x2f, 0x6e, 0x2c, 0xaf, 0x2e, 0x55, 0x32, 0xbe, 0x80, - 0xfd, 0xa9, 0x6c, 0xfe, 0xae, 0xca, 0xdd, 0xd2, 0xb7, 0xd3, 0x50, 0x0e, 0xae, 0xc0, 0xd0, 0xe3, - 0x70, 0x44, 0xa4, 0x4b, 0x6c, 0xec, 0x28, 0xd7, 0x74, 0x8b, 0xce, 0xc8, 0xae, 0xca, 0xbc, 0xa3, - 0xab, 0x13, 0xb3, 0x9c, 0x6a, 0x1d, 0x3b, 0xcf, 0xea, 0x16, 0x99, 0x6f, 0x5d, 0xd5, 0x41, 0x2b, - 0x50, 0x37, 0x4c, 0xc5, 0x76, 0x54, 0xa3, 0xa5, 0x5a, 0x2d, 0xc5, 0x4b, 0x54, 0x29, 0xaa, 0xa6, - 0x61, 0xdb, 0x36, 0x99, 0x27, 0x74, 0x51, 0x6e, 0x35, 0xcc, 0x75, 0x4e, 0xec, 0xb9, 0x88, 0x79, - 0x4e, 0x1a, 0xd2, 0xdf, 0xcc, 0x30, 0xfd, 0xbd, 0x05, 0x0a, 0x5d, 0xb5, 0xa7, 0x60, 0xc3, 0xb1, - 0xf6, 0x68, 0xdc, 0x9d, 0x97, 0xf3, 0x5d, 0xb5, 0xb7, 0x44, 0x9e, 0xdf, 0x91, 0xe5, 0xcf, 0x53, - 0xd9, 0x7c, 0xbe, 0x52, 0x78, 0x2a, 0x9b, 0x2f, 0x54, 0x40, 0x7a, 0x2d, 0x03, 0x25, 0x7f, 0x1c, - 0x4e, 0x96, 0x35, 0x1a, 0x75, 0x59, 0x29, 0x6a, 0xd4, 0x4e, 0x8c, 0x8c, 0xda, 0xe7, 0x16, 0x88, - 0x2f, 0x6b, 0xe4, 0x58, 0x74, 0x2c, 0x33, 0x4e, 0x12, 0x47, 0x10, 0x65, 0xc3, 0x2c, 0x1a, 0xc9, - 0xcb, 0xfc, 0x09, 0x9d, 0x87, 0xdc, 0x0b, 0x36, 0xc5, 0xce, 0x51, 0xec, 0x3b, 0x46, 0x63, 0x3f, - 0xb5, 0x4e, 0xc1, 0x0b, 0x4f, 0xad, 0x2b, 0x17, 0x2f, 0xc9, 0xab, 0xf3, 0x2b, 0x32, 0x67, 0x47, - 0x47, 0x21, 0xdb, 0x51, 0x5f, 0xda, 0x0b, 0x7a, 0x3d, 0x5a, 0x94, 0x74, 0x10, 0x8e, 0x42, 0xf6, - 0x1a, 0x56, 0xaf, 0x04, 0x7d, 0x0d, 0x2d, 0x7a, 0x1b, 0x27, 0xc3, 0x69, 0x18, 0xa7, 0xf2, 0x42, - 0x00, 0x5c, 0x62, 0x95, 0x31, 0x94, 0x87, 0xec, 0xc2, 0x25, 0x99, 0x4c, 0x88, 0x0a, 0x94, 0x58, - 0xa9, 0xb2, 0xb6, 0xbc, 0xb4, 0xb0, 0x54, 0x49, 0x4b, 0x0f, 0x41, 0x8e, 0x09, 0x81, 0x4c, 0x16, - 0x57, 0x0c, 0x95, 0x31, 0xfe, 0xc8, 0x31, 0x52, 0xe2, 0xed, 0xe6, 0x6a, 0x73, 0x49, 0xae, 0xa4, - 0x83, 0x43, 0x9d, 0xad, 0x8c, 0x4b, 0x36, 0x94, 0xfc, 0x81, 0xf8, 0x3b, 0xb3, 0xc8, 0xfe, 0x46, - 0x0a, 0x8a, 0xbe, 0xc0, 0x9a, 0x44, 0x44, 0x6a, 0xa7, 0x63, 0x5e, 0x53, 0xd4, 0x8e, 0xae, 0xda, - 0x5c, 0x35, 0x80, 0x16, 0xcd, 0x93, 0x92, 0xa4, 0x43, 0xf7, 0x0e, 0x4d, 0x91, 0xf1, 0x4a, 0x4e, - 0xfa, 0x5c, 0x0a, 0x2a, 0xe1, 0xc8, 0x36, 0xd4, 0xcc, 0xd4, 0x8f, 0xb2, 0x99, 0xd2, 0x67, 0x52, - 0x50, 0x0e, 0x86, 0xb3, 0xa1, 0xe6, 0xdd, 0xfe, 0x23, 0x6d, 0xde, 0x9f, 0xa5, 0x61, 0x32, 0x10, - 0xc4, 0x26, 0x6d, 0xdd, 0x8b, 0x30, 0xad, 0xb7, 0x70, 0xb7, 0x67, 0x3a, 0xd8, 0xd0, 0xf6, 0x94, - 0x0e, 0xbe, 0x8a, 0x3b, 0x55, 0x89, 0x1a, 0x8d, 0xd3, 0xa3, 0xc3, 0xe4, 0xb9, 0x65, 0x8f, 0x6f, - 0x85, 0xb0, 0x35, 0x66, 0x96, 0x17, 0x97, 0x56, 0xd7, 0x2e, 0x6d, 0x2c, 0x5d, 0x5c, 0xf8, 0x80, - 0xb2, 0x79, 0xf1, 0xe9, 0x8b, 0x97, 0x9e, 0xbd, 0x28, 0x57, 0xf4, 0x10, 0xd9, 0xdb, 0x38, 0xed, - 0xd7, 0xa0, 0x12, 0x6e, 0x14, 0x3a, 0x02, 0x51, 0xcd, 0xaa, 0x8c, 0xa1, 0x19, 0x98, 0xba, 0x78, - 0x49, 0x59, 0x5f, 0x5e, 0x5c, 0x52, 0x96, 0xce, 0x9d, 0x5b, 0x5a, 0xd8, 0x58, 0x67, 0x89, 0x0f, - 0x97, 0x7a, 0x23, 0x30, 0xc1, 0xa5, 0x4f, 0x67, 0x60, 0x26, 0xa2, 0x25, 0x68, 0x9e, 0x2f, 0x59, - 0xd8, 0x2a, 0xea, 0xfe, 0x24, 0xad, 0x9f, 0x23, 0x31, 0xc3, 0x9a, 0x6a, 0x39, 0x7c, 0x85, 0x73, - 0x0a, 0x88, 0x94, 0x0c, 0x47, 0xdf, 0xd6, 0xb1, 0xc5, 0xf3, 0x44, 0x6c, 0x1d, 0x33, 0xe5, 0x95, - 0xb3, 0x54, 0xd1, 0x7d, 0x80, 0x7a, 0xa6, 0xad, 0x3b, 0xfa, 0x55, 0xac, 0xe8, 0x86, 0x48, 0x2a, - 0x65, 0xe9, 0x2e, 0x53, 0x45, 0xbc, 0x59, 0x36, 0x1c, 0x97, 0xda, 0xc0, 0x6d, 0x35, 0x44, 0x4d, - 0x8c, 0x79, 0x46, 0xae, 0x88, 0x37, 0x2e, 0xf5, 0xed, 0x50, 0x6a, 0x99, 0x7d, 0x12, 0xec, 0x31, - 0x3a, 0xe2, 0x3b, 0x52, 0x72, 0x91, 0x95, 0xb9, 0x24, 0x3c, 0x8c, 0xf7, 0xb2, 0x59, 0x25, 0xb9, - 0xc8, 0xca, 0x18, 0xc9, 0xdd, 0x30, 0xa5, 0xb6, 0xdb, 0x16, 0x01, 0x17, 0x40, 0x6c, 0x61, 0x52, - 0x76, 0x8b, 0x29, 0x61, 0xed, 0x29, 0xc8, 0x0b, 0x39, 0x10, 0x57, 0x4d, 0x24, 0xa1, 0xf4, 0xd8, - 0x6a, 0x3b, 0x7d, 0xb2, 0x20, 0xe7, 0x0d, 0xf1, 0xf2, 0x76, 0x28, 0xe9, 0xb6, 0xe2, 0x25, 0xe7, - 0xd3, 0xc7, 0xd3, 0x27, 0xf3, 0x72, 0x51, 0xb7, 0xdd, 0xc4, 0xa6, 0xf4, 0xc5, 0x34, 0x94, 0x83, - 0x9b, 0x0b, 0x68, 0x11, 0xf2, 0x1d, 0x53, 0xa3, 0xbb, 0x87, 0x7c, 0x67, 0xeb, 0x64, 0xcc, 0x7e, - 0xc4, 0xdc, 0x0a, 0xa7, 0x97, 0x5d, 0xce, 0xda, 0x7f, 0x48, 0x41, 0x5e, 0x14, 0xa3, 0xc3, 0x90, - 0xed, 0xa9, 0xce, 0x0e, 0x85, 0x1b, 0x6f, 0xa6, 0x2b, 0x29, 0x99, 0x3e, 0x93, 0x72, 0xbb, 0xa7, - 0x1a, 0x54, 0x05, 0x78, 0x39, 0x79, 0x26, 0xe3, 0xda, 0xc1, 0x6a, 0x8b, 0xae, 0x7a, 0xcc, 0x6e, - 0x17, 0x1b, 0x8e, 0x2d, 0xc6, 0x95, 0x97, 0x2f, 0xf0, 0x62, 0x74, 0x2f, 0x4c, 0x3b, 0x96, 0xaa, - 0x77, 0x02, 0xb4, 0x59, 0x4a, 0x5b, 0x11, 0x2f, 0x5c, 0xe2, 0x06, 0x1c, 0x15, 0xb8, 0x2d, 0xec, - 0xa8, 0xda, 0x0e, 0x6e, 0x79, 0x4c, 0x39, 0x9a, 0xdd, 0x38, 0xc2, 0x09, 0x16, 0xf9, 0x7b, 0xc1, - 0x2b, 0x7d, 0x3b, 0x05, 0xd3, 0x62, 0x9d, 0xd6, 0x72, 0x85, 0xb5, 0x0a, 0xa0, 0x1a, 0x86, 0xe9, - 0xf8, 0xc5, 0x35, 0xa8, 0xca, 0x03, 0x7c, 0x73, 0xf3, 0x2e, 0x93, 0xec, 0x03, 0xa8, 0x75, 0x01, - 0xbc, 0x37, 0x43, 0xc5, 0x56, 0x87, 0x22, 0xdf, 0x39, 0xa2, 0xdb, 0x8f, 0x6c, 0x65, 0x0f, 0xac, - 0x88, 0x2c, 0xe8, 0xd0, 0x2c, 0x8c, 0x6f, 0xe1, 0xb6, 0x6e, 0xf0, 0x7c, 0x30, 0x7b, 0x10, 0xf9, - 0x97, 0xac, 0x9b, 0x7f, 0x69, 0x7e, 0x22, 0x05, 0x33, 0x9a, 0xd9, 0x0d, 0xb7, 0xb7, 0x59, 0x09, - 0xa5, 0x17, 0xec, 0x0b, 0xa9, 0xe7, 0x9f, 0xf0, 0xed, 0xb4, 0xb6, 0xcd, 0x8e, 0x6a, 0xb4, 0xbd, - 0xfd, 0x53, 0xfa, 0x43, 0xbb, 0xbf, 0x8d, 0x8d, 0xfb, 0xdb, 0xa6, 0x6f, 0x37, 0xf5, 0xac, 0xf7, - 0xf3, 0xaf, 0x53, 0xa9, 0x2f, 0xa4, 0x33, 0xe7, 0xd7, 0x9a, 0x5f, 0x4a, 0xd7, 0xce, 0xb3, 0xea, - 0xd6, 0x84, 0x78, 0x64, 0xbc, 0xdd, 0xc1, 0x1a, 0xe9, 0x32, 0x7c, 0xef, 0x5e, 0x98, 0x6d, 0x9b, - 0x6d, 0x93, 0x22, 0x9e, 0x26, 0xbf, 0xf8, 0x8e, 0x6c, 0xc1, 0x2d, 0xad, 0xc5, 0x6e, 0xdf, 0x36, - 0x2e, 0xc2, 0x0c, 0x27, 0x56, 0xe8, 0x96, 0x10, 0x5b, 0xd8, 0xa0, 0x91, 0x69, 0xb5, 0xea, 0xef, - 0x7d, 0x97, 0x3a, 0x74, 0x79, 0x9a, 0xb3, 0x92, 0x77, 0x6c, 0xed, 0xd3, 0x90, 0xe1, 0x50, 0x00, - 0x8f, 0x4d, 0x5b, 0x6c, 0xc5, 0x20, 0xfe, 0x5b, 0x8e, 0x38, 0xe3, 0x43, 0x5c, 0xe7, 0xac, 0x8d, - 0x05, 0x98, 0x3c, 0x08, 0xd6, 0xbf, 0xe3, 0x58, 0x25, 0xec, 0x07, 0x39, 0x0f, 0x53, 0x14, 0x44, - 0xeb, 0xdb, 0x8e, 0xd9, 0xa5, 0x36, 0x71, 0x34, 0xcc, 0x1f, 0x7e, 0x97, 0xcd, 0xa3, 0x32, 0x61, - 0x5b, 0x70, 0xb9, 0x1a, 0x0d, 0xa0, 0xbb, 0x60, 0x2d, 0xac, 0x75, 0x62, 0x10, 0xbe, 0xc9, 0x1b, - 0xe2, 0xd2, 0x37, 0x2e, 0xc3, 0x2c, 0xf9, 0x4d, 0x4d, 0x96, 0xbf, 0x25, 0xf1, 0x39, 0xb8, 0xea, - 0xb7, 0x3f, 0xcc, 0xa6, 0xea, 0x8c, 0x0b, 0xe0, 0x6b, 0x93, 0x6f, 0x14, 0xdb, 0xd8, 0x71, 0xb0, - 0x65, 0x2b, 0x6a, 0x27, 0xaa, 0x79, 0xbe, 0x24, 0x46, 0xf5, 0xd7, 0xdf, 0x08, 0x8e, 0xe2, 0x79, - 0xc6, 0x39, 0xdf, 0xe9, 0x34, 0x36, 0xe1, 0x48, 0x84, 0x56, 0x24, 0xc0, 0xfc, 0x34, 0xc7, 0x9c, - 0x1d, 0xd0, 0x0c, 0x02, 0xbb, 0x06, 0xa2, 0xdc, 0x1d, 0xcb, 0x04, 0x98, 0xbf, 0xc1, 0x31, 0x11, - 0xe7, 0x15, 0x43, 0x4a, 0x10, 0x9f, 0x82, 0xe9, 0xab, 0xd8, 0xda, 0x32, 0x6d, 0x9e, 0x38, 0x4a, - 0x00, 0xf7, 0x19, 0x0e, 0x37, 0xc5, 0x19, 0x69, 0x26, 0x89, 0x60, 0x3d, 0x06, 0xf9, 0x6d, 0x55, - 0xc3, 0x09, 0x20, 0x3e, 0xcb, 0x21, 0x26, 0x08, 0x3d, 0x61, 0x9d, 0x87, 0x52, 0xdb, 0xe4, 0x5e, - 0x2b, 0x9e, 0xfd, 0x73, 0x9c, 0xbd, 0x28, 0x78, 0x38, 0x44, 0xcf, 0xec, 0xf5, 0x3b, 0xc4, 0xa5, - 0xc5, 0x43, 0xfc, 0xa6, 0x80, 0x10, 0x3c, 0x1c, 0xe2, 0x00, 0x62, 0x7d, 0x55, 0x40, 0xd8, 0x3e, - 0x79, 0x3e, 0x09, 0x45, 0xd3, 0xe8, 0xec, 0x99, 0x46, 0x92, 0x46, 0x7c, 0x9e, 0x23, 0x00, 0x67, - 0x21, 0x00, 0x67, 0xa1, 0x90, 0x74, 0x20, 0xfe, 0xe1, 0x1b, 0x62, 0x7a, 0x88, 0x11, 0x38, 0x0f, - 0x53, 0xc2, 0x40, 0xe9, 0xa6, 0x91, 0x00, 0xe2, 0x1f, 0x71, 0x88, 0xb2, 0x8f, 0x8d, 0x77, 0xc3, - 0xc1, 0xb6, 0xd3, 0xc6, 0x49, 0x40, 0xbe, 0x28, 0xba, 0xc1, 0x59, 0xb8, 0x28, 0xb7, 0xb0, 0xa1, - 0xed, 0x24, 0x43, 0xf8, 0x2d, 0x21, 0x4a, 0xc1, 0x43, 0x20, 0x16, 0x60, 0xb2, 0xab, 0x5a, 0xf6, - 0x8e, 0xda, 0x49, 0x34, 0x1c, 0xff, 0x98, 0x63, 0x94, 0x5c, 0x26, 0x2e, 0x91, 0xbe, 0x71, 0x10, - 0x98, 0x2f, 0x09, 0x89, 0xf8, 0xd8, 0xf8, 0xd4, 0xb3, 0x1d, 0x9a, 0x65, 0x3b, 0x08, 0xda, 0x3f, - 0x11, 0x53, 0x8f, 0xf1, 0xae, 0xfa, 0x11, 0xcf, 0x42, 0xc1, 0xd6, 0x5f, 0x4a, 0x04, 0xf3, 0x4f, - 0xc5, 0x48, 0x53, 0x06, 0xc2, 0xfc, 0x01, 0x38, 0x1a, 0xe9, 0x26, 0x12, 0x80, 0xfd, 0x33, 0x0e, - 0x76, 0x38, 0xc2, 0x55, 0x70, 0x93, 0x70, 0x50, 0xc8, 0xdf, 0x16, 0x26, 0x01, 0x87, 0xb0, 0xd6, - 0xc8, 0x3a, 0xc2, 0x56, 0xb7, 0x0f, 0x26, 0xb5, 0xdf, 0x11, 0x52, 0x63, 0xbc, 0x01, 0xa9, 0x6d, - 0xc0, 0x61, 0x8e, 0x78, 0xb0, 0x71, 0xfd, 0x5d, 0x61, 0x58, 0x19, 0xf7, 0x66, 0x70, 0x74, 0x3f, - 0x08, 0x35, 0x57, 0x9c, 0x22, 0x60, 0xb5, 0x95, 0xae, 0xda, 0x4b, 0x80, 0xfc, 0x7b, 0x1c, 0x59, - 0x58, 0x7c, 0x37, 0xe2, 0xb5, 0x57, 0xd5, 0x1e, 0x01, 0x7f, 0x0e, 0xaa, 0x02, 0xbc, 0x6f, 0x58, - 0x58, 0x33, 0xdb, 0x86, 0xfe, 0x12, 0x6e, 0x25, 0x80, 0xfe, 0xe7, 0xa1, 0xa1, 0xda, 0xf4, 0xb1, - 0x13, 0xe4, 0x65, 0xa8, 0xb8, 0xb1, 0x8a, 0xa2, 0x77, 0x7b, 0xa6, 0xe5, 0xc4, 0x20, 0xfe, 0x0b, - 0x31, 0x52, 0x2e, 0xdf, 0x32, 0x65, 0x6b, 0x2c, 0x41, 0x99, 0x3e, 0x26, 0x55, 0xc9, 0x2f, 0x73, - 0xa0, 0x49, 0x8f, 0x8b, 0x1b, 0x0e, 0xcd, 0xec, 0xf6, 0x54, 0x2b, 0x89, 0xfd, 0xfb, 0x97, 0xc2, - 0x70, 0x70, 0x16, 0x6e, 0x38, 0x9c, 0xbd, 0x1e, 0x26, 0xde, 0x3e, 0x01, 0xc2, 0x57, 0x84, 0xe1, - 0x10, 0x3c, 0x1c, 0x42, 0x04, 0x0c, 0x09, 0x20, 0xbe, 0x2a, 0x20, 0x04, 0x0f, 0x81, 0x78, 0xc6, - 0x73, 0xb4, 0x16, 0x6e, 0xeb, 0xb6, 0x63, 0xb1, 0x30, 0x79, 0x34, 0xd4, 0xd7, 0xde, 0x08, 0x06, - 0x61, 0xb2, 0x8f, 0x95, 0x58, 0x22, 0x9e, 0x76, 0xa5, 0xab, 0xa8, 0xf8, 0x86, 0x7d, 0x5d, 0x58, - 0x22, 0x1f, 0x1b, 0x69, 0x9b, 0x2f, 0x42, 0x24, 0x62, 0xd7, 0xc8, 0xda, 0x21, 0x01, 0xdc, 0xef, - 0x87, 0x1a, 0xb7, 0x2e, 0x78, 0x09, 0xa6, 0x2f, 0xfe, 0xe9, 0x1b, 0x57, 0xf0, 0x5e, 0x22, 0xed, - 0xfc, 0x83, 0x50, 0xfc, 0xb3, 0xc9, 0x38, 0x99, 0x0d, 0x99, 0x0a, 0xc5, 0x53, 0x28, 0xee, 0xfc, - 0x50, 0xf5, 0x6f, 0xbf, 0xc9, 0xfb, 0x1b, 0x0c, 0xa7, 0x1a, 0x2b, 0x44, 0xc9, 0x83, 0x41, 0x4f, - 0x3c, 0xd8, 0x87, 0xdf, 0x74, 0xf5, 0x3c, 0x10, 0xf3, 0x34, 0xce, 0xc1, 0x64, 0x20, 0xe0, 0x89, - 0x87, 0xfa, 0x08, 0x87, 0x2a, 0xf9, 0xe3, 0x9d, 0xc6, 0x43, 0x90, 0x25, 0xc1, 0x4b, 0x3c, 0xfb, - 0xcf, 0x71, 0x76, 0x4a, 0xde, 0x78, 0x1f, 0xe4, 0x45, 0xd0, 0x12, 0xcf, 0xfa, 0xf3, 0x9c, 0xd5, - 0x65, 0x21, 0xec, 0x22, 0x60, 0x89, 0x67, 0xff, 0x05, 0xc1, 0x2e, 0x58, 0x08, 0x7b, 0x72, 0x11, - 0x7e, 0xe3, 0xef, 0x64, 0xb9, 0xd3, 0x11, 0xb2, 0x3b, 0x0b, 0x13, 0x3c, 0x52, 0x89, 0xe7, 0xfe, - 0x18, 0xaf, 0x5c, 0x70, 0x34, 0x1e, 0x81, 0xf1, 0x84, 0x02, 0xff, 0x25, 0xce, 0xca, 0xe8, 0x1b, - 0x0b, 0x50, 0xf4, 0x45, 0x27, 0xf1, 0xec, 0xbf, 0xcc, 0xd9, 0xfd, 0x5c, 0xa4, 0xe9, 0x3c, 0x3a, - 0x89, 0x07, 0xf8, 0x84, 0x68, 0x3a, 0xe7, 0x20, 0x62, 0x13, 0x81, 0x49, 0x3c, 0xf7, 0x27, 0x85, - 0xd4, 0x05, 0x4b, 0xe3, 0x49, 0x28, 0xb8, 0xce, 0x26, 0x9e, 0xff, 0xef, 0x72, 0x7e, 0x8f, 0x87, - 0x48, 0xc0, 0xe7, 0xec, 0xe2, 0x21, 0x3e, 0x25, 0x24, 0xe0, 0xe3, 0x22, 0xd3, 0x28, 0x1c, 0xc0, - 0xc4, 0x23, 0xfd, 0x3d, 0x31, 0x8d, 0x42, 0xf1, 0x0b, 0x19, 0x4d, 0x6a, 0xf3, 0xe3, 0x21, 0x7e, - 0x45, 0x8c, 0x26, 0xa5, 0x27, 0xcd, 0x08, 0x47, 0x04, 0xf1, 0x18, 0x7f, 0x5f, 0x34, 0x23, 0x14, - 0x10, 0x34, 0xd6, 0x00, 0x0d, 0x46, 0x03, 0xf1, 0x78, 0xaf, 0x70, 0xbc, 0xe9, 0x81, 0x60, 0xa0, - 0xf1, 0x2c, 0x1c, 0x8e, 0x8e, 0x04, 0xe2, 0x51, 0x7f, 0xfd, 0xcd, 0xd0, 0xda, 0xcd, 0x1f, 0x08, - 0x34, 0x36, 0x3c, 0x97, 0xe2, 0x8f, 0x02, 0xe2, 0x61, 0x3f, 0xfd, 0x66, 0xd0, 0x70, 0xfb, 0x83, - 0x80, 0xc6, 0x3c, 0x80, 0xe7, 0x80, 0xe3, 0xb1, 0x3e, 0xc3, 0xb1, 0x7c, 0x4c, 0x64, 0x6a, 0x70, - 0xff, 0x1b, 0xcf, 0xff, 0x59, 0x31, 0x35, 0x38, 0x07, 0x99, 0x1a, 0xc2, 0xf5, 0xc6, 0x73, 0x7f, - 0x4e, 0x4c, 0x0d, 0xc1, 0x42, 0x34, 0xdb, 0xe7, 0xdd, 0xe2, 0x11, 0x3e, 0x2f, 0x34, 0xdb, 0xc7, - 0xd5, 0xb8, 0x08, 0xd3, 0x03, 0x0e, 0x31, 0x1e, 0xea, 0x0b, 0x1c, 0xaa, 0x12, 0xf6, 0x87, 0x7e, - 0xe7, 0xc5, 0x9d, 0x61, 0x3c, 0xda, 0x3f, 0x08, 0x39, 0x2f, 0xee, 0x0b, 0x1b, 0x67, 0x21, 0x6f, - 0xf4, 0x3b, 0x1d, 0x32, 0x79, 0xd0, 0xe8, 0x33, 0x7f, 0xd5, 0xff, 0xfe, 0x43, 0x2e, 0x1d, 0xc1, - 0xd0, 0x78, 0x08, 0xc6, 0x71, 0x77, 0x0b, 0xb7, 0xe2, 0x38, 0xbf, 0xf7, 0x43, 0x61, 0x30, 0x09, - 0x75, 0xe3, 0x49, 0x00, 0x96, 0x1a, 0xa1, 0xdb, 0x83, 0x31, 0xbc, 0xff, 0xe3, 0x87, 0xfc, 0x34, - 0x8e, 0xc7, 0xe2, 0x01, 0xb0, 0xb3, 0x3d, 0xa3, 0x01, 0xde, 0x08, 0x02, 0xd0, 0x11, 0x79, 0x0c, - 0x26, 0x5e, 0xb0, 0x4d, 0xc3, 0x51, 0xdb, 0x71, 0xdc, 0xff, 0x93, 0x73, 0x0b, 0x7a, 0x22, 0xb0, - 0xae, 0x69, 0x61, 0x47, 0x6d, 0xdb, 0x71, 0xbc, 0xff, 0x8b, 0xf3, 0xba, 0x0c, 0x84, 0x59, 0x53, - 0x6d, 0x27, 0x49, 0xbf, 0xff, 0xb7, 0x60, 0x16, 0x0c, 0xa4, 0xd1, 0xe4, 0xf7, 0x15, 0xbc, 0x17, - 0xc7, 0xfb, 0x7d, 0xd1, 0x68, 0x4e, 0xdf, 0x78, 0x1f, 0x14, 0xc8, 0x4f, 0x76, 0xc4, 0x2e, 0x86, - 0xf9, 0xff, 0x70, 0x66, 0x8f, 0x83, 0xd4, 0x6c, 0x3b, 0x2d, 0x47, 0x8f, 0x17, 0xf6, 0x75, 0x3e, - 0xd2, 0x82, 0xbe, 0x31, 0x0f, 0x45, 0xdb, 0x69, 0xb5, 0xfa, 0x3c, 0x3e, 0x8d, 0x61, 0xff, 0xbf, - 0x3f, 0x74, 0x53, 0x16, 0x2e, 0x0f, 0x19, 0xed, 0x6b, 0x57, 0x9c, 0x9e, 0x49, 0xb7, 0x40, 0xe2, - 0x10, 0xde, 0xe4, 0x08, 0x3e, 0x96, 0xc6, 0x02, 0x94, 0x48, 0x5f, 0x2c, 0xdc, 0xc3, 0x74, 0xbf, - 0x2a, 0x06, 0xe2, 0x2f, 0xb9, 0x00, 0x02, 0x4c, 0xcd, 0x9f, 0x1e, 0x76, 0xef, 0x26, 0x3a, 0x6d, - 0x0c, 0xe7, 0xcd, 0xf3, 0x26, 0x4b, 0x18, 0x3f, 0x2f, 0x05, 0xd2, 0xc5, 0x6d, 0xd3, 0xcb, 0xd6, - 0xba, 0x8b, 0x1c, 0xf8, 0xfd, 0x34, 0xdc, 0x49, 0x8f, 0xfb, 0x5a, 0x5d, 0xdd, 0x70, 0x4e, 0x6b, - 0xd6, 0x5e, 0xcf, 0x31, 0x4f, 0x77, 0xb1, 0x75, 0xa5, 0x83, 0xf9, 0x1f, 0x9e, 0xfd, 0xad, 0x7a, - 0x64, 0x73, 0x8c, 0x6c, 0x8e, 0xbd, 0xaf, 0x45, 0x66, 0x8b, 0xa5, 0x05, 0x98, 0x58, 0xb3, 0x4c, - 0x73, 0xfb, 0x52, 0x0f, 0x21, 0x7e, 0x82, 0x99, 0x9f, 0x8c, 0xa3, 0x6a, 0xc8, 0x6f, 0x3c, 0xa5, - 0xbd, 0x1b, 0x4f, 0x08, 0xb2, 0x2d, 0xd5, 0x51, 0x69, 0xc2, 0xbc, 0x24, 0xd3, 0xdf, 0x52, 0x13, - 0xc6, 0x29, 0x08, 0x7a, 0x0c, 0x32, 0x66, 0xcf, 0xe6, 0xd9, 0xfd, 0xdb, 0xe7, 0x86, 0xb5, 0x65, - 0x8e, 0x57, 0xd9, 0xcc, 0x7e, 0x73, 0xbf, 0x3e, 0x26, 0x13, 0x9e, 0xe6, 0xda, 0x5f, 0x7f, 0xe7, - 0x58, 0xea, 0xb7, 0x5e, 0x3b, 0x96, 0x1a, 0x7a, 0x83, 0x69, 0xce, 0x27, 0x28, 0x9f, 0x30, 0x86, - 0xc9, 0xc5, 0xbd, 0xc7, 0xf4, 0x8b, 0x69, 0x38, 0xe6, 0x23, 0xea, 0xe8, 0x5b, 0xf6, 0xe9, 0x2b, - 0x57, 0xd9, 0x95, 0x27, 0x2e, 0x35, 0xe4, 0x6b, 0x29, 0x79, 0x3f, 0x77, 0xe5, 0xea, 0x10, 0x79, - 0xcd, 0x41, 0x76, 0x4d, 0xd5, 0xad, 0x88, 0xab, 0x60, 0xb3, 0xde, 0xe1, 0x56, 0x52, 0xc6, 0x1e, - 0xa4, 0x33, 0x90, 0x7f, 0x7a, 0xf9, 0xe1, 0x07, 0x93, 0xf0, 0x64, 0x38, 0x4f, 0x53, 0x16, 0xa2, - 0xf8, 0x5a, 0x84, 0x38, 0xbe, 0xf1, 0xfa, 0xb1, 0x54, 0xe4, 0xa5, 0xae, 0x68, 0x91, 0xf0, 0xde, - 0xba, 0xc2, 0xf8, 0x64, 0x1a, 0xea, 0xe1, 0x5d, 0x01, 0x32, 0x15, 0x6d, 0x47, 0xed, 0xf6, 0x86, - 0xdd, 0xe9, 0x3a, 0x0b, 0x85, 0x0d, 0x41, 0x83, 0xaa, 0x30, 0x61, 0x63, 0xcd, 0x34, 0x5a, 0x36, - 0xed, 0x49, 0x46, 0x16, 0x8f, 0xa4, 0x37, 0x86, 0x6a, 0x98, 0x36, 0x3f, 0x72, 0xca, 0x1e, 0x9a, - 0xbf, 0x96, 0x3a, 0xd8, 0xdc, 0x28, 0xbb, 0x55, 0xd1, 0x09, 0xb2, 0x96, 0x7a, 0xfe, 0xde, 0x51, - 0x1b, 0x2a, 0xec, 0xe6, 0x9a, 0xdb, 0x05, 0xdf, 0xee, 0xc9, 0xb1, 0xf0, 0xee, 0xc9, 0xb3, 0xb8, - 0xd3, 0x79, 0xda, 0x30, 0xaf, 0x19, 0x1b, 0x84, 0xc7, 0x15, 0xc9, 0xc7, 0xd3, 0x70, 0x6c, 0x60, - 0xa3, 0x84, 0x9b, 0x97, 0x61, 0x12, 0x69, 0x40, 0x7e, 0x51, 0x58, 0xad, 0x83, 0x0a, 0xe4, 0x57, - 0x0e, 0x28, 0x90, 0x49, 0x51, 0x93, 0x90, 0xc7, 0x3d, 0xf1, 0xf2, 0x10, 0xed, 0xbf, 0x01, 0x71, - 0x7c, 0xe4, 0x09, 0xb8, 0xdd, 0xa7, 0x40, 0xea, 0x96, 0xa6, 0xf3, 0xeb, 0x81, 0xfe, 0x19, 0x73, - 0xc8, 0x37, 0x63, 0x08, 0xc9, 0x1c, 0x7d, 0x19, 0x3d, 0x69, 0x6a, 0xc9, 0x6c, 0x57, 0x2d, 0x66, - 0x96, 0xd6, 0xe2, 0x14, 0xb7, 0x16, 0x33, 0x8c, 0xd2, 0x5f, 0x8d, 0xc3, 0x84, 0xb8, 0xcb, 0xf9, - 0x28, 0x64, 0xb1, 0xb6, 0x63, 0xf2, 0xd3, 0xee, 0xd2, 0x5c, 0x64, 0x7f, 0xe6, 0x38, 0xf5, 0x92, - 0xb6, 0x63, 0x5e, 0x18, 0x93, 0x29, 0x07, 0xbd, 0x03, 0xd6, 0xe9, 0xdb, 0x3b, 0xfc, 0x50, 0xf2, - 0x89, 0xd1, 0xac, 0xe7, 0x08, 0xe9, 0x85, 0x31, 0x99, 0xf1, 0x90, 0x6a, 0xe9, 0xfd, 0xb5, 0x6c, - 0x92, 0x6a, 0x97, 0x8d, 0x6d, 0x5a, 0x2d, 0xe1, 0x40, 0x17, 0x00, 0x6c, 0xec, 0x88, 0xa3, 0x0c, - 0xe3, 0x94, 0xff, 0xee, 0xd1, 0xfc, 0xeb, 0xd8, 0x61, 0x6e, 0xeb, 0xc2, 0x98, 0x5c, 0xb0, 0xc5, - 0x03, 0x41, 0xd2, 0x0d, 0xdd, 0x51, 0xb4, 0x1d, 0x55, 0x37, 0xe8, 0x1e, 0x7c, 0x2c, 0xd2, 0xb2, - 0xa1, 0x3b, 0x0b, 0x84, 0x9c, 0x20, 0xe9, 0xe2, 0x81, 0x88, 0x82, 0xde, 0x19, 0xe5, 0x97, 0xac, - 0x62, 0x44, 0xf1, 0x0c, 0x21, 0x25, 0xa2, 0xa0, 0x3c, 0xe8, 0x69, 0x28, 0xd2, 0xed, 0x56, 0x65, - 0xab, 0x63, 0x6a, 0x57, 0xf8, 0xcd, 0x92, 0x93, 0xa3, 0x21, 0x9a, 0x84, 0xa1, 0x49, 0xe8, 0x2f, - 0x8c, 0xc9, 0xb0, 0xe5, 0x3e, 0xa1, 0x26, 0xe4, 0xd9, 0xb1, 0x5f, 0x67, 0x97, 0xdf, 0x0d, 0xbc, - 0x73, 0x34, 0x12, 0x3d, 0x01, 0xbc, 0xb1, 0x7b, 0x61, 0x4c, 0x9e, 0xd0, 0xd8, 0x4f, 0xb4, 0x04, - 0x05, 0x6c, 0xb4, 0x78, 0x73, 0x8a, 0xfc, 0x16, 0xd5, 0x68, 0xbd, 0x30, 0x5a, 0xa2, 0x31, 0x79, - 0xcc, 0x7f, 0xa3, 0x27, 0x20, 0xa7, 0x99, 0xdd, 0xae, 0xee, 0xd0, 0x3b, 0x86, 0xc5, 0x33, 0x77, - 0xc4, 0x34, 0x84, 0xd2, 0x5e, 0x18, 0x93, 0x39, 0x17, 0x19, 0x9e, 0x16, 0xee, 0xe8, 0x57, 0xb1, - 0x45, 0x3a, 0x33, 0x93, 0x64, 0x78, 0x16, 0x19, 0x3d, 0xed, 0x4e, 0xa1, 0x25, 0x1e, 0x9a, 0x13, - 0xdc, 0xbd, 0x48, 0x77, 0x43, 0xd1, 0xa7, 0xc9, 0xc4, 0x62, 0xf1, 0x15, 0x08, 0x77, 0xf6, 0xe2, - 0x51, 0x2a, 0x43, 0xc9, 0xaf, 0xb7, 0x52, 0xd7, 0x65, 0xa4, 0x9b, 0xf8, 0x55, 0x98, 0xb8, 0x8a, - 0x2d, 0x9b, 0xed, 0xe0, 0x53, 0x46, 0xfe, 0x88, 0x4e, 0xc0, 0x24, 0x95, 0x9b, 0x22, 0xde, 0xb3, - 0x6b, 0xc9, 0x25, 0x5a, 0x78, 0x99, 0x13, 0xd5, 0xa1, 0xd8, 0x3b, 0xd3, 0x73, 0x49, 0xd8, 0xdd, - 0x68, 0xe8, 0x9d, 0xe9, 0x71, 0x02, 0xa9, 0x01, 0x95, 0xb0, 0xea, 0xfa, 0xbd, 0x66, 0x21, 0xc2, - 0x6b, 0x16, 0x84, 0xa7, 0xfd, 0xdd, 0xb4, 0xcb, 0xec, 0x6a, 0x2b, 0x99, 0x6e, 0xc4, 0x48, 0x50, - 0xee, 0xe2, 0x99, 0xda, 0x40, 0x68, 0xe7, 0xfa, 0x9a, 0x66, 0x9e, 0x84, 0x22, 0x9f, 0xfc, 0xd3, - 0x7a, 0x4a, 0xa6, 0x1c, 0xe8, 0x28, 0x51, 0x28, 0x55, 0x37, 0x14, 0xbd, 0x25, 0x6e, 0x13, 0xd3, - 0xe7, 0xe5, 0x16, 0x7a, 0x06, 0x2a, 0x9a, 0x69, 0xd8, 0xd8, 0xb0, 0xfb, 0xb6, 0xd2, 0x53, 0x2d, - 0xb5, 0xeb, 0x5d, 0xba, 0x8b, 0x1e, 0xa6, 0x05, 0x41, 0xbe, 0x46, 0xa9, 0xe5, 0x29, 0x2d, 0x58, - 0x80, 0x56, 0x00, 0xae, 0xaa, 0x1d, 0xbd, 0xa5, 0x3a, 0xa6, 0x65, 0xf3, 0xcb, 0x29, 0xc3, 0xc0, - 0x2e, 0x0b, 0xc2, 0xcd, 0x5e, 0x4b, 0x75, 0x30, 0x0f, 0xa2, 0x7c, 0xfc, 0xe8, 0x2e, 0x98, 0x52, - 0x7b, 0x3d, 0xc5, 0x76, 0x54, 0x07, 0x2b, 0x5b, 0x7b, 0x0e, 0xb6, 0xa9, 0xbd, 0x28, 0xc9, 0x93, - 0x6a, 0xaf, 0xb7, 0x4e, 0x4a, 0x9b, 0xa4, 0x50, 0x6a, 0xb9, 0xa3, 0x4d, 0xa7, 0xa6, 0x1b, 0xdb, - 0xa5, 0xbc, 0xd8, 0x8e, 0x94, 0xd1, 0xa3, 0x15, 0x4c, 0x06, 0xe2, 0x34, 0x4a, 0x6e, 0x07, 0xeb, - 0xed, 0x1d, 0x76, 0xbd, 0x3d, 0x23, 0xf3, 0x27, 0x32, 0x30, 0x3d, 0xcb, 0xbc, 0x8a, 0xf9, 0xcd, - 0x76, 0xf6, 0x20, 0xfd, 0x6a, 0x1a, 0xa6, 0x07, 0xa6, 0x2f, 0xc1, 0xa5, 0x07, 0xfc, 0x79, 0x5d, - 0xe4, 0x37, 0x3a, 0x4b, 0x70, 0xd5, 0x16, 0xbf, 0xb4, 0x52, 0x3c, 0x73, 0xdb, 0x10, 0x09, 0x5c, - 0xa0, 0x44, 0xbc, 0xe3, 0x9c, 0x05, 0x6d, 0x42, 0xa5, 0xa3, 0xda, 0x8e, 0xc2, 0x66, 0x11, 0xbb, - 0x25, 0x9c, 0x19, 0x69, 0x09, 0x56, 0x54, 0x31, 0xfb, 0x88, 0x72, 0x73, 0xb8, 0x72, 0x27, 0x50, - 0x8a, 0x9e, 0x83, 0xd9, 0xad, 0xbd, 0x97, 0x54, 0xc3, 0xd1, 0x0d, 0x7a, 0xd8, 0x28, 0x38, 0x46, - 0xf5, 0x21, 0xd0, 0x4b, 0x57, 0xf5, 0x16, 0x36, 0x34, 0x31, 0x38, 0x33, 0x2e, 0x84, 0x3b, 0x78, - 0xb6, 0xf4, 0x1c, 0x94, 0x83, 0xb6, 0x08, 0x95, 0x21, 0xed, 0xec, 0x72, 0x89, 0xa4, 0x9d, 0x5d, - 0xf4, 0x30, 0x8f, 0xc8, 0xd3, 0xf4, 0xb4, 0xdc, 0x30, 0x67, 0xc1, 0xb9, 0xbd, 0xbb, 0x84, 0x92, - 0xe4, 0xce, 0x04, 0xd7, 0x30, 0x84, 0xb1, 0xa5, 0x53, 0x30, 0x15, 0x32, 0x62, 0xbe, 0x61, 0x4d, - 0xf9, 0x87, 0x55, 0x9a, 0x82, 0xc9, 0x80, 0xad, 0x92, 0xfe, 0x28, 0x07, 0x79, 0xf7, 0x1b, 0x05, - 0x17, 0xa0, 0x80, 0x77, 0x35, 0xdc, 0x73, 0x84, 0x55, 0x18, 0x65, 0xc4, 0x19, 0xcf, 0x92, 0xa0, - 0x27, 0xe6, 0xca, 0x65, 0x46, 0x8f, 0x05, 0x5c, 0xf2, 0x89, 0x38, 0x10, 0xbf, 0x4f, 0x7e, 0x3c, - 0xe8, 0x93, 0xef, 0x88, 0xe1, 0x0d, 0x39, 0xe5, 0xc7, 0x02, 0x4e, 0x39, 0xae, 0xe2, 0x80, 0x57, - 0x5e, 0x8e, 0xf0, 0xca, 0x71, 0xdd, 0x1f, 0xe2, 0x96, 0x97, 0x23, 0xdc, 0xf2, 0xc9, 0xd8, 0xb6, - 0x44, 0xfa, 0xe5, 0xc7, 0x83, 0x7e, 0x39, 0x4e, 0x1c, 0x21, 0xc7, 0xbc, 0x12, 0xe5, 0x98, 0x4f, - 0xc5, 0x60, 0x0c, 0xf5, 0xcc, 0x0b, 0x03, 0x9e, 0xf9, 0xae, 0x18, 0xa8, 0x08, 0xd7, 0xbc, 0x1c, - 0xf0, 0x89, 0x90, 0x48, 0x36, 0xd1, 0x4e, 0x11, 0x9d, 0x1b, 0xf4, 0xf2, 0x77, 0xc7, 0xa9, 0x5a, - 0x94, 0x9b, 0x7f, 0x32, 0xe4, 0xe6, 0xef, 0x8c, 0xeb, 0x55, 0xc8, 0xcf, 0x7b, 0xde, 0xf9, 0x14, - 0xb1, 0x8f, 0xa1, 0x99, 0x41, 0x6c, 0x29, 0xb6, 0x2c, 0xd3, 0xe2, 0x8e, 0x8f, 0x3d, 0x48, 0x27, - 0x89, 0xc5, 0xf6, 0xf4, 0x7f, 0x84, 0x27, 0xa7, 0x93, 0xd6, 0xa7, 0xed, 0xd2, 0xd7, 0x52, 0x1e, - 0x2f, 0xb5, 0x6c, 0x7e, 0x6b, 0x5f, 0xe0, 0xd6, 0xde, 0xe7, 0xe0, 0xd3, 0x41, 0x07, 0x5f, 0x87, - 0x22, 0xf1, 0x29, 0x21, 0xdf, 0xad, 0xf6, 0x84, 0xef, 0x46, 0xf7, 0xc0, 0x34, 0xb5, 0xbf, 0x2c, - 0x0c, 0xe0, 0x86, 0x24, 0x4b, 0x0d, 0xc9, 0x14, 0x79, 0xc1, 0x24, 0xc8, 0x1c, 0xc5, 0xfd, 0x30, - 0xe3, 0xa3, 0x25, 0xb8, 0xd4, 0x17, 0x30, 0x27, 0x55, 0x71, 0xa9, 0xe7, 0x7b, 0xbd, 0x0b, 0xaa, - 0xbd, 0x23, 0xad, 0x7a, 0x02, 0xf2, 0xe2, 0x02, 0x04, 0x59, 0xcd, 0x6c, 0xb1, 0x7e, 0x4f, 0xca, - 0xf4, 0x37, 0x89, 0x15, 0x3a, 0x66, 0x9b, 0x9f, 0x80, 0x24, 0x3f, 0x09, 0x95, 0x3b, 0xb5, 0x0b, - 0x6c, 0xce, 0x4a, 0x5f, 0x4e, 0x79, 0x78, 0x5e, 0xa8, 0x10, 0xe5, 0xd5, 0x53, 0x37, 0xd3, 0xab, - 0xa7, 0xdf, 0x9a, 0x57, 0x97, 0xde, 0x4c, 0x79, 0x43, 0xea, 0xfa, 0xeb, 0x1b, 0x13, 0x01, 0xd1, - 0x2e, 0x76, 0x13, 0x9c, 0x9d, 0xd4, 0x65, 0x0f, 0x22, 0xd4, 0xca, 0x45, 0x24, 0x28, 0x26, 0x7c, - 0x49, 0x0d, 0xf4, 0x10, 0xf5, 0xf3, 0xe6, 0x36, 0x37, 0x0d, 0xf5, 0x98, 0x44, 0x8f, 0xcc, 0xa8, - 0x7d, 0xfe, 0xa5, 0x10, 0x08, 0x1b, 0x6e, 0x85, 0x02, 0x69, 0x3a, 0xbb, 0xfe, 0x04, 0x3c, 0xbd, - 0x28, 0x0a, 0xa4, 0x16, 0xa0, 0x41, 0x1b, 0x83, 0x2e, 0x42, 0x0e, 0x5f, 0xa5, 0xa7, 0x51, 0x59, - 0xb2, 0xe9, 0xd6, 0xa1, 0x8e, 0x18, 0x1b, 0x4e, 0xb3, 0x4a, 0x84, 0xf9, 0xbd, 0xfd, 0x7a, 0x85, - 0xf1, 0xdc, 0x67, 0x76, 0x75, 0x07, 0x77, 0x7b, 0xce, 0x9e, 0xcc, 0x51, 0xa4, 0x5f, 0x48, 0x13, - 0x7f, 0x18, 0xb0, 0x3f, 0x91, 0xe2, 0x15, 0x93, 0x26, 0xed, 0x0b, 0x91, 0x92, 0x89, 0xfc, 0x36, - 0x80, 0xb6, 0x6a, 0x2b, 0xd7, 0x54, 0xc3, 0xc1, 0x2d, 0x2e, 0xf7, 0x42, 0x5b, 0xb5, 0x9f, 0xa5, - 0x05, 0x24, 0xde, 0x24, 0xaf, 0xfb, 0x36, 0x6e, 0xd1, 0x01, 0xc8, 0xc8, 0x13, 0x6d, 0xd5, 0xde, - 0xb4, 0x71, 0xcb, 0xd7, 0xd7, 0x89, 0x9b, 0xd1, 0xd7, 0xa0, 0xbc, 0xf3, 0x61, 0x79, 0x7f, 0x2c, - 0xed, 0xcd, 0x0e, 0x2f, 0x7c, 0xf8, 0xf1, 0x94, 0xc5, 0x67, 0xe9, 0x9a, 0x22, 0xe8, 0x04, 0xd0, - 0x07, 0x60, 0xda, 0x9d, 0x95, 0x4a, 0x9f, 0xce, 0x56, 0xa1, 0x85, 0x07, 0x9b, 0xdc, 0x95, 0xab, - 0xc1, 0x62, 0x1b, 0xfd, 0x0c, 0x1c, 0x09, 0xd9, 0x20, 0xb7, 0x82, 0xf4, 0x81, 0x4c, 0xd1, 0xa1, - 0xa0, 0x29, 0x12, 0xf8, 0x9e, 0xf4, 0x32, 0x37, 0x65, 0xd6, 0xdc, 0x41, 0x42, 0x58, 0xbf, 0x7b, - 0x8b, 0xd2, 0x09, 0xe9, 0x8f, 0x53, 0x30, 0x15, 0x6a, 0x20, 0x7a, 0x14, 0xc6, 0x99, 0x07, 0x4e, - 0x8d, 0x4c, 0x84, 0x50, 0x89, 0xf3, 0x3e, 0x31, 0x06, 0x34, 0x0f, 0x79, 0xcc, 0xa3, 0x6b, 0x2e, - 0x94, 0x3b, 0x63, 0x82, 0x70, 0xce, 0xef, 0xb2, 0xa1, 0x45, 0x28, 0xb8, 0xa2, 0x8f, 0x59, 0xb9, - 0xb9, 0x23, 0xc7, 0x41, 0x3c, 0x46, 0x69, 0x01, 0x8a, 0xbe, 0xe6, 0xb1, 0xbb, 0x80, 0xbb, 0x7c, - 0xb9, 0xc5, 0x02, 0xe8, 0x7c, 0x57, 0xdd, 0xa5, 0x2b, 0x2d, 0x74, 0x04, 0x26, 0xc8, 0xcb, 0x36, - 0xbf, 0x2c, 0x95, 0x91, 0x73, 0x5d, 0x75, 0xf7, 0xbc, 0x6a, 0x4b, 0x1f, 0x4f, 0x41, 0x39, 0xd8, - 0x4e, 0x74, 0x2f, 0x20, 0x42, 0xab, 0xb6, 0xb1, 0x62, 0xf4, 0xbb, 0xcc, 0x47, 0x0a, 0xc4, 0xa9, - 0xae, 0xba, 0x3b, 0xdf, 0xc6, 0x17, 0xfb, 0x5d, 0x5a, 0xb5, 0x8d, 0x56, 0xa1, 0x22, 0x88, 0x45, - 0xb2, 0x8b, 0x4b, 0xe5, 0xe8, 0xe0, 0xf7, 0x6a, 0x38, 0x01, 0x5b, 0xeb, 0xbe, 0x42, 0xd6, 0xba, - 0x65, 0x86, 0x27, 0xde, 0x48, 0x0f, 0xc1, 0x54, 0xa8, 0xc7, 0x48, 0x82, 0xc9, 0x5e, 0x7f, 0x4b, - 0xb9, 0x82, 0xf7, 0xe8, 0xf5, 0x77, 0xa6, 0xea, 0x05, 0xb9, 0xd8, 0xeb, 0x6f, 0x3d, 0x8d, 0xf7, - 0x68, 0xee, 0x50, 0xd2, 0xa0, 0x1c, 0x5c, 0x4c, 0x11, 0xc7, 0x61, 0x99, 0x7d, 0xa3, 0x25, 0x3e, - 0x6c, 0x40, 0x1f, 0xd0, 0x59, 0x18, 0xbf, 0x6a, 0x32, 0x6d, 0x1e, 0xb5, 0x7a, 0xba, 0x6c, 0x3a, - 0xd8, 0xb7, 0x24, 0x63, 0x3c, 0x92, 0x0d, 0xe3, 0x54, 0x2f, 0x23, 0x37, 0x2a, 0x2e, 0x03, 0xa8, - 0x8e, 0x63, 0xe9, 0x5b, 0x7d, 0x0f, 0xbe, 0x3a, 0x37, 0x98, 0xd6, 0x9f, 0x5b, 0x53, 0x75, 0xab, - 0x79, 0x2b, 0xd7, 0xec, 0x59, 0x8f, 0xc7, 0xa7, 0xdd, 0x3e, 0x24, 0xe9, 0x8d, 0x2c, 0xe4, 0xd8, - 0x72, 0x13, 0x3d, 0x11, 0x4c, 0x7e, 0x14, 0xcf, 0x1c, 0x1b, 0xd6, 0x7c, 0x46, 0xc5, 0x5b, 0xef, - 0x46, 0x50, 0x77, 0x85, 0x33, 0x0a, 0xcd, 0xe2, 0x6b, 0xfb, 0xf5, 0x09, 0x1a, 0x7d, 0x2c, 0x2f, - 0x7a, 0xe9, 0x85, 0x61, 0xab, 0x6b, 0x91, 0xcb, 0xc8, 0x1e, 0x38, 0x97, 0x71, 0x01, 0x26, 0x7d, - 0xe1, 0x96, 0xde, 0xe2, 0xeb, 0x94, 0x63, 0xa3, 0x26, 0xdd, 0xf2, 0x22, 0x6f, 0x7f, 0xd1, 0x0d, - 0xc7, 0x96, 0x5b, 0xe8, 0x64, 0x70, 0x91, 0x4d, 0xa3, 0x36, 0x16, 0x2e, 0xf8, 0xd6, 0xcd, 0xf4, - 0x4e, 0xfe, 0x2d, 0x50, 0xa0, 0x17, 0x9b, 0x29, 0x09, 0x8b, 0x1e, 0xf2, 0xa4, 0x80, 0xbe, 0xbc, - 0x1b, 0xa6, 0xbc, 0xc0, 0x86, 0x91, 0xe4, 0x19, 0x8a, 0x57, 0x4c, 0x09, 0x1f, 0x80, 0x59, 0xfa, - 0x01, 0xbc, 0x30, 0x75, 0x81, 0x52, 0x23, 0xf2, 0xee, 0x72, 0x90, 0xe3, 0x4e, 0x28, 0x7b, 0x26, - 0x94, 0xd2, 0x02, 0x4b, 0x7d, 0xb8, 0xa5, 0x94, 0xec, 0x28, 0xe4, 0xdd, 0xb0, 0xb3, 0xc8, 0xbe, - 0xac, 0xa7, 0xb2, 0x68, 0xd3, 0x0d, 0x64, 0x2d, 0x6c, 0xf7, 0x3b, 0x0e, 0x07, 0x29, 0x51, 0x1a, - 0x1a, 0xc8, 0xca, 0xac, 0x9c, 0xd2, 0x9e, 0x80, 0x49, 0x61, 0x55, 0x18, 0xdd, 0x24, 0xa5, 0x2b, - 0x89, 0x42, 0x4a, 0x74, 0x0a, 0x2a, 0x3d, 0xcb, 0xec, 0x99, 0x36, 0xb6, 0x14, 0xb5, 0xd5, 0xb2, - 0xb0, 0x6d, 0x57, 0xcb, 0x0c, 0x4f, 0x94, 0xcf, 0xb3, 0x62, 0xe9, 0x3d, 0x30, 0x21, 0xe2, 0xe9, - 0x59, 0x18, 0x6f, 0xba, 0x16, 0x32, 0x2b, 0xb3, 0x07, 0xe2, 0x5f, 0xe7, 0x7b, 0x3d, 0x9e, 0x5d, - 0x23, 0x3f, 0xa5, 0x0e, 0x4c, 0xf0, 0x01, 0x8b, 0xcc, 0xa9, 0xac, 0x42, 0xa9, 0xa7, 0x5a, 0xa4, - 0x1b, 0xfe, 0xcc, 0xca, 0xb0, 0x15, 0xe1, 0x9a, 0x6a, 0x39, 0xeb, 0xd8, 0x09, 0x24, 0x58, 0x8a, - 0x94, 0x9f, 0x15, 0x49, 0x8f, 0xc1, 0x64, 0x80, 0xc6, 0xfb, 0x0e, 0x21, 0x9f, 0xe8, 0xf4, 0xc1, - 0x6d, 0x49, 0xda, 0x6b, 0x89, 0x74, 0x16, 0x0a, 0xee, 0x58, 0x91, 0x85, 0x86, 0x10, 0x05, 0xff, - 0xb0, 0x21, 0x7f, 0xa4, 0x49, 0x24, 0xf3, 0x1a, 0xff, 0x44, 0x53, 0x46, 0x66, 0x0f, 0x12, 0xf6, - 0x19, 0x26, 0xe6, 0xcd, 0xd0, 0xe3, 0x30, 0xc1, 0x0d, 0x13, 0x9f, 0x8f, 0xc3, 0xd2, 0x45, 0x6b, - 0xd4, 0x52, 0x89, 0x74, 0x11, 0xb3, 0x5b, 0x5e, 0x35, 0x69, 0x7f, 0x35, 0x1f, 0x82, 0xbc, 0x30, - 0x3e, 0x41, 0x2f, 0xc1, 0x6a, 0x38, 0x1e, 0xe7, 0x25, 0x78, 0x25, 0x1e, 0x23, 0xd1, 0x26, 0x5b, - 0x6f, 0x1b, 0xb8, 0xa5, 0x78, 0x53, 0x90, 0x5f, 0x98, 0x9d, 0x62, 0x2f, 0x56, 0xc4, 0xfc, 0x92, - 0x1e, 0x80, 0x1c, 0x6b, 0x6b, 0xa4, 0x89, 0x8b, 0x72, 0xad, 0xdf, 0x4d, 0x41, 0x5e, 0xb8, 0x8f, - 0x48, 0xa6, 0x40, 0x27, 0xd2, 0x37, 0xda, 0x89, 0x9b, 0x6f, 0x92, 0xee, 0x03, 0x44, 0x35, 0x45, - 0xb9, 0x6a, 0x3a, 0xba, 0xd1, 0x56, 0xd8, 0x58, 0xf0, 0x7b, 0x83, 0xf4, 0xcd, 0x65, 0xfa, 0x62, - 0x8d, 0x94, 0xdf, 0x73, 0x02, 0x8a, 0xbe, 0x2c, 0x17, 0x9a, 0x80, 0xcc, 0x45, 0x7c, 0xad, 0x32, - 0x86, 0x8a, 0x30, 0x21, 0x63, 0x9a, 0x23, 0xa8, 0xa4, 0xce, 0xbc, 0x31, 0x01, 0x53, 0xf3, 0xcd, - 0x85, 0xe5, 0xf9, 0x5e, 0xaf, 0xa3, 0xf3, 0xfb, 0x74, 0x97, 0x20, 0x4b, 0xd7, 0xc9, 0x09, 0xf6, - 0x77, 0x6a, 0x49, 0x12, 0x4e, 0x48, 0x86, 0x71, 0xba, 0x9c, 0x46, 0x49, 0xb6, 0x7d, 0x6a, 0x89, - 0xf2, 0x50, 0xa4, 0x91, 0x54, 0xe1, 0x12, 0xec, 0x06, 0xd5, 0x92, 0x24, 0xa7, 0xd0, 0xcf, 0x40, - 0xc1, 0x5b, 0x27, 0x27, 0xdd, 0x23, 0xaa, 0x25, 0x4e, 0x5b, 0x11, 0x7c, 0x6f, 0x65, 0x90, 0x74, - 0x6b, 0xa2, 0x96, 0x38, 0x5f, 0x83, 0x9e, 0x83, 0x09, 0xb1, 0x06, 0x4b, 0xb6, 0x8b, 0x53, 0x4b, - 0x98, 0x52, 0x22, 0xc3, 0xc7, 0x96, 0xce, 0x49, 0xb6, 0xaa, 0x6a, 0x89, 0xf2, 0x66, 0x68, 0x13, - 0x72, 0x3c, 0xf8, 0x4d, 0xb4, 0xd3, 0x53, 0x4b, 0x96, 0x28, 0x22, 0x42, 0xf6, 0x92, 0x13, 0x49, - 0xb7, 0xe7, 0x6a, 0x89, 0x13, 0x86, 0x48, 0x05, 0xf0, 0xad, 0xa7, 0x13, 0xef, 0xbb, 0xd5, 0x92, - 0x27, 0x02, 0xd1, 0x07, 0x21, 0xef, 0xae, 0x9a, 0x12, 0xee, 0xa4, 0xd5, 0x92, 0xe6, 0xe2, 0x9a, - 0x9b, 0x89, 0x4f, 0x49, 0xdc, 0x1b, 0x7b, 0x4a, 0xc2, 0xdb, 0xe4, 0x76, 0xb7, 0xc1, 0xff, 0x32, - 0x05, 0x47, 0xc3, 0xdb, 0xc9, 0xaa, 0xb1, 0x37, 0xe4, 0x40, 0xc0, 0x90, 0xd3, 0x22, 0x8f, 0x43, - 0x66, 0xde, 0xd8, 0x23, 0xc1, 0x06, 0xfd, 0xb6, 0x5f, 0xdf, 0xea, 0x88, 0x34, 0x1d, 0x79, 0xde, - 0xb4, 0x3a, 0xd1, 0xa7, 0x46, 0x1a, 0xd9, 0xef, 0x7f, 0xbe, 0x3e, 0xd6, 0xbc, 0x12, 0xd1, 0xab, - 0x98, 0xb3, 0x02, 0xf9, 0x79, 0x63, 0x4f, 0x1c, 0x13, 0x18, 0xa7, 0x1d, 0x3a, 0xe8, 0xf6, 0xff, - 0xeb, 0x25, 0x82, 0xec, 0xfb, 0x3e, 0x30, 0xef, 0x71, 0x8e, 0x3d, 0x0d, 0xd9, 0xe1, 0x8f, 0x3f, - 0x31, 0x50, 0x1b, 0x2e, 0x4d, 0xe9, 0x3c, 0x64, 0x17, 0x4c, 0x9d, 0x86, 0x3c, 0x2d, 0x6c, 0x98, - 0x5d, 0x91, 0xf3, 0xa4, 0x0f, 0xe8, 0x04, 0xe4, 0xd4, 0xae, 0xd9, 0x37, 0x1c, 0x11, 0x35, 0x13, - 0x57, 0xf2, 0x5f, 0xf7, 0xeb, 0x99, 0x65, 0xc3, 0x91, 0xf9, 0xab, 0x46, 0xf6, 0x2f, 0x5e, 0xad, - 0xa7, 0xa4, 0xa7, 0x60, 0x62, 0x11, 0x6b, 0x37, 0x82, 0xb5, 0x88, 0xb5, 0x10, 0xd6, 0x29, 0xc8, - 0x2f, 0x1b, 0x0e, 0xfb, 0x68, 0xd8, 0x6d, 0x90, 0xd1, 0x0d, 0xb6, 0x2d, 0x12, 0xaa, 0x9f, 0x94, - 0x13, 0xd2, 0x45, 0xac, 0xb9, 0xa4, 0x2d, 0xac, 0x85, 0x49, 0x09, 0x3c, 0x29, 0x97, 0x9a, 0x50, - 0xba, 0xac, 0x76, 0x78, 0xb8, 0x87, 0x6d, 0x74, 0x1f, 0x14, 0x54, 0xf1, 0x40, 0x57, 0x56, 0xa5, - 0x66, 0xf9, 0x07, 0xfb, 0x75, 0xf0, 0x88, 0x64, 0x8f, 0xa0, 0x91, 0x7d, 0xf9, 0xbf, 0x1d, 0x4f, - 0x49, 0x26, 0x4c, 0x9c, 0x57, 0x6d, 0x6a, 0xe9, 0x1f, 0x0c, 0x24, 0x52, 0x68, 0xa4, 0xd8, 0x3c, - 0x74, 0x7d, 0xbf, 0x3e, 0xbd, 0xa7, 0x76, 0x3b, 0x0d, 0xc9, 0x7b, 0x27, 0xf9, 0xf3, 0x2b, 0x73, - 0xbe, 0xfc, 0x0a, 0x8d, 0x24, 0x9b, 0x33, 0xd7, 0xf7, 0xeb, 0x53, 0x1e, 0x0f, 0x79, 0x23, 0xb9, - 0x49, 0x17, 0xa9, 0x07, 0x39, 0x16, 0xf4, 0x46, 0xee, 0x10, 0xf2, 0x94, 0x4f, 0xda, 0x4b, 0xf9, - 0x34, 0x0e, 0x94, 0x66, 0xe0, 0x71, 0x19, 0xe3, 0x68, 0x64, 0x3f, 0xfa, 0x6a, 0x7d, 0x4c, 0xb2, - 0x00, 0xad, 0xeb, 0xdd, 0x7e, 0x87, 0x5d, 0xfc, 0x16, 0x5b, 0x4d, 0x0f, 0xb2, 0x76, 0xd3, 0x74, - 0x12, 0x0b, 0xc8, 0xa6, 0xe6, 0xb8, 0x92, 0x72, 0x81, 0xb0, 0x38, 0xe3, 0x5b, 0xfb, 0xf5, 0x14, - 0x6d, 0x3d, 0x95, 0xd1, 0x5d, 0x90, 0x63, 0xa1, 0x3c, 0x8f, 0x7f, 0xca, 0x82, 0x87, 0xf5, 0x49, - 0xe6, 0x6f, 0xa5, 0x27, 0x60, 0x62, 0xd5, 0x6e, 0x2f, 0x92, 0x2e, 0x1d, 0x85, 0x7c, 0xd7, 0x6e, - 0x2b, 0xbe, 0x68, 0x6a, 0xa2, 0x6b, 0xb7, 0x37, 0x86, 0x44, 0x61, 0x7c, 0x58, 0xde, 0x0b, 0xb9, - 0x8d, 0x5d, 0xca, 0x7e, 0xc2, 0x95, 0x52, 0xc6, 0xdf, 0x46, 0x8e, 0x1e, 0x60, 0xfa, 0x48, 0x06, - 0x60, 0x63, 0xd7, 0xed, 0xe1, 0x90, 0x2d, 0x38, 0x24, 0x41, 0xce, 0xd9, 0x75, 0x23, 0xea, 0x42, - 0x13, 0x5e, 0xdb, 0xaf, 0xe7, 0x36, 0x76, 0xc9, 0xf2, 0x42, 0xe6, 0x6f, 0x82, 0xa9, 0xac, 0x4c, - 0x28, 0x95, 0xe5, 0x26, 0xf0, 0xb2, 0x11, 0x09, 0xbc, 0x71, 0xdf, 0x0e, 0xc0, 0x11, 0x98, 0xb0, - 0xd4, 0x6b, 0x0a, 0x19, 0x51, 0xf6, 0x15, 0xd2, 0x9c, 0xa5, 0x5e, 0x5b, 0x31, 0xdb, 0x68, 0x01, - 0xb2, 0x1d, 0xb3, 0x2d, 0xf2, 0x6e, 0x87, 0x45, 0xa7, 0x48, 0xc4, 0xc5, 0x4f, 0x13, 0xaf, 0x98, - 0xed, 0xe6, 0x11, 0x22, 0xff, 0x2f, 0xfd, 0x69, 0x7d, 0x2a, 0x58, 0x6e, 0xcb, 0x94, 0xd9, 0x4d, - 0x06, 0xe6, 0x87, 0x26, 0x03, 0x0b, 0xa3, 0x92, 0x81, 0x10, 0x4c, 0x06, 0xde, 0x41, 0xf7, 0x34, - 0xd9, 0x1e, 0xce, 0xec, 0x40, 0xf0, 0x39, 0x6f, 0xec, 0xd1, 0x5d, 0xd4, 0x5b, 0xa1, 0xe0, 0x1e, - 0x14, 0xe2, 0x9f, 0x7d, 0xf6, 0x0a, 0xb8, 0xbe, 0x7d, 0x34, 0x05, 0xe5, 0x60, 0x8b, 0x69, 0x3e, - 0xc7, 0x6e, 0xf3, 0x0f, 0xa6, 0xb2, 0xb4, 0x27, 0x51, 0x8a, 0x65, 0x91, 0x29, 0x0f, 0xe9, 0xfc, - 0x7c, 0x48, 0xe7, 0x67, 0x84, 0x80, 0xd8, 0xdd, 0x1d, 0xa6, 0xea, 0xb3, 0x5c, 0x3a, 0x25, 0x5f, - 0xa1, 0xed, 0xa9, 0x3e, 0xd5, 0x88, 0x9f, 0x85, 0xa2, 0xef, 0x6d, 0x64, 0x50, 0xff, 0x48, 0x44, - 0xb2, 0x63, 0xda, 0x1d, 0x10, 0xf1, 0x46, 0x6c, 0x21, 0x78, 0xa4, 0xae, 0xa2, 0x16, 0x5c, 0xa2, - 0xa4, 0xc7, 0x2b, 0x9a, 0x8b, 0x7f, 0xf2, 0x9d, 0x63, 0x63, 0x2f, 0xbf, 0x76, 0x6c, 0x6c, 0xe8, - 0xf9, 0x4c, 0x29, 0xfe, 0x0b, 0xf3, 0xae, 0x97, 0xf9, 0xd8, 0xfb, 0xe1, 0x56, 0x4e, 0x63, 0x3b, - 0xea, 0x15, 0xdd, 0x68, 0x8b, 0xbf, 0xdc, 0xdd, 0x94, 0x79, 0x6f, 0x78, 0xe9, 0x8d, 0xbb, 0x9d, - 0xb7, 0x7a, 0x68, 0xac, 0x16, 0xe5, 0x0d, 0xa5, 0xfd, 0x2c, 0xa0, 0x55, 0xbb, 0xbd, 0x60, 0x61, - 0xf6, 0xb1, 0x11, 0xbe, 0x4e, 0x0a, 0x5e, 0xf6, 0xe1, 0x36, 0xea, 0x96, 0xb9, 0x60, 0x5f, 0xdc, - 0xef, 0x46, 0x7b, 0x39, 0xa2, 0xc0, 0x15, 0xa1, 0x25, 0x00, 0x9a, 0x5e, 0xb1, 0x6d, 0x2f, 0x99, - 0x57, 0x0f, 0x63, 0x2c, 0xb8, 0x14, 0xb2, 0xea, 0x60, 0x5b, 0x8c, 0xb5, 0xc7, 0x88, 0x3e, 0x04, - 0x33, 0x5d, 0xdd, 0x50, 0x6c, 0xdc, 0xd9, 0x56, 0x5a, 0xb8, 0x43, 0x3f, 0xc5, 0xc2, 0x37, 0xee, - 0x0a, 0xcd, 0x15, 0xee, 0x98, 0xee, 0x8a, 0x1f, 0xb3, 0xb9, 0x65, 0xc3, 0xb9, 0xbe, 0x5f, 0xaf, - 0x31, 0xef, 0x10, 0x01, 0x29, 0xc9, 0xd3, 0x5d, 0xdd, 0x58, 0xc7, 0x9d, 0xed, 0x45, 0xb7, 0x0c, - 0xbd, 0x04, 0xd3, 0x9c, 0xc2, 0xf4, 0x92, 0x1e, 0xc4, 0xf6, 0x94, 0x9a, 0xab, 0xd7, 0xf7, 0xeb, - 0x55, 0x86, 0x36, 0x40, 0x22, 0xfd, 0x60, 0xbf, 0x7e, 0x7f, 0x82, 0x36, 0xcd, 0x6b, 0x9a, 0x70, - 0x8f, 0x15, 0x17, 0x84, 0x97, 0x90, 0xba, 0xbd, 0x04, 0xbd, 0xa8, 0x7b, 0x3c, 0x5c, 0xf7, 0x00, - 0x49, 0xd2, 0xba, 0x7d, 0xae, 0xd9, 0xcb, 0xe0, 0x8b, 0xba, 0x0f, 0x43, 0xae, 0xd7, 0xdf, 0x12, - 0xbb, 0x68, 0x05, 0x99, 0x3f, 0xa1, 0x93, 0xfe, 0x8d, 0xb4, 0xe2, 0x99, 0x92, 0x18, 0x4f, 0x12, - 0xab, 0xb8, 0x69, 0x4e, 0x16, 0xfb, 0xd1, 0xe8, 0xe3, 0x6b, 0x19, 0xa8, 0xac, 0xda, 0xed, 0xa5, - 0x96, 0xee, 0xdc, 0x64, 0xf5, 0xea, 0x45, 0x49, 0x87, 0x7a, 0xb3, 0xe6, 0xc2, 0xf5, 0xfd, 0x7a, - 0x99, 0x49, 0xe7, 0x66, 0xca, 0xa4, 0x0b, 0x53, 0x9e, 0x5e, 0x2a, 0x96, 0xea, 0x70, 0xf7, 0xd4, - 0x5c, 0x4c, 0xa8, 0x81, 0x8b, 0x58, 0xbb, 0xbe, 0x5f, 0x3f, 0xcc, 0x5a, 0x16, 0x82, 0x92, 0xe4, - 0xb2, 0x16, 0x98, 0x0b, 0x68, 0x37, 0x5a, 0xf1, 0xe9, 0xfe, 0x53, 0xf3, 0xc2, 0xdb, 0xa8, 0xf4, - 0x7c, 0xe8, 0xbe, 0x9a, 0x86, 0x22, 0x71, 0xf5, 0xac, 0x1c, 0x47, 0x4f, 0x85, 0xd4, 0x8f, 0x70, - 0x2a, 0xa4, 0xdf, 0x99, 0xa9, 0x70, 0x8f, 0x1b, 0x6b, 0x67, 0x86, 0xea, 0x7c, 0x30, 0xe4, 0xfe, - 0x8f, 0x19, 0x6a, 0x55, 0xe9, 0x0a, 0x52, 0xc6, 0xad, 0x77, 0x83, 0x00, 0x7f, 0x2e, 0x05, 0x87, - 0x3c, 0xf1, 0xd8, 0x96, 0x16, 0x92, 0xe2, 0x33, 0xd7, 0xf7, 0xeb, 0xb7, 0x86, 0xa5, 0xe8, 0x23, - 0xbb, 0x01, 0x49, 0xce, 0xb8, 0x40, 0xeb, 0x96, 0x16, 0xdd, 0x8e, 0x96, 0xed, 0xb8, 0xed, 0xc8, - 0x0c, 0x6f, 0x87, 0x8f, 0xec, 0x2d, 0xb5, 0x63, 0xd1, 0x76, 0x06, 0x07, 0x35, 0x9b, 0x70, 0x50, - 0xbf, 0x9e, 0x86, 0xc9, 0x55, 0xbb, 0xbd, 0x69, 0xb4, 0x7e, 0x32, 0x21, 0x0e, 0x3a, 0x21, 0x3e, - 0x9e, 0x82, 0xf2, 0x05, 0xdd, 0x76, 0x4c, 0x4b, 0xd7, 0xd4, 0x0e, 0x5d, 0xcd, 0x78, 0x67, 0x24, - 0x53, 0x07, 0x3f, 0x23, 0xf9, 0x08, 0xe4, 0xae, 0xaa, 0x1d, 0xf6, 0xef, 0x8a, 0x32, 0x74, 0x8f, - 0x30, 0xe4, 0x3b, 0xc2, 0x39, 0x60, 0x4e, 0xce, 0x9b, 0xf3, 0x3b, 0x69, 0x98, 0x0a, 0x05, 0x1e, - 0xa8, 0x09, 0x59, 0x6a, 0xd1, 0xd9, 0x82, 0x77, 0xee, 0x00, 0x71, 0x05, 0x59, 0x13, 0x53, 0x5e, - 0xf4, 0x53, 0x90, 0xef, 0xaa, 0xbb, 0xcc, 0x33, 0xb0, 0xf5, 0xcd, 0xfc, 0xc1, 0x70, 0xbc, 0xd5, - 0xab, 0xc0, 0x91, 0xe4, 0x89, 0xae, 0xba, 0x4b, 0xfd, 0x41, 0x0f, 0xa6, 0x48, 0xa9, 0xb6, 0xa3, - 0x1a, 0x6d, 0xec, 0x77, 0x3f, 0x17, 0x0e, 0x5c, 0xc9, 0x61, 0xaf, 0x12, 0x1f, 0x9c, 0x24, 0x4f, - 0x76, 0xd5, 0xdd, 0x05, 0x5a, 0x40, 0x6a, 0x6c, 0xe4, 0x5f, 0x79, 0xb5, 0x3e, 0x46, 0x25, 0xf6, - 0xef, 0x53, 0x00, 0x9e, 0xc4, 0xd0, 0x06, 0x54, 0x42, 0xee, 0x4b, 0x9c, 0x31, 0x8a, 0x0d, 0xf0, - 0xbc, 0x85, 0xed, 0x94, 0x16, 0x1a, 0x82, 0x0f, 0x42, 0x91, 0x9d, 0x12, 0x50, 0x68, 0x32, 0x3e, - 0x1d, 0x9b, 0x8c, 0x3f, 0x46, 0xb0, 0xae, 0xef, 0xd7, 0x11, 0xeb, 0x8e, 0x8f, 0x59, 0xa2, 0x29, - 0x7a, 0x60, 0x25, 0x84, 0x21, 0xd8, 0x97, 0xa2, 0x2f, 0xb6, 0xa0, 0x67, 0xcf, 0x4c, 0x43, 0xbf, - 0x82, 0x2d, 0x77, 0x8d, 0xcc, 0x1e, 0x51, 0x0d, 0xf2, 0xec, 0xab, 0x82, 0xce, 0x9e, 0xf8, 0x77, - 0x15, 0xe2, 0x99, 0x70, 0x5d, 0xc3, 0x5b, 0xb6, 0x2e, 0x46, 0x41, 0x16, 0x8f, 0xe8, 0x1c, 0x54, - 0x6c, 0xac, 0xf5, 0x2d, 0xdd, 0xd9, 0x53, 0x34, 0xd3, 0x70, 0x54, 0xcd, 0xe1, 0x4e, 0xfb, 0x96, - 0xeb, 0xfb, 0xf5, 0x23, 0xac, 0xad, 0x61, 0x0a, 0x49, 0x9e, 0x12, 0x45, 0x0b, 0xac, 0x84, 0xd4, - 0xd0, 0xc2, 0x8e, 0xaa, 0x77, 0x6c, 0xbe, 0xb0, 0x15, 0x8f, 0xbe, 0xbe, 0xfc, 0xf6, 0x84, 0x7f, - 0x33, 0xea, 0x1a, 0x54, 0xcc, 0x1e, 0xb6, 0x22, 0xec, 0xd1, 0x8a, 0x57, 0x73, 0x98, 0xe2, 0x06, - 0x4c, 0xc2, 0x94, 0xc0, 0x10, 0x16, 0xe1, 0x5c, 0xe0, 0xcc, 0x19, 0x8b, 0x1b, 0xd3, 0xe1, 0x2e, - 0x87, 0x29, 0x24, 0xff, 0x41, 0x33, 0x16, 0x5d, 0x1e, 0x86, 0xdc, 0x0b, 0xaa, 0xde, 0x11, 0x9f, - 0x5a, 0x95, 0xf9, 0x13, 0x5a, 0x86, 0x9c, 0xed, 0xa8, 0x4e, 0x9f, 0x85, 0xde, 0xe3, 0xcd, 0xf7, - 0x24, 0x6c, 0x73, 0xd3, 0x34, 0x5a, 0xeb, 0x94, 0x51, 0xe6, 0x00, 0xe8, 0x1c, 0xe4, 0x1c, 0xf3, - 0x0a, 0x36, 0xb8, 0x50, 0x0f, 0x34, 0xd3, 0x69, 0xa2, 0x8e, 0x71, 0x23, 0x07, 0x3c, 0xa3, 0xac, - 0xd8, 0x3b, 0xaa, 0x85, 0x6d, 0x16, 0x2a, 0x37, 0x97, 0x0f, 0x3c, 0x1d, 0x8f, 0x84, 0x3d, 0x05, - 0xc3, 0x93, 0xe4, 0x29, 0xb7, 0x68, 0x9d, 0x96, 0x84, 0x23, 0xe7, 0x89, 0x1b, 0x8a, 0x9c, 0xcf, - 0x41, 0xa5, 0x6f, 0x6c, 0x99, 0x06, 0xfd, 0x2c, 0x22, 0x4f, 0xd3, 0xe4, 0x8f, 0xa7, 0x4e, 0x66, - 0xfc, 0xa3, 0x15, 0xa6, 0x90, 0xe4, 0x29, 0xb7, 0x88, 0x9f, 0x7e, 0x6c, 0x41, 0xd9, 0xa3, 0xa2, - 0x53, 0xb6, 0x10, 0x3b, 0x65, 0x6f, 0xe7, 0x53, 0xf6, 0x50, 0xb8, 0x16, 0x6f, 0xd6, 0x4e, 0xba, - 0x85, 0x84, 0x0d, 0xbd, 0x3f, 0xb0, 0x8c, 0x04, 0x5e, 0xc3, 0x50, 0x2b, 0x93, 0x7c, 0x05, 0x59, - 0x7c, 0x47, 0x56, 0x90, 0x8d, 0xd2, 0x47, 0x5f, 0xad, 0x8f, 0xb9, 0x13, 0xf6, 0x17, 0xd3, 0x90, - 0x5b, 0xbc, 0x4c, 0xaf, 0x51, 0xfe, 0x98, 0x86, 0x0f, 0x3e, 0xeb, 0xf5, 0x3e, 0x98, 0x60, 0xb2, - 0xb0, 0xd1, 0x19, 0x18, 0xef, 0x91, 0x1f, 0x3c, 0xd7, 0x78, 0x78, 0x40, 0xa5, 0x29, 0x9d, 0x58, - 0x61, 0x52, 0x52, 0xe9, 0x0b, 0x19, 0x80, 0xc5, 0xcb, 0x97, 0x37, 0x2c, 0xbd, 0xd7, 0xc1, 0xce, - 0x4f, 0xc2, 0xeb, 0x77, 0x4f, 0x78, 0xed, 0x1b, 0xe3, 0xa7, 0xa1, 0xe8, 0x8d, 0x91, 0x8d, 0x1e, - 0x87, 0xbc, 0xc3, 0x7f, 0xf3, 0xa1, 0xae, 0x0d, 0x0e, 0xb5, 0x20, 0xe7, 0xc3, 0xed, 0x72, 0x48, - 0xff, 0x25, 0x0d, 0x10, 0x97, 0x9c, 0xf9, 0x31, 0x08, 0xc0, 0xcf, 0x41, 0x8e, 0x7b, 0x9c, 0xcc, - 0x0d, 0x45, 0xab, 0x9c, 0xdb, 0x37, 0x4a, 0xdf, 0x49, 0xc3, 0xcc, 0xa6, 0x30, 0xbb, 0x3f, 0x91, - 0x30, 0xba, 0x00, 0x13, 0xd8, 0x70, 0x2c, 0x1d, 0x8b, 0x34, 0xf8, 0xc9, 0xb0, 0x96, 0x46, 0x48, - 0x8b, 0xfe, 0xbb, 0x04, 0x71, 0x5a, 0x8e, 0xb3, 0xfb, 0x64, 0xfc, 0x89, 0x0c, 0x54, 0x87, 0x71, - 0xa1, 0x05, 0x98, 0xd2, 0x2c, 0x4c, 0x0b, 0x14, 0xff, 0xce, 0x49, 0xb3, 0xe6, 0xcb, 0x18, 0x05, - 0x09, 0x24, 0xb9, 0x2c, 0x4a, 0xb8, 0x43, 0x6e, 0xd3, 0x04, 0x15, 0x99, 0x2a, 0x84, 0x2a, 0x61, - 0x10, 0x2d, 0x71, 0x8f, 0xec, 0xa5, 0xa5, 0xfc, 0x00, 0xcc, 0x25, 0x97, 0xbd, 0x52, 0xea, 0x93, - 0x5f, 0x84, 0x29, 0xdd, 0xd0, 0x1d, 0x5d, 0xed, 0x28, 0x5b, 0x6a, 0x47, 0x35, 0xb4, 0x1b, 0x59, - 0x8a, 0x30, 0x6f, 0xca, 0xab, 0x0d, 0xc1, 0x49, 0x72, 0x99, 0x97, 0x34, 0x59, 0x01, 0x19, 0x11, - 0x51, 0x55, 0xf6, 0x86, 0x02, 0x37, 0xc1, 0xee, 0x1b, 0x91, 0x5f, 0xca, 0xc0, 0xb4, 0x9b, 0x9f, - 0xf9, 0xc9, 0x50, 0x24, 0x1d, 0x8a, 0x55, 0x00, 0x66, 0x40, 0x88, 0xe7, 0xb8, 0x81, 0xd1, 0x20, - 0x26, 0xa8, 0xc0, 0x10, 0x16, 0x6d, 0xc7, 0x37, 0x1e, 0x7f, 0x9e, 0x81, 0x92, 0x7f, 0x3c, 0x7e, - 0xe2, 0xd2, 0xdf, 0x45, 0x19, 0xb3, 0x79, 0xcf, 0x24, 0x66, 0xf9, 0x77, 0x51, 0x42, 0x26, 0x71, - 0x60, 0x2a, 0x0d, 0xb7, 0x85, 0x7f, 0x95, 0x86, 0x1c, 0x3f, 0x97, 0xad, 0x0d, 0xac, 0x22, 0x52, - 0x71, 0xe7, 0xbe, 0x47, 0x2f, 0x22, 0x5e, 0x89, 0x5c, 0x44, 0x94, 0xbb, 0xea, 0xae, 0x12, 0xb8, - 0xc5, 0x94, 0x3a, 0x39, 0xd9, 0x3c, 0xea, 0xa1, 0x04, 0xdf, 0xb3, 0x5c, 0x88, 0x77, 0x26, 0x17, - 0x3d, 0x02, 0x45, 0x42, 0xe1, 0x79, 0x05, 0xc2, 0x7e, 0xd8, 0x4b, 0x3e, 0xf8, 0x5e, 0x4a, 0x32, - 0x74, 0xd5, 0xdd, 0x25, 0xf6, 0x80, 0x56, 0x00, 0xed, 0xb8, 0xa9, 0x2f, 0xc5, 0x13, 0x21, 0xe1, - 0xbf, 0xed, 0xfa, 0x7e, 0xfd, 0x28, 0xe3, 0x1f, 0xa4, 0x91, 0xe4, 0x69, 0xaf, 0x50, 0xa0, 0x3d, - 0x08, 0x40, 0xfa, 0xa5, 0xb0, 0x33, 0x21, 0x6c, 0x09, 0xeb, 0x3b, 0x28, 0xe1, 0xbd, 0x93, 0xe4, - 0x02, 0x79, 0x58, 0x24, 0xbf, 0x7d, 0x82, 0xff, 0xe5, 0x14, 0x20, 0xcf, 0xf7, 0xb8, 0xfb, 0xf5, - 0xef, 0xa7, 0xf7, 0x12, 0xc5, 0xca, 0x28, 0x15, 0xbd, 0xc8, 0xf2, 0xf8, 0xc4, 0x22, 0xcb, 0x37, - 0x55, 0xef, 0xf3, 0xec, 0x73, 0x7a, 0x68, 0x56, 0x30, 0xc2, 0x06, 0xff, 0xeb, 0x14, 0x1c, 0x1d, - 0x50, 0x1c, 0xb7, 0x5d, 0x97, 0x01, 0x59, 0xbe, 0x97, 0xfc, 0x3f, 0x14, 0xa5, 0xf8, 0x7f, 0xfc, - 0x4b, 0xa8, 0x7f, 0xd3, 0xd6, 0x80, 0x8d, 0xbf, 0x79, 0xde, 0x84, 0x67, 0x14, 0x53, 0x30, 0xeb, - 0xaf, 0xde, 0xed, 0xc0, 0x39, 0x28, 0xf9, 0x6b, 0xe7, 0x4d, 0xbf, 0x75, 0x54, 0xd3, 0x79, 0xab, - 0x03, 0x7c, 0x68, 0xd9, 0x9b, 0x7d, 0xe2, 0x9f, 0x4e, 0xc6, 0xf5, 0xde, 0x3d, 0xc8, 0x16, 0x9a, - 0x85, 0xac, 0xc5, 0xff, 0x2f, 0x05, 0xd9, 0x35, 0xd3, 0xec, 0x20, 0x13, 0xa6, 0x0d, 0xd3, 0x51, - 0x88, 0xb2, 0xe0, 0x96, 0xc2, 0x73, 0x23, 0x2c, 0x0b, 0xba, 0x70, 0x30, 0xa1, 0x7c, 0x6f, 0xbf, - 0x3e, 0x08, 0x25, 0x4f, 0x19, 0xa6, 0xd3, 0xa4, 0x25, 0x1b, 0x2c, 0x73, 0xf2, 0x21, 0x98, 0x0c, - 0x56, 0xc6, 0x32, 0x45, 0xcf, 0x1e, 0xb8, 0xb2, 0x20, 0xcc, 0xf5, 0xfd, 0xfa, 0xac, 0x37, 0x09, - 0xdc, 0x62, 0x49, 0x2e, 0x6d, 0xf9, 0x6a, 0x6f, 0xe4, 0x49, 0xef, 0xbf, 0xff, 0x6a, 0x3d, 0xd5, - 0x3c, 0x37, 0xf4, 0x04, 0xc0, 0x7d, 0x23, 0x9b, 0xb0, 0xeb, 0x6e, 0xf5, 0x07, 0xcf, 0x02, 0x7c, - 0xea, 0x34, 0xd4, 0x42, 0x67, 0x01, 0xe8, 0x3d, 0xe4, 0x21, 0x27, 0x01, 0x46, 0xff, 0x03, 0xff, - 0x21, 0x07, 0x05, 0x46, 0x1e, 0x36, 0x90, 0xae, 0xc0, 0x61, 0x7a, 0x94, 0xd3, 0x33, 0x5b, 0xe2, - 0x2b, 0x31, 0x87, 0xdd, 0x04, 0x5a, 0x8a, 0xff, 0xbf, 0x70, 0x96, 0x0d, 0x7b, 0x0c, 0xc0, 0xab, - 0xd9, 0xbd, 0x70, 0xc3, 0x5b, 0xca, 0x5a, 0xcf, 0xfe, 0x91, 0x3f, 0x85, 0x91, 0x7d, 0xc4, 0xd2, - 0xaf, 0xa5, 0xe0, 0xc8, 0x40, 0x6d, 0x5c, 0xeb, 0x9f, 0x0c, 0x5c, 0x18, 0x4d, 0x25, 0xcb, 0xd1, - 0xfb, 0xbf, 0xfc, 0xd0, 0x88, 0x68, 0x57, 0x2d, 0xaa, 0x5d, 0xac, 0xc2, 0x40, 0xc3, 0x5e, 0x84, - 0x43, 0xc1, 0x76, 0x09, 0x21, 0x3c, 0x07, 0xe5, 0xe0, 0x6a, 0x81, 0x87, 0x12, 0xef, 0x39, 0xb8, - 0x87, 0x9c, 0x0c, 0xac, 0x18, 0xa4, 0x67, 0xc3, 0x82, 0x77, 0x25, 0xf1, 0xbe, 0xc1, 0xc3, 0xf7, - 0xb1, 0x82, 0xf0, 0xdd, 0xcd, 0xfa, 0x6a, 0x0a, 0x8e, 0x07, 0x91, 0x3d, 0x23, 0x6c, 0xbf, 0xed, - 0xfd, 0x7a, 0x2b, 0xea, 0xf1, 0x9f, 0x52, 0x70, 0xfb, 0x88, 0x96, 0x73, 0xf1, 0x58, 0x30, 0xeb, - 0xb3, 0xee, 0x16, 0x2f, 0x16, 0x2a, 0x23, 0x0d, 0xf7, 0x40, 0xae, 0x71, 0xbb, 0x85, 0x1f, 0x45, - 0x9a, 0x19, 0x7c, 0x67, 0xcb, 0x33, 0x83, 0x16, 0xf9, 0xad, 0xe9, 0xd6, 0x37, 0x52, 0x70, 0x2a, - 0xd8, 0xab, 0x88, 0x15, 0xdd, 0xbb, 0x7b, 0x60, 0xfe, 0x4d, 0x0a, 0xee, 0x49, 0xd2, 0x05, 0x3e, - 0x42, 0xcf, 0xc3, 0x8c, 0x17, 0x5f, 0x85, 0x07, 0xe8, 0x44, 0x82, 0x55, 0x31, 0x57, 0x6a, 0xe4, - 0xa2, 0xdc, 0x9c, 0x91, 0xf8, 0xa3, 0x14, 0x9f, 0x73, 0xfe, 0x71, 0x77, 0xc5, 0x1e, 0x5c, 0x12, - 0x1c, 0x50, 0xec, 0xbe, 0x65, 0xc1, 0x64, 0x60, 0x59, 0x10, 0x31, 0xa0, 0xe9, 0x9b, 0x64, 0x41, - 0x0c, 0x6e, 0x4c, 0x23, 0x62, 0xb3, 0x75, 0x98, 0x89, 0x98, 0x23, 0xee, 0x85, 0xd3, 0xd8, 0x29, - 0x22, 0xa3, 0xc1, 0x59, 0x20, 0xfd, 0xe7, 0x14, 0xd4, 0x69, 0x85, 0x11, 0x23, 0xf6, 0x37, 0x59, - 0x8e, 0x98, 0xdb, 0xcb, 0xc8, 0x6e, 0x71, 0x81, 0xce, 0x43, 0x8e, 0x29, 0x23, 0x97, 0xe1, 0x01, - 0xb4, 0x98, 0x33, 0x7a, 0x76, 0x79, 0x51, 0xf4, 0x2b, 0x7a, 0xfa, 0xbf, 0x4d, 0xf2, 0x7b, 0x0b, - 0xd3, 0xff, 0x5f, 0x09, 0xbb, 0x1c, 0xdd, 0x72, 0x2e, 0xa2, 0x0f, 0xbe, 0x65, 0xbb, 0xcc, 0x3f, - 0x18, 0xf4, 0xb6, 0x19, 0x60, 0xb7, 0xf9, 0x31, 0x06, 0xf8, 0xdd, 0x37, 0x02, 0xae, 0x01, 0x8e, - 0xe9, 0xc2, 0xbb, 0xdc, 0x00, 0x5f, 0x4f, 0xc3, 0x51, 0xda, 0x0d, 0xff, 0xc2, 0xe3, 0x1d, 0x90, - 0xbc, 0x02, 0xc8, 0xb6, 0x34, 0xe5, 0x66, 0xd9, 0x8f, 0x8a, 0x6d, 0x69, 0x97, 0x03, 0xbe, 0x55, - 0x01, 0xd4, 0xb2, 0x9d, 0x70, 0x05, 0x99, 0x1b, 0xae, 0xa0, 0x65, 0x3b, 0x97, 0x47, 0x38, 0xef, - 0xec, 0x41, 0x74, 0xe7, 0x0f, 0x52, 0x50, 0x8b, 0x12, 0x3a, 0xd7, 0x15, 0x15, 0x0e, 0x07, 0x96, - 0xcb, 0x61, 0x75, 0xb9, 0x63, 0xd4, 0xa2, 0x31, 0x34, 0x75, 0x0f, 0x59, 0xf8, 0x66, 0x4f, 0xde, - 0xaf, 0x08, 0xa7, 0xe3, 0x6a, 0xfe, 0xe0, 0x4a, 0xe5, 0x5d, 0x39, 0x65, 0x7f, 0x73, 0xc0, 0xdc, - 0xbf, 0xdb, 0x16, 0x3d, 0x7f, 0x9c, 0x82, 0x63, 0x43, 0x5a, 0xf8, 0x37, 0xd9, 0x9d, 0xff, 0xec, - 0x50, 0x85, 0xb9, 0x59, 0x2b, 0xac, 0x07, 0xf9, 0x84, 0x0a, 0x1e, 0x4f, 0xf3, 0xad, 0x9b, 0x23, - 0x3f, 0x25, 0xf7, 0x0c, 0xdc, 0x12, 0xc9, 0xc5, 0xdb, 0x74, 0x06, 0xb2, 0x3b, 0xba, 0xed, 0xb8, - 0xdf, 0x57, 0x08, 0x35, 0x27, 0xc4, 0x45, 0x69, 0x25, 0x04, 0x15, 0x0a, 0xb9, 0x66, 0x9a, 0x1d, - 0x5e, 0xbd, 0xb4, 0x00, 0xd3, 0xbe, 0x32, 0x0e, 0x3e, 0x07, 0xd9, 0x9e, 0x69, 0x76, 0x38, 0xf8, - 0x6c, 0x18, 0x9c, 0xd0, 0xf2, 0x6e, 0x52, 0x3a, 0x69, 0x16, 0x10, 0x03, 0x61, 0x5f, 0xfe, 0xe0, - 0xd0, 0x4f, 0xc3, 0x4c, 0xa0, 0xd4, 0xbd, 0x9a, 0x94, 0x0b, 0x7c, 0x33, 0x6a, 0x60, 0x23, 0x9e, - 0xd1, 0xbb, 0x97, 0xd0, 0xe9, 0xd3, 0x99, 0x3f, 0x2c, 0x89, 0xfb, 0xa8, 0x0a, 0x80, 0x2f, 0x69, - 0x7a, 0x57, 0x98, 0x3b, 0x3a, 0x3d, 0x51, 0xbb, 0x3b, 0x96, 0x8e, 0x87, 0xad, 0x63, 0xe8, 0xa7, - 0xfc, 0x07, 0x9e, 0xee, 0x1c, 0xcd, 0x27, 0xe0, 0xef, 0x8a, 0x23, 0x73, 0xd1, 0xff, 0x16, 0xcc, - 0x46, 0xad, 0x57, 0xd1, 0x03, 0xa3, 0x11, 0x06, 0x43, 0x8f, 0xda, 0x7b, 0x0e, 0xc0, 0xe1, 0x56, - 0xff, 0x4a, 0x0a, 0x6e, 0x1b, 0xb9, 0x2c, 0x43, 0x8f, 0x8d, 0x86, 0x1d, 0x11, 0x0c, 0xd5, 0x1a, - 0x37, 0xc2, 0xea, 0x36, 0x4d, 0x09, 0xec, 0xbc, 0x47, 0x4b, 0x74, 0x60, 0x09, 0x31, 0x64, 0x60, - 0x07, 0xc3, 0x45, 0x69, 0x0c, 0xbd, 0x14, 0xbd, 0x03, 0x7d, 0x3a, 0x12, 0x61, 0xf8, 0xaa, 0xa5, - 0xf6, 0x40, 0x72, 0x06, 0xff, 0xb0, 0x47, 0x85, 0xc3, 0x43, 0x86, 0x7d, 0x44, 0xcc, 0x3f, 0x64, - 0xd8, 0x47, 0xc5, 0xda, 0x7c, 0xd8, 0x47, 0x06, 0x83, 0x43, 0x86, 0x3d, 0x49, 0x0c, 0x3c, 0x64, - 0xd8, 0x13, 0xc5, 0x9e, 0xd2, 0x18, 0xda, 0x81, 0xc9, 0x40, 0xa8, 0x81, 0x4e, 0x45, 0xc2, 0x45, - 0xc5, 0x80, 0xb5, 0x7b, 0x92, 0x90, 0xfa, 0xc7, 0x3f, 0xc2, 0xbb, 0x0e, 0x19, 0xff, 0xe1, 0x01, - 0x44, 0xed, 0x81, 0xe4, 0x0c, 0x6e, 0xdd, 0xd7, 0xdc, 0x4d, 0x11, 0x1f, 0x01, 0x9a, 0x4b, 0x88, - 0x24, 0x6a, 0x3e, 0x9d, 0x98, 0xde, 0xad, 0xf8, 0xca, 0xc0, 0xb9, 0xe8, 0x68, 0xa1, 0x45, 0x7a, - 0xa7, 0xda, 0xbd, 0x89, 0x68, 0xdd, 0xca, 0x56, 0x79, 0xc6, 0xff, 0x78, 0x24, 0x9b, 0xcf, 0xef, - 0xd4, 0x6e, 0x1f, 0x41, 0xe1, 0xc2, 0xad, 0xbb, 0x5b, 0x78, 0x52, 0x34, 0xb9, 0xdf, 0xdf, 0xd4, - 0x4e, 0x8c, 0xa4, 0x11, 0xa0, 0x37, 0x3d, 0x29, 0xff, 0xe5, 0xfc, 0xc0, 0x05, 0xbd, 0x36, 0x36, - 0xb0, 0xad, 0xdb, 0x07, 0xba, 0xa0, 0x37, 0x3a, 0xef, 0xfe, 0xf3, 0x39, 0x28, 0x9d, 0x67, 0xa8, - 0xf4, 0xab, 0xc4, 0xe8, 0x89, 0x84, 0x5e, 0xb4, 0x4c, 0xbc, 0xe8, 0x0f, 0xf6, 0xeb, 0x5c, 0x90, - 0xc2, 0x9f, 0x22, 0x9b, 0x7f, 0x9e, 0x88, 0x7d, 0x5a, 0xc4, 0xfb, 0xbe, 0x4b, 0xe9, 0x40, 0x87, - 0x4b, 0xd9, 0xae, 0x3e, 0x3f, 0xcf, 0x19, 0xc6, 0x93, 0xd8, 0x97, 0x8e, 0x36, 0x48, 0x09, 0xfd, - 0x38, 0x09, 0xfa, 0x54, 0x0a, 0x0e, 0x51, 0x2a, 0x2f, 0x96, 0xa3, 0x94, 0xe2, 0x08, 0xcc, 0xc0, - 0x28, 0xaf, 0xa8, 0xbe, 0x95, 0x0d, 0xc5, 0x68, 0x36, 0xf8, 0xce, 0xec, 0xad, 0xbe, 0x4a, 0xc3, - 0x70, 0xd2, 0x0f, 0xf6, 0xeb, 0x68, 0x90, 0x57, 0xa6, 0x9f, 0xd2, 0x0c, 0x96, 0x45, 0x7f, 0x50, - 0x7a, 0x44, 0x78, 0x37, 0xcd, 0x05, 0xea, 0xc5, 0x08, 0x81, 0x08, 0x7b, 0x0d, 0x8a, 0x3e, 0xe3, - 0x53, 0x1d, 0x1f, 0x72, 0x00, 0xcd, 0x5b, 0x3a, 0x23, 0x8e, 0xe7, 0xf3, 0x7d, 0xb2, 0x1f, 0x02, - 0xfd, 0x6a, 0x0a, 0x0e, 0x79, 0xcb, 0x73, 0x3f, 0x78, 0x2e, 0xf9, 0x02, 0xfd, 0x6c, 0x50, 0x6a, - 0x91, 0x78, 0x44, 0x6a, 0x51, 0x0e, 0x52, 0x9e, 0xed, 0x47, 0x39, 0x8c, 0xe7, 0x60, 0xd2, 0xbf, - 0x7e, 0xf3, 0x3e, 0x33, 0x38, 0x6a, 0xe3, 0x71, 0x96, 0xf7, 0x36, 0x70, 0x08, 0x43, 0x0e, 0x02, - 0xa1, 0x1a, 0xe4, 0xf1, 0x6e, 0xcf, 0xb4, 0x1c, 0xdc, 0xa2, 0xa7, 0x86, 0xf3, 0xb2, 0xfb, 0x2c, - 0x5d, 0x83, 0x88, 0x81, 0x45, 0x4f, 0x87, 0xbe, 0x91, 0x74, 0x23, 0xeb, 0x82, 0xc1, 0xcf, 0x2a, - 0xf9, 0xbf, 0x77, 0x74, 0xb3, 0xcd, 0xc6, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x80, 0x62, 0x08, - 0xbb, 0x61, 0x9b, 0x00, 0x00, + // 9710 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x1f, 0xf6, 0x03, 0x8b, 0xdd, 0xb7, 0x8b, 0xdd, 0x45, 0x03, 0x77, 0xb7, 0xb7, 0x24, 0x6f, + 0x8f, 0x73, 0x24, 0x0f, 0xc7, 0x0f, 0x1c, 0x75, 0xe2, 0xd7, 0xed, 0x51, 0xa4, 0xb0, 0x00, 0xee, + 0x0e, 0x24, 0x70, 0x07, 0x0e, 0x80, 0x23, 0x45, 0xd9, 0x5e, 0x0f, 0x66, 0x1b, 0x8b, 0xe1, 0xed, + 0xce, 0x2c, 0x67, 0x66, 0xef, 0x00, 0x96, 0x52, 0xc5, 0x94, 0x65, 0x5b, 0x72, 0x64, 0x4b, 0x56, + 0x6c, 0x47, 0x56, 0x24, 0x99, 0x52, 0x2a, 0x91, 0xa3, 0x24, 0xfe, 0x48, 0x14, 0x7d, 0xd8, 0xf9, + 0x43, 0x29, 0x27, 0xb1, 0x52, 0xe5, 0x4a, 0x49, 0x89, 0x93, 0x72, 0xa5, 0x52, 0xb0, 0x45, 0xaa, + 0xca, 0x8e, 0xc2, 0x24, 0xca, 0x85, 0x76, 0xb9, 0xa4, 0x3f, 0x92, 0xea, 0xaf, 0xf9, 0xda, 0xd9, + 0x9d, 0xc1, 0xf1, 0x48, 0xd1, 0x25, 0xfe, 0x85, 0x9d, 0x9e, 0xf7, 0x7e, 0xdd, 0xfd, 0xfa, 0xf5, + 0x7b, 0xaf, 0x5f, 0x77, 0x0f, 0xe0, 0x4b, 0x49, 0xb8, 0x43, 0x35, 0xac, 0xae, 0x61, 0x9d, 0x7e, + 0xb1, 0x8f, 0xcd, 0xbd, 0xd3, 0x3d, 0xa5, 0xad, 0xe9, 0x8a, 0xad, 0x19, 0xfa, 0x5c, 0xcf, 0x34, + 0x6c, 0x03, 0x15, 0xd8, 0xeb, 0x39, 0xfa, 0x5a, 0xd2, 0x21, 0xbf, 0xa6, 0xb4, 0xb1, 0x8c, 0x5f, + 0xec, 0x63, 0xcb, 0x46, 0x65, 0x48, 0x5d, 0xc5, 0x7b, 0x95, 0xc4, 0xf1, 0xc4, 0x6c, 0x41, 0x26, + 0x3f, 0xd1, 0x61, 0xc8, 0x18, 0xdb, 0xdb, 0x16, 0xb6, 0x2b, 0xc9, 0xe3, 0x89, 0xd9, 0xb4, 0xcc, + 0x9f, 0xd0, 0x0c, 0x8c, 0x77, 0xb4, 0xae, 0x66, 0x57, 0x52, 0xb4, 0x98, 0x3d, 0xa0, 0x1a, 0xe4, + 0x55, 0xa3, 0xaf, 0xdb, 0x4d, 0xdb, 0xb0, 0x95, 0x4e, 0x25, 0x7d, 0x3c, 0x31, 0x9b, 0x95, 0x81, + 0x16, 0x6d, 0x90, 0x12, 0xe9, 0x49, 0x28, 0xb0, 0xfa, 0xac, 0x9e, 0xa1, 0x5b, 0x18, 0x1d, 0x85, + 0xac, 0x8e, 0x77, 0xed, 0xa6, 0x5b, 0xeb, 0x04, 0x79, 0x7e, 0x1a, 0xef, 0x91, 0x1a, 0x18, 0x0a, + 0xab, 0x98, 0x3d, 0x34, 0x1a, 0xdf, 0x7c, 0xf5, 0x58, 0xe2, 0x5b, 0xaf, 0x1e, 0x4b, 0xfc, 0xd9, + 0xab, 0xc7, 0x12, 0x9f, 0x78, 0xed, 0xd8, 0xd8, 0xb7, 0x5e, 0x3b, 0x36, 0xf6, 0x27, 0xaf, 0x1d, + 0x1b, 0x7b, 0x7e, 0xb6, 0xad, 0xd9, 0x3b, 0xfd, 0xad, 0x39, 0xd5, 0xe8, 0x9e, 0xe6, 0x22, 0x60, + 0x7f, 0x1e, 0xb0, 0x5a, 0x57, 0x4f, 0xdb, 0x7b, 0x3d, 0xcc, 0x65, 0xb2, 0x95, 0xa1, 0x92, 0x78, + 0x2f, 0xfc, 0xc1, 0x39, 0x38, 0xde, 0x36, 0x8c, 0x76, 0x07, 0x9f, 0xa6, 0x25, 0x5b, 0xfd, 0xed, + 0xd3, 0x2d, 0x6c, 0xa9, 0xa6, 0xd6, 0xb3, 0x0d, 0x93, 0xcb, 0xab, 0xc4, 0x28, 0xe6, 0x04, 0x85, + 0xb4, 0x0a, 0x53, 0xe7, 0xb5, 0x0e, 0x5e, 0x74, 0x08, 0xd7, 0xb1, 0x8d, 0x1e, 0x83, 0xf4, 0xb6, + 0xd6, 0xc1, 0x95, 0xc4, 0xf1, 0xd4, 0x6c, 0xfe, 0xcc, 0x5d, 0x73, 0x01, 0xa6, 0x39, 0x3f, 0xc7, + 0x1a, 0x29, 0x96, 0x29, 0x87, 0xf4, 0xdd, 0x34, 0x4c, 0x87, 0xbc, 0x45, 0x08, 0xd2, 0xba, 0xd2, + 0xc5, 0x54, 0x2a, 0x39, 0x99, 0xfe, 0x46, 0x15, 0x98, 0xe8, 0x29, 0xea, 0x55, 0xa5, 0x8d, 0xa9, + 0x50, 0x72, 0xb2, 0x78, 0x44, 0xc7, 0x00, 0x5a, 0xb8, 0x87, 0xf5, 0x16, 0xd6, 0xd5, 0xbd, 0x4a, + 0xea, 0x78, 0x6a, 0x36, 0x27, 0x7b, 0x4a, 0xd0, 0x7d, 0x30, 0xd5, 0xeb, 0x6f, 0x75, 0x34, 0xb5, + 0xe9, 0x21, 0x83, 0xe3, 0xa9, 0xd9, 0x71, 0xb9, 0xcc, 0x5e, 0x2c, 0xba, 0xc4, 0x27, 0xa1, 0x74, + 0x1d, 0x2b, 0x57, 0xbd, 0xa4, 0x79, 0x4a, 0x5a, 0x24, 0xc5, 0x1e, 0xc2, 0x05, 0x28, 0x74, 0xb1, + 0x65, 0x29, 0x6d, 0xdc, 0x24, 0xf2, 0xad, 0xa4, 0x69, 0xef, 0x8f, 0x0f, 0xf4, 0x3e, 0xd8, 0xf3, + 0x3c, 0xe7, 0xda, 0xd8, 0xeb, 0x61, 0x34, 0x0f, 0x39, 0xac, 0xf7, 0xbb, 0x0c, 0x61, 0x7c, 0x88, + 0xfc, 0x96, 0xf4, 0x7e, 0x37, 0x88, 0x92, 0x25, 0x6c, 0x1c, 0x62, 0xc2, 0xc2, 0xe6, 0x35, 0x4d, + 0xc5, 0x95, 0x0c, 0x05, 0x38, 0x39, 0x00, 0xb0, 0xce, 0xde, 0x07, 0x31, 0x04, 0x1f, 0x5a, 0x80, + 0x1c, 0xde, 0xb5, 0xb1, 0x6e, 0x69, 0x86, 0x5e, 0x99, 0xa0, 0x20, 0x77, 0x87, 0x8c, 0x22, 0xee, + 0xb4, 0x82, 0x10, 0x2e, 0x1f, 0x7a, 0x04, 0x26, 0x8c, 0x1e, 0x99, 0x6b, 0x56, 0x25, 0x7b, 0x3c, + 0x31, 0x9b, 0x3f, 0x73, 0x7b, 0xa8, 0x22, 0x5c, 0x66, 0x34, 0xb2, 0x20, 0x46, 0xcb, 0x50, 0xb6, + 0x8c, 0xbe, 0xa9, 0xe2, 0xa6, 0x6a, 0xb4, 0x70, 0x53, 0xd3, 0xb7, 0x8d, 0x4a, 0x8e, 0x02, 0xd4, + 0x06, 0x3b, 0x42, 0x09, 0x17, 0x8c, 0x16, 0x5e, 0xd6, 0xb7, 0x0d, 0xb9, 0x68, 0xf9, 0x9e, 0xc9, + 0x7c, 0xb5, 0xf6, 0x74, 0x5b, 0xd9, 0xad, 0x14, 0xa8, 0x86, 0xf0, 0x27, 0xe9, 0xeb, 0x19, 0x28, + 0xc5, 0x51, 0xb1, 0x73, 0x30, 0xbe, 0x4d, 0x7a, 0x59, 0x49, 0x1e, 0x44, 0x06, 0x8c, 0xc7, 0x2f, + 0xc4, 0xcc, 0x4d, 0x0a, 0x71, 0x1e, 0xf2, 0x3a, 0xb6, 0x6c, 0xdc, 0x62, 0x1a, 0x91, 0x8a, 0xa9, + 0x53, 0xc0, 0x98, 0x06, 0x55, 0x2a, 0x7d, 0x53, 0x2a, 0xf5, 0x1c, 0x94, 0x9c, 0x26, 0x35, 0x4d, + 0x45, 0x6f, 0x0b, 0xdd, 0x3c, 0x1d, 0xd5, 0x92, 0xb9, 0x25, 0xc1, 0x27, 0x13, 0x36, 0xb9, 0x88, + 0x7d, 0xcf, 0x68, 0x11, 0xc0, 0xd0, 0xb1, 0xb1, 0xdd, 0x6c, 0x61, 0xb5, 0x53, 0xc9, 0x0e, 0x91, + 0xd2, 0x65, 0x42, 0x32, 0x20, 0x25, 0x83, 0x95, 0xaa, 0x1d, 0x74, 0xd6, 0x55, 0xb5, 0x89, 0x21, + 0x9a, 0xb2, 0xca, 0x26, 0xd9, 0x80, 0xb6, 0x6d, 0x42, 0xd1, 0xc4, 0x44, 0xef, 0x71, 0x8b, 0xf7, + 0x2c, 0x47, 0x1b, 0x31, 0x17, 0xd9, 0x33, 0x99, 0xb3, 0xb1, 0x8e, 0x4d, 0x9a, 0xde, 0x47, 0x74, + 0x02, 0x9c, 0x82, 0x26, 0x55, 0x2b, 0xa0, 0x56, 0xa8, 0x20, 0x0a, 0x2f, 0x29, 0x5d, 0x5c, 0x7d, + 0x09, 0x8a, 0x7e, 0xf1, 0x10, 0x33, 0x6f, 0xd9, 0x8a, 0x69, 0x53, 0x2d, 0x1c, 0x97, 0xd9, 0x03, + 0x71, 0x44, 0x58, 0x6f, 0x51, 0x2b, 0x37, 0x2e, 0x93, 0x9f, 0xe8, 0xfd, 0x6e, 0x87, 0x53, 0xb4, + 0xc3, 0xf7, 0x0c, 0x8e, 0xa8, 0x0f, 0x39, 0xd8, 0xef, 0xea, 0xa3, 0x30, 0xe9, 0xeb, 0x40, 0xdc, + 0xaa, 0xa5, 0x0f, 0xc1, 0xa1, 0x50, 0x68, 0xf4, 0x1c, 0xcc, 0xf4, 0x75, 0x4d, 0xb7, 0xb1, 0xd9, + 0x33, 0x31, 0xd1, 0x58, 0x56, 0x55, 0xe5, 0xcf, 0x27, 0x86, 0xe8, 0xdc, 0xa6, 0x97, 0x9a, 0xa1, + 0xc8, 0xd3, 0xfd, 0xc1, 0xc2, 0x7b, 0x73, 0xd9, 0xbf, 0x98, 0x28, 0xbf, 0xfc, 0xf2, 0xcb, 0x2f, + 0x27, 0xa5, 0x7f, 0x9d, 0x81, 0x99, 0xb0, 0x39, 0x13, 0x3a, 0x7d, 0x0f, 0x43, 0x46, 0xef, 0x77, + 0xb7, 0xb0, 0x49, 0x85, 0x34, 0x2e, 0xf3, 0x27, 0x34, 0x0f, 0xe3, 0x1d, 0x65, 0x0b, 0x33, 0x97, + 0x5c, 0x3c, 0x73, 0x5f, 0xac, 0x59, 0x39, 0xb7, 0x42, 0x58, 0x64, 0xc6, 0x89, 0x9e, 0x80, 0x34, + 0x37, 0xd1, 0x04, 0xe1, 0xde, 0x78, 0x08, 0x64, 0x2e, 0xc9, 0x94, 0x0f, 0xdd, 0x06, 0x39, 0xf2, + 0x97, 0xe9, 0x46, 0x86, 0xb6, 0x39, 0x4b, 0x0a, 0x88, 0x5e, 0xa0, 0x2a, 0x64, 0xe9, 0x34, 0x69, + 0x61, 0xe1, 0xda, 0x9c, 0x67, 0xa2, 0x58, 0x2d, 0xbc, 0xad, 0xf4, 0x3b, 0x76, 0xf3, 0x9a, 0xd2, + 0xe9, 0x63, 0xaa, 0xf0, 0x39, 0xb9, 0xc0, 0x0b, 0xaf, 0x90, 0x32, 0x12, 0x79, 0xb0, 0x59, 0xa5, + 0xe9, 0x2d, 0xbc, 0x4b, 0xad, 0xe7, 0xb8, 0xcc, 0x26, 0xda, 0x32, 0x29, 0x21, 0xd5, 0xbf, 0x60, + 0x19, 0xba, 0x50, 0x4d, 0x5a, 0x05, 0x29, 0xa0, 0xd5, 0x3f, 0x1a, 0x34, 0xdc, 0x77, 0x84, 0x77, + 0x6f, 0x60, 0x2e, 0x9d, 0x84, 0x12, 0x0b, 0x26, 0xf8, 0xd0, 0x2b, 0x9d, 0xca, 0x14, 0x0d, 0x7a, + 0x8a, 0xac, 0xf8, 0x32, 0x2f, 0x95, 0xbe, 0x92, 0x84, 0x34, 0x35, 0x2c, 0x25, 0xc8, 0x6f, 0x7c, + 0x60, 0x6d, 0xa9, 0xb9, 0x78, 0x79, 0xb3, 0xb1, 0xb2, 0x54, 0x4e, 0xa0, 0x22, 0x00, 0x2d, 0x38, + 0xbf, 0x72, 0x79, 0x7e, 0xa3, 0x9c, 0x74, 0x9e, 0x97, 0x2f, 0x6d, 0x3c, 0xf2, 0x50, 0x39, 0xe5, + 0x30, 0x6c, 0xb2, 0x82, 0xb4, 0x97, 0xe0, 0xbd, 0x67, 0xca, 0xe3, 0xa8, 0x0c, 0x05, 0x06, 0xb0, + 0xfc, 0xdc, 0xd2, 0xe2, 0x23, 0x0f, 0x95, 0x33, 0xfe, 0x92, 0xf7, 0x9e, 0x29, 0x4f, 0xa0, 0x49, + 0xc8, 0xd1, 0x92, 0xc6, 0xe5, 0xcb, 0x2b, 0xe5, 0xac, 0x83, 0xb9, 0xbe, 0x21, 0x2f, 0x5f, 0xba, + 0x50, 0xce, 0x39, 0x98, 0x17, 0xe4, 0xcb, 0x9b, 0x6b, 0x65, 0x70, 0x10, 0x56, 0x97, 0xd6, 0xd7, + 0xe7, 0x2f, 0x2c, 0x95, 0xf3, 0x0e, 0x45, 0xe3, 0x03, 0x1b, 0x4b, 0xeb, 0xe5, 0x82, 0xaf, 0x59, + 0xef, 0x3d, 0x53, 0x9e, 0x74, 0xaa, 0x58, 0xba, 0xb4, 0xb9, 0x5a, 0x2e, 0xa2, 0x29, 0x98, 0x64, + 0x55, 0x88, 0x46, 0x94, 0x02, 0x45, 0x8f, 0x3c, 0x54, 0x2e, 0xbb, 0x0d, 0x61, 0x28, 0x53, 0xbe, + 0x82, 0x47, 0x1e, 0x2a, 0x23, 0x69, 0x01, 0xc6, 0xa9, 0x1a, 0x22, 0x04, 0xc5, 0x95, 0xf9, 0xc6, + 0xd2, 0x4a, 0xf3, 0xf2, 0xda, 0xc6, 0xf2, 0xe5, 0x4b, 0xf3, 0x2b, 0xe5, 0x84, 0x5b, 0x26, 0x2f, + 0x3d, 0xb3, 0xb9, 0x2c, 0x2f, 0x2d, 0x96, 0x93, 0xde, 0xb2, 0xb5, 0xa5, 0xf9, 0x8d, 0xa5, 0xc5, + 0x72, 0x4a, 0x52, 0x61, 0x26, 0xcc, 0xa0, 0x86, 0x4e, 0x21, 0x8f, 0x2e, 0x24, 0x87, 0xe8, 0x02, + 0xc5, 0x0a, 0xea, 0x82, 0xf4, 0x5a, 0x12, 0xa6, 0x43, 0x9c, 0x4a, 0x68, 0x25, 0x4f, 0xc2, 0x38, + 0xd3, 0x65, 0xe6, 0x66, 0x4f, 0x85, 0x7a, 0x27, 0xaa, 0xd9, 0x03, 0xae, 0x96, 0xf2, 0x79, 0x43, + 0x8d, 0xd4, 0x90, 0x50, 0x83, 0x40, 0x0c, 0x28, 0xec, 0x4f, 0x0e, 0x18, 0x7f, 0xe6, 0x1f, 0x1f, + 0x89, 0xe3, 0x1f, 0x69, 0xd9, 0xc1, 0x9c, 0xc0, 0x78, 0x88, 0x13, 0x38, 0x07, 0x53, 0x03, 0x40, + 0xb1, 0x8d, 0xf1, 0xcf, 0x24, 0xa0, 0x32, 0x4c, 0x38, 0x11, 0x26, 0x31, 0xe9, 0x33, 0x89, 0xe7, + 0x82, 0x12, 0xbc, 0x73, 0xf8, 0x20, 0x0c, 0x8c, 0xf5, 0x17, 0x13, 0x70, 0x38, 0x3c, 0xa4, 0x0c, + 0x6d, 0xc3, 0x13, 0x90, 0xe9, 0x62, 0x7b, 0xc7, 0x10, 0x61, 0xd5, 0x3d, 0x21, 0xce, 0x9a, 0xbc, + 0x0e, 0x0e, 0x36, 0xe7, 0xf2, 0x7a, 0xfb, 0xd4, 0xb0, 0xb8, 0x90, 0xb5, 0x66, 0xa0, 0xa5, 0x1f, + 0x4d, 0xc2, 0xa1, 0x50, 0xf0, 0xd0, 0x86, 0xde, 0x01, 0xa0, 0xe9, 0xbd, 0xbe, 0xcd, 0x42, 0x27, + 0x66, 0x89, 0x73, 0xb4, 0x84, 0x1a, 0x2f, 0x62, 0x65, 0xfb, 0xb6, 0xf3, 0x3e, 0x45, 0xdf, 0x03, + 0x2b, 0xa2, 0x04, 0x8f, 0xb9, 0x0d, 0x4d, 0xd3, 0x86, 0x1e, 0x1b, 0xd2, 0xd3, 0x01, 0xc5, 0x7c, + 0x10, 0xca, 0x6a, 0x47, 0xc3, 0xba, 0xdd, 0xb4, 0x6c, 0x13, 0x2b, 0x5d, 0x4d, 0x6f, 0x53, 0x57, + 0x93, 0xad, 0x8f, 0x6f, 0x2b, 0x1d, 0x0b, 0xcb, 0x25, 0xf6, 0x7a, 0x5d, 0xbc, 0x25, 0x1c, 0x54, + 0x81, 0x4c, 0x0f, 0x47, 0xc6, 0xc7, 0xc1, 0x5e, 0x3b, 0x1c, 0xd2, 0x2f, 0xe7, 0x20, 0xef, 0x09, + 0xc0, 0xd1, 0x9d, 0x50, 0x78, 0x41, 0xb9, 0xa6, 0x34, 0xc5, 0xa2, 0x8a, 0x49, 0x22, 0x4f, 0xca, + 0xd6, 0xf8, 0xc2, 0xea, 0x41, 0x98, 0xa1, 0x24, 0x46, 0xdf, 0xc6, 0x66, 0x53, 0xed, 0x28, 0x96, + 0x45, 0x85, 0x96, 0xa5, 0xa4, 0x88, 0xbc, 0xbb, 0x4c, 0x5e, 0x2d, 0x88, 0x37, 0xe8, 0x61, 0x98, + 0xa6, 0x1c, 0xdd, 0x7e, 0xc7, 0xd6, 0x7a, 0x1d, 0xdc, 0x24, 0xcb, 0x3c, 0x8b, 0xba, 0x1c, 0xa7, + 0x65, 0x53, 0x84, 0x62, 0x95, 0x13, 0x90, 0x16, 0x59, 0x68, 0x11, 0xee, 0xa0, 0x6c, 0x6d, 0xac, + 0x63, 0x53, 0xb1, 0x71, 0x13, 0xbf, 0xd8, 0x57, 0x3a, 0x56, 0x53, 0xd1, 0x5b, 0xcd, 0x1d, 0xc5, + 0xda, 0xa9, 0xcc, 0x10, 0x80, 0x46, 0xb2, 0x92, 0x90, 0x8f, 0x12, 0xc2, 0x0b, 0x9c, 0x6e, 0x89, + 0x92, 0xcd, 0xeb, 0xad, 0x8b, 0x8a, 0xb5, 0x83, 0xea, 0x70, 0x98, 0xa2, 0x58, 0xb6, 0xa9, 0xe9, + 0xed, 0xa6, 0xba, 0x83, 0xd5, 0xab, 0xcd, 0xbe, 0xbd, 0xfd, 0x58, 0xe5, 0x36, 0x6f, 0xfd, 0xb4, + 0x85, 0xeb, 0x94, 0x66, 0x81, 0x90, 0x6c, 0xda, 0xdb, 0x8f, 0xa1, 0x75, 0x28, 0x90, 0xc1, 0xe8, + 0x6a, 0x2f, 0xe1, 0xe6, 0xb6, 0x61, 0x52, 0x1f, 0x5a, 0x0c, 0x31, 0x4d, 0x1e, 0x09, 0xce, 0x5d, + 0xe6, 0x0c, 0xab, 0x46, 0x0b, 0xd7, 0xc7, 0xd7, 0xd7, 0x96, 0x96, 0x16, 0xe5, 0xbc, 0x40, 0x39, + 0x6f, 0x98, 0x44, 0xa1, 0xda, 0x86, 0x23, 0xe0, 0x3c, 0x53, 0xa8, 0xb6, 0x21, 0xc4, 0xfb, 0x30, + 0x4c, 0xab, 0x2a, 0xeb, 0xb3, 0xa6, 0x36, 0xf9, 0x62, 0xcc, 0xaa, 0x94, 0x7d, 0xc2, 0x52, 0xd5, + 0x0b, 0x8c, 0x80, 0xeb, 0xb8, 0x85, 0xce, 0xc2, 0x21, 0x57, 0x58, 0x5e, 0xc6, 0xa9, 0x81, 0x5e, + 0x06, 0x59, 0x1f, 0x86, 0xe9, 0xde, 0xde, 0x20, 0x23, 0xf2, 0xd5, 0xd8, 0xdb, 0x0b, 0xb2, 0x3d, + 0x0a, 0x33, 0xbd, 0x9d, 0xde, 0x20, 0xdf, 0xbd, 0x5e, 0x3e, 0xd4, 0xdb, 0xe9, 0x05, 0x19, 0xef, + 0xa6, 0x2b, 0x73, 0x13, 0xab, 0x8a, 0x8d, 0x5b, 0x95, 0x23, 0x5e, 0x72, 0xcf, 0x0b, 0x34, 0x07, + 0x65, 0x55, 0x6d, 0x62, 0x5d, 0xd9, 0xea, 0xe0, 0xa6, 0x62, 0x62, 0x5d, 0xb1, 0x2a, 0x35, 0x4a, + 0x9c, 0xb6, 0xcd, 0x3e, 0x96, 0x8b, 0xaa, 0xba, 0x44, 0x5f, 0xce, 0xd3, 0x77, 0xe8, 0x5e, 0x98, + 0x32, 0xb6, 0x5e, 0x50, 0x99, 0x46, 0x36, 0x7b, 0x26, 0xde, 0xd6, 0x76, 0x2b, 0x77, 0x51, 0xf1, + 0x96, 0xc8, 0x0b, 0xaa, 0x8f, 0x6b, 0xb4, 0x18, 0x9d, 0x82, 0xb2, 0x6a, 0xed, 0x28, 0x66, 0x8f, + 0x9a, 0x64, 0xab, 0xa7, 0xa8, 0xb8, 0x72, 0x37, 0x23, 0x65, 0xe5, 0x97, 0x44, 0x31, 0x99, 0x11, + 0xd6, 0x75, 0x6d, 0xdb, 0x16, 0x88, 0x27, 0xd9, 0x8c, 0xa0, 0x65, 0x1c, 0x6d, 0x16, 0xca, 0x44, + 0x12, 0xbe, 0x8a, 0x67, 0x29, 0x59, 0xb1, 0xb7, 0xd3, 0xf3, 0xd6, 0x7b, 0x02, 0x26, 0x09, 0xa5, + 0x5b, 0xe9, 0x29, 0x16, 0xb8, 0xf5, 0x76, 0x3c, 0x35, 0x3e, 0x04, 0x87, 0x09, 0x51, 0x17, 0xdb, + 0x4a, 0x4b, 0xb1, 0x15, 0x0f, 0xf5, 0xfd, 0x94, 0x9a, 0x88, 0x7d, 0x95, 0xbf, 0xf4, 0xb5, 0xd3, + 0xec, 0x6f, 0xed, 0x39, 0x8a, 0xf5, 0x00, 0x6b, 0x27, 0x29, 0x13, 0xaa, 0xf5, 0x96, 0x05, 0xe7, + 0x52, 0x1d, 0x0a, 0x5e, 0xbd, 0x47, 0x39, 0x60, 0x9a, 0x5f, 0x4e, 0x90, 0x20, 0x68, 0xe1, 0xf2, + 0x22, 0x09, 0x5f, 0x9e, 0x5f, 0x2a, 0x27, 0x49, 0x18, 0xb5, 0xb2, 0xbc, 0xb1, 0xd4, 0x94, 0x37, + 0x2f, 0x6d, 0x2c, 0xaf, 0x2e, 0x95, 0x53, 0x9e, 0xc0, 0xfe, 0xa9, 0x74, 0xf6, 0x9e, 0xf2, 0x49, + 0xe9, 0xdb, 0x49, 0x28, 0xfa, 0x57, 0x6a, 0xe8, 0x71, 0x38, 0x22, 0xd2, 0x2a, 0x16, 0xb6, 0x9b, + 0xd7, 0x35, 0x93, 0x4e, 0xc8, 0xae, 0xc2, 0x9c, 0xa3, 0xa3, 0x3f, 0x33, 0x9c, 0x6a, 0x1d, 0xdb, + 0xcf, 0x6a, 0x26, 0x99, 0x6e, 0x5d, 0xc5, 0x46, 0x2b, 0x50, 0xd3, 0x8d, 0xa6, 0x65, 0x2b, 0x7a, + 0x4b, 0x31, 0x5b, 0x4d, 0x37, 0xa1, 0xd5, 0x54, 0x54, 0x15, 0x5b, 0x96, 0xc1, 0x1c, 0xa1, 0x83, + 0x72, 0xbb, 0x6e, 0xac, 0x73, 0x62, 0xd7, 0x43, 0xcc, 0x73, 0xd2, 0x80, 0xfa, 0xa6, 0x86, 0xa9, + 0xef, 0x6d, 0x90, 0xeb, 0x2a, 0xbd, 0x26, 0xd6, 0x6d, 0x73, 0x8f, 0xc6, 0xe7, 0x59, 0x39, 0xdb, + 0x55, 0x7a, 0x4b, 0xe4, 0xf9, 0x6d, 0x59, 0x26, 0x3d, 0x95, 0xce, 0x66, 0xcb, 0xb9, 0xa7, 0xd2, + 0xd9, 0x5c, 0x19, 0xa4, 0x57, 0x53, 0x50, 0xf0, 0xc6, 0xeb, 0x64, 0xf9, 0xa3, 0x52, 0x8f, 0x95, + 0xa0, 0x36, 0xed, 0xc4, 0xc8, 0xe8, 0x7e, 0x6e, 0x81, 0xb8, 0xb2, 0x7a, 0x86, 0x05, 0xc7, 0x32, + 0xe3, 0x24, 0x61, 0x04, 0x51, 0x36, 0xcc, 0x82, 0x91, 0xac, 0xcc, 0x9f, 0xd0, 0x05, 0xc8, 0xbc, + 0x60, 0x51, 0xec, 0x0c, 0xc5, 0xbe, 0x6b, 0x34, 0xf6, 0x53, 0xeb, 0x14, 0x3c, 0xf7, 0xd4, 0x7a, + 0xf3, 0xd2, 0x65, 0x79, 0x75, 0x7e, 0x45, 0xe6, 0xec, 0xe8, 0x28, 0xa4, 0x3b, 0xca, 0x4b, 0x7b, + 0x7e, 0xa7, 0x47, 0x8b, 0xe2, 0x0e, 0xc2, 0x51, 0x48, 0x5f, 0xc7, 0xca, 0x55, 0xbf, 0xab, 0xa1, + 0x45, 0x6f, 0xe1, 0x64, 0x38, 0x0d, 0xe3, 0x54, 0x5e, 0x08, 0x80, 0x4b, 0xac, 0x3c, 0x86, 0xb2, + 0x90, 0x5e, 0xb8, 0x2c, 0x93, 0x09, 0x51, 0x86, 0x02, 0x2b, 0x6d, 0xae, 0x2d, 0x2f, 0x2d, 0x2c, + 0x95, 0x93, 0xd2, 0xc3, 0x90, 0x61, 0x42, 0x20, 0x93, 0xc5, 0x11, 0x43, 0x79, 0x8c, 0x3f, 0x72, + 0x8c, 0x84, 0x78, 0xbb, 0xb9, 0xda, 0x58, 0x92, 0xcb, 0x49, 0xff, 0x50, 0xa7, 0xcb, 0xe3, 0x92, + 0x05, 0x05, 0x6f, 0x1c, 0xfe, 0xf6, 0x2c, 0xc6, 0xbf, 0x91, 0x80, 0xbc, 0x27, 0xae, 0x26, 0x01, + 0x91, 0xd2, 0xe9, 0x18, 0xd7, 0x9b, 0x4a, 0x47, 0x53, 0x2c, 0xae, 0x1a, 0x40, 0x8b, 0xe6, 0x49, + 0x49, 0xdc, 0xa1, 0x7b, 0x9b, 0xa6, 0xc8, 0x78, 0x39, 0x23, 0x7d, 0x2e, 0x01, 0xe5, 0x60, 0x60, + 0x1b, 0x68, 0x66, 0xe2, 0x47, 0xd9, 0x4c, 0xe9, 0x33, 0x09, 0x28, 0xfa, 0xa3, 0xd9, 0x40, 0xf3, + 0xee, 0xfc, 0x91, 0x36, 0xef, 0xcf, 0x92, 0x30, 0xe9, 0x8b, 0x61, 0xe3, 0xb6, 0xee, 0x45, 0x98, + 0xd2, 0x5a, 0xb8, 0xdb, 0x33, 0x6c, 0xac, 0xab, 0x7b, 0xcd, 0x0e, 0xbe, 0x86, 0x3b, 0x15, 0x89, + 0x1a, 0x8d, 0xd3, 0xa3, 0xa3, 0xe4, 0xb9, 0x65, 0x97, 0x6f, 0x85, 0xb0, 0xd5, 0xa7, 0x97, 0x17, + 0x97, 0x56, 0xd7, 0x2e, 0x6f, 0x2c, 0x5d, 0x5a, 0xf8, 0x40, 0x73, 0xf3, 0xd2, 0xd3, 0x97, 0x2e, + 0x3f, 0x7b, 0x49, 0x2e, 0x6b, 0x01, 0xb2, 0xb7, 0x70, 0xda, 0xaf, 0x41, 0x39, 0xd8, 0x28, 0x74, + 0x04, 0xc2, 0x9a, 0x55, 0x1e, 0x43, 0xd3, 0x50, 0xba, 0x74, 0xb9, 0xb9, 0xbe, 0xbc, 0xb8, 0xd4, + 0x5c, 0x3a, 0x7f, 0x7e, 0x69, 0x61, 0x63, 0x9d, 0xe5, 0x3d, 0x1c, 0xea, 0x0d, 0xdf, 0x04, 0x97, + 0x3e, 0x9d, 0x82, 0xe9, 0x90, 0x96, 0xa0, 0x79, 0xbe, 0x62, 0x61, 0x8b, 0xa8, 0x07, 0xe2, 0xb4, + 0x7e, 0x8e, 0xc4, 0x0c, 0x6b, 0x8a, 0x69, 0xf3, 0x05, 0xce, 0x29, 0x20, 0x52, 0xd2, 0x6d, 0x6d, + 0x5b, 0xc3, 0x26, 0xcf, 0x27, 0xb1, 0x65, 0x4c, 0xc9, 0x2d, 0x67, 0x29, 0xa5, 0xfb, 0x01, 0xf5, + 0x0c, 0x4b, 0xb3, 0xb5, 0x6b, 0xb8, 0xa9, 0xe9, 0x22, 0xf9, 0x94, 0xa6, 0xbb, 0x51, 0x65, 0xf1, + 0x66, 0x59, 0xb7, 0x1d, 0x6a, 0x1d, 0xb7, 0x95, 0x00, 0x35, 0x31, 0xe6, 0x29, 0xb9, 0x2c, 0xde, + 0x38, 0xd4, 0x77, 0x42, 0xa1, 0x65, 0xf4, 0x49, 0xac, 0xc7, 0xe8, 0x88, 0xef, 0x48, 0xc8, 0x79, + 0x56, 0xe6, 0x90, 0xf0, 0x28, 0xde, 0xcd, 0x7a, 0x15, 0xe4, 0x3c, 0x2b, 0x63, 0x24, 0x27, 0xa1, + 0xa4, 0xb4, 0xdb, 0x26, 0x01, 0x17, 0x40, 0x6c, 0x5d, 0x52, 0x74, 0x8a, 0x29, 0x61, 0xf5, 0x29, + 0xc8, 0x0a, 0x39, 0x10, 0x57, 0x4d, 0x24, 0xd1, 0xec, 0xb1, 0xc5, 0x76, 0x72, 0x36, 0x27, 0x67, + 0x75, 0xf1, 0xf2, 0x4e, 0x28, 0x68, 0x56, 0xd3, 0x4d, 0xe2, 0x27, 0x8f, 0x27, 0x67, 0xb3, 0x72, + 0x5e, 0xb3, 0x9c, 0x04, 0xa8, 0xf4, 0xc5, 0x24, 0x14, 0xfd, 0x9b, 0x10, 0x68, 0x11, 0xb2, 0x1d, + 0x43, 0xa5, 0xbb, 0x8c, 0x7c, 0x07, 0x6c, 0x36, 0x62, 0xdf, 0x62, 0x6e, 0x85, 0xd3, 0xcb, 0x0e, + 0x67, 0xf5, 0x3f, 0x24, 0x20, 0x2b, 0x8a, 0xd1, 0x61, 0x48, 0xf7, 0x14, 0x7b, 0x87, 0xc2, 0x8d, + 0x37, 0x92, 0xe5, 0x84, 0x4c, 0x9f, 0x49, 0xb9, 0xd5, 0x53, 0x74, 0xaa, 0x02, 0xbc, 0x9c, 0x3c, + 0x93, 0x71, 0xed, 0x60, 0xa5, 0x45, 0x17, 0x3d, 0x46, 0xb7, 0x8b, 0x75, 0xdb, 0x12, 0xe3, 0xca, + 0xcb, 0x17, 0x78, 0x31, 0xba, 0x0f, 0xa6, 0x6c, 0x53, 0xd1, 0x3a, 0x3e, 0xda, 0x34, 0xa5, 0x2d, + 0x8b, 0x17, 0x0e, 0x71, 0x1d, 0x8e, 0x0a, 0xdc, 0x16, 0xb6, 0x15, 0x75, 0x07, 0xb7, 0x5c, 0xa6, + 0x0c, 0x4d, 0x6e, 0x1c, 0xe1, 0x04, 0x8b, 0xfc, 0xbd, 0xe0, 0x95, 0xbe, 0x9d, 0x80, 0x29, 0xb1, + 0x4c, 0x6b, 0x39, 0xc2, 0x5a, 0x05, 0x50, 0x74, 0xdd, 0xb0, 0xbd, 0xe2, 0x1a, 0x54, 0xe5, 0x01, + 0xbe, 0xb9, 0x79, 0x87, 0x49, 0xf6, 0x00, 0x54, 0xbb, 0x00, 0xee, 0x9b, 0xa1, 0x62, 0xab, 0x41, + 0x9e, 0xef, 0x30, 0xd1, 0x6d, 0x4a, 0xb6, 0xb0, 0x07, 0x56, 0x44, 0xd6, 0x73, 0x68, 0x06, 0xc6, + 0xb7, 0x70, 0x5b, 0xd3, 0x79, 0xde, 0x98, 0x3d, 0x88, 0xf4, 0x4b, 0xda, 0x49, 0xbf, 0x34, 0x3e, + 0x9e, 0x80, 0x69, 0xd5, 0xe8, 0x06, 0xdb, 0xdb, 0x28, 0x07, 0xb2, 0x0b, 0xd6, 0xc5, 0xc4, 0xf3, + 0x4f, 0x78, 0x76, 0x64, 0xdb, 0x46, 0x47, 0xd1, 0xdb, 0xee, 0x3e, 0x2b, 0xfd, 0xa1, 0x3e, 0xd0, + 0xc6, 0xfa, 0x03, 0x6d, 0xc3, 0xb3, 0xeb, 0x7a, 0xce, 0xfd, 0xf9, 0xd7, 0x89, 0xc4, 0x17, 0x92, + 0xa9, 0x0b, 0x6b, 0x8d, 0x2f, 0x25, 0xab, 0x17, 0x58, 0x75, 0x6b, 0x42, 0x3c, 0x32, 0xde, 0xee, + 0x60, 0x95, 0x74, 0x19, 0xbe, 0x77, 0x1f, 0xcc, 0xb4, 0x8d, 0xb6, 0x41, 0x11, 0x4f, 0x93, 0x5f, + 0x7c, 0xe7, 0x36, 0xe7, 0x94, 0x56, 0x23, 0xb7, 0x79, 0xeb, 0x97, 0x60, 0x9a, 0x13, 0x37, 0xe9, + 0xd6, 0x11, 0x5b, 0xd8, 0xa0, 0x91, 0x59, 0xb5, 0xca, 0xef, 0x7e, 0x97, 0x3a, 0x74, 0x79, 0x8a, + 0xb3, 0x92, 0x77, 0x6c, 0xed, 0x53, 0x97, 0xe1, 0x90, 0x0f, 0x8f, 0x4d, 0x5b, 0x6c, 0x46, 0x20, + 0xfe, 0x5b, 0x8e, 0x38, 0xed, 0x41, 0x5c, 0xe7, 0xac, 0xf5, 0x05, 0x98, 0x3c, 0x08, 0xd6, 0xbf, + 0xe3, 0x58, 0x05, 0xec, 0x05, 0xb9, 0x00, 0x25, 0x0a, 0xa2, 0xf6, 0x2d, 0xdb, 0xe8, 0x52, 0x9b, + 0x38, 0x1a, 0xe6, 0x0f, 0xbf, 0xcb, 0xe6, 0x51, 0x91, 0xb0, 0x2d, 0x38, 0x5c, 0xf5, 0x3a, 0xd0, + 0xdd, 0xb2, 0x16, 0x56, 0x3b, 0x11, 0x08, 0xdf, 0xe4, 0x0d, 0x71, 0xe8, 0xeb, 0x57, 0x60, 0x86, + 0xfc, 0xa6, 0x26, 0xcb, 0xdb, 0x92, 0xe8, 0x14, 0x5c, 0xe5, 0xdb, 0x3f, 0xc3, 0xa6, 0xea, 0xb4, + 0x03, 0xe0, 0x69, 0x93, 0x67, 0x14, 0xdb, 0xd8, 0xb6, 0xb1, 0x69, 0x35, 0x95, 0x4e, 0x58, 0xf3, + 0x3c, 0x39, 0x8c, 0xca, 0xaf, 0xbf, 0xee, 0x1f, 0xc5, 0x0b, 0x8c, 0x73, 0xbe, 0xd3, 0xa9, 0x6f, + 0xc2, 0x91, 0x10, 0xad, 0x88, 0x81, 0xf9, 0x69, 0x8e, 0x39, 0x33, 0xa0, 0x19, 0x04, 0x76, 0x0d, + 0x44, 0xb9, 0x33, 0x96, 0x31, 0x30, 0xff, 0x3e, 0xc7, 0x44, 0x9c, 0x57, 0x0c, 0x29, 0x41, 0x7c, + 0x0a, 0xa6, 0xae, 0x61, 0x73, 0xcb, 0xb0, 0x78, 0xde, 0x28, 0x06, 0xdc, 0x67, 0x38, 0x5c, 0x89, + 0x33, 0xd2, 0x44, 0x12, 0xc1, 0x3a, 0x0b, 0xd9, 0x6d, 0x45, 0xc5, 0x31, 0x20, 0x3e, 0xcb, 0x21, + 0x26, 0x08, 0x3d, 0x61, 0x9d, 0x87, 0x42, 0xdb, 0xe0, 0x5e, 0x2b, 0x9a, 0xfd, 0x73, 0x9c, 0x3d, + 0x2f, 0x78, 0x38, 0x44, 0xcf, 0xe8, 0xf5, 0x3b, 0xc4, 0xa5, 0x45, 0x43, 0xfc, 0x86, 0x80, 0x10, + 0x3c, 0x1c, 0xe2, 0x00, 0x62, 0x7d, 0x45, 0x40, 0x58, 0x1e, 0x79, 0x3e, 0x09, 0x79, 0x43, 0xef, + 0xec, 0x19, 0x7a, 0x9c, 0x46, 0x7c, 0x9e, 0x23, 0x00, 0x67, 0x21, 0x00, 0xe7, 0x20, 0x17, 0x77, + 0x20, 0xfe, 0xe1, 0xeb, 0x62, 0x7a, 0x88, 0x11, 0xb8, 0x00, 0x25, 0x61, 0xa0, 0x34, 0x43, 0x8f, + 0x01, 0xf1, 0x8f, 0x38, 0x44, 0xd1, 0xc3, 0xc6, 0xbb, 0x61, 0x63, 0xcb, 0x6e, 0xe3, 0x38, 0x20, + 0x5f, 0x14, 0xdd, 0xe0, 0x2c, 0x5c, 0x94, 0x5b, 0x58, 0x57, 0x77, 0xe2, 0x21, 0xfc, 0xa6, 0x10, + 0xa5, 0xe0, 0x21, 0x10, 0x0b, 0x30, 0xd9, 0x55, 0x4c, 0x6b, 0x47, 0xe9, 0xc4, 0x1a, 0x8e, 0x7f, + 0xcc, 0x31, 0x0a, 0x0e, 0x13, 0x97, 0x48, 0x5f, 0x3f, 0x08, 0xcc, 0x97, 0x84, 0x44, 0x3c, 0x6c, + 0x7c, 0xea, 0x59, 0x36, 0x4d, 0xb2, 0x1d, 0x04, 0xed, 0x9f, 0x88, 0xa9, 0xc7, 0x78, 0x57, 0xbd, + 0x88, 0xe7, 0x20, 0x67, 0x69, 0x2f, 0xc5, 0x82, 0xf9, 0xa7, 0x62, 0xa4, 0x29, 0x03, 0x61, 0xfe, + 0x00, 0x1c, 0x0d, 0x75, 0x13, 0x31, 0xc0, 0xfe, 0x19, 0x07, 0x3b, 0x1c, 0xe2, 0x2a, 0xb8, 0x49, + 0x38, 0x28, 0xe4, 0x6f, 0x09, 0x93, 0x80, 0x03, 0x58, 0x6b, 0x64, 0x1d, 0x61, 0x29, 0xdb, 0x07, + 0x93, 0xda, 0x6f, 0x0b, 0xa9, 0x31, 0x5e, 0x9f, 0xd4, 0x36, 0xe0, 0x30, 0x47, 0x3c, 0xd8, 0xb8, + 0xfe, 0x8e, 0x30, 0xac, 0x8c, 0x7b, 0xd3, 0x3f, 0xba, 0x1f, 0x84, 0xaa, 0x23, 0x4e, 0x11, 0xb0, + 0x5a, 0xcd, 0xae, 0xd2, 0x8b, 0x81, 0xfc, 0xbb, 0x1c, 0x59, 0x58, 0x7c, 0x27, 0xe2, 0xb5, 0x56, + 0x95, 0x1e, 0x01, 0x7f, 0x0e, 0x2a, 0x02, 0xbc, 0xaf, 0x9b, 0x58, 0x35, 0xda, 0xba, 0xf6, 0x12, + 0x6e, 0xc5, 0x80, 0xfe, 0xe7, 0x81, 0xa1, 0xda, 0xf4, 0xb0, 0x13, 0xe4, 0x65, 0x28, 0x3b, 0xb1, + 0x4a, 0x53, 0xeb, 0xf6, 0x0c, 0xd3, 0x8e, 0x40, 0xfc, 0x17, 0x62, 0xa4, 0x1c, 0xbe, 0x65, 0xca, + 0x56, 0x5f, 0x02, 0xb6, 0xf3, 0x1c, 0x57, 0x25, 0xbf, 0xcc, 0x81, 0x26, 0x5d, 0x2e, 0x6e, 0x38, + 0x54, 0xa3, 0xdb, 0x53, 0xcc, 0x38, 0xf6, 0xef, 0x5f, 0x0a, 0xc3, 0xc1, 0x59, 0xb8, 0xe1, 0xb0, + 0xf7, 0x7a, 0x98, 0x78, 0xfb, 0x18, 0x08, 0x5f, 0x11, 0x86, 0x43, 0xf0, 0x70, 0x08, 0x11, 0x30, + 0xc4, 0x80, 0xf8, 0xaa, 0x80, 0x10, 0x3c, 0x04, 0xe2, 0x19, 0xd7, 0xd1, 0x9a, 0xb8, 0xad, 0x59, + 0xb6, 0xc9, 0xc2, 0xe4, 0xd1, 0x50, 0x5f, 0x7b, 0xdd, 0x1f, 0x84, 0xc9, 0x1e, 0x56, 0x62, 0x89, + 0x78, 0xda, 0x95, 0xae, 0xa2, 0xa2, 0x1b, 0xf6, 0x75, 0x61, 0x89, 0x3c, 0x6c, 0xa4, 0x6d, 0x9e, + 0x08, 0x91, 0x88, 0x5d, 0x25, 0x6b, 0x87, 0x18, 0x70, 0xbf, 0x17, 0x68, 0xdc, 0xba, 0xe0, 0x25, + 0x98, 0x9e, 0xf8, 0xa7, 0xaf, 0x5f, 0xc5, 0x7b, 0xb1, 0xb4, 0xf3, 0xf7, 0x03, 0xf1, 0xcf, 0x26, + 0xe3, 0x64, 0x36, 0xa4, 0x14, 0x88, 0xa7, 0x50, 0xd4, 0x39, 0xa3, 0xca, 0xdf, 0x7e, 0x83, 0xf7, + 0xd7, 0x1f, 0x4e, 0xd5, 0x57, 0x88, 0x92, 0xfb, 0x83, 0x9e, 0x68, 0xb0, 0x9f, 0x79, 0xc3, 0xd1, + 0x73, 0x5f, 0xcc, 0x53, 0x3f, 0x0f, 0x93, 0xbe, 0x80, 0x27, 0x1a, 0xea, 0xc3, 0x1c, 0xaa, 0xe0, + 0x8d, 0x77, 0xea, 0x0f, 0x43, 0x9a, 0x04, 0x2f, 0xd1, 0xec, 0x3f, 0xcb, 0xd9, 0x29, 0x79, 0xfd, + 0x7d, 0x90, 0x15, 0x41, 0x4b, 0x34, 0xeb, 0xcf, 0x71, 0x56, 0x87, 0x85, 0xb0, 0x8b, 0x80, 0x25, + 0x9a, 0xfd, 0xe7, 0x05, 0xbb, 0x60, 0x21, 0xec, 0xf1, 0x45, 0xf8, 0x8d, 0xbf, 0x93, 0xe6, 0x4e, + 0x47, 0xc8, 0xee, 0x1c, 0x4c, 0xf0, 0x48, 0x25, 0x9a, 0xfb, 0xa3, 0xbc, 0x72, 0xc1, 0x51, 0x7f, + 0x14, 0xc6, 0x63, 0x0a, 0xfc, 0x17, 0x39, 0x2b, 0xa3, 0xaf, 0x2f, 0x40, 0xde, 0x13, 0x9d, 0x44, + 0xb3, 0xff, 0x12, 0x67, 0xf7, 0x72, 0x91, 0xa6, 0xf3, 0xe8, 0x24, 0x1a, 0xe0, 0xe3, 0xa2, 0xe9, + 0x9c, 0x83, 0x88, 0x4d, 0x04, 0x26, 0xd1, 0xdc, 0x9f, 0x10, 0x52, 0x17, 0x2c, 0xf5, 0x27, 0x21, + 0xe7, 0x38, 0x9b, 0x68, 0xfe, 0x5f, 0xe6, 0xfc, 0x2e, 0x0f, 0x91, 0x80, 0xc7, 0xd9, 0x45, 0x43, + 0x7c, 0x52, 0x48, 0xc0, 0xc3, 0x45, 0xa6, 0x51, 0x30, 0x80, 0x89, 0x46, 0xfa, 0xbb, 0x62, 0x1a, + 0x05, 0xe2, 0x17, 0x32, 0x9a, 0xd4, 0xe6, 0x47, 0x43, 0xfc, 0x8a, 0x18, 0x4d, 0x4a, 0x4f, 0x9a, + 0x11, 0x8c, 0x08, 0xa2, 0x31, 0xfe, 0x9e, 0x68, 0x46, 0x20, 0x20, 0xa8, 0xaf, 0x01, 0x1a, 0x8c, + 0x06, 0xa2, 0xf1, 0x3e, 0xc5, 0xf1, 0xa6, 0x06, 0x82, 0x81, 0xfa, 0xb3, 0x70, 0x38, 0x3c, 0x12, + 0x88, 0x46, 0xfd, 0xf5, 0x37, 0x02, 0x6b, 0x37, 0x6f, 0x20, 0x50, 0xdf, 0x70, 0x5d, 0x8a, 0x37, + 0x0a, 0x88, 0x86, 0xfd, 0xf4, 0x1b, 0x7e, 0xc3, 0xed, 0x0d, 0x02, 0xea, 0xf3, 0x00, 0xae, 0x03, + 0x8e, 0xc6, 0xfa, 0x0c, 0xc7, 0xf2, 0x30, 0x91, 0xa9, 0xc1, 0xfd, 0x6f, 0x34, 0xff, 0x67, 0xc5, + 0xd4, 0xe0, 0x1c, 0x64, 0x6a, 0x08, 0xd7, 0x1b, 0xcd, 0xfd, 0x39, 0x31, 0x35, 0x04, 0x0b, 0xd1, + 0x6c, 0x8f, 0x77, 0x8b, 0x46, 0xf8, 0xbc, 0xd0, 0x6c, 0x0f, 0x57, 0xfd, 0x12, 0x4c, 0x0d, 0x38, + 0xc4, 0x68, 0xa8, 0x2f, 0x70, 0xa8, 0x72, 0xd0, 0x1f, 0x7a, 0x9d, 0x17, 0x77, 0x86, 0xd1, 0x68, + 0xff, 0x20, 0xe0, 0xbc, 0xb8, 0x2f, 0xac, 0x9f, 0x83, 0xac, 0xde, 0xef, 0x74, 0xc8, 0xe4, 0x41, + 0xa3, 0xcf, 0x06, 0x56, 0xfe, 0xfb, 0x0f, 0xb9, 0x74, 0x04, 0x43, 0xfd, 0x61, 0x18, 0xc7, 0xdd, + 0x2d, 0xdc, 0x8a, 0xe2, 0xfc, 0xde, 0x0f, 0x85, 0xc1, 0x24, 0xd4, 0xf5, 0x27, 0x01, 0x58, 0x6a, + 0x84, 0x6e, 0x0f, 0x46, 0xf0, 0xfe, 0x8f, 0x1f, 0xf2, 0xc3, 0x38, 0x2e, 0x8b, 0x0b, 0xc0, 0x8e, + 0xf6, 0x8c, 0x06, 0x78, 0xdd, 0x0f, 0x40, 0x47, 0xe4, 0x2c, 0x4c, 0xbc, 0x60, 0x19, 0xba, 0xad, + 0xb4, 0xa3, 0xb8, 0xff, 0x27, 0xe7, 0x16, 0xf4, 0x44, 0x60, 0x5d, 0xc3, 0xc4, 0xb6, 0xd2, 0xb6, + 0xa2, 0x78, 0xff, 0x17, 0xe7, 0x75, 0x18, 0x08, 0xb3, 0xaa, 0x58, 0x76, 0x9c, 0x7e, 0xff, 0x6f, + 0xc1, 0x2c, 0x18, 0x48, 0xa3, 0xc9, 0xef, 0xab, 0x78, 0x2f, 0x8a, 0xf7, 0xfb, 0xa2, 0xd1, 0x9c, + 0xbe, 0xfe, 0x3e, 0xc8, 0x91, 0x9f, 0xec, 0x84, 0x5d, 0x04, 0xf3, 0xff, 0xe1, 0xcc, 0x2e, 0x07, + 0xa9, 0xd9, 0xb2, 0x5b, 0xb6, 0x16, 0x2d, 0xec, 0x1b, 0x7c, 0xa4, 0x05, 0x7d, 0x7d, 0x1e, 0xf2, + 0x96, 0xdd, 0x6a, 0xf5, 0x79, 0x7c, 0x1a, 0xc1, 0xfe, 0x7f, 0x7f, 0xe8, 0xa4, 0x2c, 0x1c, 0x1e, + 0x32, 0xda, 0xd7, 0xaf, 0xda, 0x3d, 0x83, 0x6e, 0x81, 0x44, 0x21, 0xbc, 0xc1, 0x11, 0x3c, 0x2c, + 0xf5, 0x05, 0x28, 0x90, 0xbe, 0x98, 0xb8, 0x87, 0xe9, 0x7e, 0x55, 0x04, 0xc4, 0x5f, 0x72, 0x01, + 0xf8, 0x98, 0x1a, 0x3f, 0x39, 0xec, 0x7e, 0x4e, 0x78, 0xda, 0x18, 0x2e, 0x18, 0x17, 0x0c, 0x96, + 0x30, 0x7e, 0x5e, 0xf2, 0xa5, 0x8b, 0xdb, 0x86, 0x9b, 0xad, 0x75, 0x16, 0x39, 0xf0, 0x7b, 0x49, + 0xb8, 0x9b, 0x1e, 0x0b, 0x36, 0xbb, 0x9a, 0x6e, 0x9f, 0x56, 0xcd, 0xbd, 0x9e, 0x6d, 0x9c, 0xee, + 0x62, 0xf3, 0x6a, 0x07, 0xf3, 0x3f, 0x3c, 0xfb, 0x5b, 0x71, 0xc9, 0xe6, 0x18, 0xd9, 0x1c, 0x7b, + 0x5f, 0x0d, 0xcd, 0x16, 0x4b, 0x0b, 0x30, 0xb1, 0x66, 0x1a, 0xc6, 0xf6, 0xe5, 0x1e, 0x42, 0xfc, + 0xa4, 0x33, 0x3f, 0x18, 0x47, 0xd5, 0x90, 0xdf, 0x8c, 0x4a, 0xba, 0x37, 0xa3, 0x10, 0xa4, 0x5b, + 0x8a, 0xad, 0xd0, 0x84, 0x79, 0x41, 0xa6, 0xbf, 0xa5, 0x06, 0x8c, 0x53, 0x10, 0x74, 0x16, 0x52, + 0x46, 0xcf, 0xe2, 0xd9, 0xfd, 0x3b, 0xe7, 0x86, 0xb5, 0x65, 0x8e, 0x57, 0xd9, 0x48, 0x7f, 0x73, + 0xbf, 0x36, 0x26, 0x13, 0x9e, 0xc6, 0xda, 0x5f, 0x7f, 0xe7, 0x58, 0xe2, 0x37, 0x5f, 0x3d, 0x96, + 0x18, 0x7a, 0xd3, 0x69, 0xce, 0x23, 0x28, 0x8f, 0x30, 0x86, 0xc9, 0xc5, 0xb9, 0xef, 0xf4, 0x0b, + 0x49, 0x38, 0xe6, 0x21, 0xea, 0x68, 0x5b, 0xd6, 0xe9, 0xab, 0xd7, 0xd8, 0xd5, 0x28, 0x2e, 0x35, + 0xe4, 0x69, 0x29, 0x79, 0x3f, 0x77, 0xf5, 0xda, 0x10, 0x79, 0xcd, 0x41, 0x7a, 0x4d, 0xd1, 0xcc, + 0x90, 0x2b, 0x63, 0x33, 0xee, 0xd9, 0x56, 0x52, 0xc6, 0x1e, 0xa4, 0x33, 0x90, 0x7d, 0x7a, 0xf9, + 0x91, 0x87, 0xe2, 0xf0, 0xa4, 0x38, 0x4f, 0x43, 0x16, 0xa2, 0xf8, 0x5a, 0x88, 0x38, 0xbe, 0xf1, + 0xda, 0xb1, 0x44, 0xe8, 0xe5, 0xaf, 0x70, 0x91, 0xf0, 0xde, 0x3a, 0xc2, 0xf8, 0x44, 0x12, 0x6a, + 0xc1, 0x5d, 0x01, 0x32, 0x15, 0x2d, 0x5b, 0xe9, 0xf6, 0x86, 0xdd, 0xfd, 0x3a, 0x07, 0xb9, 0x0d, + 0x41, 0x83, 0x2a, 0x30, 0x61, 0x61, 0xd5, 0xd0, 0x5b, 0x16, 0xed, 0x49, 0x4a, 0x16, 0x8f, 0xa4, + 0x37, 0xba, 0xa2, 0x1b, 0x16, 0x3f, 0x71, 0xca, 0x1e, 0x1a, 0xbf, 0x96, 0x38, 0xd8, 0xdc, 0x28, + 0x3a, 0x55, 0xd1, 0x09, 0xb2, 0x96, 0x78, 0xfe, 0xbe, 0x51, 0x1b, 0x2a, 0xec, 0x86, 0x9b, 0xd3, + 0x05, 0xcf, 0xee, 0xc9, 0xb1, 0xe0, 0xee, 0xc9, 0xb3, 0xb8, 0xd3, 0x79, 0x5a, 0x37, 0xae, 0xeb, + 0x1b, 0x84, 0xc7, 0x11, 0xc9, 0xc7, 0x92, 0x70, 0x6c, 0x60, 0xa3, 0x84, 0x9b, 0x97, 0x61, 0x12, + 0xa9, 0x43, 0x76, 0x51, 0x58, 0xad, 0x83, 0x0a, 0xe4, 0x57, 0x0e, 0x28, 0x90, 0x49, 0x51, 0x93, + 0x90, 0xc7, 0xbd, 0xd1, 0xf2, 0x10, 0xed, 0xbf, 0x09, 0x71, 0x7c, 0xf8, 0x09, 0xb8, 0xd3, 0xa3, + 0x40, 0xca, 0x96, 0xaa, 0xf1, 0x6b, 0x84, 0xde, 0x19, 0x73, 0xc8, 0x33, 0x63, 0x08, 0xc9, 0x1c, + 0x7d, 0x19, 0x3e, 0x69, 0xaa, 0xf1, 0x6c, 0x57, 0x35, 0x62, 0x96, 0x56, 0xa3, 0x14, 0xb7, 0x1a, + 0x31, 0x8c, 0xd2, 0x5f, 0x8d, 0xc3, 0x84, 0xb8, 0xf3, 0xf9, 0x18, 0xa4, 0xb1, 0xba, 0x63, 0xf0, + 0xc3, 0xee, 0xd2, 0x5c, 0x68, 0x7f, 0xe6, 0x38, 0xf5, 0x92, 0xba, 0x63, 0x5c, 0x1c, 0x93, 0x29, + 0x07, 0xbd, 0x2b, 0xd6, 0xe9, 0x5b, 0x3b, 0xfc, 0x4c, 0xf2, 0x89, 0xd1, 0xac, 0xe7, 0x09, 0xe9, + 0xc5, 0x31, 0x99, 0xf1, 0x90, 0x6a, 0xe9, 0x3d, 0xb7, 0x74, 0x9c, 0x6a, 0x97, 0xf5, 0x6d, 0x5a, + 0x2d, 0xe1, 0x40, 0x17, 0x01, 0x2c, 0x6c, 0x8b, 0xa3, 0x0c, 0xe3, 0x94, 0xff, 0xe4, 0x68, 0xfe, + 0x75, 0x6c, 0x33, 0xb7, 0x75, 0x71, 0x4c, 0xce, 0x59, 0xe2, 0x81, 0x20, 0x69, 0xba, 0x66, 0x37, + 0xd5, 0x1d, 0x45, 0xd3, 0xe9, 0x1e, 0x7c, 0x24, 0xd2, 0xb2, 0xae, 0xd9, 0x0b, 0x84, 0x9c, 0x20, + 0x69, 0xe2, 0x81, 0x88, 0x82, 0xde, 0x2d, 0xe5, 0x97, 0xb1, 0x22, 0x44, 0xf1, 0x0c, 0x21, 0x25, + 0xa2, 0xa0, 0x3c, 0xe8, 0x69, 0xc8, 0xd3, 0xed, 0xd6, 0xe6, 0x56, 0xc7, 0x50, 0xaf, 0xf2, 0x1b, + 0x28, 0xb3, 0xa3, 0x21, 0x1a, 0x84, 0xa1, 0x41, 0xe8, 0x2f, 0x8e, 0xc9, 0xb0, 0xe5, 0x3c, 0xa1, + 0x06, 0x64, 0xd9, 0xa9, 0x5f, 0x7b, 0x97, 0xdf, 0x21, 0xbc, 0x7b, 0x34, 0x12, 0x3d, 0x00, 0xbc, + 0xb1, 0x7b, 0x71, 0x4c, 0x9e, 0x50, 0xd9, 0x4f, 0xb4, 0x04, 0x39, 0xac, 0xb7, 0x78, 0x73, 0xf2, + 0xfc, 0xb6, 0xd5, 0x68, 0xbd, 0xd0, 0x5b, 0xa2, 0x31, 0x59, 0xcc, 0x7f, 0xa3, 0x27, 0x20, 0xa3, + 0x1a, 0xdd, 0xae, 0x66, 0xd3, 0xbb, 0x88, 0xf9, 0x33, 0x77, 0x45, 0x34, 0x84, 0xd2, 0x5e, 0x1c, + 0x93, 0x39, 0x17, 0x19, 0x9e, 0x16, 0xee, 0x68, 0xd7, 0xb0, 0x49, 0x3a, 0x33, 0x1d, 0x67, 0x78, + 0x16, 0x19, 0x3d, 0xed, 0x4e, 0xae, 0x25, 0x1e, 0x1a, 0x13, 0xdc, 0xbd, 0x48, 0x27, 0x21, 0xef, + 0xd1, 0x64, 0x62, 0xb1, 0xf8, 0x0a, 0x84, 0x3b, 0x7b, 0xf1, 0x28, 0x15, 0xa1, 0xe0, 0xd5, 0x5b, + 0xa9, 0xeb, 0x30, 0xd2, 0x4d, 0xfc, 0x0a, 0x4c, 0x5c, 0xc3, 0xa6, 0xc5, 0x76, 0xf0, 0x29, 0x23, + 0x7f, 0x44, 0x27, 0x60, 0x92, 0xca, 0xad, 0x29, 0xde, 0xb3, 0xeb, 0xcb, 0x05, 0x5a, 0x78, 0x85, + 0x13, 0xd5, 0x20, 0xdf, 0x3b, 0xd3, 0x73, 0x48, 0xd8, 0x1d, 0x6a, 0xe8, 0x9d, 0xe9, 0x71, 0x02, + 0xa9, 0x0e, 0xe5, 0xa0, 0xea, 0x7a, 0xbd, 0x66, 0x2e, 0xc4, 0x6b, 0xe6, 0x84, 0xa7, 0xfd, 0x9d, + 0xa4, 0xc3, 0xec, 0x68, 0x2b, 0x99, 0x6e, 0xc4, 0x48, 0x50, 0xee, 0xfc, 0x99, 0xea, 0x40, 0x68, + 0xe7, 0xf8, 0x9a, 0x46, 0x96, 0x84, 0x22, 0x9f, 0xf8, 0xd3, 0x5a, 0x42, 0xa6, 0x1c, 0xe8, 0x28, + 0x51, 0x28, 0x45, 0xd3, 0x9b, 0x5a, 0x4b, 0xdc, 0x3a, 0xa6, 0xcf, 0xcb, 0x2d, 0xf4, 0x0c, 0x94, + 0x55, 0x43, 0xb7, 0xb0, 0x6e, 0xf5, 0xad, 0x66, 0x4f, 0x31, 0x95, 0xae, 0x7b, 0x39, 0x2f, 0x7c, + 0x98, 0x16, 0x04, 0xf9, 0x1a, 0xa5, 0x96, 0x4b, 0xaa, 0xbf, 0x00, 0xad, 0x00, 0x5c, 0x53, 0x3a, + 0x5a, 0x4b, 0xb1, 0x0d, 0xd3, 0xe2, 0x77, 0x53, 0x86, 0x81, 0x5d, 0x11, 0x84, 0x9b, 0xbd, 0x96, + 0x62, 0x63, 0x1e, 0x44, 0x79, 0xf8, 0xd1, 0x3d, 0x50, 0x52, 0x7a, 0xbd, 0xa6, 0x65, 0x2b, 0x36, + 0x6e, 0x6e, 0xed, 0xd9, 0xd8, 0xa2, 0xf6, 0xa2, 0x20, 0x4f, 0x2a, 0xbd, 0xde, 0x3a, 0x29, 0x6d, + 0x90, 0x42, 0xa9, 0xe5, 0x8c, 0x36, 0x9d, 0x9a, 0x4e, 0x6c, 0x97, 0x70, 0x63, 0x3b, 0x52, 0x46, + 0x8f, 0x56, 0x30, 0x19, 0x88, 0xd3, 0x28, 0x99, 0x1d, 0xac, 0xb5, 0x77, 0xd8, 0x35, 0xf8, 0x94, + 0xcc, 0x9f, 0xc8, 0xc0, 0xf4, 0x4c, 0xe3, 0x1a, 0xe6, 0x37, 0xe0, 0xd9, 0x83, 0xf4, 0xab, 0x49, + 0x98, 0x1a, 0x98, 0xbe, 0x04, 0x97, 0x9e, 0xef, 0xe7, 0x75, 0x91, 0xdf, 0xe8, 0x1c, 0xc1, 0x55, + 0x5a, 0xfc, 0xce, 0x4a, 0xfe, 0xcc, 0x1d, 0x43, 0x24, 0x70, 0x91, 0x12, 0xf1, 0x8e, 0x73, 0x16, + 0xb4, 0x09, 0xe5, 0x8e, 0x62, 0xd9, 0x4d, 0x36, 0x8b, 0xd8, 0x6d, 0xe2, 0xd4, 0x48, 0x4b, 0xb0, + 0xa2, 0x88, 0xd9, 0x47, 0x94, 0x9b, 0xc3, 0x15, 0x3b, 0xbe, 0x52, 0xf4, 0x1c, 0xcc, 0x6c, 0xed, + 0xbd, 0xa4, 0xe8, 0xb6, 0xa6, 0xd3, 0xc3, 0x46, 0xfe, 0x31, 0xaa, 0x0d, 0x81, 0x5e, 0xba, 0xa6, + 0xb5, 0xb0, 0xae, 0x8a, 0xc1, 0x99, 0x76, 0x20, 0x9c, 0xc1, 0xb3, 0xa4, 0xe7, 0xa0, 0xe8, 0xb7, + 0x45, 0xa8, 0x08, 0x49, 0x7b, 0x97, 0x4b, 0x24, 0x69, 0xef, 0xa2, 0x47, 0x78, 0x44, 0x9e, 0xa4, + 0xa7, 0xe5, 0x86, 0x39, 0x0b, 0xce, 0xed, 0xde, 0x39, 0x94, 0x24, 0x67, 0x26, 0x38, 0x86, 0x21, + 0x88, 0x2d, 0x9d, 0x82, 0x52, 0xc0, 0x88, 0x79, 0x86, 0x35, 0xe1, 0x1d, 0x56, 0xa9, 0x04, 0x93, + 0x3e, 0x5b, 0x25, 0xfd, 0x51, 0x06, 0xb2, 0xce, 0xb7, 0x0c, 0x2e, 0x42, 0x0e, 0xef, 0xaa, 0xb8, + 0x67, 0x0b, 0xab, 0x30, 0xca, 0x88, 0x33, 0x9e, 0x25, 0x41, 0x4f, 0xcc, 0x95, 0xc3, 0x8c, 0xce, + 0xfa, 0x5c, 0xf2, 0x89, 0x28, 0x10, 0xaf, 0x4f, 0x7e, 0xdc, 0xef, 0x93, 0xef, 0x8a, 0xe0, 0x0d, + 0x38, 0xe5, 0xb3, 0x3e, 0xa7, 0x1c, 0x55, 0xb1, 0xcf, 0x2b, 0x2f, 0x87, 0x78, 0xe5, 0xa8, 0xee, + 0x0f, 0x71, 0xcb, 0xcb, 0x21, 0x6e, 0x79, 0x36, 0xb2, 0x2d, 0xa1, 0x7e, 0xf9, 0x71, 0xbf, 0x5f, + 0x8e, 0x12, 0x47, 0xc0, 0x31, 0xaf, 0x84, 0x39, 0xe6, 0x53, 0x11, 0x18, 0x43, 0x3d, 0xf3, 0xc2, + 0x80, 0x67, 0xbe, 0x27, 0x02, 0x2a, 0xc4, 0x35, 0x2f, 0xfb, 0x7c, 0x22, 0xc4, 0x92, 0x4d, 0xb8, + 0x53, 0x44, 0xe7, 0x07, 0xbd, 0xfc, 0xc9, 0x28, 0x55, 0x0b, 0x73, 0xf3, 0x4f, 0x06, 0xdc, 0xfc, + 0xdd, 0x51, 0xbd, 0x0a, 0xf8, 0x79, 0xd7, 0x3b, 0x9f, 0x22, 0xf6, 0x31, 0x30, 0x33, 0x88, 0x2d, + 0xc5, 0xa6, 0x69, 0x98, 0xdc, 0xf1, 0xb1, 0x07, 0x69, 0x96, 0x58, 0x6c, 0x57, 0xff, 0x47, 0x78, + 0x72, 0x3a, 0x69, 0x3d, 0xda, 0x2e, 0x7d, 0x2d, 0xe1, 0xf2, 0x52, 0xcb, 0xe6, 0xb5, 0xf6, 0x39, + 0x6e, 0xed, 0x3d, 0x0e, 0x3e, 0xe9, 0x77, 0xf0, 0x35, 0xc8, 0x13, 0x9f, 0x12, 0xf0, 0xdd, 0x4a, + 0x4f, 0xf8, 0x6e, 0x74, 0x2f, 0x4c, 0x51, 0xfb, 0xcb, 0xc2, 0x00, 0x6e, 0x48, 0xd2, 0xd4, 0x90, + 0x94, 0xc8, 0x0b, 0x26, 0x41, 0xe6, 0x28, 0x1e, 0x80, 0x69, 0x0f, 0x2d, 0xc1, 0xa5, 0xbe, 0x80, + 0x39, 0xa9, 0xb2, 0x43, 0x3d, 0xdf, 0xeb, 0x5d, 0x54, 0xac, 0x1d, 0x69, 0xd5, 0x15, 0x90, 0x1b, + 0x17, 0x20, 0x48, 0xab, 0x46, 0x8b, 0xf5, 0x7b, 0x52, 0xa6, 0xbf, 0x49, 0xac, 0xd0, 0x31, 0xda, + 0xfc, 0x04, 0x24, 0xf9, 0x49, 0xa8, 0x9c, 0xa9, 0x9d, 0x63, 0x73, 0x56, 0xfa, 0x72, 0xc2, 0xc5, + 0x73, 0x43, 0x85, 0x30, 0xaf, 0x9e, 0xb8, 0x95, 0x5e, 0x3d, 0xf9, 0xe6, 0xbc, 0xba, 0xf4, 0x46, + 0xc2, 0x1d, 0x52, 0xc7, 0x5f, 0xdf, 0x9c, 0x08, 0x88, 0x76, 0xb1, 0x1b, 0xe3, 0xec, 0xa4, 0x2e, + 0x7b, 0x10, 0xa1, 0x56, 0x26, 0x24, 0x41, 0x31, 0xe1, 0x49, 0x6a, 0xa0, 0x87, 0xa9, 0x9f, 0x37, + 0xb6, 0xb9, 0x69, 0xa8, 0x45, 0x24, 0x7a, 0x64, 0x46, 0xed, 0xf1, 0x2f, 0x39, 0x5f, 0xd8, 0x70, + 0x3b, 0xe4, 0x48, 0xd3, 0xd9, 0xf5, 0x27, 0xe0, 0xe9, 0x45, 0x51, 0x20, 0xb5, 0x00, 0x0d, 0xda, + 0x18, 0x74, 0x09, 0x32, 0xf8, 0x1a, 0x3d, 0x8d, 0xca, 0x92, 0x4d, 0xb7, 0x0f, 0x75, 0xc4, 0x58, + 0xb7, 0x1b, 0x15, 0x22, 0xcc, 0xef, 0xed, 0xd7, 0xca, 0x8c, 0xe7, 0x7e, 0xa3, 0xab, 0xd9, 0xb8, + 0xdb, 0xb3, 0xf7, 0x64, 0x8e, 0x22, 0xfd, 0x7c, 0x92, 0xf8, 0x43, 0x9f, 0xfd, 0x09, 0x15, 0xaf, + 0x98, 0x34, 0x49, 0x4f, 0x88, 0x14, 0x4f, 0xe4, 0x77, 0x00, 0xb4, 0x15, 0xab, 0x79, 0x5d, 0xd1, + 0x6d, 0xdc, 0xe2, 0x72, 0xcf, 0xb5, 0x15, 0xeb, 0x59, 0x5a, 0x40, 0xe2, 0x4d, 0xf2, 0xba, 0x6f, + 0xe1, 0x16, 0x1d, 0x80, 0x94, 0x3c, 0xd1, 0x56, 0xac, 0x4d, 0x0b, 0xb7, 0x3c, 0x7d, 0x9d, 0xb8, + 0x15, 0x7d, 0xf5, 0xcb, 0x3b, 0x1b, 0x94, 0xf7, 0x47, 0x93, 0xee, 0xec, 0x70, 0xc3, 0x87, 0x1f, + 0x4f, 0x59, 0x7c, 0x96, 0xae, 0x29, 0xfc, 0x4e, 0x00, 0x7d, 0x00, 0xa6, 0x9c, 0x59, 0xd9, 0xec, + 0xd3, 0xd9, 0x2a, 0xb4, 0xf0, 0x60, 0x93, 0xbb, 0x7c, 0xcd, 0x5f, 0x6c, 0xa1, 0x9f, 0x82, 0x23, + 0x01, 0x1b, 0xe4, 0x54, 0x90, 0x3c, 0x90, 0x29, 0x3a, 0xe4, 0x37, 0x45, 0x02, 0xdf, 0x95, 0x5e, + 0xea, 0x96, 0xcc, 0x9a, 0xbb, 0x48, 0x08, 0xeb, 0x75, 0x6f, 0x61, 0x3a, 0x21, 0xfd, 0x71, 0x02, + 0x4a, 0x81, 0x06, 0xa2, 0xc7, 0x60, 0x9c, 0x79, 0xe0, 0xc4, 0xc8, 0x44, 0x08, 0x95, 0x38, 0xef, + 0x13, 0x63, 0x40, 0xf3, 0x90, 0xc5, 0x3c, 0xba, 0xe6, 0x42, 0xb9, 0x3b, 0x22, 0x08, 0xe7, 0xfc, + 0x0e, 0x1b, 0x5a, 0x84, 0x9c, 0x23, 0xfa, 0x88, 0x95, 0x9b, 0x33, 0x72, 0x1c, 0xc4, 0x65, 0x94, + 0x16, 0x20, 0xef, 0x69, 0x1e, 0xbb, 0x0b, 0xb8, 0xcb, 0x97, 0x5b, 0x2c, 0x80, 0xce, 0x76, 0x95, + 0x5d, 0xba, 0xd2, 0x42, 0x47, 0x60, 0x82, 0xbc, 0x6c, 0xf3, 0xcb, 0x52, 0x29, 0x39, 0xd3, 0x55, + 0x76, 0x2f, 0x28, 0x96, 0xf4, 0xb1, 0x04, 0x14, 0xfd, 0xed, 0x44, 0xf7, 0x01, 0x22, 0xb4, 0x4a, + 0x1b, 0x37, 0xf5, 0x7e, 0x97, 0xf9, 0x48, 0x81, 0x58, 0xea, 0x2a, 0xbb, 0xf3, 0x6d, 0x7c, 0xa9, + 0xdf, 0xa5, 0x55, 0x5b, 0x68, 0x15, 0xca, 0x82, 0x58, 0x24, 0xbb, 0xb8, 0x54, 0x8e, 0x0e, 0x7e, + 0xd7, 0x86, 0x13, 0xb0, 0xb5, 0xee, 0xa7, 0xc8, 0x5a, 0xb7, 0xc8, 0xf0, 0xc4, 0x1b, 0xe9, 0x61, + 0x28, 0x05, 0x7a, 0x8c, 0x24, 0x98, 0xec, 0xf5, 0xb7, 0x9a, 0x57, 0xf1, 0x1e, 0xbd, 0xfd, 0xce, + 0x54, 0x3d, 0x27, 0xe7, 0x7b, 0xfd, 0xad, 0xa7, 0xf1, 0x1e, 0xcd, 0x1d, 0x4a, 0x2a, 0x14, 0xfd, + 0x8b, 0x29, 0xe2, 0x38, 0x4c, 0xa3, 0xaf, 0xb7, 0xc4, 0x77, 0x0d, 0xe8, 0x03, 0x3a, 0x07, 0xe3, + 0xd7, 0x0c, 0xa6, 0xcd, 0xa3, 0x56, 0x4f, 0x57, 0x0c, 0x1b, 0x7b, 0x96, 0x64, 0x8c, 0x47, 0xb2, + 0x60, 0x9c, 0xea, 0x65, 0xe8, 0x46, 0xc5, 0x15, 0x00, 0xc5, 0xb6, 0x4d, 0x6d, 0xab, 0xef, 0xc2, + 0x57, 0xe6, 0x06, 0xd3, 0xfa, 0x73, 0x6b, 0x8a, 0x66, 0x36, 0x6e, 0xe7, 0x9a, 0x3d, 0xe3, 0xf2, + 0x78, 0xb4, 0xdb, 0x83, 0x24, 0xbd, 0x9e, 0x86, 0x0c, 0x5b, 0x6e, 0xa2, 0x27, 0xfc, 0xc9, 0x8f, + 0xfc, 0x99, 0x63, 0xc3, 0x9a, 0xcf, 0xa8, 0x78, 0xeb, 0x9d, 0x08, 0xea, 0x9e, 0x60, 0x46, 0xa1, + 0x91, 0x7f, 0x75, 0xbf, 0x36, 0x41, 0xa3, 0x8f, 0xe5, 0x45, 0x37, 0xbd, 0x30, 0x6c, 0x75, 0x2d, + 0x72, 0x19, 0xe9, 0x03, 0xe7, 0x32, 0x2e, 0xc2, 0xa4, 0x27, 0xdc, 0xd2, 0x5a, 0x7c, 0x9d, 0x72, + 0x6c, 0xd4, 0xa4, 0x5b, 0x5e, 0xe4, 0xed, 0xcf, 0x3b, 0xe1, 0xd8, 0x72, 0x0b, 0xcd, 0xfa, 0x17, + 0xd9, 0x34, 0x6a, 0x63, 0xe1, 0x82, 0x67, 0xdd, 0x4c, 0xaf, 0xe4, 0xdf, 0x06, 0x39, 0x7a, 0xb1, + 0x99, 0x92, 0xb0, 0xe8, 0x21, 0x4b, 0x0a, 0xe8, 0xcb, 0x93, 0x50, 0x72, 0x03, 0x1b, 0x46, 0x92, + 0x65, 0x28, 0x6e, 0x31, 0x25, 0x7c, 0x10, 0x66, 0xe8, 0x87, 0xf2, 0x82, 0xd4, 0x39, 0x4a, 0x8d, + 0xc8, 0xbb, 0x2b, 0x7e, 0x8e, 0xbb, 0xa1, 0xe8, 0x9a, 0x50, 0x4a, 0x0b, 0x2c, 0xf5, 0xe1, 0x94, + 0x52, 0xb2, 0xa3, 0x90, 0x75, 0xc2, 0xce, 0x3c, 0xfb, 0x02, 0x9f, 0xc2, 0xa2, 0x4d, 0x27, 0x90, + 0x35, 0xb1, 0xd5, 0xef, 0xd8, 0x1c, 0xa4, 0x40, 0x69, 0x68, 0x20, 0x2b, 0xb3, 0x72, 0x4a, 0x7b, + 0x02, 0x26, 0x85, 0x55, 0x61, 0x74, 0x93, 0x94, 0xae, 0x20, 0x0a, 0x29, 0xd1, 0x29, 0x28, 0xf7, + 0x4c, 0xa3, 0x67, 0x58, 0xd8, 0x6c, 0x2a, 0xad, 0x96, 0x89, 0x2d, 0xab, 0x52, 0x64, 0x78, 0xa2, + 0x7c, 0x9e, 0x15, 0x4b, 0xef, 0x81, 0x09, 0x11, 0x4f, 0xcf, 0xc0, 0x78, 0xc3, 0xb1, 0x90, 0x69, + 0x99, 0x3d, 0x10, 0xff, 0x3a, 0xdf, 0xeb, 0xf1, 0xec, 0x1a, 0xf9, 0x29, 0x75, 0x60, 0x82, 0x0f, + 0x58, 0x68, 0x4e, 0x65, 0x15, 0x0a, 0x3d, 0xc5, 0x24, 0xdd, 0xf0, 0x66, 0x56, 0x86, 0xad, 0x08, + 0xd7, 0x14, 0xd3, 0x5e, 0xc7, 0xb6, 0x2f, 0xc1, 0x92, 0xa7, 0xfc, 0xac, 0x48, 0x3a, 0x0b, 0x93, + 0x3e, 0x1a, 0xf7, 0x7b, 0x85, 0x7c, 0xa2, 0xd3, 0x07, 0xa7, 0x25, 0x49, 0xb7, 0x25, 0xd2, 0x39, + 0xc8, 0x39, 0x63, 0x45, 0x16, 0x1a, 0x42, 0x14, 0xfc, 0x03, 0x88, 0xfc, 0x91, 0x26, 0x91, 0x8c, + 0xeb, 0xfc, 0x53, 0x4e, 0x29, 0x99, 0x3d, 0x48, 0xd8, 0x63, 0x98, 0x98, 0x37, 0x43, 0x8f, 0xc3, + 0x04, 0x37, 0x4c, 0x7c, 0x3e, 0x0e, 0x4b, 0x17, 0xad, 0x51, 0x4b, 0x25, 0xd2, 0x45, 0xcc, 0x6e, + 0xb9, 0xd5, 0x24, 0xbd, 0xd5, 0x7c, 0x08, 0xb2, 0xc2, 0xf8, 0xf8, 0xbd, 0x04, 0xab, 0xe1, 0x78, + 0x94, 0x97, 0xe0, 0x95, 0xb8, 0x8c, 0x44, 0x9b, 0x2c, 0xad, 0xad, 0xe3, 0x56, 0xd3, 0x9d, 0x82, + 0xfc, 0xc2, 0x6c, 0x89, 0xbd, 0x58, 0x11, 0xf3, 0x4b, 0x7a, 0x10, 0x32, 0xac, 0xad, 0xa1, 0x26, + 0x2e, 0xcc, 0xb5, 0x7e, 0x37, 0x01, 0x59, 0xe1, 0x3e, 0x42, 0x99, 0x7c, 0x9d, 0x48, 0xde, 0x6c, + 0x27, 0x6e, 0xbd, 0x49, 0xba, 0x1f, 0x10, 0xd5, 0x94, 0xe6, 0x35, 0xc3, 0xd6, 0xf4, 0x76, 0x93, + 0x8d, 0x05, 0xbf, 0x37, 0x48, 0xdf, 0x5c, 0xa1, 0x2f, 0xd6, 0x48, 0xf9, 0xbd, 0x27, 0x20, 0xef, + 0xc9, 0x72, 0xa1, 0x09, 0x48, 0x5d, 0xc2, 0xd7, 0xcb, 0x63, 0x28, 0x0f, 0x13, 0x32, 0xa6, 0x39, + 0x82, 0x72, 0xe2, 0xcc, 0xeb, 0x13, 0x50, 0x9a, 0x6f, 0x2c, 0x2c, 0xcf, 0xf7, 0x7a, 0x1d, 0x8d, + 0xdf, 0xa7, 0xbb, 0x0c, 0x69, 0xba, 0x4e, 0x8e, 0xb1, 0xbf, 0x53, 0x8d, 0x93, 0x70, 0x42, 0x32, + 0x8c, 0xd3, 0xe5, 0x34, 0x8a, 0xb3, 0xed, 0x53, 0x8d, 0x95, 0x87, 0x22, 0x8d, 0xa4, 0x0a, 0x17, + 0x63, 0x37, 0xa8, 0x1a, 0x27, 0x39, 0x85, 0x7e, 0x0a, 0x72, 0xee, 0x3a, 0x39, 0xee, 0x1e, 0x51, + 0x35, 0x76, 0xda, 0x8a, 0xe0, 0xbb, 0x2b, 0x83, 0xb8, 0x5b, 0x13, 0xd5, 0xd8, 0xf9, 0x1a, 0xf4, + 0x1c, 0x4c, 0x88, 0x35, 0x58, 0xbc, 0x5d, 0x9c, 0x6a, 0xcc, 0x94, 0x12, 0x19, 0x3e, 0xb6, 0x74, + 0x8e, 0xb3, 0x55, 0x55, 0x8d, 0x95, 0x37, 0x43, 0x9b, 0x90, 0xe1, 0xc1, 0x6f, 0xac, 0x9d, 0x9e, + 0x6a, 0xbc, 0x44, 0x11, 0x11, 0xb2, 0x9b, 0x9c, 0x88, 0xbb, 0x3d, 0x57, 0x8d, 0x9d, 0x30, 0x44, + 0x0a, 0x80, 0x67, 0x3d, 0x1d, 0x7b, 0xdf, 0xad, 0x1a, 0x3f, 0x11, 0x88, 0x3e, 0x08, 0x59, 0x67, + 0xd5, 0x14, 0x73, 0x27, 0xad, 0x1a, 0x37, 0x17, 0xd7, 0xd8, 0x8c, 0x7d, 0x4a, 0xe2, 0xbe, 0xc8, + 0x53, 0x12, 0xee, 0x26, 0xb7, 0xb3, 0x0d, 0xfe, 0x97, 0x09, 0x38, 0x1a, 0xdc, 0x4e, 0x56, 0xf4, + 0xbd, 0x21, 0x07, 0x02, 0x86, 0x9c, 0x16, 0x79, 0x1c, 0x52, 0xf3, 0xfa, 0x1e, 0x09, 0x36, 0xe8, + 0x37, 0x00, 0xfb, 0x66, 0x47, 0xa4, 0xe9, 0xc8, 0xf3, 0xa6, 0xd9, 0x09, 0x3f, 0x35, 0x52, 0x4f, + 0x7f, 0xff, 0xf3, 0xb5, 0xb1, 0xc6, 0xd5, 0x90, 0x5e, 0x45, 0x9c, 0x15, 0xc8, 0xce, 0xeb, 0x7b, + 0xe2, 0x98, 0xc0, 0x38, 0xed, 0xd0, 0x41, 0xb7, 0xff, 0x5f, 0x2b, 0x10, 0x64, 0xcf, 0x77, 0x84, + 0x79, 0x8f, 0x33, 0xec, 0x69, 0xc8, 0x0e, 0x7f, 0xf4, 0x89, 0x81, 0xea, 0x70, 0x69, 0x4a, 0x17, + 0x20, 0xbd, 0x60, 0x68, 0x34, 0xe4, 0x69, 0x61, 0xdd, 0xe8, 0x8a, 0x9c, 0x27, 0x7d, 0x40, 0x27, + 0x20, 0xa3, 0x74, 0x8d, 0xbe, 0x6e, 0x8b, 0xa8, 0x99, 0xb8, 0x92, 0xff, 0xba, 0x5f, 0x4b, 0x2d, + 0xeb, 0xb6, 0xcc, 0x5f, 0xd5, 0xd3, 0x7f, 0xf1, 0x4a, 0x2d, 0x21, 0x3d, 0x05, 0x13, 0x8b, 0x58, + 0xbd, 0x19, 0xac, 0x45, 0xac, 0x06, 0xb0, 0x4e, 0x41, 0x76, 0x59, 0xb7, 0xd9, 0x37, 0xc3, 0xee, + 0x80, 0x94, 0xa6, 0xb3, 0x6d, 0x91, 0x40, 0xfd, 0xa4, 0x9c, 0x90, 0x2e, 0x62, 0xd5, 0x21, 0x6d, + 0x61, 0x35, 0x48, 0x4a, 0xe0, 0x49, 0xb9, 0xd4, 0x80, 0xc2, 0x15, 0xa5, 0xc3, 0xc3, 0x3d, 0x6c, + 0xa1, 0xfb, 0x21, 0xa7, 0x88, 0x07, 0xba, 0xb2, 0x2a, 0x34, 0x8a, 0x3f, 0xd8, 0xaf, 0x81, 0x4b, + 0x24, 0xbb, 0x04, 0xf5, 0xf4, 0xcb, 0xff, 0xed, 0x78, 0x42, 0x32, 0x60, 0xe2, 0x82, 0x62, 0x51, + 0x4b, 0xff, 0x90, 0x2f, 0x91, 0x42, 0x23, 0xc5, 0xc6, 0xa1, 0x1b, 0xfb, 0xb5, 0xa9, 0x3d, 0xa5, + 0xdb, 0xa9, 0x4b, 0xee, 0x3b, 0xc9, 0x9b, 0x5f, 0x99, 0xf3, 0xe4, 0x57, 0x68, 0x24, 0xd9, 0x98, + 0xbe, 0xb1, 0x5f, 0x2b, 0xb9, 0x3c, 0xe4, 0x8d, 0xe4, 0x24, 0x5d, 0xa4, 0x1e, 0x64, 0x58, 0xd0, + 0x1b, 0xba, 0x43, 0xc8, 0x53, 0x3e, 0x49, 0x37, 0xe5, 0x53, 0x3f, 0x50, 0x9a, 0x81, 0xc7, 0x65, + 0x8c, 0xa3, 0x9e, 0xfe, 0xc8, 0x2b, 0xb5, 0x31, 0xc9, 0x04, 0xb4, 0xae, 0x75, 0xfb, 0x1d, 0x76, + 0xf1, 0x5b, 0x6c, 0x35, 0x3d, 0xc4, 0xda, 0x4d, 0xd3, 0x49, 0x2c, 0x20, 0x2b, 0xcd, 0x71, 0x25, + 0xe5, 0x02, 0x61, 0x71, 0xc6, 0xb7, 0xf6, 0x6b, 0x09, 0xda, 0x7a, 0x2a, 0xa3, 0x7b, 0x20, 0xc3, + 0x42, 0x79, 0x1e, 0xff, 0x14, 0x05, 0x0f, 0xeb, 0x93, 0xcc, 0xdf, 0x4a, 0x4f, 0xc0, 0xc4, 0xaa, + 0xd5, 0x5e, 0x24, 0x5d, 0x3a, 0x0a, 0xd9, 0xae, 0xd5, 0x6e, 0x7a, 0xa2, 0xa9, 0x89, 0xae, 0xd5, + 0xde, 0x18, 0x12, 0x85, 0xf1, 0x61, 0x79, 0x2f, 0x64, 0x36, 0x76, 0x29, 0xfb, 0x09, 0x47, 0x4a, + 0x29, 0x6f, 0x1b, 0x39, 0xba, 0x8f, 0xe9, 0xc3, 0x29, 0x80, 0x8d, 0x5d, 0xa7, 0x87, 0x43, 0xb6, + 0xe0, 0x90, 0x04, 0x19, 0x7b, 0xd7, 0x89, 0xa8, 0x73, 0x0d, 0x78, 0x75, 0xbf, 0x96, 0xd9, 0xd8, + 0x25, 0xcb, 0x0b, 0x99, 0xbf, 0xf1, 0xa7, 0xb2, 0x52, 0x81, 0x54, 0x96, 0x93, 0xc0, 0x4b, 0x87, + 0x24, 0xf0, 0xc6, 0x3d, 0x3b, 0x00, 0x47, 0x60, 0xc2, 0x54, 0xae, 0x37, 0xc9, 0x88, 0xb2, 0xaf, + 0x95, 0x66, 0x4c, 0xe5, 0xfa, 0x8a, 0xd1, 0x46, 0x0b, 0x90, 0xee, 0x18, 0x6d, 0x91, 0x77, 0x3b, + 0x2c, 0x3a, 0x45, 0x22, 0x2e, 0x7e, 0x9a, 0x78, 0xc5, 0x68, 0x37, 0x8e, 0x10, 0xf9, 0x7f, 0xe9, + 0x4f, 0x6b, 0x25, 0x7f, 0xb9, 0x25, 0x53, 0x66, 0x27, 0x19, 0x98, 0x1d, 0x9a, 0x0c, 0xcc, 0x8d, + 0x4a, 0x06, 0x82, 0x3f, 0x19, 0x78, 0x17, 0xdd, 0xd3, 0x64, 0x7b, 0x38, 0x33, 0x03, 0xc1, 0xe7, + 0xbc, 0xbe, 0x47, 0x77, 0x51, 0x6f, 0x87, 0x9c, 0x73, 0x50, 0x88, 0x7f, 0x1e, 0xda, 0x2d, 0xe0, + 0xfa, 0xf6, 0x91, 0x04, 0x14, 0xfd, 0x2d, 0xa6, 0xf9, 0x1c, 0xab, 0xcd, 0x3f, 0xac, 0xca, 0xd2, + 0x9e, 0x44, 0x29, 0x96, 0x45, 0xa6, 0x3c, 0xa0, 0xf3, 0xf3, 0x01, 0x9d, 0x9f, 0x16, 0x02, 0x62, + 0x77, 0x77, 0x98, 0xaa, 0xcf, 0x70, 0xe9, 0x14, 0x3c, 0x85, 0x96, 0xab, 0xfa, 0x54, 0x23, 0x7e, + 0x1a, 0xf2, 0x9e, 0xb7, 0xa1, 0x41, 0xfd, 0xa3, 0x21, 0xc9, 0x8e, 0x29, 0x67, 0x40, 0xc4, 0x1b, + 0xb1, 0x85, 0xe0, 0x92, 0x3a, 0x8a, 0x9a, 0x73, 0x88, 0xe2, 0x1e, 0xaf, 0x68, 0x2c, 0xfe, 0xc9, + 0x77, 0x8e, 0x8d, 0xbd, 0xfc, 0xea, 0xb1, 0xb1, 0xa1, 0xe7, 0x33, 0xa5, 0xe8, 0x2f, 0xd1, 0x3b, + 0x5e, 0xe6, 0xa3, 0xef, 0x87, 0xdb, 0x39, 0x8d, 0x65, 0x2b, 0x57, 0x35, 0xbd, 0x2d, 0xfe, 0x72, + 0x77, 0x53, 0xe4, 0xbd, 0xe1, 0xa5, 0x37, 0xef, 0x76, 0xde, 0xec, 0xa1, 0xb1, 0x6a, 0x98, 0x37, + 0x94, 0xf6, 0xd3, 0x80, 0x56, 0xad, 0xf6, 0x82, 0x89, 0xd9, 0xc7, 0x46, 0xf8, 0x3a, 0xc9, 0x7f, + 0xd9, 0x87, 0xdb, 0xa8, 0xdb, 0xe6, 0xfc, 0x7d, 0x71, 0xbe, 0x2f, 0xed, 0xe6, 0x88, 0x7c, 0x57, + 0x84, 0x96, 0x00, 0x68, 0x7a, 0xc5, 0xb2, 0xdc, 0x64, 0x5e, 0x2d, 0x88, 0xb1, 0xe0, 0x50, 0xc8, + 0x8a, 0x8d, 0x2d, 0x31, 0xd6, 0x2e, 0x23, 0xfa, 0x10, 0x4c, 0x77, 0x35, 0xbd, 0x69, 0xe1, 0xce, + 0x76, 0xb3, 0x85, 0x3b, 0xf4, 0x53, 0x2c, 0x7c, 0xe3, 0x2e, 0xd7, 0x58, 0xe1, 0x8e, 0xe9, 0x9e, + 0xe8, 0x31, 0x9b, 0x5b, 0xd6, 0xed, 0x1b, 0xfb, 0xb5, 0x2a, 0xf3, 0x0e, 0x21, 0x90, 0x92, 0x3c, + 0xd5, 0xd5, 0xf4, 0x75, 0xdc, 0xd9, 0x5e, 0x74, 0xca, 0xd0, 0x4b, 0x30, 0xc5, 0x29, 0x0c, 0x37, + 0xe9, 0x41, 0x6c, 0x4f, 0xa1, 0xb1, 0x7a, 0x63, 0xbf, 0x56, 0x61, 0x68, 0x03, 0x24, 0xd2, 0x0f, + 0xf6, 0x6b, 0x0f, 0xc4, 0x68, 0xd3, 0xbc, 0xaa, 0x0a, 0xf7, 0x58, 0x76, 0x40, 0x78, 0x09, 0xa9, + 0xdb, 0x4d, 0xd0, 0x8b, 0xba, 0xc7, 0x83, 0x75, 0x0f, 0x90, 0xc4, 0xad, 0xdb, 0xe3, 0x9a, 0xdd, + 0x0c, 0xbe, 0xa8, 0xfb, 0x30, 0x64, 0x7a, 0xfd, 0x2d, 0xb1, 0x8b, 0x96, 0x93, 0xf9, 0x13, 0x9a, + 0xf5, 0x6e, 0xa4, 0xe5, 0xcf, 0x14, 0xc4, 0x78, 0x92, 0x58, 0xc5, 0x49, 0x73, 0xb2, 0xd8, 0x8f, + 0x46, 0x1f, 0x5f, 0x4b, 0x41, 0x79, 0xd5, 0x6a, 0x2f, 0xb5, 0x34, 0xfb, 0x16, 0xab, 0x57, 0x2f, + 0x4c, 0x3a, 0xd4, 0x9b, 0x35, 0x16, 0x6e, 0xec, 0xd7, 0x8a, 0x4c, 0x3a, 0xb7, 0x52, 0x26, 0x5d, + 0x28, 0xb9, 0x7a, 0xd9, 0x34, 0x15, 0x9b, 0xbb, 0xa7, 0xc6, 0x62, 0x4c, 0x0d, 0x5c, 0xc4, 0xea, + 0x8d, 0xfd, 0xda, 0x61, 0xd6, 0xb2, 0x00, 0x94, 0x24, 0x17, 0x55, 0xdf, 0x5c, 0x40, 0xbb, 0xe1, + 0x8a, 0x4f, 0xf7, 0x9f, 0x1a, 0x17, 0xdf, 0x42, 0xa5, 0xe7, 0x43, 0xf7, 0xd5, 0x24, 0xe4, 0x89, + 0xab, 0x67, 0xe5, 0x38, 0x7c, 0x2a, 0x24, 0x7e, 0x84, 0x53, 0x21, 0xf9, 0xf6, 0x4c, 0x85, 0x7b, + 0x9d, 0x58, 0x3b, 0x35, 0x54, 0xe7, 0xfd, 0x21, 0xf7, 0x7f, 0x4c, 0x51, 0xab, 0x4a, 0x57, 0x90, + 0x32, 0x6e, 0xbd, 0x13, 0x04, 0xf8, 0xb3, 0x09, 0x38, 0xe4, 0x8a, 0xc7, 0x32, 0xd5, 0x80, 0x14, + 0x9f, 0xb9, 0xb1, 0x5f, 0xbb, 0x3d, 0x28, 0x45, 0x0f, 0xd9, 0x4d, 0x48, 0x72, 0xda, 0x01, 0x5a, + 0x37, 0xd5, 0xf0, 0x76, 0xb4, 0x2c, 0xdb, 0x69, 0x47, 0x6a, 0x78, 0x3b, 0x3c, 0x64, 0x6f, 0xaa, + 0x1d, 0x8b, 0x96, 0x3d, 0x38, 0xa8, 0xe9, 0x98, 0x83, 0xfa, 0xf5, 0x24, 0x4c, 0xae, 0x5a, 0xed, + 0x4d, 0xbd, 0xf5, 0xee, 0x84, 0x38, 0xe8, 0x84, 0xf8, 0x58, 0x02, 0x8a, 0x17, 0x35, 0xcb, 0x36, + 0x4c, 0x4d, 0x55, 0x3a, 0x74, 0x35, 0xe3, 0x9e, 0x91, 0x4c, 0x1c, 0xfc, 0x8c, 0xe4, 0xa3, 0x90, + 0xb9, 0xa6, 0x74, 0xd8, 0xbf, 0x35, 0x4a, 0xd1, 0x3d, 0xc2, 0x80, 0xef, 0x08, 0xe6, 0x80, 0x39, + 0x39, 0x6f, 0xce, 0x6f, 0x27, 0xa1, 0x14, 0x08, 0x3c, 0x50, 0x03, 0xd2, 0xd4, 0xa2, 0xb3, 0x05, + 0xef, 0xdc, 0x01, 0xe2, 0x0a, 0xb2, 0x26, 0xa6, 0xbc, 0xe8, 0x27, 0x20, 0xdb, 0x55, 0x76, 0x99, + 0x67, 0x60, 0xeb, 0x9b, 0xf9, 0x83, 0xe1, 0xb8, 0xab, 0x57, 0x81, 0x23, 0xc9, 0x13, 0x5d, 0x65, + 0x97, 0xfa, 0x83, 0x1e, 0x94, 0x48, 0xa9, 0xba, 0xa3, 0xe8, 0x6d, 0xec, 0x75, 0x3f, 0x17, 0x0f, + 0x5c, 0xc9, 0x61, 0xb7, 0x12, 0x0f, 0x9c, 0x24, 0x4f, 0x76, 0x95, 0xdd, 0x05, 0x5a, 0x40, 0x6a, + 0xac, 0x67, 0x3f, 0xf5, 0x4a, 0x6d, 0x8c, 0x4a, 0xec, 0xdf, 0x27, 0x00, 0x5c, 0x89, 0xa1, 0x0d, + 0x28, 0x07, 0xdc, 0x97, 0x38, 0x63, 0x14, 0x19, 0xe0, 0xb9, 0x0b, 0xdb, 0x92, 0x1a, 0x18, 0x82, + 0x0f, 0x42, 0x9e, 0x9d, 0x12, 0x68, 0xd2, 0x64, 0x7c, 0x32, 0x32, 0x19, 0x7f, 0x8c, 0x60, 0xdd, + 0xd8, 0xaf, 0x21, 0xd6, 0x1d, 0x0f, 0xb3, 0x44, 0x53, 0xf4, 0xc0, 0x4a, 0x08, 0x83, 0xbf, 0x2f, + 0x79, 0x4f, 0x6c, 0x41, 0xcf, 0x9e, 0x19, 0xba, 0x76, 0x15, 0x9b, 0xce, 0x1a, 0x99, 0x3d, 0xa2, + 0x2a, 0x64, 0xd9, 0x57, 0x05, 0xed, 0x3d, 0xf1, 0x6f, 0x2d, 0xc4, 0x33, 0xe1, 0xba, 0x8e, 0xb7, + 0x2c, 0x4d, 0x8c, 0x82, 0x2c, 0x1e, 0xd1, 0x79, 0x28, 0x5b, 0x58, 0xed, 0x9b, 0x9a, 0xbd, 0xd7, + 0x54, 0x0d, 0xdd, 0x56, 0x54, 0x9b, 0x3b, 0xed, 0xdb, 0x6e, 0xec, 0xd7, 0x8e, 0xb0, 0xb6, 0x06, + 0x29, 0x24, 0xb9, 0x24, 0x8a, 0x16, 0x58, 0x09, 0xa9, 0xa1, 0x85, 0x6d, 0x45, 0xeb, 0x58, 0x7c, + 0x61, 0x2b, 0x1e, 0x3d, 0x7d, 0xf9, 0xad, 0x09, 0xef, 0x66, 0xd4, 0x75, 0x28, 0x1b, 0x3d, 0x6c, + 0x86, 0xd8, 0xa3, 0x15, 0xb7, 0xe6, 0x20, 0xc5, 0x4d, 0x98, 0x84, 0x92, 0xc0, 0x10, 0x16, 0xe1, + 0xbc, 0xef, 0xcc, 0x19, 0x8b, 0x1b, 0x93, 0xc1, 0x2e, 0x07, 0x29, 0x24, 0xef, 0x41, 0x33, 0x16, + 0x5d, 0x1e, 0x86, 0xcc, 0x0b, 0x8a, 0xd6, 0x11, 0x9f, 0x5a, 0x95, 0xf9, 0x13, 0x5a, 0x86, 0x8c, + 0x65, 0x2b, 0x76, 0x9f, 0x85, 0xde, 0xe3, 0x8d, 0xf7, 0xc4, 0x6c, 0x73, 0xc3, 0xd0, 0x5b, 0xeb, + 0x94, 0x51, 0xe6, 0x00, 0xe8, 0x3c, 0x64, 0x6c, 0xe3, 0x2a, 0xd6, 0xb9, 0x50, 0x0f, 0x34, 0xd3, + 0x69, 0xa2, 0x8e, 0x71, 0x23, 0x1b, 0x5c, 0xa3, 0xdc, 0xb4, 0x76, 0x14, 0x13, 0x5b, 0x2c, 0x54, + 0x6e, 0x2c, 0x1f, 0x78, 0x3a, 0x1e, 0x09, 0x7a, 0x0a, 0x86, 0x27, 0xc9, 0x25, 0xa7, 0x68, 0x9d, + 0x96, 0x04, 0x23, 0xe7, 0x89, 0x9b, 0x8a, 0x9c, 0xcf, 0x43, 0xb9, 0xaf, 0x6f, 0x19, 0x3a, 0xfd, + 0x2c, 0x22, 0x4f, 0xd3, 0x64, 0x8f, 0x27, 0x66, 0x53, 0xde, 0xd1, 0x0a, 0x52, 0x48, 0x72, 0xc9, + 0x29, 0xe2, 0xa7, 0x1f, 0x5b, 0x50, 0x74, 0xa9, 0xe8, 0x94, 0xcd, 0x45, 0x4e, 0xd9, 0x3b, 0xf9, + 0x94, 0x3d, 0x14, 0xac, 0xc5, 0x9d, 0xb5, 0x93, 0x4e, 0x21, 0x61, 0x43, 0xef, 0xf7, 0x2d, 0x23, + 0x81, 0xd7, 0x30, 0xd4, 0xca, 0xc4, 0x5f, 0x41, 0xe6, 0xdf, 0x96, 0x15, 0x64, 0xbd, 0xf0, 0x91, + 0x57, 0x6a, 0x63, 0xce, 0x84, 0xfd, 0x85, 0x24, 0x64, 0x16, 0xaf, 0xd0, 0x6b, 0x94, 0x3f, 0xa6, + 0xe1, 0x83, 0xc7, 0x7a, 0xbd, 0x0f, 0x26, 0x98, 0x2c, 0x2c, 0x74, 0x06, 0xc6, 0x7b, 0xe4, 0x07, + 0xcf, 0x35, 0x1e, 0x1e, 0x50, 0x69, 0x4a, 0x27, 0x56, 0x98, 0x94, 0x54, 0xfa, 0x42, 0x0a, 0x60, + 0xf1, 0xca, 0x95, 0x0d, 0x53, 0xeb, 0x75, 0xb0, 0xfd, 0x6e, 0x78, 0xfd, 0xce, 0x09, 0xaf, 0x3d, + 0x63, 0xfc, 0x34, 0xe4, 0xdd, 0x31, 0xb2, 0xd0, 0xe3, 0x90, 0xb5, 0xf9, 0x6f, 0x3e, 0xd4, 0xd5, + 0xc1, 0xa1, 0x16, 0xe4, 0x7c, 0xb8, 0x1d, 0x0e, 0xe9, 0xbf, 0x24, 0x01, 0xa2, 0x92, 0x33, 0x3f, + 0x06, 0x01, 0xf8, 0x79, 0xc8, 0x70, 0x8f, 0x93, 0xba, 0xa9, 0x68, 0x95, 0x73, 0x7b, 0x46, 0xe9, + 0x3b, 0x49, 0x98, 0xde, 0x14, 0x66, 0xf7, 0x5d, 0x09, 0xa3, 0x8b, 0x30, 0x81, 0x75, 0xdb, 0xd4, + 0xb0, 0x48, 0x83, 0xcf, 0x06, 0xb5, 0x34, 0x44, 0x5a, 0xf4, 0xdf, 0x25, 0x88, 0xd3, 0x72, 0x9c, + 0xdd, 0x23, 0xe3, 0x8f, 0xa7, 0xa0, 0x32, 0x8c, 0x0b, 0x2d, 0x40, 0x49, 0x35, 0x31, 0x2d, 0x68, + 0x7a, 0x77, 0x4e, 0x1a, 0x55, 0x4f, 0xc6, 0xc8, 0x4f, 0x20, 0xc9, 0x45, 0x51, 0xc2, 0x1d, 0x72, + 0x9b, 0x26, 0xa8, 0xc8, 0x54, 0x21, 0x54, 0x31, 0x83, 0x68, 0x89, 0x7b, 0x64, 0x37, 0x2d, 0xe5, + 0x05, 0x60, 0x2e, 0xb9, 0xe8, 0x96, 0x52, 0x9f, 0xfc, 0x22, 0x94, 0x34, 0x5d, 0xb3, 0x35, 0xa5, + 0xd3, 0xdc, 0x52, 0x3a, 0x8a, 0xae, 0xde, 0xcc, 0x52, 0x84, 0x79, 0x53, 0x5e, 0x6d, 0x00, 0x4e, + 0x92, 0x8b, 0xbc, 0xa4, 0xc1, 0x0a, 0xc8, 0x88, 0x88, 0xaa, 0xd2, 0x37, 0x15, 0xb8, 0x09, 0x76, + 0xcf, 0x88, 0xfc, 0x62, 0x0a, 0xa6, 0x9c, 0xfc, 0xcc, 0xbb, 0x43, 0x11, 0x77, 0x28, 0x56, 0x01, + 0x98, 0x01, 0x21, 0x9e, 0xe3, 0x26, 0x46, 0x83, 0x98, 0xa0, 0x1c, 0x43, 0x58, 0xb4, 0x6c, 0xcf, + 0x78, 0xfc, 0x79, 0x0a, 0x0a, 0xde, 0xf1, 0x78, 0xd7, 0xa5, 0xbf, 0x83, 0x32, 0x66, 0xf3, 0xae, + 0x49, 0x4c, 0xf3, 0xef, 0xa2, 0x04, 0x4c, 0xe2, 0xc0, 0x54, 0x1a, 0x6e, 0x0b, 0xff, 0x2a, 0x09, + 0x19, 0x7e, 0x2e, 0x5b, 0x1d, 0x58, 0x45, 0x24, 0xa2, 0xce, 0x7d, 0x8f, 0x5e, 0x44, 0x7c, 0x2a, + 0x74, 0x11, 0x51, 0xec, 0x2a, 0xbb, 0x4d, 0xdf, 0x2d, 0xa6, 0xc4, 0xec, 0x64, 0xe3, 0xa8, 0x8b, + 0xe2, 0x7f, 0xcf, 0x72, 0x21, 0xee, 0x99, 0x5c, 0xf4, 0x28, 0xe4, 0x09, 0x85, 0xeb, 0x15, 0x08, + 0xfb, 0x61, 0x37, 0xf9, 0xe0, 0x79, 0x29, 0xc9, 0xd0, 0x55, 0x76, 0x97, 0xd8, 0x03, 0x5a, 0x01, + 0xb4, 0xe3, 0xa4, 0xbe, 0x9a, 0xae, 0x08, 0x09, 0xff, 0x1d, 0x37, 0xf6, 0x6b, 0x47, 0x19, 0xff, + 0x20, 0x8d, 0x24, 0x4f, 0xb9, 0x85, 0x02, 0xed, 0x21, 0x00, 0xd2, 0xaf, 0x26, 0x3b, 0x13, 0xc2, + 0x96, 0xb0, 0x9e, 0x83, 0x12, 0xee, 0x3b, 0x49, 0xce, 0x91, 0x87, 0x45, 0xf2, 0xdb, 0x23, 0xf8, + 0x5f, 0x4a, 0x00, 0x72, 0x7d, 0x8f, 0xb3, 0x5f, 0xff, 0x7e, 0x7a, 0x2f, 0x51, 0xac, 0x8c, 0x12, + 0xe1, 0x8b, 0x2c, 0x97, 0x4f, 0x2c, 0xb2, 0x3c, 0x53, 0xf5, 0x7e, 0xd7, 0x3e, 0x27, 0x87, 0x66, + 0x05, 0x43, 0x6c, 0xf0, 0x1f, 0x24, 0xe0, 0xe8, 0x80, 0xe2, 0x38, 0xed, 0xba, 0x02, 0xc8, 0xf4, + 0xbc, 0xe4, 0xff, 0xa1, 0x28, 0xc1, 0xff, 0xe1, 0x5f, 0x4c, 0xfd, 0x9b, 0x32, 0x07, 0x6c, 0xfc, + 0xad, 0xf3, 0x26, 0x3c, 0xa3, 0x98, 0x80, 0x19, 0x6f, 0xf5, 0x4e, 0x07, 0xce, 0x43, 0xc1, 0x5b, + 0x3b, 0x6f, 0xfa, 0xed, 0xa3, 0x9a, 0xce, 0x5b, 0xed, 0xe3, 0x43, 0xcb, 0xee, 0xec, 0x13, 0xff, + 0x73, 0x32, 0xaa, 0xf7, 0xce, 0x41, 0xb6, 0xc0, 0x2c, 0x64, 0x2d, 0xfe, 0x7f, 0x09, 0x48, 0xaf, + 0x19, 0x46, 0x07, 0x19, 0x30, 0xa5, 0x1b, 0x76, 0x93, 0x28, 0x0b, 0x6e, 0x35, 0x79, 0x6e, 0x84, + 0x65, 0x41, 0x17, 0x0e, 0x26, 0x94, 0xef, 0xed, 0xd7, 0x06, 0xa1, 0xe4, 0x92, 0x6e, 0xd8, 0x0d, + 0x5a, 0xb2, 0xc1, 0x32, 0x27, 0x1f, 0x82, 0x49, 0x7f, 0x65, 0x2c, 0x53, 0xf4, 0xec, 0x81, 0x2b, + 0xf3, 0xc3, 0xdc, 0xd8, 0xaf, 0xcd, 0xb8, 0x93, 0xc0, 0x29, 0x96, 0xe4, 0xc2, 0x96, 0xa7, 0xf6, + 0x7a, 0x96, 0xf4, 0xfe, 0xfb, 0xaf, 0xd4, 0x12, 0x8d, 0xf3, 0x43, 0x4f, 0x00, 0xdc, 0x3f, 0xb2, + 0x09, 0xbb, 0xce, 0x56, 0xbf, 0xff, 0x2c, 0xc0, 0x27, 0x4f, 0x43, 0x35, 0x70, 0x16, 0x80, 0xde, + 0x43, 0x1e, 0x72, 0x12, 0x60, 0xf4, 0x3f, 0xfa, 0x1f, 0x72, 0x50, 0x60, 0xe4, 0x61, 0x03, 0xe9, + 0x2a, 0x1c, 0xa6, 0x47, 0x39, 0x5d, 0xb3, 0x25, 0xbe, 0x12, 0x73, 0xd8, 0x49, 0xa0, 0x25, 0xf8, + 0xff, 0x15, 0x67, 0xd9, 0xb0, 0xb3, 0x00, 0x6e, 0xcd, 0xce, 0x85, 0x1b, 0xde, 0x52, 0xd6, 0x7a, + 0xf6, 0x0f, 0xff, 0x29, 0x8c, 0xec, 0x21, 0x96, 0x7e, 0x2d, 0x01, 0x47, 0x06, 0x6a, 0xe3, 0x5a, + 0xff, 0xa4, 0xef, 0xc2, 0x68, 0x22, 0x5e, 0x8e, 0xde, 0xfb, 0xe5, 0x87, 0x7a, 0x48, 0xbb, 0xaa, + 0x61, 0xed, 0x62, 0x15, 0xfa, 0x1a, 0xf6, 0x22, 0x1c, 0xf2, 0xb7, 0x4b, 0x08, 0xe1, 0x39, 0x28, + 0xfa, 0x57, 0x0b, 0x3c, 0x94, 0x78, 0xcf, 0xc1, 0x3d, 0xe4, 0xa4, 0x6f, 0xc5, 0x20, 0x3d, 0x1b, + 0x14, 0xbc, 0x23, 0x89, 0xf7, 0x0d, 0x1e, 0xbe, 0x8f, 0x14, 0x84, 0xe7, 0x6e, 0xd6, 0x57, 0x13, + 0x70, 0xdc, 0x8f, 0xec, 0x1a, 0x61, 0xeb, 0x2d, 0xef, 0xd7, 0x9b, 0x51, 0x8f, 0xff, 0x94, 0x80, + 0x3b, 0x47, 0xb4, 0x9c, 0x8b, 0xc7, 0x84, 0x19, 0x8f, 0x75, 0x37, 0x79, 0xb1, 0x50, 0x19, 0x69, + 0xb8, 0x07, 0x72, 0x8c, 0xdb, 0x6d, 0xfc, 0x28, 0xd2, 0xf4, 0xe0, 0x3b, 0x4b, 0x9e, 0x1e, 0xb4, + 0xc8, 0x6f, 0x4e, 0xb7, 0xbe, 0x91, 0x80, 0x53, 0xfe, 0x5e, 0x85, 0xac, 0xe8, 0xde, 0xd9, 0x03, + 0xf3, 0x6f, 0x12, 0x70, 0x6f, 0x9c, 0x2e, 0xf0, 0x11, 0x7a, 0x1e, 0xa6, 0xdd, 0xf8, 0x2a, 0x38, + 0x40, 0x27, 0x62, 0xac, 0x8a, 0xb9, 0x52, 0x23, 0x07, 0xe5, 0xd6, 0x8c, 0xc4, 0x1f, 0x25, 0xf8, + 0x9c, 0xf3, 0x8e, 0xbb, 0x23, 0x76, 0xff, 0x92, 0xe0, 0x80, 0x62, 0xf7, 0x2c, 0x0b, 0x26, 0x7d, + 0xcb, 0x82, 0x90, 0x01, 0x4d, 0xde, 0x22, 0x0b, 0xa2, 0x73, 0x63, 0x1a, 0x12, 0x9b, 0xad, 0xc3, + 0x74, 0xc8, 0x1c, 0x71, 0x2e, 0x9c, 0x46, 0x4e, 0x11, 0x19, 0x0d, 0xce, 0x02, 0xe9, 0x3f, 0x27, + 0xa0, 0x46, 0x2b, 0x0c, 0x19, 0xb1, 0xbf, 0xc9, 0x72, 0xc4, 0xdc, 0x5e, 0x86, 0x76, 0x8b, 0x0b, + 0x74, 0x1e, 0x32, 0x4c, 0x19, 0xb9, 0x0c, 0x0f, 0xa0, 0xc5, 0x9c, 0xd1, 0xb5, 0xcb, 0x8b, 0xa2, + 0x5f, 0xe1, 0xd3, 0xff, 0x2d, 0x92, 0xdf, 0x9b, 0x98, 0xfe, 0xff, 0x4a, 0xd8, 0xe5, 0xf0, 0x96, + 0x73, 0x11, 0x7d, 0xf0, 0x4d, 0xdb, 0x65, 0xfe, 0xc1, 0xa0, 0xb7, 0xcc, 0x00, 0x3b, 0xcd, 0x8f, + 0x30, 0xc0, 0xef, 0xbc, 0x11, 0x70, 0x0c, 0x70, 0x44, 0x17, 0xde, 0xe1, 0x06, 0xf8, 0x46, 0x12, + 0x8e, 0xd2, 0x6e, 0x78, 0x17, 0x1e, 0x6f, 0x83, 0xe4, 0x9b, 0x80, 0x2c, 0x53, 0x6d, 0xde, 0x2a, + 0xfb, 0x51, 0xb6, 0x4c, 0xf5, 0x8a, 0xcf, 0xb7, 0x36, 0x01, 0xb5, 0x2c, 0x3b, 0x58, 0x41, 0xea, + 0xa6, 0x2b, 0x68, 0x59, 0xf6, 0x95, 0x11, 0xce, 0x3b, 0x7d, 0x10, 0xdd, 0xf9, 0xfd, 0x04, 0x54, + 0xc3, 0x84, 0xce, 0x75, 0x45, 0x81, 0xc3, 0xbe, 0xe5, 0x72, 0x50, 0x5d, 0xee, 0x1a, 0xb5, 0x68, + 0x0c, 0x4c, 0xdd, 0x43, 0x26, 0xbe, 0xd5, 0x93, 0xf7, 0x2b, 0xc2, 0xe9, 0x38, 0x9a, 0x3f, 0xb8, + 0x52, 0x79, 0x47, 0x4e, 0xd9, 0xdf, 0x18, 0x30, 0xf7, 0xef, 0xb4, 0x45, 0xcf, 0x1f, 0x27, 0xe0, + 0xd8, 0x90, 0x16, 0xfe, 0x4d, 0x76, 0xe7, 0x3f, 0x3d, 0x54, 0x61, 0x6e, 0xd5, 0x0a, 0xeb, 0x21, + 0x3e, 0xa1, 0xfc, 0xc7, 0xd3, 0x3c, 0xeb, 0xe6, 0xd0, 0x4f, 0xc9, 0x3d, 0x03, 0xb7, 0x85, 0x72, + 0xf1, 0x36, 0x9d, 0x81, 0xf4, 0x8e, 0x66, 0xd9, 0xce, 0xf7, 0x15, 0x02, 0xcd, 0x09, 0x70, 0x51, + 0x5a, 0x09, 0x41, 0x99, 0x42, 0xae, 0x19, 0x46, 0x87, 0x57, 0x2f, 0x2d, 0xc0, 0x94, 0xa7, 0x8c, + 0x83, 0xcf, 0x41, 0xba, 0x67, 0x18, 0x1d, 0x0e, 0x3e, 0x13, 0x04, 0x27, 0xb4, 0xbc, 0x9b, 0x94, + 0x4e, 0x9a, 0x01, 0xc4, 0x40, 0xd8, 0x97, 0x3f, 0x38, 0xf4, 0xd3, 0x30, 0xed, 0x2b, 0x75, 0xae, + 0x26, 0x65, 0x7c, 0xdf, 0x8c, 0x1a, 0xd8, 0x88, 0x67, 0xf4, 0xce, 0x25, 0x74, 0xfa, 0x74, 0xe6, + 0x0f, 0x0b, 0xe2, 0x3e, 0x6a, 0x13, 0xc0, 0x93, 0x34, 0xbd, 0x27, 0xc8, 0x1d, 0x9e, 0x9e, 0xa8, + 0x9e, 0x8c, 0xa4, 0xe3, 0x61, 0xeb, 0x18, 0xfa, 0x09, 0xef, 0x81, 0xa7, 0xbb, 0x47, 0xf3, 0x09, + 0xf8, 0x7b, 0xa2, 0xc8, 0x1c, 0xf4, 0xbf, 0x05, 0x33, 0x61, 0xeb, 0x55, 0xf4, 0xe0, 0x68, 0x84, + 0xc1, 0xd0, 0xa3, 0xfa, 0x9e, 0x03, 0x70, 0x38, 0xd5, 0x7f, 0x2a, 0x01, 0x77, 0x8c, 0x5c, 0x96, + 0xa1, 0xb3, 0xa3, 0x61, 0x47, 0x04, 0x43, 0xd5, 0xfa, 0xcd, 0xb0, 0x3a, 0x4d, 0x6b, 0xfa, 0x76, + 0xde, 0xc3, 0x25, 0x3a, 0xb0, 0x84, 0x18, 0x32, 0xb0, 0x83, 0xe1, 0xa2, 0x34, 0x86, 0x5e, 0x0a, + 0xdf, 0x81, 0x3e, 0x1d, 0x8a, 0x30, 0x7c, 0xd5, 0x52, 0x7d, 0x30, 0x3e, 0x83, 0x77, 0xd8, 0xc3, + 0xc2, 0xe1, 0x21, 0xc3, 0x3e, 0x22, 0xe6, 0x1f, 0x32, 0xec, 0xa3, 0x62, 0x6d, 0x3e, 0xec, 0x23, + 0x83, 0xc1, 0x21, 0xc3, 0x1e, 0x27, 0x06, 0x1e, 0x32, 0xec, 0xb1, 0x62, 0x4f, 0x69, 0x0c, 0xed, + 0xc0, 0xa4, 0x2f, 0xd4, 0x40, 0xa7, 0x42, 0xe1, 0xc2, 0x62, 0xc0, 0xea, 0xbd, 0x71, 0x48, 0xbd, + 0xe3, 0x1f, 0xe2, 0x5d, 0x87, 0x8c, 0xff, 0xf0, 0x00, 0xa2, 0xfa, 0x60, 0x7c, 0x06, 0xa7, 0xee, + 0xeb, 0xce, 0xa6, 0x88, 0x87, 0x00, 0xcd, 0xc5, 0x44, 0x12, 0x35, 0x9f, 0x8e, 0x4d, 0xef, 0x54, + 0x7c, 0x75, 0xe0, 0x5c, 0x74, 0xb8, 0xd0, 0x42, 0xbd, 0x53, 0xf5, 0xbe, 0x58, 0xb4, 0x4e, 0x65, + 0xab, 0x3c, 0xe3, 0x7f, 0x3c, 0x94, 0xcd, 0xe3, 0x77, 0xaa, 0x77, 0x8e, 0xa0, 0x70, 0xe0, 0xd6, + 0x9d, 0x2d, 0x3c, 0x29, 0x9c, 0xdc, 0xeb, 0x6f, 0xaa, 0x27, 0x46, 0xd2, 0x08, 0xd0, 0x5b, 0x9e, + 0x94, 0xff, 0x72, 0x76, 0xe0, 0x82, 0x5e, 0x1b, 0xeb, 0xd8, 0xd2, 0xac, 0x03, 0x5d, 0xd0, 0x1b, + 0x9d, 0x77, 0xff, 0xb9, 0x0c, 0x14, 0x2e, 0x30, 0x54, 0xfa, 0x55, 0x62, 0xf4, 0x44, 0x4c, 0x2f, + 0x5a, 0x24, 0x5e, 0xf4, 0x07, 0xfb, 0x35, 0x2e, 0x48, 0xe1, 0x4f, 0x91, 0xc5, 0x3f, 0x4f, 0xc4, + 0x3e, 0x2d, 0xe2, 0x7e, 0xdf, 0xa5, 0x70, 0xa0, 0xc3, 0xa5, 0x6c, 0x57, 0x9f, 0x9f, 0xe7, 0x0c, + 0xe2, 0x49, 0xec, 0x4b, 0x47, 0x1b, 0xa4, 0x84, 0x7e, 0x9c, 0x04, 0x7d, 0x32, 0x01, 0x87, 0x28, + 0x95, 0x1b, 0xcb, 0x51, 0x4a, 0x71, 0x04, 0x66, 0x60, 0x94, 0x57, 0x14, 0xcf, 0xca, 0x86, 0x62, + 0x34, 0xea, 0x7c, 0x67, 0xf6, 0x76, 0x4f, 0xa5, 0x41, 0x38, 0xe9, 0x07, 0xfb, 0x35, 0x34, 0xc8, + 0x2b, 0xd3, 0x4f, 0x69, 0xfa, 0xcb, 0xc2, 0x3f, 0x28, 0x3d, 0x22, 0xbc, 0x9b, 0xe2, 0x02, 0x75, + 0x63, 0x04, 0x5f, 0x84, 0xbd, 0x06, 0x79, 0x8f, 0xf1, 0xa9, 0x8c, 0x0f, 0x39, 0x80, 0xe6, 0x2e, + 0x9d, 0x11, 0xc7, 0xf3, 0xf8, 0x3e, 0xd9, 0x0b, 0x81, 0x7e, 0x35, 0x01, 0x87, 0xdc, 0xe5, 0xb9, + 0x17, 0x3c, 0x13, 0x7f, 0x81, 0x7e, 0xce, 0x2f, 0xb5, 0x50, 0x3c, 0x22, 0xb5, 0x30, 0x07, 0x29, + 0xcf, 0xf4, 0xc3, 0x1c, 0xc6, 0x73, 0x30, 0xe9, 0x5d, 0xbf, 0xb9, 0x9f, 0x19, 0x1c, 0xb5, 0xf1, + 0x38, 0xc3, 0x7b, 0xeb, 0x3b, 0x84, 0x21, 0xfb, 0x81, 0x50, 0x15, 0xb2, 0x78, 0xb7, 0x67, 0x98, + 0x36, 0x6e, 0xd1, 0x53, 0xc3, 0x59, 0xd9, 0x79, 0x96, 0xae, 0x43, 0xc8, 0xc0, 0xa2, 0xa7, 0x03, + 0xdf, 0x48, 0xba, 0x99, 0x75, 0xc1, 0xe0, 0x67, 0x95, 0xbc, 0xdf, 0x3b, 0xba, 0xd5, 0x66, 0xe3, + 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xbb, 0x45, 0x6d, 0x3d, 0x89, 0x9b, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From 63ebec3841b35383c2604ddab06550cc185290ed Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 10:34:15 -0400 Subject: [PATCH 08/28] Delete hybrid_codec.go --- codec/hybrid_codec.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 codec/hybrid_codec.go diff --git a/codec/hybrid_codec.go b/codec/hybrid_codec.go deleted file mode 100644 index e69de29bb2d1..000000000000 From 48adb63b5e43884a5c30c13792524b5f2204d276 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 10:41:17 -0400 Subject: [PATCH 09/28] Fixes --- server/start.go | 9 ++++----- simapp/app.go | 2 +- simapp/params/amino.go | 3 +-- types/rest/rest.go | 4 ++-- types/rest/rest_test.go | 2 +- x/auth/client/cli/query.go | 2 +- x/auth/client/rest/query.go | 2 +- x/auth/types/account_retriever.go | 4 ++-- x/bank/client/rest/query_test.go | 8 ++++---- x/bank/client/rest/tx_test.go | 4 ++-- x/distribution/client/common/common.go | 4 ++-- x/params/keeper/keeper.go | 4 ++-- x/params/types/subspace.go | 4 ++-- x/params/types/subspace_test.go | 2 +- x/slashing/client/cli/query.go | 2 +- x/staking/client/cli/query.go | 2 +- 16 files changed, 28 insertions(+), 30 deletions(-) diff --git a/server/start.go b/server/start.go index 8a4a95c2f8de..234876a653b5 100644 --- a/server/start.go +++ b/server/start.go @@ -8,8 +8,6 @@ import ( "runtime/pprof" "time" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/spf13/cobra" "github.com/tendermint/tendermint/abci/server" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" @@ -23,6 +21,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" servergrpc "github.com/cosmos/cosmos-sdk/server/grpc" @@ -107,7 +106,7 @@ which accepts a path for the resulting pprof file. serverCtx.Logger.Info("starting ABCI with Tendermint") - err := startInProcess(serverCtx, clientCtx.Codec, appCreator) + err := startInProcess(serverCtx, clientCtx.LegacyAmino, appCreator) return err }, } @@ -179,7 +178,7 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error { } // legacyAminoCdc is used for the legacy REST API -func startInProcess(ctx *Context, legacyAminoCdc *codec.Codec, appCreator types.AppCreator) error { +func startInProcess(ctx *Context, legacyAminoCdc *codec.LegacyAmino, appCreator types.AppCreator) error { cfg := ctx.Config home := cfg.RootDir @@ -233,7 +232,7 @@ func startInProcess(ctx *Context, legacyAminoCdc *codec.Codec, appCreator types. WithHomeDir(home). WithChainID(genDoc.ChainID). WithJSONMarshaler(legacyAminoCdc). - WithCodec(legacyAminoCdc). + WithLegacyAmino(legacyAminoCdc). WithClient(local.New(tmNode)) apiSrv = api.New(clientCtx, ctx.Logger.With("module", "api-server")) diff --git a/simapp/app.go b/simapp/app.go index bb0c50a57f8c..d65bbdb99eb6 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -504,7 +504,7 @@ func (app *SimApp) SimulationManager() *module.SimulationManager { // API server. func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server) { clientCtx := apiSvr.ClientCtx - clientCtx = clientCtx.WithJSONMarshaler(clientCtx.Codec) + clientCtx = clientCtx.WithJSONMarshaler(clientCtx.LegacyAmino) rpc.RegisterRoutes(clientCtx, apiSvr.Router) authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) diff --git a/simapp/params/amino.go b/simapp/params/amino.go index 4cbbf8aa9f70..e5d540888769 100644 --- a/simapp/params/amino.go +++ b/simapp/params/amino.go @@ -12,8 +12,7 @@ import ( func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() - // TODO: switch to using AminoCodec here once amino compatibility is fixed - marshaler := codec.NewProtoCodec(interfaceRegistry) + marshaler := codec.NewAminoCodec(cdc) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, diff --git a/types/rest/rest.go b/types/rest/rest.go index 5c3160e4884d..66ed3e5d3931 100644 --- a/types/rest/rest.go +++ b/types/rest/rest.go @@ -45,7 +45,7 @@ func NewResponseWithHeight(height int64, result json.RawMessage) ResponseWithHei // ParseResponseWithHeight returns the raw result from a JSON-encoded // ResponseWithHeight object. -func ParseResponseWithHeight(cdc *codec.Codec, bz []byte) ([]byte, error) { +func ParseResponseWithHeight(cdc *codec.LegacyAmino, bz []byte) ([]byte, error) { r := ResponseWithHeight{} if err := cdc.UnmarshalJSON(bz, &r); err != nil { return nil, err @@ -279,7 +279,7 @@ func PostProcessResponseBare(w http.ResponseWriter, ctx client.Context, body int resp = b default: - resp, err = ctx.Codec.MarshalJSON(body) + resp, err = ctx.LegacyAmino.MarshalJSON(body) if CheckInternalServerError(w, err) { return } diff --git a/types/rest/rest_test.go b/types/rest/rest_test.go index c9a7cfdb5737..e05deb18771d 100644 --- a/types/rest/rest_test.go +++ b/types/rest/rest_test.go @@ -311,7 +311,7 @@ func TestPostProcessResponseBare(t *testing.T) { clientCtx := client.Context{}. WithTxConfig(encodingConfig.TxConfig). WithJSONMarshaler(encodingConfig.Amino). // amino used intentionally here - WithCodec(encodingConfig.Amino) // amino used intentionally here + WithLegacyAmino(encodingConfig.Amino) // amino used intentionally here // write bytes w := httptest.NewRecorder() bs := []byte("text string") diff --git a/x/auth/client/cli/query.go b/x/auth/client/cli/query.go index 6fa12ec6e6bd..d58a303ca598 100644 --- a/x/auth/client/cli/query.go +++ b/x/auth/client/cli/query.go @@ -64,7 +64,7 @@ $ query auth params return err } - return clientCtx.PrintOutput(&res) + return clientCtx.PrintOutput(&res.Params) }, } diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 6f6fdabc480e..764c1841bb45 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -32,7 +32,7 @@ func QueryAccountRequestHandlerFn(storeName string, clientCtx client.Context) ht return } - accGetter := types.NewAccountRetriever(clientCtx.Codec) + accGetter := types.NewAccountRetriever(clientCtx.LegacyAmino) account, height, err := accGetter.GetAccountWithHeight(clientCtx, addr) if err != nil { diff --git a/x/auth/types/account_retriever.go b/x/auth/types/account_retriever.go index 263ac3bd6a35..96b762962015 100644 --- a/x/auth/types/account_retriever.go +++ b/x/auth/types/account_retriever.go @@ -11,11 +11,11 @@ import ( // AccountRetriever defines the properties of a type that can be used to // retrieve accounts. type AccountRetriever struct { - codec *codec.Codec + codec *codec.LegacyAmino } // NewAccountRetriever initialises a new AccountRetriever instance. -func NewAccountRetriever(codec *codec.Codec) AccountRetriever { +func NewAccountRetriever(codec *codec.LegacyAmino) AccountRetriever { return AccountRetriever{codec: codec} } diff --git a/x/bank/client/rest/query_test.go b/x/bank/client/rest/query_test.go index 098ec9cb0c73..3705606a7d68 100644 --- a/x/bank/client/rest/query_test.go +++ b/x/bank/client/rest/query_test.go @@ -75,9 +75,9 @@ func (s *IntegrationTestSuite) TestQueryBalancesRequestHandlerFn() { resp, err := rest.GetRequest(tc.url) s.Require().NoError(err) - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.LegacyAmino, resp) s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(bz, tc.respType)) + s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) }) } @@ -122,9 +122,9 @@ func (s *IntegrationTestSuite) TestTotalSupplyHandlerFn() { resp, err := rest.GetRequest(tc.url) s.Require().NoError(err) - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.LegacyAmino, resp) s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(bz, tc.respType)) + s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(bz, tc.respType)) s.Require().Equal(tc.expected.String(), tc.respType.String()) }) } diff --git a/x/bank/client/rest/tx_test.go b/x/bank/client/rest/tx_test.go index 16e03312bbed..1fc73916a6ee 100644 --- a/x/bank/client/rest/tx_test.go +++ b/x/bank/client/rest/tx_test.go @@ -93,13 +93,13 @@ func getAccountInfo(val *network.Validator) (authtypes.AccountI, error) { return nil, err } - bz, err := rest.ParseResponseWithHeight(val.ClientCtx.Codec, resp) + bz, err := rest.ParseResponseWithHeight(val.ClientCtx.LegacyAmino, resp) if err != nil { return nil, err } var acc authtypes.AccountI - err = val.ClientCtx.Codec.UnmarshalJSON(bz, &acc) + err = val.ClientCtx.LegacyAmino.UnmarshalJSON(bz, &acc) if err != nil { return nil, err } diff --git a/x/distribution/client/common/common.go b/x/distribution/client/common/common.go index ec10e616470d..c7034a8761b0 100644 --- a/x/distribution/client/common/common.go +++ b/x/distribution/client/common/common.go @@ -36,7 +36,7 @@ func QueryDelegationRewards(clientCtx client.Context, delAddr, valAddr string) ( func QueryDelegatorValidators(clientCtx client.Context, delegatorAddr sdk.AccAddress) ([]byte, error) { res, _, err := clientCtx.QueryWithData( fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorValidators), - clientCtx.Codec.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)), + clientCtx.LegacyAmino.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)), ) return res, err } @@ -61,7 +61,7 @@ func WithdrawAllDelegatorRewards(clientCtx client.Context, delegatorAddr sdk.Acc } var validators []sdk.ValAddress - if err := clientCtx.Codec.UnmarshalJSON(bz, &validators); err != nil { + if err := clientCtx.LegacyAmino.UnmarshalJSON(bz, &validators); err != nil { return nil, err } diff --git a/x/params/keeper/keeper.go b/x/params/keeper/keeper.go index fe7c4c1d4c3b..a2fdeaa5c0f5 100644 --- a/x/params/keeper/keeper.go +++ b/x/params/keeper/keeper.go @@ -14,14 +14,14 @@ import ( // Keeper of the global paramstore type Keeper struct { cdc codec.BinaryMarshaler - legacyAmino *codec.Codec + legacyAmino *codec.LegacyAmino key sdk.StoreKey tkey sdk.StoreKey spaces map[string]*types.Subspace } // NewKeeper constructs a params keeper -func NewKeeper(cdc codec.BinaryMarshaler, legacyAmino *codec.Codec, key, tkey sdk.StoreKey) Keeper { +func NewKeeper(cdc codec.BinaryMarshaler, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) Keeper { return Keeper{ cdc: cdc, legacyAmino: legacyAmino, diff --git a/x/params/types/subspace.go b/x/params/types/subspace.go index 09f6032b562b..da0a755d417b 100644 --- a/x/params/types/subspace.go +++ b/x/params/types/subspace.go @@ -22,7 +22,7 @@ const ( // recording whether the parameter has been changed or not type Subspace struct { cdc codec.BinaryMarshaler - legacyAmino *codec.Codec + legacyAmino *codec.LegacyAmino key sdk.StoreKey // []byte -> []byte, stores parameter tkey sdk.StoreKey // []byte -> bool, stores parameter change name []byte @@ -30,7 +30,7 @@ type Subspace struct { } // NewSubspace constructs a store with namestore -func NewSubspace(cdc codec.BinaryMarshaler, legacyAmino *codec.Codec, key sdk.StoreKey, tkey sdk.StoreKey, name string) Subspace { +func NewSubspace(cdc codec.BinaryMarshaler, legacyAmino *codec.LegacyAmino, key sdk.StoreKey, tkey sdk.StoreKey, name string) Subspace { return Subspace{ cdc: cdc, legacyAmino: legacyAmino, diff --git a/x/params/types/subspace_test.go b/x/params/types/subspace_test.go index eb0f6e4a90ae..0d7ce5b553df 100644 --- a/x/params/types/subspace_test.go +++ b/x/params/types/subspace_test.go @@ -22,7 +22,7 @@ type SubspaceTestSuite struct { suite.Suite cdc codec.Marshaler - amino *codec.Codec + amino *codec.LegacyAmino ctx sdk.Context ss types.Subspace } diff --git a/x/slashing/client/cli/query.go b/x/slashing/client/cli/query.go index 58decc6db569..6558b03cd834 100644 --- a/x/slashing/client/cli/query.go +++ b/x/slashing/client/cli/query.go @@ -139,7 +139,7 @@ $ query slashing params return err } - return clientCtx.PrintOutput(&res) + return clientCtx.PrintOutput(&res.Params) }, } diff --git a/x/staking/client/cli/query.go b/x/staking/client/cli/query.go index c23ebd9bac88..12a50a983150 100644 --- a/x/staking/client/cli/query.go +++ b/x/staking/client/cli/query.go @@ -116,7 +116,7 @@ $ %s query staking validators return err } - var validators []types.Validator + var validators types.Validators for _, kv := range resKVs { validator, err := types.UnmarshalValidator(types.ModuleCdc, kv.Value) if err != nil { From 8cc6084a95f0ec8eb968d15b9e69b6ad9959b9f0 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 10:44:11 -0400 Subject: [PATCH 10/28] Fixes --- simapp/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simapp/app.go b/simapp/app.go index d65bbdb99eb6..89d0653c6fd4 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -520,7 +520,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.Marshaler, legacyAmino *codec.Codec, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.Marshaler, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) From 06b012bcca1b52d0bfc2b7751897a33807410887 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 10:46:11 -0400 Subject: [PATCH 11/28] Fixes --- x/mint/client/cli/query.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/mint/client/cli/query.go b/x/mint/client/cli/query.go index 1c48caacdee3..d3a03ea23f13 100644 --- a/x/mint/client/cli/query.go +++ b/x/mint/client/cli/query.go @@ -85,7 +85,7 @@ func GetCmdQueryInflation() *cobra.Command { return err } - return clientCtx.PrintString(fmt.Sprintf("%s\n", res)) + return clientCtx.PrintString(fmt.Sprintf("%s\n", res.Inflation)) }, } @@ -117,7 +117,7 @@ func GetCmdQueryAnnualProvisions() *cobra.Command { return err } - return clientCtx.PrintString(fmt.Sprintf("%s\n", res)) + return clientCtx.PrintString(fmt.Sprintf("%s\n", res.AnnualProvisions)) }, } From 722da0b2099c16659930bdcebff2cadb7d5e60e8 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 13:50:28 -0400 Subject: [PATCH 12/28] Test fixes --- simapp/simd/cmd/root.go | 34 ++++------------------ simapp/test_helpers.go | 11 ++++--- x/bank/client/cli/cli_test.go | 48 +++++++++++++++++++------------ x/evidence/types/evidence.go | 6 +++- x/gov/keeper/querier_test.go | 7 ++--- x/mint/client/cli/cli_test.go | 2 +- x/params/keeper/common_test.go | 17 +++++------ x/params/types/proposal/codec.go | 22 -------------- x/params/types/subspace_test.go | 6 ++-- x/slashing/client/cli/cli_test.go | 12 +++++--- 10 files changed, 68 insertions(+), 97 deletions(-) diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index 5ae8aab4916b..563e77e96b73 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -79,12 +79,12 @@ func init() { authclient.Codec = encodingConfig.Marshaler rootCmd.AddCommand( - withProtoJSON(genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome)), - withProtoJSON(genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome)), + genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome), + genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), genutilcli.MigrateGenesisCmd(), - withProtoJSON(genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome)), - withProtoJSON(genutilcli.ValidateGenesisCmd(simapp.ModuleBasics, encodingConfig.TxConfig)), - withProtoJSON(AddGenesisAccountCmd(simapp.DefaultNodeHome)), + genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome), + genutilcli.ValidateGenesisCmd(simapp.ModuleBasics, encodingConfig.TxConfig), + AddGenesisAccountCmd(simapp.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), testnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}), debug.Cmd(), @@ -202,27 +202,3 @@ func exportAppStateAndTMValidators( return simApp.ExportAppStateAndValidators(forZeroHeight, jailWhiteList) } - -// This is a temporary command middleware to enable proto JSON marshaling for testing. -// Once proto JSON works everywhere we can remove this and set ProtoCodec as default -func withProtoJSON(command *cobra.Command) *cobra.Command { - existing := command.PersistentPreRunE - if existing != nil { - command.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - err := existing(cmd, args) - if err != nil { - return err - } - return setProtoJSON(cmd, args) - } - } else { - command.PersistentPreRunE = setProtoJSON - } - return command -} - -func setProtoJSON(cmd *cobra.Command, _ []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx = clientCtx.WithJSONMarshaler(codec.NewProtoCodec(clientCtx.InterfaceRegistry)) - return client.SetCmdClientContext(cmd, clientCtx) -} diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 0ec48a9bef5e..cd76827cff10 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -19,7 +19,6 @@ import ( bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp/helpers" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -53,7 +52,7 @@ func Setup(isCheckTx bool) *SimApp { if !isCheckTx { // init chain must be called to stop deliverState from being nil genesisState := NewDefaultGenesisState() - stateBytes, err := codec.MarshalJSONIndent(app.LegacyAmino(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { panic(err) } @@ -83,7 +82,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs // set genesis accounts authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs) - genesisState[authtypes.ModuleName] = app.LegacyAmino().MustMarshalJSON(authGenesis) + genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis) validators := make([]stakingtypes.Validator, 0, len(valSet.Validators)) delegations := make([]stakingtypes.Delegation, 0, len(valSet.Validators)) @@ -111,7 +110,7 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs // set validators and delegations stakingGenesis := stakingtypes.NewGenesisState(stakingtypes.DefaultParams(), validators, delegations) - genesisState[stakingtypes.ModuleName] = app.LegacyAmino().MustMarshalJSON(stakingGenesis) + genesisState[stakingtypes.ModuleName] = app.AppCodec().MustMarshalJSON(stakingGenesis) totalSupply := sdk.NewCoins() for _, b := range balances { @@ -121,9 +120,9 @@ func SetupWithGenesisValSet(t *testing.T, valSet *tmtypes.ValidatorSet, genAccs // update total supply bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{}) - genesisState[banktypes.ModuleName] = app.LegacyAmino().MustMarshalJSON(bankGenesis) + genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis) - stateBytes, err := codec.MarshalJSONIndent(app.LegacyAmino(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) // init chain will set the validator set and initialize the genesis accounts diff --git a/x/bank/client/cli/cli_test.go b/x/bank/client/cli/cli_test.go index d8c1b8b4b223..72e7f3201177 100644 --- a/x/bank/client/cli/cli_test.go +++ b/x/bank/client/cli/cli_test.go @@ -195,6 +195,34 @@ func (s *IntegrationTestSuite) TestGetCmdQueryTotalSupply() { } } +func (s *IntegrationTestSuite) TestNewSendTxCmdGenOnly() { + val := s.network.Validators[0] + + clientCtx := val.ClientCtx + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + + from := val.Address + to := val.Address + amount := sdk.NewCoins( + sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), sdk.NewInt(10)), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)), + ) + args := []string{ + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + } + + bz, err := banktestutil.MsgSendExec(clientCtx, from, to, amount, args...) + s.Require().NoError(err) + tx, err := s.cfg.TxConfig.TxJSONDecoder()(bz.Bytes()) + s.Require().NoError(err) + s.Require().Equal([]sdk.Msg{types.NewMsgSend(from, to, amount)}, tx.GetMsgs()) +} + func (s *IntegrationTestSuite) TestNewSendTxCmd() { val := s.network.Validators[0] @@ -204,27 +232,9 @@ func (s *IntegrationTestSuite) TestNewSendTxCmd() { amount sdk.Coins args []string expectErr bool - respType fmt.Stringer + respType interface{} expectedCode uint32 }{ - { - "valid transaction (gen-only)", - val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), sdk.NewInt(10)), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)), - ), - []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - }, - false, - &sdk.TxResponse{}, - 0, - }, { "valid transaction", val.Address, diff --git a/x/evidence/types/evidence.go b/x/evidence/types/evidence.go index 471b5b145603..0f5235ee6ac6 100644 --- a/x/evidence/types/evidence.go +++ b/x/evidence/types/evidence.go @@ -34,7 +34,11 @@ func (e *Equivocation) String() string { // Hash returns the hash of an Equivocation object. func (e *Equivocation) Hash() tmbytes.HexBytes { - return tmhash.Sum(ModuleCdc.MustMarshalBinaryBare(e)) + bz, err := e.Marshal() + if err != nil { + panic(err) + } + return tmhash.Sum(bz) } // ValidateBasic performs basic stateless validation checks on an Equivocation object. diff --git a/x/gov/keeper/querier_test.go b/x/gov/keeper/querier_test.go index ae3965825385..0c04995fc4ee 100644 --- a/x/gov/keeper/querier_test.go +++ b/x/gov/keeper/querier_test.go @@ -294,7 +294,7 @@ func TestQueries(t *testing.T) { func TestPaginatedVotesQuery(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, abci.Header{}) - appCodec := app.AppCodec() + legacyQuerierCdc := app.LegacyAmino() proposal := types.Proposal{ ProposalID: 100, @@ -317,11 +317,10 @@ func TestPaginatedVotesQuery(t *testing.T) { app.GovKeeper.SetVote(ctx, vote) } - legacyQuerierCdc := codec.NewAminoCodec(app.LegacyAmino()) querier := keeper.NewQuerier(app.GovKeeper, legacyQuerierCdc) // keeper preserves consistent order for each query, but this is not the insertion order - all := getQueriedVotes(t, ctx, appCodec, querier, proposal.ProposalID, 1, 0) + all := getQueriedVotes(t, ctx, legacyQuerierCdc, querier, proposal.ProposalID, 1, 0) require.Equal(t, len(all), len(votes)) type testCase struct { @@ -355,7 +354,7 @@ func TestPaginatedVotesQuery(t *testing.T) { } { tc := tc t.Run(tc.description, func(t *testing.T) { - votes := getQueriedVotes(t, ctx, appCodec, querier, proposal.ProposalID, tc.page, tc.limit) + votes := getQueriedVotes(t, ctx, legacyQuerierCdc, querier, proposal.ProposalID, tc.page, tc.limit) require.Equal(t, len(tc.votes), len(votes)) for i := range votes { require.Equal(t, tc.votes[i], votes[i]) diff --git a/x/mint/client/cli/cli_test.go b/x/mint/client/cli/cli_test.go index 12fda75b5143..8aa4815198a5 100644 --- a/x/mint/client/cli/cli_test.go +++ b/x/mint/client/cli/cli_test.go @@ -40,7 +40,7 @@ func (s *IntegrationTestSuite) SetupSuite() { mintData.Params.InflationMin = inflation mintData.Params.InflationMax = inflation - mintDataBz, err := cfg.Codec.MarshalJSON(mintData) + mintDataBz, err := cfg.Codec.MarshalJSON(&mintData) s.Require().NoError(err) genesisState[minttypes.ModuleName] = mintDataBz cfg.GenesisState = genesisState diff --git a/x/params/keeper/common_test.go b/x/params/keeper/common_test.go index 5c026dd851f3..0520849d0526 100644 --- a/x/params/keeper/common_test.go +++ b/x/params/keeper/common_test.go @@ -5,22 +5,23 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" - "github.com/cosmos/cosmos-sdk/x/params/types/proposal" ) -func testComponents() (codec.Marshaler, sdk.Context, sdk.StoreKey, sdk.StoreKey, paramskeeper.Keeper) { - cdc := createTestCodec() +func testComponents() (*codec.LegacyAmino, sdk.Context, sdk.StoreKey, sdk.StoreKey, paramskeeper.Keeper) { + marshaler := simapp.MakeEncodingConfig().Marshaler + legacyAmino := createTestCodec() mkey := sdk.NewKVStoreKey("test") tkey := sdk.NewTransientStoreKey("transient_test") ctx := defaultContext(mkey, tkey) - amino := codec.New() - keeper := paramskeeper.NewKeeper(cdc, amino, mkey, tkey) + keeper := paramskeeper.NewKeeper(marshaler, legacyAmino, mkey, tkey) - return cdc, ctx, mkey, tkey, keeper + return legacyAmino, ctx, mkey, tkey, keeper } type invalid struct{} @@ -29,12 +30,12 @@ type s struct { I int } -func createTestCodec() codec.Marshaler { +func createTestCodec() *codec.LegacyAmino { cdc := codec.New() sdk.RegisterCodec(cdc) cdc.RegisterConcrete(s{}, "test/s", nil) cdc.RegisterConcrete(invalid{}, "test/invalid", nil) - return proposal.NewCodec(cdc) + return cdc } func defaultContext(key sdk.StoreKey, tkey sdk.StoreKey) sdk.Context { diff --git a/x/params/types/proposal/codec.go b/x/params/types/proposal/codec.go index d827875490fb..d274da798458 100644 --- a/x/params/types/proposal/codec.go +++ b/x/params/types/proposal/codec.go @@ -6,28 +6,6 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ) -type Codec struct { - codec.Marshaler - - // Keep reference to the amino codec to allow backwards compatibility along - // with type, and interface registration. - amino *codec.LegacyAmino -} - -func NewCodec(amino *codec.LegacyAmino) *Codec { - return &Codec{Marshaler: codec.NewAminoCodec(amino), amino: amino} -} - -// ModuleCdc is the module codec. -var ModuleCdc *Codec - -func init() { - ModuleCdc = NewCodec(codec.New()) - - RegisterCodec(ModuleCdc.amino) - ModuleCdc.amino.Seal() -} - // RegisterCodec registers all necessary param module types with a given codec. func RegisterCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&ParameterChangeProposal{}, "cosmos-sdk/ParameterChangeProposal", nil) diff --git a/x/params/types/subspace_test.go b/x/params/types/subspace_test.go index 0d7ce5b553df..d000aad8cd1e 100644 --- a/x/params/types/subspace_test.go +++ b/x/params/types/subspace_test.go @@ -21,7 +21,7 @@ import ( type SubspaceTestSuite struct { suite.Suite - cdc codec.Marshaler + cdc codec.BinaryMarshaler amino *codec.LegacyAmino ctx sdk.Context ss types.Subspace @@ -125,12 +125,12 @@ func (suite *SubspaceTestSuite) TestUpdate() { bad := time.Minute * 5 - bz, err := suite.cdc.MarshalJSON(bad) + bz, err := suite.amino.MarshalJSON(bad) suite.Require().NoError(err) suite.Require().Error(suite.ss.Update(suite.ctx, keyUnbondingTime, bz)) good := time.Hour * 360 - bz, err = suite.cdc.MarshalJSON(good) + bz, err = suite.amino.MarshalJSON(good) suite.Require().NoError(err) suite.Require().NoError(suite.ss.Update(suite.ctx, keyUnbondingTime, bz)) diff --git a/x/slashing/client/cli/cli_test.go b/x/slashing/client/cli/cli_test.go index 3bcc06f5b4ec..f4569c11dfd3 100644 --- a/x/slashing/client/cli/cli_test.go +++ b/x/slashing/client/cli/cli_test.go @@ -67,7 +67,7 @@ func (s *IntegrationTestSuite) TestGetCmdQuerySigningInfo() { fmt.Sprintf("--%s=1", flags.FlagHeight), }, false, - fmt.Sprintf(`{"address":"%s","jailed_until":"1970-01-01T00:00:00Z"}`, sdk.ConsAddress(val.PubKey.Address())), + fmt.Sprintf("{\"address\":\"%s\",\"start_height\":\"0\",\"index_offset\":\"0\",\"jailed_until\":\"1970-01-01T00:00:00Z\",\"tombstoned\":false,\"missed_blocks_counter\":\"0\"}", sdk.ConsAddress(val.PubKey.Address())), }, { "valid address (text output)", @@ -78,7 +78,11 @@ func (s *IntegrationTestSuite) TestGetCmdQuerySigningInfo() { }, false, fmt.Sprintf(`address: %s -jailed_until: "1970-01-01T00:00:00Z"`, sdk.ConsAddress(val.PubKey.Address())), +index_offset: "0" +jailed_until: "1970-01-01T00:00:00Z" +missed_blocks_counter: "0" +start_height: "0" +tombstoned: false`, sdk.ConsAddress(val.PubKey.Address())), }, } @@ -119,12 +123,12 @@ func (s *IntegrationTestSuite) TestGetCmdQueryParams() { { "json output", []string{fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, - `{"signed_blocks_window":"100","min_signed_per_window":"0.500000000000000000","downtime_jail_duration":"600000000000","slash_fraction_double_sign":"0.050000000000000000","slash_fraction_downtime":"0.010000000000000000"}`, + `{"signed_blocks_window":"100","min_signed_per_window":"0.500000000000000000","downtime_jail_duration":"600s","slash_fraction_double_sign":"0.050000000000000000","slash_fraction_downtime":"0.010000000000000000"}`, }, { "text output", []string{fmt.Sprintf("--%s=text", tmcli.OutputFlag)}, - `downtime_jail_duration: "600000000000" + `downtime_jail_duration: 600s min_signed_per_window: "0.500000000000000000" signed_blocks_window: "100" slash_fraction_double_sign: "0.050000000000000000" From 053b77f6a028913f2ca72bcff827b4e0c4b596d5 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 13:51:55 -0400 Subject: [PATCH 13/28] Test fixes --- x/bank/client/cli/cli_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/bank/client/cli/cli_test.go b/x/bank/client/cli/cli_test.go index 72e7f3201177..e51ee19b7119 100644 --- a/x/bank/client/cli/cli_test.go +++ b/x/bank/client/cli/cli_test.go @@ -232,7 +232,7 @@ func (s *IntegrationTestSuite) TestNewSendTxCmd() { amount sdk.Coins args []string expectErr bool - respType interface{} + respType fmt.Stringer expectedCode uint32 }{ { From f651177d969ba634cb5c287dcdf804d2bdb876d5 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 13:53:54 -0400 Subject: [PATCH 14/28] Test fixes --- x/params/types/subspace_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/params/types/subspace_test.go b/x/params/types/subspace_test.go index d000aad8cd1e..2f3b9627db19 100644 --- a/x/params/types/subspace_test.go +++ b/x/params/types/subspace_test.go @@ -5,14 +5,13 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/stretchr/testify/suite" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/params/types" From eed94181c3b610e337000e497629f327ef52da49 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:02:09 -0400 Subject: [PATCH 15/28] Lint --- simapp/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simapp/app.go b/simapp/app.go index 89d0653c6fd4..12a59188b8e9 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -520,7 +520,7 @@ func GetMaccPerms() map[string][]string { } // initParamsKeeper init params keeper and its subspaces -func initParamsKeeper(appCodec codec.Marshaler, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { +func initParamsKeeper(appCodec codec.BinaryMarshaler, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey) paramsKeeper.Subspace(authtypes.ModuleName) From 7b62fad26789a9eb963141268b4bc7617f97e7dc Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:15:47 -0400 Subject: [PATCH 16/28] Sim fixes --- simapp/sim_test.go | 8 ++++---- simapp/state.go | 8 ++++---- simapp/utils.go | 2 +- types/module/simulation.go | 2 +- types/simulation/types.go | 2 +- x/auth/simulation/genesis.go | 2 +- x/bank/simulation/genesis.go | 4 ++-- x/bank/simulation/operations.go | 2 +- x/capability/simulation/genesis.go | 4 ++-- x/distribution/simulation/genesis.go | 4 ++-- x/distribution/simulation/operations.go | 2 +- x/gov/simulation/operations.go | 2 +- x/ibc-transfer/simulation/genesis.go | 4 ++-- x/ibc/simulation/genesis.go | 4 ++-- x/simulation/params.go | 4 +++- x/slashing/simulation/genesis.go | 2 +- x/slashing/simulation/operations.go | 2 +- x/staking/simulation/operations.go | 2 +- x/staking/types/genesis.go | 2 +- 19 files changed, 32 insertions(+), 30 deletions(-) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 217446baaaa3..7ea19b1ee53e 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -72,8 +72,8 @@ func TestFullAppSimulation(t *testing.T) { // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( - t, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + t, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) @@ -282,8 +282,8 @@ func TestAppStateDeterminism(t *testing.T) { ) _, _, err := simulation.SimulateFromSeed( - t, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + t, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) require.NoError(t, err) diff --git a/simapp/state.go b/simapp/state.go index 1411fcc9ecc0..9d646461c43f 100644 --- a/simapp/state.go +++ b/simapp/state.go @@ -21,7 +21,7 @@ import ( // AppStateFn returns the initial application state using a genesis or the simulation parameters. // It panics if the user provides files for both of them. // If a file is not given for the genesis or the sim params, it creates a randomized one. -func AppStateFn(cdc *codec.LegacyAmino, simManager *module.SimulationManager) simtypes.AppStateFn { +func AppStateFn(cdc codec.JSONMarshaler, simManager *module.SimulationManager) simtypes.AppStateFn { return func(r *rand.Rand, accs []simtypes.Account, config simtypes.Config, ) (appState json.RawMessage, simAccs []simtypes.Account, chainID string, genesisTimestamp time.Time) { @@ -71,7 +71,7 @@ func AppStateFn(cdc *codec.LegacyAmino, simManager *module.SimulationManager) si // AppStateRandomizedFn creates calls each module's GenesisState generator function // and creates the simulation params func AppStateRandomizedFn( - simManager *module.SimulationManager, r *rand.Rand, cdc *codec.LegacyAmino, + simManager *module.SimulationManager, r *rand.Rand, cdc codec.JSONMarshaler, accs []simtypes.Account, genesisTimestamp time.Time, appParams simtypes.AppParams, ) (json.RawMessage, []simtypes.Account) { numAccs := int64(len(accs)) @@ -115,7 +115,7 @@ func AppStateRandomizedFn( simManager.GenerateGenesisStates(simState) - appState, err := cdc.MarshalJSON(genesisState) + appState, err := json.Marshal(genesisState) if err != nil { panic(err) } @@ -125,7 +125,7 @@ func AppStateRandomizedFn( // AppStateFromGenesisFileFn util function to generate the genesis AppState // from a genesis.json file. -func AppStateFromGenesisFileFn(r io.Reader, cdc *codec.LegacyAmino, genesisFile string) (tmtypes.GenesisDoc, []simtypes.Account) { +func AppStateFromGenesisFileFn(r io.Reader, cdc codec.JSONMarshaler, genesisFile string) (tmtypes.GenesisDoc, []simtypes.Account) { bytes, err := ioutil.ReadFile(genesisFile) if err != nil { panic(err) diff --git a/simapp/utils.go b/simapp/utils.go index 7591010ae946..5f63b72173b0 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -49,7 +49,7 @@ func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, // SimulationOperations retrieves the simulation params from the provided file path // and returns all the modules weighted operations -func SimulationOperations(app App, cdc *codec.LegacyAmino, config simtypes.Config) []simtypes.WeightedOperation { +func SimulationOperations(app App, cdc codec.JSONMarshaler, config simtypes.Config) []simtypes.WeightedOperation { simState := module.SimulationState{ AppParams: make(simtypes.AppParams), Cdc: cdc, diff --git a/types/module/simulation.go b/types/module/simulation.go index c3e01066e46a..e01277f457a4 100644 --- a/types/module/simulation.go +++ b/types/module/simulation.go @@ -99,7 +99,7 @@ func (sm *SimulationManager) WeightedOperations(simState SimulationState) []simu // GenesisState generator function type SimulationState struct { AppParams simulation.AppParams - Cdc *codec.LegacyAmino // application codec + Cdc codec.JSONMarshaler // application codec Rand *rand.Rand // random number GenState map[string]json.RawMessage // genesis state Accounts []simulation.Account // simulation accounts diff --git a/types/simulation/types.go b/types/simulation/types.go index be4027c9fa44..0474d616308b 100644 --- a/types/simulation/types.go +++ b/types/simulation/types.go @@ -135,7 +135,7 @@ type AppParams map[string]json.RawMessage // object. If it exists, it'll be decoded and returned. Otherwise, the provided // ParamSimulator is used to generate a random value or default value (eg: in the // case of operation weights where Rand is not used). -func (sp AppParams) GetOrGenerate(cdc *codec.LegacyAmino, key string, ptr interface{}, r *rand.Rand, ps ParamSimulator) { +func (sp AppParams) GetOrGenerate(cdc codec.JSONMarshaler, key string, ptr interface{}, r *rand.Rand, ps ParamSimulator) { if v, ok := sp[key]; ok && v != nil { cdc.MustUnmarshalJSON(v, ptr) return diff --git a/x/auth/simulation/genesis.go b/x/auth/simulation/genesis.go index b35f43f31049..e1b3b293a5e9 100644 --- a/x/auth/simulation/genesis.go +++ b/x/auth/simulation/genesis.go @@ -89,7 +89,7 @@ func RandomizedGenState(simState *module.SimulationState) { authGenesis := types.NewGenesisState(params, genesisAccs) - fmt.Printf("Selected randomly generated auth parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, authGenesis.Params)) + fmt.Printf("Selected randomly generated auth parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, &authGenesis.Params)) simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(authGenesis) } diff --git a/x/bank/simulation/genesis.go b/x/bank/simulation/genesis.go index 4d3d9dfe63b5..61a28932815c 100644 --- a/x/bank/simulation/genesis.go +++ b/x/bank/simulation/genesis.go @@ -77,6 +77,6 @@ func RandomizedGenState(simState *module.SimulationState) { Supply: supply, } - fmt.Printf("Selected randomly generated bank parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, bankGenesis.Params)) - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(bankGenesis) + fmt.Printf("Selected randomly generated bank parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, &bankGenesis.Params)) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&bankGenesis) } diff --git a/x/bank/simulation/operations.go b/x/bank/simulation/operations.go index 13d23d5338cb..30f3859fc796 100644 --- a/x/bank/simulation/operations.go +++ b/x/bank/simulation/operations.go @@ -24,7 +24,7 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc *codec.LegacyAmino, ak types.AccountKeeper, bk keeper.Keeper, + appParams simtypes.AppParams, cdc codec.JSONMarshaler, ak types.AccountKeeper, bk keeper.Keeper, ) simulation.WeightedOperations { var weightMsgSend, weightMsgMultiSend int diff --git a/x/capability/simulation/genesis.go b/x/capability/simulation/genesis.go index 9a8dee5f5bdf..465a9aa47245 100644 --- a/x/capability/simulation/genesis.go +++ b/x/capability/simulation/genesis.go @@ -31,6 +31,6 @@ func RandomizedGenState(simState *module.SimulationState) { capabilityGenesis := types.GenesisState{Index: idx} - fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, capabilityGenesis)) - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(capabilityGenesis) + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, &capabilityGenesis)) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&capabilityGenesis) } diff --git a/x/distribution/simulation/genesis.go b/x/distribution/simulation/genesis.go index 9bc9df198c8b..e4b79bdbb639 100644 --- a/x/distribution/simulation/genesis.go +++ b/x/distribution/simulation/genesis.go @@ -77,6 +77,6 @@ func RandomizedGenState(simState *module.SimulationState) { }, } - fmt.Printf("Selected randomly generated distribution parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, distrGenesis)) - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(distrGenesis) + fmt.Printf("Selected randomly generated distribution parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, &distrGenesis)) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&distrGenesis) } diff --git a/x/distribution/simulation/operations.go b/x/distribution/simulation/operations.go index 92b744a96a1c..812982e1ea1d 100644 --- a/x/distribution/simulation/operations.go +++ b/x/distribution/simulation/operations.go @@ -26,7 +26,7 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc *codec.LegacyAmino, ak types.AccountKeeper, + appParams simtypes.AppParams, cdc codec.JSONMarshaler, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper, ) simulation.WeightedOperations { diff --git a/x/gov/simulation/operations.go b/x/gov/simulation/operations.go index 9534e47d3c4d..13c8bbab4a3a 100644 --- a/x/gov/simulation/operations.go +++ b/x/gov/simulation/operations.go @@ -26,7 +26,7 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc *codec.LegacyAmino, ak types.AccountKeeper, + appParams simtypes.AppParams, cdc codec.JSONMarshaler, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, wContents []simtypes.WeightedProposalContent, ) simulation.WeightedOperations { diff --git a/x/ibc-transfer/simulation/genesis.go b/x/ibc-transfer/simulation/genesis.go index ea008681fd59..b191e3c6da80 100644 --- a/x/ibc-transfer/simulation/genesis.go +++ b/x/ibc-transfer/simulation/genesis.go @@ -26,6 +26,6 @@ func RandomizedGenState(simState *module.SimulationState) { PortID: portID, } - fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, transferGenesis)) - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(transferGenesis) + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", types.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, &transferGenesis)) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&transferGenesis) } diff --git a/x/ibc/simulation/genesis.go b/x/ibc/simulation/genesis.go index 2b5baff9bb4c..3aff7ff6275d 100644 --- a/x/ibc/simulation/genesis.go +++ b/x/ibc/simulation/genesis.go @@ -55,6 +55,6 @@ func RandomizedGenState(simState *module.SimulationState) { ChannelGenesis: channelGenesisState, } - fmt.Printf("Selected randomly generated %s parameters:\n%s\n", host.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, ibcGenesis)) - simState.GenState[host.ModuleName] = simState.Cdc.MustMarshalJSON(ibcGenesis) + fmt.Printf("Selected randomly generated %s parameters:\n%s\n", host.ModuleName, codec.MustMarshalJSONIndent(simState.Cdc, &ibcGenesis)) + simState.GenState[host.ModuleName] = simState.Cdc.MustMarshalJSON(&ibcGenesis) } diff --git a/x/simulation/params.go b/x/simulation/params.go index 6363846a09cc..f206659b2085 100644 --- a/x/simulation/params.go +++ b/x/simulation/params.go @@ -5,6 +5,8 @@ import ( "fmt" "math/rand" + "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/tendermint/tendermint/types" abci "github.com/tendermint/tendermint/abci/types" @@ -155,7 +157,7 @@ func (w WeightedProposalContent) ContentSimulatorFn() simulation.ContentSimulato // RandomParams returns random simulation consensus parameters, it extracts the Evidence from the Staking genesis state. func RandomConsensusParams(r *rand.Rand, appState json.RawMessage) *abci.ConsensusParams { - cdc := codec.New() + cdc := params.MakeEncodingConfig().Marshaler var genesisState map[string]json.RawMessage diff --git a/x/slashing/simulation/genesis.go b/x/slashing/simulation/genesis.go index 64d626d78af2..5d60c5a5d838 100644 --- a/x/slashing/simulation/genesis.go +++ b/x/slashing/simulation/genesis.go @@ -88,6 +88,6 @@ func RandomizedGenState(simState *module.SimulationState) { slashingGenesis := types.NewGenesisState(params, []types.SigningInfo{}, []types.ValidatorMissedBlocks{}) - fmt.Printf("Selected randomly generated slashing parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, slashingGenesis.Params)) + fmt.Printf("Selected randomly generated slashing parameters:\n%s\n", codec.MustMarshalJSONIndent(simState.Cdc, &slashingGenesis.Params)) simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(slashingGenesis) } diff --git a/x/slashing/simulation/operations.go b/x/slashing/simulation/operations.go index e6f01e2abfe3..447cb86aad08 100644 --- a/x/slashing/simulation/operations.go +++ b/x/slashing/simulation/operations.go @@ -23,7 +23,7 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc *codec.LegacyAmino, ak types.AccountKeeper, + appParams simtypes.AppParams, cdc codec.JSONMarshaler, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, sk stakingkeeper.Keeper, ) simulation.WeightedOperations { diff --git a/x/staking/simulation/operations.go b/x/staking/simulation/operations.go index 116abe044334..f53762df37d7 100644 --- a/x/staking/simulation/operations.go +++ b/x/staking/simulation/operations.go @@ -26,7 +26,7 @@ const ( // WeightedOperations returns all the operations from the module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc *codec.LegacyAmino, ak types.AccountKeeper, + appParams simtypes.AppParams, cdc codec.JSONMarshaler, ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper, ) simulation.WeightedOperations { var ( diff --git a/x/staking/types/genesis.go b/x/staking/types/genesis.go index a296844f986f..8b00c4d89a85 100644 --- a/x/staking/types/genesis.go +++ b/x/staking/types/genesis.go @@ -24,7 +24,7 @@ func DefaultGenesisState() *GenesisState { // GetGenesisStateFromAppState returns x/staking GenesisState given raw application // genesis state. -func GetGenesisStateFromAppState(cdc *codec.LegacyAmino, appState map[string]json.RawMessage) *GenesisState { +func GetGenesisStateFromAppState(cdc codec.JSONMarshaler, appState map[string]json.RawMessage) *GenesisState { var genesisState GenesisState if appState[ModuleName] != nil { From 9d881182dd9b10d66f614afdc0a58ac7a54530d3 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:38:47 -0400 Subject: [PATCH 17/28] Sim fixes --- simapp/sim_test.go | 6 +- x/auth/vesting/types/vesting_account.go | 141 ------------------------ 2 files changed, 3 insertions(+), 144 deletions(-) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 7ea19b1ee53e..d07d314ad1e5 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -247,9 +247,9 @@ func TestAppSimulationAfterImport(t *testing.T) { // TODO: Make another test for the fuzzer itself, which just has noOp txs // and doesn't depend on the application. func TestAppStateDeterminism(t *testing.T) { - if !FlagEnabledValue { - t.Skip("skipping application simulation") - } + //if !FlagEnabledValue { + // t.Skip("skipping application simulation") + //} config := NewConfigFromFlags() config.InitialBlockHeight = 1 diff --git a/x/auth/vesting/types/vesting_account.go b/x/auth/vesting/types/vesting_account.go index 5354189a13a0..4f4b17c55d6b 100644 --- a/x/auth/vesting/types/vesting_account.go +++ b/x/auth/vesting/types/vesting_account.go @@ -6,7 +6,6 @@ import ( yaml "gopkg.in/yaml.v2" - "github.com/cosmos/cosmos-sdk/codec/legacy" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" @@ -229,38 +228,6 @@ func (bva BaseVestingAccount) MarshalYAML() (interface{}, error) { return string(bz), err } -// MarshalJSON returns the JSON representation of a BaseVestingAccount. -func (bva BaseVestingAccount) MarshalJSON() ([]byte, error) { - alias := vestingAccountJSON{ - Address: bva.Address, - PubKey: bva.GetPubKey(), - AccountNumber: bva.AccountNumber, - Sequence: bva.Sequence, - OriginalVesting: bva.OriginalVesting, - DelegatedFree: bva.DelegatedFree, - DelegatedVesting: bva.DelegatedVesting, - EndTime: bva.EndTime, - } - - return legacy.Cdc.MarshalJSON(alias) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a BaseVestingAccount. -func (bva *BaseVestingAccount) UnmarshalJSON(bz []byte) error { - var alias vestingAccountJSON - if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil { - return err - } - - bva.BaseAccount = authtypes.NewBaseAccount(alias.Address, alias.PubKey, alias.AccountNumber, alias.Sequence) - bva.OriginalVesting = alias.OriginalVesting - bva.DelegatedFree = alias.DelegatedFree - bva.DelegatedVesting = alias.DelegatedVesting - bva.EndTime = alias.EndTime - - return nil -} - //----------------------------------------------------------------------------- // Continuous Vesting Account @@ -385,42 +352,6 @@ func (cva ContinuousVestingAccount) MarshalYAML() (interface{}, error) { return string(bz), err } -// MarshalJSON returns the JSON representation of a ContinuousVestingAccount. -func (cva ContinuousVestingAccount) MarshalJSON() ([]byte, error) { - alias := vestingAccountJSON{ - Address: cva.Address, - PubKey: cva.GetPubKey(), - AccountNumber: cva.AccountNumber, - Sequence: cva.Sequence, - OriginalVesting: cva.OriginalVesting, - DelegatedFree: cva.DelegatedFree, - DelegatedVesting: cva.DelegatedVesting, - EndTime: cva.EndTime, - StartTime: cva.StartTime, - } - - return legacy.Cdc.MarshalJSON(alias) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a ContinuousVestingAccount. -func (cva *ContinuousVestingAccount) UnmarshalJSON(bz []byte) error { - var alias vestingAccountJSON - if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil { - return err - } - - cva.BaseVestingAccount = &BaseVestingAccount{ - BaseAccount: authtypes.NewBaseAccount(alias.Address, alias.PubKey, alias.AccountNumber, alias.Sequence), - OriginalVesting: alias.OriginalVesting, - DelegatedFree: alias.DelegatedFree, - DelegatedVesting: alias.DelegatedVesting, - EndTime: alias.EndTime, - } - cva.StartTime = alias.StartTime - - return nil -} - //----------------------------------------------------------------------------- // Periodic Vesting Account @@ -575,44 +506,6 @@ func (pva PeriodicVestingAccount) MarshalYAML() (interface{}, error) { return string(bz), err } -// MarshalJSON returns the JSON representation of a PeriodicVestingAccount. -func (pva PeriodicVestingAccount) MarshalJSON() ([]byte, error) { - alias := vestingAccountJSON{ - Address: pva.Address, - PubKey: pva.GetPubKey(), - AccountNumber: pva.AccountNumber, - Sequence: pva.Sequence, - OriginalVesting: pva.OriginalVesting, - DelegatedFree: pva.DelegatedFree, - DelegatedVesting: pva.DelegatedVesting, - EndTime: pva.EndTime, - StartTime: pva.StartTime, - VestingPeriods: pva.VestingPeriods, - } - - return legacy.Cdc.MarshalJSON(alias) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a PeriodicVestingAccount. -func (pva *PeriodicVestingAccount) UnmarshalJSON(bz []byte) error { - var alias vestingAccountJSON - if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil { - return err - } - - pva.BaseVestingAccount = &BaseVestingAccount{ - BaseAccount: authtypes.NewBaseAccount(alias.Address, alias.PubKey, alias.AccountNumber, alias.Sequence), - OriginalVesting: alias.OriginalVesting, - DelegatedFree: alias.DelegatedFree, - DelegatedVesting: alias.DelegatedVesting, - EndTime: alias.EndTime, - } - pva.StartTime = alias.StartTime - pva.VestingPeriods = alias.VestingPeriods - - return nil -} - //----------------------------------------------------------------------------- // Delayed Vesting Account @@ -679,37 +572,3 @@ func (dva DelayedVestingAccount) String() string { out, _ := dva.MarshalYAML() return out.(string) } - -// MarshalJSON returns the JSON representation of a DelayedVestingAccount. -func (dva DelayedVestingAccount) MarshalJSON() ([]byte, error) { - alias := vestingAccountJSON{ - Address: dva.Address, - PubKey: dva.GetPubKey(), - AccountNumber: dva.AccountNumber, - Sequence: dva.Sequence, - OriginalVesting: dva.OriginalVesting, - DelegatedFree: dva.DelegatedFree, - DelegatedVesting: dva.DelegatedVesting, - EndTime: dva.EndTime, - } - - return legacy.Cdc.MarshalJSON(alias) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a DelayedVestingAccount. -func (dva *DelayedVestingAccount) UnmarshalJSON(bz []byte) error { - var alias vestingAccountJSON - if err := legacy.Cdc.UnmarshalJSON(bz, &alias); err != nil { - return err - } - - dva.BaseVestingAccount = &BaseVestingAccount{ - BaseAccount: authtypes.NewBaseAccount(alias.Address, alias.PubKey, alias.AccountNumber, alias.Sequence), - OriginalVesting: alias.OriginalVesting, - DelegatedFree: alias.DelegatedFree, - DelegatedVesting: alias.DelegatedVesting, - EndTime: alias.EndTime, - } - - return nil -} From 40f8816d9c5da0ad89a526b3d7a8153e002c4597 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:40:33 -0400 Subject: [PATCH 18/28] Revert --- simapp/sim_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index d07d314ad1e5..7ea19b1ee53e 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -247,9 +247,9 @@ func TestAppSimulationAfterImport(t *testing.T) { // TODO: Make another test for the fuzzer itself, which just has noOp txs // and doesn't depend on the application. func TestAppStateDeterminism(t *testing.T) { - //if !FlagEnabledValue { - // t.Skip("skipping application simulation") - //} + if !FlagEnabledValue { + t.Skip("skipping application simulation") + } config := NewConfigFromFlags() config.InitialBlockHeight = 1 From 7dbeffdfaea8c6ccafccde93f5ec11f6c92fb675 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:42:56 -0400 Subject: [PATCH 19/28] Remove vesting account JSON tests --- x/auth/vesting/types/vesting_account_test.go | 82 -------------------- 1 file changed, 82 deletions(-) diff --git a/x/auth/vesting/types/vesting_account_test.go b/x/auth/vesting/types/vesting_account_test.go index d5652bef458c..eb6e13412b0c 100644 --- a/x/auth/vesting/types/vesting_account_test.go +++ b/x/auth/vesting/types/vesting_account_test.go @@ -1,7 +1,6 @@ package types_test import ( - "encoding/json" "testing" "time" @@ -645,26 +644,6 @@ func TestGenesisAccountValidate(t *testing.T) { } } -func TestBaseVestingAccountJSON(t *testing.T) { - pubkey := secp256k1.GenPrivKey().PubKey() - addr := sdk.AccAddress(pubkey.Address()) - coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5)) - baseAcc := authtypes.NewBaseAccount(addr, pubkey, 10, 50) - - acc := types.NewBaseVestingAccount(baseAcc, coins, time.Now().Unix()) - - bz, err := json.Marshal(acc) - require.NoError(t, err) - - bz1, err := acc.MarshalJSON() - require.NoError(t, err) - require.Equal(t, string(bz1), string(bz)) - - var a types.BaseVestingAccount - require.NoError(t, json.Unmarshal(bz, &a)) - require.Equal(t, acc.String(), a.String()) -} - func TestContinuousVestingAccountMarshal(t *testing.T) { pubkey := secp256k1.GenPrivKey().PubKey() addr := sdk.AccAddress(pubkey.Address()) @@ -687,27 +666,6 @@ func TestContinuousVestingAccountMarshal(t *testing.T) { require.NotNil(t, err) } -func TestContinuousVestingAccountJSON(t *testing.T) { - pubkey := secp256k1.GenPrivKey().PubKey() - addr := sdk.AccAddress(pubkey.Address()) - coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5)) - baseAcc := authtypes.NewBaseAccount(addr, pubkey, 10, 50) - - baseVesting := types.NewBaseVestingAccount(baseAcc, coins, time.Now().Unix()) - acc := types.NewContinuousVestingAccountRaw(baseVesting, baseVesting.EndTime) - - bz, err := json.Marshal(acc) - require.NoError(t, err) - - bz1, err := acc.MarshalJSON() - require.NoError(t, err) - require.Equal(t, string(bz1), string(bz)) - - var a types.ContinuousVestingAccount - require.NoError(t, json.Unmarshal(bz, &a)) - require.Equal(t, acc.String(), a.String()) -} - func TestPeriodicVestingAccountMarshal(t *testing.T) { pubkey := secp256k1.GenPrivKey().PubKey() addr := sdk.AccAddress(pubkey.Address()) @@ -729,26 +687,6 @@ func TestPeriodicVestingAccountMarshal(t *testing.T) { require.NotNil(t, err) } -func TestPeriodicVestingAccountJSON(t *testing.T) { - pubkey := secp256k1.GenPrivKey().PubKey() - addr := sdk.AccAddress(pubkey.Address()) - coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5)) - baseAcc := authtypes.NewBaseAccount(addr, pubkey, 10, 50) - - acc := types.NewPeriodicVestingAccount(baseAcc, coins, time.Now().Unix(), types.Periods{types.Period{3600, coins}}) - - bz, err := json.Marshal(acc) - require.NoError(t, err) - - bz1, err := acc.MarshalJSON() - require.NoError(t, err) - require.Equal(t, string(bz1), string(bz)) - - var a types.PeriodicVestingAccount - require.NoError(t, json.Unmarshal(bz, &a)) - require.Equal(t, acc.String(), a.String()) -} - func TestDelayedVestingAccountMarshal(t *testing.T) { pubkey := secp256k1.GenPrivKey().PubKey() addr := sdk.AccAddress(pubkey.Address()) @@ -769,23 +707,3 @@ func TestDelayedVestingAccountMarshal(t *testing.T) { _, err = app.AccountKeeper.UnmarshalAccount(bz[:len(bz)/2]) require.NotNil(t, err) } - -func TestDelayedVestingAccountJSON(t *testing.T) { - pubkey := secp256k1.GenPrivKey().PubKey() - addr := sdk.AccAddress(pubkey.Address()) - coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5)) - baseAcc := authtypes.NewBaseAccount(addr, pubkey, 10, 50) - - acc := types.NewDelayedVestingAccount(baseAcc, coins, time.Now().Unix()) - - bz, err := json.Marshal(acc) - require.NoError(t, err) - - bz1, err := acc.MarshalJSON() - require.NoError(t, err) - require.Equal(t, string(bz1), string(bz)) - - var a types.DelayedVestingAccount - require.NoError(t, json.Unmarshal(bz, &a)) - require.Equal(t, acc.String(), a.String()) -} From fab24c6673d62917389db5e7a1236651f965661b Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:47:45 -0400 Subject: [PATCH 20/28] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 394aec26e92f..da4e930d172e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ older clients. * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove CLI and REST handlers for querying `x/evidence` parameters. * (server) [\#5982](https://github.com/cosmos/cosmos-sdk/pull/5982) `--pruning` now must be set to `custom` if you want to customise the granular options. * (x/gov) [\#7000](https://github.com/cosmos/cosmos-sdk/pull/7000) `ProposalStatus` is now JSON serialized using its protobuf name, so expect names like `PROPOSAL_STATUS_DEPOSIT_PERIOD` as opposed to `DepositPeriod`. +* (x/auth/vesting) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) Custom JSON marshaling of vesting accounts was removed. Vest accounts are now marshaled using their default proto or amino JSON representation. ### API Breaking Changes From 11d5c04728d9e8b6f38b0e1e03a8a025712874be Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 14:48:19 -0400 Subject: [PATCH 21/28] Lint --- x/auth/vesting/types/vesting_account.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/x/auth/vesting/types/vesting_account.go b/x/auth/vesting/types/vesting_account.go index 4f4b17c55d6b..80c1b5f8d6c0 100644 --- a/x/auth/vesting/types/vesting_account.go +++ b/x/auth/vesting/types/vesting_account.go @@ -9,8 +9,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" vestexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" - - "github.com/tendermint/tendermint/crypto" ) // Compile-time type assertions @@ -178,21 +176,6 @@ type vestingAccountYAML struct { VestingPeriods Periods `json:"vesting_periods,omitempty" yaml:"vesting_periods,omitempty"` } -type vestingAccountJSON struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - PubKey crypto.PubKey `json:"public_key" yaml:"public_key"` - AccountNumber uint64 `json:"account_number" yaml:"account_number"` - Sequence uint64 `json:"sequence" yaml:"sequence"` - OriginalVesting sdk.Coins `json:"original_vesting" yaml:"original_vesting"` - DelegatedFree sdk.Coins `json:"delegated_free" yaml:"delegated_free"` - DelegatedVesting sdk.Coins `json:"delegated_vesting" yaml:"delegated_vesting"` - EndTime int64 `json:"end_time" yaml:"end_time"` - - // custom fields based on concrete vesting type which can be omitted - StartTime int64 `json:"start_time,omitempty" yaml:"start_time,omitempty"` - VestingPeriods Periods `json:"vesting_periods,omitempty" yaml:"vesting_periods,omitempty"` -} - func (bva BaseVestingAccount) String() string { out, _ := bva.MarshalYAML() return out.(string) From 9e8a745d7d21b870e419978a84210bf9e1e6f455 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 15:13:32 -0400 Subject: [PATCH 22/28] Sim fixes --- simapp/sim_test.go | 16 ++++++++-------- simapp/utils.go | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 7ea19b1ee53e..2fac8adb5eec 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -104,8 +104,8 @@ func TestAppImportExport(t *testing.T) { // Run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( - t, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + t, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) @@ -137,12 +137,12 @@ func TestAppImportExport(t *testing.T) { require.Equal(t, "SimApp", newApp.Name()) var genesisState GenesisState - err = app.LegacyAmino().UnmarshalJSON(appState, &genesisState) + err = json.Unmarshal(appState, &genesisState) require.NoError(t, err) ctxA := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) ctxB := newApp.NewContext(true, abci.Header{Height: app.LastBlockHeight()}) - newApp.mm.InitGenesis(ctxB, app.LegacyAmino(), genesisState) + newApp.mm.InitGenesis(ctxB, app.AppCodec(), genesisState) newApp.StoreConsensusParams(ctxB, consensusParams) fmt.Printf("comparing stores...\n") @@ -195,8 +195,8 @@ func TestAppSimulationAfterImport(t *testing.T) { // Run randomized simulation stopEarly, simParams, simErr := simulation.SimulateFromSeed( - t, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + t, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) @@ -237,8 +237,8 @@ func TestAppSimulationAfterImport(t *testing.T) { }) _, _, err = simulation.SimulateFromSeed( - t, os.Stdout, newApp.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(newApp, newApp.LegacyAmino(), config), + t, os.Stdout, newApp.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(newApp, newApp.AppCodec(), config), newApp.ModuleAccountAddrs(), config, ) require.NoError(t, err) diff --git a/simapp/utils.go b/simapp/utils.go index 5f63b72173b0..cd29b60926b5 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -20,9 +20,9 @@ import ( // the simulation tests. If `FlagEnabledValue` is false it skips the current test. // Returns error on an invalid db intantiation or temp dir creation. func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, log.Logger, bool, error) { - if !FlagEnabledValue { - return simtypes.Config{}, nil, "", nil, true, nil - } + //if !FlagEnabledValue { + // return simtypes.Config{}, nil, "", nil, true, nil + //} config := NewConfigFromFlags() config.ChainID = helpers.SimAppChainID From b52ab5150251958cb45e16cc2d061b0e9e98f220 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 15:13:50 -0400 Subject: [PATCH 23/28] Sim fixes --- simapp/utils.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/simapp/utils.go b/simapp/utils.go index cd29b60926b5..5f63b72173b0 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -20,9 +20,9 @@ import ( // the simulation tests. If `FlagEnabledValue` is false it skips the current test. // Returns error on an invalid db intantiation or temp dir creation. func SetupSimulation(dirPrefix, dbName string) (simtypes.Config, dbm.DB, string, log.Logger, bool, error) { - //if !FlagEnabledValue { - // return simtypes.Config{}, nil, "", nil, true, nil - //} + if !FlagEnabledValue { + return simtypes.Config{}, nil, "", nil, true, nil + } config := NewConfigFromFlags() config.ChainID = helpers.SimAppChainID From d0c1263cd7ca88daaaf969a060f364d32314ab1e Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 11 Aug 2020 15:51:06 -0400 Subject: [PATCH 24/28] Docs --- codec/json.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codec/json.go b/codec/json.go index f291e229b598..044a6ae2b87e 100644 --- a/codec/json.go +++ b/codec/json.go @@ -12,8 +12,8 @@ import ( // ProtoMarshalJSON provides an auxiliary function to return Proto3 JSON encoded // bytes of a message. func ProtoMarshalJSON(msg proto.Message) ([]byte, error) { - // we use the original proto name because camel case just doesn't make sense - // EmitDefaults is also the more expected behavior for CLI users. + // We use the OrigName because camel casing fields just doesn't make sense. + // EmitDefaults is also often the more expected behavior for CLI users jm := &jsonpb.Marshaler{OrigName: true, EmitDefaults: true} err := types.UnpackInterfaces(msg, types.ProtoJSONPacker{JSONPBMarshaler: jm}) if err != nil { From e98c8d2f00989d1dcd1d5401200980462fc70311 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 12 Aug 2020 10:23:38 -0400 Subject: [PATCH 25/28] Migrate more amino usages --- go.sum | 2 -- simapp/app_test.go | 5 ++--- simapp/sim_bench_test.go | 8 ++++---- simapp/utils.go | 5 ++++- types/query/pagination_test.go | 2 +- x/bank/simulation/operations_test.go | 2 +- x/distribution/simulation/operations_test.go | 2 +- x/gov/simulation/operations_test.go | 2 +- x/slashing/simulation/operations_test.go | 2 +- x/staking/simulation/operations_test.go | 2 +- x/upgrade/abci_test.go | 2 +- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/go.sum b/go.sum index 726e17c3b9b0..73e17473b177 100644 --- a/go.sum +++ b/go.sum @@ -514,8 +514,6 @@ github.com/tendermint/tendermint v0.33.2 h1:NzvRMTuXJxqSsFed2J7uHmMU5N1CVzSpfi3n github.com/tendermint/tendermint v0.33.2/go.mod h1:25DqB7YvV1tN3tHsjWoc2vFtlwICfrub9XO6UBO+4xk= github.com/tendermint/tendermint v0.33.5 h1:jYgRd9ImkzA9iOyhpmgreYsqSB6tpDa6/rXYPb8HKE8= github.com/tendermint/tendermint v0.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= -github.com/tendermint/tendermint v0.33.7 h1:b5CQD8ggDtl4u0EbXzabi0MaOw9NrcXker6ijEkAE74= -github.com/tendermint/tendermint v0.33.7/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= github.com/tendermint/tendermint v0.33.8 h1:Xxu4QhpqcomSE0iQDw1MqLgfsa8fqtPtWFJK6zZOVso= github.com/tendermint/tendermint v0.33.8/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= github.com/tendermint/tm-db v0.4.1/go.mod h1:JsJ6qzYkCGiGwm5GHl/H5GLI9XLb6qZX7PRe425dHAY= diff --git a/simapp/app_test.go b/simapp/app_test.go index 6d593f176fd1..84ba317d716d 100644 --- a/simapp/app_test.go +++ b/simapp/app_test.go @@ -1,6 +1,7 @@ package simapp import ( + "encoding/json" "os" "testing" @@ -8,8 +9,6 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" - "github.com/cosmos/cosmos-sdk/codec" - abci "github.com/tendermint/tendermint/abci/types" ) @@ -18,7 +17,7 @@ func TestSimAppExport(t *testing.T) { app := NewSimApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, MakeEncodingConfig()) genesisState := NewDefaultGenesisState() - stateBytes, err := codec.MarshalJSONIndent(app.LegacyAmino(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) // Initialize the chain diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index 902e6184b850..20a89e94b46a 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -30,8 +30,8 @@ func BenchmarkFullAppSimulation(b *testing.B) { // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( - b, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + b, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) @@ -69,8 +69,8 @@ func BenchmarkInvariants(b *testing.B) { // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( - b, os.Stdout, app.BaseApp, AppStateFn(app.LegacyAmino(), app.SimulationManager()), - SimulationOperations(app, app.LegacyAmino(), config), + b, os.Stdout, app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), + SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, ) diff --git a/simapp/utils.go b/simapp/utils.go index 5f63b72173b0..1409310a0439 100644 --- a/simapp/utils.go +++ b/simapp/utils.go @@ -61,7 +61,10 @@ func SimulationOperations(app App, cdc codec.JSONMarshaler, config simtypes.Conf panic(err) } - app.LegacyAmino().MustUnmarshalJSON(bz, &simState.AppParams) + err = json.Unmarshal(bz, &simState.AppParams) + if err != nil { + panic(err) + } } simState.ParamChanges = app.SimulationManager().GenerateParamChanges(config.Seed) diff --git a/types/query/pagination_test.go b/types/query/pagination_test.go index a6eb24c20ae6..6c66fdf7fbf8 100644 --- a/types/query/pagination_test.go +++ b/types/query/pagination_test.go @@ -170,7 +170,7 @@ func ExamplePaginate() { accountStore := prefix.NewStore(balancesStore, addr1.Bytes()) pageRes, err := query.Paginate(accountStore, request.Pagination, func(key []byte, value []byte) error { var tempRes sdk.Coin - err := app.LegacyAmino().UnmarshalBinaryBare(value, &tempRes) + err := app.AppCodec().UnmarshalBinaryBare(value, &tempRes) if err != nil { return err } diff --git a/x/bank/simulation/operations_test.go b/x/bank/simulation/operations_test.go index 948912ec95a2..8e4f8b298e31 100644 --- a/x/bank/simulation/operations_test.go +++ b/x/bank/simulation/operations_test.go @@ -31,7 +31,7 @@ func (suite *SimTestSuite) SetupTest() { // TestWeightedOperations tests the weights of the operations. func (suite *SimTestSuite) TestWeightedOperations() { - cdc := suite.app.LegacyAmino() + cdc := suite.app.AppCodec() appParams := make(simtypes.AppParams) weightesOps := simulation.WeightedOperations(appParams, cdc, suite.app.AccountKeeper, suite.app.BankKeeper) diff --git a/x/distribution/simulation/operations_test.go b/x/distribution/simulation/operations_test.go index 99c92f2f4b3f..397eebecf259 100644 --- a/x/distribution/simulation/operations_test.go +++ b/x/distribution/simulation/operations_test.go @@ -20,7 +20,7 @@ import ( // TestWeightedOperations tests the weights of the operations. func (suite *SimTestSuite) TestWeightedOperations() { - cdc := suite.app.LegacyAmino() + cdc := suite.app.AppCodec() appParams := make(simtypes.AppParams) weightesOps := simulation.WeightedOperations(appParams, cdc, suite.app.AccountKeeper, diff --git a/x/gov/simulation/operations_test.go b/x/gov/simulation/operations_test.go index e42e2a75afdd..b101bea98cc5 100644 --- a/x/gov/simulation/operations_test.go +++ b/x/gov/simulation/operations_test.go @@ -58,7 +58,7 @@ func TestWeightedOperations(t *testing.T) { app, ctx := createTestApp(false) ctx.WithChainID("test-chain") - cdc := app.LegacyAmino() + cdc := app.AppCodec() appParams := make(simtypes.AppParams) weightesOps := simulation.WeightedOperations(appParams, cdc, app.AccountKeeper, diff --git a/x/slashing/simulation/operations_test.go b/x/slashing/simulation/operations_test.go index 2487084d6ee9..b3f1dfba471d 100644 --- a/x/slashing/simulation/operations_test.go +++ b/x/slashing/simulation/operations_test.go @@ -24,7 +24,7 @@ func TestWeightedOperations(t *testing.T) { app, ctx := createTestApp(false) ctx.WithChainID("test-chain") - cdc := app.LegacyAmino() + cdc := app.AppCodec() appParams := make(simtypes.AppParams) s := rand.NewSource(1) diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index f1ae877c9477..2f242d84d03c 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -25,7 +25,7 @@ func TestWeightedOperations(t *testing.T) { ctx.WithChainID("test-chain") - cdc := app.LegacyAmino() + cdc := app.AppCodec() appParams := make(simtypes.AppParams) weightesOps := simulation.WeightedOperations(appParams, cdc, app.AccountKeeper, diff --git a/x/upgrade/abci_test.go b/x/upgrade/abci_test.go index bbc4cbe23cdd..6a915b310a55 100644 --- a/x/upgrade/abci_test.go +++ b/x/upgrade/abci_test.go @@ -40,7 +40,7 @@ func setupTest(height int64, skip map[int64]bool) TestSuite { db := dbm.NewMemDB() app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, skip, simapp.DefaultNodeHome, 0, simapp.MakeEncodingConfig()) genesisState := simapp.NewDefaultGenesisState() - stateBytes, err := codec.MarshalJSONIndent(app.LegacyAmino(), genesisState) + stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { panic(err) } From 7a91e69d0d033a1c8e26b91256506ed815a7efdc Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 12 Aug 2020 11:36:06 -0400 Subject: [PATCH 26/28] Remove custom VoteOption String() and json marshaling --- proto/cosmos/gov/v1beta1/gov.proto | 2 - x/gov/client/utils/utils.go | 2 +- x/gov/types/gov.pb.go | 181 +++++++++++++++-------------- x/gov/types/vote.go | 63 +--------- 4 files changed, 97 insertions(+), 151 deletions(-) diff --git a/proto/cosmos/gov/v1beta1/gov.proto b/proto/cosmos/gov/v1beta1/gov.proto index baa2e643363c..0389f05f2af2 100644 --- a/proto/cosmos/gov/v1beta1/gov.proto +++ b/proto/cosmos/gov/v1beta1/gov.proto @@ -15,8 +15,6 @@ option (gogoproto.goproto_getters_all) = false; // VoteOption defines a vote option enum VoteOption { - option (gogoproto.enum_stringer) = false; - option (gogoproto.goproto_enum_stringer) = false; option (gogoproto.goproto_enum_prefix) = false; // VOTE_OPTION_UNSPECIFIED defines a no-op vote option. diff --git a/x/gov/client/utils/utils.go b/x/gov/client/utils/utils.go index 50982cd1f7bd..84c2884d1a7f 100644 --- a/x/gov/client/utils/utils.go +++ b/x/gov/client/utils/utils.go @@ -18,7 +18,7 @@ func NormalizeVoteOption(option string) string { return types.OptionNoWithVeto.String() default: - return "" + return option } } diff --git a/x/gov/types/gov.pb.go b/x/gov/types/gov.pb.go index c12c65832f37..59e6fc3e66ca 100644 --- a/x/gov/types/gov.pb.go +++ b/x/gov/types/gov.pb.go @@ -65,6 +65,10 @@ var VoteOption_value = map[string]int32{ "VOTE_OPTION_NO_WITH_VETO": 4, } +func (x VoteOption) String() string { + return proto.EnumName(VoteOption_name, int32(x)) +} + func (VoteOption) EnumDescriptor() ([]byte, []int) { return fileDescriptor_6e82113c1a9a4b7c, []int{0} } @@ -452,95 +456,94 @@ func init() { func init() { proto.RegisterFile("cosmos/gov/v1beta1/gov.proto", fileDescriptor_6e82113c1a9a4b7c) } var fileDescriptor_6e82113c1a9a4b7c = []byte{ - // 1395 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x41, 0x6c, 0xdb, 0xd4, - 0x1b, 0x8f, 0xd3, 0xb4, 0x5d, 0x5f, 0xd2, 0xd6, 0x7b, 0xed, 0xbf, 0x4d, 0xfd, 0x1f, 0xb6, 0x67, - 0x26, 0x54, 0x4d, 0x5b, 0xba, 0x15, 0x09, 0x89, 0x4d, 0x42, 0x8b, 0x1b, 0x6f, 0x0b, 0x9a, 0x92, - 0xc8, 0xf1, 0x32, 0x6d, 0x1c, 0x2c, 0x37, 0x7e, 0x4b, 0x0d, 0xb1, 0x5f, 0x88, 0x5f, 0x4a, 0x2b, - 0x2e, 0x1c, 0x38, 0x4c, 0x01, 0xa1, 0x1d, 0x91, 0x50, 0x24, 0x24, 0x76, 0x40, 0x9c, 0x38, 0x70, - 0xe6, 0x5c, 0x21, 0x0e, 0x13, 0xe2, 0x30, 0x71, 0xc8, 0x58, 0x77, 0x41, 0x3d, 0x70, 0xe8, 0x91, - 0x13, 0xb2, 0xdf, 0x73, 0xeb, 0x24, 0x15, 0x5d, 0x04, 0xa7, 0xda, 0xdf, 0xfb, 0x7e, 0xbf, 0xef, - 0x7b, 0xbf, 0xf7, 0x7e, 0x9f, 0x1b, 0x70, 0xae, 0x8e, 0x7d, 0x17, 0xfb, 0x6b, 0x0d, 0xbc, 0xbd, - 0xb6, 0x7d, 0x75, 0x13, 0x11, 0xeb, 0x6a, 0xf0, 0x9c, 0x6b, 0xb5, 0x31, 0xc1, 0x10, 0xd2, 0xd5, - 0x5c, 0x10, 0x61, 0xab, 0x82, 0xc8, 0x10, 0x9b, 0x96, 0x8f, 0x8e, 0x20, 0x75, 0xec, 0x78, 0x14, - 0x23, 0x2c, 0x36, 0x70, 0x03, 0x87, 0x8f, 0x6b, 0xc1, 0x13, 0x8b, 0xae, 0x50, 0x94, 0x49, 0x17, - 0x18, 0x2d, 0x5d, 0x92, 0x1a, 0x18, 0x37, 0x9a, 0x68, 0x2d, 0x7c, 0xdb, 0xec, 0x3c, 0x5c, 0x23, - 0x8e, 0x8b, 0x7c, 0x62, 0xb9, 0xad, 0x08, 0x3b, 0x9c, 0x60, 0x79, 0xbb, 0x6c, 0x49, 0x1c, 0x5e, - 0xb2, 0x3b, 0x6d, 0x8b, 0x38, 0x98, 0x35, 0xa3, 0xdc, 0x03, 0x19, 0x03, 0xed, 0x90, 0x4a, 0x1b, - 0xb7, 0xb0, 0x6f, 0x35, 0xe1, 0x22, 0x98, 0x24, 0x0e, 0x69, 0xa2, 0x2c, 0x27, 0x73, 0xab, 0x33, - 0x3a, 0x7d, 0x81, 0x32, 0x48, 0xdb, 0xc8, 0xaf, 0xb7, 0x9d, 0x56, 0x00, 0xcd, 0x26, 0xc3, 0xb5, - 0x78, 0xe8, 0xda, 0xfc, 0x1f, 0x5f, 0x4b, 0xdc, 0x2f, 0x3f, 0x5c, 0x9e, 0xde, 0xc0, 0x1e, 0x41, - 0x1e, 0x51, 0x3e, 0x4f, 0x82, 0xe9, 0x02, 0x6a, 0x61, 0xdf, 0x21, 0x50, 0x03, 0xe9, 0x16, 0x2b, - 0x60, 0x3a, 0x76, 0x48, 0x9d, 0x52, 0x2f, 0xec, 0xf7, 0x25, 0x10, 0xd5, 0x2d, 0x16, 0x0e, 0xfb, - 0x12, 0xdc, 0xb5, 0xdc, 0xe6, 0x35, 0x25, 0x96, 0xaa, 0xe8, 0x20, 0x7a, 0x2b, 0xda, 0xb0, 0x0c, - 0x66, 0x6c, 0xca, 0x88, 0xdb, 0x61, 0x0f, 0x19, 0xf5, 0xea, 0x5f, 0x7d, 0xe9, 0x72, 0xc3, 0x21, - 0x5b, 0x9d, 0xcd, 0x5c, 0x1d, 0xbb, 0x4c, 0x37, 0xf6, 0xe7, 0xb2, 0x6f, 0x7f, 0xb0, 0x46, 0x76, - 0x5b, 0xc8, 0xcf, 0xe5, 0xeb, 0xf5, 0xbc, 0x6d, 0xb7, 0x91, 0xef, 0xeb, 0xc7, 0x1c, 0xb0, 0x0e, - 0xa6, 0x2c, 0x17, 0x77, 0x3c, 0x92, 0x9d, 0x90, 0x27, 0x56, 0xd3, 0xeb, 0x2b, 0x39, 0xa6, 0x7b, - 0x70, 0x74, 0xd1, 0x79, 0xe6, 0x36, 0xb0, 0xe3, 0xa9, 0x57, 0xf6, 0xfa, 0x52, 0xe2, 0xbb, 0xe7, - 0xd2, 0xea, 0x2b, 0x14, 0x0b, 0x00, 0xbe, 0xce, 0xa8, 0xaf, 0xa5, 0x02, 0x65, 0x94, 0x4f, 0xa7, - 0xc1, 0x99, 0x23, 0x91, 0xd5, 0x93, 0xf4, 0x38, 0x3f, 0xa8, 0xc7, 0x41, 0x5f, 0x4a, 0x3a, 0xf6, - 0x61, 0x5f, 0x9a, 0xa1, 0xaa, 0x0c, 0x8b, 0x71, 0x1d, 0x4c, 0xd7, 0xa9, 0xd4, 0xa1, 0x14, 0xe9, - 0xf5, 0xc5, 0x1c, 0x3d, 0xea, 0x5c, 0x74, 0xd4, 0xb9, 0xbc, 0xb7, 0xab, 0xa6, 0x7f, 0x3a, 0x3e, - 0x13, 0x3d, 0x42, 0xc0, 0x1a, 0x98, 0xf2, 0x89, 0x45, 0x3a, 0x7e, 0x76, 0x42, 0xe6, 0x56, 0xe7, - 0xd6, 0x95, 0xdc, 0xe8, 0x3d, 0xce, 0x45, 0xbd, 0x54, 0xc3, 0x4c, 0x55, 0x38, 0xec, 0x4b, 0x4b, - 0x43, 0x27, 0x44, 0x49, 0x14, 0x9d, 0xb1, 0xc1, 0x16, 0x80, 0x0f, 0x1d, 0xcf, 0x6a, 0x9a, 0xc4, - 0x6a, 0x36, 0x77, 0xcd, 0x36, 0xf2, 0x3b, 0x4d, 0x92, 0x4d, 0x85, 0xfd, 0x49, 0x27, 0xd5, 0x30, - 0x82, 0x3c, 0x3d, 0x4c, 0x53, 0xcf, 0x07, 0x12, 0x1f, 0xf6, 0xa5, 0x15, 0x5a, 0x64, 0x94, 0x48, - 0xd1, 0xf9, 0x30, 0x18, 0x03, 0xc1, 0xf7, 0x40, 0xda, 0xef, 0x6c, 0xba, 0x0e, 0x31, 0x03, 0x53, - 0x64, 0x27, 0xc3, 0x52, 0xc2, 0x88, 0x14, 0x46, 0xe4, 0x18, 0x55, 0x64, 0x55, 0xd8, 0x65, 0x8b, - 0x81, 0x95, 0xc7, 0xcf, 0x25, 0x4e, 0x07, 0x34, 0x12, 0x00, 0xa0, 0x03, 0x78, 0x76, 0x59, 0x4c, - 0xe4, 0xd9, 0xb4, 0xc2, 0xd4, 0xa9, 0x15, 0x5e, 0x67, 0x15, 0x96, 0x69, 0x85, 0x61, 0x06, 0x5a, - 0x66, 0x8e, 0x85, 0x35, 0xcf, 0x0e, 0x4b, 0x3d, 0xe2, 0xc0, 0x2c, 0xc1, 0xc4, 0x6a, 0x9a, 0x6c, - 0x21, 0x3b, 0x7d, 0xda, 0x95, 0xbc, 0xcd, 0xea, 0x2c, 0xd2, 0x3a, 0x03, 0x68, 0x65, 0xac, 0xab, - 0x9a, 0x09, 0xb1, 0x91, 0x5b, 0x9b, 0xe0, 0xec, 0x36, 0x26, 0x8e, 0xd7, 0x08, 0x8e, 0xb7, 0xcd, - 0x84, 0x3d, 0x73, 0xea, 0xb6, 0x2f, 0xb0, 0x76, 0xb2, 0xb4, 0x9d, 0x11, 0x0a, 0xba, 0xef, 0x79, - 0x1a, 0xaf, 0x06, 0xe1, 0x70, 0xe3, 0x0f, 0x01, 0x0b, 0x1d, 0x4b, 0x3c, 0x73, 0x6a, 0x2d, 0x85, - 0xd5, 0x5a, 0x1a, 0xa8, 0x35, 0xa8, 0xf0, 0x2c, 0x8d, 0x32, 0x81, 0x99, 0x0d, 0xf7, 0x92, 0x20, - 0x1d, 0xbf, 0x3e, 0x37, 0xc0, 0xc4, 0x2e, 0xf2, 0xe9, 0xb0, 0x53, 0x73, 0x01, 0xeb, 0x6f, 0x7d, - 0xe9, 0x8d, 0x57, 0x10, 0xae, 0xe8, 0x11, 0x3d, 0x80, 0xc2, 0xdb, 0x60, 0xda, 0xda, 0xf4, 0x89, - 0xe5, 0xb0, 0xb1, 0x38, 0x36, 0x4b, 0x04, 0x87, 0xef, 0x80, 0xa4, 0x87, 0x43, 0x43, 0x8e, 0x4f, - 0x92, 0xf4, 0x30, 0x6c, 0x80, 0x8c, 0x87, 0xcd, 0x8f, 0x1c, 0xb2, 0x65, 0x6e, 0x23, 0x82, 0x43, - 0xdb, 0xcd, 0xa8, 0xda, 0x78, 0x4c, 0x87, 0x7d, 0x69, 0x81, 0x8a, 0x1a, 0xe7, 0x52, 0x74, 0xe0, - 0xe1, 0x7b, 0x0e, 0xd9, 0xaa, 0x21, 0x82, 0x99, 0x94, 0xbf, 0x72, 0x20, 0x55, 0xc3, 0x04, 0xfd, - 0x57, 0xd3, 0xfd, 0x16, 0x98, 0xdc, 0xc6, 0x04, 0xfd, 0x8b, 0xc9, 0x4e, 0xf1, 0xf0, 0x2d, 0x30, - 0x85, 0xe9, 0x77, 0x8a, 0x0e, 0x37, 0xf1, 0xa4, 0xc1, 0x13, 0x74, 0x5e, 0x0e, 0xb3, 0x74, 0x96, - 0xcd, 0xb6, 0xf5, 0x63, 0x12, 0xcc, 0x32, 0x27, 0x54, 0xac, 0xb6, 0xe5, 0xfa, 0xf0, 0x2b, 0x0e, - 0xa4, 0x5d, 0xc7, 0x3b, 0x32, 0x26, 0x77, 0x9a, 0x31, 0xcd, 0x40, 0xf2, 0x83, 0xbe, 0xf4, 0xbf, - 0x18, 0xea, 0x12, 0x76, 0x1d, 0x82, 0xdc, 0x16, 0xd9, 0x3d, 0x96, 0x22, 0xb6, 0x3c, 0x9e, 0x5f, - 0x81, 0xeb, 0x78, 0x91, 0x5b, 0xbf, 0xe0, 0x00, 0x74, 0xad, 0x9d, 0x88, 0xc8, 0x6c, 0xa1, 0xb6, - 0x83, 0x6d, 0xf6, 0x4d, 0x58, 0x19, 0xf1, 0x50, 0x81, 0x7d, 0xfe, 0xe9, 0xbd, 0x38, 0xe8, 0x4b, - 0xe7, 0x46, 0xc1, 0x03, 0xbd, 0xb2, 0x69, 0x3c, 0x9a, 0xa5, 0x7c, 0x19, 0xb8, 0x8c, 0x77, 0xad, - 0x9d, 0x48, 0x2e, 0x1a, 0xfe, 0x8c, 0x03, 0x99, 0x5a, 0x68, 0x3d, 0xa6, 0xdf, 0xc7, 0x80, 0x59, - 0x31, 0xea, 0x8d, 0x3b, 0xad, 0xb7, 0xeb, 0xac, 0xb7, 0xe5, 0x01, 0xdc, 0x40, 0x5b, 0x8b, 0x03, - 0xce, 0x8f, 0x77, 0x94, 0xa1, 0x31, 0xd6, 0xcd, 0x93, 0xc8, 0xf0, 0xac, 0x99, 0x07, 0x60, 0xea, - 0xc3, 0x0e, 0x6e, 0x77, 0xdc, 0xb0, 0x8b, 0x8c, 0xaa, 0x8e, 0x61, 0x8f, 0x02, 0xaa, 0x1f, 0xf4, - 0x25, 0x9e, 0xe2, 0x8f, 0xbb, 0xd1, 0x19, 0x23, 0xac, 0x83, 0x19, 0xb2, 0xd5, 0x46, 0xfe, 0x16, - 0x6e, 0xda, 0xec, 0x16, 0x6b, 0x63, 0xd3, 0x2f, 0x1c, 0x51, 0xc4, 0x2a, 0x1c, 0xf3, 0x42, 0x03, - 0xa4, 0x42, 0x77, 0x4f, 0x84, 0xfc, 0x37, 0xc6, 0xe6, 0x9f, 0x0b, 0xd0, 0x31, 0xea, 0x90, 0xed, - 0xe2, 0x9f, 0x1c, 0x00, 0xc7, 0x96, 0x80, 0x97, 0xc0, 0x72, 0xad, 0x6c, 0x68, 0x66, 0xb9, 0x62, - 0x14, 0xcb, 0x25, 0xf3, 0x6e, 0xa9, 0x5a, 0xd1, 0x36, 0x8a, 0x37, 0x8b, 0x5a, 0x81, 0x4f, 0x08, - 0xf3, 0xdd, 0x9e, 0x9c, 0xa6, 0x89, 0x5a, 0x40, 0x01, 0x15, 0x30, 0x1f, 0xcf, 0xbe, 0xaf, 0x55, - 0x79, 0x4e, 0x98, 0xed, 0xf6, 0xe4, 0x19, 0x9a, 0x75, 0x1f, 0xf9, 0xf0, 0x22, 0x58, 0x88, 0xe7, - 0xe4, 0xd5, 0xaa, 0x91, 0x2f, 0x96, 0xf8, 0xa4, 0x70, 0xb6, 0xdb, 0x93, 0x67, 0x69, 0x5e, 0x9e, - 0x0d, 0x42, 0x19, 0xcc, 0xc5, 0x73, 0x4b, 0x65, 0x7e, 0x42, 0xc8, 0x74, 0x7b, 0xf2, 0x19, 0x9a, - 0x56, 0xc2, 0x70, 0x1d, 0x64, 0x07, 0x33, 0xcc, 0x7b, 0x45, 0xe3, 0xb6, 0x59, 0xd3, 0x8c, 0x32, - 0x9f, 0x12, 0x16, 0xbb, 0x3d, 0x99, 0x8f, 0x72, 0xa3, 0xa9, 0x25, 0x64, 0x1e, 0x7d, 0x23, 0x26, - 0xbe, 0x7d, 0x22, 0x26, 0xbe, 0x7f, 0x22, 0x26, 0x2e, 0xfe, 0x9c, 0x04, 0x73, 0x83, 0xff, 0xe0, - 0xc0, 0x1c, 0xf8, 0x7f, 0x45, 0x2f, 0x57, 0xca, 0xd5, 0xfc, 0x1d, 0xb3, 0x6a, 0xe4, 0x8d, 0xbb, - 0xd5, 0xa1, 0x8d, 0x87, 0x5b, 0xa2, 0xc9, 0x25, 0xa7, 0x09, 0xaf, 0x03, 0x71, 0x38, 0xbf, 0xa0, - 0x55, 0xca, 0xd5, 0xa2, 0x61, 0x56, 0x34, 0xbd, 0x58, 0x2e, 0xf0, 0x9c, 0xb0, 0xdc, 0xed, 0xc9, - 0x0b, 0x14, 0x32, 0xe0, 0x12, 0xf8, 0x36, 0x78, 0x6d, 0x18, 0x5c, 0x2b, 0x1b, 0xc5, 0xd2, 0xad, - 0x08, 0x9b, 0x14, 0x96, 0xba, 0x3d, 0x19, 0x52, 0x6c, 0x2d, 0x76, 0xa5, 0xe1, 0x25, 0xb0, 0x34, - 0x0c, 0xad, 0xe4, 0xab, 0x55, 0xad, 0xc0, 0x4f, 0x08, 0x7c, 0xb7, 0x27, 0x67, 0x28, 0xa6, 0x62, - 0xf9, 0x3e, 0xb2, 0xe1, 0x15, 0x90, 0x1d, 0xce, 0xd6, 0xb5, 0x77, 0xb5, 0x0d, 0x43, 0x2b, 0xf0, - 0x29, 0x01, 0x76, 0x7b, 0xf2, 0x1c, 0xcd, 0xd7, 0xd1, 0xfb, 0xa8, 0x4e, 0xd0, 0x89, 0xfc, 0x37, - 0xf3, 0xc5, 0x3b, 0x5a, 0x81, 0x9f, 0x8c, 0xf3, 0xdf, 0xb4, 0x9c, 0x26, 0xb2, 0x85, 0x54, 0x20, - 0xab, 0x5a, 0xda, 0x7b, 0x21, 0x26, 0x9e, 0xbd, 0x10, 0x13, 0x9f, 0xec, 0x8b, 0x89, 0xbd, 0x7d, - 0x91, 0x7b, 0xba, 0x2f, 0x72, 0xbf, 0xef, 0x8b, 0xdc, 0xe3, 0x97, 0x62, 0xe2, 0xe9, 0x4b, 0x31, - 0xf1, 0xec, 0xa5, 0x98, 0x78, 0xf0, 0xcf, 0x13, 0x6e, 0x27, 0xfc, 0x8d, 0x15, 0xde, 0xd5, 0xcd, - 0xa9, 0x70, 0x28, 0xbc, 0xf9, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x85, 0xd1, 0x2a, 0x7e, - 0x0d, 0x00, 0x00, + // 1383 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x31, 0x6c, 0xdb, 0x46, + 0x17, 0x16, 0x65, 0xd9, 0x8e, 0x4f, 0xb2, 0xcd, 0x9c, 0xfd, 0xdb, 0x32, 0xff, 0xfc, 0x24, 0xc3, + 0x3f, 0x28, 0x8c, 0x20, 0x91, 0x13, 0x17, 0x28, 0xd0, 0x04, 0x28, 0x22, 0x5a, 0x4c, 0xa2, 0x22, + 0x90, 0x04, 0x8a, 0x51, 0x90, 0x74, 0x20, 0x68, 0xf1, 0x22, 0xb3, 0x15, 0x79, 0xaa, 0x78, 0x72, + 0x6d, 0x74, 0xe9, 0xd0, 0x21, 0x50, 0x8b, 0x22, 0x63, 0x81, 0x42, 0x40, 0x81, 0x76, 0xea, 0xdc, + 0xb9, 0xb3, 0x51, 0x74, 0x08, 0x8a, 0x0e, 0x41, 0x07, 0xa5, 0x71, 0x80, 0xa2, 0xf0, 0xe8, 0xb1, + 0x53, 0x41, 0xde, 0xd1, 0xa2, 0x24, 0xa3, 0x8e, 0xd0, 0x4e, 0x26, 0xdf, 0xbd, 0xef, 0x7b, 0xef, + 0xbe, 0xbb, 0xef, 0xd1, 0x02, 0x17, 0xea, 0xd8, 0x77, 0xb1, 0xbf, 0xd1, 0xc0, 0xbb, 0x1b, 0xbb, + 0xd7, 0xb7, 0x11, 0xb1, 0xae, 0x07, 0xcf, 0xb9, 0x56, 0x1b, 0x13, 0x0c, 0x21, 0x5d, 0xcd, 0x05, + 0x11, 0xb6, 0x2a, 0x88, 0x0c, 0xb1, 0x6d, 0xf9, 0xe8, 0x04, 0x52, 0xc7, 0x8e, 0x47, 0x31, 0xc2, + 0x72, 0x03, 0x37, 0x70, 0xf8, 0xb8, 0x11, 0x3c, 0xb1, 0xe8, 0x1a, 0x45, 0x99, 0x74, 0x81, 0xd1, + 0xd2, 0x25, 0xa9, 0x81, 0x71, 0xa3, 0x89, 0x36, 0xc2, 0xb7, 0xed, 0xce, 0xe3, 0x0d, 0xe2, 0xb8, + 0xc8, 0x27, 0x96, 0xdb, 0x8a, 0xb0, 0xa3, 0x09, 0x96, 0xb7, 0xcf, 0x96, 0xc4, 0xd1, 0x25, 0xbb, + 0xd3, 0xb6, 0x88, 0x83, 0x59, 0x33, 0xca, 0x03, 0x90, 0x31, 0xd0, 0x1e, 0xa9, 0xb4, 0x71, 0x0b, + 0xfb, 0x56, 0x13, 0x2e, 0x83, 0x69, 0xe2, 0x90, 0x26, 0xca, 0x72, 0x32, 0xb7, 0x3e, 0xa7, 0xd3, + 0x17, 0x28, 0x83, 0xb4, 0x8d, 0xfc, 0x7a, 0xdb, 0x69, 0x05, 0xd0, 0x6c, 0x32, 0x5c, 0x8b, 0x87, + 0x6e, 0x2c, 0xfe, 0xf1, 0xb5, 0xc4, 0xfd, 0xfc, 0xfd, 0xd5, 0xd9, 0x2d, 0xec, 0x11, 0xe4, 0x11, + 0xe5, 0xf3, 0x24, 0x98, 0x2d, 0xa0, 0x16, 0xf6, 0x1d, 0x02, 0x35, 0x90, 0x6e, 0xb1, 0x02, 0xa6, + 0x63, 0x87, 0xd4, 0x29, 0xf5, 0xd2, 0x61, 0x5f, 0x02, 0x51, 0xdd, 0x62, 0xe1, 0xb8, 0x2f, 0xc1, + 0x7d, 0xcb, 0x6d, 0xde, 0x50, 0x62, 0xa9, 0x8a, 0x0e, 0xa2, 0xb7, 0xa2, 0x0d, 0xcb, 0x60, 0xce, + 0xa6, 0x8c, 0xb8, 0x1d, 0xf6, 0x90, 0x51, 0xaf, 0xff, 0xd9, 0x97, 0xae, 0x36, 0x1c, 0xb2, 0xd3, + 0xd9, 0xce, 0xd5, 0xb1, 0xcb, 0x74, 0x63, 0x7f, 0xae, 0xfa, 0xf6, 0x07, 0x1b, 0x64, 0xbf, 0x85, + 0xfc, 0x5c, 0xbe, 0x5e, 0xcf, 0xdb, 0x76, 0x1b, 0xf9, 0xbe, 0x3e, 0xe0, 0x80, 0x75, 0x30, 0x63, + 0xb9, 0xb8, 0xe3, 0x91, 0xec, 0x94, 0x3c, 0xb5, 0x9e, 0xde, 0x5c, 0xcb, 0x31, 0xdd, 0x83, 0xa3, + 0x8b, 0xce, 0x33, 0xb7, 0x85, 0x1d, 0x4f, 0xbd, 0x76, 0xd0, 0x97, 0x12, 0xdf, 0xbd, 0x90, 0xd6, + 0x5f, 0xa3, 0x58, 0x00, 0xf0, 0x75, 0x46, 0x7d, 0x23, 0x15, 0x28, 0xa3, 0x7c, 0x3a, 0x0b, 0xce, + 0x9d, 0x88, 0xac, 0x9e, 0xa6, 0xc7, 0xc5, 0x61, 0x3d, 0x8e, 0xfa, 0x52, 0xd2, 0xb1, 0x8f, 0xfb, + 0xd2, 0x1c, 0x55, 0x65, 0x54, 0x8c, 0x9b, 0x60, 0xb6, 0x4e, 0xa5, 0x0e, 0xa5, 0x48, 0x6f, 0x2e, + 0xe7, 0xe8, 0x51, 0xe7, 0xa2, 0xa3, 0xce, 0xe5, 0xbd, 0x7d, 0x35, 0xfd, 0xe3, 0xe0, 0x4c, 0xf4, + 0x08, 0x01, 0x6b, 0x60, 0xc6, 0x27, 0x16, 0xe9, 0xf8, 0xd9, 0x29, 0x99, 0x5b, 0x5f, 0xd8, 0x54, + 0x72, 0xe3, 0xf7, 0x38, 0x17, 0xf5, 0x52, 0x0d, 0x33, 0x55, 0xe1, 0xb8, 0x2f, 0xad, 0x8c, 0x9c, + 0x10, 0x25, 0x51, 0x74, 0xc6, 0x06, 0x5b, 0x00, 0x3e, 0x76, 0x3c, 0xab, 0x69, 0x12, 0xab, 0xd9, + 0xdc, 0x37, 0xdb, 0xc8, 0xef, 0x34, 0x49, 0x36, 0x15, 0xf6, 0x27, 0x9d, 0x56, 0xc3, 0x08, 0xf2, + 0xf4, 0x30, 0x4d, 0xbd, 0x18, 0x48, 0x7c, 0xdc, 0x97, 0xd6, 0x68, 0x91, 0x71, 0x22, 0x45, 0xe7, + 0xc3, 0x60, 0x0c, 0x04, 0xdf, 0x03, 0x69, 0xbf, 0xb3, 0xed, 0x3a, 0xc4, 0x0c, 0x4c, 0x91, 0x9d, + 0x0e, 0x4b, 0x09, 0x63, 0x52, 0x18, 0x91, 0x63, 0x54, 0x91, 0x55, 0x61, 0x97, 0x2d, 0x06, 0x56, + 0x9e, 0xbe, 0x90, 0x38, 0x1d, 0xd0, 0x48, 0x00, 0x80, 0x0e, 0xe0, 0xd9, 0x65, 0x31, 0x91, 0x67, + 0xd3, 0x0a, 0x33, 0x67, 0x56, 0xf8, 0x3f, 0xab, 0xb0, 0x4a, 0x2b, 0x8c, 0x32, 0xd0, 0x32, 0x0b, + 0x2c, 0xac, 0x79, 0x76, 0x58, 0xea, 0x09, 0x07, 0xe6, 0x09, 0x26, 0x56, 0xd3, 0x64, 0x0b, 0xd9, + 0xd9, 0xb3, 0xae, 0xe4, 0x5d, 0x56, 0x67, 0x99, 0xd6, 0x19, 0x42, 0x2b, 0x13, 0x5d, 0xd5, 0x4c, + 0x88, 0x8d, 0xdc, 0xda, 0x04, 0xe7, 0x77, 0x31, 0x71, 0xbc, 0x46, 0x70, 0xbc, 0x6d, 0x26, 0xec, + 0xb9, 0x33, 0xb7, 0x7d, 0x89, 0xb5, 0x93, 0xa5, 0xed, 0x8c, 0x51, 0xd0, 0x7d, 0x2f, 0xd2, 0x78, + 0x35, 0x08, 0x87, 0x1b, 0x7f, 0x0c, 0x58, 0x68, 0x20, 0xf1, 0xdc, 0x99, 0xb5, 0x14, 0x56, 0x6b, + 0x65, 0xa8, 0xd6, 0xb0, 0xc2, 0xf3, 0x34, 0xca, 0x04, 0x66, 0x36, 0x3c, 0x48, 0x82, 0x74, 0xfc, + 0xfa, 0xdc, 0x02, 0x53, 0xfb, 0xc8, 0xa7, 0xc3, 0x4e, 0xcd, 0x05, 0xac, 0xbf, 0xf6, 0xa5, 0x37, + 0x5e, 0x43, 0xb8, 0xa2, 0x47, 0xf4, 0x00, 0x0a, 0xef, 0x82, 0x59, 0x6b, 0xdb, 0x27, 0x96, 0xc3, + 0xc6, 0xe2, 0xc4, 0x2c, 0x11, 0x1c, 0xbe, 0x03, 0x92, 0x1e, 0x0e, 0x0d, 0x39, 0x39, 0x49, 0xd2, + 0xc3, 0xb0, 0x01, 0x32, 0x1e, 0x36, 0x3f, 0x72, 0xc8, 0x8e, 0xb9, 0x8b, 0x08, 0x0e, 0x6d, 0x37, + 0xa7, 0x6a, 0x93, 0x31, 0x1d, 0xf7, 0xa5, 0x25, 0x2a, 0x6a, 0x9c, 0x4b, 0xd1, 0x81, 0x87, 0x1f, + 0x38, 0x64, 0xa7, 0x86, 0x08, 0x66, 0x52, 0xfe, 0xc2, 0x81, 0x54, 0x0d, 0x13, 0xf4, 0x6f, 0x4d, + 0xf7, 0x3b, 0x60, 0x7a, 0x17, 0x13, 0xf4, 0x0f, 0x26, 0x3b, 0xc5, 0xc3, 0xb7, 0xc0, 0x0c, 0xa6, + 0xdf, 0x29, 0x3a, 0xdc, 0xc4, 0xd3, 0x06, 0x4f, 0xd0, 0x79, 0x39, 0xcc, 0xd2, 0x59, 0x36, 0xdb, + 0xd6, 0x0f, 0x49, 0x30, 0xcf, 0x9c, 0x50, 0xb1, 0xda, 0x96, 0xeb, 0xc3, 0xaf, 0x38, 0x90, 0x76, + 0x1d, 0xef, 0xc4, 0x98, 0xdc, 0x59, 0xc6, 0x34, 0x03, 0xc9, 0x8f, 0xfa, 0xd2, 0x7f, 0x62, 0xa8, + 0x2b, 0xd8, 0x75, 0x08, 0x72, 0x5b, 0x64, 0x7f, 0x20, 0x45, 0x6c, 0x79, 0x32, 0xbf, 0x02, 0xd7, + 0xf1, 0x22, 0xb7, 0x7e, 0xc1, 0x01, 0xe8, 0x5a, 0x7b, 0x11, 0x91, 0xd9, 0x42, 0x6d, 0x07, 0xdb, + 0xec, 0x9b, 0xb0, 0x36, 0xe6, 0xa1, 0x02, 0xfb, 0xfc, 0xd3, 0x7b, 0x71, 0xd4, 0x97, 0x2e, 0x8c, + 0x83, 0x87, 0x7a, 0x65, 0xd3, 0x78, 0x3c, 0x4b, 0xf9, 0x32, 0x70, 0x19, 0xef, 0x5a, 0x7b, 0x91, + 0x5c, 0x34, 0xfc, 0x19, 0x07, 0x32, 0xb5, 0xd0, 0x7a, 0x4c, 0xbf, 0x8f, 0x01, 0xb3, 0x62, 0xd4, + 0x1b, 0x77, 0x56, 0x6f, 0x37, 0x59, 0x6f, 0xab, 0x43, 0xb8, 0xa1, 0xb6, 0x96, 0x87, 0x9c, 0x1f, + 0xef, 0x28, 0x43, 0x63, 0xac, 0x9b, 0x6f, 0x23, 0xc3, 0xb3, 0x66, 0x1e, 0x81, 0x99, 0x0f, 0x3b, + 0xb8, 0xdd, 0x71, 0xc3, 0x2e, 0x32, 0xaa, 0x3a, 0x81, 0x3d, 0x0a, 0xa8, 0x7e, 0xd4, 0x97, 0x78, + 0x8a, 0x1f, 0x74, 0xa3, 0x33, 0x46, 0x58, 0x07, 0x73, 0x64, 0xa7, 0x8d, 0xfc, 0x1d, 0xdc, 0xb4, + 0xd9, 0x2d, 0xd6, 0x26, 0xa6, 0x5f, 0x3a, 0xa1, 0x88, 0x55, 0x18, 0xf0, 0x42, 0x03, 0xa4, 0x42, + 0x77, 0x4f, 0x85, 0xfc, 0xb7, 0x26, 0xe6, 0x5f, 0x08, 0xd0, 0x31, 0xea, 0x90, 0xed, 0xf2, 0xef, + 0x1c, 0x00, 0x03, 0x4b, 0xc0, 0x2b, 0x60, 0xb5, 0x56, 0x36, 0x34, 0xb3, 0x5c, 0x31, 0x8a, 0xe5, + 0x92, 0x79, 0xbf, 0x54, 0xad, 0x68, 0x5b, 0xc5, 0xdb, 0x45, 0xad, 0xc0, 0x27, 0x84, 0xc5, 0x6e, + 0x4f, 0x4e, 0xd3, 0x44, 0x2d, 0xa0, 0x80, 0x0a, 0x58, 0x8c, 0x67, 0x3f, 0xd4, 0xaa, 0x3c, 0x27, + 0xcc, 0x77, 0x7b, 0xf2, 0x1c, 0xcd, 0x7a, 0x88, 0x7c, 0x78, 0x19, 0x2c, 0xc5, 0x73, 0xf2, 0x6a, + 0xd5, 0xc8, 0x17, 0x4b, 0x7c, 0x52, 0x38, 0xdf, 0xed, 0xc9, 0xf3, 0x34, 0x2f, 0xcf, 0x06, 0xa1, + 0x0c, 0x16, 0xe2, 0xb9, 0xa5, 0x32, 0x3f, 0x25, 0x64, 0xba, 0x3d, 0xf9, 0x1c, 0x4d, 0x2b, 0x61, + 0xb8, 0x09, 0xb2, 0xc3, 0x19, 0xe6, 0x83, 0xa2, 0x71, 0xd7, 0xac, 0x69, 0x46, 0x99, 0x4f, 0x09, + 0xcb, 0xdd, 0x9e, 0xcc, 0x47, 0xb9, 0xd1, 0xd4, 0x12, 0x52, 0x4f, 0xbe, 0x11, 0x13, 0x97, 0x7f, + 0x4a, 0x82, 0x85, 0xe1, 0x7f, 0x6c, 0x60, 0x0e, 0xfc, 0xb7, 0xa2, 0x97, 0x2b, 0xe5, 0x6a, 0xfe, + 0x9e, 0x59, 0x35, 0xf2, 0xc6, 0xfd, 0xea, 0xc8, 0x86, 0xc3, 0xad, 0xd0, 0xe4, 0x92, 0xd3, 0x84, + 0x37, 0x81, 0x38, 0x9a, 0x5f, 0xd0, 0x2a, 0xe5, 0x6a, 0xd1, 0x30, 0x2b, 0x9a, 0x5e, 0x2c, 0x17, + 0x78, 0x4e, 0x58, 0xed, 0xf6, 0xe4, 0x25, 0x0a, 0x19, 0x72, 0x07, 0x7c, 0x1b, 0xfc, 0x6f, 0x14, + 0x5c, 0x2b, 0x1b, 0xc5, 0xd2, 0x9d, 0x08, 0x9b, 0x14, 0x56, 0xba, 0x3d, 0x19, 0x52, 0x6c, 0x2d, + 0x76, 0x95, 0xe1, 0x15, 0xb0, 0x32, 0x0a, 0xad, 0xe4, 0xab, 0x55, 0xad, 0xc0, 0x4f, 0x09, 0x7c, + 0xb7, 0x27, 0x67, 0x28, 0xa6, 0x62, 0xf9, 0x3e, 0xb2, 0xe1, 0x35, 0x90, 0x1d, 0xcd, 0xd6, 0xb5, + 0x77, 0xb5, 0x2d, 0x43, 0x2b, 0xf0, 0x29, 0x01, 0x76, 0x7b, 0xf2, 0x02, 0xcd, 0xd7, 0xd1, 0xfb, + 0xa8, 0x4e, 0xd0, 0xa9, 0xfc, 0xb7, 0xf3, 0xc5, 0x7b, 0x5a, 0x81, 0x9f, 0x8e, 0xf3, 0xdf, 0xb6, + 0x9c, 0x26, 0xb2, 0xa9, 0x9c, 0x6a, 0xe9, 0xe0, 0xa5, 0x98, 0x78, 0xfe, 0x52, 0x4c, 0x7c, 0x72, + 0x28, 0x26, 0x0e, 0x0e, 0x45, 0xee, 0xd9, 0xa1, 0xc8, 0xfd, 0x76, 0x28, 0x72, 0x4f, 0x5f, 0x89, + 0x89, 0x67, 0xaf, 0xc4, 0xc4, 0xf3, 0x57, 0x62, 0xe2, 0xd1, 0xdf, 0x4f, 0xb6, 0xbd, 0xf0, 0xb7, + 0x55, 0x78, 0x47, 0xb7, 0x67, 0xc2, 0x61, 0xf0, 0xe6, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x46, + 0x4b, 0xfc, 0xfb, 0x76, 0x0d, 0x00, 0x00, } func (this *TextProposal) Equal(that interface{}) bool { diff --git a/x/gov/types/vote.go b/x/gov/types/vote.go index 3dea5de0dd1c..7b1c5611b37e 100644 --- a/x/gov/types/vote.go +++ b/x/gov/types/vote.go @@ -1,7 +1,6 @@ package types import ( - "encoding/json" "fmt" yaml "gopkg.in/yaml.v2" @@ -56,22 +55,11 @@ func (v Vote) Empty() bool { // VoteOptionFromString returns a VoteOption from a string. It returns an error // if the string is invalid. func VoteOptionFromString(str string) (VoteOption, error) { - switch str { - case "Yes": - return OptionYes, nil - - case "Abstain": - return OptionAbstain, nil - - case "No": - return OptionNo, nil - - case "NoWithVeto": - return OptionNoWithVeto, nil - - default: - return VoteOption(0xff), fmt.Errorf("'%s' is not a valid vote option", str) + option, ok := VoteOption_value[str] + if !ok { + return OptionEmpty, fmt.Errorf("'%s' is not a valid vote option", str) } + return VoteOption(option), nil } // ValidVoteOption returns true if the vote option is valid and false otherwise. @@ -96,49 +84,6 @@ func (vo *VoteOption) Unmarshal(data []byte) error { return nil } -// Marshals to JSON using string. -func (vo VoteOption) MarshalJSON() ([]byte, error) { - return json.Marshal(vo.String()) -} - -// UnmarshalJSON decodes from JSON assuming Bech32 encoding. -func (vo *VoteOption) UnmarshalJSON(data []byte) error { - var s string - err := json.Unmarshal(data, &s) - if err != nil { - return err - } - - if s == "" { - *vo = OptionEmpty - return nil - } - - bz2, err := VoteOptionFromString(s) - if err != nil { - return err - } - - *vo = bz2 - return nil -} - -// String implements the Stringer interface. -func (vo VoteOption) String() string { - switch vo { - case OptionYes: - return "Yes" - case OptionAbstain: - return "Abstain" - case OptionNo: - return "No" - case OptionNoWithVeto: - return "NoWithVeto" - default: - return "" - } -} - // Format implements the fmt.Formatter interface. func (vo VoteOption) Format(s fmt.State, verb rune) { switch verb { From 2b0f52b9875d89e6f03341d1833c17b06faaeec5 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 12 Aug 2020 15:42:58 -0400 Subject: [PATCH 27/28] Fix tests --- x/gov/simulation/operations_test.go | 2 +- x/gov/types/vote_test.go | 36 ----------------------------- 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 x/gov/types/vote_test.go diff --git a/x/gov/simulation/operations_test.go b/x/gov/simulation/operations_test.go index b101bea98cc5..393986995aa1 100644 --- a/x/gov/simulation/operations_test.go +++ b/x/gov/simulation/operations_test.go @@ -202,7 +202,7 @@ func TestSimulateMsgVote(t *testing.T) { require.True(t, operationMsg.OK) require.Equal(t, uint64(1), msg.ProposalID) require.Equal(t, "cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r", msg.Voter.String()) - require.Equal(t, "Yes", msg.Option.String()) + require.Equal(t, types.OptionYes, msg.Option) require.Equal(t, "gov", msg.Route()) require.Equal(t, types.TypeMsgVote, msg.Type()) diff --git a/x/gov/types/vote_test.go b/x/gov/types/vote_test.go deleted file mode 100644 index 3e50a33ae9ee..000000000000 --- a/x/gov/types/vote_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package types - -import ( - "encoding/json" - "fmt" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestVoteUnMarshalJSON(t *testing.T) { - tests := []struct { - option string - isError bool - }{ - {"Yes", false}, - {"No", false}, - {"Abstain", false}, - {"NoWithVeto", false}, - {"", false}, - {"misc", true}, - } - for _, tt := range tests { - var vo VoteOption - data, err := json.Marshal(tt.option) - require.NoError(t, err) - - err = vo.UnmarshalJSON(data) - if tt.isError { - require.Error(t, err) - require.EqualError(t, err, fmt.Sprintf("'%s' is not a valid vote option", tt.option)) - } else { - require.NoError(t, err) - } - } -} From d6643ba97bac301b8339ca4083668b8062b3277b Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 12 Aug 2020 17:53:49 -0400 Subject: [PATCH 28/28] Add comments, update CHANGELOG.md --- CHANGELOG.md | 4 ++-- server/start.go | 2 ++ simapp/app.go | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fba389ace4..cb69d6070d4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,8 +62,8 @@ older clients. * (client/keys) [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) Remove `keys update` command. * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove CLI and REST handlers for querying `x/evidence` parameters. * (server) [\#5982](https://github.com/cosmos/cosmos-sdk/pull/5982) `--pruning` now must be set to `custom` if you want to customise the granular options. -* (x/gov) [\#7000](https://github.com/cosmos/cosmos-sdk/pull/7000) `ProposalStatus` is now JSON serialized using its protobuf name, so expect names like `PROPOSAL_STATUS_DEPOSIT_PERIOD` as opposed to `DepositPeriod`. -* (x/auth/vesting) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) Custom JSON marshaling of vesting accounts was removed. Vest accounts are now marshaled using their default proto or amino JSON representation. +* (x/gov) [\#7000](https://github.com/cosmos/cosmos-sdk/pull/7000) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) `ProposalStatus` and `VoteOption` are now JSON serialized using its protobuf name, so expect names like `PROPOSAL_STATUS_DEPOSIT_PERIOD` as opposed to `DepositPeriod`. +* (x/auth/vesting) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) Custom JSON marshaling of vesting accounts was removed. Vesting accounts are now marshaled using their default proto or amino JSON representation. ### API Breaking Changes diff --git a/server/start.go b/server/start.go index 234876a653b5..925f6793003a 100644 --- a/server/start.go +++ b/server/start.go @@ -106,6 +106,7 @@ which accepts a path for the resulting pprof file. serverCtx.Logger.Info("starting ABCI with Tendermint") + // amino is needed here for backwards compatibility of REST routes err := startInProcess(serverCtx, clientCtx.LegacyAmino, appCreator) return err }, @@ -232,6 +233,7 @@ func startInProcess(ctx *Context, legacyAminoCdc *codec.LegacyAmino, appCreator WithHomeDir(home). WithChainID(genDoc.ChainID). WithJSONMarshaler(legacyAminoCdc). + // amino is needed here for backwards compatibility of REST routes WithLegacyAmino(legacyAminoCdc). WithClient(local.New(tmNode)) diff --git a/simapp/app.go b/simapp/app.go index 12a59188b8e9..5187e040e338 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -504,6 +504,7 @@ func (app *SimApp) SimulationManager() *module.SimulationManager { // API server. func (app *SimApp) RegisterAPIRoutes(apiSvr *api.Server) { clientCtx := apiSvr.ClientCtx + // amino is needed here for backwards compatibility of REST routes clientCtx = clientCtx.WithJSONMarshaler(clientCtx.LegacyAmino) rpc.RegisterRoutes(clientCtx, apiSvr.Router) authrest.RegisterTxRoutes(clientCtx, apiSvr.Router)