Cleanup TransactionDetails RPC messages.

Remove the addresses field from TransactionDetails.Output.  It is
assumed that the caller is able to deserialize the transaction and
encode the output scripts to addresses, so this is unnecessary server
overhead and conflicts with the current API philosophy of not
duplicating data already included in another field.

Since there is no additional data included for outputs not controlled
by the wallet, remove the `mine` specifier from the Output message and
replace it with an output index.  Only include messages for controlled
outputs, rather than creating messages for both controlled and
uncontrolled outputs.  Rename the repeated field from `outputs` to
`credits` to be consistent with the `debits` field.

Bump major API version as this is a breaking change.

Closes #408.
This commit is contained in:
Josh Rickmar 2016-04-15 10:11:35 -04:00
parent 5e3613775d
commit fb06a6bd04
5 changed files with 178 additions and 220 deletions

View file

@ -56,19 +56,14 @@ message TransactionDetails {
int64 previous_amount = 3;
}
message Output {
bool mine = 3;
// These fields only relevant if mine==true.
uint32 account = 4;
bool internal = 5;
// These fields only relevant if mine==false.
repeated string addresses = 6; // None if non-standard.
uint32 index = 1;
uint32 account = 2;
bool internal = 3;
}
bytes hash = 1;
bytes transaction = 2;
repeated Input debits = 3;
repeated Output outputs = 4;
repeated Output credits = 4;
int64 fee = 5;
int64 timestamp = 6; // May be earlier than a block timestamp, but never later.
}

View file

