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
}
// 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}
}
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
func (m *Event) XXX_Unmarshal(b []byte) error {
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 {
return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic)
return xxx_messageInfo_Event.Marshal(b, m, deterministic)
} else {
b = b[:cap(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
}
}
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()
}
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 {
return m.Key
return m.Type
}
return nil
return ""
}
func (m *EventAttribute) GetValue() []byte {
func (m *Event) GetAttributes() []EventAttribute {
if m != nil {
return m.Value
return m.Attributes
}
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}
}
func (m *Event) XXX_Unmarshal(b []byte) error {
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
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 {
return xxx_messageInfo_Event.Marshal(b, m, deterministic)
return xxx_messageInfo_EventAttribute.Marshal(b, m, deterministic)
} else {
b = b[:cap(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
}
}
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()
}
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 {
return m.Type
return m.Key
}
return ""
return nil
}
func (m *Event) GetAttributes() []EventAttribute {
func (m *EventAttribute) GetValue() []byte {
if m != nil {
return m.Attributes
return m.Value
}
return nil
}
func (m *EventAttribute) GetIndex() bool {
if m != nil {
return m.Index
}
return false
}
// TxResult contains results of executing the transaction.
//
// One usage is indexing transaction results.
@ -3135,8 +3138,8 @@ func init() {
proto.RegisterType((*ConsensusParams)(nil), "tendermint.abci.ConsensusParams")
proto.RegisterType((*BlockParams)(nil), "tendermint.abci.BlockParams")
proto.RegisterType((*LastCommitInfo)(nil), "tendermint.abci.LastCommitInfo")
proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute")
proto.RegisterType((*Event)(nil), "tendermint.abci.Event")
proto.RegisterType((*EventAttribute)(nil), "tendermint.abci.EventAttribute")
proto.RegisterType((*TxResult)(nil), "tendermint.abci.TxResult")
proto.RegisterType((*Validator)(nil), "tendermint.abci.Validator")
proto.RegisterType((*ValidatorUpdate)(nil), "tendermint.abci.ValidatorUpdate")
@ -3148,174 +3151,174 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
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,
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,
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,
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,
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.
@ -6101,7 +6104,7 @@ func (m *LastCommitInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
func (m *Event) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@ -6111,44 +6114,41 @@ func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) {
func (m *Event) MarshalTo(dAtA []byte) (int, error) {
size := m.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
var l int
_ = 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--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *Event) Marshal() (dAtA []byte, err error) {
func (m *EventAttribute) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@ -6158,34 +6158,37 @@ func (m *Event) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
func (m *Event) MarshalTo(dAtA []byte) (int, error) {
func (m *EventAttribute) MarshalTo(dAtA []byte) (int, error) {
size := m.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
var l int
_ = 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--
dAtA[i] = 0xa
}
@ -7524,41 +7527,41 @@ func (m *LastCommitInfo) Size() (n int) {
return n
}
func (m *EventAttribute) Size() (n int) {
func (m *Event) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = 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 {
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
}
func (m *Event) Size() (n int) {
func (m *EventAttribute) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Type)
l = len(m.Key)
if l > 0 {
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
}
@ -13260,7 +13263,7 @@ func (m *LastCommitInfo) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *EventAttribute) Unmarshal(dAtA []byte) error {
func (m *Event) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@ -13283,17 +13286,17 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
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 {
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 {
case 1:
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 {
if shift >= 64 {
return ErrIntOverflowTypes
@ -13303,31 +13306,29 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + byteLen
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
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
case 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 {
if shift >= 64 {
return ErrIntOverflowTypes
@ -13337,46 +13338,26 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
if msglen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + byteLen
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
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
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:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@ -13401,7 +13382,7 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *Event) Unmarshal(dAtA []byte) error {
func (m *EventAttribute) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@ -13424,17 +13405,17 @@ func (m *Event) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
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 {
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 {
case 1:
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 {
if shift >= 64 {
return ErrIntOverflowTypes
@ -13444,29 +13425,31 @@ func (m *Event) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
if byteLen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + intStringLen
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
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
case 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 {
if shift >= 64 {
return ErrIntOverflowTypes
@ -13476,26 +13459,46 @@ func (m *Event) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
if byteLen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + msglen
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
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
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:
iNdEx = preIndex
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
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:
```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
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:
@ -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


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

@ -299,13 +299,9 @@ message LastCommitInfo {
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 {
string type = 1;
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.
//
// One usage is indexing transaction results.


Loading…
Cancel
Save