Browse Source

docs: EventAttribute#Index is not deterministic (#5132)

Closes #5125
pull/5137/head
Anton Kaliaev 4 years ago
committed by GitHub
parent
commit
8cdb53c811
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 356 additions and 342 deletions
  1. +330
    -327
      abci/types/types.pb.go
  2. +16
    -8
      docs/app-dev/indexing-transactions.md
  3. +10
    -7
      proto/tendermint/abci/types.proto

+ 330
- 327
abci/types/types.pb.go View File

@ -2596,25 +2596,26 @@ func (m *LastCommitInfo) GetVotes() []VoteInfo {
return nil return nil
} }
// EventAttribute represents an event to the indexing service.
type EventAttribute struct {
Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"`
// Event allows application developers to attach additional information to
// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.
// Later, transactions may be queried using these events.
type Event struct {
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
Attributes []EventAttribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
} }
func (m *EventAttribute) Reset() { *m = EventAttribute{} }
func (m *EventAttribute) String() string { return proto.CompactTextString(m) }
func (*EventAttribute) ProtoMessage() {}
func (*EventAttribute) Descriptor() ([]byte, []int) {
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{36} return fileDescriptor_252557cfdd89a31a, []int{36}
} }
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
func (m *Event) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
} }
func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic { if deterministic {
return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic)
return xxx_messageInfo_Event.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b) n, err := m.MarshalToSizedBuffer(b)
@ -2624,56 +2625,51 @@ func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro
return b[:n], nil return b[:n], nil
} }
} }
func (m *EventAttribute) XXX_Merge(src proto.Message) {
xxx_messageInfo_EventAttribute.Merge(m, src)
func (m *Event) XXX_Merge(src proto.Message) {
xxx_messageInfo_Event.Merge(m, src)
} }
func (m *EventAttribute) XXX_Size() int {
func (m *Event) XXX_Size() int {
return m.Size() return m.Size()
} }
func (m *EventAttribute) XXX_DiscardUnknown() {
xxx_messageInfo_EventAttribute.DiscardUnknown(m)
func (m *Event) XXX_DiscardUnknown() {
xxx_messageInfo_Event.DiscardUnknown(m)
} }
var xxx_messageInfo_EventAttribute proto.InternalMessageInfo
var xxx_messageInfo_Event proto.InternalMessageInfo
func (m *EventAttribute) GetKey() []byte {
func (m *Event) GetType() string {
if m != nil { if m != nil {
return m.Key
return m.Type
} }
return nil
return ""
} }
func (m *EventAttribute) GetValue() []byte {
func (m *Event) GetAttributes() []EventAttribute {
if m != nil { if m != nil {
return m.Value
return m.Attributes
} }
return nil return nil
} }
func (m *EventAttribute) GetIndex() bool {
if m != nil {
return m.Index
}
return false
}
type Event struct {
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
Attributes []EventAttribute `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
// EventAttribute is a single key-value pair, associated with an event.
type EventAttribute struct {
Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"`
} }
func (m *Event) Reset() { *m = Event{} }
func (m *Event) String() string { return proto.CompactTextString(m) }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) {
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{37} return fileDescriptor_252557cfdd89a31a, []int{37}
} }
func (m *Event) XXX_Unmarshal(b []byte) error {
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
} }
func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
func (m *EventAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic { if deterministic {
return xxx_messageInfo_Event.Marshal(b, m, deterministic)
return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b) n, err := m.MarshalToSizedBuffer(b)
@ -2683,32 +2679,39 @@ func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return b[:n], nil return b[:n], nil
} }
} }
func (m *Event) XXX_Merge(src proto.Message) {
xxx_messageInfo_Event.Merge(m, src)
func (m *EventAttribute) XXX_Merge(src proto.Message) {
xxx_messageInfo_EventAttribute.Merge(m, src)
} }
func (m *Event) XXX_Size() int {
func (m *EventAttribute) XXX_Size() int {
return m.Size() return m.Size()
} }
func (m *Event) XXX_DiscardUnknown() {
xxx_messageInfo_Event.DiscardUnknown(m)
func (m *EventAttribute) XXX_DiscardUnknown() {
xxx_messageInfo_EventAttribute.DiscardUnknown(m)
} }
var xxx_messageInfo_Event proto.InternalMessageInfo
var xxx_messageInfo_EventAttribute proto.InternalMessageInfo
func (m *Event) GetType() string {
func (m *EventAttribute) GetKey() []byte {
if m != nil { if m != nil {
return m.Type
return m.Key
} }
return ""
return nil
} }
func (m *Event) GetAttributes() []EventAttribute {
func (m *EventAttribute) GetValue() []byte {
if m != nil { if m != nil {
return m.Attributes
return m.Value
} }
return nil return nil
} }
func (m *EventAttribute) GetIndex() bool {
if m != nil {
return m.Index
}
return false
}
// TxResult contains results of executing the transaction. // TxResult contains results of executing the transaction.
// //
// One usage is indexing transaction results. // One usage is indexing transaction results.
@ -3135,8 +3138,8 @@ func init() {
proto.RegisterType((*ConsensusParams)(nil), "tendermint.abci.ConsensusParams") proto.RegisterType((*ConsensusParams)(nil), "tendermint.abci.ConsensusParams")
proto.RegisterType((*BlockParams)(nil), "tendermint.abci.BlockParams") proto.RegisterType((*BlockParams)(nil), "tendermint.abci.BlockParams")
proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.LastCommitInfo") proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.LastCommitInfo")
proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute")
proto.RegisterType((*Event)(nil), "tendermint.abci.Event") proto.RegisterType((*Event)(nil), "tendermint.abci.Event")
proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute")
proto.RegisterType((*TxResult)(nil), "tendermint.abci.TxResult") proto.RegisterType((*TxResult)(nil), "tendermint.abci.TxResult")
proto.RegisterType((*Validator)(nil), "tendermint.abci.Validator") proto.RegisterType((*Validator)(nil), "tendermint.abci.Validator")
proto.RegisterType((*ValidatorUpdate)(nil), "tendermint.abci.ValidatorUpdate") proto.RegisterType((*ValidatorUpdate)(nil), "tendermint.abci.ValidatorUpdate")
@ -3148,174 +3151,174 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{ var fileDescriptor_252557cfdd89a31a = []byte{
// 2672 bytes of a gzipped FileDescriptorProto
// 2667 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x3b, 0x77, 0x1b, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x3b, 0x77, 0x1b, 0xc7,
0x15, 0xc6, 0x1b, 0xd8, 0x4b, 0xe2, 0xc1, 0x11, 0x2d, 0xc3, 0x90, 0x44, 0xca, 0xab, 0x63, 0xc7, 0x15, 0xc6, 0x1b, 0xd8, 0x4b, 0xe2, 0xc1, 0x11, 0x2d, 0xc3, 0x90, 0x44, 0xca, 0xab, 0x63, 0xc7,
0x92, 0x6d, 0x32, 0xa1, 0x8e, 0x14, 0x29, 0x76, 0x62, 0x13, 0x30, 0x14, 0xd0, 0x92, 0x49, 0x66, 0x92, 0x6d, 0x32, 0xa1, 0x8e, 0x14, 0x29, 0x76, 0x62, 0x13, 0x30, 0x14, 0xd0, 0x92, 0x49, 0x66,
0x49, 0x49, 0x79, 0x59, 0xeb, 0x01, 0x76, 0x08, 0xac, 0x05, 0xec, 0xae, 0xb1, 0x03, 0x8a, 0x74, 0x49, 0x49, 0x79, 0x59, 0xeb, 0x01, 0x76, 0x08, 0xac, 0x05, 0xec, 0xae, 0xb1, 0x03, 0x8a, 0x74,
0x97, 0x38, 0x95, 0xd2, 0x38, 0x5d, 0x1a, 0x77, 0x29, 0xf2, 0x13, 0x52, 0xa5, 0x76, 0xe9, 0x32, 0x97, 0x38, 0x95, 0xd2, 0x38, 0x5d, 0x1a, 0x77, 0x29, 0xf2, 0x13, 0x52, 0xa5, 0x76, 0xe9, 0x32,
0x95, 0x92, 0x23, 0x9d, 0x34, 0xf9, 0x03, 0x29, 0x93, 0x33, 0x8f, 0x7d, 0x01, 0x58, 0x00, 0xb4, 0x95, 0x92, 0x23, 0x9d, 0x34, 0xf9, 0x03, 0x29, 0x93, 0x33, 0x8f, 0x7d, 0x01, 0x58, 0x00, 0xb4,
0xd3, 0xa5, 0x9b, 0xc7, 0xbd, 0x77, 0xe7, 0xce, 0xcc, 0xfd, 0xe6, 0x9b, 0x3b, 0x0b, 0x17, 0x28,
0xb1, 0x0c, 0x32, 0x1c, 0x98, 0x16, 0xdd, 0xc4, 0xed, 0x8e, 0xb9, 0x49, 0x4f, 0x1d, 0xe2, 0x6e,
0x38, 0x43, 0x9b, 0xda, 0xa8, 0x1c, 0x74, 0x6e, 0xb0, 0xce, 0xda, 0xa5, 0x90, 0x74, 0x67, 0x78,
0xea, 0x50, 0x7b, 0xd3, 0x19, 0xda, 0xf6, 0x91, 0x90, 0xaf, 0x5d, 0x0c, 0x75, 0x73, 0x3b, 0x61,
0x6b, 0x91, 0x5e, 0xa9, 0xfc, 0x98, 0x9c, 0x7a, 0xbd, 0x97, 0x26, 0x74, 0x1d, 0x3c, 0xc4, 0x03,
0xaf, 0x7b, 0xbd, 0x6b, 0xdb, 0xdd, 0x3e, 0xd9, 0xe4, 0xb5, 0xf6, 0xe8, 0x68, 0x93, 0x9a, 0x03,
0xe2, 0x52, 0x3c, 0x70, 0xa4, 0xc0, 0x6a, 0xd7, 0xee, 0xda, 0xbc, 0xb8, 0xc9, 0x4a, 0xa2, 0x55,
0xfd, 0x43, 0x01, 0xf2, 0x1a, 0xf9, 0x6c, 0x44, 0x5c, 0x8a, 0xb6, 0x20, 0x43, 0x3a, 0x3d, 0xbb,
0x9a, 0xbc, 0x9c, 0x7c, 0x63, 0x69, 0xeb, 0xe2, 0xc6, 0x98, 0x73, 0x1b, 0x52, 0xae, 0xd9, 0xe9,
0xd9, 0xad, 0x84, 0xc6, 0x65, 0xd1, 0x0d, 0xc8, 0x1e, 0xf5, 0x47, 0x6e, 0xaf, 0x9a, 0xe2, 0x4a,
0x97, 0xe2, 0x94, 0xee, 0x30, 0xa1, 0x56, 0x42, 0x13, 0xd2, 0xec, 0x53, 0xa6, 0x75, 0x64, 0x57,
0xd3, 0xb3, 0x3f, 0xb5, 0x63, 0x1d, 0xf1, 0x4f, 0x31, 0x59, 0x54, 0x07, 0x70, 0x09, 0xd5, 0x6d,
0x87, 0x9a, 0xb6, 0x55, 0xcd, 0x70, 0xcd, 0x57, 0xe3, 0x34, 0x0f, 0x08, 0xdd, 0xe3, 0x82, 0xad,
0x84, 0xa6, 0xb8, 0x5e, 0x85, 0xd9, 0x30, 0x2d, 0x93, 0xea, 0x9d, 0x1e, 0x36, 0xad, 0x6a, 0x76,
0xb6, 0x8d, 0x1d, 0xcb, 0xa4, 0x0d, 0x26, 0xc8, 0x6c, 0x98, 0x5e, 0x85, 0xb9, 0xfc, 0xd9, 0x88,
0x0c, 0x4f, 0xab, 0xb9, 0xd9, 0x2e, 0xff, 0x8c, 0x09, 0x31, 0x97, 0xb9, 0x34, 0x6a, 0xc2, 0x52,
0x9b, 0x74, 0x4d, 0x4b, 0x6f, 0xf7, 0xed, 0xce, 0xe3, 0x6a, 0x9e, 0x2b, 0xab, 0x71, 0xca, 0x75,
0x26, 0x5a, 0x67, 0x92, 0xad, 0x84, 0x06, 0x6d, 0xbf, 0x86, 0xde, 0x85, 0x42, 0xa7, 0x47, 0x3a,
0x8f, 0x75, 0x7a, 0x52, 0x2d, 0x70, 0x1b, 0xeb, 0x71, 0x36, 0x1a, 0x4c, 0xee, 0xf0, 0xa4, 0x95,
0xd0, 0xf2, 0x1d, 0x51, 0x64, 0xfe, 0x1b, 0xa4, 0x6f, 0x1e, 0x93, 0x21, 0xd3, 0x57, 0x66, 0xfb,
0xff, 0x81, 0x90, 0xe4, 0x16, 0x14, 0xc3, 0xab, 0xa0, 0xf7, 0x40, 0x21, 0x96, 0x21, 0xdd, 0x00,
0x6e, 0xe2, 0x72, 0xec, 0x5e, 0xb1, 0x0c, 0xcf, 0x89, 0x02, 0x91, 0x65, 0x74, 0x0b, 0x72, 0x1d,
0x7b, 0x30, 0x30, 0x69, 0x75, 0x89, 0x6b, 0xaf, 0xc5, 0x3a, 0xc0, 0xa5, 0x5a, 0x09, 0x4d, 0xca,
0xa3, 0x5d, 0x28, 0xf5, 0x4d, 0x97, 0xea, 0xae, 0x85, 0x1d, 0xb7, 0x67, 0x53, 0xb7, 0xba, 0xcc,
0x2d, 0xbc, 0x16, 0x67, 0xe1, 0x9e, 0xe9, 0xd2, 0x03, 0x4f, 0xb8, 0x95, 0xd0, 0x8a, 0xfd, 0x70,
0x03, 0xb3, 0x67, 0x1f, 0x1d, 0x91, 0xa1, 0x6f, 0xb0, 0x5a, 0x9c, 0x6d, 0x6f, 0x8f, 0x49, 0x7b,
0xfa, 0xcc, 0x9e, 0x1d, 0x6e, 0x40, 0xbf, 0x82, 0x73, 0x7d, 0x1b, 0x1b, 0xbe, 0x39, 0xbd, 0xd3,
0x1b, 0x59, 0x8f, 0xab, 0x25, 0x6e, 0xf4, 0x6a, 0xec, 0x20, 0x6d, 0x6c, 0x78, 0x26, 0x1a, 0x4c,
0xa1, 0x95, 0xd0, 0x56, 0xfa, 0xe3, 0x8d, 0xe8, 0x11, 0xac, 0x62, 0xc7, 0xe9, 0x9f, 0x8e, 0x5b,
0x2f, 0x73, 0xeb, 0xd7, 0xe2, 0xac, 0x6f, 0x33, 0x9d, 0x71, 0xf3, 0x08, 0x4f, 0xb4, 0xd6, 0xf3,
0x90, 0x3d, 0xc6, 0xfd, 0x11, 0x51, 0xbf, 0x07, 0x4b, 0xa1, 0x50, 0x47, 0x55, 0xc8, 0x0f, 0x88,
0xeb, 0xe2, 0x2e, 0xe1, 0xc8, 0xa0, 0x68, 0x5e, 0x55, 0x2d, 0xc1, 0x72, 0x38, 0xbc, 0xd5, 0x81,
0xaf, 0xc8, 0x02, 0x97, 0x29, 0x1e, 0x93, 0xa1, 0xcb, 0xa2, 0x55, 0x2a, 0xca, 0x2a, 0xba, 0x02,
0x45, 0xbe, 0x7d, 0x74, 0xaf, 0x9f, 0xa1, 0x47, 0x46, 0x5b, 0xe6, 0x8d, 0x0f, 0xa4, 0xd0, 0x3a,
0x2c, 0x39, 0x5b, 0x8e, 0x2f, 0x92, 0xe6, 0x22, 0xe0, 0x6c, 0x39, 0x52, 0x40, 0xfd, 0x11, 0x54,
0xc6, 0xa3, 0x1d, 0x55, 0x20, 0xfd, 0x98, 0x9c, 0xca, 0xef, 0xb1, 0x22, 0x5a, 0x95, 0x6e, 0xf1,
0x6f, 0x28, 0x9a, 0xf4, 0xf1, 0x4f, 0x29, 0x5f, 0xd9, 0x0f, 0x73, 0x74, 0x0b, 0x32, 0x0c, 0x35,
0x25, 0x00, 0xd6, 0x36, 0x04, 0xa4, 0x6e, 0x78, 0x90, 0xba, 0x71, 0xe8, 0x41, 0x6a, 0xbd, 0xf0,
0xf5, 0xb3, 0xf5, 0xc4, 0x97, 0x7f, 0x5f, 0x4f, 0x6a, 0x5c, 0x03, 0xbd, 0xc2, 0xa2, 0x12, 0x9b,
0x96, 0x6e, 0x1a, 0xf2, 0x3b, 0x79, 0x5e, 0xdf, 0x31, 0xd0, 0x5d, 0xa8, 0x74, 0x6c, 0xcb, 0x25,
0x96, 0x3b, 0x72, 0x75, 0x01, 0xd9, 0x12, 0xf6, 0x26, 0xa3, 0xa6, 0xe1, 0x09, 0xee, 0x73, 0x39,
0xad, 0xdc, 0x89, 0x36, 0xa0, 0x3b, 0x00, 0xc7, 0xb8, 0x6f, 0x1a, 0x98, 0xda, 0x43, 0xb7, 0x9a,
0xb9, 0x9c, 0x9e, 0x6a, 0xe6, 0x81, 0x27, 0x72, 0xdf, 0x31, 0x30, 0x25, 0xf5, 0x0c, 0x1b, 0xad,
0x16, 0xd2, 0x44, 0xaf, 0x43, 0x19, 0x3b, 0x8e, 0xee, 0x52, 0x4c, 0x89, 0xde, 0x3e, 0xa5, 0xc4,
0xe5, 0x60, 0xb8, 0xac, 0x15, 0xb1, 0xe3, 0x1c, 0xb0, 0xd6, 0x3a, 0x6b, 0x54, 0x0d, 0x7f, 0x85,
0x39, 0x9a, 0x21, 0x04, 0x19, 0x03, 0x53, 0xcc, 0x67, 0x68, 0x59, 0xe3, 0x65, 0xd6, 0xe6, 0x60,
0xda, 0x93, 0x7e, 0xf3, 0x32, 0x3a, 0x0f, 0xb9, 0x1e, 0x31, 0xbb, 0x3d, 0xca, 0x5d, 0x4d, 0x6b,
0xb2, 0xc6, 0x16, 0xc3, 0x19, 0xda, 0xc7, 0x84, 0xc3, 0x77, 0x41, 0x13, 0x15, 0xf5, 0x77, 0x29,
0x58, 0x99, 0xc0, 0x3d, 0x66, 0xb7, 0x87, 0xdd, 0x9e, 0xf7, 0x2d, 0x56, 0x46, 0x37, 0x99, 0x5d,
0x6c, 0x90, 0xa1, 0x3c, 0x6f, 0xaa, 0x61, 0xdf, 0xc5, 0x59, 0xda, 0xe2, 0xfd, 0xd2, 0x67, 0x29,
0x8d, 0xf6, 0xa0, 0xd2, 0xc7, 0x2e, 0xd5, 0x05, 0x8e, 0xe8, 0xa1, 0xb3, 0x67, 0x12, 0x3d, 0xef,
0x61, 0x0f, 0x79, 0xd8, 0x2e, 0x96, 0x86, 0x4a, 0xfd, 0x48, 0x2b, 0xd2, 0x60, 0xb5, 0x7d, 0xfa,
0x39, 0xb6, 0xa8, 0x69, 0x11, 0x7d, 0x62, 0x49, 0x5e, 0x99, 0x30, 0xda, 0x3c, 0x36, 0x0d, 0x62,
0x75, 0xbc, 0xb5, 0x38, 0xe7, 0x2b, 0xfb, 0x6b, 0xe5, 0xaa, 0x1a, 0x94, 0xa2, 0xc8, 0x8d, 0x4a,
0x90, 0xa2, 0x27, 0x72, 0x02, 0x52, 0xf4, 0x04, 0x7d, 0x1f, 0x32, 0xcc, 0x49, 0xee, 0x7c, 0x69,
0xca, 0xb1, 0x29, 0xf5, 0x0e, 0x4f, 0x1d, 0xa2, 0x71, 0x49, 0x55, 0xf5, 0xb7, 0xb9, 0x8f, 0xe6,
0xe3, 0x56, 0xd5, 0xab, 0x50, 0x1e, 0x83, 0xeb, 0xd0, 0xfa, 0x25, 0xc3, 0xeb, 0xa7, 0x96, 0xa1,
0x18, 0xc1, 0x66, 0xf5, 0x3c, 0xac, 0x4e, 0x83, 0x5a, 0xb5, 0xe7, 0xb7, 0x47, 0x20, 0x13, 0xdd,
0x80, 0x82, 0x8f, 0xb5, 0x22, 0xcc, 0x26, 0xe7, 0xca, 0x13, 0xd6, 0x7c, 0x51, 0x16, 0x5f, 0x6c,
0xbf, 0xf2, 0xfd, 0x90, 0xe2, 0x03, 0xcf, 0x63, 0xc7, 0x69, 0x61, 0xb7, 0xa7, 0x7e, 0x02, 0xd5,
0x38, 0x1c, 0x1d, 0x73, 0x23, 0xe3, 0x6f, 0xc3, 0xf3, 0x90, 0x3b, 0xb2, 0x87, 0x03, 0x4c, 0xb9,
0xb1, 0xa2, 0x26, 0x6b, 0x6c, 0x7b, 0x0a, 0x4c, 0x4d, 0xf3, 0x66, 0x51, 0x51, 0x75, 0x78, 0x25,
0x16, 0x4b, 0x99, 0x8a, 0x69, 0x19, 0x44, 0xcc, 0x67, 0x51, 0x13, 0x95, 0xc0, 0x90, 0x18, 0xac,
0xa8, 0xb0, 0xcf, 0xba, 0xdc, 0x57, 0x6e, 0x5f, 0xd1, 0x64, 0x4d, 0xfd, 0x67, 0x01, 0x0a, 0x1a,
0x71, 0x1d, 0x16, 0xec, 0xa8, 0x0e, 0x0a, 0x39, 0xe9, 0x10, 0xc1, 0x72, 0x92, 0xb1, 0x2c, 0x41,
0x48, 0x37, 0x3d, 0x49, 0x76, 0x44, 0xfb, 0x6a, 0xe8, 0xba, 0x64, 0x72, 0xf1, 0xa4, 0x4c, 0xaa,
0x87, 0xa9, 0xdc, 0x4d, 0x8f, 0xca, 0xa5, 0x63, 0x4f, 0x65, 0xa1, 0x35, 0xc6, 0xe5, 0xae, 0x4b,
0x2e, 0x97, 0x99, 0xf3, 0xb1, 0x08, 0x99, 0x6b, 0x44, 0xc8, 0x5c, 0x76, 0x8e, 0x9b, 0x31, 0x6c,
0xae, 0x11, 0x61, 0x73, 0xb9, 0x39, 0x46, 0x62, 0xe8, 0xdc, 0x4d, 0x8f, 0xce, 0xe5, 0xe7, 0xb8,
0x3d, 0xc6, 0xe7, 0xee, 0x44, 0xf9, 0x9c, 0xe0, 0x62, 0x57, 0x62, 0xb5, 0x63, 0x09, 0xdd, 0x8f,
0x43, 0x84, 0x4e, 0x89, 0x65, 0x53, 0xc2, 0xc8, 0x14, 0x46, 0xd7, 0x88, 0x30, 0x3a, 0x98, 0x33,
0x07, 0x31, 0x94, 0xee, 0xfd, 0x30, 0xa5, 0x5b, 0x8a, 0x65, 0x85, 0x72, 0xd3, 0x4c, 0xe3, 0x74,
0xb7, 0x7d, 0x4e, 0xb7, 0x1c, 0x4b, 0x4a, 0xa5, 0x0f, 0xe3, 0xa4, 0x6e, 0x6f, 0x82, 0xd4, 0x09,
0x12, 0xf6, 0x7a, 0xac, 0x89, 0x39, 0xac, 0x6e, 0x6f, 0x82, 0xd5, 0x95, 0xe6, 0x18, 0x9c, 0x43,
0xeb, 0x7e, 0x3d, 0x9d, 0xd6, 0xc5, 0x13, 0x2f, 0x39, 0xcc, 0xc5, 0x78, 0x9d, 0x1e, 0xc3, 0xeb,
0x2a, 0xdc, 0xfc, 0x9b, 0xb1, 0xe6, 0xcf, 0x4e, 0xec, 0xae, 0xb2, 0x63, 0x76, 0x0c, 0x38, 0x18,
0x54, 0x91, 0xe1, 0xd0, 0x1e, 0x4a, 0xce, 0x24, 0x2a, 0xea, 0x1b, 0xec, 0xe0, 0x0f, 0x40, 0x62,
0x06, 0x09, 0xe4, 0x47, 0x42, 0x08, 0x18, 0xd4, 0xbf, 0x24, 0x03, 0x5d, 0x7e, 0x56, 0x86, 0x49,
0x83, 0x22, 0x49, 0x43, 0x88, 0x1b, 0xa6, 0xa2, 0xdc, 0x70, 0x1d, 0x96, 0x18, 0xd4, 0x8f, 0xd1,
0x3e, 0xec, 0x78, 0xb4, 0x0f, 0x5d, 0x83, 0x15, 0x7e, 0x96, 0x0b, 0x06, 0x29, 0xf1, 0x3d, 0xc3,
0x8f, 0xa9, 0x32, 0xeb, 0x10, 0x9b, 0x53, 0x00, 0xfd, 0xdb, 0x70, 0x2e, 0x24, 0xeb, 0x1f, 0x21,
0x82, 0xeb, 0x54, 0x7c, 0xe9, 0x6d, 0x79, 0x96, 0x7c, 0x14, 0x4c, 0x50, 0x40, 0x29, 0x11, 0x64,
0x3a, 0xb6, 0x41, 0x24, 0xc0, 0xf3, 0x32, 0xa3, 0x99, 0x7d, 0xbb, 0x2b, 0x61, 0x9c, 0x15, 0x99,
0x94, 0x8f, 0x82, 0x8a, 0x00, 0x39, 0xf5, 0xcf, 0xc9, 0xc0, 0x5e, 0xc0, 0x32, 0xa7, 0x11, 0xc2,
0xe4, 0xff, 0x86, 0x10, 0xa6, 0xbe, 0x2d, 0x21, 0x54, 0xff, 0x9d, 0x0c, 0x96, 0xd1, 0xa7, 0x7a,
0xdf, 0xce, 0xed, 0xe0, 0x48, 0xcc, 0xf2, 0x45, 0x91, 0x47, 0xa2, 0x64, 0xe6, 0x39, 0x3e, 0xf5,
0x51, 0x66, 0x9e, 0x17, 0x87, 0x24, 0xaf, 0xa0, 0x5b, 0xa0, 0xf0, 0x94, 0x89, 0x6e, 0x3b, 0xae,
0x44, 0xd5, 0x0b, 0x61, 0x87, 0x44, 0x66, 0x64, 0x63, 0x9f, 0xc9, 0xec, 0x39, 0xae, 0x56, 0x70,
0x64, 0x29, 0x74, 0xda, 0x2b, 0x11, 0xd2, 0x79, 0x11, 0x14, 0x36, 0x7a, 0xd7, 0xc1, 0x1d, 0xc2,
0x11, 0x52, 0xd1, 0x82, 0x06, 0xf5, 0x11, 0xa0, 0x49, 0x8c, 0x46, 0x2d, 0xc8, 0x91, 0x63, 0x62,
0x51, 0xb6, 0x34, 0x6c, 0x4e, 0xcf, 0x4f, 0x61, 0x74, 0xc4, 0xa2, 0xf5, 0x2a, 0x9b, 0xc9, 0x7f,
0x3d, 0x5b, 0xaf, 0x08, 0xe9, 0xb7, 0xec, 0x81, 0x49, 0xc9, 0xc0, 0xa1, 0xa7, 0x9a, 0xd4, 0x57,
0x7f, 0x93, 0x62, 0xf4, 0x2a, 0x82, 0xdf, 0x53, 0xe7, 0xd6, 0x8b, 0x92, 0x54, 0x88, 0x5a, 0x2f,
0x36, 0xdf, 0x97, 0x00, 0xba, 0xd8, 0xd5, 0x9f, 0x60, 0x8b, 0x12, 0x43, 0x4e, 0xba, 0xd2, 0xc5,
0xee, 0x43, 0xde, 0xc0, 0xb8, 0x13, 0xeb, 0x1e, 0xb9, 0xc4, 0xe0, 0xb3, 0x9f, 0xd6, 0xf2, 0x5d,
0xec, 0xde, 0x77, 0x89, 0x11, 0xf2, 0x32, 0xff, 0xdd, 0xbc, 0x8c, 0xce, 0x71, 0x61, 0x7c, 0x8e,
0xbf, 0x48, 0x05, 0x81, 0x10, 0xf0, 0xd0, 0xff, 0xb7, 0x59, 0xf8, 0x3d, 0xbf, 0x73, 0x46, 0x0f,
0x51, 0x74, 0x00, 0x2b, 0x7e, 0x18, 0xea, 0x23, 0x1e, 0x9e, 0xde, 0x9e, 0x5b, 0x34, 0x8e, 0x2b,
0xc7, 0xd1, 0x66, 0x17, 0xfd, 0x1c, 0x5e, 0x1e, 0x83, 0x18, 0xdf, 0x74, 0x6a, 0x41, 0xa4, 0x79,
0x29, 0x8a, 0x34, 0x9e, 0xe5, 0x60, 0xae, 0xd2, 0xdf, 0x31, 0x2e, 0x76, 0xd8, 0x6d, 0x27, 0x4c,
0x09, 0xa6, 0xae, 0xfd, 0x15, 0x28, 0x0e, 0x09, 0x65, 0x37, 0xeb, 0xc8, 0x7d, 0x72, 0x59, 0x34,
0x0a, 0x94, 0x57, 0xf7, 0xe1, 0xa5, 0xa9, 0xd4, 0x00, 0xfd, 0x10, 0x94, 0x80, 0x55, 0x24, 0x63,
0xae, 0x66, 0xfe, 0x75, 0x23, 0x90, 0x55, 0xff, 0x9a, 0x0c, 0x4c, 0x46, 0x2f, 0x30, 0x4d, 0xc8,
0x0d, 0x89, 0x3b, 0xea, 0x8b, 0x2b, 0x45, 0x69, 0xeb, 0xed, 0xc5, 0x48, 0x05, 0x6b, 0x1d, 0xf5,
0xa9, 0x26, 0x95, 0xd5, 0x47, 0x90, 0x13, 0x2d, 0x68, 0x09, 0xf2, 0xf7, 0x77, 0xef, 0xee, 0xee,
0x3d, 0xdc, 0xad, 0x24, 0x10, 0x40, 0x6e, 0xbb, 0xd1, 0x68, 0xee, 0x1f, 0x56, 0x92, 0x48, 0x81,
0xec, 0x76, 0x7d, 0x4f, 0x3b, 0xac, 0xa4, 0x58, 0xb3, 0xd6, 0xfc, 0xb0, 0xd9, 0x38, 0xac, 0xa4,
0xd1, 0x0a, 0x14, 0x45, 0x59, 0xbf, 0xb3, 0xa7, 0x7d, 0xb4, 0x7d, 0x58, 0xc9, 0x84, 0x9a, 0x0e,
0x9a, 0xbb, 0x1f, 0x34, 0xb5, 0x4a, 0x56, 0xfd, 0x01, 0xbb, 0xb3, 0xc4, 0xd0, 0x90, 0xe0, 0x76,
0x92, 0x0c, 0xdd, 0x4e, 0xd4, 0x3f, 0xa6, 0xa0, 0x16, 0xcf, 0x2d, 0xd0, 0x87, 0x63, 0x8e, 0x6f,
0xd3, 0xa5, 0x9b, 0xc7, 0xbd, 0x77, 0x71, 0x67, 0xe6, 0x7e, 0xf3, 0xdd, 0x3b, 0x80, 0x0b, 0x94,
0x58, 0x06, 0x19, 0x0e, 0x4c, 0x8b, 0x6e, 0xe2, 0x76, 0xc7, 0xdc, 0xa4, 0xa7, 0x0e, 0x71, 0x37,
0x9c, 0xa1, 0x4d, 0x6d, 0x54, 0x0e, 0x26, 0x37, 0xd8, 0x64, 0xed, 0x52, 0x48, 0xba, 0x33, 0x3c,
0x75, 0xa8, 0xbd, 0xe9, 0x0c, 0x6d, 0xfb, 0x48, 0xc8, 0xd7, 0x2e, 0x86, 0xa6, 0xb9, 0x9d, 0xb0,
0xb5, 0xc8, 0xac, 0x54, 0x7e, 0x4c, 0x4e, 0xbd, 0xd9, 0x4b, 0x13, 0xba, 0x0e, 0x1e, 0xe2, 0x81,
0x37, 0xbd, 0xde, 0xb5, 0xed, 0x6e, 0x9f, 0x6c, 0xf2, 0x5e, 0x7b, 0x74, 0xb4, 0x49, 0xcd, 0x01,
0x71, 0x29, 0x1e, 0x38, 0x52, 0x60, 0xb5, 0x6b, 0x77, 0x6d, 0xde, 0xdc, 0x64, 0x2d, 0x31, 0xaa,
0xfe, 0xa1, 0x00, 0x79, 0x8d, 0x7c, 0x36, 0x22, 0x2e, 0x45, 0x5b, 0x90, 0x21, 0x9d, 0x9e, 0x5d,
0x4d, 0x5e, 0x4e, 0xbe, 0xb1, 0xb4, 0x75, 0x71, 0x63, 0xcc, 0xb9, 0x0d, 0x29, 0xd7, 0xec, 0xf4,
0xec, 0x56, 0x42, 0xe3, 0xb2, 0xe8, 0x06, 0x64, 0x8f, 0xfa, 0x23, 0xb7, 0x57, 0x4d, 0x71, 0xa5,
0x4b, 0x71, 0x4a, 0x77, 0x98, 0x50, 0x2b, 0xa1, 0x09, 0x69, 0xf6, 0x29, 0xd3, 0x3a, 0xb2, 0xab,
0xe9, 0xd9, 0x9f, 0xda, 0xb1, 0x8e, 0xf8, 0xa7, 0x98, 0x2c, 0xaa, 0x03, 0xb8, 0x84, 0xea, 0xb6,
0x43, 0x4d, 0xdb, 0xaa, 0x66, 0xb8, 0xe6, 0xab, 0x71, 0x9a, 0x07, 0x84, 0xee, 0x71, 0xc1, 0x56,
0x42, 0x53, 0x5c, 0xaf, 0xc3, 0x6c, 0x98, 0x96, 0x49, 0xf5, 0x4e, 0x0f, 0x9b, 0x56, 0x35, 0x3b,
0xdb, 0xc6, 0x8e, 0x65, 0xd2, 0x06, 0x13, 0x64, 0x36, 0x4c, 0xaf, 0xc3, 0x5c, 0xfe, 0x6c, 0x44,
0x86, 0xa7, 0xd5, 0xdc, 0x6c, 0x97, 0x7f, 0xc6, 0x84, 0x98, 0xcb, 0x5c, 0x1a, 0x35, 0x61, 0xa9,
0x4d, 0xba, 0xa6, 0xa5, 0xb7, 0xfb, 0x76, 0xe7, 0x71, 0x35, 0xcf, 0x95, 0xd5, 0x38, 0xe5, 0x3a,
0x13, 0xad, 0x33, 0xc9, 0x56, 0x42, 0x83, 0xb6, 0xdf, 0x43, 0xef, 0x42, 0xa1, 0xd3, 0x23, 0x9d,
0xc7, 0x3a, 0x3d, 0xa9, 0x16, 0xb8, 0x8d, 0xf5, 0x38, 0x1b, 0x0d, 0x26, 0x77, 0x78, 0xd2, 0x4a,
0x68, 0xf9, 0x8e, 0x68, 0x32, 0xff, 0x0d, 0xd2, 0x37, 0x8f, 0xc9, 0x90, 0xe9, 0x2b, 0xb3, 0xfd,
0xff, 0x40, 0x48, 0x72, 0x0b, 0x8a, 0xe1, 0x75, 0xd0, 0x7b, 0xa0, 0x10, 0xcb, 0x90, 0x6e, 0x00,
0x37, 0x71, 0x39, 0xf6, 0xac, 0x58, 0x86, 0xe7, 0x44, 0x81, 0xc8, 0x36, 0xba, 0x05, 0xb9, 0x8e,
0x3d, 0x18, 0x98, 0xb4, 0xba, 0xc4, 0xb5, 0xd7, 0x62, 0x1d, 0xe0, 0x52, 0xad, 0x84, 0x26, 0xe5,
0xd1, 0x2e, 0x94, 0xfa, 0xa6, 0x4b, 0x75, 0xd7, 0xc2, 0x8e, 0xdb, 0xb3, 0xa9, 0x5b, 0x5d, 0xe6,
0x16, 0x5e, 0x8b, 0xb3, 0x70, 0xcf, 0x74, 0xe9, 0x81, 0x27, 0xdc, 0x4a, 0x68, 0xc5, 0x7e, 0x78,
0x80, 0xd9, 0xb3, 0x8f, 0x8e, 0xc8, 0xd0, 0x37, 0x58, 0x2d, 0xce, 0xb6, 0xb7, 0xc7, 0xa4, 0x3d,
0x7d, 0x66, 0xcf, 0x0e, 0x0f, 0xa0, 0x5f, 0xc1, 0xb9, 0xbe, 0x8d, 0x0d, 0xdf, 0x9c, 0xde, 0xe9,
0x8d, 0xac, 0xc7, 0xd5, 0x12, 0x37, 0x7a, 0x35, 0xf6, 0x47, 0xda, 0xd8, 0xf0, 0x4c, 0x34, 0x98,
0x42, 0x2b, 0xa1, 0xad, 0xf4, 0xc7, 0x07, 0xd1, 0x23, 0x58, 0xc5, 0x8e, 0xd3, 0x3f, 0x1d, 0xb7,
0x5e, 0xe6, 0xd6, 0xaf, 0xc5, 0x59, 0xdf, 0x66, 0x3a, 0xe3, 0xe6, 0x11, 0x9e, 0x18, 0xad, 0xe7,
0x21, 0x7b, 0x8c, 0xfb, 0x23, 0xa2, 0x7e, 0x0f, 0x96, 0x42, 0xa1, 0x8e, 0xaa, 0x90, 0x1f, 0x10,
0xd7, 0xc5, 0x5d, 0xc2, 0x91, 0x41, 0xd1, 0xbc, 0xae, 0x5a, 0x82, 0xe5, 0x70, 0x78, 0xab, 0x03,
0x5f, 0x91, 0x05, 0x2e, 0x53, 0x3c, 0x26, 0x43, 0x97, 0x45, 0xab, 0x54, 0x94, 0x5d, 0x74, 0x05,
0x8a, 0xfc, 0xf8, 0xe8, 0xde, 0x3c, 0x43, 0x8f, 0x8c, 0xb6, 0xcc, 0x07, 0x1f, 0x48, 0xa1, 0x75,
0x58, 0x72, 0xb6, 0x1c, 0x5f, 0x24, 0xcd, 0x45, 0xc0, 0xd9, 0x72, 0xa4, 0x80, 0xfa, 0x23, 0xa8,
0x8c, 0x47, 0x3b, 0xaa, 0x40, 0xfa, 0x31, 0x39, 0x95, 0xdf, 0x63, 0x4d, 0xb4, 0x2a, 0xdd, 0xe2,
0xdf, 0x50, 0x34, 0xe9, 0xe3, 0x9f, 0x52, 0xbe, 0xb2, 0x1f, 0xe6, 0xe8, 0x16, 0x64, 0x18, 0x6a,
0x4a, 0x00, 0xac, 0x6d, 0x08, 0x48, 0xdd, 0xf0, 0x20, 0x75, 0xe3, 0xd0, 0x83, 0xd4, 0x7a, 0xe1,
0xeb, 0x67, 0xeb, 0x89, 0x2f, 0xff, 0xbe, 0x9e, 0xd4, 0xb8, 0x06, 0x7a, 0x85, 0x45, 0x25, 0x36,
0x2d, 0xdd, 0x34, 0xe4, 0x77, 0xf2, 0xbc, 0xbf, 0x63, 0xa0, 0xbb, 0x50, 0xe9, 0xd8, 0x96, 0x4b,
0x2c, 0x77, 0xe4, 0xea, 0x02, 0xb2, 0x25, 0xec, 0x4d, 0x46, 0x4d, 0xc3, 0x13, 0xdc, 0xe7, 0x72,
0x5a, 0xb9, 0x13, 0x1d, 0x40, 0x77, 0x00, 0x8e, 0x71, 0xdf, 0x34, 0x30, 0xb5, 0x87, 0x6e, 0x35,
0x73, 0x39, 0x3d, 0xd5, 0xcc, 0x03, 0x4f, 0xe4, 0xbe, 0x63, 0x60, 0x4a, 0xea, 0x19, 0xf6, 0x6b,
0xb5, 0x90, 0x26, 0x7a, 0x1d, 0xca, 0xd8, 0x71, 0x74, 0x97, 0x62, 0x4a, 0xf4, 0xf6, 0x29, 0x25,
0x2e, 0x07, 0xc3, 0x65, 0xad, 0x88, 0x1d, 0xe7, 0x80, 0x8d, 0xd6, 0xd9, 0xa0, 0x6a, 0xf8, 0x3b,
0xcc, 0xd1, 0x0c, 0x21, 0xc8, 0x18, 0x98, 0x62, 0xbe, 0x42, 0xcb, 0x1a, 0x6f, 0xb3, 0x31, 0x07,
0xd3, 0x9e, 0xf4, 0x9b, 0xb7, 0xd1, 0x79, 0xc8, 0xf5, 0x88, 0xd9, 0xed, 0x51, 0xee, 0x6a, 0x5a,
0x93, 0x3d, 0xb6, 0x19, 0xce, 0xd0, 0x3e, 0x26, 0x1c, 0xbe, 0x0b, 0x9a, 0xe8, 0xa8, 0xbf, 0x4b,
0xc1, 0xca, 0x04, 0xee, 0x31, 0xbb, 0x3d, 0xec, 0xf6, 0xbc, 0x6f, 0xb1, 0x36, 0xba, 0xc9, 0xec,
0x62, 0x83, 0x0c, 0xe5, 0x7d, 0x53, 0x0d, 0xfb, 0x2e, 0xee, 0xd2, 0x16, 0x9f, 0x97, 0x3e, 0x4b,
0x69, 0xb4, 0x07, 0x95, 0x3e, 0x76, 0xa9, 0x2e, 0x70, 0x44, 0x0f, 0xdd, 0x3d, 0x93, 0xe8, 0x79,
0x0f, 0x7b, 0xc8, 0xc3, 0x4e, 0xb1, 0x34, 0x54, 0xea, 0x47, 0x46, 0x91, 0x06, 0xab, 0xed, 0xd3,
0xcf, 0xb1, 0x45, 0x4d, 0x8b, 0xe8, 0x13, 0x5b, 0xf2, 0xca, 0x84, 0xd1, 0xe6, 0xb1, 0x69, 0x10,
0xab, 0xe3, 0xed, 0xc5, 0x39, 0x5f, 0xd9, 0xdf, 0x2b, 0x57, 0xd5, 0xa0, 0x14, 0x45, 0x6e, 0x54,
0x82, 0x14, 0x3d, 0x91, 0x0b, 0x90, 0xa2, 0x27, 0xe8, 0xfb, 0x90, 0x61, 0x4e, 0x72, 0xe7, 0x4b,
0x53, 0xae, 0x4d, 0xa9, 0x77, 0x78, 0xea, 0x10, 0x8d, 0x4b, 0xaa, 0xaa, 0x7f, 0xcc, 0x7d, 0x34,
0x1f, 0xb7, 0xaa, 0x5e, 0x85, 0xf2, 0x18, 0x5c, 0x87, 0xf6, 0x2f, 0x19, 0xde, 0x3f, 0xb5, 0x0c,
0xc5, 0x08, 0x36, 0xab, 0xe7, 0x61, 0x75, 0x1a, 0xd4, 0xaa, 0x3d, 0x7f, 0x3c, 0x02, 0x99, 0xe8,
0x06, 0x14, 0x7c, 0xac, 0x15, 0x61, 0x36, 0xb9, 0x56, 0x9e, 0xb0, 0xe6, 0x8b, 0xb2, 0xf8, 0x62,
0xe7, 0x95, 0x9f, 0x87, 0x14, 0xff, 0xe1, 0x79, 0xec, 0x38, 0x2d, 0xec, 0xf6, 0xd4, 0x4f, 0xa0,
0x1a, 0x87, 0xa3, 0x63, 0x6e, 0x64, 0xfc, 0x63, 0x78, 0x1e, 0x72, 0x47, 0xf6, 0x70, 0x80, 0x29,
0x37, 0x56, 0xd4, 0x64, 0x8f, 0x1d, 0x4f, 0x81, 0xa9, 0x69, 0x3e, 0x2c, 0x3a, 0xaa, 0x0e, 0xaf,
0xc4, 0x62, 0x29, 0x53, 0x31, 0x2d, 0x83, 0x88, 0xf5, 0x2c, 0x6a, 0xa2, 0x13, 0x18, 0x12, 0x3f,
0x56, 0x74, 0xd8, 0x67, 0x5d, 0xee, 0x2b, 0xb7, 0xaf, 0x68, 0xb2, 0xa7, 0xfe, 0xb3, 0x00, 0x05,
0x8d, 0xb8, 0x0e, 0x0b, 0x76, 0x54, 0x07, 0x85, 0x9c, 0x74, 0x88, 0x60, 0x39, 0xc9, 0x58, 0x96,
0x20, 0xa4, 0x9b, 0x9e, 0x24, 0xbb, 0xa2, 0x7d, 0x35, 0x74, 0x5d, 0x32, 0xb9, 0x78, 0x52, 0x26,
0xd5, 0xc3, 0x54, 0xee, 0xa6, 0x47, 0xe5, 0xd2, 0xb1, 0xb7, 0xb2, 0xd0, 0x1a, 0xe3, 0x72, 0xd7,
0x25, 0x97, 0xcb, 0xcc, 0xf9, 0x58, 0x84, 0xcc, 0x35, 0x22, 0x64, 0x2e, 0x3b, 0xc7, 0xcd, 0x18,
0x36, 0xd7, 0x88, 0xb0, 0xb9, 0xdc, 0x1c, 0x23, 0x31, 0x74, 0xee, 0xa6, 0x47, 0xe7, 0xf2, 0x73,
0xdc, 0x1e, 0xe3, 0x73, 0x77, 0xa2, 0x7c, 0x4e, 0x70, 0xb1, 0x2b, 0xb1, 0xda, 0xb1, 0x84, 0xee,
0xc7, 0x21, 0x42, 0xa7, 0xc4, 0xb2, 0x29, 0x61, 0x64, 0x0a, 0xa3, 0x6b, 0x44, 0x18, 0x1d, 0xcc,
0x59, 0x83, 0x18, 0x4a, 0xf7, 0x7e, 0x98, 0xd2, 0x2d, 0xc5, 0xb2, 0x42, 0x79, 0x68, 0xa6, 0x71,
0xba, 0xdb, 0x3e, 0xa7, 0x5b, 0x8e, 0x25, 0xa5, 0xd2, 0x87, 0x71, 0x52, 0xb7, 0x37, 0x41, 0xea,
0x04, 0x09, 0x7b, 0x3d, 0xd6, 0xc4, 0x1c, 0x56, 0xb7, 0x37, 0xc1, 0xea, 0x4a, 0x73, 0x0c, 0xce,
0xa1, 0x75, 0xbf, 0x9e, 0x4e, 0xeb, 0xe2, 0x89, 0x97, 0xfc, 0x99, 0x8b, 0xf1, 0x3a, 0x3d, 0x86,
0xd7, 0x55, 0xb8, 0xf9, 0x37, 0x63, 0xcd, 0x9f, 0x9d, 0xd8, 0x5d, 0x65, 0xd7, 0xec, 0x18, 0x70,
0x30, 0xa8, 0x22, 0xc3, 0xa1, 0x3d, 0x94, 0x9c, 0x49, 0x74, 0xd4, 0x37, 0xd8, 0xc5, 0x1f, 0x80,
0xc4, 0x0c, 0x12, 0xc8, 0xaf, 0x84, 0x10, 0x30, 0xa8, 0x7f, 0x49, 0x06, 0xba, 0xfc, 0xae, 0x0c,
0x93, 0x06, 0x45, 0x92, 0x86, 0x10, 0x37, 0x4c, 0x45, 0xb9, 0xe1, 0x3a, 0x2c, 0x31, 0xa8, 0x1f,
0xa3, 0x7d, 0xd8, 0xf1, 0x68, 0x1f, 0xba, 0x06, 0x2b, 0xfc, 0x2e, 0x17, 0x0c, 0x52, 0xe2, 0x7b,
0x86, 0x5f, 0x53, 0x65, 0x36, 0x21, 0x0e, 0xa7, 0x00, 0xfa, 0xb7, 0xe1, 0x5c, 0x48, 0xd6, 0xbf,
0x42, 0x04, 0xd7, 0xa9, 0xf8, 0xd2, 0xdb, 0xf2, 0x2e, 0xf9, 0x28, 0x58, 0xa0, 0x80, 0x52, 0x22,
0xc8, 0x74, 0x6c, 0x83, 0x48, 0x80, 0xe7, 0x6d, 0x46, 0x33, 0xfb, 0x76, 0x57, 0xc2, 0x38, 0x6b,
0x32, 0x29, 0x1f, 0x05, 0x15, 0x01, 0x72, 0xea, 0x9f, 0x93, 0x81, 0xbd, 0x80, 0x65, 0x4e, 0x23,
0x84, 0xc9, 0xff, 0x0d, 0x21, 0x4c, 0x7d, 0x5b, 0x42, 0xa8, 0xfe, 0x3b, 0x19, 0x6c, 0xa3, 0x4f,
0xf5, 0xbe, 0x9d, 0xdb, 0xc1, 0x95, 0x98, 0xe5, 0x9b, 0x22, 0xaf, 0x44, 0xc9, 0xcc, 0x73, 0x7c,
0xe9, 0xa3, 0xcc, 0x3c, 0x2f, 0x2e, 0x49, 0xde, 0x41, 0xb7, 0x40, 0xe1, 0x25, 0x13, 0xdd, 0x76,
0x5c, 0x89, 0xaa, 0x17, 0xc2, 0x0e, 0x89, 0xca, 0xc8, 0xc6, 0x3e, 0x93, 0xd9, 0x73, 0x5c, 0xad,
0xe0, 0xc8, 0x56, 0xe8, 0xb6, 0x57, 0x22, 0xa4, 0xf3, 0x22, 0x28, 0xec, 0xd7, 0xbb, 0x0e, 0xee,
0x10, 0x8e, 0x90, 0x8a, 0x16, 0x0c, 0xa8, 0x8f, 0x00, 0x4d, 0x62, 0x34, 0x6a, 0x41, 0x8e, 0x1c,
0x13, 0x8b, 0xb2, 0xad, 0x61, 0x6b, 0x7a, 0x7e, 0x0a, 0xa3, 0x23, 0x16, 0xad, 0x57, 0xd9, 0x4a,
0xfe, 0xeb, 0xd9, 0x7a, 0x45, 0x48, 0xbf, 0x65, 0x0f, 0x4c, 0x4a, 0x06, 0x0e, 0x3d, 0xd5, 0xa4,
0xbe, 0xfa, 0x9b, 0x14, 0xa3, 0x57, 0x11, 0xfc, 0x9e, 0xba, 0xb6, 0x5e, 0x94, 0xa4, 0x42, 0xd4,
0x7a, 0xb1, 0xf5, 0xbe, 0x04, 0xd0, 0xc5, 0xae, 0xfe, 0x04, 0x5b, 0x94, 0x18, 0x72, 0xd1, 0x95,
0x2e, 0x76, 0x1f, 0xf2, 0x01, 0xc6, 0x9d, 0xd8, 0xf4, 0xc8, 0x25, 0x06, 0x5f, 0xfd, 0xb4, 0x96,
0xef, 0x62, 0xf7, 0xbe, 0x4b, 0x8c, 0x90, 0x97, 0xf9, 0xef, 0xe6, 0x65, 0x74, 0x8d, 0x0b, 0xe3,
0x6b, 0xfc, 0x45, 0x2a, 0x08, 0x84, 0x80, 0x87, 0xfe, 0xbf, 0xad, 0xc2, 0xef, 0x79, 0xce, 0x19,
0xbd, 0x44, 0xd1, 0x01, 0xac, 0xf8, 0x61, 0xa8, 0x8f, 0x78, 0x78, 0x7a, 0x67, 0x6e, 0xd1, 0x38,
0xae, 0x1c, 0x47, 0x87, 0x5d, 0xf4, 0x73, 0x78, 0x79, 0x0c, 0x62, 0x7c, 0xd3, 0xa9, 0x05, 0x91,
0xe6, 0xa5, 0x28, 0xd2, 0x78, 0x96, 0x83, 0xb5, 0x4a, 0x7f, 0xc7, 0xb8, 0xd8, 0x61, 0xd9, 0x4e,
0x98, 0x12, 0x4c, 0xdd, 0xfb, 0x2b, 0x50, 0x1c, 0x12, 0xca, 0x32, 0xeb, 0x48, 0x3e, 0xb9, 0x2c,
0x06, 0x05, 0xca, 0xab, 0xfb, 0xf0, 0xd2, 0x54, 0x6a, 0x80, 0x7e, 0x08, 0x4a, 0xc0, 0x2a, 0x92,
0x31, 0xa9, 0x99, 0x9f, 0x6e, 0x04, 0xb2, 0xea, 0x5f, 0x93, 0x81, 0xc9, 0x68, 0x02, 0xd3, 0x84,
0xdc, 0x90, 0xb8, 0xa3, 0xbe, 0x48, 0x29, 0x4a, 0x5b, 0x6f, 0x2f, 0x46, 0x2a, 0xd8, 0xe8, 0xa8,
0x4f, 0x35, 0xa9, 0xac, 0x3e, 0x82, 0x9c, 0x18, 0x41, 0x4b, 0x90, 0xbf, 0xbf, 0x7b, 0x77, 0x77,
0xef, 0xe1, 0x6e, 0x25, 0x81, 0x00, 0x72, 0xdb, 0x8d, 0x46, 0x73, 0xff, 0xb0, 0x92, 0x44, 0x0a,
0x64, 0xb7, 0xeb, 0x7b, 0xda, 0x61, 0x25, 0xc5, 0x86, 0xb5, 0xe6, 0x87, 0xcd, 0xc6, 0x61, 0x25,
0x8d, 0x56, 0xa0, 0x28, 0xda, 0xfa, 0x9d, 0x3d, 0xed, 0xa3, 0xed, 0xc3, 0x4a, 0x26, 0x34, 0x74,
0xd0, 0xdc, 0xfd, 0xa0, 0xa9, 0x55, 0xb2, 0xea, 0x0f, 0x58, 0xce, 0x12, 0x43, 0x43, 0x82, 0xec,
0x24, 0x19, 0xca, 0x4e, 0xd4, 0x3f, 0xa6, 0xa0, 0x16, 0xcf, 0x2d, 0xd0, 0x87, 0x63, 0x8e, 0x6f,
0x9d, 0x81, 0x98, 0x8c, 0x79, 0x8f, 0x5e, 0x83, 0xd2, 0x90, 0x1c, 0x11, 0xda, 0xe9, 0x09, 0xae, 0x9d, 0x81, 0x98, 0x8c, 0x79, 0x8f, 0x5e, 0x83, 0xd2, 0x90, 0x1c, 0x11, 0xda, 0xe9, 0x09, 0xae,
0x23, 0x4e, 0xae, 0xa2, 0x56, 0x94, 0xad, 0x5c, 0xc9, 0x15, 0x62, 0x9f, 0x92, 0x0e, 0xd5, 0xc5,
0x45, 0x49, 0x6c, 0x3a, 0x85, 0x89, 0xb1, 0xd6, 0x03, 0xd1, 0xa8, 0x7e, 0x72, 0xa6, 0xb9, 0x54,
0x20, 0xab, 0x35, 0x0f, 0xb5, 0x5f, 0x54, 0xd2, 0x08, 0x41, 0x89, 0x17, 0xf5, 0x83, 0xdd, 0xed,
0xfd, 0x83, 0xd6, 0x1e, 0x9b, 0xcb, 0x73, 0x50, 0xf6, 0xe6, 0xd2, 0x6b, 0xcc, 0xaa, 0xff, 0x49,
0x42, 0x79, 0x2c, 0x40, 0xd0, 0x16, 0x64, 0x05, 0x5f, 0x8e, 0x4b, 0x97, 0xf3, 0xf8, 0x96, 0xd1,
0x24, 0x44, 0xd1, 0xbb, 0x50, 0x20, 0x32, 0x11, 0x30, 0x2d, 0x10, 0x45, 0x02, 0xc3, 0x4b, 0x15,
0x48, 0x55, 0x5f, 0x03, 0xbd, 0x07, 0x8a, 0x1f, 0xe9, 0xf2, 0x92, 0xf6, 0xea, 0xa4, 0xba, 0x8f,
0x11, 0x52, 0x3f, 0xd0, 0x41, 0xb7, 0x03, 0xd2, 0x95, 0x99, 0x64, 0xe9, 0x52, 0x5d, 0x08, 0x48,
0x65, 0x4f, 0x5e, 0x6d, 0xc0, 0x52, 0xc8, 0x1f, 0x74, 0x01, 0x94, 0x01, 0x3e, 0x91, 0x99, 0x23,
0x91, 0x22, 0x28, 0x0c, 0xf0, 0x09, 0x4f, 0x1a, 0xa1, 0x97, 0x21, 0xcf, 0x3a, 0xbb, 0x58, 0xa0,
0x4d, 0x5a, 0xcb, 0x0d, 0xf0, 0xc9, 0x4f, 0xb1, 0xab, 0x7e, 0x0c, 0xa5, 0x68, 0x72, 0x85, 0xed,
0xc4, 0xa1, 0x3d, 0xb2, 0x0c, 0x6e, 0x23, 0xab, 0x89, 0x0a, 0xba, 0x01, 0xd9, 0x63, 0x5b, 0x80,
0xd5, 0xf4, 0x90, 0x7d, 0x60, 0x53, 0x12, 0x4a, 0xce, 0x08, 0x69, 0x75, 0x17, 0x4a, 0x1c, 0x7c,
0xb6, 0x29, 0x1d, 0x9a, 0xed, 0x11, 0x25, 0xe1, 0x6c, 0xe0, 0xf2, 0x94, 0x6c, 0xa0, 0xcf, 0x39,
0x7c, 0xc6, 0x92, 0x16, 0x69, 0x29, 0x5e, 0x51, 0x3f, 0x87, 0x2c, 0xb7, 0xc7, 0x80, 0x89, 0xa7,
0x5d, 0x24, 0x81, 0x65, 0x65, 0xf4, 0x31, 0x00, 0xf6, 0xbe, 0xe3, 0x0d, 0x74, 0x7d, 0x3a, 0x18,
0xfa, 0xe3, 0xa9, 0x5f, 0x94, 0xa8, 0xb8, 0x1a, 0xa8, 0x86, 0x90, 0x31, 0x64, 0x50, 0x7d, 0x9a,
0x84, 0xc2, 0xe1, 0x89, 0xdc, 0xd6, 0x31, 0xd9, 0x98, 0x60, 0xd8, 0xa9, 0x70, 0xee, 0x41, 0xa4,
0x77, 0xd2, 0x7e, 0xd2, 0xe8, 0x7d, 0x3f, 0x70, 0x33, 0x8b, 0xde, 0x0e, 0xbd, 0xec, 0x99, 0x04,
0xab, 0x77, 0x40, 0xf1, 0x77, 0x15, 0x63, 0xee, 0xd8, 0x30, 0x86, 0xc4, 0x75, 0xe5, 0xbc, 0x7a,
0x55, 0x9e, 0xdc, 0xb3, 0x9f, 0xc8, 0xec, 0x46, 0x5a, 0x13, 0x15, 0xd5, 0x80, 0xf2, 0xd8, 0xb1,
0x85, 0xde, 0x81, 0xbc, 0x33, 0x6a, 0xeb, 0xde, 0xd2, 0x8c, 0x05, 0x8f, 0x47, 0xf0, 0x46, 0xed,
0xbe, 0xd9, 0xb9, 0x4b, 0x4e, 0xbd, 0xc1, 0x38, 0xa3, 0xf6, 0x5d, 0xb1, 0x82, 0xe2, 0x2b, 0xa9,
0xf0, 0x57, 0x8e, 0xa1, 0xe0, 0x6d, 0x0a, 0xf4, 0x93, 0x70, 0x9c, 0x78, 0xb9, 0xdc, 0xd8, 0xa3,
0x54, 0x9a, 0x0f, 0x85, 0xc9, 0x35, 0x58, 0x71, 0xcd, 0xae, 0x45, 0x0c, 0x3d, 0xb8, 0x3b, 0xf0,
0xaf, 0x15, 0xb4, 0xb2, 0xe8, 0xb8, 0xe7, 0x5d, 0x1c, 0xd4, 0x67, 0x49, 0x28, 0x78, 0x01, 0x3b,
0x75, 0x9f, 0x44, 0x06, 0x93, 0x3a, 0xfb, 0x60, 0xe2, 0x32, 0xa9, 0x5e, 0xae, 0x3a, 0x73, 0xe6,
0x5c, 0xf5, 0x5b, 0x80, 0xa8, 0x4d, 0x71, 0x5f, 0x3f, 0xb6, 0xa9, 0x69, 0x75, 0x75, 0x31, 0x9b,
0x82, 0x30, 0x55, 0x78, 0xcf, 0x03, 0xde, 0xb1, 0xcf, 0x27, 0xf6, 0xb7, 0x49, 0x28, 0xf8, 0x87,
0xdf, 0x59, 0xf3, 0x69, 0xe7, 0x21, 0x27, 0xf1, 0x5d, 0x24, 0xd4, 0x64, 0xcd, 0x4f, 0xed, 0x66,
0x42, 0xa9, 0xdd, 0x1a, 0x14, 0x06, 0x84, 0x62, 0xce, 0x00, 0xc4, 0xfd, 0xcc, 0xaf, 0x5f, 0xbb,
0x0d, 0x4b, 0xa1, 0xd4, 0x26, 0x0b, 0xeb, 0xdd, 0xe6, 0xc3, 0x4a, 0xa2, 0x96, 0x7f, 0xfa, 0xd5,
0xe5, 0xf4, 0x2e, 0x79, 0xc2, 0x36, 0xa5, 0xd6, 0x6c, 0xb4, 0x9a, 0x8d, 0xbb, 0x95, 0x64, 0x6d,
0xe9, 0xe9, 0x57, 0x97, 0xf3, 0x1a, 0xe1, 0x19, 0x92, 0xad, 0x2f, 0x00, 0xca, 0xdb, 0xf5, 0xc6,
0x0e, 0x3b, 0x94, 0xcc, 0x0e, 0x96, 0x79, 0xa3, 0x0c, 0xbf, 0xd4, 0xce, 0x7c, 0xe2, 0xac, 0xcd,
0x4e, 0x9b, 0xa1, 0x3b, 0x90, 0xe5, 0xf7, 0x5d, 0x34, 0xfb, 0xcd, 0xb3, 0x36, 0x27, 0x8f, 0xc6,
0x06, 0xc3, 0x77, 0xed, 0xcc, 0x47, 0xd0, 0xda, 0xec, 0xb4, 0x1a, 0xd2, 0x40, 0x09, 0x2e, 0xac,
0xf3, 0x1f, 0x45, 0x6b, 0x0b, 0xa4, 0xda, 0x98, 0xcd, 0x80, 0xab, 0xcf, 0x7f, 0x24, 0xac, 0x2d,
0x80, 0x2b, 0xe8, 0x1e, 0xe4, 0xbd, 0x3b, 0xd0, 0xbc, 0x67, 0xcb, 0xda, 0xdc, 0x34, 0x18, 0x5b,
0x02, 0x71, 0x57, 0x9d, 0xfd, 0x06, 0x5b, 0x9b, 0x93, 0xd3, 0x43, 0x3b, 0x90, 0x93, 0x14, 0x74,
0xce, 0x53, 0x64, 0x6d, 0x5e, 0x5a, 0x8b, 0x4d, 0x5a, 0x70, 0xd3, 0x9f, 0xff, 0xb2, 0x5c, 0x5b,
0x20, 0x5d, 0x89, 0xee, 0x03, 0x84, 0x6e, 0xa6, 0x0b, 0x3c, 0x19, 0xd7, 0x16, 0x49, 0x43, 0xa2,
0x3d, 0x28, 0xf8, 0xb7, 0x90, 0xb9, 0x0f, 0xb8, 0xb5, 0xf9, 0xf9, 0x40, 0xf4, 0x08, 0x8a, 0x51,
0xfa, 0xbd, 0xd8, 0xb3, 0x6c, 0x6d, 0xc1, 0x44, 0x1f, 0xb3, 0x1f, 0xe5, 0xe2, 0x8b, 0x3d, 0xd3,
0xd6, 0x16, 0xcc, 0xfb, 0xa1, 0x4f, 0x61, 0x65, 0x92, 0x2b, 0x2f, 0xfe, 0x6a, 0x5b, 0x3b, 0x43,
0x26, 0x10, 0x0d, 0x00, 0x4d, 0xe1, 0xd8, 0x67, 0x78, 0xc4, 0xad, 0x9d, 0x25, 0x31, 0x58, 0x6f,
0x7e, 0xfd, 0x7c, 0x2d, 0xf9, 0xcd, 0xf3, 0xb5, 0xe4, 0x3f, 0x9e, 0xaf, 0x25, 0xbf, 0x7c, 0xb1,
0x96, 0xf8, 0xe6, 0xc5, 0x5a, 0xe2, 0x6f, 0x2f, 0xd6, 0x12, 0xbf, 0x7c, 0xb3, 0x6b, 0xd2, 0xde,
0xa8, 0xbd, 0xd1, 0xb1, 0x07, 0x9b, 0xe1, 0x3f, 0x4c, 0xa6, 0xfd, 0xf5, 0xd2, 0xce, 0xf1, 0xe3,
0xe5, 0xfa, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x66, 0x5c, 0x1b, 0x1f, 0x15, 0x23, 0x00, 0x00,
0x23, 0x6e, 0xae, 0xa2, 0x56, 0x94, 0xa3, 0x5c, 0xc9, 0x15, 0x62, 0x9f, 0x92, 0x0e, 0xd5, 0x45,
0xa2, 0x24, 0x0e, 0x9d, 0xc2, 0xc4, 0xd8, 0xe8, 0x81, 0x18, 0x54, 0x3f, 0x39, 0xd3, 0x5a, 0x2a,
0x90, 0xd5, 0x9a, 0x87, 0xda, 0x2f, 0x2a, 0x69, 0x84, 0xa0, 0xc4, 0x9b, 0xfa, 0xc1, 0xee, 0xf6,
0xfe, 0x41, 0x6b, 0x8f, 0xad, 0xe5, 0x39, 0x28, 0x7b, 0x6b, 0xe9, 0x0d, 0x66, 0xd5, 0xff, 0x24,
0xa1, 0x3c, 0x16, 0x20, 0x68, 0x0b, 0xb2, 0x82, 0x2f, 0xc7, 0x95, 0xcb, 0x79, 0x7c, 0xcb, 0x68,
0x12, 0xa2, 0xe8, 0x5d, 0x28, 0x10, 0x59, 0x08, 0x98, 0x16, 0x88, 0xa2, 0x80, 0xe1, 0x95, 0x0a,
0xa4, 0xaa, 0xaf, 0x81, 0xde, 0x03, 0xc5, 0x8f, 0x74, 0x99, 0xa4, 0xbd, 0x3a, 0xa9, 0xee, 0x63,
0x84, 0xd4, 0x0f, 0x74, 0xd0, 0xed, 0x80, 0x74, 0x65, 0x26, 0x59, 0xba, 0x54, 0x17, 0x02, 0x52,
0xd9, 0x93, 0x57, 0x1b, 0xb0, 0x14, 0xf2, 0x07, 0x5d, 0x00, 0x65, 0x80, 0x4f, 0x64, 0xe5, 0x48,
0x94, 0x08, 0x0a, 0x03, 0x7c, 0xc2, 0x8b, 0x46, 0xe8, 0x65, 0xc8, 0xb3, 0xc9, 0x2e, 0x16, 0x68,
0x93, 0xd6, 0x72, 0x03, 0x7c, 0xf2, 0x53, 0xec, 0xaa, 0x1f, 0x43, 0x29, 0x5a, 0x5c, 0x61, 0x27,
0x71, 0x68, 0x8f, 0x2c, 0x83, 0xdb, 0xc8, 0x6a, 0xa2, 0x83, 0x6e, 0x40, 0xf6, 0xd8, 0x16, 0x60,
0x35, 0x3d, 0x64, 0x1f, 0xd8, 0x94, 0x84, 0x8a, 0x33, 0x42, 0x5a, 0xfd, 0x1c, 0xb2, 0x1c, 0x7c,
0x18, 0x90, 0xf0, 0x32, 0x89, 0x24, 0x9c, 0xac, 0x8d, 0x3e, 0x06, 0xc0, 0x94, 0x0e, 0xcd, 0xf6,
0x28, 0x30, 0xbc, 0x3e, 0x1d, 0xbc, 0xb6, 0x3d, 0xb9, 0xfa, 0x45, 0x89, 0x62, 0xab, 0x81, 0x6a,
0x08, 0xc9, 0x42, 0x06, 0xd5, 0x5d, 0x28, 0x45, 0x75, 0xc3, 0x95, 0xc8, 0xe5, 0x29, 0x95, 0x48,
0x9f, 0xef, 0xf8, 0x6c, 0x29, 0x2d, 0x4a, 0x62, 0xbc, 0xa3, 0x3e, 0x4d, 0x42, 0xe1, 0xf0, 0x44,
0x1e, 0xeb, 0x98, 0x6a, 0x4c, 0xa0, 0x9a, 0x0a, 0xd7, 0x1e, 0x44, 0x79, 0x27, 0xed, 0x17, 0x8d,
0xde, 0xf7, 0x03, 0x37, 0xb3, 0x68, 0x76, 0xe8, 0x55, 0xcf, 0x24, 0x58, 0xbd, 0x03, 0x8a, 0x7f,
0xaa, 0x18, 0x73, 0xc7, 0x86, 0x31, 0x24, 0xae, 0x2b, 0x7d, 0xf3, 0xba, 0xbc, 0xb8, 0x67, 0x3f,
0x91, 0xd5, 0x8d, 0xb4, 0x26, 0x3a, 0xaa, 0x01, 0xe5, 0xb1, 0x6b, 0x0b, 0xbd, 0x03, 0x79, 0x67,
0xd4, 0xd6, 0xbd, 0xe5, 0x19, 0x0b, 0x1e, 0x8f, 0xe0, 0x8d, 0xda, 0x7d, 0xb3, 0x73, 0x97, 0x9c,
0x7a, 0x3f, 0xc6, 0x19, 0xb5, 0xef, 0x8a, 0x55, 0x14, 0x5f, 0x49, 0x85, 0xbf, 0x72, 0x0c, 0x05,
0xef, 0x50, 0xa0, 0x9f, 0x84, 0xe3, 0xc4, 0xab, 0xe5, 0xc6, 0x5e, 0xa5, 0xd2, 0x7c, 0x28, 0x4c,
0xae, 0xc1, 0x8a, 0x6b, 0x76, 0x2d, 0x62, 0xe8, 0x41, 0xee, 0xc0, 0xbf, 0x56, 0xd0, 0xca, 0x62,
0xe2, 0x9e, 0x97, 0x38, 0xa8, 0xcf, 0x92, 0x50, 0xf0, 0x02, 0x76, 0xea, 0xb9, 0x8b, 0xfc, 0x98,
0xd4, 0xd9, 0x7f, 0x4c, 0x5c, 0x25, 0xd5, 0xab, 0x55, 0x67, 0xce, 0x5c, 0xab, 0x7e, 0x0b, 0x10,
0xb5, 0x29, 0xee, 0xeb, 0xc7, 0x36, 0x35, 0xad, 0xae, 0x2e, 0x56, 0x53, 0x10, 0xa6, 0x0a, 0x9f,
0x79, 0xc0, 0x27, 0xf6, 0xf9, 0xc2, 0xfe, 0x36, 0x09, 0x05, 0xff, 0xf2, 0x3b, 0x6b, 0x3d, 0xed,
0x3c, 0xe4, 0x24, 0xbe, 0x8b, 0x82, 0x9a, 0xec, 0xf9, 0xa5, 0xdd, 0x4c, 0xa8, 0xb4, 0x5b, 0x83,
0xc2, 0x80, 0x50, 0xcc, 0x19, 0x80, 0xc8, 0xcf, 0xfc, 0xfe, 0xb5, 0xdb, 0xb0, 0x14, 0x2a, 0x6d,
0xb2, 0xd0, 0xda, 0x6d, 0x3e, 0xac, 0x24, 0x6a, 0xf9, 0xa7, 0x5f, 0x5d, 0x4e, 0xef, 0x92, 0x27,
0xec, 0x50, 0x6a, 0xcd, 0x46, 0xab, 0xd9, 0xb8, 0x5b, 0x49, 0xd6, 0x96, 0x9e, 0x7e, 0x75, 0x39,
0xaf, 0x11, 0x5e, 0x21, 0xd9, 0xfa, 0x02, 0xa0, 0xbc, 0x5d, 0x6f, 0xec, 0xb0, 0x4b, 0xc9, 0xec,
0x60, 0x59, 0x37, 0xca, 0xf0, 0xa4, 0x76, 0xe6, 0x13, 0x67, 0x6d, 0x76, 0xd9, 0x0c, 0xdd, 0x81,
0x2c, 0xcf, 0x77, 0xd1, 0xec, 0x37, 0xcf, 0xda, 0x9c, 0x3a, 0x1a, 0xfb, 0x31, 0xfc, 0xd4, 0xce,
0x7c, 0x04, 0xad, 0xcd, 0x2e, 0xab, 0x21, 0x0d, 0x94, 0x20, 0x61, 0x9d, 0xff, 0x28, 0x5a, 0x5b,
0xa0, 0xd4, 0xc6, 0x6c, 0x06, 0x5c, 0x7d, 0xfe, 0x23, 0x61, 0x6d, 0x01, 0x5c, 0x41, 0xf7, 0x20,
0xef, 0xe5, 0x40, 0xf3, 0x9e, 0x2d, 0x6b, 0x73, 0xcb, 0x60, 0x6c, 0x0b, 0x44, 0xae, 0x3a, 0xfb,
0x0d, 0xb6, 0x36, 0xa7, 0xa6, 0x87, 0x76, 0x20, 0x27, 0x29, 0xe8, 0x9c, 0xa7, 0xc8, 0xda, 0xbc,
0xb2, 0x16, 0x5b, 0xb4, 0x20, 0xd3, 0x9f, 0xff, 0xb2, 0x5c, 0x5b, 0xa0, 0x5c, 0x89, 0xee, 0x03,
0x84, 0x32, 0xd3, 0x05, 0x9e, 0x8c, 0x6b, 0x8b, 0x94, 0x21, 0xd1, 0x1e, 0x14, 0xfc, 0x2c, 0x64,
0xee, 0x03, 0x6e, 0x6d, 0x7e, 0x3d, 0x10, 0x3d, 0x82, 0x62, 0x94, 0x7e, 0x2f, 0xf6, 0x2c, 0x5b,
0x5b, 0xb0, 0xd0, 0xc7, 0xec, 0x47, 0xb9, 0xf8, 0x62, 0xcf, 0xb4, 0xb5, 0x05, 0xeb, 0x7e, 0xe8,
0x53, 0x58, 0x99, 0xe4, 0xca, 0x8b, 0xbf, 0xda, 0xd6, 0xce, 0x50, 0x09, 0x44, 0x03, 0x40, 0x53,
0x38, 0xf6, 0x19, 0x1e, 0x71, 0x6b, 0x67, 0x29, 0x0c, 0xd6, 0x9b, 0x5f, 0x3f, 0x5f, 0x4b, 0x7e,
0xf3, 0x7c, 0x2d, 0xf9, 0x8f, 0xe7, 0x6b, 0xc9, 0x2f, 0x5f, 0xac, 0x25, 0xbe, 0x79, 0xb1, 0x96,
0xf8, 0xdb, 0x8b, 0xb5, 0xc4, 0x2f, 0xdf, 0xec, 0x9a, 0xb4, 0x37, 0x6a, 0x6f, 0x74, 0xec, 0xc1,
0x66, 0xf8, 0x1f, 0x26, 0xd3, 0xfe, 0xf5, 0xd2, 0xce, 0xf1, 0xeb, 0xe5, 0xfa, 0x7f, 0x03, 0x00,
0x00, 0xff, 0xff, 0xa7, 0x76, 0xf6, 0xe8, 0x15, 0x23, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -6101,7 +6104,7 @@ func (m *LastCommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
func (m *Event) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size]) n, err := m.MarshalToSizedBuffer(dAtA[:size])
@ -6111,44 +6114,41 @@ func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil return dAtA[:n], nil
} }
func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) {
func (m *Event) MarshalTo(dAtA []byte) (int, error) {
size := m.Size() size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size]) return m.MarshalToSizedBuffer(dAtA[:size])
} }
func (m *EventAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) {
func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA) i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if m.Index {
i--
if m.Index {
dAtA[i] = 1
} else {
dAtA[i] = 0
if len(m.Attributes) > 0 {
for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Attributes[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintTypes(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
} }
i--
dAtA[i] = 0x18
}
if len(m.Value) > 0 {
i -= len(m.Value)
copy(dAtA[i:], m.Value)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Value)))
i--
dAtA[i] = 0x12
} }
if len(m.Key) > 0 {
i -= len(m.Key)
copy(dAtA[i:], m.Key)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Key)))
if len(m.Type) > 0 {
i -= len(m.Type)
copy(dAtA[i:], m.Type)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Type)))
i-- i--
dAtA[i] = 0xa dAtA[i] = 0xa
} }
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *Event) Marshal() (dAtA []byte, err error) {
func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size]) n, err := m.MarshalToSizedBuffer(dAtA[:size])
@ -6158,34 +6158,37 @@ func (m *Event) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil return dAtA[:n], nil
} }
func (m *Event) MarshalTo(dAtA []byte) (int, error) {
func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) {
size := m.Size() size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size]) return m.MarshalToSizedBuffer(dAtA[:size])
} }
func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) {
func (m *EventAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA) i := len(dAtA)
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.Attributes) > 0 {
for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Attributes[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintTypes(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
if m.Index {
i--
if m.Index {
dAtA[i] = 1
} else {
dAtA[i] = 0
} }
i--
dAtA[i] = 0x18
} }
if len(m.Type) > 0 {
i -= len(m.Type)
copy(dAtA[i:], m.Type)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Type)))
if len(m.Value) > 0 {
i -= len(m.Value)
copy(dAtA[i:], m.Value)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Value)))
i--
dAtA[i] = 0x12
}
if len(m.Key) > 0 {
i -= len(m.Key)
copy(dAtA[i:], m.Key)
i = encodeVarintTypes(dAtA, i, uint64(len(m.Key)))
i-- i--
dAtA[i] = 0xa dAtA[i] = 0xa
} }
@ -7524,41 +7527,41 @@ func (m *LastCommitInfo) Size() (n int) {
return n return n
} }
func (m *EventAttribute) Size() (n int) {
func (m *Event) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
} }
var l int var l int
_ = l _ = l
l = len(m.Key)
if l > 0 {
n += 1 + l + sovTypes(uint64(l))
}
l = len(m.Value)
l = len(m.Type)
if l > 0 { if l > 0 {
n += 1 + l + sovTypes(uint64(l)) n += 1 + l + sovTypes(uint64(l))
} }
if m.Index {
n += 2
if len(m.Attributes) > 0 {
for _, e := range m.Attributes {
l = e.Size()
n += 1 + l + sovTypes(uint64(l))
}
} }
return n return n
} }
func (m *Event) Size() (n int) {
func (m *EventAttribute) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
} }
var l int var l int
_ = l _ = l
l = len(m.Type)
l = len(m.Key)
if l > 0 { if l > 0 {
n += 1 + l + sovTypes(uint64(l)) n += 1 + l + sovTypes(uint64(l))
} }
if len(m.Attributes) > 0 {
for _, e := range m.Attributes {
l = e.Size()
n += 1 + l + sovTypes(uint64(l))
}
l = len(m.Value)
if l > 0 {
n += 1 + l + sovTypes(uint64(l))
}
if m.Index {
n += 2
} }
return n return n
} }
@ -13260,7 +13263,7 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *EventAttribute) Unmarshal(dAtA []byte) error {
func (m *Event) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0
for iNdEx < l { for iNdEx < l {
@ -13283,17 +13286,17 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3) fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7) wireType := int(wire & 0x7)
if wireType == 4 { if wireType == 4 {
return fmt.Errorf("proto: EventAttribute: wiretype end group for non-group")
return fmt.Errorf("proto: Event: wiretype end group for non-group")
} }
if fieldNum <= 0 { if fieldNum <= 0 {
return fmt.Errorf("proto: EventAttribute: illegal tag %d (wire type %d)", fieldNum, wire)
return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
} }
switch fieldNum { switch fieldNum {
case 1: case 1:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
} }
var byteLen int
var stringLen uint64
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
if shift >= 64 { if shift >= 64 {
return ErrIntOverflowTypes return ErrIntOverflowTypes
@ -13303,31 +13306,29 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
} }
b := dAtA[iNdEx] b := dAtA[iNdEx]
iNdEx++ iNdEx++
byteLen |= int(b&0x7F) << shift
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 { if b < 0x80 {
break break
} }
} }
if byteLen < 0 {
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
postIndex := iNdEx + byteLen
postIndex := iNdEx + intStringLen
if postIndex < 0 { if postIndex < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
if m.Key == nil {
m.Key = []byte{}
}
m.Type = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
case 2: case 2:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType)
} }
var byteLen int
var msglen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
if shift >= 64 { if shift >= 64 {
return ErrIntOverflowTypes return ErrIntOverflowTypes
@ -13337,46 +13338,26 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
} }
b := dAtA[iNdEx] b := dAtA[iNdEx]
iNdEx++ iNdEx++
byteLen |= int(b&0x7F) << shift
msglen |= int(b&0x7F) << shift
if b < 0x80 { if b < 0x80 {
break break
} }
} }
if byteLen < 0 {
if msglen < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
postIndex := iNdEx + byteLen
postIndex := iNdEx + msglen
if postIndex < 0 { if postIndex < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...)
if m.Value == nil {
m.Value = []byte{}
m.Attributes = append(m.Attributes, EventAttribute{})
if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.Index = bool(v != 0)
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:]) skippy, err := skipTypes(dAtA[iNdEx:])
@ -13401,7 +13382,7 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *Event) Unmarshal(dAtA []byte) error {
func (m *EventAttribute) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0
for iNdEx < l { for iNdEx < l {
@ -13424,17 +13405,17 @@ func (m *Event) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3) fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7) wireType := int(wire & 0x7)
if wireType == 4 { if wireType == 4 {
return fmt.Errorf("proto: Event: wiretype end group for non-group")
return fmt.Errorf("proto: EventAttribute: wiretype end group for non-group")
} }
if fieldNum <= 0 { if fieldNum <= 0 {
return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
return fmt.Errorf("proto: EventAttribute: illegal tag %d (wire type %d)", fieldNum, wire)
} }
switch fieldNum { switch fieldNum {
case 1: case 1:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
} }
var stringLen uint64
var byteLen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
if shift >= 64 { if shift >= 64 {
return ErrIntOverflowTypes return ErrIntOverflowTypes
@ -13444,29 +13425,31 @@ func (m *Event) Unmarshal(dAtA []byte) error {
} }
b := dAtA[iNdEx] b := dAtA[iNdEx]
iNdEx++ iNdEx++
stringLen |= uint64(b&0x7F) << shift
byteLen |= int(b&0x7F) << shift
if b < 0x80 { if b < 0x80 {
break break
} }
} }
intStringLen := int(stringLen)
if intStringLen < 0 {
if byteLen < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
postIndex := iNdEx + intStringLen
postIndex := iNdEx + byteLen
if postIndex < 0 { if postIndex < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.Type = string(dAtA[iNdEx:postIndex])
m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...)
if m.Key == nil {
m.Key = []byte{}
}
iNdEx = postIndex iNdEx = postIndex
case 2: case 2:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
} }
var msglen int
var byteLen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
if shift >= 64 { if shift >= 64 {
return ErrIntOverflowTypes return ErrIntOverflowTypes
@ -13476,26 +13459,46 @@ func (m *Event) Unmarshal(dAtA []byte) error {
} }
b := dAtA[iNdEx] b := dAtA[iNdEx]
iNdEx++ iNdEx++
msglen |= int(b&0x7F) << shift
byteLen |= int(b&0x7F) << shift
if b < 0x80 { if b < 0x80 {
break break
} }
} }
if msglen < 0 {
if byteLen < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
postIndex := iNdEx + msglen
postIndex := iNdEx + byteLen
if postIndex < 0 { if postIndex < 0 {
return ErrInvalidLengthTypes return ErrInvalidLengthTypes
} }
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.Attributes = append(m.Attributes, EventAttribute{})
if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...)
if m.Value == nil {
m.Value = []byte{}
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.Index = bool(v != 0)
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:]) skippy, err := skipTypes(dAtA[iNdEx:])


