From ddbc7444d54ea7acdef2ad67b709b211733b0f76 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Wed, 5 May 2021 15:57:34 +0200 Subject: [PATCH] poolrpc+rpcserver: implement QuoteOrder RPC We create an RPC wrapper around the new order.NewQuote function with the goal of replacing the calculation that currently only exists in the CLI with an actual RPC call. --- macaroons.go | 4 + poolrpc/rest-annotations.yaml | 3 + poolrpc/trader.pb.go | 733 ++++++++++++++++++++++------------ poolrpc/trader.proto | 72 +++- poolrpc/trader.swagger.json | 32 +- rpcserver.go | 34 +- 6 files changed, 618 insertions(+), 260 deletions(-) diff --git a/macaroons.go b/macaroons.go index c324e5d..a9fb127 100644 --- a/macaroons.go +++ b/macaroons.go @@ -89,6 +89,10 @@ var ( Entity: "order", Action: "write", }}, + "/poolrpc.Trader/QuoteOrder": {{ + Entity: "order", + Action: "read", + }}, "/poolrpc.Trader/AuctionFee": {{ Entity: "auction", Action: "read", diff --git a/poolrpc/rest-annotations.yaml b/poolrpc/rest-annotations.yaml index da9ee8a..65bd8fb 100644 --- a/poolrpc/rest-annotations.yaml +++ b/poolrpc/rest-annotations.yaml @@ -42,6 +42,9 @@ http: get: "/v1/pool/orders" - selector: poolrpc.Trader.CancelOrder delete: "/v1/pool/orders/{order_nonce}" + - selector: poolrpc.Trader.QuoteOrder + post: "/v1/pool/orders/quote" + body: "*" - selector: poolrpc.Trader.AuctionFee get: "/v1/pool/fee" - selector: poolrpc.Trader.LeaseDurations diff --git a/poolrpc/trader.pb.go b/poolrpc/trader.pb.go index 4f82a6c..7e47b15 100644 --- a/poolrpc/trader.pb.go +++ b/poolrpc/trader.pb.go @@ -2043,6 +2043,176 @@ func (m *Ask) GetVersion() uint32 { return 0 } +type QuoteOrderRequest struct { + // + //Order amount in satoshis. + Amt uint64 `protobuf:"varint,1,opt,name=amt,proto3" json:"amt,omitempty"` + // + //Fixed order rate in parts per billion. + RateFixed uint32 `protobuf:"varint,2,opt,name=rate_fixed,json=rateFixed,proto3" json:"rate_fixed,omitempty"` + // + //Required number of blocks that a channel opened as a result of this bid + //should be kept open. + LeaseDurationBlocks uint32 `protobuf:"varint,3,opt,name=lease_duration_blocks,json=leaseDurationBlocks,proto3" json:"lease_duration_blocks,omitempty"` + // + //Maximum fee rate the trader is willing to pay for the batch transaction, + //expressed in satoshis per 1000 weight units (sat/KW). + MaxBatchFeeRateSatPerKw uint64 `protobuf:"varint,4,opt,name=max_batch_fee_rate_sat_per_kw,json=maxBatchFeeRateSatPerKw,proto3" json:"max_batch_fee_rate_sat_per_kw,omitempty"` + // The minimum number of order units that must be matched per order pair. + MinUnitsMatch uint32 `protobuf:"varint,5,opt,name=min_units_match,json=minUnitsMatch,proto3" json:"min_units_match,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *QuoteOrderRequest) Reset() { *m = QuoteOrderRequest{} } +func (m *QuoteOrderRequest) String() string { return proto.CompactTextString(m) } +func (*QuoteOrderRequest) ProtoMessage() {} +func (*QuoteOrderRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{28} +} + +func (m *QuoteOrderRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_QuoteOrderRequest.Unmarshal(m, b) +} +func (m *QuoteOrderRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_QuoteOrderRequest.Marshal(b, m, deterministic) +} +func (m *QuoteOrderRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuoteOrderRequest.Merge(m, src) +} +func (m *QuoteOrderRequest) XXX_Size() int { + return xxx_messageInfo_QuoteOrderRequest.Size(m) +} +func (m *QuoteOrderRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuoteOrderRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuoteOrderRequest proto.InternalMessageInfo + +func (m *QuoteOrderRequest) GetAmt() uint64 { + if m != nil { + return m.Amt + } + return 0 +} + +func (m *QuoteOrderRequest) GetRateFixed() uint32 { + if m != nil { + return m.RateFixed + } + return 0 +} + +func (m *QuoteOrderRequest) GetLeaseDurationBlocks() uint32 { + if m != nil { + return m.LeaseDurationBlocks + } + return 0 +} + +func (m *QuoteOrderRequest) GetMaxBatchFeeRateSatPerKw() uint64 { + if m != nil { + return m.MaxBatchFeeRateSatPerKw + } + return 0 +} + +func (m *QuoteOrderRequest) GetMinUnitsMatch() uint32 { + if m != nil { + return m.MinUnitsMatch + } + return 0 +} + +type QuoteOrderResponse struct { + // + //The total order premium in satoshis for filling the entire order. This + //represents the interest amount paid to the maker by the taker excluding any + //execution or chain fees. + TotalPremiumSat uint64 `protobuf:"varint,1,opt,name=total_premium_sat,json=totalPremiumSat,proto3" json:"total_premium_sat,omitempty"` + // + //The fixed order rate expressed as a fraction instead of parts per billion. + RatePerBlock float64 `protobuf:"fixed64,2,opt,name=rate_per_block,json=ratePerBlock,proto3" json:"rate_per_block,omitempty"` + // + //The fixed order rate expressed as a percentage instead of parts per billion. + RatePercent float64 `protobuf:"fixed64,3,opt,name=rate_percent,json=ratePercent,proto3" json:"rate_percent,omitempty"` + // + //The total execution fee in satoshis that needs to be paid to the auctioneer + //for executing the entire order. + TotalExecutionFeeSat uint64 `protobuf:"varint,4,opt,name=total_execution_fee_sat,json=totalExecutionFeeSat,proto3" json:"total_execution_fee_sat,omitempty"` + // + //The worst case chain fees that need to be paid if fee rates spike up to the + //max_batch_fee_rate_sat_per_kw value specified in the request. This value is + //highly dependent on the min_units_match parameter as well since the + //calculation assumes chain fees for the chain footprint of opening + //amt/min_units_match channels (hence worst case calculation). + WorstCaseChainFeeSat uint64 `protobuf:"varint,5,opt,name=worst_case_chain_fee_sat,json=worstCaseChainFeeSat,proto3" json:"worst_case_chain_fee_sat,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *QuoteOrderResponse) Reset() { *m = QuoteOrderResponse{} } +func (m *QuoteOrderResponse) String() string { return proto.CompactTextString(m) } +func (*QuoteOrderResponse) ProtoMessage() {} +func (*QuoteOrderResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_b8f61804588c75fe, []int{29} +} + +func (m *QuoteOrderResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_QuoteOrderResponse.Unmarshal(m, b) +} +func (m *QuoteOrderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_QuoteOrderResponse.Marshal(b, m, deterministic) +} +func (m *QuoteOrderResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuoteOrderResponse.Merge(m, src) +} +func (m *QuoteOrderResponse) XXX_Size() int { + return xxx_messageInfo_QuoteOrderResponse.Size(m) +} +func (m *QuoteOrderResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuoteOrderResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuoteOrderResponse proto.InternalMessageInfo + +func (m *QuoteOrderResponse) GetTotalPremiumSat() uint64 { + if m != nil { + return m.TotalPremiumSat + } + return 0 +} + +func (m *QuoteOrderResponse) GetRatePerBlock() float64 { + if m != nil { + return m.RatePerBlock + } + return 0 +} + +func (m *QuoteOrderResponse) GetRatePercent() float64 { + if m != nil { + return m.RatePercent + } + return 0 +} + +func (m *QuoteOrderResponse) GetTotalExecutionFeeSat() uint64 { + if m != nil { + return m.TotalExecutionFeeSat + } + return 0 +} + +func (m *QuoteOrderResponse) GetWorstCaseChainFeeSat() uint64 { + if m != nil { + return m.WorstCaseChainFeeSat + } + return 0 +} + type OrderEvent struct { // //The unix timestamp in nanoseconds the event was emitted at. This is the @@ -2063,7 +2233,7 @@ func (m *OrderEvent) Reset() { *m = OrderEvent{} } func (m *OrderEvent) String() string { return proto.CompactTextString(m) } func (*OrderEvent) ProtoMessage() {} func (*OrderEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{28} + return fileDescriptor_b8f61804588c75fe, []int{30} } func (m *OrderEvent) XXX_Unmarshal(b []byte) error { @@ -2163,7 +2333,7 @@ func (m *UpdatedEvent) Reset() { *m = UpdatedEvent{} } func (m *UpdatedEvent) String() string { return proto.CompactTextString(m) } func (*UpdatedEvent) ProtoMessage() {} func (*UpdatedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{29} + return fileDescriptor_b8f61804588c75fe, []int{31} } func (m *UpdatedEvent) XXX_Unmarshal(b []byte) error { @@ -2225,7 +2395,7 @@ func (m *MatchEvent) Reset() { *m = MatchEvent{} } func (m *MatchEvent) String() string { return proto.CompactTextString(m) } func (*MatchEvent) ProtoMessage() {} func (*MatchEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{30} + return fileDescriptor_b8f61804588c75fe, []int{32} } func (m *MatchEvent) XXX_Unmarshal(b []byte) error { @@ -2284,7 +2454,7 @@ func (m *RecoverAccountsRequest) Reset() { *m = RecoverAccountsRequest{} func (m *RecoverAccountsRequest) String() string { return proto.CompactTextString(m) } func (*RecoverAccountsRequest) ProtoMessage() {} func (*RecoverAccountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{31} + return fileDescriptor_b8f61804588c75fe, []int{33} } func (m *RecoverAccountsRequest) XXX_Unmarshal(b []byte) error { @@ -2317,7 +2487,7 @@ func (m *RecoverAccountsResponse) Reset() { *m = RecoverAccountsResponse func (m *RecoverAccountsResponse) String() string { return proto.CompactTextString(m) } func (*RecoverAccountsResponse) ProtoMessage() {} func (*RecoverAccountsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{32} + return fileDescriptor_b8f61804588c75fe, []int{34} } func (m *RecoverAccountsResponse) XXX_Unmarshal(b []byte) error { @@ -2355,7 +2525,7 @@ func (m *AuctionFeeRequest) Reset() { *m = AuctionFeeRequest{} } func (m *AuctionFeeRequest) String() string { return proto.CompactTextString(m) } func (*AuctionFeeRequest) ProtoMessage() {} func (*AuctionFeeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{33} + return fileDescriptor_b8f61804588c75fe, []int{35} } func (m *AuctionFeeRequest) XXX_Unmarshal(b []byte) error { @@ -2389,7 +2559,7 @@ func (m *AuctionFeeResponse) Reset() { *m = AuctionFeeResponse{} } func (m *AuctionFeeResponse) String() string { return proto.CompactTextString(m) } func (*AuctionFeeResponse) ProtoMessage() {} func (*AuctionFeeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{34} + return fileDescriptor_b8f61804588c75fe, []int{36} } func (m *AuctionFeeResponse) XXX_Unmarshal(b []byte) error { @@ -2466,7 +2636,7 @@ func (m *Lease) Reset() { *m = Lease{} } func (m *Lease) String() string { return proto.CompactTextString(m) } func (*Lease) ProtoMessage() {} func (*Lease) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{35} + return fileDescriptor_b8f61804588c75fe, []int{37} } func (m *Lease) XXX_Unmarshal(b []byte) error { @@ -2610,7 +2780,7 @@ func (m *LeasesRequest) Reset() { *m = LeasesRequest{} } func (m *LeasesRequest) String() string { return proto.CompactTextString(m) } func (*LeasesRequest) ProtoMessage() {} func (*LeasesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{36} + return fileDescriptor_b8f61804588c75fe, []int{38} } func (m *LeasesRequest) XXX_Unmarshal(b []byte) error { @@ -2661,7 +2831,7 @@ func (m *LeasesResponse) Reset() { *m = LeasesResponse{} } func (m *LeasesResponse) String() string { return proto.CompactTextString(m) } func (*LeasesResponse) ProtoMessage() {} func (*LeasesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{37} + return fileDescriptor_b8f61804588c75fe, []int{39} } func (m *LeasesResponse) XXX_Unmarshal(b []byte) error { @@ -2713,7 +2883,7 @@ func (m *TokensRequest) Reset() { *m = TokensRequest{} } func (m *TokensRequest) String() string { return proto.CompactTextString(m) } func (*TokensRequest) ProtoMessage() {} func (*TokensRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{38} + return fileDescriptor_b8f61804588c75fe, []int{40} } func (m *TokensRequest) XXX_Unmarshal(b []byte) error { @@ -2747,7 +2917,7 @@ func (m *TokensResponse) Reset() { *m = TokensResponse{} } func (m *TokensResponse) String() string { return proto.CompactTextString(m) } func (*TokensResponse) ProtoMessage() {} func (*TokensResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{39} + return fileDescriptor_b8f61804588c75fe, []int{41} } func (m *TokensResponse) XXX_Unmarshal(b []byte) error { @@ -2812,7 +2982,7 @@ func (m *LsatToken) Reset() { *m = LsatToken{} } func (m *LsatToken) String() string { return proto.CompactTextString(m) } func (*LsatToken) ProtoMessage() {} func (*LsatToken) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{40} + return fileDescriptor_b8f61804588c75fe, []int{42} } func (m *LsatToken) XXX_Unmarshal(b []byte) error { @@ -2899,7 +3069,7 @@ func (m *LeaseDurationRequest) Reset() { *m = LeaseDurationRequest{} } func (m *LeaseDurationRequest) String() string { return proto.CompactTextString(m) } func (*LeaseDurationRequest) ProtoMessage() {} func (*LeaseDurationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{41} + return fileDescriptor_b8f61804588c75fe, []int{43} } func (m *LeaseDurationRequest) XXX_Unmarshal(b []byte) error { @@ -2937,7 +3107,7 @@ func (m *LeaseDurationResponse) Reset() { *m = LeaseDurationResponse{} } func (m *LeaseDurationResponse) String() string { return proto.CompactTextString(m) } func (*LeaseDurationResponse) ProtoMessage() {} func (*LeaseDurationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{42} + return fileDescriptor_b8f61804588c75fe, []int{44} } func (m *LeaseDurationResponse) XXX_Unmarshal(b []byte) error { @@ -2983,7 +3153,7 @@ func (m *NextBatchInfoRequest) Reset() { *m = NextBatchInfoRequest{} } func (m *NextBatchInfoRequest) String() string { return proto.CompactTextString(m) } func (*NextBatchInfoRequest) ProtoMessage() {} func (*NextBatchInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{43} + return fileDescriptor_b8f61804588c75fe, []int{45} } func (m *NextBatchInfoRequest) XXX_Unmarshal(b []byte) error { @@ -3026,7 +3196,7 @@ func (m *NextBatchInfoResponse) Reset() { *m = NextBatchInfoResponse{} } func (m *NextBatchInfoResponse) String() string { return proto.CompactTextString(m) } func (*NextBatchInfoResponse) ProtoMessage() {} func (*NextBatchInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{44} + return fileDescriptor_b8f61804588c75fe, []int{46} } func (m *NextBatchInfoResponse) XXX_Unmarshal(b []byte) error { @@ -3080,7 +3250,7 @@ func (m *NodeRatingRequest) Reset() { *m = NodeRatingRequest{} } func (m *NodeRatingRequest) String() string { return proto.CompactTextString(m) } func (*NodeRatingRequest) ProtoMessage() {} func (*NodeRatingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{45} + return fileDescriptor_b8f61804588c75fe, []int{47} } func (m *NodeRatingRequest) XXX_Unmarshal(b []byte) error { @@ -3120,7 +3290,7 @@ func (m *NodeRatingResponse) Reset() { *m = NodeRatingResponse{} } func (m *NodeRatingResponse) String() string { return proto.CompactTextString(m) } func (*NodeRatingResponse) ProtoMessage() {} func (*NodeRatingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{46} + return fileDescriptor_b8f61804588c75fe, []int{48} } func (m *NodeRatingResponse) XXX_Unmarshal(b []byte) error { @@ -3158,7 +3328,7 @@ func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} } func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetInfoRequest) ProtoMessage() {} func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{47} + return fileDescriptor_b8f61804588c75fe, []int{49} } func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error { @@ -3233,7 +3403,7 @@ func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetInfoResponse) ProtoMessage() {} func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{48} + return fileDescriptor_b8f61804588c75fe, []int{50} } func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error { @@ -3369,7 +3539,7 @@ func (m *StopDaemonRequest) Reset() { *m = StopDaemonRequest{} } func (m *StopDaemonRequest) String() string { return proto.CompactTextString(m) } func (*StopDaemonRequest) ProtoMessage() {} func (*StopDaemonRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{49} + return fileDescriptor_b8f61804588c75fe, []int{51} } func (m *StopDaemonRequest) XXX_Unmarshal(b []byte) error { @@ -3400,7 +3570,7 @@ func (m *StopDaemonResponse) Reset() { *m = StopDaemonResponse{} } func (m *StopDaemonResponse) String() string { return proto.CompactTextString(m) } func (*StopDaemonResponse) ProtoMessage() {} func (*StopDaemonResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{50} + return fileDescriptor_b8f61804588c75fe, []int{52} } func (m *StopDaemonResponse) XXX_Unmarshal(b []byte) error { @@ -3450,7 +3620,7 @@ func (m *OfferSidecarRequest) Reset() { *m = OfferSidecarRequest{} } func (m *OfferSidecarRequest) String() string { return proto.CompactTextString(m) } func (*OfferSidecarRequest) ProtoMessage() {} func (*OfferSidecarRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{51} + return fileDescriptor_b8f61804588c75fe, []int{53} } func (m *OfferSidecarRequest) XXX_Unmarshal(b []byte) error { @@ -3509,7 +3679,7 @@ func (m *SidecarTicket) Reset() { *m = SidecarTicket{} } func (m *SidecarTicket) String() string { return proto.CompactTextString(m) } func (*SidecarTicket) ProtoMessage() {} func (*SidecarTicket) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{52} + return fileDescriptor_b8f61804588c75fe, []int{54} } func (m *SidecarTicket) XXX_Unmarshal(b []byte) error { @@ -3551,7 +3721,7 @@ func (m *RegisterSidecarRequest) Reset() { *m = RegisterSidecarRequest{} func (m *RegisterSidecarRequest) String() string { return proto.CompactTextString(m) } func (*RegisterSidecarRequest) ProtoMessage() {} func (*RegisterSidecarRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{53} + return fileDescriptor_b8f61804588c75fe, []int{55} } func (m *RegisterSidecarRequest) XXX_Unmarshal(b []byte) error { @@ -3593,7 +3763,7 @@ func (m *ExpectSidecarChannelRequest) Reset() { *m = ExpectSidecarChanne func (m *ExpectSidecarChannelRequest) String() string { return proto.CompactTextString(m) } func (*ExpectSidecarChannelRequest) ProtoMessage() {} func (*ExpectSidecarChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{54} + return fileDescriptor_b8f61804588c75fe, []int{56} } func (m *ExpectSidecarChannelRequest) XXX_Unmarshal(b []byte) error { @@ -3631,7 +3801,7 @@ func (m *ExpectSidecarChannelResponse) Reset() { *m = ExpectSidecarChann func (m *ExpectSidecarChannelResponse) String() string { return proto.CompactTextString(m) } func (*ExpectSidecarChannelResponse) ProtoMessage() {} func (*ExpectSidecarChannelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b8f61804588c75fe, []int{55} + return fileDescriptor_b8f61804588c75fe, []int{57} } func (m *ExpectSidecarChannelResponse) XXX_Unmarshal(b []byte) error { @@ -3684,6 +3854,8 @@ func init() { proto.RegisterType((*Order)(nil), "poolrpc.Order") proto.RegisterType((*Bid)(nil), "poolrpc.Bid") proto.RegisterType((*Ask)(nil), "poolrpc.Ask") + proto.RegisterType((*QuoteOrderRequest)(nil), "poolrpc.QuoteOrderRequest") + proto.RegisterType((*QuoteOrderResponse)(nil), "poolrpc.QuoteOrderResponse") proto.RegisterType((*OrderEvent)(nil), "poolrpc.OrderEvent") proto.RegisterType((*UpdatedEvent)(nil), "poolrpc.UpdatedEvent") proto.RegisterType((*MatchEvent)(nil), "poolrpc.MatchEvent") @@ -3720,231 +3892,240 @@ func init() { func init() { proto.RegisterFile("trader.proto", fileDescriptor_b8f61804588c75fe) } var fileDescriptor_b8f61804588c75fe = []byte{ - // 3579 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x73, 0xdb, 0x48, - 0x7a, 0x22, 0xf5, 0xe4, 0xc7, 0xa7, 0x9a, 0x92, 0xcc, 0xa1, 0xed, 0xb1, 0x8d, 0x5d, 0xef, 0xd8, - 0x9e, 0x89, 0x3d, 0x51, 0xd6, 0xce, 0x64, 0x32, 0xc9, 0x2e, 0x25, 0x41, 0x23, 0xee, 0xc8, 0x14, - 0xa7, 0x25, 0x3b, 0x9b, 0xbd, 0xa0, 0x9a, 0x40, 0x4b, 0xc2, 0x8a, 0x04, 0x18, 0xa0, 0xa9, 0xc7, - 0x21, 0x87, 0x54, 0xb6, 0x2a, 0xc7, 0xa4, 0x36, 0x95, 0x5c, 0x73, 0x4b, 0x7e, 0x44, 0xaa, 0x72, - 0xc8, 0x29, 0x55, 0xc9, 0x5f, 0xc8, 0x1f, 0xc8, 0x35, 0x7f, 0x20, 0xd5, 0x2f, 0xa0, 0x01, 0x82, - 0xe3, 0x9d, 0xb9, 0xe4, 0x46, 0x7c, 0x8f, 0xee, 0xef, 0xfb, 0xfa, 0x7b, 0x76, 0x13, 0x6a, 0x2c, - 0x22, 0x1e, 0x8d, 0x5e, 0x4e, 0xa3, 0x90, 0x85, 0x68, 0x7d, 0x1a, 0x86, 0xe3, 0x68, 0xea, 0x76, - 0x3f, 0x26, 0x33, 0x97, 0xf9, 0x61, 0x40, 0x69, 0x14, 0x4d, 0xdd, 0x57, 0xe9, 0x97, 0x24, 0xb4, - 0xfe, 0xa7, 0x04, 0xa8, 0x1f, 0xf8, 0xac, 0xe7, 0xba, 0xe1, 0x2c, 0x60, 0x98, 0xfe, 0xc5, 0x8c, - 0xc6, 0x0c, 0xfd, 0x08, 0xea, 0x44, 0x42, 0x9c, 0x6b, 0x32, 0x9e, 0xd1, 0x4e, 0xe9, 0x71, 0xe9, - 0xd9, 0x0a, 0xae, 0x29, 0xe0, 0x7b, 0x0e, 0x43, 0xcf, 0xa1, 0x49, 0x46, 0x71, 0x38, 0x9e, 0x31, - 0xea, 0x5c, 0x52, 0xff, 0xe2, 0x92, 0x75, 0xca, 0x8f, 0x4b, 0xcf, 0xea, 0x47, 0x4b, 0xb8, 0xa1, - 0x11, 0x47, 0x02, 0xce, 0x49, 0x23, 0x3a, 0x26, 0xcc, 0xbf, 0x4e, 0x48, 0x97, 0x35, 0xa9, 0x46, - 0x28, 0xd2, 0x27, 0x50, 0x75, 0xc3, 0xe0, 0xdc, 0x61, 0x24, 0xba, 0xa0, 0xac, 0xb3, 0x22, 0xc8, - 0x4a, 0x18, 0x38, 0xf0, 0x4c, 0xc0, 0xd0, 0x03, 0xa8, 0xf8, 0x81, 0xcf, 0x7c, 0xc2, 0xc2, 0xa8, - 0xb3, 0xfa, 0xb8, 0xf4, 0xac, 0x82, 0x53, 0xc0, 0x5e, 0x0b, 0x1a, 0x5a, 0x76, 0x7a, 0x3b, 0xf5, - 0xa3, 0xbb, 0xbd, 0x35, 0x58, 0x39, 0xa7, 0x34, 0xb6, 0x28, 0xb4, 0xbf, 0x9d, 0x85, 0x8c, 0xfe, - 0x10, 0x65, 0x73, 0x62, 0x69, 0x45, 0x0d, 0xb1, 0x92, 0x6d, 0x6e, 0x60, 0x2b, 0xbb, 0x4d, 0x3c, - 0x0d, 0x83, 0x98, 0xa2, 0x3f, 0x84, 0x8f, 0x26, 0x7e, 0x40, 0x23, 0xe7, 0x9c, 0x52, 0x27, 0x22, - 0x8c, 0x3a, 0x31, 0x61, 0xce, 0x94, 0x46, 0xce, 0xd5, 0x8d, 0xda, 0x73, 0x4b, 0x10, 0x1c, 0x52, - 0x8a, 0x09, 0xa3, 0xa7, 0x84, 0x0d, 0x69, 0xf4, 0xcd, 0x0d, 0xfa, 0x09, 0x34, 0x53, 0x46, 0x16, - 0x32, 0x32, 0x16, 0xfb, 0xaf, 0xe0, 0xba, 0x26, 0x3f, 0xe3, 0x40, 0xeb, 0x0d, 0xb4, 0x8f, 0xfd, - 0x58, 0x9f, 0x65, 0xac, 0xf5, 0x7b, 0x04, 0x55, 0xe2, 0x0a, 0xd3, 0x87, 0xc1, 0xf8, 0x4e, 0xec, - 0xb4, 0x81, 0x41, 0x82, 0x4e, 0x82, 0xf1, 0x9d, 0x75, 0x00, 0x5b, 0x59, 0x3e, 0x25, 0xf0, 0x67, - 0xb0, 0xa1, 0x6c, 0x10, 0x77, 0x4a, 0x8f, 0x97, 0x9f, 0x55, 0x77, 0x5b, 0x2f, 0x95, 0x63, 0xbd, - 0xd4, 0xca, 0x25, 0x14, 0xd6, 0xcf, 0x60, 0xed, 0x64, 0xc6, 0xa6, 0x33, 0x86, 0xee, 0x43, 0x45, - 0x18, 0x92, 0xeb, 0xa7, 0x14, 0xdb, 0x10, 0x80, 0x53, 0xc2, 0x50, 0x07, 0xd6, 0x89, 0xe7, 0x45, - 0x34, 0x8e, 0x85, 0x12, 0x15, 0xac, 0x3f, 0xad, 0xdf, 0x94, 0xa0, 0x2e, 0x57, 0xf8, 0x33, 0x9f, - 0x5d, 0x1e, 0x52, 0x6a, 0xd2, 0x96, 0x32, 0xb4, 0xbf, 0xc3, 0x71, 0xa0, 0x97, 0xd0, 0x2e, 0x32, - 0x34, 0xf7, 0xbb, 0x95, 0xa3, 0x25, 0xdc, 0x3c, 0xcf, 0x5a, 0x39, 0x39, 0xbe, 0x7d, 0xd8, 0x91, - 0x52, 0xc4, 0x5c, 0x8c, 0xfe, 0x64, 0x3a, 0xf6, 0x5d, 0x9f, 0x71, 0x71, 0x9e, 0xc3, 0x7a, 0x28, - 0x31, 0xca, 0x1c, 0xcd, 0xc4, 0x1c, 0x92, 0x03, 0x6b, 0xbc, 0xf5, 0x1f, 0x25, 0x68, 0xef, 0x8f, - 0xc3, 0x38, 0xef, 0x6b, 0x0f, 0x01, 0x64, 0xa0, 0x3a, 0x57, 0x54, 0x1e, 0x45, 0x0d, 0x57, 0x24, - 0xe4, 0x1b, 0x7a, 0x87, 0x7e, 0x0e, 0x4d, 0xb9, 0x82, 0x73, 0xe3, 0xb3, 0x4b, 0x7e, 0xde, 0x42, - 0xb5, 0xea, 0xee, 0x4e, 0x6e, 0x27, 0x65, 0xa1, 0xa3, 0x25, 0x5c, 0x0f, 0x33, 0x26, 0xfb, 0xe3, - 0x54, 0xc6, 0x65, 0xc1, 0xf9, 0x28, 0xc7, 0x99, 0xd7, 0xea, 0x68, 0x29, 0x91, 0x7a, 0xaf, 0x0d, - 0x9b, 0xe7, 0xb3, 0xc0, 0x8b, 0x1d, 0x8f, 0xc6, 0xcc, 0x0f, 0x08, 0xcf, 0x15, 0xd6, 0x6b, 0xd8, - 0xca, 0x6a, 0xa2, 0xbc, 0xe3, 0x21, 0x80, 0xcb, 0xe1, 0x0e, 0xbb, 0xf5, 0x3d, 0xad, 0x8a, 0x80, - 0x9c, 0xdd, 0xfa, 0x9e, 0xf5, 0x77, 0x25, 0xd8, 0xe1, 0x5b, 0x79, 0x11, 0xb9, 0xf9, 0x7e, 0x46, - 0x30, 0xcc, 0x5c, 0xfe, 0x6e, 0x33, 0xa3, 0xcf, 0xbe, 0xe3, 0x8c, 0xe7, 0x4e, 0xd8, 0xfa, 0x35, - 0xdc, 0x9b, 0x93, 0x48, 0x29, 0xf3, 0x02, 0xd6, 0x95, 0x23, 0x0b, 0x79, 0x8a, 0x3c, 0x5d, 0x13, - 0xf0, 0x7c, 0x71, 0xa3, 0x96, 0x91, 0xba, 0x97, 0x85, 0x06, 0x35, 0x0d, 0x14, 0xea, 0xff, 0x75, - 0x09, 0xb6, 0x0f, 0xe8, 0x34, 0x8c, 0xe7, 0x72, 0xeb, 0x07, 0xb4, 0x7f, 0x08, 0x40, 0x26, 0x22, - 0x19, 0xf1, 0xe8, 0x91, 0x71, 0x5e, 0x91, 0x10, 0x1e, 0x3e, 0xdf, 0x4f, 0xe3, 0x0b, 0xd8, 0xc9, - 0x0b, 0xf1, 0x03, 0x14, 0x7e, 0x02, 0x35, 0x4f, 0xae, 0x62, 0xea, 0x5b, 0x55, 0x30, 0xa1, 0xee, - 0x7f, 0x95, 0xa0, 0x8d, 0x69, 0x40, 0xf3, 0x47, 0x2d, 0x72, 0x8f, 0xcc, 0xad, 0xa9, 0xb6, 0xa0, - 0x40, 0xf2, 0xb0, 0xd3, 0x22, 0x22, 0xd3, 0xf5, 0x7c, 0x11, 0xb1, 0x05, 0x3c, 0x53, 0x44, 0x14, - 0xe9, 0x5c, 0x11, 0x51, 0xa4, 0x0b, 0xac, 0xb4, 0x52, 0x68, 0xa5, 0xf9, 0x8a, 0x61, 0x51, 0xd8, - 0xca, 0x6a, 0xf3, 0xc3, 0xac, 0x16, 0xf1, 0x35, 0xc8, 0x38, 0x63, 0x35, 0x05, 0x13, 0x56, 0xf3, - 0x60, 0x7b, 0x6f, 0x36, 0x99, 0x2a, 0x56, 0x9e, 0xf6, 0x7f, 0x37, 0x1f, 0x59, 0xa0, 0x5e, 0xb9, - 0xd8, 0x09, 0x3a, 0xb0, 0x93, 0xdf, 0x45, 0xaa, 0x63, 0xfd, 0x43, 0x19, 0xd6, 0x15, 0xf8, 0x43, - 0x5b, 0xfe, 0x1e, 0x6c, 0xf0, 0xa0, 0x0b, 0xfd, 0x80, 0xa9, 0x94, 0xb4, 0x69, 0x46, 0xe5, 0x90, - 0x23, 0x70, 0x42, 0x82, 0xb6, 0x60, 0x55, 0xd6, 0x52, 0xe9, 0x98, 0xf2, 0x03, 0x7d, 0x0a, 0x9b, - 0xe4, 0x9a, 0xf8, 0x63, 0x32, 0x1a, 0x53, 0x67, 0x44, 0xc6, 0x24, 0x70, 0xa9, 0x3a, 0x94, 0x56, - 0x82, 0xd8, 0x93, 0x70, 0x4e, 0x2c, 0x4e, 0x43, 0x64, 0x21, 0xdd, 0x35, 0xf0, 0x6a, 0x5f, 0xc7, - 0xad, 0x14, 0xa1, 0xba, 0x86, 0x4f, 0x61, 0x35, 0x66, 0x84, 0xd1, 0xce, 0xda, 0xe3, 0xd2, 0xb3, - 0xc6, 0xee, 0x76, 0xfe, 0x58, 0x4e, 0x39, 0x12, 0x4b, 0x1a, 0xee, 0x94, 0x63, 0xc2, 0x68, 0xac, - 0xdc, 0x79, 0x5d, 0x3a, 0xa5, 0x04, 0x89, 0x73, 0xf9, 0xab, 0x12, 0xa0, 0xd3, 0xd9, 0x68, 0xe2, - 0xb3, 0x93, 0xc8, 0xa3, 0x91, 0x3e, 0x95, 0xc7, 0xb0, 0x4c, 0xe2, 0x2b, 0x75, 0xf2, 0xb5, 0x74, - 0x8b, 0xf8, 0xea, 0x68, 0x09, 0x73, 0x14, 0xa7, 0x18, 0xa9, 0xa3, 0x36, 0x29, 0xf6, 0x7c, 0x8f, - 0x53, 0x8c, 0x7c, 0x2f, 0xdb, 0xbb, 0x2c, 0xe7, 0x7b, 0x97, 0x0a, 0xac, 0x7b, 0x94, 0x11, 0x7f, - 0x1c, 0x5b, 0xbf, 0x2d, 0x41, 0x3b, 0x23, 0x83, 0x72, 0xc1, 0xaf, 0xa0, 0xee, 0x07, 0xd7, 0x64, - 0xec, 0x7b, 0x4e, 0xc8, 0x11, 0x4a, 0x9c, 0x54, 0xe3, 0xbe, 0xc4, 0x0a, 0xae, 0xa3, 0x25, 0x5c, - 0xf3, 0x8d, 0x6f, 0xb4, 0x0b, 0x5b, 0xc4, 0x75, 0xe9, 0x94, 0x51, 0xc5, 0xee, 0x04, 0x21, 0x3f, - 0x04, 0xe1, 0x9c, 0x47, 0x4b, 0x18, 0x69, 0xac, 0x20, 0x1f, 0x70, 0x9c, 0x29, 0xd4, 0x00, 0x36, - 0x79, 0xa7, 0x20, 0x90, 0x49, 0x7f, 0xd1, 0x81, 0xf5, 0x6b, 0x1a, 0x8d, 0xc2, 0x98, 0xaa, 0xde, - 0x42, 0x7f, 0xe6, 0x3b, 0x8f, 0xf2, 0x5c, 0xe7, 0xf1, 0x4b, 0x40, 0xe6, 0x7a, 0x4a, 0xc5, 0xc7, - 0xb0, 0x42, 0xe2, 0x2b, 0x5d, 0x64, 0x33, 0x86, 0xc6, 0x02, 0xc3, 0x29, 0x46, 0xbe, 0xa7, 0xeb, - 0x43, 0xc6, 0xd0, 0x58, 0x60, 0xac, 0xd7, 0x80, 0xf6, 0xb9, 0x1b, 0x8d, 0x33, 0x27, 0xf8, 0x08, - 0xaa, 0xa6, 0xd6, 0x2a, 0x1d, 0x85, 0x89, 0xae, 0xd6, 0x36, 0xb4, 0x33, 0x6c, 0x2a, 0x50, 0xfe, - 0x7b, 0x19, 0x56, 0xa5, 0x01, 0x3f, 0x9c, 0xbd, 0x45, 0x54, 0x9e, 0xfb, 0xb7, 0x54, 0xfa, 0x41, - 0x1d, 0x57, 0x38, 0xe4, 0x90, 0x03, 0x50, 0x0b, 0x96, 0xc9, 0x84, 0xa9, 0xa0, 0xe0, 0x3f, 0xd1, - 0x9f, 0xc2, 0xc3, 0x09, 0xb9, 0x75, 0x46, 0x84, 0xb9, 0x97, 0xce, 0xe2, 0x9c, 0x75, 0x6f, 0x42, - 0x6e, 0xf7, 0x38, 0x4d, 0xbe, 0x37, 0xcc, 0x69, 0xb4, 0x9a, 0xd7, 0x08, 0x3d, 0xcf, 0x46, 0x46, - 0x3b, 0x8d, 0x5a, 0x4e, 0x93, 0x89, 0x8b, 0x2d, 0x58, 0x9d, 0x05, 0x3e, 0x8b, 0x45, 0x44, 0xd4, - 0xb1, 0xfc, 0xe0, 0x71, 0x28, 0x7e, 0x38, 0xb3, 0xe0, 0x7c, 0x36, 0x3e, 0xf7, 0xc7, 0x63, 0xea, - 0x75, 0x36, 0x64, 0x1c, 0x0a, 0xc4, 0xbb, 0x14, 0x8e, 0x3e, 0x03, 0x14, 0xd1, 0x98, 0x46, 0xd7, - 0xd4, 0x73, 0xd2, 0x1e, 0xb0, 0x22, 0x43, 0x5c, 0x63, 0xde, 0xeb, 0x5e, 0x70, 0x17, 0xb6, 0xdd, - 0x88, 0xca, 0x00, 0x67, 0xfe, 0x84, 0xc6, 0x8c, 0x4c, 0xa6, 0x4e, 0x10, 0x77, 0x40, 0x30, 0xb4, - 0x35, 0xf2, 0x4c, 0xe3, 0x06, 0x5c, 0x9c, 0x35, 0x7a, 0x4d, 0x79, 0x4b, 0x5a, 0x15, 0x87, 0x9f, - 0x53, 0xc8, 0xe6, 0x38, 0xac, 0x48, 0x54, 0xe7, 0xec, 0x48, 0xf9, 0x27, 0xdc, 0x7e, 0x9d, 0x9a, - 0x90, 0x9c, 0x77, 0xce, 0xef, 0x38, 0xf4, 0x2d, 0x07, 0x5a, 0x7f, 0x53, 0x86, 0xe5, 0x3d, 0xdf, - 0x43, 0xcf, 0x12, 0x57, 0x57, 0x61, 0xd5, 0xc8, 0xae, 0x8e, 0x35, 0x9a, 0x8b, 0x3e, 0xa6, 0x24, - 0xa6, 0x8e, 0x37, 0x53, 0x19, 0x6a, 0x34, 0x0e, 0xdd, 0xab, 0x58, 0x9d, 0x79, 0x5b, 0x20, 0x0f, - 0x14, 0x6e, 0x4f, 0xa0, 0x54, 0xa0, 0xc4, 0x7e, 0x18, 0xc8, 0xc2, 0x85, 0xf5, 0x27, 0x7a, 0x0d, - 0x5c, 0x20, 0x27, 0x08, 0x3d, 0xea, 0x30, 0x9f, 0x46, 0xe2, 0xd4, 0x1b, 0x46, 0x8a, 0x1d, 0x84, - 0x1e, 0x3d, 0xf3, 0x69, 0x84, 0xab, 0x13, 0x3f, 0xd0, 0x1f, 0xe8, 0x05, 0x6c, 0xc6, 0x74, 0x7c, - 0xee, 0xb8, 0x97, 0x24, 0x48, 0xf2, 0xe9, 0xaa, 0xac, 0x02, 0x1c, 0xb1, 0x7f, 0x49, 0x02, 0x9d, - 0x4e, 0x9f, 0x42, 0x23, 0xf6, 0x3d, 0xea, 0x92, 0xc8, 0x61, 0xbe, 0x7b, 0x45, 0x99, 0x70, 0x88, - 0x0a, 0xae, 0x2b, 0xe8, 0x99, 0x00, 0x5a, 0x7f, 0x09, 0xcb, 0xbd, 0xf8, 0xea, 0xff, 0xcb, 0x10, - 0xd6, 0xbf, 0x97, 0x00, 0xd2, 0x73, 0xe4, 0x35, 0x34, 0xe3, 0x17, 0x5c, 0x96, 0x65, 0x5c, 0x65, - 0x86, 0x3f, 0xdc, 0x87, 0x8a, 0x38, 0x6c, 0x27, 0x66, 0x91, 0x9a, 0x28, 0x36, 0x04, 0xe0, 0x94, - 0x45, 0xe8, 0x4b, 0xa8, 0x09, 0xd7, 0x16, 0x16, 0xba, 0xa0, 0xaa, 0x25, 0x4e, 0x73, 0xe5, 0xbb, - 0xa9, 0x47, 0x18, 0xf5, 0xc4, 0x66, 0x47, 0x4b, 0xb8, 0x2a, 0x88, 0xf7, 0x05, 0x2d, 0x7a, 0x05, - 0xeb, 0xc2, 0x63, 0xa8, 0x27, 0x4e, 0xc3, 0xf4, 0x34, 0xe1, 0x34, 0x9a, 0x49, 0x53, 0xed, 0xad, - 0xc3, 0xaa, 0xd8, 0xd8, 0xfa, 0xa7, 0x12, 0xd4, 0xcc, 0x95, 0xd1, 0x97, 0xd0, 0x98, 0x46, 0xf4, - 0xda, 0x0f, 0x67, 0xb1, 0x23, 0x83, 0xb1, 0xb4, 0x38, 0x18, 0xeb, 0x9a, 0x54, 0x7c, 0xa2, 0xcf, - 0xa1, 0x12, 0xd0, 0x1b, 0xc5, 0x56, 0x5e, 0xcc, 0xb6, 0x11, 0xd0, 0x1b, 0xc9, 0xf1, 0x04, 0x6a, - 0xd2, 0xe1, 0x55, 0xac, 0x4a, 0x13, 0x57, 0x05, 0xec, 0x50, 0x80, 0xac, 0xff, 0x2c, 0x01, 0xa4, - 0x4a, 0xa0, 0x9f, 0x42, 0x55, 0x28, 0xb1, 0x40, 0x38, 0x41, 0x29, 0x77, 0x81, 0x49, 0xf2, 0x7b, - 0x6e, 0x9f, 0xf2, 0xdc, 0x3e, 0xbc, 0x55, 0x56, 0xd6, 0x51, 0xc5, 0x6a, 0x59, 0xb6, 0xca, 0x0a, - 0x28, 0x53, 0xea, 0xcf, 0xa0, 0x1e, 0xd1, 0x5f, 0x53, 0x97, 0x39, 0x11, 0x25, 0x71, 0x18, 0x28, - 0xe7, 0xef, 0x66, 0xf7, 0xc7, 0x82, 0x04, 0x0b, 0x0a, 0x5c, 0x8b, 0x8c, 0x2f, 0xde, 0xe0, 0x60, - 0xea, 0x86, 0xd7, 0x34, 0xca, 0x8d, 0xbe, 0xd6, 0x09, 0xdc, 0x9b, 0xc3, 0xa8, 0x22, 0xf3, 0x53, - 0xd8, 0x09, 0x66, 0x13, 0x27, 0x92, 0x68, 0xea, 0x39, 0xc6, 0xa8, 0xcb, 0xf5, 0xd8, 0x0a, 0x66, - 0x13, 0xac, 0x91, 0x9a, 0xdb, 0x6a, 0xc3, 0x66, 0x4f, 0xde, 0xa1, 0xa4, 0xdd, 0x9a, 0x35, 0x04, - 0x64, 0x02, 0xd5, 0x06, 0x5f, 0x42, 0x9d, 0xde, 0x52, 0x77, 0x26, 0x62, 0x82, 0x4f, 0x72, 0xf9, - 0x42, 0x6d, 0x6b, 0x2c, 0xe7, 0xaa, 0x51, 0xe3, 0xcb, 0xfa, 0xe7, 0x55, 0x58, 0x3d, 0xe6, 0x81, - 0x83, 0xde, 0x40, 0x9d, 0xfb, 0x6e, 0x40, 0xc7, 0x8e, 0x6c, 0xbe, 0x4a, 0x8b, 0x9a, 0xaf, 0x9a, - 0xa2, 0x13, 0x5f, 0x3c, 0xf3, 0x69, 0x3e, 0x32, 0x31, 0x67, 0x09, 0xbd, 0x5c, 0x6f, 0x22, 0xe6, - 0x89, 0x37, 0x70, 0x4f, 0xd3, 0xe5, 0x03, 0x58, 0xfa, 0xcd, 0xb6, 0x42, 0xe7, 0x42, 0xf8, 0x73, - 0xd8, 0xd2, 0x7c, 0x32, 0xfc, 0x55, 0x47, 0x2e, 0xee, 0x6b, 0x30, 0x52, 0x38, 0xa1, 0x83, 0xea, - 0xc9, 0x1f, 0x41, 0x75, 0x1a, 0xd1, 0x89, 0x3f, 0x9b, 0x08, 0x69, 0x64, 0x9a, 0x02, 0x05, 0xe2, - 0xa2, 0xbc, 0xe0, 0x0d, 0x9f, 0x61, 0x30, 0x41, 0xb6, 0x26, 0xb3, 0x99, 0x69, 0x1d, 0x4e, 0x6b, - 0x09, 0xb3, 0xf8, 0x29, 0xdd, 0xba, 0xa0, 0xab, 0x0a, 0xa0, 0xa2, 0x79, 0x09, 0x6d, 0x77, 0x4c, - 0x49, 0xe4, 0x07, 0x17, 0xb2, 0xaa, 0x4e, 0x23, 0xdf, 0xa5, 0xa2, 0x74, 0xad, 0xe0, 0x4d, 0x8d, - 0xe2, 0xd5, 0x74, 0xc8, 0x11, 0xe8, 0x19, 0xb4, 0x64, 0x29, 0x15, 0xc5, 0x5b, 0xb0, 0xa8, 0xca, - 0xd5, 0x10, 0x70, 0x51, 0xc2, 0xb1, 0x6a, 0x20, 0xcd, 0xa2, 0x0b, 0x73, 0x45, 0xf7, 0x01, 0x54, - 0xa6, 0xb3, 0xc8, 0xbd, 0x24, 0x31, 0xf5, 0x3a, 0x55, 0xd1, 0xf6, 0xa4, 0x00, 0xf4, 0x3a, 0xb5, - 0x79, 0x44, 0x27, 0x21, 0xa3, 0x32, 0xf1, 0xf3, 0x86, 0xa2, 0x26, 0x96, 0xd2, 0xa6, 0xc5, 0x02, - 0xcb, 0xd3, 0x3d, 0xef, 0x2d, 0xfe, 0x04, 0x36, 0x35, 0x5b, 0x5a, 0x28, 0xea, 0x8b, 0x0a, 0x85, - 0x3e, 0xfe, 0xef, 0x2e, 0x16, 0x8d, 0xe2, 0x62, 0xf1, 0x09, 0x34, 0x75, 0xb1, 0x50, 0xcb, 0x74, - 0x9a, 0x42, 0x0b, 0x5d, 0x43, 0xf6, 0x25, 0xd4, 0x3a, 0x82, 0xba, 0x38, 0xe3, 0xa4, 0x19, 0xbc, - 0x0f, 0x15, 0xd9, 0xcb, 0xf0, 0xf6, 0x8c, 0x37, 0x70, 0x35, 0xbc, 0x21, 0x00, 0x7d, 0x2f, 0x46, - 0x5d, 0xe3, 0x42, 0xa9, 0x2c, 0x71, 0xc9, 0xf5, 0xd1, 0x3f, 0x96, 0xa0, 0xa1, 0x97, 0x52, 0x11, - 0xf4, 0x13, 0x58, 0x13, 0xbe, 0xa5, 0x3b, 0xc1, 0xb4, 0x06, 0x09, 0x42, 0xac, 0xb0, 0xe8, 0x15, - 0x6c, 0x89, 0x5b, 0x31, 0xe1, 0xe9, 0x94, 0x44, 0x01, 0xf5, 0x0c, 0x87, 0xdf, 0x14, 0xb8, 0xde, - 0x84, 0xd9, 0x02, 0xc3, 0x3d, 0xe3, 0x53, 0x40, 0x29, 0xc3, 0x94, 0xf8, 0x92, 0x5c, 0xcd, 0xd0, - 0x9a, 0x7c, 0x48, 0x7c, 0x4e, 0x6c, 0x35, 0xa1, 0x7e, 0x16, 0x5e, 0xd1, 0x20, 0x49, 0x2a, 0x5f, - 0x41, 0x43, 0x03, 0x92, 0xb1, 0x70, 0x8d, 0x09, 0x88, 0x12, 0x14, 0xa5, 0x82, 0xc6, 0x84, 0x09, - 0x62, 0xac, 0x28, 0xac, 0x7f, 0x2d, 0x43, 0x25, 0x81, 0xf2, 0x04, 0x39, 0xe2, 0xd1, 0x33, 0x21, - 0x2e, 0x89, 0xc2, 0x30, 0x50, 0x1d, 0x65, 0x8d, 0x03, 0xdf, 0x2a, 0x18, 0x4f, 0xb4, 0x53, 0x72, - 0x37, 0xe1, 0x45, 0xee, 0x92, 0xc4, 0x97, 0x7a, 0x92, 0x54, 0xb0, 0x23, 0x12, 0x5f, 0xa2, 0xe7, - 0xd0, 0xd2, 0x24, 0xd3, 0x88, 0xfa, 0x13, 0xa2, 0x8a, 0x5d, 0x0d, 0x37, 0x15, 0x7c, 0xa8, 0xc0, - 0xdc, 0xcd, 0xd5, 0x05, 0x83, 0xd0, 0x7c, 0xc2, 0x55, 0x5f, 0x11, 0x75, 0xb5, 0x21, 0xe1, 0x5c, - 0xf1, 0xb7, 0x31, 0x61, 0xe8, 0xf7, 0x61, 0x3b, 0x0a, 0x67, 0x8c, 0xc7, 0x0f, 0x0f, 0xb3, 0x94, - 0x7c, 0x55, 0x90, 0x23, 0x85, 0x3c, 0xa4, 0x34, 0x61, 0x51, 0x05, 0xdb, 0x11, 0x9d, 0x1b, 0xf5, - 0x44, 0xf8, 0xaa, 0x82, 0xbd, 0x2f, 0x41, 0xbc, 0xf8, 0x8b, 0x5c, 0x41, 0xe5, 0xe4, 0xb5, 0x81, - 0xf5, 0x27, 0x67, 0x8e, 0x59, 0x18, 0x91, 0x0b, 0xea, 0x04, 0x64, 0x22, 0x23, 0xb5, 0xc2, 0x8b, - 0xb2, 0x80, 0x0d, 0xc8, 0x84, 0x5a, 0x3b, 0xb0, 0x75, 0x6c, 0x36, 0x14, 0xfa, 0x4c, 0x7e, 0xbb, - 0x0c, 0xdb, 0x39, 0x84, 0x3a, 0x1b, 0x07, 0x9a, 0xd9, 0xfe, 0x44, 0x1f, 0xd2, 0x6e, 0xd6, 0x9b, - 0xf2, 0x8c, 0x59, 0x68, 0x6c, 0x07, 0x2c, 0xba, 0xdb, 0x2b, 0x77, 0x4a, 0xb8, 0x91, 0xe9, 0x68, - 0x62, 0x14, 0xc0, 0x4e, 0xbe, 0x01, 0x9a, 0xf1, 0x56, 0x4a, 0x4f, 0x27, 0x5f, 0x7c, 0x9f, 0x7d, - 0xf6, 0x24, 0xab, 0xd8, 0x0d, 0x6f, 0x8d, 0x0b, 0x50, 0xdd, 0x1e, 0xb4, 0x0b, 0x44, 0xe3, 0xa3, - 0x85, 0x9e, 0x48, 0xea, 0x98, 0xff, 0x4c, 0x67, 0x70, 0x39, 0x77, 0xc9, 0x8f, 0x2f, 0xcb, 0x5f, - 0x94, 0xba, 0x14, 0x3e, 0x5a, 0xb8, 0x6b, 0xc1, 0x42, 0xbb, 0xe6, 0x42, 0x8d, 0xdd, 0x07, 0x89, - 0x42, 0x59, 0x7e, 0x35, 0x4b, 0x24, 0xdb, 0xf0, 0xc3, 0x1a, 0xd0, 0x5b, 0x26, 0xe6, 0x96, 0x7e, - 0x70, 0x1e, 0xea, 0xc3, 0xfa, 0xdb, 0x12, 0x6c, 0xe7, 0x10, 0xea, 0xb0, 0x1e, 0x65, 0xaf, 0x75, - 0xe5, 0xb4, 0x6f, 0x5e, 0xea, 0x2e, 0xb8, 0xf9, 0x58, 0x2b, 0xbc, 0xf9, 0xe0, 0x69, 0x4c, 0xa4, - 0xf9, 0x74, 0xb8, 0x50, 0x75, 0xa2, 0x21, 0xc0, 0xc9, 0x58, 0x61, 0xbd, 0x81, 0x4d, 0x9e, 0x27, - 0x31, 0xe1, 0xfe, 0xac, 0x53, 0xd9, 0x13, 0xa8, 0x89, 0x3c, 0x3b, 0x9d, 0x8d, 0xae, 0xe8, 0x9d, - 0xce, 0x66, 0x55, 0x0e, 0x1b, 0x4a, 0x90, 0x75, 0x0c, 0xc8, 0xe4, 0x53, 0x5a, 0xbc, 0x51, 0x8c, - 0x91, 0x00, 0x6b, 0x7f, 0x6b, 0x67, 0x72, 0xb4, 0x62, 0x11, 0xab, 0xc9, 0xdf, 0xb1, 0xd5, 0x82, - 0xc6, 0xd7, 0x94, 0x99, 0x96, 0xfa, 0xcd, 0x1a, 0x34, 0x13, 0x90, 0x5a, 0xdd, 0x68, 0x9e, 0xd5, - 0xa5, 0xb8, 0x9e, 0x22, 0x9e, 0x26, 0xf7, 0x58, 0xb1, 0xf1, 0x4c, 0x50, 0xc7, 0xfa, 0x79, 0x23, - 0x16, 0xcf, 0x04, 0xdc, 0x2a, 0x09, 0x99, 0x9c, 0xc5, 0x55, 0xa9, 0x4f, 0xb8, 0x7b, 0x02, 0xca, - 0x7b, 0x83, 0x1c, 0xa1, 0xa3, 0x23, 0x57, 0x96, 0xf9, 0xed, 0x2c, 0x83, 0xad, 0xe2, 0xf8, 0x53, - 0xd8, 0x4c, 0xf9, 0x22, 0xf7, 0xd2, 0xbf, 0xa6, 0x9e, 0xbe, 0xb9, 0x49, 0x38, 0x14, 0x9c, 0x5b, - 0x59, 0x14, 0x4e, 0x2d, 0xf2, 0x9a, 0xec, 0x22, 0x25, 0x4c, 0x0a, 0xfc, 0x23, 0xa8, 0x2b, 0x12, - 0x25, 0xae, 0x9c, 0x4f, 0x15, 0x9f, 0x12, 0xf6, 0x13, 0x68, 0x6a, 0x22, 0xbd, 0xa5, 0x1c, 0x52, - 0x1b, 0x8a, 0x4c, 0x6f, 0xc8, 0x3b, 0x97, 0x59, 0x14, 0xf1, 0x54, 0x29, 0x1a, 0x1d, 0x7d, 0xb5, - 0x54, 0x51, 0x9d, 0x8b, 0xc4, 0x89, 0x36, 0x27, 0x79, 0xbd, 0x6a, 0x89, 0x12, 0x46, 0x63, 0xc7, - 0x0f, 0xae, 0xc3, 0x31, 0x5f, 0x1b, 0x04, 0x75, 0x53, 0xc1, 0xfb, 0x0a, 0xcc, 0x3b, 0x69, 0xe3, - 0xe8, 0x45, 0xe9, 0x5f, 0x70, 0xf2, 0x90, 0x9e, 0xbc, 0xb8, 0x90, 0xe2, 0xde, 0xac, 0x8a, 0x88, - 0x1c, 0x51, 0x61, 0xac, 0xab, 0x44, 0x8c, 0xbe, 0x80, 0x4e, 0x3c, 0x1b, 0xc5, 0x6e, 0xe4, 0x8f, - 0xa8, 0xe7, 0xb0, 0xd0, 0x49, 0x1f, 0xf2, 0x44, 0x07, 0xb0, 0x81, 0x77, 0x52, 0xfc, 0x59, 0xd8, - 0x4b, 0xb0, 0xe8, 0xc7, 0xd0, 0xe0, 0xe3, 0x03, 0xdf, 0x2c, 0x96, 0xb7, 0x30, 0x0d, 0x41, 0x5f, - 0x0b, 0xe8, 0x0d, 0x97, 0x26, 0x3e, 0x09, 0xc6, 0x77, 0xa8, 0xcf, 0x07, 0x80, 0xe8, 0x8a, 0x32, - 0xc7, 0x0f, 0xce, 0xc3, 0x4e, 0x53, 0x38, 0xec, 0xb3, 0x44, 0xec, 0x9c, 0x0b, 0xbe, 0x7c, 0x2b, - 0x68, 0x39, 0x48, 0x26, 0x2a, 0x98, 0x24, 0x80, 0x2e, 0x86, 0x66, 0x0e, 0x5d, 0x90, 0x51, 0x9e, - 0x9b, 0x19, 0x25, 0x3b, 0x59, 0x69, 0x56, 0x33, 0x91, 0xb4, 0x61, 0xf3, 0x94, 0x85, 0xd3, 0x03, - 0x42, 0x27, 0x69, 0xca, 0xdf, 0x02, 0x64, 0x02, 0xd5, 0x4d, 0xcd, 0xbf, 0x94, 0xa0, 0x7d, 0x72, - 0x7e, 0x4e, 0xa3, 0x53, 0xd9, 0xa8, 0xe8, 0x60, 0x36, 0xfa, 0x55, 0x97, 0x4c, 0x89, 0xeb, 0xb3, - 0x3b, 0xe3, 0x79, 0x4a, 0xf7, 0xab, 0xfb, 0x0a, 0xa5, 0xda, 0xd1, 0xf9, 0x7e, 0xa9, 0x5c, 0xdc, - 0x2f, 0x2d, 0x1c, 0x82, 0x97, 0x17, 0x0e, 0xc1, 0xd6, 0x27, 0x50, 0x3f, 0x35, 0x47, 0x6f, 0xb4, - 0x03, 0x6b, 0x6a, 0x32, 0x97, 0x71, 0xad, 0xbe, 0xac, 0xcf, 0xf9, 0x78, 0x73, 0xe1, 0xc7, 0x6c, - 0x4e, 0xa9, 0x45, 0x1c, 0xaf, 0xe1, 0xbe, 0x7d, 0x3b, 0xa5, 0x2e, 0x3b, 0xcd, 0x74, 0x6b, 0x1f, - 0x62, 0xfb, 0x18, 0x1e, 0x14, 0xb3, 0x49, 0xdb, 0xbe, 0xf8, 0xfb, 0x12, 0xd4, 0xcc, 0xfb, 0x54, - 0xd4, 0x82, 0xda, 0xd0, 0x1e, 0x1c, 0xf4, 0x07, 0x5f, 0x3b, 0x27, 0x43, 0x7b, 0xd0, 0x5a, 0x42, - 0x08, 0x1a, 0x1a, 0xf2, 0x6e, 0x78, 0xd0, 0x3b, 0xb3, 0x5b, 0x25, 0xb4, 0x01, 0x2b, 0x02, 0x5b, - 0x46, 0x55, 0x58, 0xb7, 0x7f, 0x39, 0xec, 0x63, 0xfb, 0xa0, 0xb5, 0x6c, 0x92, 0xee, 0x1f, 0x9f, - 0x9c, 0xda, 0x07, 0xad, 0x15, 0x04, 0xb0, 0xa6, 0x7e, 0xaf, 0xa2, 0x36, 0x34, 0xb1, 0xbd, 0x7f, - 0xf2, 0xde, 0xc6, 0x7f, 0xee, 0x1c, 0xf6, 0xfa, 0xc7, 0xf6, 0x41, 0x6b, 0x0d, 0x6d, 0x42, 0x5d, - 0x33, 0xed, 0xf5, 0xce, 0xf6, 0x8f, 0x5a, 0xeb, 0x2f, 0x86, 0x6a, 0x94, 0x95, 0x22, 0x55, 0x61, - 0x7d, 0x88, 0xed, 0x61, 0x0f, 0xdb, 0xad, 0x25, 0x54, 0x83, 0x8d, 0xde, 0xfe, 0xbe, 0x3d, 0x3c, - 0xb3, 0x0f, 0x5a, 0x25, 0xfe, 0x85, 0xed, 0x5f, 0xd8, 0xfb, 0xfc, 0xab, 0xcc, 0xb7, 0x3a, 0xed, - 0x7f, 0x3d, 0x10, 0xa2, 0xd4, 0xa1, 0x72, 0xd8, 0x1f, 0xf4, 0x8e, 0xfb, 0xbf, 0xe2, 0x52, 0xbc, - 0xf8, 0xb7, 0x12, 0x6c, 0xce, 0xcd, 0x9c, 0x5c, 0x8d, 0xc1, 0xc9, 0x80, 0x2f, 0xbb, 0x03, 0xe8, - 0xd4, 0xc6, 0xef, 0x6d, 0xec, 0xbc, 0xed, 0x9f, 0xee, 0xd9, 0x47, 0xbd, 0xf7, 0xfd, 0x13, 0xdc, - 0x2a, 0xa1, 0x2e, 0xec, 0x08, 0xa1, 0x9c, 0xf7, 0x36, 0x3e, 0xed, 0x9f, 0x0c, 0x38, 0xfa, 0xad, - 0x90, 0xb2, 0x8c, 0x1e, 0xc2, 0x47, 0xc3, 0x1e, 0x3e, 0xeb, 0xf7, 0x8e, 0x1d, 0x29, 0x84, 0xb3, - 0x7f, 0x72, 0x7c, 0xdc, 0x3b, 0xb3, 0x71, 0xef, 0xb8, 0xb5, 0x8c, 0x9e, 0xc0, 0xc3, 0x1c, 0xfa, - 0xe0, 0xdd, 0xf0, 0xb8, 0xbf, 0xdf, 0x3b, 0xb3, 0x9d, 0xa1, 0x6d, 0xe3, 0xd6, 0x0a, 0x7a, 0x0e, - 0x4f, 0xf3, 0x2b, 0x1c, 0xf5, 0x06, 0x03, 0xfb, 0xd8, 0x39, 0x7c, 0x27, 0x2d, 0xa2, 0xac, 0xb4, - 0xba, 0xfb, 0xbf, 0x0d, 0x58, 0x3b, 0x13, 0x77, 0x92, 0xe8, 0x2b, 0x58, 0x57, 0xd1, 0x8b, 0xee, - 0xcd, 0xc7, 0xb3, 0xf0, 0x87, 0x6e, 0x67, 0x51, 0xa0, 0x23, 0x1b, 0x20, 0x8d, 0x31, 0x94, 0x4e, - 0xe4, 0x73, 0xd1, 0xd8, 0xbd, 0x5f, 0x88, 0x53, 0xcb, 0x7c, 0x03, 0x35, 0xf3, 0x45, 0x1c, 0xa5, - 0x1d, 0x44, 0xc1, 0x7b, 0x7c, 0xf7, 0xe1, 0x02, 0x6c, 0x72, 0x01, 0x5e, 0x35, 0xfe, 0xb1, 0x80, - 0xee, 0x1b, 0x17, 0xdf, 0xf9, 0xb7, 0xb6, 0xee, 0xdc, 0xf3, 0x0c, 0x17, 0xc5, 0x7c, 0xeb, 0x36, - 0x44, 0x29, 0x78, 0x3a, 0x37, 0x44, 0x29, 0x7c, 0x20, 0xff, 0x06, 0x6a, 0xe6, 0xd3, 0xa8, 0xb1, - 0x58, 0xc1, 0xdb, 0xaf, 0xb1, 0x58, 0xe1, 0x7b, 0xea, 0x19, 0x34, 0x73, 0xaf, 0x93, 0x28, 0x7d, - 0xbb, 0x2d, 0x7e, 0x49, 0xed, 0x3e, 0x5e, 0x4c, 0xa0, 0x56, 0xfd, 0x16, 0x1a, 0xd9, 0x17, 0x40, - 0xf4, 0x71, 0xda, 0xbe, 0x15, 0xbd, 0x4f, 0x76, 0x1f, 0x2d, 0xc4, 0xa7, 0x5a, 0x9b, 0x8f, 0x63, - 0x86, 0xd6, 0x05, 0x2f, 0x80, 0x86, 0xd6, 0x85, 0x2f, 0x6a, 0xdf, 0x42, 0x23, 0xfb, 0x38, 0x65, - 0xc8, 0x57, 0xf8, 0x36, 0x66, 0xc8, 0x57, 0xfc, 0xaa, 0xc5, 0x0d, 0x99, 0xbb, 0xf4, 0x31, 0x0c, - 0x59, 0x7c, 0x51, 0x64, 0x18, 0x72, 0xd1, 0x7d, 0xd1, 0x11, 0x54, 0x8d, 0xe7, 0x18, 0xc3, 0xed, - 0xe6, 0x1f, 0x8a, 0xba, 0x0f, 0x8a, 0x91, 0x69, 0x50, 0xa5, 0x8f, 0x1e, 0x46, 0x50, 0xcd, 0xbd, - 0xac, 0x18, 0x41, 0x55, 0xf0, 0x4a, 0x72, 0x04, 0x55, 0xe3, 0xa9, 0xc2, 0x10, 0x68, 0xfe, 0xdd, - 0xc3, 0x10, 0xa8, 0xe0, 0x75, 0x83, 0x0b, 0x94, 0xde, 0x5f, 0x19, 0x02, 0xcd, 0xdd, 0x74, 0x19, - 0x02, 0x15, 0x5c, 0x78, 0x9d, 0xa8, 0x01, 0x3e, 0x1d, 0x8d, 0x1e, 0x2e, 0x1a, 0x7d, 0xe4, 0x6a, - 0x1f, 0x7f, 0xf7, 0x64, 0x84, 0x06, 0x50, 0xcf, 0x8c, 0x09, 0xc6, 0x7a, 0x45, 0x73, 0x85, 0xb1, - 0x5e, 0xf1, 0x74, 0x31, 0x80, 0xba, 0x00, 0x9e, 0x06, 0x64, 0x1a, 0x5f, 0x86, 0xcc, 0x58, 0x2f, - 0x03, 0x9f, 0x5f, 0x2f, 0x87, 0x56, 0xeb, 0xfd, 0x1c, 0xea, 0x5f, 0x53, 0x76, 0x9c, 0xb6, 0x69, - 0xe9, 0xbf, 0x34, 0x32, 0x37, 0x06, 0xdd, 0x7b, 0x73, 0x70, 0xb5, 0xc2, 0x1f, 0xc1, 0x9a, 0xbc, - 0xf3, 0x30, 0x58, 0x33, 0xf7, 0x29, 0x06, 0x6b, 0xee, 0x72, 0xe4, 0x10, 0xaa, 0x69, 0x37, 0x69, - 0xba, 0xd1, 0xdc, 0x20, 0x63, 0x9c, 0x5a, 0xc1, 0xb0, 0xc2, 0x03, 0xd0, 0xd4, 0x2e, 0x46, 0x0b, - 0xd4, 0x8e, 0x0b, 0x02, 0x30, 0x87, 0x57, 0x4b, 0x1e, 0x40, 0xcd, 0x6c, 0xc1, 0x8c, 0x04, 0x51, - 0xd0, 0x99, 0x75, 0x53, 0xcd, 0xb3, 0xed, 0xd0, 0x2f, 0x78, 0x18, 0x67, 0xda, 0x9e, 0x4c, 0x18, - 0x17, 0x35, 0x44, 0x0b, 0xd7, 0x72, 0x61, 0xab, 0xa8, 0xb3, 0x41, 0x3f, 0x36, 0x2e, 0x63, 0x17, - 0xf6, 0x4b, 0xdd, 0xa7, 0x1f, 0xa0, 0x92, 0x6a, 0xef, 0x7d, 0xf2, 0xab, 0xa7, 0x17, 0x3e, 0xbb, - 0x9c, 0x8d, 0x5e, 0xba, 0xe1, 0xe4, 0xd5, 0x98, 0x8f, 0x0e, 0x81, 0x1f, 0x5c, 0x8c, 0xc9, 0x28, - 0x7e, 0xc5, 0x17, 0x78, 0xa5, 0x56, 0x19, 0xad, 0x89, 0xff, 0xde, 0xfd, 0xc1, 0xff, 0x05, 0x00, - 0x00, 0xff, 0xff, 0xfc, 0xac, 0x81, 0x47, 0xb4, 0x27, 0x00, 0x00, + // 3726 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x73, 0x23, 0x49, + 0x56, 0x77, 0x49, 0xfe, 0xd2, 0xd3, 0xa7, 0x53, 0xb6, 0x5b, 0xa3, 0x9e, 0x9e, 0xee, 0xae, 0xdd, + 0xde, 0xe9, 0xee, 0x19, 0xba, 0x07, 0xb3, 0xdd, 0x0c, 0xc3, 0xc0, 0xae, 0x2c, 0xcb, 0x63, 0xed, + 0xb8, 0x65, 0x4d, 0xda, 0xdd, 0x2c, 0x7b, 0xa9, 0x48, 0x95, 0xd2, 0x76, 0xad, 0xa5, 0x2a, 0x51, + 0x95, 0xf2, 0xc7, 0x81, 0x03, 0xc1, 0x46, 0x70, 0x84, 0x58, 0x02, 0xae, 0xdc, 0xe0, 0x7f, 0x80, + 0x08, 0x0e, 0x9c, 0x88, 0x80, 0x7f, 0x81, 0x08, 0xce, 0xfc, 0x05, 0x1c, 0x89, 0xfc, 0xaa, 0xca, + 0x2a, 0x95, 0xa6, 0x77, 0x86, 0xc3, 0xde, 0x54, 0xef, 0x23, 0xf3, 0xbd, 0xcc, 0x7c, 0x2f, 0x7f, + 0xef, 0xa5, 0xa0, 0xc2, 0x42, 0x32, 0xa6, 0xe1, 0x8b, 0x59, 0x18, 0xb0, 0x00, 0x6d, 0xcc, 0x82, + 0x60, 0x12, 0xce, 0xdc, 0xf6, 0x47, 0x64, 0xee, 0x32, 0x2f, 0xf0, 0x29, 0x0d, 0xc3, 0x99, 0xfb, + 0x32, 0xf9, 0x92, 0x82, 0xf6, 0xff, 0x58, 0x80, 0xfa, 0xbe, 0xc7, 0x3a, 0xae, 0x1b, 0xcc, 0x7d, + 0x86, 0xe9, 0x9f, 0xcd, 0x69, 0xc4, 0xd0, 0x0f, 0xa0, 0x4a, 0x24, 0xc5, 0xb9, 0x26, 0x93, 0x39, + 0x6d, 0x59, 0x8f, 0xac, 0xa7, 0xab, 0xb8, 0xa2, 0x88, 0xef, 0x38, 0x0d, 0x3d, 0x83, 0x3a, 0x19, + 0x45, 0xc1, 0x64, 0xce, 0xa8, 0x73, 0x49, 0xbd, 0x8b, 0x4b, 0xd6, 0x2a, 0x3c, 0xb2, 0x9e, 0x56, + 0x8f, 0x56, 0x70, 0x4d, 0x33, 0x8e, 0x04, 0x9d, 0x8b, 0x86, 0x74, 0x42, 0x98, 0x77, 0x1d, 0x8b, + 0x16, 0xb5, 0xa8, 0x66, 0x28, 0xd1, 0xc7, 0x50, 0x76, 0x03, 0xff, 0xdc, 0x61, 0x24, 0xbc, 0xa0, + 0xac, 0xb5, 0x2a, 0xc4, 0x2c, 0x0c, 0x9c, 0x78, 0x26, 0x68, 0xe8, 0x43, 0x28, 0x79, 0xbe, 0xc7, + 0x3c, 0xc2, 0x82, 0xb0, 0xb5, 0xf6, 0xc8, 0x7a, 0x5a, 0xc2, 0x09, 0x61, 0xbf, 0x01, 0x35, 0x6d, + 0x3b, 0xbd, 0x9d, 0x79, 0xe1, 0xdd, 0xfe, 0x3a, 0xac, 0x9e, 0x53, 0x1a, 0xd9, 0x14, 0x9a, 0xdf, + 0xcc, 0x03, 0x46, 0xbf, 0x8f, 0xb3, 0x19, 0xb3, 0xb4, 0xa3, 0x86, 0x59, 0xf1, 0x34, 0x37, 0xb0, + 0x9d, 0x9e, 0x26, 0x9a, 0x05, 0x7e, 0x44, 0xd1, 0xef, 0xc3, 0x07, 0x53, 0xcf, 0xa7, 0xa1, 0x73, + 0x4e, 0xa9, 0x13, 0x12, 0x46, 0x9d, 0x88, 0x30, 0x67, 0x46, 0x43, 0xe7, 0xea, 0x46, 0xcd, 0xb9, + 0x2d, 0x04, 0x0e, 0x29, 0xc5, 0x84, 0xd1, 0x53, 0xc2, 0x86, 0x34, 0xfc, 0xfa, 0x06, 0xfd, 0x08, + 0xea, 0x89, 0x22, 0x0b, 0x18, 0x99, 0x88, 0xf9, 0x57, 0x71, 0x55, 0x8b, 0x9f, 0x71, 0xa2, 0xfd, + 0x1a, 0x9a, 0xc7, 0x5e, 0xa4, 0xf7, 0x32, 0xd2, 0xfe, 0x3d, 0x84, 0x32, 0x71, 0xc5, 0xd2, 0x07, + 0xfe, 0xe4, 0x4e, 0xcc, 0xb4, 0x89, 0x41, 0x92, 0x4e, 0xfc, 0xc9, 0x9d, 0x7d, 0x00, 0xdb, 0x69, + 0x3d, 0x65, 0xf0, 0xa7, 0xb0, 0xa9, 0xd6, 0x20, 0x6a, 0x59, 0x8f, 0x8a, 0x4f, 0xcb, 0x7b, 0x8d, + 0x17, 0xea, 0x60, 0xbd, 0xd0, 0xce, 0xc5, 0x12, 0xf6, 0x4f, 0x60, 0xfd, 0x64, 0xce, 0x66, 0x73, + 0x86, 0xee, 0x43, 0x49, 0x2c, 0x24, 0xf7, 0x4f, 0x39, 0xb6, 0x29, 0x08, 0xa7, 0x84, 0xa1, 0x16, + 0x6c, 0x90, 0xf1, 0x38, 0xa4, 0x51, 0x24, 0x9c, 0x28, 0x61, 0xfd, 0x69, 0xff, 0xca, 0x82, 0xaa, + 0x1c, 0xe1, 0x4f, 0x3c, 0x76, 0x79, 0x48, 0xa9, 0x29, 0x6b, 0xa5, 0x64, 0x7f, 0x83, 0xed, 0x40, + 0x2f, 0xa0, 0x99, 0xb7, 0xd0, 0xfc, 0xdc, 0xad, 0x1e, 0xad, 0xe0, 0xfa, 0x79, 0x7a, 0x95, 0xe3, + 0xed, 0xeb, 0xc2, 0xae, 0xb4, 0x22, 0xe2, 0x66, 0xf4, 0xa7, 0xb3, 0x89, 0xe7, 0x7a, 0x8c, 0x9b, + 0xf3, 0x0c, 0x36, 0x02, 0xc9, 0x51, 0xcb, 0x51, 0x8f, 0x97, 0x43, 0x6a, 0x60, 0xcd, 0xb7, 0xff, + 0xdd, 0x82, 0x66, 0x77, 0x12, 0x44, 0xd9, 0xb3, 0xf6, 0x00, 0x40, 0x06, 0xaa, 0x73, 0x45, 0xe5, + 0x56, 0x54, 0x70, 0x49, 0x52, 0xbe, 0xa6, 0x77, 0xe8, 0xa7, 0x50, 0x97, 0x23, 0x38, 0x37, 0x1e, + 0xbb, 0xe4, 0xfb, 0x2d, 0x5c, 0x2b, 0xef, 0xed, 0x66, 0x66, 0x52, 0x2b, 0x74, 0xb4, 0x82, 0xab, + 0x41, 0x6a, 0xc9, 0xfe, 0x30, 0xb1, 0xb1, 0x28, 0x34, 0x1f, 0x66, 0x34, 0xb3, 0x5e, 0x1d, 0xad, + 0xc4, 0x56, 0xef, 0x37, 0x61, 0xeb, 0x7c, 0xee, 0x8f, 0x23, 0x67, 0x4c, 0x23, 0xe6, 0xf9, 0x84, + 0xe7, 0x0a, 0xfb, 0x15, 0x6c, 0xa7, 0x3d, 0x51, 0xa7, 0xe3, 0x01, 0x80, 0xcb, 0xe9, 0x0e, 0xbb, + 0xf5, 0xc6, 0xda, 0x15, 0x41, 0x39, 0xbb, 0xf5, 0xc6, 0xf6, 0xdf, 0x58, 0xb0, 0xcb, 0xa7, 0x1a, + 0x87, 0xe4, 0xe6, 0xbb, 0x2d, 0x82, 0xb1, 0xcc, 0x85, 0x6f, 0x5f, 0x66, 0xf4, 0xe9, 0xb7, 0xec, + 0xf1, 0xc2, 0x0e, 0xdb, 0xbf, 0x84, 0x7b, 0x0b, 0x16, 0x29, 0x67, 0x9e, 0xc3, 0x86, 0x3a, 0xc8, + 0xc2, 0x9e, 0xbc, 0x93, 0xae, 0x05, 0x78, 0xbe, 0xb8, 0x51, 0xc3, 0x48, 0xdf, 0x0b, 0xc2, 0x83, + 0x8a, 0x26, 0x0a, 0xf7, 0xff, 0xd2, 0x82, 0x9d, 0x03, 0x3a, 0x0b, 0xa2, 0x85, 0xdc, 0xfa, 0x1e, + 0xef, 0x1f, 0x00, 0x90, 0xa9, 0x48, 0x46, 0x3c, 0x7a, 0x64, 0x9c, 0x97, 0x24, 0x85, 0x87, 0xcf, + 0x77, 0xf3, 0xf8, 0x02, 0x76, 0xb3, 0x46, 0x7c, 0x0f, 0x87, 0x1f, 0x43, 0x65, 0x2c, 0x47, 0x31, + 0xfd, 0x2d, 0x2b, 0x9a, 0x70, 0xf7, 0x3f, 0x2d, 0x68, 0x62, 0xea, 0xd3, 0xec, 0x56, 0x8b, 0xdc, + 0x23, 0x73, 0x6b, 0xe2, 0x2d, 0x28, 0x92, 0xdc, 0xec, 0xe4, 0x12, 0x91, 0xe9, 0x7a, 0xf1, 0x12, + 0xe9, 0x09, 0x7a, 0xea, 0x12, 0x51, 0xa2, 0x0b, 0x97, 0x88, 0x12, 0x5d, 0xb2, 0x4a, 0xab, 0xb9, + 0xab, 0xb4, 0x78, 0x63, 0xd8, 0x14, 0xb6, 0xd3, 0xde, 0x7c, 0xbf, 0x55, 0x0b, 0xf9, 0x18, 0x64, + 0x92, 0x5a, 0x35, 0x45, 0x13, 0xab, 0x36, 0x86, 0x9d, 0xfd, 0xf9, 0x74, 0xa6, 0x54, 0x79, 0xda, + 0xff, 0xcd, 0xce, 0xc8, 0x12, 0xf7, 0x0a, 0xf9, 0x87, 0xa0, 0x05, 0xbb, 0xd9, 0x59, 0xa4, 0x3b, + 0xf6, 0xdf, 0x15, 0x60, 0x43, 0x91, 0xdf, 0x37, 0xe5, 0xef, 0xc0, 0x26, 0x0f, 0xba, 0xc0, 0xf3, + 0x99, 0x4a, 0x49, 0x5b, 0x66, 0x54, 0x0e, 0x39, 0x03, 0xc7, 0x22, 0x68, 0x1b, 0xd6, 0xe4, 0x5d, + 0x2a, 0x0f, 0xa6, 0xfc, 0x40, 0x9f, 0xc0, 0x16, 0xb9, 0x26, 0xde, 0x84, 0x8c, 0x26, 0xd4, 0x19, + 0x91, 0x09, 0xf1, 0x5d, 0xaa, 0x36, 0xa5, 0x11, 0x33, 0xf6, 0x25, 0x9d, 0x0b, 0x8b, 0xdd, 0x10, + 0x59, 0x48, 0xa3, 0x06, 0x7e, 0xdb, 0x57, 0x71, 0x23, 0x61, 0x28, 0xd4, 0xf0, 0x09, 0xac, 0x45, + 0x8c, 0x30, 0xda, 0x5a, 0x7f, 0x64, 0x3d, 0xad, 0xed, 0xed, 0x64, 0xb7, 0xe5, 0x94, 0x33, 0xb1, + 0x94, 0xe1, 0x87, 0x72, 0x42, 0x18, 0x8d, 0xd4, 0x71, 0xde, 0x90, 0x87, 0x52, 0x92, 0xc4, 0xbe, + 0xfc, 0x85, 0x05, 0xe8, 0x74, 0x3e, 0x9a, 0x7a, 0xec, 0x24, 0x1c, 0xd3, 0x50, 0xef, 0xca, 0x23, + 0x28, 0x92, 0xe8, 0x4a, 0xed, 0x7c, 0x25, 0x99, 0x22, 0xba, 0x3a, 0x5a, 0xc1, 0x9c, 0xc5, 0x25, + 0x46, 0x6a, 0xab, 0x4d, 0x89, 0x7d, 0x6f, 0xcc, 0x25, 0x46, 0xde, 0x38, 0x8d, 0x5d, 0x8a, 0x59, + 0xec, 0x52, 0x82, 0x8d, 0x31, 0x65, 0xc4, 0x9b, 0x44, 0xf6, 0xaf, 0x2d, 0x68, 0xa6, 0x6c, 0x50, + 0x47, 0xf0, 0x4b, 0xa8, 0x7a, 0xfe, 0x35, 0x99, 0x78, 0x63, 0x27, 0xe0, 0x0c, 0x65, 0x4e, 0xe2, + 0x71, 0x5f, 0x72, 0x85, 0xd6, 0xd1, 0x0a, 0xae, 0x78, 0xc6, 0x37, 0xda, 0x83, 0x6d, 0xe2, 0xba, + 0x74, 0xc6, 0xa8, 0x52, 0x77, 0xfc, 0x80, 0x6f, 0x82, 0x38, 0x9c, 0x47, 0x2b, 0x18, 0x69, 0xae, + 0x10, 0x1f, 0x70, 0x9e, 0x69, 0xd4, 0x00, 0xb6, 0x38, 0x52, 0x10, 0xcc, 0x18, 0x5f, 0xb4, 0x60, + 0xe3, 0x9a, 0x86, 0xa3, 0x20, 0xa2, 0x0a, 0x5b, 0xe8, 0xcf, 0x2c, 0xf2, 0x28, 0x2c, 0x20, 0x8f, + 0x9f, 0x03, 0x32, 0xc7, 0x53, 0x2e, 0x3e, 0x82, 0x55, 0x12, 0x5d, 0xe9, 0x4b, 0x36, 0xb5, 0xd0, + 0x58, 0x70, 0xb8, 0xc4, 0xc8, 0x1b, 0xeb, 0xfb, 0x21, 0xb5, 0xd0, 0x58, 0x70, 0xec, 0x57, 0x80, + 0xba, 0xfc, 0x18, 0x4d, 0x52, 0x3b, 0xf8, 0x10, 0xca, 0xa6, 0xd7, 0x2a, 0x1d, 0x05, 0xb1, 0xaf, + 0xf6, 0x0e, 0x34, 0x53, 0x6a, 0x2a, 0x50, 0xfe, 0xab, 0x08, 0x6b, 0x72, 0x01, 0xdf, 0x9f, 0xbd, + 0x45, 0x54, 0x9e, 0x7b, 0xb7, 0x54, 0x9e, 0x83, 0x2a, 0x2e, 0x71, 0xca, 0x21, 0x27, 0xa0, 0x06, + 0x14, 0xc9, 0x94, 0xa9, 0xa0, 0xe0, 0x3f, 0xd1, 0x1f, 0xc3, 0x83, 0x29, 0xb9, 0x75, 0x46, 0x84, + 0xb9, 0x97, 0xce, 0xf2, 0x9c, 0x75, 0x6f, 0x4a, 0x6e, 0xf7, 0xb9, 0x4c, 0x16, 0x1b, 0x66, 0x3c, + 0x5a, 0xcb, 0x7a, 0x84, 0x9e, 0xa5, 0x23, 0xa3, 0x99, 0x44, 0x2d, 0x97, 0x49, 0xc5, 0xc5, 0x36, + 0xac, 0xcd, 0x7d, 0x8f, 0x45, 0x22, 0x22, 0xaa, 0x58, 0x7e, 0xf0, 0x38, 0x14, 0x3f, 0x9c, 0xb9, + 0x7f, 0x3e, 0x9f, 0x9c, 0x7b, 0x93, 0x09, 0x1d, 0xb7, 0x36, 0x65, 0x1c, 0x0a, 0xc6, 0xdb, 0x84, + 0x8e, 0x3e, 0x05, 0x14, 0xd2, 0x88, 0x86, 0xd7, 0x74, 0xec, 0x24, 0x18, 0xb0, 0x24, 0x43, 0x5c, + 0x73, 0xde, 0x69, 0x2c, 0xb8, 0x07, 0x3b, 0x6e, 0x48, 0x65, 0x80, 0x33, 0x6f, 0x4a, 0x23, 0x46, + 0xa6, 0x33, 0xc7, 0x8f, 0x5a, 0x20, 0x14, 0x9a, 0x9a, 0x79, 0xa6, 0x79, 0x03, 0x6e, 0xce, 0x3a, + 0xbd, 0xa6, 0x1c, 0x92, 0x96, 0xc5, 0xe6, 0x67, 0x1c, 0xea, 0x71, 0x1e, 0x56, 0x22, 0x0a, 0x39, + 0x3b, 0xd2, 0xfe, 0x29, 0x5f, 0xbf, 0x56, 0x45, 0x58, 0xce, 0x91, 0xf3, 0x5b, 0x4e, 0x7d, 0xc3, + 0x89, 0xf6, 0x5f, 0x15, 0xa0, 0xb8, 0xef, 0x8d, 0xd1, 0xd3, 0xf8, 0xa8, 0xab, 0xb0, 0xaa, 0xa5, + 0x47, 0xc7, 0x9a, 0xcd, 0x4d, 0x9f, 0x50, 0x12, 0x51, 0x67, 0x3c, 0x57, 0x19, 0x6a, 0x34, 0x09, + 0xdc, 0xab, 0x48, 0xed, 0x79, 0x53, 0x30, 0x0f, 0x14, 0x6f, 0x5f, 0xb0, 0x54, 0xa0, 0x44, 0x5e, + 0xe0, 0xcb, 0x8b, 0x0b, 0xeb, 0x4f, 0xf4, 0x0a, 0xb8, 0x41, 0x8e, 0x1f, 0x8c, 0xa9, 0xc3, 0x3c, + 0x1a, 0x8a, 0x5d, 0xaf, 0x19, 0x29, 0x76, 0x10, 0x8c, 0xe9, 0x99, 0x47, 0x43, 0x5c, 0x9e, 0x7a, + 0xbe, 0xfe, 0x40, 0xcf, 0x61, 0x2b, 0xa2, 0x93, 0x73, 0xc7, 0xbd, 0x24, 0x7e, 0x9c, 0x4f, 0xd7, + 0xe4, 0x2d, 0xc0, 0x19, 0xdd, 0x4b, 0xe2, 0xeb, 0x74, 0xfa, 0x04, 0x6a, 0x91, 0x37, 0xa6, 0x2e, + 0x09, 0x1d, 0xe6, 0xb9, 0x57, 0x94, 0x89, 0x03, 0x51, 0xc2, 0x55, 0x45, 0x3d, 0x13, 0x44, 0xfb, + 0xcf, 0xa1, 0xd8, 0x89, 0xae, 0x7e, 0x5b, 0x0b, 0x61, 0xff, 0xb7, 0x05, 0x5b, 0xa2, 0x78, 0x4a, + 0x85, 0xad, 0x0a, 0x1b, 0x2b, 0x09, 0x9b, 0xf7, 0xc4, 0xd9, 0x52, 0xa3, 0x8a, 0xcb, 0x8d, 0xfa, + 0xff, 0x46, 0x62, 0xce, 0x59, 0x5b, 0xcb, 0x3b, 0x6b, 0xff, 0x6b, 0x01, 0x32, 0x5d, 0x8c, 0xa1, + 0xc5, 0x96, 0x28, 0xed, 0x9c, 0x59, 0x48, 0xa7, 0xde, 0x7c, 0x6a, 0x14, 0x4f, 0x75, 0xc1, 0x18, + 0x4a, 0x3a, 0x8f, 0x9b, 0x1f, 0x42, 0x4d, 0x18, 0xc7, 0x0d, 0x13, 0x8e, 0x89, 0x15, 0xb0, 0x70, + 0x85, 0x53, 0x87, 0x34, 0x14, 0x1e, 0x09, 0x00, 0xa2, 0xa4, 0x5c, 0xea, 0xcb, 0xac, 0x63, 0xe1, + 0xb2, 0x92, 0xe1, 0x24, 0xf4, 0x0a, 0xee, 0xc9, 0x49, 0xe9, 0x2d, 0x75, 0xe7, 0x62, 0xa1, 0xb8, + 0xe7, 0x7c, 0x6a, 0xe9, 0xed, 0xb6, 0x60, 0xf7, 0x34, 0xf7, 0x90, 0x8a, 0xb8, 0x7d, 0x0d, 0xad, + 0x9b, 0x20, 0x8c, 0x98, 0xe3, 0xf2, 0x35, 0x76, 0x2f, 0x89, 0x97, 0xe8, 0xc9, 0xe3, 0xb7, 0x2d, + 0xf8, 0x5d, 0x12, 0xd1, 0x2e, 0xe7, 0x4a, 0x3d, 0xfb, 0xdf, 0x2c, 0x80, 0x24, 0x4a, 0xb9, 0x81, + 0xa9, 0xa8, 0xe7, 0xde, 0x16, 0x71, 0x99, 0x19, 0xd1, 0x7e, 0x1f, 0x4a, 0x22, 0x94, 0x9d, 0x88, + 0x85, 0xaa, 0x5e, 0xdc, 0x14, 0x84, 0x53, 0x16, 0xa2, 0x2f, 0xa0, 0x22, 0x12, 0x97, 0x38, 0xff, + 0x17, 0x54, 0x15, 0x3c, 0xc9, 0x4d, 0xf8, 0x76, 0x36, 0x26, 0x8c, 0x8e, 0xc5, 0x64, 0x47, 0x2b, + 0xb8, 0x2c, 0x84, 0xbb, 0x42, 0x16, 0xbd, 0x84, 0x0d, 0xb1, 0x47, 0x74, 0x2c, 0x3c, 0x35, 0xf3, + 0x88, 0xd8, 0x26, 0xad, 0xa4, 0xa5, 0xf6, 0x37, 0x60, 0x4d, 0x4c, 0x6c, 0xff, 0x83, 0x05, 0x15, + 0x73, 0x64, 0xf4, 0x05, 0xd4, 0x66, 0x21, 0xbd, 0xf6, 0x82, 0x79, 0xe4, 0xc8, 0x54, 0x6b, 0x2d, + 0x4f, 0xb5, 0x55, 0x2d, 0x2a, 0x3e, 0xd1, 0x67, 0x50, 0xf2, 0xe9, 0x8d, 0x52, 0x2b, 0x2c, 0x57, + 0xdb, 0xf4, 0xe9, 0x8d, 0xd4, 0x78, 0x0c, 0x15, 0x79, 0xc4, 0x54, 0x26, 0x96, 0x27, 0xba, 0x2c, + 0x68, 0x87, 0x82, 0x64, 0xff, 0x87, 0x05, 0x90, 0x38, 0x81, 0x7e, 0x0c, 0x65, 0xe1, 0xc4, 0x12, + 0xe3, 0x84, 0xa4, 0x9c, 0x05, 0xa6, 0xf1, 0xef, 0x85, 0x79, 0x0a, 0x0b, 0xf3, 0xf0, 0x42, 0x48, + 0xad, 0x8e, 0x82, 0x22, 0x45, 0x59, 0x08, 0x29, 0xa2, 0xbc, 0x30, 0x7f, 0x02, 0xd5, 0x90, 0xfe, + 0x92, 0xba, 0xcc, 0x09, 0x29, 0x89, 0x02, 0x5f, 0xa5, 0xb6, 0x76, 0x7a, 0x7e, 0x2c, 0x44, 0xb0, + 0x90, 0xc0, 0x95, 0xd0, 0xf8, 0xe2, 0xf0, 0x15, 0x53, 0x37, 0xb8, 0xa6, 0x61, 0xa6, 0xb1, 0x61, + 0x9f, 0xc0, 0xbd, 0x05, 0x8e, 0x8a, 0xa6, 0x1f, 0xc3, 0xae, 0x3f, 0x9f, 0x3a, 0xa1, 0x64, 0xd3, + 0xb1, 0x63, 0x34, 0x32, 0xb8, 0x1f, 0xdb, 0xfe, 0x7c, 0x8a, 0x35, 0x53, 0x6b, 0xdb, 0x4d, 0xd8, + 0xea, 0xc8, 0x0e, 0x59, 0x82, 0xc5, 0xed, 0x21, 0x20, 0x93, 0xa8, 0x26, 0xf8, 0x02, 0xaa, 0xa9, + 0x98, 0x59, 0x80, 0x61, 0x66, 0xcc, 0xe0, 0x0a, 0x35, 0xbe, 0xec, 0x7f, 0x5c, 0x83, 0xb5, 0x63, + 0x9e, 0x81, 0xd0, 0x6b, 0xa8, 0xf2, 0xb3, 0xeb, 0xd3, 0x89, 0x23, 0xa1, 0xb5, 0xb5, 0x0c, 0x5a, + 0x57, 0x94, 0x9c, 0xf8, 0xe2, 0xb9, 0x46, 0xeb, 0x91, 0xa9, 0x59, 0x29, 0xea, 0xe1, 0x3a, 0x53, + 0x26, 0x03, 0xf5, 0x9e, 0x96, 0xcb, 0xcf, 0x84, 0x3b, 0x8a, 0x9d, 0xc9, 0x85, 0x9f, 0xc1, 0xb6, + 0xd6, 0x93, 0x79, 0x54, 0xd5, 0x5b, 0xa2, 0x1b, 0x87, 0x91, 0xe2, 0x09, 0x1f, 0x54, 0xc5, 0xf5, + 0x10, 0xca, 0x66, 0xe2, 0x92, 0x59, 0x00, 0x66, 0x49, 0xce, 0x7a, 0xce, 0xe1, 0x7c, 0x36, 0xc9, + 0xac, 0xcb, 0xfc, 0x46, 0x33, 0xf9, 0xc5, 0x16, 0xcb, 0x62, 0x24, 0x95, 0x0d, 0x21, 0x57, 0x76, + 0x93, 0x5c, 0x82, 0x5e, 0x40, 0xd3, 0x9d, 0x50, 0x12, 0x7a, 0xfe, 0x85, 0xcc, 0xd4, 0xb3, 0xd0, + 0x73, 0xa9, 0x00, 0x26, 0xab, 0x78, 0x4b, 0xb3, 0x78, 0x86, 0x1e, 0x72, 0x06, 0x7a, 0x0a, 0x0d, + 0x09, 0x94, 0xc4, 0x95, 0x21, 0x54, 0x14, 0x2e, 0xa9, 0x09, 0xba, 0xb8, 0x38, 0xb0, 0x2a, 0x0f, + 0x4c, 0x48, 0x05, 0x0b, 0x90, 0xea, 0x43, 0x28, 0xcd, 0xe6, 0xa1, 0x7b, 0x49, 0x22, 0x3a, 0x6e, + 0x95, 0x05, 0xa8, 0x4d, 0x08, 0x3c, 0xa7, 0xea, 0xb5, 0x0b, 0xe9, 0x34, 0x60, 0x54, 0x5e, 0xeb, + 0x1c, 0x2e, 0x56, 0xc4, 0x50, 0x7a, 0x69, 0xb1, 0xe0, 0xf2, 0xcb, 0x9c, 0x23, 0xc7, 0x3f, 0x82, + 0x2d, 0xad, 0x96, 0xc0, 0x80, 0xea, 0x32, 0x18, 0xa0, 0xb7, 0xff, 0xdb, 0xa1, 0x40, 0x2d, 0x1f, + 0x0a, 0x7c, 0x0c, 0x75, 0x0d, 0x05, 0xd4, 0x30, 0xad, 0xba, 0xf0, 0x42, 0x23, 0x84, 0xae, 0xa4, + 0xda, 0x47, 0x50, 0x15, 0x7b, 0x1c, 0x43, 0xfd, 0xfb, 0x50, 0x92, 0xf7, 0x23, 0x07, 0xdf, 0x1c, + 0x9e, 0x57, 0xf0, 0xa6, 0x20, 0xf4, 0xc7, 0x11, 0x6a, 0x1b, 0xed, 0xc2, 0x82, 0xe4, 0xc5, 0xcd, + 0xc1, 0xbf, 0xb7, 0xa0, 0xa6, 0x87, 0x52, 0x11, 0xf4, 0x23, 0x58, 0x17, 0x67, 0x4b, 0xe3, 0xfc, + 0x04, 0x61, 0x08, 0x41, 0xac, 0xb8, 0xe8, 0x25, 0xc8, 0x4b, 0x48, 0x9c, 0x74, 0x4a, 0x42, 0x9f, + 0x8e, 0x8d, 0x03, 0x2f, 0x2f, 0xcd, 0xce, 0x94, 0xf5, 0x04, 0x87, 0x9f, 0x8c, 0x4f, 0x00, 0x25, + 0x0a, 0x33, 0xe2, 0x49, 0xf1, 0xa2, 0x71, 0x95, 0x76, 0xa6, 0x6c, 0x48, 0x3c, 0x2e, 0x6c, 0xd7, + 0xa1, 0x7a, 0x16, 0x5c, 0x51, 0x3f, 0x4e, 0x2a, 0x5f, 0x42, 0x4d, 0x13, 0xe2, 0x9b, 0x79, 0x9d, + 0x09, 0x8a, 0x32, 0x14, 0x25, 0x86, 0x46, 0x84, 0x09, 0x61, 0xac, 0x24, 0xec, 0x7f, 0x29, 0x40, + 0x29, 0xa6, 0xf2, 0x04, 0x39, 0xe2, 0xd1, 0x33, 0x25, 0x2e, 0x09, 0x83, 0xc0, 0x57, 0xf5, 0x42, + 0x85, 0x13, 0xdf, 0x28, 0x1a, 0x4f, 0xb4, 0x33, 0x72, 0x37, 0xe5, 0x97, 0xdc, 0x25, 0x89, 0x2e, + 0x75, 0x9f, 0x40, 0xd1, 0x8e, 0x48, 0x74, 0x89, 0x9e, 0x41, 0x43, 0x8b, 0xcc, 0x42, 0xea, 0x4d, + 0x89, 0xba, 0xec, 0x2a, 0xb8, 0xae, 0xe8, 0x43, 0x45, 0xe6, 0xc7, 0x5c, 0xb5, 0x8f, 0x84, 0xe7, + 0x53, 0x7d, 0x95, 0x17, 0x71, 0x4d, 0xd2, 0xb9, 0xe3, 0x6f, 0x22, 0xc2, 0xd0, 0xef, 0xc2, 0x4e, + 0x18, 0xcc, 0x19, 0x8f, 0x1f, 0x1e, 0x66, 0x89, 0xf8, 0x9a, 0x10, 0x47, 0x8a, 0x79, 0x48, 0x69, + 0xac, 0xa2, 0x2e, 0x6c, 0x47, 0xe0, 0x72, 0x3a, 0x16, 0xe1, 0xab, 0x2e, 0xec, 0xae, 0x24, 0x71, + 0x68, 0x27, 0x72, 0x05, 0x95, 0x75, 0xf5, 0x26, 0xd6, 0x9f, 0x5c, 0x39, 0x62, 0x41, 0x48, 0x2e, + 0xa8, 0xe3, 0x93, 0xa9, 0x8c, 0xd4, 0x12, 0xbf, 0x94, 0x05, 0x6d, 0x40, 0xa6, 0xd4, 0xde, 0x85, + 0xed, 0x63, 0x13, 0x99, 0xe9, 0x3d, 0xf9, 0x75, 0x11, 0x76, 0x32, 0x0c, 0xb5, 0x37, 0x0e, 0xd4, + 0xd3, 0x40, 0x4f, 0x6f, 0xd2, 0x5e, 0xfa, 0x34, 0x65, 0x15, 0xd3, 0xd4, 0xa8, 0xe7, 0xb3, 0xf0, + 0x6e, 0xbf, 0xd0, 0xb2, 0x70, 0x2d, 0x05, 0x0d, 0x23, 0xe4, 0xc3, 0x6e, 0x16, 0x49, 0xce, 0x39, + 0x50, 0xd6, 0xb5, 0xe7, 0xe7, 0xdf, 0x65, 0x9e, 0x7d, 0xa9, 0x2a, 0x66, 0xc3, 0xdb, 0x93, 0x1c, + 0x56, 0xbb, 0x03, 0xcd, 0x1c, 0xd3, 0x38, 0x02, 0xd6, 0xf5, 0x66, 0x15, 0xf3, 0x9f, 0x49, 0x87, + 0x45, 0x56, 0xd5, 0xf2, 0xe3, 0x8b, 0xc2, 0xe7, 0x56, 0x9b, 0xc2, 0x07, 0x4b, 0x67, 0xcd, 0x19, + 0x68, 0xcf, 0x1c, 0xa8, 0xb6, 0xf7, 0x61, 0xec, 0x50, 0x5a, 0x5f, 0x55, 0x8a, 0xf1, 0x34, 0x7c, + 0xb3, 0x06, 0xf4, 0x96, 0x09, 0x2c, 0xdc, 0xf7, 0xcf, 0x03, 0xbd, 0x59, 0x7f, 0x6d, 0xc1, 0x4e, + 0x86, 0xa1, 0x36, 0xeb, 0x61, 0xba, 0x69, 0x2f, 0xd1, 0xb1, 0xd9, 0xb2, 0x5f, 0xd2, 0xd7, 0x5a, + 0xcf, 0xed, 0x6b, 0xf1, 0x34, 0x26, 0xd2, 0x7c, 0x52, 0x3a, 0xaa, 0x7b, 0xa2, 0x26, 0xc8, 0x71, + 0xd1, 0x68, 0xbf, 0x86, 0x2d, 0x9e, 0x27, 0x31, 0xe1, 0xe7, 0x59, 0xa7, 0xb2, 0xc7, 0x50, 0x11, + 0x79, 0x76, 0x36, 0x1f, 0x5d, 0xd1, 0x3b, 0x9d, 0xcd, 0xca, 0x9c, 0x36, 0x94, 0x24, 0xfb, 0x18, + 0x90, 0xa9, 0xa7, 0xbc, 0x78, 0xad, 0x14, 0x43, 0x41, 0xd6, 0xe7, 0xad, 0x99, 0xca, 0xd1, 0x4a, + 0x45, 0x8c, 0x26, 0x7f, 0x47, 0x76, 0x03, 0x6a, 0x5f, 0x51, 0x66, 0xae, 0xd4, 0xaf, 0xd6, 0xa1, + 0x1e, 0x93, 0xd4, 0xe8, 0x46, 0x69, 0xa4, 0x9e, 0x3c, 0x74, 0x8d, 0xf8, 0x24, 0xee, 0x52, 0x46, + 0xc6, 0x23, 0x50, 0x15, 0xeb, 0xc7, 0xab, 0x48, 0x3c, 0x02, 0xf1, 0x55, 0x89, 0xc5, 0x64, 0xa7, + 0x45, 0x5d, 0xf5, 0xb1, 0x76, 0x47, 0x50, 0x39, 0x36, 0xc8, 0x08, 0x3a, 0x3a, 0x72, 0xe5, 0x35, + 0xbf, 0x93, 0x56, 0xe8, 0xa9, 0x38, 0xfe, 0x04, 0xb6, 0x12, 0xbd, 0xd0, 0xbd, 0xf4, 0xae, 0xe9, + 0x58, 0xf7, 0xe5, 0x62, 0x0d, 0x45, 0xe7, 0xab, 0x2c, 0x2e, 0x4e, 0x6d, 0xf2, 0xba, 0x44, 0x91, + 0x92, 0x26, 0x0d, 0xfe, 0x01, 0x54, 0x95, 0x88, 0x32, 0x57, 0x76, 0x1f, 0x94, 0x9e, 0x32, 0xf6, + 0x63, 0xa8, 0x6b, 0x21, 0x3d, 0xa5, 0x6c, 0x41, 0xd4, 0x94, 0x98, 0x9e, 0x90, 0x23, 0x97, 0x79, + 0x18, 0xf2, 0x54, 0x29, 0x80, 0x8e, 0x6e, 0x1c, 0x96, 0x14, 0x72, 0x91, 0x3c, 0x01, 0x73, 0xe2, + 0xb7, 0xc9, 0x86, 0xb8, 0xc2, 0x68, 0xe4, 0x78, 0xfe, 0x75, 0x30, 0xe1, 0x63, 0x83, 0x90, 0xae, + 0x2b, 0x7a, 0x5f, 0x91, 0x39, 0x92, 0x36, 0xb6, 0x5e, 0x5c, 0xfd, 0x4b, 0x76, 0x1e, 0x92, 0x9d, + 0x17, 0xed, 0x46, 0x7e, 0x9a, 0xd5, 0x25, 0x22, 0x1b, 0x10, 0x30, 0xd1, 0xb7, 0x44, 0x84, 0x3e, + 0x87, 0x56, 0x34, 0x1f, 0x45, 0x6e, 0xe8, 0x8d, 0xe8, 0xd8, 0x61, 0x81, 0x93, 0x3c, 0xd3, 0x0a, + 0x04, 0xb0, 0x89, 0x77, 0x13, 0xfe, 0x59, 0xd0, 0x89, 0xb9, 0xbc, 0x10, 0xe4, 0xe5, 0x03, 0x9f, + 0x2c, 0x92, 0x3d, 0xb6, 0x9a, 0x90, 0xaf, 0xf8, 0xf4, 0x86, 0x5b, 0x13, 0x9d, 0xf8, 0x93, 0x3b, + 0xd4, 0xe7, 0x05, 0x40, 0x78, 0x45, 0x99, 0xe3, 0xf9, 0xe7, 0x41, 0xab, 0x2e, 0x0e, 0xec, 0xd3, + 0xd8, 0xec, 0xcc, 0x11, 0x7c, 0xf1, 0x46, 0xc8, 0x72, 0x92, 0x4c, 0x54, 0x30, 0x8d, 0x09, 0x6d, + 0x0c, 0xf5, 0x0c, 0x3b, 0x27, 0xa3, 0x3c, 0x33, 0x33, 0x4a, 0xba, 0xb2, 0xd2, 0xaa, 0x66, 0x22, + 0x69, 0xc2, 0xd6, 0x29, 0x0b, 0x66, 0x07, 0x84, 0x4e, 0x93, 0x94, 0xbf, 0x0d, 0xc8, 0x24, 0xaa, + 0x3e, 0xdc, 0x3f, 0x59, 0xd0, 0x3c, 0x39, 0x3f, 0xa7, 0xe1, 0xa9, 0x04, 0x2a, 0x3a, 0x98, 0x0d, + 0xbc, 0xea, 0x92, 0x19, 0x71, 0x3d, 0x76, 0x67, 0xd4, 0xcf, 0x1a, 0xaf, 0x76, 0x15, 0x4b, 0xc1, + 0xd1, 0x45, 0xbc, 0x54, 0xc8, 0xc7, 0x4b, 0xdf, 0xa3, 0x9b, 0x60, 0x7f, 0x0c, 0xd5, 0x53, 0xb3, + 0xb1, 0x82, 0x76, 0x61, 0x5d, 0xf5, 0x5d, 0x64, 0x5c, 0xab, 0x2f, 0xfb, 0x33, 0x5e, 0xde, 0x5c, + 0x78, 0x11, 0x5b, 0x70, 0x6a, 0x99, 0xc6, 0x2b, 0xb8, 0xdf, 0xbb, 0x9d, 0x51, 0x97, 0x9d, 0xa6, + 0xd0, 0xda, 0xfb, 0xd4, 0x3e, 0x82, 0x0f, 0xf3, 0xd5, 0xe4, 0xda, 0x3e, 0xff, 0x5b, 0x0b, 0x2a, + 0x66, 0xb7, 0x1c, 0x35, 0xa0, 0x32, 0xec, 0x0d, 0x0e, 0xfa, 0x83, 0xaf, 0x9c, 0x93, 0x61, 0x6f, + 0xd0, 0x58, 0x41, 0x08, 0x6a, 0x9a, 0xf2, 0x76, 0x78, 0xd0, 0x39, 0xeb, 0x35, 0x2c, 0xb4, 0x09, + 0xab, 0x82, 0x5b, 0x40, 0x65, 0xd8, 0xe8, 0xfd, 0x7c, 0xd8, 0xc7, 0xbd, 0x83, 0x46, 0xd1, 0x14, + 0xed, 0x1e, 0x9f, 0x9c, 0xf6, 0x0e, 0x1a, 0xab, 0x08, 0x60, 0x5d, 0xfd, 0x5e, 0x43, 0x4d, 0xa8, + 0xe3, 0x5e, 0xf7, 0xe4, 0x5d, 0x0f, 0xff, 0xa9, 0x73, 0xd8, 0xe9, 0x1f, 0xf7, 0x0e, 0x1a, 0xeb, + 0x68, 0x0b, 0xaa, 0x5a, 0x69, 0xbf, 0x73, 0xd6, 0x3d, 0x6a, 0x6c, 0x3c, 0x1f, 0xaa, 0x52, 0x56, + 0x9a, 0x54, 0x86, 0x8d, 0x21, 0xee, 0x0d, 0x3b, 0xb8, 0xd7, 0x58, 0x41, 0x15, 0xd8, 0xec, 0x74, + 0xbb, 0xbd, 0xe1, 0x59, 0xef, 0xa0, 0x61, 0xf1, 0x2f, 0xdc, 0xfb, 0x59, 0xaf, 0xcb, 0xbf, 0x0a, + 0x7c, 0xaa, 0xd3, 0xfe, 0x57, 0x03, 0x61, 0x4a, 0x15, 0x4a, 0x87, 0xfd, 0x41, 0xe7, 0xb8, 0xff, + 0x0b, 0x6e, 0xc5, 0xf3, 0x7f, 0xb5, 0x60, 0x6b, 0xa1, 0xe6, 0xe4, 0x6e, 0x0c, 0x4e, 0x06, 0x7c, + 0xd8, 0x5d, 0x40, 0xa7, 0x3d, 0xfc, 0xae, 0x87, 0x9d, 0x37, 0xfd, 0xd3, 0xfd, 0xde, 0x51, 0xe7, + 0x5d, 0xff, 0x04, 0x37, 0x2c, 0xd4, 0x86, 0x5d, 0x61, 0x94, 0xf3, 0xae, 0x87, 0x4f, 0xfb, 0x27, + 0x03, 0xce, 0x7e, 0x23, 0xac, 0x2c, 0xa0, 0x07, 0xf0, 0xc1, 0xb0, 0x83, 0xcf, 0xfa, 0x9d, 0x63, + 0x47, 0x1a, 0xe1, 0x74, 0x4f, 0x8e, 0x8f, 0x3b, 0x67, 0x3d, 0xdc, 0x39, 0x6e, 0x14, 0xd1, 0x63, + 0x78, 0x90, 0x61, 0x1f, 0xbc, 0x1d, 0x1e, 0xf7, 0xbb, 0x9d, 0xb3, 0x9e, 0x33, 0xec, 0xf5, 0x70, + 0x63, 0x15, 0x3d, 0x83, 0x27, 0xd9, 0x11, 0x8e, 0x3a, 0x83, 0x41, 0xef, 0xd8, 0x39, 0x7c, 0x2b, + 0x57, 0x44, 0xad, 0xd2, 0xda, 0xde, 0x3f, 0xd7, 0x61, 0xfd, 0x4c, 0x74, 0x9c, 0xd1, 0x97, 0xb0, + 0xa1, 0xa2, 0x17, 0xdd, 0x5b, 0x8c, 0x67, 0x71, 0x1e, 0xda, 0xad, 0x65, 0x81, 0x8e, 0x7a, 0x00, + 0x49, 0x8c, 0xa1, 0xa4, 0x22, 0x5f, 0x88, 0xc6, 0xf6, 0xfd, 0x5c, 0x9e, 0x1a, 0xe6, 0x6b, 0xa8, + 0x98, 0xff, 0x77, 0x40, 0x09, 0x82, 0xc8, 0xf9, 0xb7, 0x45, 0xfb, 0xc1, 0x12, 0x6e, 0xfc, 0xbc, + 0x51, 0x36, 0xfe, 0x8f, 0x82, 0xee, 0x1b, 0xcf, 0x1a, 0xd9, 0x97, 0xd4, 0xf6, 0xc2, 0xe3, 0x1b, + 0x37, 0xc5, 0xfc, 0x27, 0x83, 0x61, 0x4a, 0xce, 0x1f, 0x23, 0x0c, 0x53, 0x72, 0xff, 0xfe, 0xf0, + 0x35, 0x54, 0xcc, 0x87, 0x6f, 0x63, 0xb0, 0x9c, 0x97, 0x7d, 0x63, 0xb0, 0xdc, 0xd7, 0xf2, 0x33, + 0xa8, 0x67, 0xde, 0x9e, 0x51, 0xf2, 0x32, 0x9f, 0xff, 0x4e, 0xde, 0x7e, 0xb4, 0x5c, 0x40, 0x8d, + 0xfa, 0x0d, 0xd4, 0xd2, 0xef, 0xbb, 0xe8, 0xa3, 0x04, 0xbe, 0xe5, 0xbd, 0x3e, 0xb7, 0x1f, 0x2e, + 0xe5, 0x27, 0x5e, 0x9b, 0x4f, 0x9f, 0x86, 0xd7, 0x39, 0xef, 0xbb, 0x86, 0xd7, 0xb9, 0xef, 0xa5, + 0xdf, 0x40, 0x2d, 0xfd, 0xf4, 0x68, 0xd8, 0x97, 0xfb, 0xf2, 0x69, 0xd8, 0x97, 0xff, 0x66, 0xc9, + 0x17, 0x32, 0xd3, 0xf4, 0x31, 0x16, 0x32, 0xbf, 0x51, 0x64, 0x2c, 0xe4, 0xb2, 0x7e, 0xd1, 0x11, + 0x94, 0x8d, 0xc7, 0x36, 0xe3, 0xd8, 0x2d, 0x3e, 0x03, 0xb6, 0x3f, 0xcc, 0x67, 0x26, 0x41, 0x95, + 0x3c, 0x69, 0x19, 0x41, 0xb5, 0xf0, 0x6e, 0x66, 0x04, 0x55, 0xce, 0x1b, 0xd8, 0x11, 0x94, 0x8d, + 0x87, 0x28, 0xc3, 0xa0, 0xc5, 0x57, 0x2d, 0xc3, 0xa0, 0x9c, 0xb7, 0x2b, 0x6e, 0x50, 0xd2, 0x6e, + 0x36, 0x0c, 0x5a, 0x68, 0xb3, 0x1b, 0x06, 0xe5, 0xf4, 0xa7, 0x7b, 0x00, 0x49, 0x1b, 0xcc, 0x18, + 0x66, 0xa1, 0x61, 0x66, 0x0c, 0x93, 0xd3, 0x37, 0x3b, 0x51, 0x7d, 0x80, 0xa4, 0xc2, 0x7a, 0xb0, + 0xac, 0x82, 0x92, 0xa3, 0x7d, 0xf4, 0xed, 0x05, 0x16, 0x1a, 0x40, 0x35, 0x55, 0x6d, 0x18, 0xe3, + 0xe5, 0x95, 0x27, 0xc6, 0x78, 0xf9, 0x45, 0xca, 0x00, 0xaa, 0x82, 0x78, 0xea, 0x93, 0x59, 0x74, + 0x19, 0x30, 0x63, 0xbc, 0x14, 0x7d, 0x71, 0xbc, 0x0c, 0x5b, 0x8d, 0xf7, 0x53, 0xa8, 0x7e, 0x45, + 0xd9, 0x71, 0x82, 0xf6, 0x92, 0xbf, 0xf2, 0xa4, 0x1a, 0x0f, 0xed, 0x7b, 0x0b, 0x74, 0x35, 0xc2, + 0x1f, 0xc0, 0xba, 0x6c, 0x9d, 0x18, 0xaa, 0xa9, 0xb6, 0x8c, 0xa1, 0x9a, 0xe9, 0xb1, 0x1c, 0x42, + 0x39, 0x01, 0xa5, 0xe6, 0x69, 0x5c, 0xa8, 0x87, 0x8c, 0x5d, 0xcb, 0xa9, 0x79, 0x78, 0x1c, 0x9b, + 0xde, 0x45, 0x68, 0x89, 0xdb, 0x51, 0x4e, 0x1c, 0x67, 0xf8, 0x6a, 0xc8, 0x03, 0xa8, 0x98, 0x48, + 0xce, 0xc8, 0x33, 0x39, 0x00, 0xaf, 0x9d, 0x78, 0x9e, 0x46, 0x55, 0x3f, 0xe3, 0xd9, 0x20, 0x85, + 0x9e, 0x52, 0xd9, 0x20, 0x0f, 0x57, 0x2d, 0x1d, 0xcb, 0x85, 0xed, 0x3c, 0x80, 0x84, 0x7e, 0x68, + 0xf4, 0x74, 0x97, 0xc2, 0xae, 0xf6, 0x93, 0xf7, 0x48, 0x49, 0xb7, 0xf7, 0x3f, 0xfe, 0xc5, 0x93, + 0x0b, 0x8f, 0x5d, 0xce, 0x47, 0x2f, 0xdc, 0x60, 0xfa, 0x72, 0xc2, 0x2b, 0x10, 0xdf, 0xf3, 0x2f, + 0x26, 0x64, 0x14, 0xbd, 0xe4, 0x03, 0xbc, 0x54, 0xa3, 0x8c, 0xd6, 0xc5, 0x1f, 0x34, 0x7f, 0xef, + 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x8e, 0xa8, 0x20, 0xd9, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4018,6 +4199,10 @@ type TraderClient interface { //CancelOrder cancels an active order with the auction server to remove it //from future matching. CancelOrder(ctx context.Context, in *CancelOrderRequest, opts ...grpc.CallOption) (*CancelOrderResponse, error) + // + //QuoteOrder calculates the premium, execution fees and max batch fee rate for + //an order based on the given order parameters. + QuoteOrder(ctx context.Context, in *QuoteOrderRequest, opts ...grpc.CallOption) (*QuoteOrderResponse, error) // pool: `auction fee` //AuctionFee returns the current auction order execution fee specified by the //auction server. @@ -4070,7 +4255,7 @@ type TraderClient interface { //the recipient's node information and channel funding multisig pubkey filled //in. The ticket returned by this call will have the state "registered". RegisterSidecar(ctx context.Context, in *RegisterSidecarRequest, opts ...grpc.CallOption) (*SidecarTicket, error) - // pool: `sidecar expect-channel` + // pool: `sidecar expectchannel` //ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the //provider (the trader submitting the bid order) and the recipient (the trader //receiving the sidecar channel). @@ -4215,6 +4400,15 @@ func (c *traderClient) CancelOrder(ctx context.Context, in *CancelOrderRequest, return out, nil } +func (c *traderClient) QuoteOrder(ctx context.Context, in *QuoteOrderRequest, opts ...grpc.CallOption) (*QuoteOrderResponse, error) { + out := new(QuoteOrderResponse) + err := c.cc.Invoke(ctx, "/poolrpc.Trader/QuoteOrder", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *traderClient) AuctionFee(ctx context.Context, in *AuctionFeeRequest, opts ...grpc.CallOption) (*AuctionFeeResponse, error) { out := new(AuctionFeeResponse) err := c.cc.Invoke(ctx, "/poolrpc.Trader/AuctionFee", in, out, opts...) @@ -4375,6 +4569,10 @@ type TraderServer interface { //CancelOrder cancels an active order with the auction server to remove it //from future matching. CancelOrder(context.Context, *CancelOrderRequest) (*CancelOrderResponse, error) + // + //QuoteOrder calculates the premium, execution fees and max batch fee rate for + //an order based on the given order parameters. + QuoteOrder(context.Context, *QuoteOrderRequest) (*QuoteOrderResponse, error) // pool: `auction fee` //AuctionFee returns the current auction order execution fee specified by the //auction server. @@ -4427,7 +4625,7 @@ type TraderServer interface { //the recipient's node information and channel funding multisig pubkey filled //in. The ticket returned by this call will have the state "registered". RegisterSidecar(context.Context, *RegisterSidecarRequest) (*SidecarTicket, error) - // pool: `sidecar expect-channel` + // pool: `sidecar expectchannel` //ExpectSidecarChannel is step 4/4 of the sidecar negotiation between the //provider (the trader submitting the bid order) and the recipient (the trader //receiving the sidecar channel). @@ -4484,6 +4682,9 @@ func (*UnimplementedTraderServer) ListOrders(ctx context.Context, req *ListOrder func (*UnimplementedTraderServer) CancelOrder(ctx context.Context, req *CancelOrderRequest) (*CancelOrderResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CancelOrder not implemented") } +func (*UnimplementedTraderServer) QuoteOrder(ctx context.Context, req *QuoteOrderRequest) (*QuoteOrderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QuoteOrder not implemented") +} func (*UnimplementedTraderServer) AuctionFee(ctx context.Context, req *AuctionFeeRequest) (*AuctionFeeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AuctionFee not implemented") } @@ -4774,6 +4975,24 @@ func _Trader_CancelOrder_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _Trader_QuoteOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuoteOrderRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TraderServer).QuoteOrder(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/poolrpc.Trader/QuoteOrder", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TraderServer).QuoteOrder(ctx, req.(*QuoteOrderRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Trader_AuctionFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AuctionFeeRequest) if err := dec(in); err != nil { @@ -5032,6 +5251,10 @@ var _Trader_serviceDesc = grpc.ServiceDesc{ MethodName: "CancelOrder", Handler: _Trader_CancelOrder_Handler, }, + { + MethodName: "QuoteOrder", + Handler: _Trader_QuoteOrder_Handler, + }, { MethodName: "AuctionFee", Handler: _Trader_AuctionFee_Handler, diff --git a/poolrpc/trader.proto b/poolrpc/trader.proto index 7860f65..d5d82e0 100644 --- a/poolrpc/trader.proto +++ b/poolrpc/trader.proto @@ -96,6 +96,12 @@ service Trader { */ rpc CancelOrder (CancelOrderRequest) returns (CancelOrderResponse); + /* + QuoteOrder calculates the premium, execution fees and max batch fee rate for + an order based on the given order parameters. + */ + rpc QuoteOrder (QuoteOrderRequest) returns (QuoteOrderResponse); + /* pool: `auction fee` AuctionFee returns the current auction order execution fee specified by the auction server. @@ -630,6 +636,66 @@ message Ask { uint32 version = 3; } +message QuoteOrderRequest { + /* + Order amount in satoshis. + */ + uint64 amt = 1; + + /* + Fixed order rate in parts per billion. + */ + uint32 rate_fixed = 2; + + /* + Required number of blocks that a channel opened as a result of this bid + should be kept open. + */ + uint32 lease_duration_blocks = 3; + + /* + Maximum fee rate the trader is willing to pay for the batch transaction, + expressed in satoshis per 1000 weight units (sat/KW). + */ + uint64 max_batch_fee_rate_sat_per_kw = 4; + + // The minimum number of order units that must be matched per order pair. + uint32 min_units_match = 5; +} +message QuoteOrderResponse { + /* + The total order premium in satoshis for filling the entire order. This + represents the interest amount paid to the maker by the taker excluding any + execution or chain fees. + */ + uint64 total_premium_sat = 1; + + /* + The fixed order rate expressed as a fraction instead of parts per billion. + */ + double rate_per_block = 2; + + /* + The fixed order rate expressed as a percentage instead of parts per billion. + */ + double rate_percent = 3; + + /* + The total execution fee in satoshis that needs to be paid to the auctioneer + for executing the entire order. + */ + uint64 total_execution_fee_sat = 4; + + /* + The worst case chain fees that need to be paid if fee rates spike up to the + max_batch_fee_rate_sat_per_kw value specified in the request. This value is + highly dependent on the min_units_match parameter as well since the + calculation assumes chain fees for the chain footprint of opening + amt/min_units_match channels (hence worst case calculation). + */ + uint64 worst_case_chain_fee_sat = 5; +} + message OrderEvent { /* The unix timestamp in nanoseconds the event was emitted at. This is the @@ -826,10 +892,10 @@ message Lease { // The tier of the node that this channel was bought/sold from. NodeTier channel_node_tier = 13; - + // The self channel balance that was pushed to the recipient. uint64 self_chan_balance = 14; - + // Whether the channel was leased as a sidecar channel (bid orders only). bool sidecar_channel = 15; } @@ -1058,7 +1124,7 @@ message OfferSidecarRequest { account. */ uint64 self_chan_balance = 2; - + /* The number of blocks the resulting leased channel should be open for. */ diff --git a/poolrpc/trader.swagger.json b/poolrpc/trader.swagger.json index 9e94003..4e98480 100644 --- a/poolrpc/trader.swagger.json +++ b/poolrpc/trader.swagger.json @@ -790,7 +790,7 @@ }, "/v1/pool/sidecar/expect": { "post": { - "summary": "pool: `sidecar expect-channel`\nExpectSidecarChannel is step 4/4 of the sidecar negotiation between the\nprovider (the trader submitting the bid order) and the recipient (the trader\nreceiving the sidecar channel).\nThis step must be run by the recipient once the provider has submitted the\nbid order for the sidecar channel. From this point onwards the Pool trader\ndaemon of both the provider as well as the recipient need to be online to\nreceive and react to match making events from the server.", + "summary": "pool: `sidecar expectchannel`\nExpectSidecarChannel is step 4/4 of the sidecar negotiation between the\nprovider (the trader submitting the bid order) and the recipient (the trader\nreceiving the sidecar channel).\nThis step must be run by the recipient once the provider has submitted the\nbid order for the sidecar channel. From this point onwards the Pool trader\ndaemon of both the provider as well as the recipient need to be online to\nreceive and react to match making events from the server.", "operationId": "ExpectSidecarChannel", "responses": { "200": { @@ -2000,6 +2000,36 @@ } } }, + "poolrpcQuoteOrderResponse": { + "type": "object", + "properties": { + "total_premium_sat": { + "type": "string", + "format": "uint64", + "description": "The total order premium in satoshis for filling the entire order. This\nrepresents the interest amount paid to the maker by the taker excluding any\nexecution or chain fees." + }, + "rate_per_block": { + "type": "number", + "format": "double", + "description": "The fixed order rate expressed as a fraction instead of parts per billion." + }, + "rate_percent": { + "type": "number", + "format": "double", + "description": "The fixed order rate expressed as a percentage instead of parts per billion." + }, + "total_execution_fee_sat": { + "type": "string", + "format": "uint64", + "description": "The total execution fee in satoshis that needs to be paid to the auctioneer\nfor executing the entire order." + }, + "worst_case_chain_fee_sat": { + "type": "string", + "format": "uint64", + "description": "The worst case chain fees that need to be paid if fee rates spike up to the\nmax_batch_fee_rate_sat_per_kw value specified in the request. This value is\nhighly dependent on the min_units_match parameter as well since the\ncalculation assumes chain fees for the chain footprint of opening\namt/min_units_match channels (hence worst case calculation)." + } + } + }, "poolrpcRecoverAccountsRequest": { "type": "object" }, diff --git a/rpcserver.go b/rpcserver.go index b897c41..8514f4d 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1421,6 +1421,39 @@ func (s *rpcServer) CancelOrder(ctx context.Context, return &poolrpc.CancelOrderResponse{}, nil } +// QuoteOrder calculates the premium, execution fees and max batch fee rate for +// an order based on the given order parameters. +func (s *rpcServer) QuoteOrder(ctx context.Context, + req *poolrpc.QuoteOrderRequest) (*poolrpc.QuoteOrderResponse, error) { + + auctionTerms, err := s.auctioneer.Terms(ctx) + if err != nil { + return nil, fmt.Errorf("unable to query auctioneer terms: %v", + err) + } + + feeSchedule := terms.NewLinearFeeSchedule( + auctionTerms.OrderExecBaseFee, + auctionTerms.OrderExecFeeRate, + ) + + q := order.NewQuote( + btcutil.Amount(req.Amt), + order.SupplyUnit(req.MinUnitsMatch).ToSatoshis(), + order.FixedRatePremium(req.RateFixed), req.LeaseDurationBlocks, + chainfee.SatPerKWeight(req.MaxBatchFeeRateSatPerKw), + feeSchedule, + ) + + return &poolrpc.QuoteOrderResponse{ + TotalPremiumSat: uint64(q.TotalPremium), + RatePerBlock: q.RatePerBlock, + RatePercent: q.RatePerBlock * 100, + TotalExecutionFeeSat: uint64(q.TotalExecutionFee), + WorstCaseChainFeeSat: uint64(q.WorstCaseChainFee), + }, nil +} + // sendRejectBatch sends a reject message to the server with the properly // decoded reason code and the full reason message as a string. func (s *rpcServer) sendRejectBatch(batch *order.Batch, failure error) error { @@ -1617,7 +1650,6 @@ func (s *rpcServer) AuctionFee(ctx context.Context, err) } - // TODO(roasbeef): accept the amt of order instead? return &poolrpc.AuctionFeeResponse{ ExecutionFee: &auctioneerrpc.ExecutionFee{ BaseFee: uint64(auctionTerms.OrderExecBaseFee),