@ -1,6 +1,6 @@
# RPC API Specification
Version: 1.0.0
Version: 2.0.0
**Note:** This document assumes the reader is familiar with gRPC concepts.
Refer to the [gRPC Concepts documentation](http://www.grpc.io/docs/guides/concepts.html)
@ -958,23 +958,17 @@ transaction was seen.
- `int64 previous_amount`: The previous output value.
- `repeated Output outputs`: Properties for every transaction output. Every
transaction output has a corresponding properties message in this repeated
field.
- `repeated Output credits`: Properties for every output controlled by the wallet.
**Nested message:** `Output`
- `bool mine`: Whether the output is controlled by the wallet.
- `uint32 index`: The transaction output index of the output being reported.
- `uint32 account`: The account number of the controlled output. This field
is only relevant if `mine` is true.
- `uint32 account`: The account number of the controlled output.
- `bool internal`: Whether the output pays to an address derived from the
account's internal key series. This often means the output is a change
output. This field is only relevant if `mine` is true.
- `repeated string addresses`: The payment address string(s) this output pays
to. This is only relevant if `mine` is false.
output.
- `int64 fee`: The transaction fee, if calculable. The fee is only calculable
when every previous output spent by this transaction is also recorded by
@ -984,5 +978,5 @@ transaction was seen.
seen.
**Stability**: Unstable: Since the caller is expected to decode the serialized
transaction, and would have access to every output script, The output
transaction, and would have access to every output script, the output
properties could be changed to only include outputs controlled by the wallet.

View file

@ -43,8 +43,8 @@ import (
// Public API version constants
const (
semverString = "1.0.0"
semverMajor = 1
semverString = "2.0.0"
semverMajor = 2
semverMinor = 0
semverPatch = 0
)
@ -568,20 +568,10 @@ func marshalTransactionOutputs(v []wallet.TransactionSummaryOutput) []*pb.Transa
outputs := make([]*pb.TransactionDetails_Output, len(v))
for i := range v {
output := &v[i]
var addresses []string
if len(output.Addresses) != 0 {
addresses = make([]string, 0, len(output.Addresses))
for _, a := range output.Addresses {
addresses = append(addresses, a.EncodeAddress())
}
}
outputs[i] = &pb.TransactionDetails_Output{
Mine: output.Mine,
Account: output.Account,
Internal: output.Internal,
Addresses: addresses,
Index: output.Index,
Account: output.Account,
Internal: output.Internal,
}
}
return outputs
@ -595,7 +585,7 @@ func marshalTransactionDetails(v []wallet.TransactionSummary) []*pb.TransactionD
Hash: tx.Hash[:],
Transaction: tx.Transaction,
Debits: marshalTransactionInputs(tx.MyInputs),
Outputs: marshalTransactionOutputs(tx.Outputs),
Credits: marshalTransactionOutputs(tx.MyOutputs),
Fee: int64(tx.Fee),
Timestamp: tx.Timestamp,
}

View file

@ -149,7 +149,7 @@ type TransactionDetails struct {
Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
Transaction []byte `protobuf:"bytes,2,opt,name=transaction,proto3" json:"transaction,omitempty"`
Debits []*TransactionDetails_Input `protobuf:"bytes,3,rep,name=debits" json:"debits,omitempty"`
Outputs []*TransactionDetails_Output `protobuf:"bytes,4,rep,name=outputs" json:"outputs,omitempty"`
Credits []*TransactionDetails_Output `protobuf:"bytes,4,rep,name=credits" json:"credits,omitempty"`
Fee int64 `protobuf:"varint,5,opt,name=fee" json:"fee,omitempty"`
Timestamp int64 `protobuf:"varint,6,opt,name=timestamp" json:"timestamp,omitempty"`
}
@ -166,9 +166,9 @@ func (m *TransactionDetails) GetDebits() []*TransactionDetails_Input {
return nil
}
func (m *TransactionDetails) GetOutputs() []*TransactionDetails_Output {
func (m *TransactionDetails) GetCredits() []*TransactionDetails_Output {
if m != nil {
return m.Outputs
return m.Credits
}
return nil
}
@ -185,12 +185,9 @@ func (*TransactionDetails_Input) ProtoMessage() {}
func (*TransactionDetails_Input) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} }
type TransactionDetails_Output struct {
Mine bool `protobuf:"varint,3,opt,name=mine" json:"mine,omitempty"`
// These fields only relevant if mine==true.
Account uint32 `protobuf:"varint,4,opt,name=account" json:"account,omitempty"`
Internal bool `protobuf:"varint,5,opt,name=internal" json:"internal,omitempty"`
// These fields only relevant if mine==false.
Addresses []string `protobuf:"bytes,6,rep,name=addresses" json:"addresses,omitempty"`
Index uint32 `protobuf:"varint,1,opt,name=index" json:"index,omitempty"`
Account uint32 `protobuf:"varint,2,opt,name=account" json:"account,omitempty"`
Internal bool `protobuf:"varint,3,opt,name=internal" json:"internal,omitempty"`
}
func (m *TransactionDetails_Output) Reset() { *m = TransactionDetails_Output{} }
@ -1786,156 +1783,155 @@ var _WalletLoaderService_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptor0 = []byte{
// 2413 bytes of a gzipped FileDescriptorProto
// 2391 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x59, 0x5b, 0x73, 0xdc, 0x48,
0x15, 0x66, 0x2c, 0xdf, 0x72, 0xe6, 0xde, 0xbe, 0x4d, 0x94, 0x38, 0xc9, 0x2a, 0xbb, 0xd9, 0xec,
0x2e, 0x98, 0x60, 0x02, 0x2c, 0xc5, 0x56, 0xd8, 0xc4, 0x64, 0xd9, 0x21, 0xc1, 0x99, 0x92, 0x93,
0x4d, 0xaa, 0xa0, 0x98, 0x92, 0x35, 0xed, 0x58, 0x78, 0x46, 0x9a, 0x48, 0x9a, 0x38, 0xe1, 0x89,
0xa2, 0x8a, 0x47, 0x5e, 0x80, 0x07, 0x0a, 0x6a, 0x5f, 0xf8, 0x05, 0x54, 0xf1, 0xc2, 0x2b, 0xbf,
0x81, 0x47, 0xf8, 0x15, 0xfc, 0x02, 0xfa, 0x72, 0x7a, 0xd4, 0x2d, 0x69, 0xc6, 0xf6, 0x16, 0x6f,
0xa3, 0xaf, 0x4f, 0x9f, 0x3e, 0xe7, 0xf4, 0xb9, 0xf6, 0xc0, 0x25, 0x6f, 0x1c, 0xec, 0x8c, 0xe3,
0xa2, 0x8a, 0x47, 0x5e, 0x80, 0x07, 0x0a, 0x6a, 0x5f, 0xf8, 0x05, 0x54, 0xf1, 0xc2, 0x23, 0xfc,
0x06, 0x1e, 0xf9, 0x17, 0xfc, 0x02, 0xfa, 0x72, 0x7a, 0xd4, 0x2d, 0x69, 0xc6, 0xf6, 0x16, 0x6f,
0xa3, 0xaf, 0xcf, 0x39, 0x7d, 0xfa, 0xf4, 0xb9, 0xf6, 0xc0, 0x25, 0x6f, 0x1c, 0xec, 0x8c, 0xe3,
0x28, 0x8d, 0xc8, 0xa5, 0x53, 0x6f, 0x38, 0xa4, 0x69, 0x3c, 0xf6, 0x9d, 0x16, 0x34, 0xbe, 0xa0,
0x71, 0x12, 0x44, 0xa1, 0x4b, 0x5f, 0x4d, 0x68, 0x92, 0x3a, 0xff, 0xac, 0x40, 0x73, 0x0a, 0x25,
0x71, 0x12, 0x44, 0xa1, 0x4b, 0x5f, 0x4d, 0x68, 0x92, 0x3a, 0xff, 0xaa, 0x40, 0x73, 0x0a, 0x25,
0xe3, 0x28, 0x4c, 0x28, 0x79, 0x0f, 0x1a, 0xaf, 0x25, 0xd4, 0x4f, 0xd2, 0x38, 0x08, 0x5f, 0x76,
0x2a, 0x37, 0x2a, 0xb7, 0x2f, 0xb9, 0x75, 0x44, 0x0f, 0x04, 0x48, 0xd6, 0x61, 0x69, 0xe4, 0xfd,
0x32, 0x8a, 0x3b, 0x0b, 0x6c, 0xb5, 0xee, 0xca, 0x0f, 0x81, 0x06, 0x21, 0x43, 0x2d, 0x44, 0xf9,
0x07, 0x47, 0xc7, 0x5e, 0xea, 0x1f, 0x77, 0x16, 0x25, 0x2a, 0x3e, 0xc8, 0x35, 0x80, 0x71, 0x4c,
0x63, 0x3a, 0xa4, 0x5e, 0x42, 0x3b, 0x4b, 0xe2, 0x10, 0x0d, 0xe1, 0x82, 0x1c, 0x4e, 0x82, 0xe1,
0xa0, 0x3f, 0xa2, 0xa9, 0x37, 0xf0, 0x52, 0xaf, 0xb3, 0x2c, 0x05, 0x11, 0xe8, 0x4f, 0x11, 0x74,
0xfe, 0x63, 0x01, 0x79, 0x1a, 0x7b, 0x61, 0xe2, 0xf9, 0x29, 0x13, 0xef, 0x47, 0x0c, 0x0f, 0x86,
0x09, 0x21, 0xb0, 0x78, 0xec, 0x25, 0xc7, 0x42, 0xf8, 0x9a, 0x2b, 0x7e, 0x93, 0x1b, 0x50, 0x4d,
0x33, 0x4a, 0x21, 0x79, 0xcd, 0xd5, 0x21, 0xf2, 0x03, 0x58, 0x1e, 0xd0, 0xc3, 0x20, 0x4d, 0x98,
0x02, 0xd6, 0xed, 0xea, 0xee, 0xcd, 0x9d, 0xa9, 0xf9, 0x76, 0x8a, 0x87, 0xec, 0x74, 0xc3, 0xf1,
0x24, 0x75, 0x71, 0x0b, 0xb9, 0x07, 0x2b, 0xd1, 0x24, 0x65, 0x48, 0xc2, 0x14, 0xe5, 0xbb, 0xdf,
0x9d, 0xbf, 0xfb, 0x89, 0x20, 0x76, 0xd5, 0x26, 0xd2, 0x02, 0xeb, 0x88, 0x4a, 0x4b, 0x58, 0x2e,
0xff, 0x49, 0xae, 0xc2, 0xa5, 0x34, 0x18, 0xb1, 0x9b, 0xf2, 0x46, 0x63, 0xa1, 0xbd, 0xe5, 0x66,
0x80, 0xfd, 0x0a, 0x96, 0x84, 0x00, 0xdc, 0xbe, 0x41, 0x38, 0xa0, 0x6f, 0x84, 0xb2, 0xcc, 0xbe,
0x63, 0x3a, 0xa4, 0x5e, 0x42, 0x3b, 0x4b, 0x62, 0x13, 0x0d, 0xe1, 0x8a, 0x1c, 0x4e, 0x82, 0xe1,
0xa0, 0x3f, 0xa2, 0xa9, 0x37, 0xf0, 0x52, 0xaf, 0xb3, 0x2c, 0x15, 0x11, 0xe8, 0x4f, 0x11, 0x74,
0xfe, 0x69, 0x01, 0x79, 0x1a, 0x7b, 0x61, 0xe2, 0xf9, 0x29, 0x53, 0xef, 0x47, 0x0c, 0x0f, 0x86,
0x09, 0x21, 0xb0, 0x78, 0xec, 0x25, 0xc7, 0x42, 0xf9, 0x9a, 0x2b, 0x7e, 0x93, 0x1b, 0x50, 0x4d,
0x33, 0x4a, 0xa1, 0x79, 0xcd, 0xd5, 0x21, 0xf2, 0x03, 0x58, 0x1e, 0xd0, 0xc3, 0x20, 0x4d, 0xd8,
0x01, 0xac, 0xdb, 0xd5, 0xdd, 0x9b, 0x3b, 0x53, 0xf3, 0xed, 0x14, 0x37, 0xd9, 0xe9, 0x86, 0xe3,
0x49, 0xea, 0x22, 0x0b, 0xb9, 0x07, 0x2b, 0x7e, 0x4c, 0x07, 0x9c, 0x7b, 0x51, 0x70, 0xbf, 0x3b,
0x9f, 0xfb, 0xc9, 0x24, 0xe5, 0xec, 0x8a, 0x89, 0xb4, 0xc0, 0x3a, 0xa2, 0xd2, 0x12, 0x96, 0xcb,
0x7f, 0x92, 0xab, 0x70, 0x29, 0x0d, 0x46, 0xec, 0xa6, 0xbc, 0xd1, 0x58, 0x9c, 0xde, 0x72, 0x33,
0xc0, 0x7e, 0x05, 0x4b, 0x42, 0x01, 0x6e, 0xdf, 0x20, 0x1c, 0xd0, 0x37, 0xe2, 0xb0, 0xcc, 0xbe,
0xe2, 0x83, 0x7c, 0x00, 0x2d, 0x66, 0xcd, 0xd7, 0x41, 0x34, 0x49, 0xfa, 0x9e, 0xef, 0x47, 0x93,
0x30, 0xc5, 0xcb, 0x6a, 0x2a, 0xfc, 0xbe, 0x84, 0xc9, 0xfb, 0xd0, 0xcc, 0x48, 0x47, 0x82, 0xd2,
0x12, 0xa7, 0x35, 0xa6, 0x94, 0x02, 0xb5, 0xc7, 0xb0, 0x2c, 0xa5, 0xe6, 0xf6, 0x65, 0x97, 0x4b,
0x05, 0xdd, 0xaa, 0x2b, 0x7e, 0x93, 0x0e, 0xac, 0xa8, 0x83, 0xe4, 0x4d, 0xab, 0x4f, 0x62, 0xc3,
0x6a, 0x10, 0xa6, 0x34, 0x0e, 0xbd, 0xa1, 0xd0, 0x6f, 0xd5, 0x9d, 0x7e, 0x73, 0x25, 0xbd, 0xc1,
0x20, 0xa6, 0x49, 0x42, 0x13, 0xa6, 0xa4, 0xc5, 0xae, 0x38, 0x03, 0x9c, 0xbf, 0x54, 0xa0, 0xf6,
0x60, 0x18, 0xf9, 0x27, 0xf3, 0x2e, 0x76, 0x13, 0x96, 0x8f, 0x69, 0xf0, 0xf2, 0x58, 0x2a, 0xb8,
0xe4, 0xe2, 0x97, 0x69, 0x3f, 0x2b, 0x67, 0x3f, 0x72, 0x1f, 0x6a, 0xda, 0xdd, 0xab, 0x4b, 0xdb,
0x9e, 0x7b, 0x69, 0xae, 0xb1, 0xc5, 0x79, 0x02, 0x0d, 0xb4, 0xe1, 0x03, 0x6f, 0xe8, 0x85, 0xbe,
0x61, 0x83, 0x8a, 0x69, 0x83, 0x9b, 0x50, 0x4f, 0xa3, 0xd4, 0x1b, 0xf6, 0x0f, 0x25, 0xa9, 0x90,
0xd5, 0x62, 0x0c, 0x39, 0x88, 0xdb, 0x9d, 0x3a, 0x54, 0x7b, 0x2c, 0xbc, 0x54, 0x80, 0x36, 0xa0,
0x26, 0x3f, 0x65, 0x70, 0xf2, 0x10, 0xde, 0xa7, 0xe9, 0x69, 0x14, 0x9f, 0x28, 0x8a, 0x8f, 0xa1,
0x39, 0x45, 0xb2, 0x08, 0xe6, 0xf2, 0xbd, 0xa6, 0xfd, 0x50, 0xae, 0xa0, 0x24, 0x75, 0x89, 0x22,
0xb9, 0xf3, 0x7d, 0x58, 0x47, 0xd9, 0xf7, 0x27, 0xa3, 0x43, 0x1a, 0x23, 0x47, 0xf2, 0x0e, 0xd4,
0x50, 0xe4, 0x7e, 0xe8, 0x8d, 0x28, 0x86, 0x7f, 0x15, 0xb1, 0x7d, 0x06, 0x39, 0xf7, 0x60, 0x23,
0xb7, 0x55, 0x3f, 0x1a, 0xf7, 0x8a, 0x95, 0xec, 0x68, 0x8d, 0xdc, 0x69, 0x43, 0x13, 0xf7, 0x27,
0x4a, 0x8f, 0x7f, 0x58, 0xd0, 0xca, 0x30, 0x64, 0xf7, 0x43, 0x58, 0xc5, 0x8d, 0x09, 0x63, 0x94,
0x0f, 0xc8, 0x3c, 0xb9, 0x02, 0xdc, 0xe9, 0x26, 0xf2, 0x75, 0x20, 0xfe, 0x24, 0x8e, 0x29, 0x93,
0xe7, 0x90, 0x3b, 0x51, 0x5f, 0xb8, 0x8e, 0x0c, 0xfc, 0x16, 0xae, 0x08, 0xef, 0xfa, 0x9c, 0xbb,
0xd1, 0x1d, 0x58, 0xcf, 0x51, 0x4b, 0xa7, 0xb2, 0x84, 0x53, 0x11, 0x83, 0x5e, 0xac, 0xd8, 0xbf,
0x59, 0x80, 0x15, 0x15, 0x44, 0xe7, 0xd3, 0xbd, 0x60, 0xde, 0x85, 0x82, 0x79, 0x8b, 0x9e, 0x62,
0x15, 0x3d, 0x85, 0xab, 0x46, 0xdf, 0xc8, 0x10, 0xea, 0x9f, 0xd0, 0xb7, 0x7d, 0x3d, 0xee, 0x5a,
0x6a, 0xe5, 0x11, 0x7d, 0xbb, 0x27, 0x84, 0x63, 0xd4, 0x2a, 0xe0, 0x34, 0xea, 0x25, 0x49, 0xad,
0x56, 0x0c, 0xea, 0xd1, 0x38, 0x8a, 0x53, 0x3a, 0xd0, 0xa8, 0x97, 0x91, 0x1a, 0x57, 0x14, 0xb5,
0xf3, 0x02, 0xd6, 0x5d, 0xca, 0x75, 0x51, 0xf6, 0x47, 0x47, 0x3a, 0xa7, 0x41, 0x2e, 0xc3, 0x6a,
0x48, 0x4f, 0x75, 0x63, 0xac, 0xb0, 0x6f, 0xe1, 0x67, 0x5b, 0xb0, 0x91, 0xe3, 0x8c, 0x71, 0xf0,
0x1c, 0xc8, 0x3e, 0xd3, 0x31, 0x77, 0x20, 0xaf, 0x28, 0x5e, 0x92, 0x8c, 0x8f, 0x63, 0x5e, 0x51,
0x64, 0x82, 0xd0, 0x90, 0x73, 0x98, 0xde, 0xf9, 0x04, 0xd6, 0x0c, 0xc6, 0x17, 0xf3, 0xeb, 0x3f,
0x57, 0x50, 0x2e, 0x99, 0xbe, 0x94, 0x5c, 0xb3, 0x73, 0xc2, 0x77, 0x61, 0xf1, 0x84, 0x65, 0x6b,
0x21, 0x49, 0x63, 0xd7, 0xd1, 0x9c, 0xbb, 0xc8, 0x66, 0xe7, 0x11, 0xa3, 0x74, 0x05, 0xbd, 0xb3,
0x0b, 0x8b, 0xfc, 0x8b, 0x65, 0xfe, 0xd6, 0x83, 0x6e, 0xef, 0xce, 0x9d, 0xbb, 0x77, 0xfb, 0x0f,
0x5f, 0x3c, 0x7d, 0xe8, 0xee, 0xdf, 0x7f, 0xdc, 0xfa, 0x9a, 0x8e, 0x76, 0xf7, 0x11, 0xad, 0x38,
0xdf, 0x44, 0xd5, 0x14, 0x53, 0x54, 0x8d, 0x0b, 0x27, 0x21, 0x8c, 0x74, 0xf5, 0xe9, 0xfc, 0xa1,
0x02, 0x5b, 0x5d, 0x71, 0xd9, 0xbd, 0x38, 0x78, 0xed, 0xa5, 0x94, 0xdd, 0xf8, 0x79, 0x4d, 0xad,
0xa9, 0xbc, 0x60, 0xaa, 0x7c, 0x8b, 0xd7, 0x1a, 0xc1, 0x4e, 0xb8, 0xd6, 0x69, 0x70, 0x24, 0xdc,
0x9b, 0xd5, 0xf5, 0xf1, 0xf4, 0x94, 0xe7, 0xc1, 0x11, 0xcf, 0xe9, 0x4c, 0x0a, 0xdf, 0x0b, 0x85,
0x4f, 0xaf, 0xba, 0xf8, 0xe5, 0xd8, 0xd0, 0x29, 0x0a, 0x85, 0x6e, 0x11, 0x42, 0x03, 0xc3, 0xe3,
0x82, 0x3e, 0xf8, 0x1d, 0xd8, 0x8c, 0xd9, 0x8e, 0x20, 0x66, 0x0e, 0xef, 0x47, 0xe1, 0x51, 0x10,
0x8f, 0x3c, 0x59, 0x14, 0x64, 0x41, 0xd9, 0x50, 0xab, 0x7b, 0xfa, 0x22, 0x3b, 0xaf, 0x39, 0x3d,
0x0f, 0xcd, 0xc9, 0x6a, 0xb1, 0x08, 0x53, 0x71, 0x8e, 0xe5, 0xca, 0x0f, 0x5e, 0x88, 0x92, 0x31,
0x0d, 0x07, 0xde, 0xe1, 0x50, 0xe5, 0xfd, 0x0c, 0xe0, 0xe5, 0x37, 0x18, 0x31, 0x9e, 0x93, 0x98,
0xf6, 0x63, 0x7a, 0xea, 0xc5, 0x03, 0x55, 0x7e, 0x15, 0xec, 0x0a, 0xd4, 0xf9, 0xd3, 0x02, 0x6c,
0xfe, 0x98, 0xa6, 0x5a, 0x59, 0x9a, 0xfa, 0xd8, 0x0e, 0xac, 0xb1, 0xaa, 0x16, 0xa7, 0xac, 0x5a,
0xe8, 0xa9, 0x4e, 0xde, 0x4c, 0x5b, 0x2d, 0x65, 0xb9, 0x6e, 0x17, 0x36, 0xf2, 0xf4, 0x59, 0x05,
0x6d, 0xbb, 0x6b, 0xe6, 0x0e, 0x59, 0x4e, 0x3f, 0x84, 0x36, 0x13, 0x39, 0x77, 0x82, 0x25, 0x4e,
0x68, 0xca, 0x85, 0x8c, 0x3f, 0x93, 0xc7, 0xa4, 0x95, 0xdc, 0x17, 0x85, 0x39, 0xdb, 0x3a, 0xb5,
0xe4, 0x7d, 0x0f, 0xae, 0xb0, 0x1e, 0x22, 0x18, 0x4d, 0x46, 0xcc, 0x04, 0x3e, 0x4f, 0xc1, 0x46,
0x6d, 0x5e, 0x12, 0xfb, 0x2e, 0x23, 0x89, 0x2b, 0x28, 0x74, 0x33, 0x38, 0x7f, 0x67, 0xce, 0x5a,
0x30, 0x0d, 0xde, 0xc9, 0x67, 0x40, 0x78, 0x7f, 0x32, 0x30, 0x59, 0xca, 0x82, 0xb2, 0xa5, 0xc5,
0x9c, 0xde, 0x67, 0xb8, 0x6d, 0xb1, 0x45, 0xe7, 0x47, 0x7a, 0xb0, 0x3e, 0x09, 0x4b, 0x38, 0x2d,
0x9c, 0xa7, 0x71, 0x58, 0xc3, 0xad, 0x86, 0xd4, 0xac, 0x01, 0xdf, 0xda, 0x3b, 0xf6, 0xc2, 0x97,
0xb4, 0x37, 0x8d, 0x1d, 0x75, 0xa3, 0x1f, 0x83, 0xc5, 0x02, 0x44, 0xdc, 0x60, 0x63, 0xf7, 0x96,
0xc6, 0x7c, 0xc6, 0x86, 0x1d, 0x1e, 0x09, 0x7c, 0x0b, 0x77, 0xfa, 0x88, 0xf5, 0xcd, 0x5a, 0x80,
0xca, 0x8a, 0x57, 0x67, 0x68, 0xb6, 0x8d, 0x93, 0xf1, 0xc4, 0xab, 0x91, 0xc9, 0xbb, 0xac, 0x33,
0x34, 0x23, 0x73, 0xae, 0x81, 0xc5, 0x38, 0x93, 0x2a, 0xac, 0xf4, 0xdc, 0xee, 0x17, 0xf7, 0x9f,
0x3e, 0x64, 0x19, 0x06, 0x60, 0xb9, 0xf7, 0xec, 0xc1, 0xe3, 0xee, 0x1e, 0xcb, 0x2b, 0x2c, 0x20,
0x8b, 0x12, 0x61, 0x40, 0xfe, 0x9a, 0x39, 0xec, 0x67, 0x93, 0x50, 0x57, 0xfa, 0xec, 0xa4, 0xc8,
0xcb, 0x9f, 0x17, 0xbf, 0xa4, 0xa9, 0xea, 0x45, 0x55, 0xa3, 0x24, 0x40, 0xd9, 0x89, 0xce, 0x89,
0x58, 0x6b, 0x4e, 0xc4, 0x92, 0x4f, 0xc0, 0x0e, 0x42, 0x7f, 0x38, 0x19, 0xd0, 0xfe, 0x34, 0xe4,
0xfc, 0x28, 0x08, 0x0f, 0x3d, 0xde, 0x7d, 0xca, 0x4c, 0xd3, 0x41, 0x8a, 0x2e, 0x12, 0xec, 0xa9,
0x75, 0x1e, 0x34, 0x6a, 0xb7, 0x2f, 0x54, 0xee, 0x27, 0x7e, 0x1c, 0x8c, 0x53, 0xec, 0x69, 0xd7,
0x70, 0x51, 0x9a, 0xe3, 0x40, 0x2c, 0x39, 0x7f, 0xb5, 0x60, 0xab, 0x60, 0x02, 0x74, 0xcc, 0x9f,
0x43, 0x2b, 0x61, 0xd3, 0x8e, 0xcf, 0xeb, 0xac, 0x1a, 0x1d, 0xa4, 0x5b, 0x7e, 0x4b, 0xbb, 0xef,
0x19, 0xbb, 0x77, 0x7a, 0xd8, 0x9b, 0xe3, 0x1c, 0xd1, 0x54, 0xac, 0x9e, 0xe0, 0x3c, 0xc1, 0xca,
0x9d, 0x6c, 0x23, 0x0c, 0x33, 0x56, 0x05, 0x86, 0x56, 0xbc, 0x0d, 0x2d, 0x54, 0x64, 0x7c, 0xa2,
0x74, 0x91, 0x4e, 0xd0, 0x90, 0x78, 0xef, 0x44, 0xaa, 0x61, 0xff, 0xbb, 0x02, 0x0d, 0xf3, 0x40,
0x3e, 0x60, 0x68, 0x61, 0xa0, 0xe7, 0x9b, 0xa6, 0x86, 0x8b, 0x6c, 0xc0, 0x44, 0x91, 0xfa, 0xf5,
0xe5, 0xa0, 0x22, 0x6b, 0x42, 0x55, 0x62, 0x5d, 0x31, 0xae, 0xb0, 0x7c, 0x6f, 0x8c, 0x1e, 0xf8,
0x45, 0xae, 0xc0, 0xa5, 0x4c, 0xb6, 0x45, 0xc1, 0x7e, 0x75, 0x8c, 0x52, 0x71, 0xbe, 0x3c, 0x5b,
0xf0, 0x5e, 0x97, 0xf7, 0xf5, 0x38, 0x3b, 0x55, 0x11, 0x7b, 0x1a, 0xc8, 0x66, 0xea, 0x28, 0x8e,
0x46, 0xd3, 0x5b, 0x16, 0x6d, 0xcc, 0xaa, 0x5b, 0xe3, 0xa0, 0xba, 0x59, 0xe7, 0x8f, 0x15, 0xd8,
0x3c, 0x08, 0x5e, 0x86, 0x25, 0x7e, 0x7a, 0x56, 0xa5, 0x63, 0x8e, 0x98, 0xd0, 0x38, 0xf0, 0x86,
0xc1, 0xaf, 0xcc, 0xbc, 0x80, 0x41, 0xb7, 0x91, 0xad, 0x6a, 0xdc, 0xb9, 0x58, 0x41, 0x38, 0x35,
0x08, 0x95, 0x03, 0x67, 0xdd, 0xad, 0x09, 0xb0, 0x2b, 0x31, 0xe7, 0x15, 0x6c, 0x15, 0xa4, 0x42,
0xd7, 0xc9, 0xcd, 0xb2, 0x95, 0xe2, 0x2c, 0x7b, 0x17, 0x36, 0x27, 0x61, 0xc2, 0xb6, 0x33, 0xb1,
0xcc, 0xa3, 0x16, 0xc4, 0x51, 0xeb, 0x6a, 0xb5, 0xab, 0x1f, 0xf9, 0x13, 0xb8, 0xdc, 0x9b, 0x1c,
0x0e, 0x83, 0xe4, 0xb8, 0xc4, 0x16, 0xdf, 0x00, 0x82, 0x0c, 0x8b, 0x67, 0xb7, 0xe5, 0x8a, 0xb6,
0xcb, 0xb9, 0x0a, 0x76, 0x19, 0x2f, 0xcc, 0x0d, 0xef, 0xc0, 0x75, 0x0d, 0xde, 0x8f, 0xd2, 0xe0,
0x28, 0xf0, 0x3d, 0xbd, 0xa8, 0x39, 0x5f, 0x2e, 0xc0, 0x8d, 0xd9, 0x34, 0x68, 0x89, 0x4f, 0xa1,
0xe9, 0xa5, 0xa9, 0xe7, 0x1f, 0x33, 0xb1, 0x44, 0xad, 0x39, 0x33, 0xb5, 0x37, 0x14, 0xbd, 0x40,
0x13, 0x5e, 0x7f, 0x07, 0xd4, 0xe4, 0xc0, 0x4d, 0xc4, 0x82, 0x40, 0xc1, 0x48, 0x38, 0xab, 0x00,
0x58, 0x5f, 0xb5, 0x00, 0xf0, 0x7c, 0x54, 0xc2, 0x51, 0xc4, 0x12, 0x95, 0x13, 0x69, 0xcd, 0xed,
0x14, 0x37, 0x7e, 0x2e, 0xd6, 0x9d, 0xdf, 0x55, 0x60, 0xfb, 0x80, 0xb5, 0x11, 0x69, 0xc8, 0xfa,
0xb5, 0x32, 0x0b, 0xce, 0xc9, 0xb2, 0xac, 0x98, 0x87, 0x51, 0x3f, 0xe4, 0x9b, 0xde, 0xf6, 0x99,
0x2b, 0x70, 0x36, 0xc2, 0x65, 0x57, 0xdd, 0x66, 0x18, 0x09, 0x66, 0x6f, 0x9f, 0x49, 0x98, 0xf7,
0x6c, 0x19, 0xad, 0xa4, 0x94, 0x73, 0x7f, 0x5d, 0x51, 0x0a, 0x29, 0x9c, 0xdf, 0x2f, 0xc0, 0xb5,
0x59, 0xf2, 0xe0, 0x6d, 0xfd, 0x7f, 0x93, 0xc6, 0x23, 0x58, 0x11, 0x6d, 0x14, 0x95, 0x2f, 0x4e,
0x66, 0xde, 0x9c, 0x2f, 0x89, 0x58, 0x66, 0x1b, 0x5d, 0xc5, 0xc1, 0x7e, 0x06, 0x2b, 0x88, 0x5d,
0x44, 0xca, 0xeb, 0x50, 0xd5, 0xa2, 0x0b, 0x85, 0x84, 0x2c, 0x8c, 0x9d, 0x6d, 0xb8, 0xa2, 0x86,
0xe5, 0x32, 0x1f, 0xff, 0x6f, 0x05, 0xae, 0x96, 0xaf, 0x5f, 0x68, 0xf6, 0x38, 0xcf, 0x5c, 0x59,
0x3e, 0x32, 0x5a, 0x17, 0x1a, 0x19, 0x17, 0x2f, 0x34, 0x32, 0x2e, 0xcd, 0x18, 0x19, 0x7f, 0x5b,
0x81, 0xb5, 0xbd, 0x98, 0xb2, 0xf6, 0xfd, 0xb9, 0xb8, 0x2e, 0xe5, 0xae, 0x1f, 0x41, 0x7b, 0xcc,
0x33, 0x86, 0xdf, 0x2f, 0xe4, 0xdc, 0x96, 0x5c, 0xd0, 0xfa, 0x17, 0x96, 0x8d, 0xd4, 0x24, 0x51,
0x68, 0x75, 0xda, 0xb8, 0xa2, 0x91, 0x13, 0x58, 0x4c, 0x28, 0x1d, 0x60, 0x7d, 0x13, 0xbf, 0x9d,
0x4d, 0x58, 0x37, 0xc5, 0xc0, 0xdc, 0xf4, 0x29, 0xb4, 0x9f, 0x30, 0x57, 0xf8, 0xea, 0xc2, 0x39,
0xeb, 0x40, 0x74, 0x0e, 0xc8, 0x97, 0xa1, 0x7b, 0xc3, 0x28, 0x31, 0xb5, 0x76, 0x36, 0x98, 0x31,
0x74, 0x14, 0x89, 0x19, 0x2c, 0x91, 0x87, 0x6f, 0x82, 0x24, 0x7b, 0x29, 0xd9, 0x81, 0x75, 0x13,
0x46, 0x3f, 0x61, 0x05, 0x94, 0x0a, 0x44, 0xc8, 0xc4, 0x06, 0x26, 0xf9, 0xe5, 0x7c, 0x59, 0x81,
0xce, 0x01, 0xef, 0xe6, 0xf7, 0x38, 0x59, 0x98, 0x4c, 0x12, 0x77, 0xec, 0x2b, 0x9d, 0x58, 0xea,
0xc3, 0x47, 0xa2, 0xbe, 0x39, 0x05, 0x36, 0x10, 0xc6, 0x71, 0x91, 0xbf, 0xe0, 0x4d, 0x12, 0x7e,
0xe5, 0x53, 0xd7, 0x9a, 0x7e, 0xf3, 0x35, 0x6e, 0x11, 0x46, 0xae, 0xac, 0x3b, 0xfd, 0xe6, 0x75,
0xca, 0xa7, 0x31, 0xfa, 0x35, 0xc5, 0x02, 0xae, 0x43, 0xce, 0x15, 0xb8, 0x5c, 0x22, 0x9e, 0x54,
0x6a, 0xd7, 0x9d, 0xbe, 0x59, 0x1f, 0xd0, 0xf8, 0x75, 0xe0, 0xf3, 0x74, 0xbf, 0x82, 0x08, 0xb9,
0xac, 0x05, 0xbb, 0xf9, 0xb2, 0x6d, 0xdb, 0x65, 0x4b, 0xc8, 0xf3, 0x5f, 0x55, 0xa8, 0x4b, 0x0b,
0x2a, 0x9e, 0xdf, 0x83, 0x45, 0xfe, 0xcc, 0x46, 0x36, 0xb5, 0x5d, 0xda, 0x33, 0x9c, 0xbd, 0x55,
0xc0, 0xa7, 0xb5, 0x67, 0x05, 0x9f, 0xd3, 0x0c, 0x61, 0xcc, 0x37, 0x3a, 0x43, 0x98, 0xfc, 0x63,
0x9d, 0x0b, 0x75, 0xe3, 0x29, 0x8d, 0x5c, 0x2f, 0xbe, 0x70, 0x19, 0xef, 0x73, 0xf6, 0x8d, 0xd9,
0x04, 0xc8, 0x73, 0x0f, 0x56, 0xd5, 0xdb, 0x18, 0xb1, 0x4b, 0x1f, 0xcc, 0x24, 0xa7, 0x2b, 0x73,
0x1e, 0xd3, 0xb8, 0x6a, 0xea, 0xa9, 0x49, 0x57, 0xcd, 0x9c, 0xaf, 0x0d, 0xd5, 0xf2, 0xa3, 0xf0,
0x0b, 0x68, 0xe6, 0x26, 0x32, 0xf2, 0x8e, 0x46, 0x5e, 0x3e, 0xc8, 0xda, 0xce, 0x3c, 0x12, 0xe4,
0x3c, 0x81, 0xce, 0xac, 0xb6, 0x80, 0x7c, 0x58, 0x5e, 0x85, 0xcb, 0x72, 0xaf, 0xfd, 0xd1, 0xb9,
0x68, 0xe5, 0xa1, 0x77, 0x2a, 0x24, 0x62, 0x4d, 0x62, 0x69, 0x4d, 0x21, 0xb7, 0xcf, 0x51, 0x76,
0xe4, 0x91, 0x1f, 0x9c, 0xbb, 0x40, 0xb1, 0x03, 0x83, 0xec, 0x89, 0xd6, 0x38, 0xee, 0x56, 0x89,
0x0b, 0x94, 0x1d, 0xf6, 0xfe, 0x99, 0x74, 0xd3, 0xa3, 0x7e, 0x06, 0xad, 0xfc, 0x14, 0x47, 0x9c,
0xb3, 0x87, 0x4e, 0xfb, 0xe6, 0x5c, 0x9a, 0xcc, 0xc9, 0x8d, 0x77, 0x3c, 0xc3, 0xc9, 0xcb, 0xde,
0x0e, 0x0d, 0x27, 0x2f, 0x7d, 0x02, 0x24, 0x8f, 0xa1, 0xaa, 0xbd, 0xd4, 0x91, 0xed, 0xfc, 0xdb,
0x99, 0xc9, 0xef, 0xda, 0xac, 0xe5, 0x1c, 0x37, 0xcc, 0x76, 0xdb, 0x73, 0x5f, 0xe2, 0x8a, 0xdc,
0x72, 0x6f, 0x6a, 0xcc, 0x98, 0xf9, 0x37, 0x2a, 0xc3, 0x98, 0x33, 0x5e, 0xd5, 0x0c, 0x63, 0xce,
0x7a, 0xe4, 0xe2, 0x61, 0x95, 0x9b, 0x08, 0x8d, 0xb0, 0x2a, 0x1f, 0xb7, 0x8d, 0xb0, 0x9a, 0x35,
0x8e, 0x32, 0xce, 0xb9, 0x71, 0xc3, 0xe0, 0x5c, 0x3e, 0x20, 0x19, 0x9c, 0x67, 0x4d, 0x2b, 0x1e,
0x90, 0xe2, 0x24, 0x40, 0xf4, 0xff, 0xc7, 0x66, 0x0e, 0x1d, 0xf6, 0x7b, 0x67, 0x50, 0x61, 0x56,
0xff, 0x9b, 0xa5, 0xca, 0xe5, 0xe3, 0xc8, 0x63, 0x3d, 0x9c, 0xca, 0xed, 0x4f, 0xa0, 0xa6, 0x97,
0x4b, 0xa2, 0xdf, 0x5d, 0x49, 0x79, 0xb5, 0xaf, 0xcf, 0x5c, 0x47, 0x5d, 0x18, 0x43, 0xbd, 0x67,
0x30, 0x18, 0x96, 0xf4, 0x34, 0x06, 0xc3, 0xb2, 0x66, 0x83, 0x74, 0x01, 0xb2, 0x56, 0x81, 0x5c,
0xd5, 0xc8, 0x0b, 0x3d, 0x88, 0xbd, 0x3d, 0x63, 0x35, 0x73, 0x63, 0xad, 0x93, 0x30, 0xdc, 0xb8,
0xd8, 0x77, 0x18, 0x6e, 0x5c, 0xd2, 0x80, 0x90, 0x5f, 0x40, 0xbb, 0x50, 0x99, 0x89, 0xee, 0xa3,
0xb3, 0xda, 0x0a, 0xfb, 0xdd, 0xf9, 0x44, 0x92, 0xff, 0xe1, 0xb2, 0xf8, 0x8b, 0xfa, 0xdb, 0xff,
0x0b, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x2a, 0xb8, 0xd3, 0xaf, 0x1e, 0x00, 0x00,
0x12, 0xbb, 0x35, 0xa6, 0x94, 0x02, 0xb5, 0x9f, 0xc2, 0xb2, 0xd4, 0x7a, 0xc6, 0x9e, 0x1d, 0x58,
0x31, 0xb7, 0x52, 0x9f, 0xc4, 0x86, 0xd5, 0x20, 0x4c, 0x69, 0x1c, 0x7a, 0x43, 0x21, 0x7b, 0xd5,
0x9d, 0x7e, 0x3b, 0x7f, 0xa9, 0x40, 0xed, 0xc1, 0x30, 0xf2, 0x4f, 0xe6, 0x5d, 0xde, 0x26, 0x2c,
0x1f, 0xd3, 0xe0, 0xe5, 0xb1, 0x94, 0xbc, 0xe4, 0xe2, 0x97, 0x69, 0x23, 0x2b, 0x67, 0x23, 0x72,
0x1f, 0x6a, 0xda, 0xfd, 0xaa, 0x8b, 0xd9, 0x9e, 0x7b, 0x31, 0xae, 0xc1, 0xe2, 0x3c, 0x81, 0x06,
0xda, 0xe9, 0x81, 0x37, 0xf4, 0x42, 0x9f, 0xea, 0xa7, 0xac, 0x98, 0xa7, 0xbc, 0x09, 0xf5, 0x34,
0x4a, 0xbd, 0x61, 0xff, 0x50, 0x92, 0x0a, 0x5d, 0x2d, 0x26, 0x90, 0x83, 0xc8, 0xee, 0xd4, 0xa1,
0xda, 0x63, 0x21, 0xa4, 0x82, 0xb0, 0x01, 0x35, 0xf9, 0x29, 0x03, 0x90, 0x87, 0xe9, 0x3e, 0x4d,
0x4f, 0xa3, 0xf8, 0x44, 0x51, 0x7c, 0x0c, 0xcd, 0x29, 0x92, 0x45, 0x29, 0xd7, 0xef, 0x35, 0xed,
0x87, 0x72, 0x05, 0x35, 0xa9, 0x4b, 0x14, 0xc9, 0x9d, 0xef, 0xc3, 0x3a, 0xea, 0xbe, 0x3f, 0x19,
0x1d, 0xd2, 0x18, 0x25, 0x92, 0x77, 0xa0, 0x86, 0x2a, 0xf7, 0x43, 0x6f, 0x44, 0x31, 0xc4, 0xab,
0x88, 0xed, 0x33, 0xc8, 0xb9, 0x07, 0x1b, 0x39, 0x56, 0x7d, 0x6b, 0xe4, 0x15, 0x2b, 0xd9, 0xd6,
0x1a, 0xb9, 0xd3, 0x86, 0x26, 0xf2, 0x27, 0xea, 0x1c, 0xff, 0xb0, 0xa0, 0x95, 0x61, 0x28, 0xee,
0x87, 0xb0, 0x8a, 0x8c, 0x09, 0x13, 0x94, 0x0f, 0xba, 0x3c, 0xb9, 0x02, 0xdc, 0x29, 0x13, 0xf9,
0x3a, 0x10, 0x7f, 0x12, 0xc7, 0x94, 0xe9, 0x73, 0xc8, 0x9d, 0xa8, 0x2f, 0x5c, 0x47, 0x06, 0x77,
0x0b, 0x57, 0x84, 0x77, 0x7d, 0xce, 0xdd, 0xe8, 0x0e, 0xac, 0xe7, 0xa8, 0xa5, 0x53, 0x59, 0xc2,
0xa9, 0x88, 0x41, 0x2f, 0x56, 0xec, 0xdf, 0x2c, 0xc0, 0x8a, 0x0a, 0x94, 0xf3, 0x9d, 0xbd, 0x60,
0xde, 0x85, 0x82, 0x79, 0x8b, 0x9e, 0x62, 0x15, 0x3d, 0x85, 0x1f, 0x8d, 0xbe, 0x91, 0x41, 0xd2,
0x3f, 0xa1, 0x6f, 0xfb, 0xd2, 0xe7, 0x64, 0x16, 0x6d, 0xa9, 0x95, 0x47, 0xf4, 0xed, 0x9e, 0x50,
0x8e, 0x51, 0xab, 0x90, 0xd2, 0xa8, 0x97, 0x24, 0xb5, 0x5a, 0x31, 0xa8, 0x47, 0xe3, 0x28, 0x4e,
0xe9, 0x40, 0xa3, 0x5e, 0x46, 0x6a, 0x5c, 0x51, 0xd4, 0xce, 0x0b, 0x58, 0x77, 0x29, 0x3f, 0x8b,
0xb2, 0x3f, 0x3a, 0xd2, 0x39, 0x0d, 0x72, 0x19, 0x56, 0x43, 0x7a, 0xaa, 0x1b, 0x63, 0x85, 0x7d,
0x0b, 0x3f, 0xdb, 0x82, 0x8d, 0x9c, 0x64, 0x8c, 0x83, 0xe7, 0x40, 0xf6, 0xd9, 0x19, 0x73, 0x1b,
0xf2, 0xaa, 0xe1, 0x25, 0xc9, 0xf8, 0x38, 0xe6, 0x55, 0x43, 0x26, 0x08, 0x0d, 0x39, 0x87, 0xe9,
0x9d, 0x4f, 0x60, 0xcd, 0x10, 0x7c, 0x31, 0xbf, 0xfe, 0x73, 0x05, 0xf5, 0x1a, 0x0c, 0x62, 0x9a,
0x28, 0xdf, 0x9e, 0x93, 0x13, 0xbe, 0x0b, 0x8b, 0x27, 0x2c, 0x3b, 0x0a, 0x4d, 0x1a, 0xbb, 0x8e,
0xe6, 0xdc, 0x45, 0x31, 0x3b, 0x8f, 0x18, 0xa5, 0x2b, 0xe8, 0x9d, 0x5d, 0x58, 0xe4, 0x5f, 0x2c,
0xd3, 0xb6, 0x1e, 0x74, 0x7b, 0x77, 0xee, 0xdc, 0xbd, 0xdb, 0x7f, 0xf8, 0xe2, 0xe9, 0x43, 0x77,
0xff, 0xfe, 0xe3, 0xd6, 0xd7, 0x74, 0xb4, 0xbb, 0x8f, 0x68, 0xc5, 0xf9, 0x26, 0x1e, 0x4d, 0x09,
0xc5, 0xa3, 0x71, 0xe5, 0x24, 0x84, 0x91, 0xae, 0x3e, 0x9d, 0x3f, 0x54, 0x60, 0xab, 0x2b, 0x2e,
0xbb, 0x17, 0x07, 0xaf, 0xbd, 0x94, 0xb2, 0x1b, 0x3f, 0xaf, 0xa9, 0x67, 0x27, 0xfb, 0x5b, 0xbc,
0x9e, 0x08, 0x71, 0xc2, 0xb5, 0x4e, 0x83, 0x23, 0xe1, 0xde, 0xac, 0x76, 0x8f, 0xa7, 0xbb, 0x3c,
0x0f, 0x8e, 0x78, 0x4e, 0x67, 0x5a, 0xf8, 0x5e, 0x28, 0x7c, 0x7a, 0xd5, 0xc5, 0x2f, 0xc7, 0x86,
0x4e, 0x51, 0x29, 0x74, 0x8b, 0x10, 0x1a, 0x18, 0x1e, 0x17, 0xf4, 0xc1, 0xef, 0xc0, 0x66, 0xcc,
0x38, 0x02, 0x56, 0x6d, 0x99, 0xb3, 0x87, 0x47, 0x41, 0x3c, 0xf2, 0x64, 0x51, 0x90, 0x05, 0x65,
0x43, 0xad, 0xee, 0xe9, 0x8b, 0x6c, 0xbf, 0xe6, 0x74, 0x3f, 0x34, 0x27, 0xab, 0x7d, 0x22, 0x4c,
0xc5, 0x3e, 0x96, 0x2b, 0x3f, 0x78, 0x21, 0x4a, 0xc6, 0x34, 0x1c, 0x78, 0x87, 0x43, 0x95, 0xf7,
0x33, 0x80, 0x97, 0xd8, 0x60, 0xc4, 0x64, 0x4e, 0x62, 0xda, 0x8f, 0xe9, 0xa9, 0x17, 0x0f, 0x54,
0x89, 0x55, 0xb0, 0x2b, 0x50, 0xe7, 0x4f, 0x0b, 0xb0, 0xf9, 0x63, 0x9a, 0x6a, 0x65, 0x69, 0xea,
0x63, 0x3b, 0xb0, 0xc6, 0xaa, 0x5a, 0x9c, 0xb2, 0x6a, 0xa1, 0xa7, 0x3a, 0x79, 0x33, 0x6d, 0xb5,
0x94, 0xe5, 0xba, 0x5d, 0xd8, 0xc8, 0xd3, 0x67, 0x15, 0xb4, 0xed, 0xae, 0x99, 0x1c, 0xb2, 0x9c,
0x7e, 0x08, 0x6d, 0xa6, 0x72, 0x6e, 0x07, 0x4b, 0xec, 0xd0, 0x94, 0x0b, 0x99, 0x7c, 0xa6, 0x8f,
0x49, 0x2b, 0xa5, 0x2f, 0x0a, 0x73, 0xb6, 0x75, 0x6a, 0x29, 0xfb, 0x1e, 0x5c, 0x61, 0x0d, 0x61,
0x30, 0x9a, 0x8c, 0x98, 0x09, 0x7c, 0x9e, 0x82, 0x8d, 0xda, 0xbc, 0x24, 0xf8, 0x2e, 0x23, 0x89,
0x2b, 0x28, 0x74, 0x33, 0x38, 0x7f, 0x67, 0xce, 0x5a, 0x30, 0x0d, 0xde, 0xc9, 0x67, 0x40, 0x18,
0x23, 0xbb, 0x5a, 0x43, 0xa4, 0x2c, 0x28, 0x5b, 0x5a, 0xcc, 0xe9, 0x7d, 0x86, 0xdb, 0x16, 0x2c,
0xba, 0x3c, 0xd2, 0x83, 0xf5, 0x49, 0x58, 0x22, 0x69, 0xe1, 0x3c, 0x8d, 0xc3, 0x1a, 0xb2, 0x1a,
0x5a, 0xb3, 0x26, 0x7b, 0x6b, 0xef, 0xd8, 0x0b, 0x5f, 0xd2, 0xde, 0x34, 0x76, 0xd4, 0x8d, 0x7e,
0x0c, 0x16, 0x0b, 0x10, 0x71, 0x83, 0x8d, 0xdd, 0x5b, 0x9a, 0xf0, 0x19, 0x0c, 0x3b, 0x3c, 0x12,
0x38, 0x0b, 0x77, 0xfa, 0x88, 0xf5, 0xc6, 0x5a, 0x80, 0xca, 0x8a, 0x57, 0x67, 0x68, 0xc6, 0xc6,
0xc9, 0x78, 0xe2, 0xd5, 0xc8, 0xe4, 0x5d, 0xd6, 0x19, 0x9a, 0x91, 0x39, 0xd7, 0xc0, 0x62, 0x92,
0x49, 0x15, 0x56, 0x7a, 0x6e, 0xf7, 0x8b, 0xfb, 0x4f, 0x1f, 0xb2, 0x0c, 0x03, 0xb0, 0xdc, 0x7b,
0xf6, 0xe0, 0x71, 0x77, 0x8f, 0xe5, 0x15, 0x16, 0x90, 0x45, 0x8d, 0x30, 0x20, 0x7f, 0xcd, 0x1c,
0xf6, 0xb3, 0x49, 0xa8, 0x1f, 0xfa, 0xec, 0xa4, 0xc8, 0xcb, 0x9f, 0x17, 0xbf, 0xa4, 0xa9, 0xea,
0x37, 0x55, 0xa3, 0x24, 0x40, 0xd9, 0x6d, 0xce, 0x89, 0x58, 0x6b, 0x4e, 0xc4, 0x92, 0x4f, 0xc0,
0x0e, 0x42, 0x7f, 0x38, 0x19, 0xd0, 0xfe, 0x34, 0xe4, 0xfc, 0x28, 0x08, 0x0f, 0x99, 0xd6, 0x09,
0x66, 0x9a, 0x0e, 0x52, 0x74, 0x91, 0x60, 0x4f, 0xad, 0xf3, 0xa0, 0x51, 0xdc, 0xbe, 0x38, 0x72,
0x3f, 0xf1, 0xe3, 0x60, 0x2c, 0x0b, 0xe9, 0xaa, 0xbb, 0x86, 0x8b, 0xd2, 0x1c, 0x07, 0x62, 0xc9,
0xf9, 0xab, 0x05, 0x5b, 0x05, 0x13, 0xa0, 0x63, 0xfe, 0x1c, 0x5a, 0x09, 0x9b, 0x68, 0x7c, 0x5e,
0x67, 0x23, 0xd1, 0x3b, 0x2b, 0xb7, 0xfc, 0x96, 0x76, 0xdf, 0x33, 0xb8, 0x77, 0x7a, 0xd8, 0x7f,
0xe3, 0xac, 0xd0, 0x54, 0xa2, 0xe4, 0x77, 0xc2, 0xcb, 0x9d, 0x6c, 0x23, 0x0c, 0x33, 0x56, 0x05,
0x86, 0x56, 0xbc, 0x0d, 0x2d, 0x3c, 0xc8, 0xf8, 0x44, 0x9d, 0x45, 0x3a, 0x41, 0x43, 0xe2, 0xbd,
0x13, 0x79, 0x0c, 0xfb, 0x3f, 0x15, 0x68, 0x98, 0x1b, 0xf2, 0x21, 0x42, 0x0b, 0x03, 0x3d, 0xdf,
0x34, 0x35, 0x5c, 0x64, 0x03, 0xa6, 0x8a, 0x3c, 0x5f, 0x5f, 0x0e, 0x06, 0xb2, 0x26, 0x54, 0x25,
0xd6, 0x15, 0xe3, 0x01, 0xcb, 0xf7, 0xc6, 0x78, 0x81, 0x5f, 0xe4, 0x0a, 0x5c, 0xca, 0x74, 0x5b,
0x14, 0xe2, 0x57, 0xc7, 0xa8, 0x15, 0x97, 0xcb, 0xb3, 0x05, 0xef, 0x75, 0x79, 0x5f, 0x8f, 0xf3,
0x51, 0x15, 0xb1, 0xa7, 0x81, 0x6c, 0xa6, 0x8e, 0xe2, 0x68, 0x34, 0xbd, 0x65, 0xd1, 0xc6, 0xac,
0xba, 0x35, 0x0e, 0xaa, 0x9b, 0x75, 0xfe, 0x58, 0x81, 0xcd, 0x83, 0xe0, 0x65, 0x58, 0xe2, 0xa7,
0x67, 0x55, 0x3a, 0xe6, 0x88, 0x09, 0x8d, 0x03, 0x6f, 0x18, 0xfc, 0xca, 0xcc, 0x0b, 0x18, 0x74,
0x1b, 0xd9, 0xaa, 0x26, 0x9d, 0xab, 0x15, 0x84, 0x53, 0x83, 0x50, 0x39, 0x54, 0xd6, 0xdd, 0x9a,
0x00, 0xbb, 0x12, 0x73, 0x5e, 0xc1, 0x56, 0x41, 0x2b, 0x74, 0x9d, 0xdc, 0xbc, 0x5a, 0x29, 0xce,
0xab, 0x77, 0x61, 0x73, 0x12, 0x26, 0x8c, 0x9d, 0xa9, 0x65, 0x6e, 0xb5, 0x20, 0xb6, 0x5a, 0x57,
0xab, 0x5d, 0x7d, 0xcb, 0x9f, 0xc0, 0xe5, 0xde, 0xe4, 0x70, 0x18, 0x24, 0xc7, 0x25, 0xb6, 0xf8,
0x06, 0x10, 0x14, 0x58, 0xdc, 0xbb, 0x2d, 0x57, 0x34, 0x2e, 0xe7, 0x2a, 0xd8, 0x65, 0xb2, 0x30,
0x37, 0xbc, 0x03, 0xd7, 0x35, 0x78, 0x3f, 0x4a, 0x83, 0xa3, 0xc0, 0xf7, 0xf4, 0xa2, 0xe6, 0x7c,
0xb9, 0x00, 0x37, 0x66, 0xd3, 0xa0, 0x25, 0x3e, 0x85, 0xa6, 0x97, 0xa6, 0x9e, 0x7f, 0xcc, 0xd4,
0x12, 0xb5, 0xe6, 0xcc, 0xd4, 0xde, 0x50, 0xf4, 0x02, 0x4d, 0x78, 0xfd, 0x1d, 0x50, 0x53, 0x02,
0x37, 0x11, 0x0b, 0x02, 0x05, 0x23, 0xe1, 0xac, 0x02, 0x60, 0x7d, 0xd5, 0x02, 0xc0, 0xf3, 0x51,
0x89, 0x44, 0x11, 0x4b, 0x54, 0x4e, 0xa4, 0x35, 0xb7, 0x53, 0x64, 0xfc, 0x5c, 0xac, 0x3b, 0xbf,
0xab, 0xc0, 0xf6, 0x01, 0x6b, 0x23, 0xd2, 0x90, 0xf5, 0x6b, 0x65, 0x16, 0x9c, 0x93, 0x65, 0x59,
0x31, 0x0f, 0xa3, 0x7e, 0xc8, 0x99, 0xde, 0xf6, 0x99, 0x2b, 0x70, 0x31, 0xc2, 0x65, 0x57, 0xdd,
0x66, 0x18, 0x09, 0x61, 0x6f, 0x9f, 0x49, 0x98, 0xf7, 0x6c, 0x19, 0xad, 0xa4, 0x94, 0x73, 0x7a,
0x5d, 0x51, 0x0a, 0x2d, 0x9c, 0xdf, 0x2f, 0xc0, 0xb5, 0x59, 0xfa, 0xe0, 0x6d, 0xfd, 0x7f, 0x93,
0xc6, 0x23, 0x58, 0x11, 0x6d, 0x14, 0x95, 0xaf, 0x4a, 0x66, 0xde, 0x9c, 0xaf, 0x89, 0x58, 0x66,
0x8c, 0xae, 0x92, 0x60, 0x3f, 0x83, 0x15, 0xc4, 0x2e, 0xa2, 0xe5, 0x75, 0xa8, 0x6a, 0xd1, 0x85,
0x4a, 0x42, 0x16, 0xc6, 0xce, 0x36, 0x5c, 0x51, 0xc3, 0x72, 0x99, 0x8f, 0xff, 0xb7, 0x02, 0x57,
0xcb, 0xd7, 0x2f, 0x34, 0x7b, 0x9c, 0x67, 0xae, 0x2c, 0x1f, 0x19, 0xad, 0x0b, 0x8d, 0x8c, 0x8b,
0x17, 0x1a, 0x19, 0x97, 0x66, 0x8c, 0x8c, 0xbf, 0xad, 0xc0, 0xda, 0x5e, 0x4c, 0x59, 0xfb, 0xfe,
0x5c, 0x5c, 0x97, 0x72, 0xd7, 0x8f, 0xa0, 0x3d, 0xe6, 0x19, 0xc3, 0xef, 0x17, 0x72, 0x6e, 0x4b,
0x2e, 0x68, 0xfd, 0x0b, 0xcb, 0x46, 0x6a, 0x92, 0x28, 0xb4, 0x3a, 0x6d, 0x5c, 0xd1, 0xc8, 0x09,
0x2c, 0x26, 0x94, 0x0e, 0xb0, 0xbe, 0x89, 0xdf, 0xce, 0x26, 0xac, 0x9b, 0x6a, 0x60, 0x6e, 0xfa,
0x14, 0xda, 0x4f, 0x98, 0x2b, 0x7c, 0x75, 0xe5, 0x9c, 0x75, 0x20, 0xba, 0x04, 0x94, 0xcb, 0xd0,
0xbd, 0x61, 0x94, 0x98, 0xa7, 0x76, 0x36, 0x98, 0x31, 0x74, 0x14, 0x89, 0x19, 0x2c, 0x91, 0x87,
0x6f, 0x82, 0x24, 0x7b, 0x29, 0xd9, 0x81, 0x75, 0x13, 0x46, 0x3f, 0x61, 0x05, 0x94, 0x0a, 0x44,
0xe8, 0xc4, 0x06, 0x26, 0xf9, 0xe5, 0x7c, 0x59, 0x81, 0xce, 0x01, 0xef, 0xe6, 0xf7, 0x38, 0x59,
0x98, 0x4c, 0x12, 0x77, 0xec, 0xab, 0x33, 0xb1, 0xd4, 0x87, 0x8f, 0x44, 0x7d, 0x73, 0x0a, 0x6c,
0x20, 0x8c, 0xe3, 0x22, 0x7f, 0xa3, 0x9b, 0x24, 0xfc, 0xca, 0xa7, 0xae, 0x35, 0xfd, 0xe6, 0x6b,
0xdc, 0x22, 0x8c, 0x5c, 0x59, 0x77, 0xfa, 0xcd, 0xeb, 0x94, 0x4f, 0x63, 0xf4, 0x6b, 0x8a, 0x05,
0x5c, 0x87, 0x9c, 0x2b, 0x70, 0xb9, 0x44, 0x3d, 0x79, 0xa8, 0x5d, 0x77, 0xfa, 0x2e, 0x7d, 0x40,
0xe3, 0xd7, 0x81, 0xcf, 0xd3, 0xfd, 0x0a, 0x22, 0xe4, 0xb2, 0x16, 0xec, 0xe6, 0xeb, 0xb5, 0x6d,
0x97, 0x2d, 0xa1, 0xcc, 0x7f, 0x57, 0xa1, 0x2e, 0x2d, 0xa8, 0x64, 0x7e, 0x0f, 0x16, 0xf9, 0x33,
0x1b, 0xd9, 0xd4, 0xb8, 0xb4, 0x67, 0x38, 0x7b, 0xab, 0x80, 0x4f, 0x6b, 0xcf, 0x0a, 0x3e, 0xa7,
0x19, 0xca, 0x98, 0x6f, 0x74, 0x86, 0x32, 0xf9, 0xc7, 0x3a, 0x17, 0xea, 0xc6, 0x53, 0x1a, 0xb9,
0x5e, 0x7c, 0xe1, 0x32, 0xde, 0xe7, 0xec, 0x1b, 0xb3, 0x09, 0x50, 0xe6, 0x1e, 0xac, 0xaa, 0xb7,
0x31, 0x62, 0x97, 0x3e, 0x98, 0x49, 0x49, 0x57, 0xe6, 0x3c, 0xa6, 0xf1, 0xa3, 0xa9, 0xa7, 0x26,
0xfd, 0x68, 0xe6, 0x7c, 0x6d, 0x1c, 0x2d, 0x3f, 0x0a, 0xbf, 0x80, 0x66, 0x6e, 0x22, 0x23, 0xef,
0x68, 0xe4, 0xe5, 0x83, 0xac, 0xed, 0xcc, 0x23, 0x41, 0xc9, 0x13, 0xe8, 0xcc, 0x6a, 0x0b, 0xc8,
0x87, 0xe5, 0x55, 0xb8, 0x2c, 0xf7, 0xda, 0x1f, 0x9d, 0x8b, 0x56, 0x6e, 0x7a, 0xa7, 0x42, 0x22,
0xd6, 0x24, 0x96, 0xd6, 0x14, 0x72, 0xfb, 0x1c, 0x65, 0x47, 0x6e, 0xf9, 0xc1, 0xb9, 0x0b, 0x14,
0xdb, 0x30, 0xc8, 0x9e, 0x68, 0x8d, 0xed, 0x6e, 0x95, 0xb8, 0x40, 0xd9, 0x66, 0xef, 0x9f, 0x49,
0x37, 0xdd, 0xea, 0x67, 0xd0, 0xca, 0x4f, 0x71, 0xc4, 0x39, 0x7b, 0xe8, 0xb4, 0x6f, 0xce, 0xa5,
0xc9, 0x9c, 0xdc, 0x78, 0xc7, 0x33, 0x9c, 0xbc, 0xec, 0xed, 0xd0, 0x70, 0xf2, 0xd2, 0x27, 0x40,
0xf2, 0x18, 0xaa, 0xda, 0x4b, 0x1d, 0xd9, 0xce, 0xbf, 0x9d, 0x99, 0xf2, 0xae, 0xcd, 0x5a, 0xce,
0x49, 0xc3, 0x6c, 0xb7, 0x3d, 0xf7, 0x25, 0xae, 0x28, 0x2d, 0xf7, 0xa6, 0xc6, 0x8c, 0x99, 0x7f,
0xa3, 0x32, 0x8c, 0x39, 0xe3, 0x55, 0xcd, 0x30, 0xe6, 0xac, 0x47, 0x2e, 0x1e, 0x56, 0xb9, 0x89,
0xd0, 0x08, 0xab, 0xf2, 0x71, 0xdb, 0x08, 0xab, 0x59, 0xe3, 0x28, 0x93, 0x9c, 0x1b, 0x37, 0x0c,
0xc9, 0xe5, 0x03, 0x92, 0x21, 0x79, 0xd6, 0xb4, 0xe2, 0x01, 0x29, 0x4e, 0x02, 0x44, 0xff, 0x0f,
0x6c, 0xe6, 0xd0, 0x61, 0xbf, 0x77, 0x06, 0x15, 0x66, 0xf5, 0xbf, 0x59, 0xaa, 0x5c, 0x3e, 0x8e,
0x3c, 0xd6, 0xc3, 0xa9, 0xdc, 0xfe, 0x04, 0x6a, 0x7a, 0xb9, 0x24, 0xfa, 0xdd, 0x95, 0x94, 0x57,
0xfb, 0xfa, 0xcc, 0x75, 0x3c, 0x0b, 0x13, 0xa8, 0xf7, 0x0c, 0x86, 0xc0, 0x92, 0x9e, 0xc6, 0x10,
0x58, 0xd6, 0x6c, 0x90, 0x2e, 0x40, 0xd6, 0x2a, 0x90, 0xab, 0x1a, 0x79, 0xa1, 0x07, 0xb1, 0xb7,
0x67, 0xac, 0x66, 0x6e, 0xac, 0x75, 0x12, 0x86, 0x1b, 0x17, 0xfb, 0x0e, 0xc3, 0x8d, 0x4b, 0x1a,
0x10, 0xf2, 0x0b, 0x68, 0x17, 0x2a, 0x33, 0xd1, 0x7d, 0x74, 0x56, 0x5b, 0x61, 0xbf, 0x3b, 0x9f,
0x48, 0xca, 0x3f, 0x5c, 0x16, 0x7f, 0x43, 0x7f, 0xfb, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x22,
0xfc, 0x70, 0xb3, 0x93, 0x1e, 0x00, 0x00,
}

