diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 9e1b5c890..de949546f 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -15,9 +15,12 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi - [abci/counter] \#6684 Delete counter example app - [txResults] \#9175 Remove `gas_used` & `gas_wanted` from being merkelized in the lastresulthash in the header - [abci] \#5783 Make length delimiter encoding consistent (`uint64`) between ABCI and P2P wire-level protocols - - [abci] \#9145 Removes Response/Request `SetOption` from ABCI + - [abci] \#9145 Removes unused Response/Request `SetOption` from ABCI (@samricotta) - [abci] \#8656 Added cli command for `PrepareProposal`. (@jmalicevic) - [abci] \#8901 Added cli command for `ProcessProposal`. (@hvanz) + - [abci/params] \#9287 Deduplicate `ConsensusParams` and `BlockParams` so only `types` proto definitions are used (@cmwaters) + - Remove `TimeIotaMs` and use a hard-coded 1 millisecond value to ensure monotonically increasing block times. + - Rename `AppVersion` to `App` so as to not stutter. - P2P Protocol diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 4f42bea2c..766f900c7 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -604,12 +604,12 @@ func (m *RequestInfo) GetAbciVersion() string { } type RequestInitChain struct { - Time time.Time `protobuf:"bytes,1,opt,name=time,proto3,stdtime" json:"time"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` - ConsensusParams *ConsensusParams `protobuf:"bytes,3,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` - Validators []ValidatorUpdate `protobuf:"bytes,4,rep,name=validators,proto3" json:"validators"` - AppStateBytes []byte `protobuf:"bytes,5,opt,name=app_state_bytes,json=appStateBytes,proto3" json:"app_state_bytes,omitempty"` - InitialHeight int64 `protobuf:"varint,6,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height,omitempty"` + Time time.Time `protobuf:"bytes,1,opt,name=time,proto3,stdtime" json:"time"` + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ConsensusParams *types1.ConsensusParams `protobuf:"bytes,3,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` + Validators []ValidatorUpdate `protobuf:"bytes,4,rep,name=validators,proto3" json:"validators"` + AppStateBytes []byte `protobuf:"bytes,5,opt,name=app_state_bytes,json=appStateBytes,proto3" json:"app_state_bytes,omitempty"` + InitialHeight int64 `protobuf:"varint,6,opt,name=initial_height,json=initialHeight,proto3" json:"initial_height,omitempty"` } func (m *RequestInitChain) Reset() { *m = RequestInitChain{} } @@ -659,7 +659,7 @@ func (m *RequestInitChain) GetChainId() string { return "" } -func (m *RequestInitChain) GetConsensusParams() *ConsensusParams { +func (m *RequestInitChain) GetConsensusParams() *types1.ConsensusParams { if m != nil { return m.ConsensusParams } @@ -1899,9 +1899,9 @@ func (m *ResponseInfo) GetLastBlockAppHash() []byte { } type ResponseInitChain struct { - ConsensusParams *ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` - Validators []ValidatorUpdate `protobuf:"bytes,2,rep,name=validators,proto3" json:"validators"` - AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + ConsensusParams *types1.ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams,proto3" json:"consensus_params,omitempty"` + Validators []ValidatorUpdate `protobuf:"bytes,2,rep,name=validators,proto3" json:"validators"` + AppHash []byte `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` } func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } @@ -1937,7 +1937,7 @@ func (m *ResponseInitChain) XXX_DiscardUnknown() { var xxx_messageInfo_ResponseInitChain proto.InternalMessageInfo -func (m *ResponseInitChain) GetConsensusParams() *ConsensusParams { +func (m *ResponseInitChain) GetConsensusParams() *types1.ConsensusParams { if m != nil { return m.ConsensusParams } @@ -2338,9 +2338,9 @@ func (m *ResponseDeliverTx) GetCodespace() string { } type ResponseEndBlock struct { - ValidatorUpdates []ValidatorUpdate `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates"` - ConsensusParamUpdates *ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` - Events []Event `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"` + ValidatorUpdates []ValidatorUpdate `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates,proto3" json:"validator_updates"` + ConsensusParamUpdates *types1.ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates,proto3" json:"consensus_param_updates,omitempty"` + Events []Event `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"` } func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } @@ -2383,7 +2383,7 @@ func (m *ResponseEndBlock) GetValidatorUpdates() []ValidatorUpdate { return nil } -func (m *ResponseEndBlock) GetConsensusParamUpdates() *ConsensusParams { +func (m *ResponseEndBlock) GetConsensusParamUpdates() *types1.ConsensusParams { if m != nil { return m.ConsensusParamUpdates } @@ -2730,131 +2730,6 @@ func (m *ResponseProcessProposal) GetStatus() ResponseProcessProposal_ProposalSt return ResponseProcessProposal_UNKNOWN } -// ConsensusParams contains all consensus-relevant parameters -// that can be adjusted by the abci app -type ConsensusParams struct { - Block *BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` - Evidence *types1.EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence,omitempty"` - Validator *types1.ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator,omitempty"` - Version *types1.VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` -} - -func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } -func (m *ConsensusParams) String() string { return proto.CompactTextString(m) } -func (*ConsensusParams) ProtoMessage() {} -func (*ConsensusParams) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} -} -func (m *ConsensusParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConsensusParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConsensusParams.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ConsensusParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConsensusParams.Merge(m, src) -} -func (m *ConsensusParams) XXX_Size() int { - return m.Size() -} -func (m *ConsensusParams) XXX_DiscardUnknown() { - xxx_messageInfo_ConsensusParams.DiscardUnknown(m) -} - -var xxx_messageInfo_ConsensusParams proto.InternalMessageInfo - -func (m *ConsensusParams) GetBlock() *BlockParams { - if m != nil { - return m.Block - } - return nil -} - -func (m *ConsensusParams) GetEvidence() *types1.EvidenceParams { - if m != nil { - return m.Evidence - } - return nil -} - -func (m *ConsensusParams) GetValidator() *types1.ValidatorParams { - if m != nil { - return m.Validator - } - return nil -} - -func (m *ConsensusParams) GetVersion() *types1.VersionParams { - if m != nil { - return m.Version - } - return nil -} - -// BlockParams contains limits on the block size. -type BlockParams struct { - // Note: must be greater than 0 - MaxBytes int64 `protobuf:"varint,1,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"` - // Note: must be greater or equal to -1 - MaxGas int64 `protobuf:"varint,2,opt,name=max_gas,json=maxGas,proto3" json:"max_gas,omitempty"` -} - -func (m *BlockParams) Reset() { *m = BlockParams{} } -func (m *BlockParams) String() string { return proto.CompactTextString(m) } -func (*BlockParams) ProtoMessage() {} -func (*BlockParams) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} -} -func (m *BlockParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *BlockParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_BlockParams.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *BlockParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_BlockParams.Merge(m, src) -} -func (m *BlockParams) XXX_Size() int { - return m.Size() -} -func (m *BlockParams) XXX_DiscardUnknown() { - xxx_messageInfo_BlockParams.DiscardUnknown(m) -} - -var xxx_messageInfo_BlockParams proto.InternalMessageInfo - -func (m *BlockParams) GetMaxBytes() int64 { - if m != nil { - return m.MaxBytes - } - return 0 -} - -func (m *BlockParams) GetMaxGas() int64 { - if m != nil { - return m.MaxGas - } - return 0 -} - type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -2864,7 +2739,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2919,7 +2794,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2974,7 +2849,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3028,7 +2903,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3092,7 +2967,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3160,7 +3035,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3213,7 +3088,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3266,7 +3141,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3319,7 +3194,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3387,7 +3262,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3463,7 +3338,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3568,8 +3443,6 @@ func init() { proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk") proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal") proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal") - proto.RegisterType((*ConsensusParams)(nil), "tendermint.abci.ConsensusParams") - proto.RegisterType((*BlockParams)(nil), "tendermint.abci.BlockParams") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -3586,202 +3459,195 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3108 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xcd, 0x73, 0x23, 0xc5, - 0x15, 0xd7, 0xf7, 0xc7, 0xd3, 0xa7, 0x7b, 0xcd, 0xae, 0x56, 0x2c, 0xb6, 0x77, 0xb6, 0x80, 0xdd, - 0x05, 0x6c, 0x62, 0xb2, 0x7c, 0x14, 0x10, 0xb0, 0xb5, 0x5a, 0x64, 0x6c, 0x6c, 0x67, 0x2c, 0x2f, - 0x21, 0x1f, 0x3b, 0xb4, 0x34, 0x6d, 0x69, 0x58, 0x69, 0x66, 0x98, 0x19, 0x19, 0x99, 0x63, 0xa8, - 0x54, 0xa5, 0xc8, 0x85, 0x23, 0x17, 0x0e, 0x39, 0xe4, 0x7f, 0xc8, 0x29, 0x97, 0x5c, 0xa8, 0xca, - 0x85, 0x43, 0x0e, 0x39, 0xa4, 0x48, 0x8a, 0xbd, 0xe5, 0x1f, 0xc8, 0x21, 0x07, 0x52, 0xfd, 0x31, - 0x5f, 0x92, 0xc6, 0x92, 0x21, 0x95, 0xaa, 0x54, 0x6e, 0xdd, 0xaf, 0xdf, 0x7b, 0xd3, 0xfd, 0xba, - 0xfb, 0xbd, 0xf7, 0x7b, 0xd3, 0xf0, 0xb8, 0x43, 0x74, 0x95, 0x58, 0x43, 0x4d, 0x77, 0x36, 0x70, - 0xa7, 0xab, 0x6d, 0x38, 0x67, 0x26, 0xb1, 0xd7, 0x4d, 0xcb, 0x70, 0x0c, 0x54, 0xf1, 0x07, 0xd7, - 0xe9, 0x60, 0xfd, 0x89, 0x00, 0x77, 0xd7, 0x3a, 0x33, 0x1d, 0x63, 0xc3, 0xb4, 0x0c, 0xe3, 0x84, - 0xf3, 0xd7, 0xaf, 0x05, 0x86, 0x99, 0x9e, 0xa0, 0xb6, 0xd0, 0xa8, 0x10, 0x7e, 0x48, 0xce, 0xdc, - 0xd1, 0x27, 0xa6, 0x64, 0x4d, 0x6c, 0xe1, 0xa1, 0x3b, 0xbc, 0xda, 0x33, 0x8c, 0xde, 0x80, 0x6c, - 0xb0, 0x5e, 0x67, 0x74, 0xb2, 0xe1, 0x68, 0x43, 0x62, 0x3b, 0x78, 0x68, 0x0a, 0x86, 0xe5, 0x9e, - 0xd1, 0x33, 0x58, 0x73, 0x83, 0xb6, 0x38, 0x55, 0xfa, 0x36, 0x07, 0x59, 0x99, 0x7c, 0x38, 0x22, - 0xb6, 0x83, 0x36, 0x21, 0x45, 0xba, 0x7d, 0xa3, 0x16, 0x5f, 0x8b, 0xdf, 0x2c, 0x6c, 0x5e, 0x5b, - 0x9f, 0x58, 0xdc, 0xba, 0xe0, 0x6b, 0x76, 0xfb, 0x46, 0x2b, 0x26, 0x33, 0x5e, 0x74, 0x07, 0xd2, - 0x27, 0x83, 0x91, 0xdd, 0xaf, 0x25, 0x98, 0xd0, 0x13, 0x51, 0x42, 0xf7, 0x28, 0x53, 0x2b, 0x26, - 0x73, 0x6e, 0xfa, 0x29, 0x4d, 0x3f, 0x31, 0x6a, 0xc9, 0xf3, 0x3f, 0xb5, 0xa3, 0x9f, 0xb0, 0x4f, - 0x51, 0x5e, 0xb4, 0x0d, 0xa0, 0xe9, 0x9a, 0xa3, 0x74, 0xfb, 0x58, 0xd3, 0x6b, 0x69, 0x26, 0x79, - 0x3d, 0x5a, 0x52, 0x73, 0x1a, 0x94, 0xb1, 0x15, 0x93, 0xf3, 0x9a, 0xdb, 0xa1, 0xd3, 0xfd, 0x70, - 0x44, 0xac, 0xb3, 0x5a, 0xe6, 0xfc, 0xe9, 0xfe, 0x98, 0x32, 0xd1, 0xe9, 0x32, 0x6e, 0xd4, 0x84, - 0x42, 0x87, 0xf4, 0x34, 0x5d, 0xe9, 0x0c, 0x8c, 0xee, 0xc3, 0x5a, 0x96, 0x09, 0x4b, 0x51, 0xc2, - 0xdb, 0x94, 0x75, 0x9b, 0x72, 0xb6, 0x62, 0x32, 0x74, 0xbc, 0x1e, 0x7a, 0x0d, 0x72, 0xdd, 0x3e, - 0xe9, 0x3e, 0x54, 0x9c, 0x71, 0x2d, 0xc7, 0x74, 0xac, 0x46, 0xe9, 0x68, 0x50, 0xbe, 0xf6, 0xb8, - 0x15, 0x93, 0xb3, 0x5d, 0xde, 0xa4, 0xeb, 0x57, 0xc9, 0x40, 0x3b, 0x25, 0x16, 0x95, 0xcf, 0x9f, - 0xbf, 0xfe, 0xbb, 0x9c, 0x93, 0x69, 0xc8, 0xab, 0x6e, 0x07, 0xbd, 0x01, 0x79, 0xa2, 0xab, 0x62, - 0x19, 0xc0, 0x54, 0xac, 0x45, 0xee, 0xb3, 0xae, 0xba, 0x8b, 0xc8, 0x11, 0xd1, 0x46, 0x2f, 0x43, - 0xa6, 0x6b, 0x0c, 0x87, 0x9a, 0x53, 0x2b, 0x30, 0xe9, 0x95, 0xc8, 0x05, 0x30, 0xae, 0x56, 0x4c, - 0x16, 0xfc, 0x68, 0x1f, 0xca, 0x03, 0xcd, 0x76, 0x14, 0x5b, 0xc7, 0xa6, 0xdd, 0x37, 0x1c, 0xbb, - 0x56, 0x64, 0x1a, 0x9e, 0x8c, 0xd2, 0xb0, 0xa7, 0xd9, 0xce, 0x91, 0xcb, 0xdc, 0x8a, 0xc9, 0xa5, - 0x41, 0x90, 0x40, 0xf5, 0x19, 0x27, 0x27, 0xc4, 0xf2, 0x14, 0xd6, 0x4a, 0xe7, 0xeb, 0x3b, 0xa0, - 0xdc, 0xae, 0x3c, 0xd5, 0x67, 0x04, 0x09, 0xe8, 0x67, 0x70, 0x69, 0x60, 0x60, 0xd5, 0x53, 0xa7, - 0x74, 0xfb, 0x23, 0xfd, 0x61, 0xad, 0xcc, 0x94, 0xde, 0x8a, 0x9c, 0xa4, 0x81, 0x55, 0x57, 0x45, - 0x83, 0x0a, 0xb4, 0x62, 0xf2, 0xd2, 0x60, 0x92, 0x88, 0x1e, 0xc0, 0x32, 0x36, 0xcd, 0xc1, 0xd9, - 0xa4, 0xf6, 0x0a, 0xd3, 0x7e, 0x3b, 0x4a, 0xfb, 0x16, 0x95, 0x99, 0x54, 0x8f, 0xf0, 0x14, 0x15, - 0xb5, 0xa1, 0x6a, 0x5a, 0xc4, 0xc4, 0x16, 0x51, 0x4c, 0xcb, 0x30, 0x0d, 0x1b, 0x0f, 0x6a, 0x55, - 0xa6, 0xfb, 0xe9, 0x28, 0xdd, 0x87, 0x9c, 0xff, 0x50, 0xb0, 0xb7, 0x62, 0x72, 0xc5, 0x0c, 0x93, - 0xb8, 0x56, 0xa3, 0x4b, 0x6c, 0xdb, 0xd7, 0xba, 0x34, 0x4f, 0x2b, 0xe3, 0x0f, 0x6b, 0x0d, 0x91, - 0xb6, 0xb3, 0x90, 0x3e, 0xc5, 0x83, 0x11, 0x79, 0x3b, 0x95, 0x4b, 0x55, 0xd3, 0xd2, 0xd3, 0x50, - 0x08, 0x38, 0x16, 0x54, 0x83, 0xec, 0x90, 0xd8, 0x36, 0xee, 0x11, 0xe6, 0x87, 0xf2, 0xb2, 0xdb, - 0x95, 0xca, 0x50, 0x0c, 0x3a, 0x13, 0xe9, 0xb3, 0xb8, 0x27, 0x49, 0xfd, 0x04, 0x95, 0x3c, 0x25, - 0x96, 0xad, 0x19, 0xba, 0x2b, 0x29, 0xba, 0xe8, 0x06, 0x94, 0xd8, 0x89, 0x57, 0xdc, 0x71, 0xea, - 0xac, 0x52, 0x72, 0x91, 0x11, 0xef, 0x0b, 0xa6, 0x55, 0x28, 0x98, 0x9b, 0xa6, 0xc7, 0x92, 0x64, - 0x2c, 0x60, 0x6e, 0x9a, 0x2e, 0xc3, 0x75, 0x28, 0xd2, 0x95, 0x7a, 0x1c, 0x29, 0xf6, 0x91, 0x02, - 0xa5, 0x09, 0x16, 0xe9, 0x4f, 0x09, 0xa8, 0x4e, 0x3a, 0x20, 0xf4, 0x32, 0xa4, 0xa8, 0x2f, 0x16, - 0x6e, 0xb5, 0xbe, 0xce, 0x1d, 0xf5, 0xba, 0xeb, 0xa8, 0xd7, 0xdb, 0xae, 0xa3, 0xde, 0xce, 0x7d, - 0xf9, 0xf5, 0x6a, 0xec, 0xb3, 0xbf, 0xad, 0xc6, 0x65, 0x26, 0x81, 0xae, 0x52, 0x7f, 0x81, 0x35, - 0x5d, 0xd1, 0x54, 0x36, 0xe5, 0x3c, 0x75, 0x06, 0x58, 0xd3, 0x77, 0x54, 0xb4, 0x0b, 0xd5, 0xae, - 0xa1, 0xdb, 0x44, 0xb7, 0x47, 0xb6, 0xc2, 0x03, 0x81, 0x70, 0xa6, 0xd3, 0xf7, 0xb9, 0xe1, 0x32, - 0x1e, 0x32, 0x3e, 0xb9, 0xd2, 0x0d, 0x13, 0xd0, 0x3d, 0x80, 0x53, 0x3c, 0xd0, 0x54, 0xec, 0x18, - 0x96, 0x5d, 0x4b, 0xad, 0x25, 0x67, 0xaa, 0xb9, 0xef, 0xb2, 0x1c, 0x9b, 0x2a, 0x76, 0xc8, 0x76, - 0x8a, 0xce, 0x56, 0x0e, 0x48, 0xa2, 0xa7, 0xa0, 0x82, 0x4d, 0x53, 0xb1, 0x1d, 0xec, 0x10, 0xa5, - 0x73, 0xe6, 0x10, 0x9b, 0xb9, 0xe9, 0xa2, 0x5c, 0xc2, 0xa6, 0x79, 0x44, 0xa9, 0xdb, 0x94, 0x88, - 0x9e, 0x84, 0x32, 0x75, 0xc9, 0x1a, 0x1e, 0x28, 0x7d, 0xa2, 0xf5, 0xfa, 0x0e, 0x73, 0xc7, 0x49, - 0xb9, 0x24, 0xa8, 0x2d, 0x46, 0x94, 0x54, 0x6f, 0xc3, 0x99, 0x3b, 0x46, 0x08, 0x52, 0x2a, 0x76, - 0x30, 0x33, 0x64, 0x51, 0x66, 0x6d, 0x4a, 0x33, 0xb1, 0xd3, 0x17, 0xe6, 0x61, 0x6d, 0x74, 0x19, - 0x32, 0x42, 0x6d, 0x92, 0xa9, 0x15, 0x3d, 0xb4, 0x0c, 0x69, 0xd3, 0x32, 0x4e, 0x09, 0xdb, 0xb9, - 0x9c, 0xcc, 0x3b, 0xd2, 0x27, 0x09, 0x58, 0x9a, 0x72, 0xdc, 0x54, 0x6f, 0x1f, 0xdb, 0x7d, 0xf7, - 0x5b, 0xb4, 0x8d, 0x5e, 0xa4, 0x7a, 0xb1, 0x4a, 0x2c, 0x11, 0xec, 0x6a, 0x41, 0x13, 0xf1, 0x40, - 0xde, 0x62, 0xe3, 0xc2, 0x34, 0x82, 0x9b, 0xee, 0xd5, 0x00, 0xdb, 0x8e, 0xc2, 0x1d, 0xa1, 0x12, - 0x08, 0x7c, 0x8f, 0xcf, 0xd8, 0x2b, 0xca, 0x43, 0xcf, 0xb3, 0x50, 0x52, 0xa6, 0xa2, 0x3e, 0x15, - 0x1d, 0xc3, 0x72, 0xe7, 0xec, 0x63, 0xac, 0x3b, 0x9a, 0x4e, 0x94, 0xa9, 0x5d, 0x9b, 0x8e, 0xa4, - 0xef, 0x68, 0x76, 0x87, 0xf4, 0xf1, 0xa9, 0x66, 0xb8, 0xd3, 0xba, 0xe4, 0xc9, 0x7b, 0x3b, 0x6a, - 0x4b, 0x32, 0x94, 0xc3, 0x91, 0x07, 0x95, 0x21, 0xe1, 0x8c, 0xc5, 0xfa, 0x13, 0xce, 0x18, 0x3d, - 0x0f, 0x29, 0xba, 0x46, 0xb6, 0xf6, 0xf2, 0x8c, 0x0f, 0x09, 0xb9, 0xf6, 0x99, 0x49, 0x64, 0xc6, - 0x29, 0x49, 0xde, 0x65, 0xf0, 0xa2, 0xd1, 0xa4, 0x56, 0xe9, 0x16, 0x54, 0x26, 0xc2, 0x4d, 0x60, - 0xfb, 0xe2, 0xc1, 0xed, 0x93, 0x2a, 0x50, 0x0a, 0xc5, 0x16, 0xe9, 0x32, 0x2c, 0xcf, 0x0a, 0x15, - 0x52, 0xdf, 0xa3, 0x87, 0x5c, 0x3e, 0xba, 0x03, 0x39, 0x2f, 0x56, 0xf0, 0xcb, 0x78, 0x75, 0x6a, - 0x15, 0x2e, 0xb3, 0xec, 0xb1, 0xd2, 0x5b, 0x48, 0x4f, 0x35, 0x3b, 0x0e, 0x09, 0x36, 0xf1, 0x2c, - 0x36, 0xcd, 0x16, 0xb6, 0xfb, 0xd2, 0xfb, 0x50, 0x8b, 0x8a, 0x03, 0x13, 0xcb, 0x48, 0x79, 0xa7, - 0xf0, 0x32, 0x64, 0x4e, 0x0c, 0x6b, 0x88, 0x1d, 0xa6, 0xac, 0x24, 0x8b, 0x1e, 0x3d, 0x9d, 0x3c, - 0x26, 0x24, 0x19, 0x99, 0x77, 0x24, 0x05, 0xae, 0x46, 0xc6, 0x02, 0x2a, 0xa2, 0xe9, 0x2a, 0xe1, - 0xf6, 0x2c, 0xc9, 0xbc, 0xe3, 0x2b, 0xe2, 0x93, 0xe5, 0x1d, 0xfa, 0x59, 0x9b, 0xad, 0x95, 0xe9, - 0xcf, 0xcb, 0xa2, 0x27, 0x7d, 0x9e, 0x84, 0xcb, 0xb3, 0x23, 0x02, 0x5a, 0x83, 0xe2, 0x10, 0x8f, - 0x15, 0x67, 0x2c, 0xee, 0x32, 0xdf, 0x0e, 0x18, 0xe2, 0x71, 0x7b, 0xcc, 0x2f, 0x72, 0x15, 0x92, - 0xce, 0xd8, 0xae, 0x25, 0xd6, 0x92, 0x37, 0x8b, 0x32, 0x6d, 0xa2, 0x63, 0x58, 0x1a, 0x18, 0x5d, - 0x3c, 0x50, 0x02, 0x27, 0x5e, 0x1c, 0xf6, 0x1b, 0x53, 0xc6, 0x6e, 0x8e, 0x19, 0x45, 0x9d, 0x3a, - 0xf4, 0x15, 0xa6, 0x63, 0xcf, 0x3b, 0xf9, 0xe8, 0x2e, 0x14, 0x86, 0xfe, 0x41, 0xbe, 0xc0, 0x61, - 0x0f, 0x8a, 0x05, 0xb6, 0x24, 0x1d, 0x72, 0x0c, 0xae, 0x87, 0xce, 0x5c, 0xd8, 0x43, 0x3f, 0x0f, - 0xcb, 0x3a, 0x19, 0x3b, 0x81, 0x8b, 0xc8, 0xcf, 0x49, 0x96, 0x99, 0x1e, 0xd1, 0x31, 0xff, 0x92, - 0xd1, 0x23, 0x83, 0x6e, 0xb1, 0x98, 0x6a, 0x1a, 0x36, 0xb1, 0x14, 0xac, 0xaa, 0x16, 0xb1, 0x6d, - 0x96, 0x0b, 0x16, 0x59, 0xa0, 0x64, 0xf4, 0x2d, 0x4e, 0x96, 0x7e, 0x1d, 0xdc, 0x9a, 0x50, 0x0c, - 0x75, 0x0d, 0x1f, 0xf7, 0x0d, 0x7f, 0x04, 0xcb, 0x42, 0x5e, 0x0d, 0xd9, 0x3e, 0xb1, 0xa8, 0xa3, - 0x41, 0xae, 0x78, 0xb4, 0xd9, 0x93, 0xdf, 0xcd, 0xec, 0xae, 0x2f, 0x4d, 0x05, 0x7c, 0xe9, 0xff, - 0xd8, 0x56, 0xfc, 0x39, 0x0f, 0x39, 0x99, 0xd8, 0x26, 0x0d, 0x9c, 0x68, 0x1b, 0xf2, 0x64, 0xdc, - 0x25, 0xa6, 0xe3, 0xa6, 0x1a, 0xb3, 0xb1, 0x00, 0xe7, 0x6e, 0xba, 0x9c, 0x34, 0x11, 0xf7, 0xc4, - 0xd0, 0x0b, 0x02, 0x6b, 0x45, 0xc3, 0x26, 0x21, 0x1e, 0x04, 0x5b, 0x2f, 0xba, 0x60, 0x2b, 0x19, - 0x99, 0x7b, 0x73, 0xa9, 0x09, 0xb4, 0xf5, 0x82, 0x40, 0x5b, 0xa9, 0x39, 0x1f, 0x0b, 0xc1, 0xad, - 0x46, 0x08, 0x6e, 0x65, 0xe6, 0x2c, 0x33, 0x02, 0x6f, 0xbd, 0xe8, 0xe2, 0xad, 0xec, 0x9c, 0x19, - 0x4f, 0x00, 0xae, 0x7b, 0x61, 0xc0, 0x95, 0x8b, 0x70, 0x20, 0xae, 0x74, 0x24, 0xe2, 0x7a, 0x3d, - 0x80, 0xb8, 0xf2, 0x91, 0x70, 0x87, 0x2b, 0x99, 0x01, 0xb9, 0x1a, 0x21, 0xc8, 0x05, 0x73, 0x6c, - 0x10, 0x81, 0xb9, 0xde, 0x0c, 0x62, 0xae, 0x42, 0x24, 0x6c, 0x13, 0xfb, 0x3d, 0x0b, 0x74, 0xbd, - 0xe2, 0x81, 0xae, 0x62, 0x24, 0x6a, 0x14, 0x6b, 0x98, 0x44, 0x5d, 0x07, 0x53, 0xa8, 0x8b, 0xa3, - 0xa4, 0xa7, 0x22, 0x55, 0xcc, 0x81, 0x5d, 0x07, 0x53, 0xb0, 0xab, 0x3c, 0x47, 0xe1, 0x1c, 0xdc, - 0xf5, 0xf3, 0xd9, 0xb8, 0x2b, 0x1a, 0x19, 0x89, 0x69, 0x2e, 0x06, 0xbc, 0x94, 0x08, 0xe0, 0xc5, - 0xc1, 0xd1, 0x33, 0x91, 0xea, 0x17, 0x46, 0x5e, 0xc7, 0x33, 0x90, 0x17, 0xc7, 0x48, 0x37, 0x23, - 0x95, 0x2f, 0x00, 0xbd, 0x8e, 0x67, 0x40, 0x2f, 0x34, 0x57, 0xed, 0x45, 0xb0, 0x57, 0xba, 0x9a, - 0x91, 0x6e, 0xd1, 0xd4, 0x77, 0xc2, 0x4f, 0xd1, 0xfc, 0x81, 0x58, 0x96, 0x61, 0x09, 0x14, 0xc5, - 0x3b, 0xd2, 0x4d, 0x9a, 0x8c, 0xfb, 0x3e, 0xe9, 0x1c, 0x9c, 0xc6, 0xf2, 0xb4, 0x80, 0x1f, 0x92, - 0x7e, 0x1f, 0xf7, 0x65, 0x59, 0x0e, 0x1b, 0x4c, 0xe4, 0xf3, 0x22, 0x91, 0x0f, 0xa0, 0xb7, 0x44, - 0x18, 0xbd, 0xad, 0x42, 0x81, 0xe6, 0x5f, 0x13, 0xc0, 0x0c, 0x9b, 0x1e, 0x30, 0xbb, 0x0d, 0x4b, - 0x2c, 0xe2, 0x71, 0x8c, 0x27, 0xc2, 0x4a, 0x8a, 0x85, 0x95, 0x0a, 0x1d, 0xe0, 0x17, 0x8a, 0xc7, - 0x97, 0xe7, 0xe0, 0x52, 0x80, 0xd7, 0xcb, 0xeb, 0x38, 0x4c, 0xa9, 0x7a, 0xdc, 0x5b, 0x22, 0xc1, - 0xfb, 0x63, 0xdc, 0xb7, 0x90, 0x8f, 0xe8, 0x66, 0x81, 0xaf, 0xf8, 0x7f, 0x06, 0x7c, 0x25, 0xbe, - 0x33, 0xf8, 0x0a, 0xa6, 0xa9, 0xc9, 0x70, 0x9a, 0xfa, 0xcf, 0xb8, 0xbf, 0x25, 0x1e, 0x94, 0xea, - 0x1a, 0x2a, 0x11, 0x89, 0x23, 0x6b, 0xd3, 0x9c, 0x62, 0x60, 0xf4, 0x44, 0x7a, 0x48, 0x9b, 0x94, - 0xcb, 0x8b, 0x1b, 0x79, 0x11, 0x16, 0xbc, 0x9c, 0x93, 0xc7, 0x6d, 0x91, 0x73, 0x56, 0x21, 0xf9, - 0x90, 0xf0, 0xaa, 0x5a, 0x51, 0xa6, 0x4d, 0xca, 0xc7, 0x4e, 0x9a, 0x88, 0xbf, 0xbc, 0x83, 0x5e, - 0x86, 0x3c, 0xab, 0x87, 0x2a, 0x86, 0x69, 0x0b, 0xaf, 0x1e, 0x4a, 0x4d, 0x78, 0xd9, 0x73, 0xfd, - 0x90, 0xf2, 0x1c, 0x98, 0xb6, 0x9c, 0x33, 0x45, 0x2b, 0x90, 0x30, 0xe4, 0x43, 0x09, 0xc3, 0x35, - 0xc8, 0xd3, 0xd9, 0xdb, 0x26, 0xee, 0x12, 0xe6, 0xa1, 0xf3, 0xb2, 0x4f, 0x90, 0x1e, 0x00, 0x9a, - 0x8e, 0x11, 0xa8, 0x05, 0x19, 0x72, 0x4a, 0x74, 0x87, 0x27, 0x50, 0x85, 0xcd, 0xcb, 0xd3, 0x99, - 0x29, 0x1d, 0xde, 0xae, 0x51, 0x23, 0xff, 0xe3, 0xeb, 0xd5, 0x2a, 0xe7, 0x7e, 0xd6, 0x18, 0x6a, - 0x0e, 0x19, 0x9a, 0xce, 0x99, 0x2c, 0xe4, 0xa5, 0xbf, 0x26, 0x28, 0x7e, 0x09, 0xc5, 0x8f, 0x99, - 0xb6, 0x75, 0x4f, 0x7c, 0x22, 0x00, 0x5d, 0x17, 0xb3, 0xf7, 0x0a, 0x40, 0x0f, 0xdb, 0xca, 0x47, - 0x58, 0x77, 0x88, 0x2a, 0x8c, 0x1e, 0xa0, 0xa0, 0x3a, 0xe4, 0x68, 0x6f, 0x64, 0x13, 0x55, 0xa0, - 0x68, 0xaf, 0x1f, 0x58, 0x67, 0xf6, 0xfb, 0xad, 0x33, 0x6c, 0xe5, 0xdc, 0x84, 0x95, 0x03, 0xd8, - 0x22, 0x1f, 0xc4, 0x16, 0x74, 0x6e, 0xa6, 0xa5, 0x19, 0x96, 0xe6, 0x9c, 0xb1, 0xad, 0x49, 0xca, - 0x5e, 0x1f, 0xdd, 0x80, 0xd2, 0x90, 0x0c, 0x4d, 0xc3, 0x18, 0x28, 0xdc, 0xdb, 0x14, 0x98, 0x68, - 0x51, 0x10, 0x9b, 0xcc, 0xe9, 0xfc, 0x2a, 0xe1, 0x5f, 0x3f, 0x1f, 0x43, 0xfe, 0xdf, 0x19, 0x58, - 0xfa, 0x0d, 0xab, 0x2b, 0x85, 0x33, 0x04, 0x74, 0x04, 0x4b, 0xde, 0xf5, 0x57, 0x46, 0xcc, 0x2d, - 0xb8, 0x07, 0x7a, 0x51, 0xff, 0x51, 0x3d, 0x0d, 0x93, 0x6d, 0xf4, 0x13, 0xb8, 0x32, 0xe1, 0xda, - 0x3c, 0xd5, 0x89, 0x05, 0x3d, 0xdc, 0x63, 0x61, 0x0f, 0xe7, 0x6a, 0xf6, 0x6d, 0x95, 0xfc, 0x9e, - 0x97, 0x6e, 0x07, 0xca, 0xe1, 0x7c, 0x67, 0xe6, 0xee, 0xdf, 0x80, 0x92, 0x45, 0x1c, 0xac, 0xe9, - 0x4a, 0xa8, 0x18, 0x54, 0xe4, 0x44, 0x51, 0x62, 0x3a, 0x84, 0xc7, 0x66, 0xe6, 0x3d, 0xe8, 0x25, - 0xc8, 0xfb, 0x29, 0x13, 0x37, 0xea, 0x39, 0xc5, 0x02, 0x9f, 0x57, 0xfa, 0x43, 0xdc, 0x57, 0x19, - 0x2e, 0x3f, 0x34, 0x21, 0x63, 0x11, 0x7b, 0x34, 0xe0, 0x05, 0x81, 0xf2, 0xe6, 0x73, 0x8b, 0x65, - 0x4c, 0x94, 0x3a, 0x1a, 0x38, 0xb2, 0x10, 0x96, 0x1e, 0x40, 0x86, 0x53, 0x50, 0x01, 0xb2, 0xc7, - 0xfb, 0xbb, 0xfb, 0x07, 0xef, 0xee, 0x57, 0x63, 0x08, 0x20, 0xb3, 0xd5, 0x68, 0x34, 0x0f, 0xdb, - 0xd5, 0x38, 0xca, 0x43, 0x7a, 0x6b, 0xfb, 0x40, 0x6e, 0x57, 0x13, 0x94, 0x2c, 0x37, 0xdf, 0x6e, - 0x36, 0xda, 0xd5, 0x24, 0x5a, 0x82, 0x12, 0x6f, 0x2b, 0xf7, 0x0e, 0xe4, 0x77, 0xb6, 0xda, 0xd5, - 0x54, 0x80, 0x74, 0xd4, 0xdc, 0xbf, 0xdb, 0x94, 0xab, 0x69, 0xe9, 0x07, 0x70, 0x35, 0x32, 0xc7, - 0xf2, 0x6b, 0x0b, 0xf1, 0x40, 0x6d, 0x41, 0xfa, 0x3c, 0x01, 0xf5, 0xe8, 0xc4, 0x09, 0xbd, 0x3d, - 0xb1, 0xf0, 0xcd, 0x0b, 0x64, 0x5d, 0x13, 0xab, 0x47, 0x4f, 0x42, 0xd9, 0x22, 0x27, 0xc4, 0xe9, - 0xf6, 0x79, 0x22, 0xc7, 0x23, 0x66, 0x49, 0x2e, 0x09, 0x2a, 0x13, 0xb2, 0x39, 0xdb, 0x07, 0xa4, - 0xeb, 0x28, 0xdc, 0x15, 0xf1, 0x43, 0x97, 0xa7, 0x6c, 0x94, 0x7a, 0xc4, 0x89, 0xd2, 0xfb, 0x17, - 0xb2, 0x65, 0x1e, 0xd2, 0x72, 0xb3, 0x2d, 0xbf, 0x57, 0x4d, 0x22, 0x04, 0x65, 0xd6, 0x54, 0x8e, - 0xf6, 0xb7, 0x0e, 0x8f, 0x5a, 0x07, 0xd4, 0x96, 0x97, 0xa0, 0xe2, 0xda, 0xd2, 0x25, 0xa6, 0xa5, - 0x67, 0xe0, 0x4a, 0x44, 0xd6, 0x37, 0x8d, 0xe1, 0xa5, 0xdf, 0xc6, 0x83, 0xdc, 0x61, 0xc4, 0x7f, - 0x00, 0x19, 0xdb, 0xc1, 0xce, 0xc8, 0x16, 0x46, 0x7c, 0x69, 0xd1, 0x34, 0x70, 0xdd, 0x6d, 0x1c, - 0x31, 0x71, 0x59, 0xa8, 0x91, 0xee, 0x40, 0x39, 0x3c, 0x12, 0x6d, 0x03, 0xff, 0x10, 0x25, 0xa4, - 0x6f, 0xe3, 0x50, 0x99, 0xb8, 0xf1, 0x68, 0x13, 0xd2, 0x1c, 0xdd, 0x44, 0xfd, 0x39, 0x64, 0x0e, - 0x4b, 0xb8, 0x07, 0xce, 0x8a, 0x5e, 0x83, 0x1c, 0x39, 0xd5, 0x54, 0xa2, 0x77, 0xc9, 0x2c, 0xcf, - 0xc2, 0xcb, 0xa9, 0x4d, 0xc1, 0x21, 0x44, 0x3d, 0x09, 0xf4, 0x06, 0xe4, 0x3d, 0xd7, 0x25, 0xd0, - 0xf0, 0xf5, 0x69, 0x71, 0xcf, 0xe9, 0x09, 0x79, 0x5f, 0x06, 0xbd, 0xe2, 0xa7, 0x9b, 0xa9, 0x69, - 0x4c, 0x25, 0xc4, 0x39, 0x83, 0x10, 0x76, 0xf9, 0xa5, 0x06, 0x14, 0x02, 0xeb, 0x41, 0x8f, 0x43, - 0x7e, 0x88, 0xc3, 0x25, 0xb2, 0xdc, 0x10, 0x8b, 0x02, 0xd9, 0x15, 0xc8, 0xd2, 0xc1, 0x1e, 0xe6, - 0xee, 0x33, 0x29, 0x67, 0x86, 0x78, 0xfc, 0x16, 0xb6, 0xa5, 0xf7, 0x00, 0x02, 0x45, 0xdd, 0x65, - 0x48, 0x5b, 0xc6, 0x48, 0x57, 0x99, 0x7c, 0x5a, 0xe6, 0x1d, 0x74, 0x07, 0xd2, 0xa7, 0x06, 0xf7, - 0xbc, 0xb3, 0xfd, 0xcf, 0x7d, 0xc3, 0x21, 0x81, 0x0a, 0x0e, 0xe7, 0x96, 0x34, 0x40, 0xd3, 0x85, - 0xb5, 0x88, 0x4f, 0xbc, 0x1e, 0xfe, 0xc4, 0xf5, 0xc8, 0x12, 0xdd, 0xec, 0x4f, 0x7d, 0x0c, 0x69, - 0xe6, 0xb4, 0xa9, 0x03, 0x66, 0xc5, 0x61, 0x91, 0xd1, 0xd3, 0x36, 0xfa, 0x05, 0x00, 0x76, 0x1c, - 0x4b, 0xeb, 0x8c, 0xfc, 0x0f, 0xac, 0xce, 0x76, 0xfa, 0x5b, 0x2e, 0xdf, 0xf6, 0x35, 0xe1, 0xfd, - 0x97, 0x7d, 0xd1, 0x40, 0x04, 0x08, 0x28, 0x94, 0xf6, 0xa1, 0x1c, 0x96, 0x75, 0x93, 0xd0, 0xf8, - 0x8c, 0x24, 0x34, 0x11, 0x4c, 0x42, 0xbd, 0x14, 0x36, 0xc9, 0xff, 0x03, 0xb0, 0x8e, 0xf4, 0x69, - 0x1c, 0x72, 0xed, 0xb1, 0x70, 0x07, 0x11, 0x35, 0x68, 0x5f, 0x34, 0x11, 0xac, 0xb8, 0xf2, 0xa2, - 0x76, 0xd2, 0x2b, 0x95, 0xbf, 0xe9, 0x39, 0xbc, 0xd4, 0xa2, 0x25, 0x03, 0xf7, 0x97, 0x81, 0x70, - 0xf2, 0xaf, 0x42, 0xde, 0x3b, 0xbc, 0x14, 0x1a, 0xb9, 0xe5, 0xa9, 0xb8, 0x48, 0xec, 0x79, 0x97, - 0xfd, 0xd1, 0x30, 0x3e, 0x12, 0x35, 0xdd, 0xa4, 0xcc, 0x3b, 0x92, 0x0a, 0x95, 0x89, 0x70, 0x8f, - 0x5e, 0x85, 0xac, 0x39, 0xea, 0x28, 0xae, 0x79, 0x26, 0xee, 0xa8, 0x9b, 0x75, 0x8f, 0x3a, 0x03, - 0xad, 0xbb, 0x4b, 0xce, 0xdc, 0xc9, 0x98, 0xa3, 0xce, 0x2e, 0xb7, 0x22, 0xff, 0x4a, 0x22, 0xf8, - 0x95, 0x53, 0xc8, 0xb9, 0x87, 0x02, 0xfd, 0x28, 0x78, 0x1d, 0xdd, 0xff, 0x5c, 0x91, 0x29, 0x88, - 0x50, 0x1f, 0xb8, 0x8d, 0xb7, 0x61, 0xc9, 0xd6, 0x7a, 0xba, 0x5b, 0xba, 0xe4, 0xce, 0x24, 0xc1, - 0x76, 0xa7, 0xc2, 0x07, 0xf6, 0x5c, 0x64, 0x26, 0xfd, 0x2e, 0x0e, 0xd5, 0xc9, 0x53, 0xf9, 0xdf, - 0x9c, 0x00, 0x8d, 0x2d, 0xf4, 0xf4, 0x2b, 0x84, 0x4e, 0xc2, 0x83, 0xa4, 0x45, 0xb9, 0x44, 0xa9, - 0x4d, 0x97, 0x28, 0x7d, 0x92, 0x80, 0x42, 0xa0, 0x30, 0x8a, 0x7e, 0x18, 0xb8, 0x22, 0xe5, 0x19, - 0x69, 0x54, 0x80, 0xd7, 0xff, 0x87, 0x12, 0x5e, 0x58, 0xe2, 0xe2, 0x0b, 0x8b, 0xfa, 0x17, 0xe6, - 0xd6, 0x59, 0x53, 0x17, 0xae, 0xb3, 0x3e, 0x0b, 0xc8, 0x31, 0x1c, 0x3c, 0x50, 0x4e, 0x0d, 0x47, - 0xd3, 0x7b, 0x0a, 0x3f, 0x1a, 0x3c, 0x6f, 0xae, 0xb2, 0x91, 0xfb, 0x6c, 0xe0, 0x90, 0x9d, 0x92, - 0x5f, 0xc6, 0x21, 0xe7, 0x65, 0x40, 0x17, 0xfd, 0x25, 0x72, 0x19, 0x32, 0x22, 0xc8, 0xf3, 0x7f, - 0x22, 0xa2, 0x37, 0xb3, 0xa0, 0x5c, 0x87, 0xdc, 0x90, 0x38, 0x98, 0xa5, 0x81, 0x1c, 0xcd, 0x7b, - 0xfd, 0xdb, 0xaf, 0x40, 0x21, 0xf0, 0x77, 0x8a, 0xfa, 0x89, 0xfd, 0xe6, 0xbb, 0xd5, 0x58, 0x3d, - 0xfb, 0xe9, 0x17, 0x6b, 0xc9, 0x7d, 0xf2, 0x11, 0xbd, 0x61, 0x72, 0xb3, 0xd1, 0x6a, 0x36, 0x76, - 0xab, 0xf1, 0x7a, 0xe1, 0xd3, 0x2f, 0xd6, 0xb2, 0x32, 0x61, 0x35, 0xc0, 0xdb, 0xbb, 0x50, 0x99, - 0xd8, 0x98, 0x70, 0x98, 0x44, 0x50, 0xbe, 0x7b, 0x7c, 0xb8, 0xb7, 0xd3, 0xd8, 0x6a, 0x37, 0x95, - 0xfb, 0x07, 0xed, 0x66, 0x35, 0x8e, 0xae, 0xc0, 0xa5, 0xbd, 0x9d, 0xb7, 0x5a, 0x6d, 0xa5, 0xb1, - 0xb7, 0xd3, 0xdc, 0x6f, 0x2b, 0x5b, 0xed, 0xf6, 0x56, 0x63, 0xb7, 0x9a, 0xd8, 0xfc, 0x17, 0x40, - 0x65, 0x6b, 0xbb, 0xb1, 0x43, 0xd3, 0x1c, 0xad, 0x8b, 0x59, 0xb5, 0xa5, 0x01, 0x29, 0x56, 0x4f, - 0x39, 0xf7, 0xb9, 0x4d, 0xfd, 0xfc, 0x02, 0x31, 0xba, 0x07, 0x69, 0x56, 0x6a, 0x41, 0xe7, 0xbf, - 0xbf, 0xa9, 0xcf, 0xa9, 0x18, 0xd3, 0xc9, 0xb0, 0xeb, 0x74, 0xee, 0x83, 0x9c, 0xfa, 0xf9, 0x05, - 0x64, 0x24, 0x43, 0xde, 0xc7, 0x6a, 0xf3, 0x1f, 0xa8, 0xd4, 0x17, 0xf0, 0x8e, 0x68, 0x0f, 0xb2, - 0x2e, 0xbc, 0x9e, 0xf7, 0x64, 0xa6, 0x3e, 0xb7, 0xc2, 0x4b, 0xcd, 0xc5, 0xcb, 0x20, 0xe7, 0xbf, - 0xff, 0xa9, 0xcf, 0x29, 0x57, 0xa3, 0x1d, 0xc8, 0x08, 0x00, 0x32, 0xe7, 0x19, 0x4c, 0x7d, 0x5e, - 0xc5, 0x96, 0x1a, 0xcd, 0xaf, 0x2f, 0xcd, 0x7f, 0xd5, 0x54, 0x5f, 0xa0, 0x12, 0x8f, 0x8e, 0x01, - 0x02, 0x45, 0x8f, 0x05, 0x9e, 0x2b, 0xd5, 0x17, 0xa9, 0xb0, 0xa3, 0x03, 0xc8, 0x79, 0x18, 0x74, - 0xee, 0xe3, 0xa1, 0xfa, 0xfc, 0x52, 0x37, 0x7a, 0x00, 0xa5, 0x30, 0xf8, 0x5a, 0xec, 0x49, 0x50, - 0x7d, 0xc1, 0x1a, 0x36, 0xd5, 0x1f, 0x46, 0x62, 0x8b, 0x3d, 0x11, 0xaa, 0x2f, 0x58, 0xd2, 0x46, - 0x1f, 0xc0, 0xd2, 0x34, 0x52, 0x5a, 0xfc, 0xc5, 0x50, 0xfd, 0x02, 0x45, 0x6e, 0x34, 0x04, 0x34, - 0x03, 0x61, 0x5d, 0xe0, 0x01, 0x51, 0xfd, 0x22, 0x35, 0x6f, 0xa4, 0x42, 0x65, 0x12, 0xb6, 0x2c, - 0xfa, 0xa0, 0xa8, 0xbe, 0x70, 0xfd, 0x9b, 0x7f, 0x25, 0x0c, 0x77, 0x16, 0x7d, 0x60, 0x54, 0x5f, - 0xb8, 0x1c, 0xbe, 0xdd, 0xfc, 0xf2, 0x9b, 0x95, 0xf8, 0x57, 0xdf, 0xac, 0xc4, 0xff, 0xfe, 0xcd, - 0x4a, 0xfc, 0xb3, 0x47, 0x2b, 0xb1, 0xaf, 0x1e, 0xad, 0xc4, 0xfe, 0xf2, 0x68, 0x25, 0xf6, 0xd3, - 0x67, 0x7a, 0x9a, 0xd3, 0x1f, 0x75, 0xd6, 0xbb, 0xc6, 0x70, 0x23, 0xf8, 0xca, 0x72, 0xd6, 0xcb, - 0xcf, 0x4e, 0x86, 0xc5, 0xc8, 0x17, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xfb, 0x93, 0x3d, - 0x19, 0x2a, 0x00, 0x00, + // 3004 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x3b, 0x73, 0x23, 0xc7, + 0xf1, 0xc7, 0xfb, 0xd1, 0x78, 0x2d, 0xe7, 0xa8, 0x13, 0x0e, 0x3a, 0x91, 0xa7, 0xbd, 0x92, 0x74, + 0x77, 0x92, 0x48, 0xfd, 0xa9, 0xff, 0xe9, 0x51, 0xb2, 0x6c, 0x11, 0x38, 0x9c, 0x41, 0x91, 0x22, + 0xe9, 0x25, 0x78, 0x2a, 0xf9, 0x71, 0xab, 0x05, 0x76, 0x48, 0xac, 0x0e, 0xd8, 0x5d, 0xed, 0x0e, + 0x28, 0x50, 0xa1, 0x55, 0xae, 0x72, 0xa9, 0x1c, 0x28, 0x54, 0xa2, 0xc0, 0x81, 0xbf, 0x83, 0x23, + 0x47, 0x0e, 0x14, 0x38, 0x50, 0xe0, 0xc0, 0x81, 0x4b, 0x76, 0x49, 0x99, 0xbf, 0x80, 0x03, 0x07, + 0x76, 0xcd, 0x63, 0x5f, 0x00, 0x96, 0x00, 0x25, 0x97, 0xab, 0x5c, 0xce, 0x66, 0x7a, 0xbb, 0x7b, + 0x66, 0x7a, 0x66, 0xba, 0xfb, 0xd7, 0x3b, 0xf0, 0x04, 0xc1, 0xa6, 0x8e, 0x9d, 0x91, 0x61, 0x92, + 0x4d, 0xad, 0xd7, 0x37, 0x36, 0xc9, 0xb9, 0x8d, 0xdd, 0x0d, 0xdb, 0xb1, 0x88, 0x85, 0x6a, 0xc1, + 0xc7, 0x0d, 0xfa, 0xb1, 0xf1, 0x64, 0x88, 0xbb, 0xef, 0x9c, 0xdb, 0xc4, 0xda, 0xb4, 0x1d, 0xcb, + 0x3a, 0xe1, 0xfc, 0x8d, 0xeb, 0xa1, 0xcf, 0x4c, 0x4f, 0x58, 0x5b, 0xe4, 0xab, 0x10, 0x7e, 0x84, + 0xcf, 0xbd, 0xaf, 0x4f, 0xce, 0xc8, 0xda, 0x9a, 0xa3, 0x8d, 0xbc, 0xcf, 0xeb, 0xa7, 0x96, 0x75, + 0x3a, 0xc4, 0x9b, 0xac, 0xd7, 0x1b, 0x9f, 0x6c, 0x12, 0x63, 0x84, 0x5d, 0xa2, 0x8d, 0x6c, 0xc1, + 0xb0, 0x7a, 0x6a, 0x9d, 0x5a, 0xac, 0xb9, 0x49, 0x5b, 0x9c, 0x2a, 0xff, 0xb3, 0x00, 0x79, 0x05, + 0x7f, 0x30, 0xc6, 0x2e, 0x41, 0x5b, 0x90, 0xc1, 0xfd, 0x81, 0x55, 0x4f, 0xde, 0x48, 0xde, 0x2a, + 0x6d, 0x5d, 0xdf, 0x98, 0x5a, 0xdc, 0x86, 0xe0, 0x6b, 0xf7, 0x07, 0x56, 0x27, 0xa1, 0x30, 0x5e, + 0x74, 0x17, 0xb2, 0x27, 0xc3, 0xb1, 0x3b, 0xa8, 0xa7, 0x98, 0xd0, 0x93, 0x71, 0x42, 0xf7, 0x29, + 0x53, 0x27, 0xa1, 0x70, 0x6e, 0x3a, 0x94, 0x61, 0x9e, 0x58, 0xf5, 0xf4, 0xc5, 0x43, 0xed, 0x98, + 0x27, 0x6c, 0x28, 0xca, 0x8b, 0x9a, 0x00, 0x86, 0x69, 0x10, 0xb5, 0x3f, 0xd0, 0x0c, 0xb3, 0x9e, + 0x65, 0x92, 0x4f, 0xc5, 0x4b, 0x1a, 0xa4, 0x45, 0x19, 0x3b, 0x09, 0xa5, 0x68, 0x78, 0x1d, 0x3a, + 0xdd, 0x0f, 0xc6, 0xd8, 0x39, 0xaf, 0xe7, 0x2e, 0x9e, 0xee, 0x8f, 0x28, 0x13, 0x9d, 0x2e, 0xe3, + 0x46, 0x6d, 0x28, 0xf5, 0xf0, 0xa9, 0x61, 0xaa, 0xbd, 0xa1, 0xd5, 0x7f, 0x54, 0xcf, 0x33, 0x61, + 0x39, 0x4e, 0xb8, 0x49, 0x59, 0x9b, 0x94, 0xb3, 0x93, 0x50, 0xa0, 0xe7, 0xf7, 0xd0, 0xf7, 0xa0, + 0xd0, 0x1f, 0xe0, 0xfe, 0x23, 0x95, 0x4c, 0xea, 0x05, 0xa6, 0x63, 0x3d, 0x4e, 0x47, 0x8b, 0xf2, + 0x75, 0x27, 0x9d, 0x84, 0x92, 0xef, 0xf3, 0x26, 0x5d, 0xbf, 0x8e, 0x87, 0xc6, 0x19, 0x76, 0xa8, + 0x7c, 0xf1, 0xe2, 0xf5, 0xdf, 0xe3, 0x9c, 0x4c, 0x43, 0x51, 0xf7, 0x3a, 0xe8, 0x07, 0x50, 0xc4, + 0xa6, 0x2e, 0x96, 0x01, 0x4c, 0xc5, 0x8d, 0xd8, 0x7d, 0x36, 0x75, 0x6f, 0x11, 0x05, 0x2c, 0xda, + 0xe8, 0x55, 0xc8, 0xf5, 0xad, 0xd1, 0xc8, 0x20, 0xf5, 0x12, 0x93, 0x5e, 0x8b, 0x5d, 0x00, 0xe3, + 0xea, 0x24, 0x14, 0xc1, 0x8f, 0xf6, 0xa1, 0x3a, 0x34, 0x5c, 0xa2, 0xba, 0xa6, 0x66, 0xbb, 0x03, + 0x8b, 0xb8, 0xf5, 0x32, 0xd3, 0xf0, 0x74, 0x9c, 0x86, 0x3d, 0xc3, 0x25, 0x47, 0x1e, 0x73, 0x27, + 0xa1, 0x54, 0x86, 0x61, 0x02, 0xd5, 0x67, 0x9d, 0x9c, 0x60, 0xc7, 0x57, 0x58, 0xaf, 0x5c, 0xac, + 0xef, 0x80, 0x72, 0x7b, 0xf2, 0x54, 0x9f, 0x15, 0x26, 0xa0, 0x9f, 0xc0, 0x95, 0xa1, 0xa5, 0xe9, + 0xbe, 0x3a, 0xb5, 0x3f, 0x18, 0x9b, 0x8f, 0xea, 0x55, 0xa6, 0xf4, 0x76, 0xec, 0x24, 0x2d, 0x4d, + 0xf7, 0x54, 0xb4, 0xa8, 0x40, 0x27, 0xa1, 0xac, 0x0c, 0xa7, 0x89, 0xe8, 0x21, 0xac, 0x6a, 0xb6, + 0x3d, 0x3c, 0x9f, 0xd6, 0x5e, 0x63, 0xda, 0xef, 0xc4, 0x69, 0xdf, 0xa6, 0x32, 0xd3, 0xea, 0x91, + 0x36, 0x43, 0x45, 0x5d, 0x90, 0x6c, 0x07, 0xdb, 0x9a, 0x83, 0x55, 0xdb, 0xb1, 0x6c, 0xcb, 0xd5, + 0x86, 0x75, 0x89, 0xe9, 0x7e, 0x36, 0x4e, 0xf7, 0x21, 0xe7, 0x3f, 0x14, 0xec, 0x9d, 0x84, 0x52, + 0xb3, 0xa3, 0x24, 0xae, 0xd5, 0xea, 0x63, 0xd7, 0x0d, 0xb4, 0xae, 0x2c, 0xd2, 0xca, 0xf8, 0xa3, + 0x5a, 0x23, 0xa4, 0x66, 0x1e, 0xb2, 0x67, 0xda, 0x70, 0x8c, 0xdf, 0xca, 0x14, 0x32, 0x52, 0x56, + 0x7e, 0x16, 0x4a, 0x21, 0xc7, 0x82, 0xea, 0x90, 0x1f, 0x61, 0xd7, 0xd5, 0x4e, 0x31, 0xf3, 0x43, + 0x45, 0xc5, 0xeb, 0xca, 0x55, 0x28, 0x87, 0x9d, 0x89, 0xfc, 0x69, 0xd2, 0x97, 0xa4, 0x7e, 0x82, + 0x4a, 0x9e, 0x61, 0xc7, 0x35, 0x2c, 0xd3, 0x93, 0x14, 0x5d, 0x74, 0x13, 0x2a, 0xec, 0xc4, 0xab, + 0xde, 0x77, 0xea, 0xac, 0x32, 0x4a, 0x99, 0x11, 0x1f, 0x08, 0xa6, 0x75, 0x28, 0xd9, 0x5b, 0xb6, + 0xcf, 0x92, 0x66, 0x2c, 0x60, 0x6f, 0xd9, 0x1e, 0xc3, 0x53, 0x50, 0xa6, 0x2b, 0xf5, 0x39, 0x32, + 0x6c, 0x90, 0x12, 0xa5, 0x09, 0x16, 0xf9, 0x0f, 0x29, 0x90, 0xa6, 0x1d, 0x10, 0x7a, 0x15, 0x32, + 0xd4, 0x17, 0x0b, 0xb7, 0xda, 0xd8, 0xe0, 0x8e, 0x7a, 0xc3, 0x73, 0xd4, 0x1b, 0x5d, 0xcf, 0x51, + 0x37, 0x0b, 0x5f, 0x7c, 0xb5, 0x9e, 0xf8, 0xf4, 0x2f, 0xeb, 0x49, 0x85, 0x49, 0xa0, 0x6b, 0xd4, + 0x5f, 0x68, 0x86, 0xa9, 0x1a, 0x3a, 0x9b, 0x72, 0x91, 0x3a, 0x03, 0xcd, 0x30, 0x77, 0x74, 0xb4, + 0x07, 0x52, 0xdf, 0x32, 0x5d, 0x6c, 0xba, 0x63, 0x57, 0xe5, 0x81, 0x40, 0x38, 0xd3, 0x88, 0x4b, + 0xe0, 0xe1, 0xa5, 0xe5, 0x71, 0x1e, 0x32, 0x46, 0xa5, 0xd6, 0x8f, 0x12, 0xd0, 0x7d, 0x80, 0x33, + 0x6d, 0x68, 0xe8, 0x1a, 0xb1, 0x1c, 0xb7, 0x9e, 0xb9, 0x91, 0x9e, 0xeb, 0x17, 0x1e, 0x78, 0x2c, + 0xc7, 0xb6, 0xae, 0x11, 0xdc, 0xcc, 0xd0, 0xe9, 0x2a, 0x21, 0x49, 0xf4, 0x0c, 0xd4, 0x34, 0xdb, + 0x56, 0x5d, 0xa2, 0x11, 0xac, 0xf6, 0xce, 0x09, 0x76, 0x99, 0x9f, 0x2e, 0x2b, 0x15, 0xcd, 0xb6, + 0x8f, 0x28, 0xb5, 0x49, 0x89, 0xe8, 0x69, 0xa8, 0x52, 0x9f, 0x6c, 0x68, 0x43, 0x75, 0x80, 0x8d, + 0xd3, 0x01, 0x61, 0xfe, 0x38, 0xad, 0x54, 0x04, 0xb5, 0xc3, 0x88, 0xb2, 0xee, 0xef, 0x38, 0xf3, + 0xc7, 0x08, 0x41, 0x46, 0xd7, 0x88, 0xc6, 0x2c, 0x59, 0x56, 0x58, 0x9b, 0xd2, 0x6c, 0x8d, 0x0c, + 0x84, 0x7d, 0x58, 0x1b, 0x5d, 0x85, 0x9c, 0x50, 0x9b, 0x66, 0x6a, 0x45, 0x0f, 0xad, 0x42, 0xd6, + 0x76, 0xac, 0x33, 0xcc, 0xb6, 0xae, 0xa0, 0xf0, 0x8e, 0xfc, 0x71, 0x0a, 0x56, 0x66, 0x3c, 0x37, + 0xd5, 0x3b, 0xd0, 0xdc, 0x81, 0x37, 0x16, 0x6d, 0xa3, 0x97, 0xa9, 0x5e, 0x4d, 0xc7, 0x8e, 0x88, + 0x76, 0xf5, 0x59, 0x53, 0x77, 0xd8, 0x77, 0x61, 0x1a, 0xc1, 0x8d, 0x76, 0x41, 0x1a, 0x6a, 0x2e, + 0x51, 0xb9, 0x27, 0x54, 0x43, 0x91, 0xef, 0x89, 0x19, 0x23, 0x73, 0xbf, 0x49, 0x0f, 0xb4, 0x50, + 0x52, 0xa5, 0xa2, 0x01, 0x15, 0x1d, 0xc3, 0x6a, 0xef, 0xfc, 0x23, 0xcd, 0x24, 0x86, 0x89, 0xd5, + 0x99, 0x5d, 0x9b, 0x0d, 0xa5, 0x6f, 0x1b, 0x6e, 0x0f, 0x0f, 0xb4, 0x33, 0xc3, 0xf2, 0xa6, 0x75, + 0xc5, 0x97, 0xf7, 0x77, 0xd4, 0x95, 0x15, 0xa8, 0x46, 0x43, 0x0f, 0xaa, 0x42, 0x8a, 0x4c, 0xc4, + 0xfa, 0x53, 0x64, 0x82, 0x5e, 0x84, 0x0c, 0x5d, 0x23, 0x5b, 0x7b, 0x75, 0xce, 0x40, 0x42, 0xae, + 0x7b, 0x6e, 0x63, 0x85, 0x71, 0xca, 0xb2, 0x7f, 0x1b, 0xfc, 0x70, 0x34, 0xad, 0x55, 0xbe, 0x0d, + 0xb5, 0xa9, 0x78, 0x13, 0xda, 0xbe, 0x64, 0x78, 0xfb, 0xe4, 0x1a, 0x54, 0x22, 0xc1, 0x45, 0xbe, + 0x0a, 0xab, 0xf3, 0x62, 0x85, 0x3c, 0xf0, 0xe9, 0x11, 0x9f, 0x8f, 0xee, 0x42, 0xc1, 0x0f, 0x16, + 0xfc, 0x36, 0x5e, 0x9b, 0x59, 0x85, 0xc7, 0xac, 0xf8, 0xac, 0xf4, 0x1a, 0xd2, 0x53, 0xcd, 0x8e, + 0x43, 0x8a, 0x4d, 0x3c, 0xaf, 0xd9, 0x76, 0x47, 0x73, 0x07, 0xf2, 0x7b, 0x50, 0x8f, 0x0b, 0x04, + 0x53, 0xcb, 0xc8, 0xf8, 0xa7, 0xf0, 0x2a, 0xe4, 0x4e, 0x2c, 0x67, 0xa4, 0x11, 0xa6, 0xac, 0xa2, + 0x88, 0x1e, 0x3d, 0x9d, 0x3c, 0x28, 0xa4, 0x19, 0x99, 0x77, 0x64, 0x15, 0xae, 0xc5, 0x06, 0x03, + 0x2a, 0x62, 0x98, 0x3a, 0xe6, 0xf6, 0xac, 0x28, 0xbc, 0x13, 0x28, 0xe2, 0x93, 0xe5, 0x1d, 0x3a, + 0xac, 0xcb, 0xd6, 0xca, 0xf4, 0x17, 0x15, 0xd1, 0x93, 0x3f, 0x4b, 0xc3, 0xd5, 0xf9, 0x21, 0x01, + 0xdd, 0x80, 0xf2, 0x48, 0x9b, 0xa8, 0x64, 0x22, 0xee, 0x32, 0xdf, 0x0e, 0x18, 0x69, 0x93, 0xee, + 0x84, 0x5f, 0x64, 0x09, 0xd2, 0x64, 0xe2, 0xd6, 0x53, 0x37, 0xd2, 0xb7, 0xca, 0x0a, 0x6d, 0xa2, + 0x63, 0x58, 0x19, 0x5a, 0x7d, 0x6d, 0xa8, 0x86, 0x4e, 0xbc, 0x38, 0xec, 0x37, 0x67, 0x8c, 0xdd, + 0x9e, 0x30, 0x8a, 0x3e, 0x73, 0xe8, 0x6b, 0x4c, 0xc7, 0x9e, 0x7f, 0xf2, 0xd1, 0x3d, 0x28, 0x8d, + 0x82, 0x83, 0x7c, 0x89, 0xc3, 0x1e, 0x16, 0x0b, 0x6d, 0x49, 0x36, 0xe2, 0x18, 0x3c, 0x17, 0x9d, + 0xbb, 0xb4, 0x8b, 0x7e, 0x11, 0x56, 0x4d, 0x3c, 0x21, 0xa1, 0x8b, 0xc8, 0xcf, 0x49, 0x9e, 0x99, + 0x1e, 0xd1, 0x6f, 0xc1, 0x25, 0xa3, 0x47, 0x06, 0xdd, 0x66, 0x41, 0xd5, 0xb6, 0x5c, 0xec, 0xa8, + 0x9a, 0xae, 0x3b, 0xd8, 0x75, 0x59, 0x32, 0x58, 0x66, 0x91, 0x92, 0xd1, 0xb7, 0x39, 0x59, 0xfe, + 0x65, 0x78, 0x6b, 0x22, 0x41, 0xd4, 0x33, 0x7c, 0x32, 0x30, 0xfc, 0x11, 0xac, 0x0a, 0x79, 0x3d, + 0x62, 0xfb, 0xd4, 0xb2, 0x8e, 0x06, 0x79, 0xe2, 0xf1, 0x66, 0x4f, 0x7f, 0x3b, 0xb3, 0x7b, 0xbe, + 0x34, 0x13, 0xf2, 0xa5, 0xff, 0x65, 0x5b, 0xf1, 0xc7, 0x22, 0x14, 0x14, 0xec, 0xda, 0x34, 0x70, + 0xa2, 0x26, 0x14, 0xf1, 0xa4, 0x8f, 0x6d, 0xe2, 0xe5, 0x1a, 0xf3, 0xc1, 0x00, 0xe7, 0x6e, 0x7b, + 0x9c, 0x34, 0x13, 0xf7, 0xc5, 0xd0, 0x4b, 0x02, 0x6c, 0xc5, 0xe3, 0x26, 0x21, 0x1e, 0x46, 0x5b, + 0x2f, 0x7b, 0x68, 0x2b, 0x1d, 0x9b, 0x7c, 0x73, 0xa9, 0x29, 0xb8, 0xf5, 0x92, 0x80, 0x5b, 0x99, + 0x05, 0x83, 0x45, 0xf0, 0x56, 0x2b, 0x82, 0xb7, 0x72, 0x0b, 0x96, 0x19, 0x03, 0xb8, 0x5e, 0xf6, + 0x00, 0x57, 0x7e, 0xc1, 0x8c, 0xa7, 0x10, 0xd7, 0xfd, 0x28, 0xe2, 0x2a, 0xc4, 0x38, 0x10, 0x4f, + 0x3a, 0x16, 0x72, 0xbd, 0x11, 0x82, 0x5c, 0xc5, 0x58, 0xbc, 0xc3, 0x95, 0xcc, 0xc1, 0x5c, 0xad, + 0x08, 0xe6, 0x82, 0x05, 0x36, 0x88, 0x01, 0x5d, 0x6f, 0x86, 0x41, 0x57, 0x29, 0x16, 0xb7, 0x89, + 0xfd, 0x9e, 0x87, 0xba, 0x5e, 0xf3, 0x51, 0x57, 0x39, 0x16, 0x36, 0x8a, 0x35, 0x4c, 0xc3, 0xae, + 0x83, 0x19, 0xd8, 0xc5, 0x61, 0xd2, 0x33, 0xb1, 0x2a, 0x16, 0xe0, 0xae, 0x83, 0x19, 0xdc, 0x55, + 0x5d, 0xa0, 0x70, 0x01, 0xf0, 0xfa, 0xe9, 0x7c, 0xe0, 0x15, 0x0f, 0x8d, 0xc4, 0x34, 0x97, 0x43, + 0x5e, 0x6a, 0x0c, 0xf2, 0xe2, 0xe8, 0xe8, 0xb9, 0x58, 0xf5, 0x4b, 0x43, 0xaf, 0xe3, 0x39, 0xd0, + 0x8b, 0x83, 0xa4, 0x5b, 0xb1, 0xca, 0x97, 0xc0, 0x5e, 0xc7, 0x73, 0xb0, 0x17, 0x5a, 0xa8, 0xf6, + 0x32, 0xe0, 0x2b, 0x2b, 0xe5, 0xe4, 0xdb, 0x34, 0xf5, 0x9d, 0xf2, 0x53, 0x34, 0x7f, 0xc0, 0x8e, + 0x63, 0x39, 0x02, 0x46, 0xf1, 0x8e, 0x7c, 0x8b, 0x26, 0xe3, 0x81, 0x4f, 0xba, 0x00, 0xa8, 0xb1, + 0x3c, 0x2d, 0xe4, 0x87, 0xe4, 0xdf, 0x26, 0x03, 0x59, 0x96, 0xc3, 0x86, 0x13, 0xf9, 0xa2, 0x48, + 0xe4, 0x43, 0xf0, 0x2d, 0x15, 0x85, 0x6f, 0xeb, 0x50, 0xa2, 0xf9, 0xd7, 0x14, 0x32, 0xd3, 0x6c, + 0x1f, 0x99, 0xdd, 0x81, 0x15, 0x16, 0xf1, 0x38, 0xc8, 0x13, 0x61, 0x25, 0xc3, 0xc2, 0x4a, 0x8d, + 0x7e, 0xe0, 0x17, 0x8a, 0xc7, 0x97, 0x17, 0xe0, 0x4a, 0x88, 0xd7, 0xcf, 0xeb, 0x38, 0x4c, 0x91, + 0x7c, 0xee, 0x6d, 0x91, 0xe0, 0xfd, 0x3e, 0x19, 0x58, 0x28, 0x80, 0x74, 0xf3, 0xd0, 0x57, 0xf2, + 0xdf, 0x84, 0xbe, 0x52, 0xdf, 0x1a, 0x7d, 0x85, 0xf3, 0xd4, 0x74, 0x34, 0x4f, 0xfd, 0x7b, 0x32, + 0xd8, 0x13, 0x1f, 0x4b, 0xf5, 0x2d, 0x1d, 0x8b, 0xcc, 0x91, 0xb5, 0x69, 0x52, 0x31, 0xb4, 0x4e, + 0x45, 0x7e, 0x48, 0x9b, 0x94, 0xcb, 0x0f, 0x1c, 0x45, 0x11, 0x17, 0xfc, 0xa4, 0x93, 0x07, 0x6e, + 0x91, 0x74, 0x4a, 0x90, 0x7e, 0x84, 0x79, 0x5d, 0xad, 0xac, 0xd0, 0x26, 0xe5, 0x63, 0x47, 0x4d, + 0x04, 0x60, 0xde, 0x41, 0xaf, 0x42, 0x91, 0x55, 0x44, 0x55, 0xcb, 0x76, 0x85, 0x5b, 0x8f, 0xe4, + 0x26, 0xbc, 0xf0, 0xb9, 0x71, 0x48, 0x79, 0x0e, 0x6c, 0x57, 0x29, 0xd8, 0xa2, 0x15, 0xca, 0x18, + 0x8a, 0x91, 0x8c, 0xe1, 0x3a, 0x14, 0xe9, 0xec, 0x5d, 0x5b, 0xeb, 0x63, 0xe6, 0xa2, 0x8b, 0x4a, + 0x40, 0x90, 0x1f, 0x02, 0x9a, 0x0d, 0x12, 0xa8, 0x03, 0x39, 0x7c, 0x86, 0x4d, 0xc2, 0x33, 0xa8, + 0xd2, 0xd6, 0xd5, 0xd9, 0xd4, 0x94, 0x7e, 0x6e, 0xd6, 0xa9, 0x91, 0xff, 0xf6, 0xd5, 0xba, 0xc4, + 0xb9, 0x9f, 0xb7, 0x46, 0x06, 0xc1, 0x23, 0x9b, 0x9c, 0x2b, 0x42, 0x5e, 0xfe, 0x73, 0x8a, 0x02, + 0x98, 0x48, 0x00, 0x99, 0x6b, 0x5b, 0xef, 0xc8, 0xa7, 0x42, 0xd8, 0x75, 0x39, 0x7b, 0xaf, 0x01, + 0x9c, 0x6a, 0xae, 0xfa, 0xa1, 0x66, 0x12, 0xac, 0x0b, 0xa3, 0x87, 0x28, 0xa8, 0x01, 0x05, 0xda, + 0x1b, 0xbb, 0x58, 0x17, 0x30, 0xda, 0xef, 0x87, 0xd6, 0x99, 0xff, 0x6e, 0xeb, 0x8c, 0x5a, 0xb9, + 0x30, 0x65, 0xe5, 0x10, 0xb8, 0x28, 0x86, 0xc1, 0x05, 0x9d, 0x9b, 0xed, 0x18, 0x96, 0x63, 0x90, + 0x73, 0xb6, 0x35, 0x69, 0xc5, 0xef, 0xa3, 0x9b, 0x50, 0x19, 0xe1, 0x91, 0x6d, 0x59, 0x43, 0x95, + 0xbb, 0x9b, 0x12, 0x13, 0x2d, 0x0b, 0x62, 0x9b, 0x79, 0x9d, 0x5f, 0xa4, 0x82, 0xfb, 0x17, 0x80, + 0xc8, 0xff, 0x39, 0x03, 0xcb, 0xbf, 0x62, 0x95, 0xa5, 0x68, 0x8a, 0x80, 0x8e, 0x60, 0xc5, 0xbf, + 0xfe, 0xea, 0x98, 0xb9, 0x05, 0xef, 0x40, 0x2f, 0xeb, 0x3f, 0xa4, 0xb3, 0x28, 0xd9, 0x45, 0xef, + 0xc2, 0xe3, 0x53, 0xbe, 0xcd, 0x57, 0x9d, 0x5a, 0xd6, 0xc5, 0x3d, 0x16, 0x75, 0x71, 0x9e, 0xea, + 0xc0, 0x58, 0xe9, 0xef, 0x78, 0xeb, 0x76, 0xa0, 0x1a, 0xcd, 0x78, 0xe6, 0x6e, 0xff, 0x4d, 0xa8, + 0x38, 0x98, 0x68, 0x86, 0xa9, 0x46, 0xca, 0x41, 0x65, 0x4e, 0x14, 0x45, 0xa6, 0x43, 0x78, 0x6c, + 0x6e, 0xe6, 0x83, 0x5e, 0x81, 0x62, 0x90, 0x34, 0x71, 0xab, 0x5e, 0x50, 0x2e, 0x08, 0x78, 0xe5, + 0xdf, 0x25, 0x03, 0x95, 0xd1, 0x02, 0x44, 0x1b, 0x72, 0x0e, 0x76, 0xc7, 0x43, 0x5e, 0x12, 0xa8, + 0x6e, 0xbd, 0xb0, 0x5c, 0xce, 0x44, 0xa9, 0xe3, 0x21, 0x51, 0x84, 0xb0, 0xfc, 0x10, 0x72, 0x9c, + 0x82, 0x4a, 0x90, 0x3f, 0xde, 0xdf, 0xdd, 0x3f, 0x78, 0x67, 0x5f, 0x4a, 0x20, 0x80, 0xdc, 0x76, + 0xab, 0xd5, 0x3e, 0xec, 0x4a, 0x49, 0x54, 0x84, 0xec, 0x76, 0xf3, 0x40, 0xe9, 0x4a, 0x29, 0x4a, + 0x56, 0xda, 0x6f, 0xb5, 0x5b, 0x5d, 0x29, 0x8d, 0x56, 0xa0, 0xc2, 0xdb, 0xea, 0xfd, 0x03, 0xe5, + 0xed, 0xed, 0xae, 0x94, 0x09, 0x91, 0x8e, 0xda, 0xfb, 0xf7, 0xda, 0x8a, 0x94, 0x95, 0xff, 0x0f, + 0xae, 0xc5, 0x66, 0x59, 0x41, 0x75, 0x21, 0x19, 0xaa, 0x2e, 0xc8, 0x9f, 0xa5, 0xa0, 0x11, 0x9f, + 0x3a, 0xa1, 0xb7, 0xa6, 0x16, 0xbe, 0x75, 0x89, 0xbc, 0x6b, 0x6a, 0xf5, 0xe8, 0x69, 0xa8, 0x3a, + 0xf8, 0x04, 0x93, 0xfe, 0x80, 0xa7, 0x72, 0x3c, 0x64, 0x56, 0x94, 0x8a, 0xa0, 0x32, 0x21, 0x97, + 0xb3, 0xbd, 0x8f, 0xfb, 0x44, 0xe5, 0xbe, 0x88, 0x1f, 0xba, 0x22, 0x65, 0xa3, 0xd4, 0x23, 0x4e, + 0x94, 0xdf, 0xbb, 0x94, 0x2d, 0x8b, 0x90, 0x55, 0xda, 0x5d, 0xe5, 0x5d, 0x29, 0x8d, 0x10, 0x54, + 0x59, 0x53, 0x3d, 0xda, 0xdf, 0x3e, 0x3c, 0xea, 0x1c, 0x50, 0x5b, 0x5e, 0x81, 0x9a, 0x67, 0x4b, + 0x8f, 0x98, 0x95, 0x9f, 0x83, 0xc7, 0x63, 0xf2, 0xbe, 0x59, 0x14, 0x2f, 0xff, 0x3a, 0x19, 0xe6, + 0x8e, 0x62, 0xfe, 0x03, 0xc8, 0xb9, 0x44, 0x23, 0x63, 0x57, 0x18, 0xf1, 0x95, 0x65, 0x13, 0xc1, + 0x0d, 0xaf, 0x71, 0xc4, 0xc4, 0x15, 0xa1, 0x46, 0xbe, 0x0b, 0xd5, 0xe8, 0x97, 0x78, 0x1b, 0x04, + 0x87, 0x28, 0x25, 0xbf, 0x0b, 0x10, 0xaa, 0x47, 0xae, 0x42, 0xd6, 0xb1, 0xc6, 0xa6, 0xce, 0x26, + 0x95, 0x55, 0x78, 0x07, 0xdd, 0x85, 0xec, 0x99, 0xc5, 0x7d, 0xc6, 0xfc, 0x8b, 0xf3, 0xc0, 0x22, + 0x38, 0x54, 0x7c, 0xe0, 0xdc, 0xb2, 0x01, 0x68, 0xb6, 0x26, 0x14, 0x33, 0xc4, 0x1b, 0xd1, 0x21, + 0x9e, 0x8a, 0xad, 0x2e, 0xcd, 0x1f, 0xea, 0x23, 0xc8, 0x32, 0x6f, 0x43, 0x3d, 0x07, 0xab, 0x6b, + 0x8a, 0x64, 0x94, 0xb6, 0xd1, 0xcf, 0x00, 0x34, 0x42, 0x1c, 0xa3, 0x37, 0x0e, 0x06, 0x58, 0x9f, + 0xef, 0xad, 0xb6, 0x3d, 0xbe, 0xe6, 0x75, 0xe1, 0xb6, 0x56, 0x03, 0xd1, 0x90, 0xeb, 0x0a, 0x29, + 0x94, 0xf7, 0xa1, 0x1a, 0x95, 0xf5, 0xd2, 0xa7, 0xe4, 0x9c, 0xf4, 0x29, 0x15, 0x4e, 0x9f, 0xfc, + 0xe4, 0x2b, 0xcd, 0x4b, 0xd8, 0xac, 0x23, 0x7f, 0x92, 0x84, 0x42, 0x77, 0x22, 0xce, 0x71, 0x4c, + 0xf9, 0x34, 0x10, 0x4d, 0x85, 0x8b, 0x85, 0xbc, 0x1e, 0x9b, 0xf6, 0xab, 0xbc, 0x6f, 0xfa, 0x37, + 0x35, 0xb3, 0x2c, 0xda, 0xf5, 0xaa, 0xdd, 0xc2, 0x3b, 0xbd, 0x0e, 0x45, 0x3f, 0xd6, 0xd0, 0xac, + 0xde, 0xab, 0xac, 0x24, 0x45, 0x4a, 0xca, 0xbb, 0xac, 0x18, 0x6f, 0x7d, 0x28, 0xca, 0x91, 0x69, + 0x85, 0x77, 0x64, 0x1d, 0x6a, 0x53, 0x81, 0x0a, 0xbd, 0x0e, 0x79, 0x7b, 0xdc, 0x53, 0x3d, 0xf3, + 0x4c, 0xd5, 0x9f, 0xbc, 0x7c, 0x71, 0xdc, 0x1b, 0x1a, 0xfd, 0x5d, 0x7c, 0xee, 0x4d, 0xc6, 0x1e, + 0xf7, 0x76, 0xb9, 0x15, 0xf9, 0x28, 0xa9, 0xf0, 0x28, 0x67, 0x50, 0xf0, 0x0e, 0x05, 0xfa, 0x3e, + 0x14, 0xfd, 0x18, 0xe8, 0xff, 0xa3, 0x89, 0x0d, 0x9e, 0x42, 0x7d, 0x20, 0x42, 0xc1, 0x87, 0x6b, + 0x9c, 0x9a, 0x5e, 0xd5, 0x8d, 0xa3, 0xfc, 0x14, 0xdb, 0x9d, 0x1a, 0xff, 0xb0, 0xe7, 0x81, 0x0a, + 0xf9, 0x37, 0x49, 0x90, 0xa6, 0x4f, 0xe5, 0x7f, 0x72, 0x02, 0xd4, 0x29, 0xd2, 0xd3, 0xaf, 0x62, + 0x3a, 0x09, 0x1f, 0x4d, 0x95, 0x95, 0x0a, 0xa5, 0xb6, 0x3d, 0xa2, 0xfc, 0x71, 0x0a, 0x4a, 0xa1, + 0x9a, 0x1e, 0xfa, 0xff, 0xd0, 0x15, 0xa9, 0xce, 0xc9, 0x2d, 0x42, 0xbc, 0x41, 0xf9, 0x3f, 0xba, + 0xb0, 0xd4, 0xe5, 0x17, 0x16, 0xf7, 0x1b, 0xc7, 0x2b, 0x11, 0x66, 0x2e, 0x5d, 0x22, 0x7c, 0x1e, + 0x10, 0xb1, 0x88, 0x36, 0x54, 0xcf, 0x2c, 0x62, 0x98, 0xa7, 0x2a, 0x3f, 0x1a, 0x3c, 0xe3, 0x93, + 0xd8, 0x97, 0x07, 0xec, 0xc3, 0x21, 0x3b, 0x25, 0x3f, 0x4f, 0x42, 0xc1, 0x0f, 0xdd, 0x97, 0xad, + 0xe6, 0x5f, 0x85, 0x9c, 0x88, 0x4e, 0xbc, 0x9c, 0x2f, 0x7a, 0x73, 0x6b, 0xa1, 0x0d, 0x28, 0x8c, + 0x30, 0xd1, 0x58, 0xfe, 0xc2, 0x81, 0xa8, 0xdf, 0xbf, 0xf3, 0x1a, 0x94, 0x42, 0x3f, 0x56, 0xa8, + 0x9f, 0xd8, 0x6f, 0xbf, 0x23, 0x25, 0x1a, 0xf9, 0x4f, 0x3e, 0xbf, 0x91, 0xde, 0xc7, 0x1f, 0xd2, + 0x1b, 0xa6, 0xb4, 0x5b, 0x9d, 0x76, 0x6b, 0x57, 0x4a, 0x36, 0x4a, 0x9f, 0x7c, 0x7e, 0x23, 0xaf, + 0x60, 0x56, 0xbe, 0xba, 0xb3, 0x0b, 0xb5, 0xa9, 0x8d, 0x89, 0xfa, 0x77, 0x04, 0xd5, 0x7b, 0xc7, + 0x87, 0x7b, 0x3b, 0xad, 0xed, 0x6e, 0x5b, 0x7d, 0x70, 0xd0, 0x6d, 0x4b, 0x49, 0xf4, 0x38, 0x5c, + 0xd9, 0xdb, 0xf9, 0x61, 0xa7, 0xab, 0xb6, 0xf6, 0x76, 0xda, 0xfb, 0x5d, 0x75, 0xbb, 0xdb, 0xdd, + 0x6e, 0xed, 0x4a, 0xa9, 0xad, 0x7f, 0x00, 0xd4, 0xb6, 0x9b, 0xad, 0x1d, 0x1a, 0x9f, 0x8d, 0xbe, + 0xc6, 0x0a, 0x05, 0x2d, 0xc8, 0xb0, 0x52, 0xc0, 0x85, 0x4f, 0x45, 0x1a, 0x17, 0xd7, 0x36, 0xd1, + 0x7d, 0xc8, 0xb2, 0x2a, 0x01, 0xba, 0xf8, 0xed, 0x48, 0x63, 0x41, 0xb1, 0x93, 0x4e, 0x86, 0x5d, + 0xa7, 0x0b, 0x1f, 0x93, 0x34, 0x2e, 0xae, 0x7d, 0x22, 0x05, 0x8a, 0x01, 0xca, 0x58, 0xfc, 0xb8, + 0xa2, 0xb1, 0x84, 0x77, 0x44, 0x7b, 0x90, 0xf7, 0x80, 0xe1, 0xa2, 0xe7, 0x1e, 0x8d, 0x85, 0xc5, + 0x49, 0x6a, 0x2e, 0x0e, 0xe0, 0x2f, 0x7e, 0xbb, 0xd2, 0x58, 0x50, 0x69, 0x45, 0x3b, 0x90, 0x13, + 0x99, 0xf3, 0x82, 0x27, 0x1c, 0x8d, 0x45, 0xc5, 0x46, 0x6a, 0xb4, 0xa0, 0x34, 0xb2, 0xf8, 0x45, + 0x4e, 0x63, 0x89, 0x22, 0x32, 0x3a, 0x06, 0x08, 0xc1, 0xf5, 0x25, 0x9e, 0xda, 0x34, 0x96, 0x29, + 0x0e, 0xa3, 0x03, 0x28, 0xf8, 0xe8, 0x69, 0xe1, 0xc3, 0x97, 0xc6, 0xe2, 0x2a, 0x2d, 0x7a, 0x08, + 0x95, 0x28, 0x6a, 0x58, 0xee, 0x39, 0x4b, 0x63, 0xc9, 0xf2, 0x2b, 0xd5, 0x1f, 0x85, 0x10, 0xcb, + 0x3d, 0x6f, 0x69, 0x2c, 0x59, 0x8d, 0x45, 0xef, 0xc3, 0xca, 0x6c, 0x8a, 0xbf, 0xfc, 0x6b, 0x97, + 0xc6, 0x25, 0xea, 0xb3, 0x68, 0x04, 0x68, 0x0e, 0x34, 0xb8, 0xc4, 0xe3, 0x97, 0xc6, 0x65, 0xca, + 0xb5, 0x48, 0x87, 0xda, 0x74, 0xbe, 0xbd, 0xec, 0x63, 0x98, 0xc6, 0xd2, 0xa5, 0x5b, 0x3e, 0x4a, + 0x34, 0x4f, 0x5f, 0xf6, 0x71, 0x4c, 0x63, 0xe9, 0x4a, 0x6e, 0xb3, 0xfd, 0xc5, 0xd7, 0x6b, 0xc9, + 0x2f, 0xbf, 0x5e, 0x4b, 0xfe, 0xf5, 0xeb, 0xb5, 0xe4, 0xa7, 0xdf, 0xac, 0x25, 0xbe, 0xfc, 0x66, + 0x2d, 0xf1, 0xa7, 0x6f, 0xd6, 0x12, 0x3f, 0x7e, 0xee, 0xd4, 0x20, 0x83, 0x71, 0x6f, 0xa3, 0x6f, + 0x8d, 0x36, 0xc3, 0x2f, 0x04, 0xe7, 0xbd, 0x5a, 0xec, 0xe5, 0x58, 0x8c, 0x7c, 0xe9, 0x5f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x9e, 0x97, 0xe4, 0x35, 0xd5, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6704,110 +6570,6 @@ func (m *ResponseProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ConsensusParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ConsensusParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConsensusParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.Validator != nil { - { - size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.Evidence != nil { - { - size, err := m.Evidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Block != nil { - { - size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *BlockParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *BlockParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *BlockParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.MaxGas != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.MaxGas)) - i-- - dAtA[i] = 0x10 - } - if m.MaxBytes != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.MaxBytes)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7224,12 +6986,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n56, err56 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err56 != nil { - return 0, err56 + n52, err52 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err52 != nil { + return 0, err52 } - i -= n56 - i = encodeVarintTypes(dAtA, i, uint64(n56)) + i -= n52 + i = encodeVarintTypes(dAtA, i, uint64(n52)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8420,46 +8182,6 @@ func (m *ResponseProcessProposal) Size() (n int) { return n } -func (m *ConsensusParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Block != nil { - l = m.Block.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Evidence != nil { - l = m.Evidence.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Validator != nil { - l = m.Validator.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovTypes(uint64(l)) - } - return n -} - -func (m *BlockParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MaxBytes != 0 { - n += 1 + sovTypes(uint64(m.MaxBytes)) - } - if m.MaxGas != 0 { - n += 1 + sovTypes(uint64(m.MaxGas)) - } - return n -} - func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -9690,7 +9412,7 @@ func (m *RequestInitChain) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ConsensusParams == nil { - m.ConsensusParams = &ConsensusParams{} + m.ConsensusParams = &types1.ConsensusParams{} } if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -12556,7 +12278,7 @@ func (m *ResponseInitChain) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ConsensusParams == nil { - m.ConsensusParams = &ConsensusParams{} + m.ConsensusParams = &types1.ConsensusParams{} } if err := m.ConsensusParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -13760,7 +13482,7 @@ func (m *ResponseEndBlock) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ConsensusParamUpdates == nil { - m.ConsensusParamUpdates = &ConsensusParams{} + m.ConsensusParamUpdates = &types1.ConsensusParams{} } if err := m.ConsensusParamUpdates.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -14489,288 +14211,6 @@ func (m *ResponseProcessProposal) Unmarshal(dAtA []byte) error { } return nil } -func (m *ConsensusParams) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ConsensusParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConsensusParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Block == nil { - m.Block = &BlockParams{} - } - if err := m.Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Evidence", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Evidence == nil { - m.Evidence = &types1.EvidenceParams{} - } - if err := m.Evidence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Validator == nil { - m.Validator = &types1.ValidatorParams{} - } - if err := m.Validator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &types1.VersionParams{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *BlockParams) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: BlockParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: BlockParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxBytes", wireType) - } - m.MaxBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxGas", wireType) - } - m.MaxGas = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxGas |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/consensus/replay.go b/consensus/replay.go index 8e378113e..f598ddf78 100644 --- a/consensus/replay.go +++ b/consensus/replay.go @@ -307,12 +307,12 @@ func (h *Handshaker) ReplayBlocks( } validatorSet := types.NewValidatorSet(validators) nextVals := types.TM2PB.ValidatorUpdates(validatorSet) - csParams := types.TM2PB.ConsensusParams(h.genDoc.ConsensusParams) + pbparams := h.genDoc.ConsensusParams.ToProto() req := abci.RequestInitChain{ Time: h.genDoc.GenesisTime, ChainId: h.genDoc.ChainID, InitialHeight: h.genDoc.InitialHeight, - ConsensusParams: csParams, + ConsensusParams: &pbparams, Validators: nextVals, AppStateBytes: h.genDoc.AppState, } @@ -344,8 +344,8 @@ func (h *Handshaker) ReplayBlocks( } if res.ConsensusParams != nil { - state.ConsensusParams = types.UpdateConsensusParams(state.ConsensusParams, res.ConsensusParams) - state.Version.Consensus.App = state.ConsensusParams.Version.AppVersion + state.ConsensusParams = state.ConsensusParams.Update(res.ConsensusParams) + state.Version.Consensus.App = state.ConsensusParams.Version.App } // We update the last results hash with the empty hash, to conform with RFC-6962. state.LastResultsHash = merkle.HashFromByteSlices(nil) diff --git a/consensus/replay_test.go b/consensus/replay_test.go index d32c61dc2..f9b44cbf8 100644 --- a/consensus/replay_test.go +++ b/consensus/replay_test.go @@ -1130,7 +1130,7 @@ func stateAndStore( type mockBlockStore struct { config *cfg.Config - params tmproto.ConsensusParams + params types.ConsensusParams chain []*types.Block commits []*types.Commit base int64 @@ -1138,7 +1138,7 @@ type mockBlockStore struct { } // TODO: NewBlockStore(db.NewMemDB) ... -func newMockBlockStore(t *testing.T, config *cfg.Config, params tmproto.ConsensusParams) *mockBlockStore { +func newMockBlockStore(t *testing.T, config *cfg.Config, params types.ConsensusParams) *mockBlockStore { return &mockBlockStore{ config: config, params: params, diff --git a/consensus/state.go b/consensus/state.go index f2445d4a2..a0b8cd85e 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -2267,9 +2267,10 @@ func (cs *State) signVote( func (cs *State) voteTime() time.Time { now := tmtime.Now() minVoteTime := now + // Minimum time increment between blocks + const timeIota = time.Millisecond // TODO: We should remove next line in case we don't vote for v in case cs.ProposalBlock == nil, // even if cs.LockedBlock != nil. See https://docs.tendermint.com/master/spec/. - timeIota := time.Duration(cs.state.ConsensusParams.Block.TimeIotaMs) * time.Millisecond if cs.LockedBlock != nil { // See the BFT time spec https://docs.tendermint.com/master/spec/consensus/bft-time.html minVoteTime = cs.LockedBlock.Time.Add(timeIota) diff --git a/evidence/pool_test.go b/evidence/pool_test.go index f0fba1ac2..f6c9ec9e6 100644 --- a/evidence/pool_test.go +++ b/evidence/pool_test.go @@ -14,7 +14,6 @@ import ( "github.com/tendermint/tendermint/evidence" "github.com/tendermint/tendermint/evidence/mocks" "github.com/tendermint/tendermint/libs/log" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmversion "github.com/tendermint/tendermint/proto/tendermint/version" sm "github.com/tendermint/tendermint/state" smmocks "github.com/tendermint/tendermint/state/mocks" @@ -327,12 +326,12 @@ func TestRecoverPendingEvidence(t *testing.T) { newStateStore.On("Load").Return(sm.State{ LastBlockTime: defaultEvidenceTime.Add(25 * time.Minute), LastBlockHeight: height + 15, - ConsensusParams: tmproto.ConsensusParams{ - Block: tmproto.BlockParams{ + ConsensusParams: types.ConsensusParams{ + Block: types.BlockParams{ MaxBytes: 22020096, MaxGas: -1, }, - Evidence: tmproto.EvidenceParams{ + Evidence: types.EvidenceParams{ MaxAgeNumBlocks: 20, MaxAgeDuration: 20 * time.Minute, MaxBytes: defaultEvidenceMaxBytes, @@ -360,12 +359,12 @@ func initializeStateFromValidatorSet(valSet *types.ValidatorSet, height int64) s NextValidators: valSet.CopyIncrementProposerPriority(1), LastValidators: valSet, LastHeightValidatorsChanged: 1, - ConsensusParams: tmproto.ConsensusParams{ - Block: tmproto.BlockParams{ + ConsensusParams: types.ConsensusParams{ + Block: types.BlockParams{ MaxBytes: 22020096, MaxGas: -1, }, - Evidence: tmproto.EvidenceParams{ + Evidence: types.EvidenceParams{ MaxAgeNumBlocks: 20, MaxAgeDuration: 20 * time.Minute, MaxBytes: 1000, diff --git a/light/rpc/client.go b/light/rpc/client.go index 6fc1adbca..bc83eb336 100644 --- a/light/rpc/client.go +++ b/light/rpc/client.go @@ -233,7 +233,7 @@ func (c *Client) ConsensusParams(ctx context.Context, height *int64) (*ctypes.Re } // Validate res. - if err := types.ValidateConsensusParams(res.ConsensusParams); err != nil { + if err := res.ConsensusParams.ValidateBasic(); err != nil { return nil, err } if res.BlockHeight <= 0 { @@ -247,7 +247,7 @@ func (c *Client) ConsensusParams(ctx context.Context, height *int64) (*ctypes.Re } // Verify hash. - if cH, tH := types.HashConsensusParams(res.ConsensusParams), l.ConsensusHash; !bytes.Equal(cH, tH) { + if cH, tH := res.ConsensusParams.Hash(), l.ConsensusHash; !bytes.Equal(cH, tH) { return nil, fmt.Errorf("params hash %X does not match trusted hash %X", cH, tH) } diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index bc178d370..cd68f444f 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -51,17 +51,17 @@ message RequestInfo { string version = 1; uint64 block_version = 2; uint64 p2p_version = 3; - string abci_version = 4; + string abci_version = 4; } message RequestInitChain { google.protobuf.Timestamp time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; - string chain_id = 2; - ConsensusParams consensus_params = 3; - repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; - bytes app_state_bytes = 5; - int64 initial_height = 6; + string chain_id = 2; + tendermint.types.ConsensusParams consensus_params = 3; + repeated ValidatorUpdate validators = 4 [(gogoproto.nullable) = false]; + bytes app_state_bytes = 5; + int64 initial_height = 6; } message RequestQuery { @@ -197,9 +197,9 @@ message ResponseInfo { } message ResponseInitChain { - ConsensusParams consensus_params = 1; - repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; - bytes app_hash = 3; + tendermint.types.ConsensusParams consensus_params = 1; + repeated ValidatorUpdate validators = 2 [(gogoproto.nullable) = false]; + bytes app_hash = 3; } message ResponseQuery { @@ -253,9 +253,9 @@ message ResponseDeliverTx { } message ResponseEndBlock { - repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false]; - ConsensusParams consensus_param_updates = 2; - repeated Event events = 3 + repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false]; + tendermint.types.ConsensusParams consensus_param_updates = 2; + repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"]; } @@ -318,23 +318,6 @@ message ResponseProcessProposal { //---------------------------------------- // Misc. -// ConsensusParams contains all consensus-relevant parameters -// that can be adjusted by the abci app -message ConsensusParams { - BlockParams block = 1; - tendermint.types.EvidenceParams evidence = 2; - tendermint.types.ValidatorParams validator = 3; - tendermint.types.VersionParams version = 4; -} - -// BlockParams contains limits on the block size. -message BlockParams { - // Note: must be greater than 0 - int64 max_bytes = 1; - // Note: must be greater or equal to -1 - int64 max_gas = 2; -} - message CommitInfo { int32 round = 1; repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; diff --git a/proto/tendermint/types/params.pb.go b/proto/tendermint/types/params.pb.go index d3deb576a..de33245fe 100644 --- a/proto/tendermint/types/params.pb.go +++ b/proto/tendermint/types/params.pb.go @@ -30,10 +30,10 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // ConsensusParams contains consensus critical parameters that determine the // validity of blocks. type ConsensusParams struct { - Block BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block"` - Evidence EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence"` - Validator ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator"` - Version VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version"` + Block *BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` + Evidence *EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence,omitempty"` + Validator *ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator,omitempty"` + Version *VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` } func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } @@ -69,32 +69,32 @@ func (m *ConsensusParams) XXX_DiscardUnknown() { var xxx_messageInfo_ConsensusParams proto.InternalMessageInfo -func (m *ConsensusParams) GetBlock() BlockParams { +func (m *ConsensusParams) GetBlock() *BlockParams { if m != nil { return m.Block } - return BlockParams{} + return nil } -func (m *ConsensusParams) GetEvidence() EvidenceParams { +func (m *ConsensusParams) GetEvidence() *EvidenceParams { if m != nil { return m.Evidence } - return EvidenceParams{} + return nil } -func (m *ConsensusParams) GetValidator() ValidatorParams { +func (m *ConsensusParams) GetValidator() *ValidatorParams { if m != nil { return m.Validator } - return ValidatorParams{} + return nil } -func (m *ConsensusParams) GetVersion() VersionParams { +func (m *ConsensusParams) GetVersion() *VersionParams { if m != nil { return m.Version } - return VersionParams{} + return nil } // BlockParams contains limits on the block size. @@ -105,11 +105,6 @@ type BlockParams struct { // Max gas per block. // Note: must be greater or equal to -1 MaxGas int64 `protobuf:"varint,2,opt,name=max_gas,json=maxGas,proto3" json:"max_gas,omitempty"` - // Minimum time increment between consecutive blocks (in milliseconds) If the - // block header timestamp is ahead of the system clock, decrease this value. - // - // Not exposed to the application. - TimeIotaMs int64 `protobuf:"varint,3,opt,name=time_iota_ms,json=timeIotaMs,proto3" json:"time_iota_ms,omitempty"` } func (m *BlockParams) Reset() { *m = BlockParams{} } @@ -159,13 +154,6 @@ func (m *BlockParams) GetMaxGas() int64 { return 0 } -func (m *BlockParams) GetTimeIotaMs() int64 { - if m != nil { - return m.TimeIotaMs - } - return 0 -} - // EvidenceParams determine how we handle evidence of malfeasance. type EvidenceParams struct { // Max age of evidence, in blocks. @@ -287,7 +275,7 @@ func (m *ValidatorParams) GetPubKeyTypes() []string { // VersionParams contains the ABCI application version. type VersionParams struct { - AppVersion uint64 `protobuf:"varint,1,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` + App uint64 `protobuf:"varint,1,opt,name=app,proto3" json:"app,omitempty"` } func (m *VersionParams) Reset() { *m = VersionParams{} } @@ -323,9 +311,9 @@ func (m *VersionParams) XXX_DiscardUnknown() { var xxx_messageInfo_VersionParams proto.InternalMessageInfo -func (m *VersionParams) GetAppVersion() uint64 { +func (m *VersionParams) GetApp() uint64 { if m != nil { - return m.AppVersion + return m.App } return 0 } @@ -397,41 +385,39 @@ func init() { func init() { proto.RegisterFile("tendermint/types/params.proto", fileDescriptor_e12598271a686f57) } var fileDescriptor_e12598271a686f57 = []byte{ - // 537 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x53, 0x31, 0x6f, 0xd3, 0x40, - 0x18, 0xcd, 0xd5, 0xa5, 0x4d, 0xbe, 0x34, 0x4d, 0x75, 0x42, 0x22, 0x14, 0xd5, 0x0e, 0x1e, 0x50, - 0x25, 0x24, 0x5b, 0x82, 0x01, 0xd1, 0xa5, 0xc2, 0x50, 0x15, 0x84, 0x82, 0x90, 0x05, 0x0c, 0x5d, - 0xac, 0x73, 0x72, 0xb8, 0x56, 0x73, 0x3e, 0xcb, 0x77, 0x8e, 0x92, 0x7f, 0xc1, 0xd8, 0xb1, 0x23, - 0xfc, 0x03, 0x7e, 0x42, 0xc7, 0x8e, 0x4c, 0x80, 0x92, 0x85, 0x9f, 0x81, 0x7c, 0xce, 0xe1, 0x38, - 0x65, 0xf3, 0x7d, 0xdf, 0x7b, 0xef, 0xfc, 0xde, 0xd3, 0xc1, 0x81, 0xa4, 0xc9, 0x88, 0x66, 0x2c, - 0x4e, 0xa4, 0x2b, 0x67, 0x29, 0x15, 0x6e, 0x4a, 0x32, 0xc2, 0x84, 0x93, 0x66, 0x5c, 0x72, 0xbc, - 0x57, 0xad, 0x1d, 0xb5, 0xde, 0xbf, 0x1b, 0xf1, 0x88, 0xab, 0xa5, 0x5b, 0x7c, 0x95, 0xb8, 0x7d, - 0x33, 0xe2, 0x3c, 0x1a, 0x53, 0x57, 0x9d, 0xc2, 0xfc, 0xb3, 0x3b, 0xca, 0x33, 0x22, 0x63, 0x9e, - 0x94, 0x7b, 0xfb, 0x72, 0x03, 0xba, 0x2f, 0x79, 0x22, 0x68, 0x22, 0x72, 0xf1, 0x5e, 0xdd, 0x80, - 0x9f, 0xc3, 0x9d, 0x70, 0xcc, 0x87, 0x17, 0x3d, 0xd4, 0x47, 0x87, 0xed, 0x27, 0x07, 0xce, 0xfa, - 0x5d, 0x8e, 0x57, 0xac, 0x4b, 0xb4, 0xb7, 0x79, 0xfd, 0xd3, 0x6a, 0xf8, 0x25, 0x03, 0x7b, 0xd0, - 0xa4, 0x93, 0x78, 0x44, 0x93, 0x21, 0xed, 0x6d, 0x28, 0x76, 0xff, 0x36, 0xfb, 0x64, 0x89, 0xa8, - 0x09, 0xfc, 0xe3, 0xe1, 0x13, 0x68, 0x4d, 0xc8, 0x38, 0x1e, 0x11, 0xc9, 0xb3, 0x9e, 0xa1, 0x44, - 0x1e, 0xde, 0x16, 0xf9, 0xa4, 0x21, 0x35, 0x95, 0x8a, 0x89, 0x8f, 0x61, 0x7b, 0x42, 0x33, 0x11, - 0xf3, 0xa4, 0xb7, 0xa9, 0x44, 0xac, 0xff, 0x88, 0x94, 0x80, 0x9a, 0x84, 0x66, 0xd9, 0x14, 0xda, - 0x2b, 0x3e, 0xf1, 0x03, 0x68, 0x31, 0x32, 0x0d, 0xc2, 0x99, 0xa4, 0x42, 0x25, 0x63, 0xf8, 0x4d, - 0x46, 0xa6, 0x5e, 0x71, 0xc6, 0xf7, 0x60, 0xbb, 0x58, 0x46, 0x44, 0x28, 0xdb, 0x86, 0xbf, 0xc5, - 0xc8, 0xf4, 0x94, 0x08, 0xdc, 0x87, 0x1d, 0x19, 0x33, 0x1a, 0xc4, 0x5c, 0x92, 0x80, 0x09, 0xe5, - 0xc7, 0xf0, 0xa1, 0x98, 0xbd, 0xe1, 0x92, 0x0c, 0x84, 0xfd, 0x0d, 0xc1, 0x6e, 0x3d, 0x11, 0xfc, - 0x18, 0x70, 0xa1, 0x46, 0x22, 0x1a, 0x24, 0x39, 0x0b, 0x54, 0xb4, 0xfa, 0xce, 0x2e, 0x23, 0xd3, - 0x17, 0x11, 0x7d, 0x97, 0x33, 0xf5, 0x73, 0x02, 0x0f, 0x60, 0x4f, 0x83, 0x75, 0xb7, 0xcb, 0xe8, - 0xef, 0x3b, 0x65, 0xf9, 0x8e, 0x2e, 0xdf, 0x79, 0xb5, 0x04, 0x78, 0xcd, 0xc2, 0xea, 0xe5, 0x2f, - 0x0b, 0xf9, 0xbb, 0xa5, 0x9e, 0xde, 0xd4, 0x6d, 0x1a, 0x75, 0x9b, 0xf6, 0x31, 0x74, 0xd7, 0x72, - 0xc7, 0x36, 0x74, 0xd2, 0x3c, 0x0c, 0x2e, 0xe8, 0x2c, 0x50, 0x99, 0xf6, 0x50, 0xdf, 0x38, 0x6c, - 0xf9, 0xed, 0x34, 0x0f, 0xdf, 0xd2, 0xd9, 0x87, 0x62, 0x74, 0xd4, 0xfc, 0x7e, 0x65, 0xa1, 0x3f, - 0x57, 0x16, 0xb2, 0x8f, 0xa0, 0x53, 0xcb, 0x1c, 0x5b, 0xd0, 0x26, 0x69, 0x1a, 0xe8, 0xa6, 0x0a, - 0x8f, 0x9b, 0x3e, 0x90, 0x34, 0x5d, 0xc2, 0x56, 0xb8, 0x67, 0xb0, 0xf3, 0x9a, 0x88, 0x73, 0x3a, - 0x5a, 0x52, 0x1f, 0x41, 0x57, 0x25, 0x13, 0xac, 0xd7, 0xd2, 0x51, 0xe3, 0x81, 0xee, 0xc6, 0x86, - 0x4e, 0x85, 0xab, 0x1a, 0x6a, 0x6b, 0xd4, 0x29, 0x11, 0xde, 0xc7, 0xaf, 0x73, 0x13, 0x5d, 0xcf, - 0x4d, 0x74, 0x33, 0x37, 0xd1, 0xef, 0xb9, 0x89, 0xbe, 0x2c, 0xcc, 0xc6, 0xcd, 0xc2, 0x6c, 0xfc, - 0x58, 0x98, 0x8d, 0xb3, 0x67, 0x51, 0x2c, 0xcf, 0xf3, 0xd0, 0x19, 0x72, 0xe6, 0xae, 0x3e, 0xcb, - 0xea, 0xb3, 0x7c, 0x77, 0xeb, 0x4f, 0x36, 0xdc, 0x52, 0xf3, 0xa7, 0x7f, 0x03, 0x00, 0x00, 0xff, - 0xff, 0xfe, 0xe0, 0x3d, 0x9c, 0xcd, 0x03, 0x00, 0x00, + // 506 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x93, 0xc1, 0x6e, 0xd3, 0x30, + 0x1c, 0xc6, 0xeb, 0x65, 0x6c, 0xed, 0xbf, 0x74, 0xad, 0x2c, 0x24, 0xc2, 0xd0, 0x92, 0x92, 0x03, + 0x9a, 0x34, 0x29, 0x91, 0xd8, 0x01, 0x81, 0x90, 0x26, 0x3a, 0xd0, 0x90, 0xd0, 0x10, 0x8a, 0x80, + 0xc3, 0x2e, 0x91, 0xd3, 0x98, 0x2c, 0x5a, 0x1d, 0x47, 0x71, 0x52, 0xb5, 0x37, 0x1e, 0x81, 0x23, + 0xc7, 0x1d, 0xe1, 0x0d, 0x78, 0x84, 0x1d, 0x77, 0xe4, 0x04, 0xa8, 0xbd, 0xf0, 0x18, 0x28, 0x4e, + 0x4c, 0xda, 0x8c, 0x9b, 0xed, 0xef, 0xf7, 0xd9, 0xfa, 0x3e, 0xeb, 0x0f, 0x7b, 0x19, 0x8d, 0x03, + 0x9a, 0xb2, 0x28, 0xce, 0x9c, 0x6c, 0x9e, 0x50, 0xe1, 0x24, 0x24, 0x25, 0x4c, 0xd8, 0x49, 0xca, + 0x33, 0x8e, 0x07, 0xb5, 0x6c, 0x4b, 0x79, 0xf7, 0x4e, 0xc8, 0x43, 0x2e, 0x45, 0xa7, 0x58, 0x95, + 0xdc, 0xae, 0x11, 0x72, 0x1e, 0x4e, 0xa8, 0x23, 0x77, 0x7e, 0xfe, 0xd1, 0x09, 0xf2, 0x94, 0x64, + 0x11, 0x8f, 0x4b, 0xdd, 0xfa, 0xb4, 0x01, 0xfd, 0x63, 0x1e, 0x0b, 0x1a, 0x8b, 0x5c, 0xbc, 0x95, + 0x2f, 0xe0, 0x43, 0xb8, 0xe5, 0x4f, 0xf8, 0xf8, 0x42, 0x47, 0x43, 0xb4, 0xdf, 0x7d, 0xb4, 0x67, + 0x37, 0xdf, 0xb2, 0x47, 0x85, 0x5c, 0xd2, 0x6e, 0xc9, 0xe2, 0x67, 0xd0, 0xa6, 0xd3, 0x28, 0xa0, + 0xf1, 0x98, 0xea, 0x1b, 0xd2, 0x37, 0xbc, 0xe9, 0x7b, 0x59, 0x11, 0x95, 0xf5, 0x9f, 0x03, 0x1f, + 0x41, 0x67, 0x4a, 0x26, 0x51, 0x40, 0x32, 0x9e, 0xea, 0x9a, 0xb4, 0x3f, 0xb8, 0x69, 0xff, 0xa0, + 0x90, 0xca, 0x5f, 0x7b, 0xf0, 0x13, 0xd8, 0x9e, 0xd2, 0x54, 0x44, 0x3c, 0xd6, 0x37, 0xa5, 0xdd, + 0xfc, 0x8f, 0xbd, 0x04, 0x2a, 0xb3, 0xe2, 0xad, 0x63, 0xe8, 0xae, 0xe4, 0xc1, 0xf7, 0xa1, 0xc3, + 0xc8, 0xcc, 0xf3, 0xe7, 0x19, 0x15, 0xb2, 0x01, 0xcd, 0x6d, 0x33, 0x32, 0x1b, 0x15, 0x7b, 0x7c, + 0x17, 0xb6, 0x0b, 0x31, 0x24, 0x42, 0x86, 0xd4, 0xdc, 0x2d, 0x46, 0x66, 0x27, 0x44, 0x58, 0xdf, + 0x10, 0xec, 0xac, 0xa7, 0xc3, 0x07, 0x80, 0x0b, 0x96, 0x84, 0xd4, 0x8b, 0x73, 0xe6, 0xc9, 0x9a, + 0xd4, 0x8d, 0x7d, 0x46, 0x66, 0xcf, 0x43, 0xfa, 0x26, 0x67, 0xf2, 0x69, 0x81, 0x4f, 0x61, 0xa0, + 0x60, 0xf5, 0x43, 0x55, 0x8d, 0xf7, 0xec, 0xf2, 0x0b, 0x6d, 0xf5, 0x85, 0xf6, 0x8b, 0x0a, 0x18, + 0xb5, 0xaf, 0x7e, 0x9a, 0xad, 0x2f, 0xbf, 0x4c, 0xe4, 0xee, 0x94, 0xf7, 0x29, 0x65, 0x3d, 0x84, + 0xb6, 0x1e, 0xc2, 0x3a, 0x82, 0x7e, 0xa3, 0x49, 0x6c, 0x41, 0x2f, 0xc9, 0x7d, 0xef, 0x82, 0xce, + 0x3d, 0xd9, 0x95, 0x8e, 0x86, 0xda, 0x7e, 0xc7, 0xed, 0x26, 0xb9, 0xff, 0x9a, 0xce, 0xdf, 0x15, + 0x47, 0x4f, 0xdb, 0xdf, 0x2f, 0x4d, 0xf4, 0xe7, 0xd2, 0x44, 0xd6, 0x01, 0xf4, 0xd6, 0xba, 0xc4, + 0x03, 0xd0, 0x48, 0x92, 0xc8, 0x6c, 0x9b, 0x6e, 0xb1, 0x5c, 0x81, 0xcf, 0xe0, 0xf6, 0x2b, 0x22, + 0xce, 0x69, 0x50, 0xb1, 0x0f, 0xa1, 0x2f, 0xab, 0xf0, 0x9a, 0x2d, 0xf7, 0xe4, 0xf1, 0xa9, 0xaa, + 0xda, 0x82, 0x5e, 0xcd, 0xd5, 0x85, 0x77, 0x15, 0x75, 0x42, 0xc4, 0xe8, 0xfd, 0xd7, 0x85, 0x81, + 0xae, 0x16, 0x06, 0xba, 0x5e, 0x18, 0xe8, 0xf7, 0xc2, 0x40, 0x9f, 0x97, 0x46, 0xeb, 0x7a, 0x69, + 0xb4, 0x7e, 0x2c, 0x8d, 0xd6, 0xd9, 0xe3, 0x30, 0xca, 0xce, 0x73, 0xdf, 0x1e, 0x73, 0xe6, 0xac, + 0x4e, 0x53, 0xbd, 0x2c, 0xc7, 0xa5, 0x39, 0x69, 0xfe, 0x96, 0x3c, 0x3f, 0xfc, 0x1b, 0x00, 0x00, + 0xff, 0xff, 0x5a, 0x26, 0xc7, 0xc1, 0x84, 0x03, 0x00, 0x00, } func (this *ConsensusParams) Equal(that interface{}) bool { @@ -453,16 +439,16 @@ func (this *ConsensusParams) Equal(that interface{}) bool { } else if this == nil { return false } - if !this.Block.Equal(&that1.Block) { + if !this.Block.Equal(that1.Block) { return false } - if !this.Evidence.Equal(&that1.Evidence) { + if !this.Evidence.Equal(that1.Evidence) { return false } - if !this.Validator.Equal(&that1.Validator) { + if !this.Validator.Equal(that1.Validator) { return false } - if !this.Version.Equal(&that1.Version) { + if !this.Version.Equal(that1.Version) { return false } return true @@ -492,9 +478,6 @@ func (this *BlockParams) Equal(that interface{}) bool { if this.MaxGas != that1.MaxGas { return false } - if this.TimeIotaMs != that1.TimeIotaMs { - return false - } return true } func (this *EvidenceParams) Equal(that interface{}) bool { @@ -575,7 +558,7 @@ func (this *VersionParams) Equal(that interface{}) bool { } else if this == nil { return false } - if this.AppVersion != that1.AppVersion { + if this.App != that1.App { return false } return true @@ -627,46 +610,54 @@ func (m *ConsensusParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x22 } - i-- - dAtA[i] = 0x22 - { - size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Validator != nil { + { + size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a } - i-- - dAtA[i] = 0x1a - { - size, err := m.Evidence.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Evidence != nil { + { + size, err := m.Evidence.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 - { - size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.Block != nil { + { + size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintParams(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -690,11 +681,6 @@ func (m *BlockParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.TimeIotaMs != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.TimeIotaMs)) - i-- - dAtA[i] = 0x18 - } if m.MaxGas != 0 { i = encodeVarintParams(dAtA, i, uint64(m.MaxGas)) i-- @@ -801,8 +787,8 @@ func (m *VersionParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.AppVersion != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.AppVersion)) + if m.App != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.App)) i-- dAtA[i] = 0x8 } @@ -867,7 +853,7 @@ func NewPopulatedValidatorParams(r randyParams, easy bool) *ValidatorParams { func NewPopulatedVersionParams(r randyParams, easy bool) *VersionParams { this := &VersionParams{} - this.AppVersion = uint64(uint64(r.Uint32())) + this.App = uint64(uint64(r.Uint32())) if !easy && r.Intn(10) != 0 { } return this @@ -951,14 +937,22 @@ func (m *ConsensusParams) Size() (n int) { } var l int _ = l - l = m.Block.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Evidence.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Validator.Size() - n += 1 + l + sovParams(uint64(l)) - l = m.Version.Size() - n += 1 + l + sovParams(uint64(l)) + if m.Block != nil { + l = m.Block.Size() + n += 1 + l + sovParams(uint64(l)) + } + if m.Evidence != nil { + l = m.Evidence.Size() + n += 1 + l + sovParams(uint64(l)) + } + if m.Validator != nil { + l = m.Validator.Size() + n += 1 + l + sovParams(uint64(l)) + } + if m.Version != nil { + l = m.Version.Size() + n += 1 + l + sovParams(uint64(l)) + } return n } @@ -974,9 +968,6 @@ func (m *BlockParams) Size() (n int) { if m.MaxGas != 0 { n += 1 + sovParams(uint64(m.MaxGas)) } - if m.TimeIotaMs != 0 { - n += 1 + sovParams(uint64(m.TimeIotaMs)) - } return n } @@ -1018,8 +1009,8 @@ func (m *VersionParams) Size() (n int) { } var l int _ = l - if m.AppVersion != 0 { - n += 1 + sovParams(uint64(m.AppVersion)) + if m.App != 0 { + n += 1 + sovParams(uint64(m.App)) } return n } @@ -1103,6 +1094,9 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Block == nil { + m.Block = &BlockParams{} + } if err := m.Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1136,6 +1130,9 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Evidence == nil { + m.Evidence = &EvidenceParams{} + } if err := m.Evidence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1169,6 +1166,9 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Validator == nil { + m.Validator = &ValidatorParams{} + } if err := m.Validator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1202,6 +1202,9 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Version == nil { + m.Version = &VersionParams{} + } if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1294,25 +1297,6 @@ func (m *BlockParams) Unmarshal(dAtA []byte) error { break } } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TimeIotaMs", wireType) - } - m.TimeIotaMs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TimeIotaMs |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) @@ -1568,9 +1552,9 @@ func (m *VersionParams) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AppVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field App", wireType) } - m.AppVersion = 0 + m.App = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowParams @@ -1580,7 +1564,7 @@ func (m *VersionParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.AppVersion |= uint64(b&0x7F) << shift + m.App |= uint64(b&0x7F) << shift if b < 0x80 { break } diff --git a/proto/tendermint/types/params.proto b/proto/tendermint/types/params.proto index 0de7d846f..195aa8d17 100644 --- a/proto/tendermint/types/params.proto +++ b/proto/tendermint/types/params.proto @@ -11,10 +11,10 @@ option (gogoproto.equal_all) = true; // ConsensusParams contains consensus critical parameters that determine the // validity of blocks. message ConsensusParams { - BlockParams block = 1 [(gogoproto.nullable) = false]; - EvidenceParams evidence = 2 [(gogoproto.nullable) = false]; - ValidatorParams validator = 3 [(gogoproto.nullable) = false]; - VersionParams version = 4 [(gogoproto.nullable) = false]; + BlockParams block = 1; + EvidenceParams evidence = 2; + ValidatorParams validator = 3; + VersionParams version = 4; } // BlockParams contains limits on the block size. @@ -25,11 +25,8 @@ message BlockParams { // Max gas per block. // Note: must be greater or equal to -1 int64 max_gas = 2; - // Minimum time increment between consecutive blocks (in milliseconds) If the - // block header timestamp is ahead of the system clock, decrease this value. - // - // Not exposed to the application. - int64 time_iota_ms = 3; + + reserved 3; // was TimeIotaMs see https://github.com/tendermint/tendermint/pull/5792 } // EvidenceParams determine how we handle evidence of malfeasance. @@ -68,7 +65,7 @@ message VersionParams { option (gogoproto.populate) = true; option (gogoproto.equal) = true; - uint64 app_version = 1; + uint64 app = 1; } // HashedParams is a subset of ConsensusParams. diff --git a/rpc/core/types/responses.go b/rpc/core/types/responses.go index 68f3e2b96..747f626a7 100644 --- a/rpc/core/types/responses.go +++ b/rpc/core/types/responses.go @@ -52,7 +52,7 @@ type ResultBlockResults struct { BeginBlockEvents []abci.Event `json:"begin_block_events"` EndBlockEvents []abci.Event `json:"end_block_events"` ValidatorUpdates []abci.ValidatorUpdate `json:"validator_updates"` - ConsensusParamUpdates *abci.ConsensusParams `json:"consensus_param_updates"` + ConsensusParamUpdates *tmproto.ConsensusParams `json:"consensus_param_updates"` } // NewResultCommit is a helper to initialize the ResultCommit with @@ -144,8 +144,8 @@ type ResultValidators struct { // ConsensusParams for given height type ResultConsensusParams struct { - BlockHeight int64 `json:"block_height"` - ConsensusParams tmproto.ConsensusParams `json:"consensus_params"` + BlockHeight int64 `json:"block_height"` + ConsensusParams types.ConsensusParams `json:"consensus_params"` } // Info about the consensus state. diff --git a/state/execution.go b/state/execution.go index b8e328d84..77b39a61a 100644 --- a/state/execution.go +++ b/state/execution.go @@ -11,7 +11,6 @@ import ( "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/mempool" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/proxy" "github.com/tendermint/tendermint/types" ) @@ -452,7 +451,7 @@ func extendedCommitInfo(c abci.CommitInfo, votes []*types.Vote) abci.ExtendedCom } func validateValidatorUpdates(abciUpdates []abci.ValidatorUpdate, - params tmproto.ValidatorParams) error { + params types.ValidatorParams) error { for _, valUpdate := range abciUpdates { if valUpdate.GetPower() < 0 { return fmt.Errorf("voting power can't be negative %v", valUpdate) @@ -508,13 +507,13 @@ func updateState( lastHeightParamsChanged := state.LastHeightConsensusParamsChanged if abciResponses.EndBlock.ConsensusParamUpdates != nil { // NOTE: must not mutate s.ConsensusParams - nextParams = types.UpdateConsensusParams(state.ConsensusParams, abciResponses.EndBlock.ConsensusParamUpdates) - err := types.ValidateConsensusParams(nextParams) + nextParams = state.ConsensusParams.Update(abciResponses.EndBlock.ConsensusParamUpdates) + err := nextParams.ValidateBasic() if err != nil { return state, fmt.Errorf("error updating consensus params: %v", err) } - state.Version.Consensus.App = nextParams.Version.AppVersion + state.Version.Consensus.App = nextParams.Version.App // Change results from this height but only applies to the next height. lastHeightParamsChanged = header.Height + 1 diff --git a/state/execution_test.go b/state/execution_test.go index c866a5372..007489ed2 100644 --- a/state/execution_test.go +++ b/state/execution_test.go @@ -19,7 +19,6 @@ import ( "github.com/tendermint/tendermint/crypto/tmhash" "github.com/tendermint/tendermint/libs/log" mpmocks "github.com/tendermint/tendermint/mempool/mocks" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmversion "github.com/tendermint/tendermint/proto/tendermint/version" "github.com/tendermint/tendermint/proxy" pmocks "github.com/tendermint/tendermint/proxy/mocks" @@ -332,13 +331,13 @@ func TestValidateValidatorUpdates(t *testing.T) { pk2, err := cryptoenc.PubKeyToProto(pubkey2) assert.NoError(t, err) - defaultValidatorParams := tmproto.ValidatorParams{PubKeyTypes: []string{types.ABCIPubKeyTypeEd25519}} + defaultValidatorParams := types.ValidatorParams{PubKeyTypes: []string{types.ABCIPubKeyTypeEd25519}} testCases := []struct { name string abciUpdates []abci.ValidatorUpdate - validatorParams tmproto.ValidatorParams + validatorParams types.ValidatorParams shouldErr bool }{ diff --git a/state/export_test.go b/state/export_test.go index 56c3d764c..4f861f207 100644 --- a/state/export_test.go +++ b/state/export_test.go @@ -5,7 +5,6 @@ import ( abci "github.com/tendermint/tendermint/abci/types" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types" ) @@ -36,7 +35,7 @@ func UpdateState( // ValidateValidatorUpdates is an alias for validateValidatorUpdates exported // from execution.go, exclusively and explicitly for testing. -func ValidateValidatorUpdates(abciUpdates []abci.ValidatorUpdate, params tmproto.ValidatorParams) error { +func ValidateValidatorUpdates(abciUpdates []abci.ValidatorUpdate, params types.ValidatorParams) error { return validateValidatorUpdates(abciUpdates, params) } diff --git a/state/helpers_test.go b/state/helpers_test.go index d293cdeb4..ec5f21a1c 100644 --- a/state/helpers_test.go +++ b/state/helpers_test.go @@ -23,7 +23,7 @@ import ( type paramsChangeTestCase struct { height int64 - params tmproto.ConsensusParams + params types.ConsensusParams } func newTestApp() proxy.AppConns { @@ -197,7 +197,7 @@ func makeHeaderPartsResponsesParams( block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit)) abciResponses := &tmstate.ABCIResponses{ BeginBlock: &abci.ResponseBeginBlock{}, - EndBlock: &abci.ResponseEndBlock{ConsensusParamUpdates: types.TM2PB.ConsensusParams(¶ms)}, + EndBlock: &abci.ResponseEndBlock{ConsensusParamUpdates: ¶ms}, } return block.Header, types.BlockID{Hash: block.Hash(), PartSetHeader: types.PartSetHeader{}}, abciResponses } @@ -244,9 +244,9 @@ func (app *testApp) BeginBlock(req abci.RequestBeginBlock) abci.ResponseBeginBlo func (app *testApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock { return abci.ResponseEndBlock{ ValidatorUpdates: app.ValidatorUpdates, - ConsensusParamUpdates: &abci.ConsensusParams{ + ConsensusParamUpdates: &tmproto.ConsensusParams{ Version: &tmproto.VersionParams{ - AppVersion: 1}}} + App: 1}}} } func (app *testApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { diff --git a/state/mocks/store.go b/state/mocks/store.go index 13474c023..d31f5d8c3 100644 --- a/state/mocks/store.go +++ b/state/mocks/store.go @@ -8,9 +8,7 @@ import ( tendermintstate "github.com/tendermint/tendermint/proto/tendermint/state" - tenderminttypes "github.com/tendermint/tendermint/types" - - types "github.com/tendermint/tendermint/proto/tendermint/types" + types "github.com/tendermint/tendermint/types" ) // Store is an autogenerated mock type for the Store type @@ -112,18 +110,18 @@ func (_m *Store) LoadConsensusParams(_a0 int64) (types.ConsensusParams, error) { } // LoadFromDBOrGenesisDoc provides a mock function with given fields: _a0 -func (_m *Store) LoadFromDBOrGenesisDoc(_a0 *tenderminttypes.GenesisDoc) (state.State, error) { +func (_m *Store) LoadFromDBOrGenesisDoc(_a0 *types.GenesisDoc) (state.State, error) { ret := _m.Called(_a0) var r0 state.State - if rf, ok := ret.Get(0).(func(*tenderminttypes.GenesisDoc) state.State); ok { + if rf, ok := ret.Get(0).(func(*types.GenesisDoc) state.State); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(state.State) } var r1 error - if rf, ok := ret.Get(1).(func(*tenderminttypes.GenesisDoc) error); ok { + if rf, ok := ret.Get(1).(func(*types.GenesisDoc) error); ok { r1 = rf(_a0) } else { r1 = ret.Error(1) @@ -154,15 +152,15 @@ func (_m *Store) LoadFromDBOrGenesisFile(_a0 string) (state.State, error) { } // LoadValidators provides a mock function with given fields: _a0 -func (_m *Store) LoadValidators(_a0 int64) (*tenderminttypes.ValidatorSet, error) { +func (_m *Store) LoadValidators(_a0 int64) (*types.ValidatorSet, error) { ret := _m.Called(_a0) - var r0 *tenderminttypes.ValidatorSet - if rf, ok := ret.Get(0).(func(int64) *tenderminttypes.ValidatorSet); ok { + var r0 *types.ValidatorSet + if rf, ok := ret.Get(0).(func(int64) *types.ValidatorSet); ok { r0 = rf(_a0) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*tenderminttypes.ValidatorSet) + r0 = ret.Get(0).(*types.ValidatorSet) } } diff --git a/state/rollback.go b/state/rollback.go index 388a597b1..c4686015b 100644 --- a/state/rollback.go +++ b/state/rollback.go @@ -77,7 +77,7 @@ func Rollback(bs BlockStore, ss Store) (int64, []byte, error) { Version: tmstate.Version{ Consensus: tmversion.Consensus{ Block: version.BlockProtocol, - App: previousParams.Version.AppVersion, + App: previousParams.Version.App, }, Software: version.TMCoreSemVer, }, diff --git a/state/rollback_test.go b/state/rollback_test.go index 3428b0ef8..fa727046d 100644 --- a/state/rollback_test.go +++ b/state/rollback_test.go @@ -29,7 +29,7 @@ func TestRollback(t *testing.T) { // perform the rollback over a version bump newParams := types.DefaultConsensusParams() - newParams.Version.AppVersion = 11 + newParams.Version.App = 11 newParams.Block.MaxBytes = 1000 nextState := initialState.Copy() nextState.LastBlockHeight = nextHeight @@ -119,7 +119,7 @@ func setupStateStore(t *testing.T, height int64) state.Store { valSet, _ := types.RandValidatorSet(5, 10) params := types.DefaultConsensusParams() - params.Version.AppVersion = 10 + params.Version.App = 10 initialState := state.State{ Version: tmstate.Version{ diff --git a/state/state.go b/state/state.go index f67ded422..c955b4caf 100644 --- a/state/state.go +++ b/state/state.go @@ -10,7 +10,6 @@ import ( "github.com/gogo/protobuf/proto" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmversion "github.com/tendermint/tendermint/proto/tendermint/version" "github.com/tendermint/tendermint/types" tmtime "github.com/tendermint/tendermint/types/time" @@ -70,7 +69,7 @@ type State struct { // Consensus parameters used for validating blocks. // Changes returned by EndBlock and updated after Commit. - ConsensusParams tmproto.ConsensusParams + ConsensusParams types.ConsensusParams LastHeightConsensusParamsChanged int64 // Merkle root of the results from executing prev block @@ -167,7 +166,7 @@ func (state *State) ToProto() (*tmstate.State, error) { } sm.LastHeightValidatorsChanged = state.LastHeightValidatorsChanged - sm.ConsensusParams = state.ConsensusParams + sm.ConsensusParams = state.ConsensusParams.ToProto() sm.LastHeightConsensusParamsChanged = state.LastHeightConsensusParamsChanged sm.LastResultsHash = state.LastResultsHash sm.AppHash = state.AppHash @@ -218,7 +217,7 @@ func FromProto(pb *tmstate.State) (*State, error) { //nolint:golint } state.LastHeightValidatorsChanged = pb.LastHeightValidatorsChanged - state.ConsensusParams = pb.ConsensusParams + state.ConsensusParams = types.ConsensusParamsFromProto(pb.ConsensusParams) state.LastHeightConsensusParamsChanged = pb.LastHeightConsensusParamsChanged state.LastResultsHash = pb.LastResultsHash state.AppHash = pb.AppHash @@ -256,7 +255,7 @@ func (state State) MakeBlock( state.Version.Consensus, state.ChainID, timestamp, state.LastBlockID, state.Validators.Hash(), state.NextValidators.Hash(), - types.HashConsensusParams(state.ConsensusParams), state.AppHash, state.LastResultsHash, + state.ConsensusParams.Hash(), state.AppHash, state.LastResultsHash, proposerAddress, ) diff --git a/state/state_test.go b/state/state_test.go index e943c37a0..f74df6eb4 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -19,7 +19,6 @@ import ( cryptoenc "github.com/tendermint/tendermint/crypto/encoding" tmrand "github.com/tendermint/tendermint/libs/rand" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sm "github.com/tendermint/tendermint/state" sf "github.com/tendermint/tendermint/state/test/factory" "github.com/tendermint/tendermint/types" @@ -1030,12 +1029,12 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) { // Each valset is just one validator. // create list of them. - params := make([]tmproto.ConsensusParams, N+1) + params := make([]types.ConsensusParams, N+1) params[0] = state.ConsensusParams for i := 1; i < N+1; i++ { params[i] = *types.DefaultConsensusParams() params[i].Block.MaxBytes += int64(i) - params[i].Block.TimeIotaMs = 10 + } // Build the params history by running updateState @@ -1051,7 +1050,7 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) { changeIndex++ cp = params[changeIndex] } - header, blockID, responses := makeHeaderPartsResponsesParams(t, state, cp) + header, blockID, responses := makeHeaderPartsResponsesParams(t, state, cp.ToProto()) validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.EndBlock.ValidatorUpdates) require.NoError(t, err) state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates) diff --git a/state/store.go b/state/store.go index 428460db8..2c219dd10 100644 --- a/state/store.go +++ b/state/store.go @@ -59,7 +59,7 @@ type Store interface { // LoadABCIResponses loads the abciResponse for a given height LoadABCIResponses(int64) (*tmstate.ABCIResponses, error) // LoadConsensusParams loads the consensus params for a given height - LoadConsensusParams(int64) (tmproto.ConsensusParams, error) + LoadConsensusParams(int64) (types.ConsensusParams, error) // Save overwrites the previous state with the updated one Save(State) error // SaveABCIResponses saves ABCIResponses for a given height @@ -298,10 +298,11 @@ func (store dbStore) PruneStates(from int64, to int64) error { } if p.ConsensusParams.Equal(&tmproto.ConsensusParams{}) { - p.ConsensusParams, err = store.LoadConsensusParams(h) + params, err := store.LoadConsensusParams(h) if err != nil { return err } + p.ConsensusParams = params.ToProto() p.LastHeightChanged = h bz, err := p.Marshal() @@ -526,15 +527,17 @@ func (store dbStore) saveValidatorsInfo(height, lastHeightChanged int64, valSet // ConsensusParamsInfo represents the latest consensus params, or the last height it changed // LoadConsensusParams loads the ConsensusParams for a given height. -func (store dbStore) LoadConsensusParams(height int64) (tmproto.ConsensusParams, error) { - empty := tmproto.ConsensusParams{} - +func (store dbStore) LoadConsensusParams(height int64) (types.ConsensusParams, error) { + var ( + empty = types.ConsensusParams{} + emptypb = tmproto.ConsensusParams{} + ) paramsInfo, err := store.loadConsensusParamsInfo(height) if err != nil { return empty, fmt.Errorf("could not find consensus params for height #%d: %w", height, err) } - if paramsInfo.ConsensusParams.Equal(&empty) { + if paramsInfo.ConsensusParams.Equal(&emptypb) { paramsInfo2, err := store.loadConsensusParamsInfo(paramsInfo.LastHeightChanged) if err != nil { return empty, fmt.Errorf( @@ -548,7 +551,7 @@ func (store dbStore) LoadConsensusParams(height int64) (tmproto.ConsensusParams, paramsInfo = paramsInfo2 } - return paramsInfo.ConsensusParams, nil + return types.ConsensusParamsFromProto(paramsInfo.ConsensusParams), nil } func (store dbStore) loadConsensusParamsInfo(height int64) (*tmstate.ConsensusParamsInfo, error) { @@ -575,13 +578,13 @@ func (store dbStore) loadConsensusParamsInfo(height int64) (*tmstate.ConsensusPa // It should be called from s.Save(), right before the state itself is persisted. // If the consensus params did not change after processing the latest block, // only the last height for which they changed is persisted. -func (store dbStore) saveConsensusParamsInfo(nextHeight, changeHeight int64, params tmproto.ConsensusParams) error { +func (store dbStore) saveConsensusParamsInfo(nextHeight, changeHeight int64, params types.ConsensusParams) error { paramsInfo := &tmstate.ConsensusParamsInfo{ LastHeightChanged: changeHeight, } if changeHeight == nextHeight { - paramsInfo.ConsensusParams = params + paramsInfo.ConsensusParams = params.ToProto() } bz, err := paramsInfo.Marshal() if err != nil { diff --git a/state/store_test.go b/state/store_test.go index e43921519..721172b94 100644 --- a/state/store_test.go +++ b/state/store_test.go @@ -16,7 +16,6 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" tmrand "github.com/tendermint/tendermint/libs/rand" tmstate "github.com/tendermint/tendermint/proto/tendermint/state" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sm "github.com/tendermint/tendermint/state" "github.com/tendermint/tendermint/types" ) @@ -133,8 +132,8 @@ func TestPruneStates(t *testing.T) { LastBlockHeight: h - 1, Validators: validatorSet, NextValidators: validatorSet, - ConsensusParams: tmproto.ConsensusParams{ - Block: tmproto.BlockParams{MaxBytes: 10e6}, + ConsensusParams: types.ConsensusParams{ + Block: types.BlockParams{MaxBytes: 10e6}, }, LastHeightValidatorsChanged: valsChanged, LastHeightConsensusParamsChanged: paramsChanged, @@ -182,9 +181,10 @@ func TestPruneStates(t *testing.T) { params, err := stateStore.LoadConsensusParams(h) if expectParams[h] { require.NoError(t, err, "params height %v", h) - require.False(t, params.Equal(&tmproto.ConsensusParams{})) + require.NotEmpty(t, params) } else { require.Error(t, err, "params height %v", h) + require.Empty(t, params) } abci, err := stateStore.LoadABCIResponses(h) diff --git a/state/validation.go b/state/validation.go index 0ebe37bf9..9057b6c48 100644 --- a/state/validation.go +++ b/state/validation.go @@ -57,10 +57,9 @@ func validateBlock(state State, block *types.Block) error { block.AppHash, ) } - hashCP := types.HashConsensusParams(state.ConsensusParams) - if !bytes.Equal(block.ConsensusHash, hashCP) { + if !bytes.Equal(block.ConsensusHash, state.ConsensusParams.Hash()) { return fmt.Errorf("wrong Block.Header.ConsensusHash. Expected %X, got %v", - hashCP, + state.ConsensusParams.Hash(), block.ConsensusHash, ) } diff --git a/test/e2e/runner/setup.go b/test/e2e/runner/setup.go index 87d749618..09b87e226 100644 --- a/test/e2e/runner/setup.go +++ b/test/e2e/runner/setup.go @@ -200,7 +200,7 @@ func MakeGenesis(testnet *e2e.Testnet) (types.GenesisDoc, error) { InitialHeight: testnet.InitialHeight, } // set the app version to 1 - genesis.ConsensusParams.Version.AppVersion = 1 + genesis.ConsensusParams.Version.App = 1 for validator, power := range testnet.Validators { genesis.Validators = append(genesis.Validators, types.GenesisValidator{ Name: validator.Name, diff --git a/types/genesis.go b/types/genesis.go index 974bb8112..b75bce13e 100644 --- a/types/genesis.go +++ b/types/genesis.go @@ -12,7 +12,6 @@ import ( tmbytes "github.com/tendermint/tendermint/libs/bytes" tmjson "github.com/tendermint/tendermint/libs/json" tmos "github.com/tendermint/tendermint/libs/os" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtime "github.com/tendermint/tendermint/types/time" ) @@ -37,13 +36,13 @@ type GenesisValidator struct { // GenesisDoc defines the initial conditions for a tendermint blockchain, in particular its validator set. type GenesisDoc struct { - GenesisTime time.Time `json:"genesis_time"` - ChainID string `json:"chain_id"` - InitialHeight int64 `json:"initial_height"` - ConsensusParams *tmproto.ConsensusParams `json:"consensus_params,omitempty"` - Validators []GenesisValidator `json:"validators,omitempty"` - AppHash tmbytes.HexBytes `json:"app_hash"` - AppState json.RawMessage `json:"app_state,omitempty"` + GenesisTime time.Time `json:"genesis_time"` + ChainID string `json:"chain_id"` + InitialHeight int64 `json:"initial_height"` + ConsensusParams *ConsensusParams `json:"consensus_params,omitempty"` + Validators []GenesisValidator `json:"validators,omitempty"` + AppHash tmbytes.HexBytes `json:"app_hash"` + AppState json.RawMessage `json:"app_state,omitempty"` } // SaveAs is a utility method for saving GenensisDoc as a JSON file. @@ -83,7 +82,7 @@ func (genDoc *GenesisDoc) ValidateAndComplete() error { if genDoc.ConsensusParams == nil { genDoc.ConsensusParams = DefaultConsensusParams() - } else if err := ValidateConsensusParams(*genDoc.ConsensusParams); err != nil { + } else if err := genDoc.ConsensusParams.ValidateBasic(); err != nil { return err } diff --git a/types/params.go b/types/params.go index 16c85aa55..246037d85 100644 --- a/types/params.go +++ b/types/params.go @@ -5,7 +5,8 @@ import ( "fmt" "time" - abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/tendermint/tendermint/crypto/secp256k1" "github.com/tendermint/tendermint/crypto/tmhash" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) @@ -19,11 +20,52 @@ const ( // MaxBlockPartsCount is the maximum number of block parts. MaxBlockPartsCount = (MaxBlockSizeBytes / BlockPartSizeBytes) + 1 + + ABCIPubKeyTypeEd25519 = ed25519.KeyType + ABCIPubKeyTypeSecp256k1 = secp256k1.KeyType ) +var ABCIPubKeyTypesToNames = map[string]string{ + ABCIPubKeyTypeEd25519: ed25519.PubKeyName, + ABCIPubKeyTypeSecp256k1: secp256k1.PubKeyName, +} + +// ConsensusParams contains consensus critical parameters that determine the +// validity of blocks. +type ConsensusParams struct { + Block BlockParams `json:"block"` + Evidence EvidenceParams `json:"evidence"` + Validator ValidatorParams `json:"validator"` + Version VersionParams `json:"version"` +} + +// BlockParams define limits on the block size and gas plus minimum time +// between blocks. +type BlockParams struct { + MaxBytes int64 `json:"max_bytes"` + MaxGas int64 `json:"max_gas"` +} + +// EvidenceParams determine how we handle evidence of malfeasance. +type EvidenceParams struct { + MaxAgeNumBlocks int64 `json:"max_age_num_blocks"` // only accept new evidence more recent than this + MaxAgeDuration time.Duration `json:"max_age_duration"` + MaxBytes int64 `json:"max_bytes"` +} + +// ValidatorParams restrict the public key types validators can use. +// NOTE: uses ABCI pubkey naming, not Amino names. +type ValidatorParams struct { + PubKeyTypes []string `json:"pub_key_types"` +} + +type VersionParams struct { + App uint64 `json:"app"` +} + // DefaultConsensusParams returns a default ConsensusParams. -func DefaultConsensusParams() *tmproto.ConsensusParams { - return &tmproto.ConsensusParams{ +func DefaultConsensusParams() *ConsensusParams { + return &ConsensusParams{ Block: DefaultBlockParams(), Evidence: DefaultEvidenceParams(), Validator: DefaultValidatorParams(), @@ -32,17 +74,16 @@ func DefaultConsensusParams() *tmproto.ConsensusParams { } // DefaultBlockParams returns a default BlockParams. -func DefaultBlockParams() tmproto.BlockParams { - return tmproto.BlockParams{ - MaxBytes: 22020096, // 21MB - MaxGas: -1, - TimeIotaMs: 1000, // 1s +func DefaultBlockParams() BlockParams { + return BlockParams{ + MaxBytes: 22020096, // 21MB + MaxGas: -1, } } // DefaultEvidenceParams returns a default EvidenceParams. -func DefaultEvidenceParams() tmproto.EvidenceParams { - return tmproto.EvidenceParams{ +func DefaultEvidenceParams() EvidenceParams { + return EvidenceParams{ MaxAgeNumBlocks: 100000, // 27.8 hrs at 1block/s MaxAgeDuration: 48 * time.Hour, MaxBytes: 1048576, // 1MB @@ -51,19 +92,19 @@ func DefaultEvidenceParams() tmproto.EvidenceParams { // DefaultValidatorParams returns a default ValidatorParams, which allows // only ed25519 pubkeys. -func DefaultValidatorParams() tmproto.ValidatorParams { - return tmproto.ValidatorParams{ +func DefaultValidatorParams() ValidatorParams { + return ValidatorParams{ PubKeyTypes: []string{ABCIPubKeyTypeEd25519}, } } -func DefaultVersionParams() tmproto.VersionParams { - return tmproto.VersionParams{ - AppVersion: 0, +func DefaultVersionParams() VersionParams { + return VersionParams{ + App: 0, } } -func IsValidPubkeyType(params tmproto.ValidatorParams, pubkeyType string) bool { +func IsValidPubkeyType(params ValidatorParams, pubkeyType string) bool { for i := 0; i < len(params.PubKeyTypes); i++ { if params.PubKeyTypes[i] == pubkeyType { return true @@ -74,7 +115,7 @@ func IsValidPubkeyType(params tmproto.ValidatorParams, pubkeyType string) bool { // Validate validates the ConsensusParams to ensure all values are within their // allowed limits, and returns an error if they are not. -func ValidateConsensusParams(params tmproto.ConsensusParams) error { +func (params ConsensusParams) ValidateBasic() error { if params.Block.MaxBytes <= 0 { return fmt.Errorf("block.MaxBytes must be greater than 0. Got %d", params.Block.MaxBytes) @@ -89,11 +130,6 @@ func ValidateConsensusParams(params tmproto.ConsensusParams) error { params.Block.MaxGas) } - if params.Block.TimeIotaMs <= 0 { - return fmt.Errorf("block.TimeIotaMs must be greater than 0. Got %v", - params.Block.TimeIotaMs) - } - if params.Evidence.MaxAgeNumBlocks <= 0 { return fmt.Errorf("evidence.MaxAgeNumBlocks must be greater than 0. Got %d", params.Evidence.MaxAgeNumBlocks) @@ -134,7 +170,7 @@ func ValidateConsensusParams(params tmproto.ConsensusParams) error { // Only the Block.MaxBytes and Block.MaxGas are included in the hash. // This allows the ConsensusParams to evolve more without breaking the block // protocol. No need for a Merkle tree here, just a small struct to hash. -func HashConsensusParams(params tmproto.ConsensusParams) []byte { +func (params ConsensusParams) Hash() []byte { hasher := tmhash.New() hp := tmproto.HashedParams{ @@ -156,7 +192,7 @@ func HashConsensusParams(params tmproto.ConsensusParams) []byte { // Update returns a copy of the params with updates from the non-zero fields of p2. // NOTE: note: must not modify the original -func UpdateConsensusParams(params tmproto.ConsensusParams, params2 *abci.ConsensusParams) tmproto.ConsensusParams { +func (params ConsensusParams) Update(params2 *tmproto.ConsensusParams) ConsensusParams { res := params // explicit copy if params2 == nil { @@ -179,7 +215,47 @@ func UpdateConsensusParams(params tmproto.ConsensusParams, params2 *abci.Consens res.Validator.PubKeyTypes = append([]string{}, params2.Validator.PubKeyTypes...) } if params2.Version != nil { - res.Version.AppVersion = params2.Version.AppVersion + res.Version.App = params2.Version.App } return res } + +func (params *ConsensusParams) ToProto() tmproto.ConsensusParams { + return tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ + MaxBytes: params.Block.MaxBytes, + MaxGas: params.Block.MaxGas, + }, + Evidence: &tmproto.EvidenceParams{ + MaxAgeNumBlocks: params.Evidence.MaxAgeNumBlocks, + MaxAgeDuration: params.Evidence.MaxAgeDuration, + MaxBytes: params.Evidence.MaxBytes, + }, + Validator: &tmproto.ValidatorParams{ + PubKeyTypes: params.Validator.PubKeyTypes, + }, + Version: &tmproto.VersionParams{ + App: params.Version.App, + }, + } +} + +func ConsensusParamsFromProto(pbParams tmproto.ConsensusParams) ConsensusParams { + return ConsensusParams{ + Block: BlockParams{ + MaxBytes: pbParams.Block.MaxBytes, + MaxGas: pbParams.Block.MaxGas, + }, + Evidence: EvidenceParams{ + MaxAgeNumBlocks: pbParams.Evidence.MaxAgeNumBlocks, + MaxAgeDuration: pbParams.Evidence.MaxAgeDuration, + MaxBytes: pbParams.Evidence.MaxBytes, + }, + Validator: ValidatorParams{ + PubKeyTypes: pbParams.Validator.PubKeyTypes, + }, + Version: VersionParams{ + App: pbParams.Version.App, + }, + } +} diff --git a/types/params_test.go b/types/params_test.go index f3a71ca50..c3ef682b4 100644 --- a/types/params_test.go +++ b/types/params_test.go @@ -8,7 +8,6 @@ import ( "github.com/stretchr/testify/assert" - abci "github.com/tendermint/tendermint/abci/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) @@ -19,77 +18,73 @@ var ( func TestConsensusParamsValidation(t *testing.T) { testCases := []struct { - params tmproto.ConsensusParams + params ConsensusParams valid bool }{ // test block params - 0: {makeParams(1, 0, 10, 2, 0, valEd25519), true}, - 1: {makeParams(0, 0, 10, 2, 0, valEd25519), false}, - 2: {makeParams(47*1024*1024, 0, 10, 2, 0, valEd25519), true}, - 3: {makeParams(10, 0, 10, 2, 0, valEd25519), true}, - 4: {makeParams(100*1024*1024, 0, 10, 2, 0, valEd25519), true}, - 5: {makeParams(101*1024*1024, 0, 10, 2, 0, valEd25519), false}, - 6: {makeParams(1024*1024*1024, 0, 10, 2, 0, valEd25519), false}, - 7: {makeParams(1024*1024*1024, 0, 10, -1, 0, valEd25519), false}, - 8: {makeParams(1, 0, -10, 2, 0, valEd25519), false}, + 0: {makeParams(1, 0, 2, 0, valEd25519), true}, + 1: {makeParams(0, 0, 2, 0, valEd25519), false}, + 2: {makeParams(47*1024*1024, 0, 2, 0, valEd25519), true}, + 3: {makeParams(10, 0, 2, 0, valEd25519), true}, + 4: {makeParams(100*1024*1024, 0, 2, 0, valEd25519), true}, + 5: {makeParams(101*1024*1024, 0, 2, 0, valEd25519), false}, + 6: {makeParams(1024*1024*1024, 0, 2, 0, valEd25519), false}, // test evidence params - 9: {makeParams(1, 0, 10, 0, 0, valEd25519), false}, - 10: {makeParams(1, 0, 10, 2, 2, valEd25519), false}, - 11: {makeParams(1000, 0, 10, 2, 1, valEd25519), true}, - 12: {makeParams(1, 0, 10, -1, 0, valEd25519), false}, + 7: {makeParams(1, 0, 0, 0, valEd25519), false}, + 8: {makeParams(1, 0, 2, 2, valEd25519), false}, + 9: {makeParams(1000, 0, 2, 1, valEd25519), true}, + 10: {makeParams(1, 0, -1, 0, valEd25519), false}, // test no pubkey type provided - 13: {makeParams(1, 0, 10, 2, 0, []string{}), false}, + 11: {makeParams(1, 0, 2, 0, []string{}), false}, // test invalid pubkey type provided - 14: {makeParams(1, 0, 10, 2, 0, []string{"potatoes make good pubkeys"}), false}, + 12: {makeParams(1, 0, 2, 0, []string{"potatoes make good pubkeys"}), false}, } for i, tc := range testCases { if tc.valid { - assert.NoErrorf(t, ValidateConsensusParams(tc.params), "expected no error for valid params (#%d)", i) + assert.NoErrorf(t, tc.params.ValidateBasic(), "expected no error for valid params (#%d)", i) } else { - assert.Errorf(t, ValidateConsensusParams(tc.params), "expected error for non valid params (#%d)", i) + assert.Errorf(t, tc.params.ValidateBasic(), "expected error for non valid params (#%d)", i) } } } func makeParams( blockBytes, blockGas int64, - blockTimeIotaMs int64, evidenceAge int64, maxEvidenceBytes int64, pubkeyTypes []string, -) tmproto.ConsensusParams { - return tmproto.ConsensusParams{ - Block: tmproto.BlockParams{ - MaxBytes: blockBytes, - MaxGas: blockGas, - TimeIotaMs: blockTimeIotaMs, +) ConsensusParams { + return ConsensusParams{ + Block: BlockParams{ + MaxBytes: blockBytes, + MaxGas: blockGas, }, - Evidence: tmproto.EvidenceParams{ + Evidence: EvidenceParams{ MaxAgeNumBlocks: evidenceAge, MaxAgeDuration: time.Duration(evidenceAge), MaxBytes: maxEvidenceBytes, }, - Validator: tmproto.ValidatorParams{ + Validator: ValidatorParams{ PubKeyTypes: pubkeyTypes, }, } } func TestConsensusParamsHash(t *testing.T) { - params := []tmproto.ConsensusParams{ - makeParams(4, 2, 10, 3, 1, valEd25519), - makeParams(1, 4, 10, 3, 1, valEd25519), - makeParams(1, 2, 10, 4, 1, valEd25519), - makeParams(2, 5, 10, 7, 1, valEd25519), - makeParams(1, 7, 10, 6, 1, valEd25519), - makeParams(9, 5, 10, 4, 1, valEd25519), - makeParams(7, 8, 10, 9, 1, valEd25519), - makeParams(4, 6, 10, 5, 1, valEd25519), + params := []ConsensusParams{ + makeParams(4, 2, 3, 1, valEd25519), + makeParams(1, 4, 3, 1, valEd25519), + makeParams(1, 2, 4, 1, valEd25519), + makeParams(2, 5, 7, 1, valEd25519), + makeParams(1, 7, 6, 1, valEd25519), + makeParams(9, 5, 4, 1, valEd25519), + makeParams(7, 8, 9, 1, valEd25519), + makeParams(4, 6, 5, 1, valEd25519), } hashes := make([][]byte, len(params)) for i := range params { - hashes[i] = HashConsensusParams(params[i]) + hashes[i] = params[i].Hash() } // make sure there are no duplicates... @@ -104,21 +99,21 @@ func TestConsensusParamsHash(t *testing.T) { func TestConsensusParamsUpdate(t *testing.T) { testCases := []struct { - params tmproto.ConsensusParams - updates *abci.ConsensusParams - updatedParams tmproto.ConsensusParams + params ConsensusParams + updates *tmproto.ConsensusParams + updatedParams ConsensusParams }{ // empty updates { - makeParams(1, 2, 10, 3, 0, valEd25519), - &abci.ConsensusParams{}, - makeParams(1, 2, 10, 3, 0, valEd25519), + makeParams(1, 2, 3, 0, valEd25519), + &tmproto.ConsensusParams{}, + makeParams(1, 2, 3, 0, valEd25519), }, // fine updates { - makeParams(1, 2, 10, 3, 0, valEd25519), - &abci.ConsensusParams{ - Block: &abci.BlockParams{ + makeParams(1, 2, 3, 0, valEd25519), + &tmproto.ConsensusParams{ + Block: &tmproto.BlockParams{ MaxBytes: 100, MaxGas: 200, }, @@ -131,21 +126,44 @@ func TestConsensusParamsUpdate(t *testing.T) { PubKeyTypes: valSecp256k1, }, }, - makeParams(100, 200, 10, 300, 50, valSecp256k1), + makeParams(100, 200, 300, 50, valSecp256k1), }, } + for _, tc := range testCases { - assert.Equal(t, tc.updatedParams, UpdateConsensusParams(tc.params, tc.updates)) + assert.Equal(t, tc.updatedParams, tc.params.Update(tc.updates)) } } func TestConsensusParamsUpdate_AppVersion(t *testing.T) { - params := makeParams(1, 2, 10, 3, 0, valEd25519) + params := makeParams(1, 2, 3, 0, valEd25519) - assert.EqualValues(t, 0, params.Version.AppVersion) + assert.EqualValues(t, 0, params.Version.App) - updated := UpdateConsensusParams(params, - &abci.ConsensusParams{Version: &tmproto.VersionParams{AppVersion: 1}}) + updated := params.Update( + &tmproto.ConsensusParams{Version: &tmproto.VersionParams{App: 1}}) - assert.EqualValues(t, 1, updated.Version.AppVersion) + assert.EqualValues(t, 1, updated.Version.App) +} + +func TestProto(t *testing.T) { + params := []ConsensusParams{ + makeParams(4, 2, 3, 1, valEd25519), + makeParams(1, 4, 3, 1, valEd25519), + makeParams(1, 2, 4, 1, valEd25519), + makeParams(2, 5, 7, 1, valEd25519), + makeParams(1, 7, 6, 1, valEd25519), + makeParams(9, 5, 4, 1, valEd25519), + makeParams(7, 8, 9, 1, valEd25519), + makeParams(4, 6, 5, 1, valEd25519), + } + + for i := range params { + pbParams := params[i].ToProto() + + oriParams := ConsensusParamsFromProto(pbParams) + + assert.Equal(t, params[i], oriParams) + + } } diff --git a/types/protobuf.go b/types/protobuf.go index 1ee094a9f..70b48da18 100644 --- a/types/protobuf.go +++ b/types/protobuf.go @@ -3,27 +3,10 @@ package types import ( abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" cryptoenc "github.com/tendermint/tendermint/crypto/encoding" - "github.com/tendermint/tendermint/crypto/secp256k1" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) -//------------------------------------------------------- -// Use strings to distinguish types in ABCI messages - -const ( - ABCIPubKeyTypeEd25519 = ed25519.KeyType - ABCIPubKeyTypeSecp256k1 = secp256k1.KeyType -) - -// TODO: Make non-global by allowing for registration of more pubkey types - -var ABCIPubKeyTypesToNames = map[string]string{ - ABCIPubKeyTypeEd25519: ed25519.PubKeyName, - ABCIPubKeyTypeSecp256k1: secp256k1.PubKeyName, -} - //------------------------------------------------------- // TM2PB is used for converting Tendermint ABCI to protobuf ABCI. @@ -97,17 +80,6 @@ func (tm2pb) ValidatorUpdates(vals *ValidatorSet) []abci.ValidatorUpdate { return validators } -func (tm2pb) ConsensusParams(params *tmproto.ConsensusParams) *abci.ConsensusParams { - return &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxBytes: params.Block.MaxBytes, - MaxGas: params.Block.MaxGas, - }, - Evidence: ¶ms.Evidence, - Validator: ¶ms.Validator, - } -} - // XXX: panics on nil or unknown pubkey type func (tm2pb) NewValidatorUpdate(pubkey crypto.PubKey, power int64) abci.ValidatorUpdate { pubkeyABCI, err := cryptoenc.PubKeyToProto(pubkey) diff --git a/types/protobuf_test.go b/types/protobuf_test.go index c617751e4..bfe7084bd 100644 --- a/types/protobuf_test.go +++ b/types/protobuf_test.go @@ -52,14 +52,6 @@ func TestABCIValidators(t *testing.T) { assert.Equal(t, tmValExpected, tmVals[0]) } -func TestABCIConsensusParams(t *testing.T) { - cp := DefaultConsensusParams() - abciCP := TM2PB.ConsensusParams(cp) - cp2 := UpdateConsensusParams(*cp, abciCP) - - assert.Equal(t, *cp, cp2) -} - type pubKeyEddie struct{} func (pubKeyEddie) Address() Address { return []byte{} }