+ 16
- 8
docs/app-dev/indexing-transactions.md View File

@ -14,9 +14,13 @@ type, only the key-value pairs defined in `EndBlock` are used.
Each event contains a type and a list of attributes, which are key-value pairs Each event contains a type and a list of attributes, which are key-value pairs
denoting something about what happened during the method's execution. For more denoting something about what happened during the method's execution. For more
details on `Events`, see the [ABCI]https://github.com/tendermint/spec/blob/master/spec/abci/abci.md#events) documentation.
details on `Events`, see the
[ABCI]https://github.com/tendermint/spec/blob/master/spec/abci/abci.md#events)
documentation.
An Event has a composite key associated with it. A `compositeKey` is
constructed by its type and key separated by a dot.
An Event has a composite key associated with it. A `compositeKey` is constructed by its type and key separated by a dot.
For example: For example:
```json ```json
@ -45,13 +49,15 @@ By default, Tendermint will index all transactions by their respective
hashes using an embedded simple indexer. Note, we are planning to add hashes using an embedded simple indexer. Note, we are planning to add
more options in the future (e.g., PostgreSQL indexer). more options in the future (e.g., PostgreSQL indexer).
## Adding Events
You can turn off indexing completely by setting `tx_index` to `null`.
## Adding Events
Applications are free to define which events to index. Tendermint does not expose functionality to define
which events to index and which to ignore. In your application's `DeliverTx` method, add the `Events` field with pairs of
UTF-8 encoded strings (e.g. "transfer.sender": "Bob", "transfer.recipient": "Alice",
"transfer.balance": "100").
Applications are free to define which events to index. Tendermint does not
expose functionality to define which events to index and which to ignore. In
your application's `DeliverTx` method, add the `Events` field with pairs of
UTF-8 encoded strings (e.g. "transfer.sender": "Bob", "transfer.recipient":
"Alice", "transfer.balance": "100").
Example: Example:
@ -73,7 +79,9 @@ func (app *KVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.Resul
} }
``` ```
The index will be added if the `Index` field of attribute is set to true. In above example, all events will be indexed.
The transaction will be indexed (if the indexer is not `null`) with a certain
attribute if the attribute's `Index` field is set to `true`. In the above
example, all attributes will be used.
## Querying Transactions ## Querying Transactions


+ 10
- 7
proto/tendermint/abci/types.proto View File

@ -299,13 +299,9 @@ message LastCommitInfo {
repeated VoteInfo votes = 2 [(gogoproto.nullable) = false]; repeated VoteInfo votes = 2 [(gogoproto.nullable) = false];
} }
// EventAttribute represents an event to the indexing service.
message EventAttribute {
bytes key = 1;
bytes value = 2;
bool index = 3;
}
// Event allows application developers to attach additional information to
// ResponseBeginBlock, ResponseEndBlock, ResponseCheckTx and ResponseDeliverTx.
// Later, transactions may be queried using these events.
message Event { message Event {
string type = 1; string type = 1;
repeated EventAttribute attributes = 2 [ repeated EventAttribute attributes = 2 [
@ -314,6 +310,13 @@ message Event {
]; ];
} }
// EventAttribute is a single key-value pair, associated with an event.
message EventAttribute {
bytes key = 1;
bytes value = 2;
bool index = 3; // nondeterministic
}
// TxResult contains results of executing the transaction. // TxResult contains results of executing the transaction.
// //
// One usage is indexing transaction results. // One usage is indexing transaction results.


Loading…
Cancel
Save