View file

@ -1,4 +1,4 @@
// Copyright (c) 2015 The btcsuite developers
// Copyright (c) 2015-2016 The btcsuite developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
@ -119,23 +119,16 @@ func makeTxSummary(w *Wallet, details *wtxmgr.TxDetails) TransactionSummary {
}
outputs := make([]TransactionSummaryOutput, 0, len(details.MsgTx.TxOut))
var credIndex int
for i, txOut := range details.MsgTx.TxOut {
for i := range details.MsgTx.TxOut {
mine := len(details.Credits) > credIndex && details.Credits[credIndex].Index == uint32(i)
output := TransactionSummaryOutput{
Index: uint32(i),
Amount: btcutil.Amount(txOut.Value),
Mine: mine,
if !mine {
continue
}
if mine {
acct, internal := lookupOutputChain(w, details, details.Credits[credIndex])
output.Account = acct
output.Internal = internal
credIndex++
} else {
_, addresses, _, err := txscript.ExtractPkScriptAddrs(txOut.PkScript, w.chainParams)
if err == nil {
output.Addresses = addresses
}
acct, internal := lookupOutputChain(w, details, details.Credits[credIndex])
output := TransactionSummaryOutput{
Index: uint32(i),
Account: acct,
Internal: internal,
}
outputs = append(outputs, output)
}
@ -143,7 +136,7 @@ func makeTxSummary(w *Wallet, details *wtxmgr.TxDetails) TransactionSummary {
Hash: &details.Hash,
Transaction: serializedTx,
MyInputs: inputs,
Outputs: outputs,
MyOutputs: outputs,
Fee: fee,
Timestamp: details.Received.Unix(),
}
@ -185,7 +178,7 @@ func relevantAccounts(w *Wallet, m map[uint32]btcutil.Amount, txs []TransactionS
for _, d := range tx.MyInputs {
m[d.PreviousAccount] = 0
}
for _, c := range tx.Outputs {
for _, c := range tx.MyOutputs {
m[c.Account] = 0
}
}
@ -356,7 +349,7 @@ type TransactionSummary struct {
Hash *wire.ShaHash
Transaction []byte
MyInputs []TransactionSummaryInput
Outputs []TransactionSummaryOutput
MyOutputs []TransactionSummaryOutput
Fee btcutil.Amount
Timestamp int64
}
@ -371,23 +364,13 @@ type TransactionSummaryInput struct {
PreviousAmount btcutil.Amount
}
// TransactionSummaryOutput describes a transaction output of a relevant
// transaction. When the transaction is authored by this wallet, all
// transaction outputs are considered relevant. The Mine field describes
// whether outputs to these authored transactions pay back to the wallet
// (e.g. change) or create an uncontrolled output. For convenience, the
// addresses (if any) of an uncontrolled output are included.
// TransactionSummaryOutput describes wallet properties of a transaction output
// controlled by the wallet. The Index field marks the transaction output index
// of the transaction (not included here).
type TransactionSummaryOutput struct {
Index uint32
Amount btcutil.Amount
Mine bool
// Only relevant if mine==true.
Index uint32
Account uint32
Internal bool
// Only relevant if mine==false.
Addresses []btcutil.Address
}
// AccountBalance associates a total (zero confirmation) balance with an