From 0b66d56aabc65af1f22371687a0edd0840ae2896 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 14 Mar 2019 14:35:50 +0100 Subject: [PATCH 1/4] routerrpc: move UnmarshallRoute to sub server --- lnrpc/routerrpc/router_backend.go | 107 +++++++++++++++++++++++++++++ rpcserver.go | 110 +----------------------------- 2 files changed, 109 insertions(+), 108 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 714e7157..b635b9b2 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/btcsuite/btcutil" + "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing" @@ -218,3 +219,109 @@ func (r *RouterBackend) MarshallRoute(route *route.Route) *lnrpc.Route { return resp } + +// UnmarshallHopByChannelLookup unmarshalls an rpc hop for which the pub key is +// not known. This function will query the channel graph with channel id to +// retrieve both endpoints and determine the hop pubkey using the previous hop +// pubkey. If the channel is unknown, an error is returned. +func UnmarshallHopByChannelLookup(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, + prevPubKeyBytes [33]byte) (*route.Hop, error) { + + // Discard edge policies, because they may be nil. + edgeInfo, _, _, err := graph.FetchChannelEdgesByID(hop.ChanId) + if err != nil { + return nil, fmt.Errorf("unable to fetch channel edges by "+ + "channel ID %d: %v", hop.ChanId, err) + } + + var pubKeyBytes [33]byte + switch { + case prevPubKeyBytes == edgeInfo.NodeKey1Bytes: + pubKeyBytes = edgeInfo.NodeKey2Bytes + case prevPubKeyBytes == edgeInfo.NodeKey2Bytes: + pubKeyBytes = edgeInfo.NodeKey1Bytes + default: + return nil, fmt.Errorf("channel edge does not match expected node") + } + + return &route.Hop{ + OutgoingTimeLock: hop.Expiry, + AmtToForward: lnwire.MilliSatoshi(hop.AmtToForwardMsat), + PubKeyBytes: pubKeyBytes, + ChannelID: edgeInfo.ChannelID, + }, nil +} + +// UnmarshallKnownPubkeyHop unmarshalls an rpc hop that contains the hop pubkey. +// The channel graph doesn't need to be queried because all information required +// for sending the payment is present. +func UnmarshallKnownPubkeyHop(hop *lnrpc.Hop) (*route.Hop, error) { + pubKey, err := hex.DecodeString(hop.PubKey) + if err != nil { + return nil, fmt.Errorf("cannot decode pubkey %s", hop.PubKey) + } + + var pubKeyBytes [33]byte + copy(pubKeyBytes[:], pubKey) + + return &route.Hop{ + OutgoingTimeLock: hop.Expiry, + AmtToForward: lnwire.MilliSatoshi(hop.AmtToForwardMsat), + PubKeyBytes: pubKeyBytes, + ChannelID: hop.ChanId, + }, nil +} + +// UnmarshallHop unmarshalls an rpc hop that may or may not contain a node +// pubkey. +func UnmarshallHop(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, + prevNodePubKey [33]byte) (*route.Hop, error) { + + if hop.PubKey == "" { + // If no pub key is given of the hop, the local channel + // graph needs to be queried to complete the information + // necessary for routing. + return UnmarshallHopByChannelLookup(graph, hop, prevNodePubKey) + } + + return UnmarshallKnownPubkeyHop(hop) +} + +// UnmarshallRoute unmarshalls an rpc route. For hops that don't specify a +// pubkey, the channel graph is queried. +func UnmarshallRoute(rpcroute *lnrpc.Route, + graph *channeldb.ChannelGraph) (*route.Route, error) { + + sourceNode, err := graph.SourceNode() + if err != nil { + return nil, fmt.Errorf("unable to fetch source node from graph "+ + "while unmarshaling route. %v", err) + } + + prevNodePubKey := sourceNode.PubKeyBytes + + hops := make([]*route.Hop, len(rpcroute.Hops)) + for i, hop := range rpcroute.Hops { + routeHop, err := UnmarshallHop(graph, + hop, prevNodePubKey) + if err != nil { + return nil, err + } + + hops[i] = routeHop + + prevNodePubKey = routeHop.PubKeyBytes + } + + route, err := route.NewRouteFromHops( + lnwire.MilliSatoshi(rpcroute.TotalAmtMsat), + rpcroute.TotalTimeLock, + sourceNode.PubKeyBytes, + hops, + ) + if err != nil { + return nil, err + } + + return route, nil +} diff --git a/rpcserver.go b/rpcserver.go index a5c93c1e..7cc748e9 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -2865,14 +2865,14 @@ func unmarshallSendToRouteRequest(req *lnrpc.SendToRouteRequest, if len(req.Routes) > 0 { routes = make([]*route.Route, len(req.Routes)) for i, rpcroute := range req.Routes { - route, err := unmarshallRoute(rpcroute, graph) + route, err := routerrpc.UnmarshallRoute(rpcroute, graph) if err != nil { return nil, err } routes[i] = route } } else { - rt, err := unmarshallRoute(req.Route, graph) + rt, err := routerrpc.UnmarshallRoute(req.Route, graph) if err != nil { return nil, err } @@ -3883,112 +3883,6 @@ func (r *rpcServer) QueryRoutes(ctx context.Context, return r.routerBackend.QueryRoutes(ctx, in) } -// unmarshallHopByChannelLookup unmarshalls an rpc hop for which the pub key is -// not known. This function will query the channel graph with channel id to -// retrieve both endpoints and determine the hop pubkey using the previous hop -// pubkey. If the channel is unknown, an error is returned. -func unmarshallHopByChannelLookup(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, - prevPubKeyBytes [33]byte) (*route.Hop, error) { - - // Discard edge policies, because they may be nil. - edgeInfo, _, _, err := graph.FetchChannelEdgesByID(hop.ChanId) - if err != nil { - return nil, fmt.Errorf("unable to fetch channel edges by "+ - "channel ID %d: %v", hop.ChanId, err) - } - - var pubKeyBytes [33]byte - switch { - case prevPubKeyBytes == edgeInfo.NodeKey1Bytes: - pubKeyBytes = edgeInfo.NodeKey2Bytes - case prevPubKeyBytes == edgeInfo.NodeKey2Bytes: - pubKeyBytes = edgeInfo.NodeKey1Bytes - default: - return nil, fmt.Errorf("channel edge does not match expected node") - } - - return &route.Hop{ - OutgoingTimeLock: hop.Expiry, - AmtToForward: lnwire.MilliSatoshi(hop.AmtToForwardMsat), - PubKeyBytes: pubKeyBytes, - ChannelID: edgeInfo.ChannelID, - }, nil -} - -// unmarshallKnownPubkeyHop unmarshalls an rpc hop that contains the hop pubkey. -// The channel graph doesn't need to be queried because all information required -// for sending the payment is present. -func unmarshallKnownPubkeyHop(hop *lnrpc.Hop) (*route.Hop, error) { - pubKey, err := hex.DecodeString(hop.PubKey) - if err != nil { - return nil, fmt.Errorf("cannot decode pubkey %s", hop.PubKey) - } - - var pubKeyBytes [33]byte - copy(pubKeyBytes[:], pubKey) - - return &route.Hop{ - OutgoingTimeLock: hop.Expiry, - AmtToForward: lnwire.MilliSatoshi(hop.AmtToForwardMsat), - PubKeyBytes: pubKeyBytes, - ChannelID: hop.ChanId, - }, nil -} - -// unmarshallHop unmarshalls an rpc hop that may or may not contain a node -// pubkey. -func unmarshallHop(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, - prevNodePubKey [33]byte) (*route.Hop, error) { - - if hop.PubKey == "" { - // If no pub key is given of the hop, the local channel - // graph needs to be queried to complete the information - // necessary for routing. - return unmarshallHopByChannelLookup(graph, hop, prevNodePubKey) - } - - return unmarshallKnownPubkeyHop(hop) -} - -// unmarshallRoute unmarshalls an rpc route. For hops that don't specify a -// pubkey, the channel graph is queried. -func unmarshallRoute(rpcroute *lnrpc.Route, - graph *channeldb.ChannelGraph) (*route.Route, error) { - - sourceNode, err := graph.SourceNode() - if err != nil { - return nil, fmt.Errorf("unable to fetch source node from graph "+ - "while unmarshaling route. %v", err) - } - - prevNodePubKey := sourceNode.PubKeyBytes - - hops := make([]*route.Hop, len(rpcroute.Hops)) - for i, hop := range rpcroute.Hops { - routeHop, err := unmarshallHop(graph, - hop, prevNodePubKey) - if err != nil { - return nil, err - } - - hops[i] = routeHop - - prevNodePubKey = routeHop.PubKeyBytes - } - - route, err := route.NewRouteFromHops( - lnwire.MilliSatoshi(rpcroute.TotalAmtMsat), - rpcroute.TotalTimeLock, - sourceNode.PubKeyBytes, - hops, - ) - if err != nil { - return nil, err - } - - return route, nil -} - // GetNetworkInfo returns some basic stats about the known channel graph from // the PoV of the node. func (r *rpcServer) GetNetworkInfo(ctx context.Context, From ba3fa94268c50de7379fdd41e8d4f282347e6ff2 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Wed, 8 Aug 2018 11:09:30 +0200 Subject: [PATCH 2/4] lnrpc+routing: Only accept a single route for SendToRoute --- cmd/lncli/commands.go | 11 +- lnd_test.go | 10 +- lnrpc/rpc.pb.go | 1260 ++++++++++++++++++------------------ lnrpc/rpc.proto | 8 +- lnrpc/rpc.swagger.json | 7 - routing/missioncontrol.go | 12 +- routing/payment_session.go | 24 +- routing/router.go | 30 +- routing/router_test.go | 7 +- rpcserver.go | 60 +- 10 files changed, 693 insertions(+), 736 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index c4d3109a..07b0a6a1 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -2476,9 +2476,18 @@ func sendToRoute(ctx *cli.Context) error { "from incoming array of routes: %v", err) } + if len(routes.Routes) == 0 { + return fmt.Errorf("no routes provided") + } + + if len(routes.Routes) != 1 { + return fmt.Errorf("expected a single route, but got %v", + len(routes.Routes)) + } + req := &lnrpc.SendToRouteRequest{ PaymentHash: rHash, - Routes: routes.Routes, + Route: routes.Routes[0], } return sendToRouteRequest(ctx, req) diff --git a/lnd_test.go b/lnd_test.go index d526ec74..eab9bc04 100644 --- a/lnd_test.go +++ b/lnd_test.go @@ -1491,7 +1491,7 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) { } sendReq := &lnrpc.SendToRouteRequest{ PaymentHash: resp.RHash, - Routes: routes.Routes, + Route: routes.Routes[0], } err = alicePayStream.Send(sendReq) @@ -1529,7 +1529,7 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) { sendReq = &lnrpc.SendToRouteRequest{ PaymentHash: resp.RHash, - Routes: routes.Routes, + Route: routes.Routes[0], } err = alicePayStream.Send(sendReq) @@ -4308,7 +4308,7 @@ func testSingleHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) { for _, rHash := range rHashes { sendReq := &lnrpc.SendToRouteRequest{ PaymentHash: rHash, - Routes: routes.Routes, + Route: routes.Routes[0], } err := alicePayStream.Send(sendReq) @@ -4479,7 +4479,7 @@ func testMultiHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) { for _, rHash := range rHashes { sendReq := &lnrpc.SendToRouteRequest{ PaymentHash: rHash, - Routes: routes.Routes, + Route: routes.Routes[0], } err := alicePayStream.Send(sendReq) @@ -4634,7 +4634,7 @@ func testSendToRouteErrorPropagation(net *lntest.NetworkHarness, t *harnessTest) sendReq := &lnrpc.SendToRouteRequest{ PaymentHash: rHash, - Routes: fakeRoute.Routes, + Route: fakeRoute.Routes[0], } if err := alicePayStream.Send(sendReq); err != nil { diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 2223013a..5c7084cf 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -55,7 +55,7 @@ func (x AddressType) String() string { return proto.EnumName(AddressType_name, int32(x)) } func (AddressType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{0} } type ChannelCloseSummary_ClosureType int32 @@ -90,7 +90,7 @@ func (x ChannelCloseSummary_ClosureType) String() string { return proto.EnumName(ChannelCloseSummary_ClosureType_name, int32(x)) } func (ChannelCloseSummary_ClosureType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{41, 0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{41, 0} } type Peer_SyncType int32 @@ -122,7 +122,7 @@ func (x Peer_SyncType) String() string { return proto.EnumName(Peer_SyncType_name, int32(x)) } func (Peer_SyncType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{44, 0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{44, 0} } type ChannelEventUpdate_UpdateType int32 @@ -151,7 +151,7 @@ func (x ChannelEventUpdate_UpdateType) String() string { return proto.EnumName(ChannelEventUpdate_UpdateType_name, int32(x)) } func (ChannelEventUpdate_UpdateType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{62, 0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{62, 0} } type Invoice_InvoiceState int32 @@ -180,7 +180,7 @@ func (x Invoice_InvoiceState) String() string { return proto.EnumName(Invoice_InvoiceState_name, int32(x)) } func (Invoice_InvoiceState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{92, 0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{92, 0} } type GenSeedRequest struct { @@ -201,7 +201,7 @@ func (m *GenSeedRequest) Reset() { *m = GenSeedRequest{} } func (m *GenSeedRequest) String() string { return proto.CompactTextString(m) } func (*GenSeedRequest) ProtoMessage() {} func (*GenSeedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{0} } func (m *GenSeedRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GenSeedRequest.Unmarshal(m, b) @@ -256,7 +256,7 @@ func (m *GenSeedResponse) Reset() { *m = GenSeedResponse{} } func (m *GenSeedResponse) String() string { return proto.CompactTextString(m) } func (*GenSeedResponse) ProtoMessage() {} func (*GenSeedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{1} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{1} } func (m *GenSeedResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GenSeedResponse.Unmarshal(m, b) @@ -329,7 +329,7 @@ func (m *InitWalletRequest) Reset() { *m = InitWalletRequest{} } func (m *InitWalletRequest) String() string { return proto.CompactTextString(m) } func (*InitWalletRequest) ProtoMessage() {} func (*InitWalletRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{2} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{2} } func (m *InitWalletRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitWalletRequest.Unmarshal(m, b) @@ -394,7 +394,7 @@ func (m *InitWalletResponse) Reset() { *m = InitWalletResponse{} } func (m *InitWalletResponse) String() string { return proto.CompactTextString(m) } func (*InitWalletResponse) ProtoMessage() {} func (*InitWalletResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{3} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{3} } func (m *InitWalletResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitWalletResponse.Unmarshal(m, b) @@ -444,7 +444,7 @@ func (m *UnlockWalletRequest) Reset() { *m = UnlockWalletRequest{} } func (m *UnlockWalletRequest) String() string { return proto.CompactTextString(m) } func (*UnlockWalletRequest) ProtoMessage() {} func (*UnlockWalletRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{4} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{4} } func (m *UnlockWalletRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UnlockWalletRequest.Unmarshal(m, b) @@ -495,7 +495,7 @@ func (m *UnlockWalletResponse) Reset() { *m = UnlockWalletResponse{} } func (m *UnlockWalletResponse) String() string { return proto.CompactTextString(m) } func (*UnlockWalletResponse) ProtoMessage() {} func (*UnlockWalletResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{5} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{5} } func (m *UnlockWalletResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UnlockWalletResponse.Unmarshal(m, b) @@ -533,7 +533,7 @@ func (m *ChangePasswordRequest) Reset() { *m = ChangePasswordRequest{} } func (m *ChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*ChangePasswordRequest) ProtoMessage() {} func (*ChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{6} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{6} } func (m *ChangePasswordRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChangePasswordRequest.Unmarshal(m, b) @@ -577,7 +577,7 @@ func (m *ChangePasswordResponse) Reset() { *m = ChangePasswordResponse{} func (m *ChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*ChangePasswordResponse) ProtoMessage() {} func (*ChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{7} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{7} } func (m *ChangePasswordResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChangePasswordResponse.Unmarshal(m, b) @@ -619,7 +619,7 @@ func (m *Utxo) Reset() { *m = Utxo{} } func (m *Utxo) String() string { return proto.CompactTextString(m) } func (*Utxo) ProtoMessage() {} func (*Utxo) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{8} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{8} } func (m *Utxo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Utxo.Unmarshal(m, b) @@ -707,7 +707,7 @@ func (m *Transaction) Reset() { *m = Transaction{} } func (m *Transaction) String() string { return proto.CompactTextString(m) } func (*Transaction) ProtoMessage() {} func (*Transaction) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{9} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{9} } func (m *Transaction) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Transaction.Unmarshal(m, b) @@ -793,7 +793,7 @@ func (m *GetTransactionsRequest) Reset() { *m = GetTransactionsRequest{} func (m *GetTransactionsRequest) String() string { return proto.CompactTextString(m) } func (*GetTransactionsRequest) ProtoMessage() {} func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{10} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{10} } func (m *GetTransactionsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetTransactionsRequest.Unmarshal(m, b) @@ -825,7 +825,7 @@ func (m *TransactionDetails) Reset() { *m = TransactionDetails{} } func (m *TransactionDetails) String() string { return proto.CompactTextString(m) } func (*TransactionDetails) ProtoMessage() {} func (*TransactionDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{11} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{11} } func (m *TransactionDetails) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TransactionDetails.Unmarshal(m, b) @@ -866,7 +866,7 @@ func (m *FeeLimit) Reset() { *m = FeeLimit{} } func (m *FeeLimit) String() string { return proto.CompactTextString(m) } func (*FeeLimit) ProtoMessage() {} func (*FeeLimit) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{12} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{12} } func (m *FeeLimit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeeLimit.Unmarshal(m, b) @@ -1030,7 +1030,7 @@ func (m *SendRequest) Reset() { *m = SendRequest{} } func (m *SendRequest) String() string { return proto.CompactTextString(m) } func (*SendRequest) ProtoMessage() {} func (*SendRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{13} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{13} } func (m *SendRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendRequest.Unmarshal(m, b) @@ -1134,7 +1134,7 @@ func (m *SendResponse) Reset() { *m = SendResponse{} } func (m *SendResponse) String() string { return proto.CompactTextString(m) } func (*SendResponse) ProtoMessage() {} func (*SendResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{14} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{14} } func (m *SendResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendResponse.Unmarshal(m, b) @@ -1187,12 +1187,6 @@ type SendToRouteRequest struct { PaymentHash []byte `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"` // / An optional hex-encoded payment hash to be used for the HTLC. PaymentHashString string `protobuf:"bytes,2,opt,name=payment_hash_string,json=paymentHashString,proto3" json:"payment_hash_string,omitempty"` - // * - // Deprecated. The set of routes that should be used to attempt to complete the - // payment. The possibility to pass in multiple routes is deprecated and - // instead the single route field below should be used in combination with the - // streaming variant of SendToRoute. - Routes []*Route `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes,omitempty"` // Deprecated: Do not use. // / Route that should be used to attempt to complete the payment. Route *Route `protobuf:"bytes,4,opt,name=route,proto3" json:"route,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1204,7 +1198,7 @@ func (m *SendToRouteRequest) Reset() { *m = SendToRouteRequest{} } func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) } func (*SendToRouteRequest) ProtoMessage() {} func (*SendToRouteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{15} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{15} } func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendToRouteRequest.Unmarshal(m, b) @@ -1238,14 +1232,6 @@ func (m *SendToRouteRequest) GetPaymentHashString() string { return "" } -// Deprecated: Do not use. -func (m *SendToRouteRequest) GetRoutes() []*Route { - if m != nil { - return m.Routes - } - return nil -} - func (m *SendToRouteRequest) GetRoute() *Route { if m != nil { return m.Route @@ -1269,7 +1255,7 @@ func (m *ChannelPoint) Reset() { *m = ChannelPoint{} } func (m *ChannelPoint) String() string { return proto.CompactTextString(m) } func (*ChannelPoint) ProtoMessage() {} func (*ChannelPoint) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{16} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{16} } func (m *ChannelPoint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelPoint.Unmarshal(m, b) @@ -1415,7 +1401,7 @@ func (m *OutPoint) Reset() { *m = OutPoint{} } func (m *OutPoint) String() string { return proto.CompactTextString(m) } func (*OutPoint) ProtoMessage() {} func (*OutPoint) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{17} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{17} } func (m *OutPoint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OutPoint.Unmarshal(m, b) @@ -1470,7 +1456,7 @@ func (m *LightningAddress) Reset() { *m = LightningAddress{} } func (m *LightningAddress) String() string { return proto.CompactTextString(m) } func (*LightningAddress) ProtoMessage() {} func (*LightningAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{18} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{18} } func (m *LightningAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LightningAddress.Unmarshal(m, b) @@ -1518,7 +1504,7 @@ func (m *EstimateFeeRequest) Reset() { *m = EstimateFeeRequest{} } func (m *EstimateFeeRequest) String() string { return proto.CompactTextString(m) } func (*EstimateFeeRequest) ProtoMessage() {} func (*EstimateFeeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{19} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{19} } func (m *EstimateFeeRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EstimateFeeRequest.Unmarshal(m, b) @@ -1566,7 +1552,7 @@ func (m *EstimateFeeResponse) Reset() { *m = EstimateFeeResponse{} } func (m *EstimateFeeResponse) String() string { return proto.CompactTextString(m) } func (*EstimateFeeResponse) ProtoMessage() {} func (*EstimateFeeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{20} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{20} } func (m *EstimateFeeResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EstimateFeeResponse.Unmarshal(m, b) @@ -1616,7 +1602,7 @@ func (m *SendManyRequest) Reset() { *m = SendManyRequest{} } func (m *SendManyRequest) String() string { return proto.CompactTextString(m) } func (*SendManyRequest) ProtoMessage() {} func (*SendManyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{21} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{21} } func (m *SendManyRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendManyRequest.Unmarshal(m, b) @@ -1669,7 +1655,7 @@ func (m *SendManyResponse) Reset() { *m = SendManyResponse{} } func (m *SendManyResponse) String() string { return proto.CompactTextString(m) } func (*SendManyResponse) ProtoMessage() {} func (*SendManyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{22} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{22} } func (m *SendManyResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendManyResponse.Unmarshal(m, b) @@ -1719,7 +1705,7 @@ func (m *SendCoinsRequest) Reset() { *m = SendCoinsRequest{} } func (m *SendCoinsRequest) String() string { return proto.CompactTextString(m) } func (*SendCoinsRequest) ProtoMessage() {} func (*SendCoinsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{23} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{23} } func (m *SendCoinsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendCoinsRequest.Unmarshal(m, b) @@ -1786,7 +1772,7 @@ func (m *SendCoinsResponse) Reset() { *m = SendCoinsResponse{} } func (m *SendCoinsResponse) String() string { return proto.CompactTextString(m) } func (*SendCoinsResponse) ProtoMessage() {} func (*SendCoinsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{24} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{24} } func (m *SendCoinsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendCoinsResponse.Unmarshal(m, b) @@ -1827,7 +1813,7 @@ func (m *ListUnspentRequest) Reset() { *m = ListUnspentRequest{} } func (m *ListUnspentRequest) String() string { return proto.CompactTextString(m) } func (*ListUnspentRequest) ProtoMessage() {} func (*ListUnspentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{25} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{25} } func (m *ListUnspentRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListUnspentRequest.Unmarshal(m, b) @@ -1873,7 +1859,7 @@ func (m *ListUnspentResponse) Reset() { *m = ListUnspentResponse{} } func (m *ListUnspentResponse) String() string { return proto.CompactTextString(m) } func (*ListUnspentResponse) ProtoMessage() {} func (*ListUnspentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{26} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{26} } func (m *ListUnspentResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListUnspentResponse.Unmarshal(m, b) @@ -1912,7 +1898,7 @@ func (m *NewAddressRequest) Reset() { *m = NewAddressRequest{} } func (m *NewAddressRequest) String() string { return proto.CompactTextString(m) } func (*NewAddressRequest) ProtoMessage() {} func (*NewAddressRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{27} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{27} } func (m *NewAddressRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NewAddressRequest.Unmarshal(m, b) @@ -1951,7 +1937,7 @@ func (m *NewAddressResponse) Reset() { *m = NewAddressResponse{} } func (m *NewAddressResponse) String() string { return proto.CompactTextString(m) } func (*NewAddressResponse) ProtoMessage() {} func (*NewAddressResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{28} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{28} } func (m *NewAddressResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NewAddressResponse.Unmarshal(m, b) @@ -1990,7 +1976,7 @@ func (m *SignMessageRequest) Reset() { *m = SignMessageRequest{} } func (m *SignMessageRequest) String() string { return proto.CompactTextString(m) } func (*SignMessageRequest) ProtoMessage() {} func (*SignMessageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{29} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{29} } func (m *SignMessageRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignMessageRequest.Unmarshal(m, b) @@ -2029,7 +2015,7 @@ func (m *SignMessageResponse) Reset() { *m = SignMessageResponse{} } func (m *SignMessageResponse) String() string { return proto.CompactTextString(m) } func (*SignMessageResponse) ProtoMessage() {} func (*SignMessageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{30} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{30} } func (m *SignMessageResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignMessageResponse.Unmarshal(m, b) @@ -2070,7 +2056,7 @@ func (m *VerifyMessageRequest) Reset() { *m = VerifyMessageRequest{} } func (m *VerifyMessageRequest) String() string { return proto.CompactTextString(m) } func (*VerifyMessageRequest) ProtoMessage() {} func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{31} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{31} } func (m *VerifyMessageRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyMessageRequest.Unmarshal(m, b) @@ -2118,7 +2104,7 @@ func (m *VerifyMessageResponse) Reset() { *m = VerifyMessageResponse{} } func (m *VerifyMessageResponse) String() string { return proto.CompactTextString(m) } func (*VerifyMessageResponse) ProtoMessage() {} func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{32} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{32} } func (m *VerifyMessageResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyMessageResponse.Unmarshal(m, b) @@ -2167,7 +2153,7 @@ func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} } func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) } func (*ConnectPeerRequest) ProtoMessage() {} func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{33} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{33} } func (m *ConnectPeerRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConnectPeerRequest.Unmarshal(m, b) @@ -2211,7 +2197,7 @@ func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} } func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) } func (*ConnectPeerResponse) ProtoMessage() {} func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{34} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{34} } func (m *ConnectPeerResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConnectPeerResponse.Unmarshal(m, b) @@ -2243,7 +2229,7 @@ func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} } func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) } func (*DisconnectPeerRequest) ProtoMessage() {} func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{35} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{35} } func (m *DisconnectPeerRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectPeerRequest.Unmarshal(m, b) @@ -2280,7 +2266,7 @@ func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{} func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) } func (*DisconnectPeerResponse) ProtoMessage() {} func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{36} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{36} } func (m *DisconnectPeerResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectPeerResponse.Unmarshal(m, b) @@ -2314,7 +2300,7 @@ func (m *HTLC) Reset() { *m = HTLC{} } func (m *HTLC) String() string { return proto.CompactTextString(m) } func (*HTLC) ProtoMessage() {} func (*HTLC) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{37} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{37} } func (m *HTLC) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HTLC.Unmarshal(m, b) @@ -2429,7 +2415,7 @@ func (m *Channel) Reset() { *m = Channel{} } func (m *Channel) String() string { return proto.CompactTextString(m) } func (*Channel) ProtoMessage() {} func (*Channel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{38} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{38} } func (m *Channel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Channel.Unmarshal(m, b) @@ -2596,7 +2582,7 @@ func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} } func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) } func (*ListChannelsRequest) ProtoMessage() {} func (*ListChannelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{39} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{39} } func (m *ListChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListChannelsRequest.Unmarshal(m, b) @@ -2656,7 +2642,7 @@ func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} } func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) } func (*ListChannelsResponse) ProtoMessage() {} func (*ListChannelsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{40} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{40} } func (m *ListChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListChannelsResponse.Unmarshal(m, b) @@ -2713,7 +2699,7 @@ func (m *ChannelCloseSummary) Reset() { *m = ChannelCloseSummary{} } func (m *ChannelCloseSummary) String() string { return proto.CompactTextString(m) } func (*ChannelCloseSummary) ProtoMessage() {} func (*ChannelCloseSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{41} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{41} } func (m *ChannelCloseSummary) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelCloseSummary.Unmarshal(m, b) @@ -2819,7 +2805,7 @@ func (m *ClosedChannelsRequest) Reset() { *m = ClosedChannelsRequest{} } func (m *ClosedChannelsRequest) String() string { return proto.CompactTextString(m) } func (*ClosedChannelsRequest) ProtoMessage() {} func (*ClosedChannelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{42} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{42} } func (m *ClosedChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelsRequest.Unmarshal(m, b) @@ -2892,7 +2878,7 @@ func (m *ClosedChannelsResponse) Reset() { *m = ClosedChannelsResponse{} func (m *ClosedChannelsResponse) String() string { return proto.CompactTextString(m) } func (*ClosedChannelsResponse) ProtoMessage() {} func (*ClosedChannelsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{43} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{43} } func (m *ClosedChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelsResponse.Unmarshal(m, b) @@ -2947,7 +2933,7 @@ func (m *Peer) Reset() { *m = Peer{} } func (m *Peer) String() string { return proto.CompactTextString(m) } func (*Peer) ProtoMessage() {} func (*Peer) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{44} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{44} } func (m *Peer) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Peer.Unmarshal(m, b) @@ -3040,7 +3026,7 @@ func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} } func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) } func (*ListPeersRequest) ProtoMessage() {} func (*ListPeersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{45} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{45} } func (m *ListPeersRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPeersRequest.Unmarshal(m, b) @@ -3072,7 +3058,7 @@ func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} } func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) } func (*ListPeersResponse) ProtoMessage() {} func (*ListPeersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{46} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{46} } func (m *ListPeersResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPeersResponse.Unmarshal(m, b) @@ -3109,7 +3095,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_rpc_c21d4a52f85dc337, []int{47} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{47} } func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetInfoRequest.Unmarshal(m, b) @@ -3169,7 +3155,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_rpc_c21d4a52f85dc337, []int{48} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{48} } func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetInfoResponse.Unmarshal(m, b) @@ -3302,7 +3288,7 @@ func (m *Chain) Reset() { *m = Chain{} } func (m *Chain) String() string { return proto.CompactTextString(m) } func (*Chain) ProtoMessage() {} func (*Chain) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{49} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{49} } func (m *Chain) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Chain.Unmarshal(m, b) @@ -3349,7 +3335,7 @@ func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} } func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) } func (*ConfirmationUpdate) ProtoMessage() {} func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{50} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{50} } func (m *ConfirmationUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConfirmationUpdate.Unmarshal(m, b) @@ -3401,7 +3387,7 @@ func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} } func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelOpenUpdate) ProtoMessage() {} func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{51} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{51} } func (m *ChannelOpenUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelOpenUpdate.Unmarshal(m, b) @@ -3440,7 +3426,7 @@ func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} } func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelCloseUpdate) ProtoMessage() {} func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{52} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{52} } func (m *ChannelCloseUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelCloseUpdate.Unmarshal(m, b) @@ -3495,7 +3481,7 @@ func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} } func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) } func (*CloseChannelRequest) ProtoMessage() {} func (*CloseChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{53} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{53} } func (m *CloseChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CloseChannelRequest.Unmarshal(m, b) @@ -3557,7 +3543,7 @@ func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} } func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) } func (*CloseStatusUpdate) ProtoMessage() {} func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{54} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{54} } func (m *CloseStatusUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CloseStatusUpdate.Unmarshal(m, b) @@ -3700,7 +3686,7 @@ func (m *PendingUpdate) Reset() { *m = PendingUpdate{} } func (m *PendingUpdate) String() string { return proto.CompactTextString(m) } func (*PendingUpdate) ProtoMessage() {} func (*PendingUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{55} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{55} } func (m *PendingUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingUpdate.Unmarshal(m, b) @@ -3766,7 +3752,7 @@ func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} } func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) } func (*OpenChannelRequest) ProtoMessage() {} func (*OpenChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{56} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{56} } func (m *OpenChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OpenChannelRequest.Unmarshal(m, b) @@ -3877,7 +3863,7 @@ func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} } func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) } func (*OpenStatusUpdate) ProtoMessage() {} func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{57} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{57} } func (m *OpenStatusUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OpenStatusUpdate.Unmarshal(m, b) @@ -4033,7 +4019,7 @@ func (m *PendingHTLC) Reset() { *m = PendingHTLC{} } func (m *PendingHTLC) String() string { return proto.CompactTextString(m) } func (*PendingHTLC) ProtoMessage() {} func (*PendingHTLC) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{58} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{58} } func (m *PendingHTLC) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingHTLC.Unmarshal(m, b) @@ -4105,7 +4091,7 @@ func (m *PendingChannelsRequest) Reset() { *m = PendingChannelsRequest{} func (m *PendingChannelsRequest) String() string { return proto.CompactTextString(m) } func (*PendingChannelsRequest) ProtoMessage() {} func (*PendingChannelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{59} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{59} } func (m *PendingChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsRequest.Unmarshal(m, b) @@ -4145,7 +4131,7 @@ func (m *PendingChannelsResponse) Reset() { *m = PendingChannelsResponse func (m *PendingChannelsResponse) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse) ProtoMessage() {} func (*PendingChannelsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60} } func (m *PendingChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse.Unmarshal(m, b) @@ -4217,7 +4203,7 @@ func (m *PendingChannelsResponse_PendingChannel) Reset() { func (m *PendingChannelsResponse_PendingChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse_PendingChannel) ProtoMessage() {} func (*PendingChannelsResponse_PendingChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 0} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60, 0} } func (m *PendingChannelsResponse_PendingChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_PendingChannel.Unmarshal(m, b) @@ -4304,7 +4290,7 @@ func (m *PendingChannelsResponse_PendingOpenChannel) String() string { } func (*PendingChannelsResponse_PendingOpenChannel) ProtoMessage() {} func (*PendingChannelsResponse_PendingOpenChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 1} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60, 1} } func (m *PendingChannelsResponse_PendingOpenChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_PendingOpenChannel.Unmarshal(m, b) @@ -4377,7 +4363,7 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) String() string { } func (*PendingChannelsResponse_WaitingCloseChannel) ProtoMessage() {} func (*PendingChannelsResponse_WaitingCloseChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 2} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60, 2} } func (m *PendingChannelsResponse_WaitingCloseChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_WaitingCloseChannel.Unmarshal(m, b) @@ -4425,7 +4411,7 @@ func (m *PendingChannelsResponse_ClosedChannel) Reset() { *m = PendingCh func (m *PendingChannelsResponse_ClosedChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse_ClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 3} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60, 3} } func (m *PendingChannelsResponse_ClosedChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_ClosedChannel.Unmarshal(m, b) @@ -4489,7 +4475,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string { } func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 4} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{60, 4} } func (m *PendingChannelsResponse_ForceClosedChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_ForceClosedChannel.Unmarshal(m, b) @@ -4568,7 +4554,7 @@ func (m *ChannelEventSubscription) Reset() { *m = ChannelEventSubscripti func (m *ChannelEventSubscription) String() string { return proto.CompactTextString(m) } func (*ChannelEventSubscription) ProtoMessage() {} func (*ChannelEventSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{61} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{61} } func (m *ChannelEventSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEventSubscription.Unmarshal(m, b) @@ -4605,7 +4591,7 @@ func (m *ChannelEventUpdate) Reset() { *m = ChannelEventUpdate{} } func (m *ChannelEventUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelEventUpdate) ProtoMessage() {} func (*ChannelEventUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{62} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{62} } func (m *ChannelEventUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEventUpdate.Unmarshal(m, b) @@ -4817,7 +4803,7 @@ func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} } func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) } func (*WalletBalanceRequest) ProtoMessage() {} func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{63} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{63} } func (m *WalletBalanceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WalletBalanceRequest.Unmarshal(m, b) @@ -4853,7 +4839,7 @@ func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} } func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) } func (*WalletBalanceResponse) ProtoMessage() {} func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{64} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{64} } func (m *WalletBalanceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WalletBalanceResponse.Unmarshal(m, b) @@ -4904,7 +4890,7 @@ func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} } func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceRequest) ProtoMessage() {} func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{65} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{65} } func (m *ChannelBalanceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBalanceRequest.Unmarshal(m, b) @@ -4938,7 +4924,7 @@ func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) } func (*ChannelBalanceResponse) ProtoMessage() {} func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{66} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{66} } func (m *ChannelBalanceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBalanceResponse.Unmarshal(m, b) @@ -5004,7 +4990,7 @@ func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} } func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) } func (*QueryRoutesRequest) ProtoMessage() {} func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{67} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{67} } func (m *QueryRoutesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryRoutesRequest.Unmarshal(m, b) @@ -5091,7 +5077,7 @@ func (m *EdgeLocator) Reset() { *m = EdgeLocator{} } func (m *EdgeLocator) String() string { return proto.CompactTextString(m) } func (*EdgeLocator) ProtoMessage() {} func (*EdgeLocator) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{68} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{68} } func (m *EdgeLocator) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EdgeLocator.Unmarshal(m, b) @@ -5136,7 +5122,7 @@ func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} } func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) } func (*QueryRoutesResponse) ProtoMessage() {} func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{69} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{69} } func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryRoutesResponse.Unmarshal(m, b) @@ -5188,7 +5174,7 @@ func (m *Hop) Reset() { *m = Hop{} } func (m *Hop) String() string { return proto.CompactTextString(m) } func (*Hop) ProtoMessage() {} func (*Hop) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{70} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{70} } func (m *Hop) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Hop.Unmarshal(m, b) @@ -5309,7 +5295,7 @@ func (m *Route) Reset() { *m = Route{} } func (m *Route) String() string { return proto.CompactTextString(m) } func (*Route) ProtoMessage() {} func (*Route) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{71} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{71} } func (m *Route) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Route.Unmarshal(m, b) @@ -5385,7 +5371,7 @@ func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} } func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) } func (*NodeInfoRequest) ProtoMessage() {} func (*NodeInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{72} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{72} } func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeInfoRequest.Unmarshal(m, b) @@ -5430,7 +5416,7 @@ func (m *NodeInfo) Reset() { *m = NodeInfo{} } func (m *NodeInfo) String() string { return proto.CompactTextString(m) } func (*NodeInfo) ProtoMessage() {} func (*NodeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{73} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{73} } func (m *NodeInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeInfo.Unmarshal(m, b) @@ -5491,7 +5477,7 @@ func (m *LightningNode) Reset() { *m = LightningNode{} } func (m *LightningNode) String() string { return proto.CompactTextString(m) } func (*LightningNode) ProtoMessage() {} func (*LightningNode) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{74} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{74} } func (m *LightningNode) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LightningNode.Unmarshal(m, b) @@ -5558,7 +5544,7 @@ func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (m *NodeAddress) String() string { return proto.CompactTextString(m) } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{75} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{75} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeAddress.Unmarshal(m, b) @@ -5608,7 +5594,7 @@ func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} } func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) } func (*RoutingPolicy) ProtoMessage() {} func (*RoutingPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{76} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{76} } func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RoutingPolicy.Unmarshal(m, b) @@ -5698,7 +5684,7 @@ func (m *ChannelEdge) Reset() { *m = ChannelEdge{} } func (m *ChannelEdge) String() string { return proto.CompactTextString(m) } func (*ChannelEdge) ProtoMessage() {} func (*ChannelEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{77} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{77} } func (m *ChannelEdge) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEdge.Unmarshal(m, b) @@ -5789,7 +5775,7 @@ func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} } func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) } func (*ChannelGraphRequest) ProtoMessage() {} func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{78} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{78} } func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelGraphRequest.Unmarshal(m, b) @@ -5831,7 +5817,7 @@ func (m *ChannelGraph) Reset() { *m = ChannelGraph{} } func (m *ChannelGraph) String() string { return proto.CompactTextString(m) } func (*ChannelGraph) ProtoMessage() {} func (*ChannelGraph) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{79} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{79} } func (m *ChannelGraph) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelGraph.Unmarshal(m, b) @@ -5880,7 +5866,7 @@ func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} } func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) } func (*ChanInfoRequest) ProtoMessage() {} func (*ChanInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{80} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{80} } func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanInfoRequest.Unmarshal(m, b) @@ -5917,7 +5903,7 @@ func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} } func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*NetworkInfoRequest) ProtoMessage() {} func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{81} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{81} } func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkInfoRequest.Unmarshal(m, b) @@ -5957,7 +5943,7 @@ func (m *NetworkInfo) Reset() { *m = NetworkInfo{} } func (m *NetworkInfo) String() string { return proto.CompactTextString(m) } func (*NetworkInfo) ProtoMessage() {} func (*NetworkInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{82} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{82} } func (m *NetworkInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkInfo.Unmarshal(m, b) @@ -6057,7 +6043,7 @@ func (m *StopRequest) Reset() { *m = StopRequest{} } func (m *StopRequest) String() string { return proto.CompactTextString(m) } func (*StopRequest) ProtoMessage() {} func (*StopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{83} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{83} } func (m *StopRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopRequest.Unmarshal(m, b) @@ -6087,7 +6073,7 @@ func (m *StopResponse) Reset() { *m = StopResponse{} } func (m *StopResponse) String() string { return proto.CompactTextString(m) } func (*StopResponse) ProtoMessage() {} func (*StopResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{84} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{84} } func (m *StopResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopResponse.Unmarshal(m, b) @@ -6117,7 +6103,7 @@ func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscrip func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) } func (*GraphTopologySubscription) ProtoMessage() {} func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{85} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{85} } func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GraphTopologySubscription.Unmarshal(m, b) @@ -6150,7 +6136,7 @@ func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} } func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) } func (*GraphTopologyUpdate) ProtoMessage() {} func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{86} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{86} } func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GraphTopologyUpdate.Unmarshal(m, b) @@ -6205,7 +6191,7 @@ func (m *NodeUpdate) Reset() { *m = NodeUpdate{} } func (m *NodeUpdate) String() string { return proto.CompactTextString(m) } func (*NodeUpdate) ProtoMessage() {} func (*NodeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{87} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{87} } func (m *NodeUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeUpdate.Unmarshal(m, b) @@ -6273,7 +6259,7 @@ func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} } func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelEdgeUpdate) ProtoMessage() {} func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{88} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{88} } func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEdgeUpdate.Unmarshal(m, b) @@ -6353,7 +6339,7 @@ func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} } func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) } func (*ClosedChannelUpdate) ProtoMessage() {} func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{89} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{89} } func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelUpdate.Unmarshal(m, b) @@ -6423,7 +6409,7 @@ func (m *HopHint) Reset() { *m = HopHint{} } func (m *HopHint) String() string { return proto.CompactTextString(m) } func (*HopHint) ProtoMessage() {} func (*HopHint) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{90} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{90} } func (m *HopHint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HopHint.Unmarshal(m, b) @@ -6492,7 +6478,7 @@ func (m *RouteHint) Reset() { *m = RouteHint{} } func (m *RouteHint) String() string { return proto.CompactTextString(m) } func (*RouteHint) ProtoMessage() {} func (*RouteHint) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{91} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{91} } func (m *RouteHint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteHint.Unmarshal(m, b) @@ -6607,7 +6593,7 @@ func (m *Invoice) Reset() { *m = Invoice{} } func (m *Invoice) String() string { return proto.CompactTextString(m) } func (*Invoice) ProtoMessage() {} func (*Invoice) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{92} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{92} } func (m *Invoice) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Invoice.Unmarshal(m, b) @@ -6799,7 +6785,7 @@ func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} } func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*AddInvoiceResponse) ProtoMessage() {} func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{93} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{93} } func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AddInvoiceResponse.Unmarshal(m, b) @@ -6856,7 +6842,7 @@ func (m *PaymentHash) Reset() { *m = PaymentHash{} } func (m *PaymentHash) String() string { return proto.CompactTextString(m) } func (*PaymentHash) ProtoMessage() {} func (*PaymentHash) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{94} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{94} } func (m *PaymentHash) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PaymentHash.Unmarshal(m, b) @@ -6912,7 +6898,7 @@ func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} } func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) } func (*ListInvoiceRequest) ProtoMessage() {} func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{95} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{95} } func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListInvoiceRequest.Unmarshal(m, b) @@ -6982,7 +6968,7 @@ func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} } func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) } func (*ListInvoiceResponse) ProtoMessage() {} func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{96} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{96} } func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListInvoiceResponse.Unmarshal(m, b) @@ -7045,7 +7031,7 @@ func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} } func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) } func (*InvoiceSubscription) ProtoMessage() {} func (*InvoiceSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{97} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{97} } func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InvoiceSubscription.Unmarshal(m, b) @@ -7105,7 +7091,7 @@ func (m *Payment) Reset() { *m = Payment{} } func (m *Payment) String() string { return proto.CompactTextString(m) } func (*Payment) ProtoMessage() {} func (*Payment) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{98} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{98} } func (m *Payment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Payment.Unmarshal(m, b) @@ -7192,7 +7178,7 @@ func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} } func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*ListPaymentsRequest) ProtoMessage() {} func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{99} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{99} } func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPaymentsRequest.Unmarshal(m, b) @@ -7224,7 +7210,7 @@ func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} } func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*ListPaymentsResponse) ProtoMessage() {} func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{100} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{100} } func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPaymentsResponse.Unmarshal(m, b) @@ -7261,7 +7247,7 @@ func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsReque func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsRequest) ProtoMessage() {} func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{101} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{101} } func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteAllPaymentsRequest.Unmarshal(m, b) @@ -7291,7 +7277,7 @@ func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResp func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) } func (*DeleteAllPaymentsResponse) ProtoMessage() {} func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{102} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{102} } func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteAllPaymentsResponse.Unmarshal(m, b) @@ -7322,7 +7308,7 @@ func (m *AbandonChannelRequest) Reset() { *m = AbandonChannelRequest{} } func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) } func (*AbandonChannelRequest) ProtoMessage() {} func (*AbandonChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{103} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{103} } func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AbandonChannelRequest.Unmarshal(m, b) @@ -7359,7 +7345,7 @@ func (m *AbandonChannelResponse) Reset() { *m = AbandonChannelResponse{} func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) } func (*AbandonChannelResponse) ProtoMessage() {} func (*AbandonChannelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{104} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{104} } func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AbandonChannelResponse.Unmarshal(m, b) @@ -7391,7 +7377,7 @@ func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} } func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) } func (*DebugLevelRequest) ProtoMessage() {} func (*DebugLevelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{105} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{105} } func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DebugLevelRequest.Unmarshal(m, b) @@ -7436,7 +7422,7 @@ func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} } func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) } func (*DebugLevelResponse) ProtoMessage() {} func (*DebugLevelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{106} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{106} } func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DebugLevelResponse.Unmarshal(m, b) @@ -7475,7 +7461,7 @@ func (m *PayReqString) Reset() { *m = PayReqString{} } func (m *PayReqString) String() string { return proto.CompactTextString(m) } func (*PayReqString) ProtoMessage() {} func (*PayReqString) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{107} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{107} } func (m *PayReqString) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PayReqString.Unmarshal(m, b) @@ -7522,7 +7508,7 @@ func (m *PayReq) Reset() { *m = PayReq{} } func (m *PayReq) String() string { return proto.CompactTextString(m) } func (*PayReq) ProtoMessage() {} func (*PayReq) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{108} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{108} } func (m *PayReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PayReq.Unmarshal(m, b) @@ -7622,7 +7608,7 @@ func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} } func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) } func (*FeeReportRequest) ProtoMessage() {} func (*FeeReportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{109} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{109} } func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeeReportRequest.Unmarshal(m, b) @@ -7660,7 +7646,7 @@ func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} } func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) } func (*ChannelFeeReport) ProtoMessage() {} func (*ChannelFeeReport) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{110} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{110} } func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelFeeReport.Unmarshal(m, b) @@ -7726,7 +7712,7 @@ func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} } func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) } func (*FeeReportResponse) ProtoMessage() {} func (*FeeReportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{111} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{111} } func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeeReportResponse.Unmarshal(m, b) @@ -7794,7 +7780,7 @@ func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} } func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateRequest) ProtoMessage() {} func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{112} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{112} } func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PolicyUpdateRequest.Unmarshal(m, b) @@ -7955,7 +7941,7 @@ func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} } func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateResponse) ProtoMessage() {} func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{113} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{113} } func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PolicyUpdateResponse.Unmarshal(m, b) @@ -7993,7 +7979,7 @@ func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryReque func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryRequest) ProtoMessage() {} func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{114} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{114} } func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingHistoryRequest.Unmarshal(m, b) @@ -8065,7 +8051,7 @@ func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} } func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) } func (*ForwardingEvent) ProtoMessage() {} func (*ForwardingEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{115} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{115} } func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingEvent.Unmarshal(m, b) @@ -8148,7 +8134,7 @@ func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResp func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryResponse) ProtoMessage() {} func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{116} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{116} } func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingHistoryResponse.Unmarshal(m, b) @@ -8194,7 +8180,7 @@ func (m *ExportChannelBackupRequest) Reset() { *m = ExportChannelBackupR func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) } func (*ExportChannelBackupRequest) ProtoMessage() {} func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{117} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{117} } func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExportChannelBackupRequest.Unmarshal(m, b) @@ -8239,7 +8225,7 @@ func (m *ChannelBackup) Reset() { *m = ChannelBackup{} } func (m *ChannelBackup) String() string { return proto.CompactTextString(m) } func (*ChannelBackup) ProtoMessage() {} func (*ChannelBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{118} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{118} } func (m *ChannelBackup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackup.Unmarshal(m, b) @@ -8291,7 +8277,7 @@ func (m *MultiChanBackup) Reset() { *m = MultiChanBackup{} } func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) } func (*MultiChanBackup) ProtoMessage() {} func (*MultiChanBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{119} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{119} } func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MultiChanBackup.Unmarshal(m, b) @@ -8335,7 +8321,7 @@ func (m *ChanBackupExportRequest) Reset() { *m = ChanBackupExportRequest func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) } func (*ChanBackupExportRequest) ProtoMessage() {} func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{120} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{120} } func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanBackupExportRequest.Unmarshal(m, b) @@ -8373,7 +8359,7 @@ func (m *ChanBackupSnapshot) Reset() { *m = ChanBackupSnapshot{} } func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) } func (*ChanBackupSnapshot) ProtoMessage() {} func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{121} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{121} } func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanBackupSnapshot.Unmarshal(m, b) @@ -8420,7 +8406,7 @@ func (m *ChannelBackups) Reset() { *m = ChannelBackups{} } func (m *ChannelBackups) String() string { return proto.CompactTextString(m) } func (*ChannelBackups) ProtoMessage() {} func (*ChannelBackups) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{122} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{122} } func (m *ChannelBackups) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackups.Unmarshal(m, b) @@ -8461,7 +8447,7 @@ func (m *RestoreChanBackupRequest) Reset() { *m = RestoreChanBackupReque func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) } func (*RestoreChanBackupRequest) ProtoMessage() {} func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{123} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{123} } func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreChanBackupRequest.Unmarshal(m, b) @@ -8598,7 +8584,7 @@ func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} } func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) } func (*RestoreBackupResponse) ProtoMessage() {} func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{124} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{124} } func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreBackupResponse.Unmarshal(m, b) @@ -8628,7 +8614,7 @@ func (m *ChannelBackupSubscription) Reset() { *m = ChannelBackupSubscrip func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) } func (*ChannelBackupSubscription) ProtoMessage() {} func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{125} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{125} } func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackupSubscription.Unmarshal(m, b) @@ -8658,7 +8644,7 @@ func (m *VerifyChanBackupResponse) Reset() { *m = VerifyChanBackupRespon func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) } func (*VerifyChanBackupResponse) ProtoMessage() {} func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_c21d4a52f85dc337, []int{126} + return fileDescriptor_rpc_ea34ec0435bf8f95, []int{126} } func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyChanBackupResponse.Unmarshal(m, b) @@ -11450,491 +11436,491 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ Metadata: "rpc.proto", } -func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_c21d4a52f85dc337) } +func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_ea34ec0435bf8f95) } -var fileDescriptor_rpc_c21d4a52f85dc337 = []byte{ - // 7726 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5b, 0x6c, 0x1c, 0xc9, - 0x75, 0x28, 0x7b, 0x1e, 0xe4, 0xcc, 0x99, 0x21, 0x39, 0x2c, 0xbe, 0x46, 0x23, 0xad, 0x96, 0xdb, - 0x96, 0x25, 0x9a, 0xbb, 0x57, 0xd4, 0xca, 0xf6, 0x5a, 0x5e, 0x5d, 0x5f, 0x5f, 0xbe, 0x24, 0x6a, - 0x97, 0x4b, 0xd1, 0x4d, 0xc9, 0xba, 0xbb, 0xf6, 0xc5, 0xb8, 0x39, 0x53, 0x1c, 0xf6, 0x6a, 0xa6, - 0x7b, 0xb6, 0xbb, 0x87, 0x14, 0xbd, 0x57, 0x17, 0x17, 0x17, 0x41, 0x12, 0x04, 0x09, 0x02, 0x27, - 0x48, 0x10, 0x07, 0x09, 0x82, 0xd8, 0x01, 0x12, 0x23, 0x5f, 0xf9, 0x70, 0x10, 0x20, 0xf1, 0x77, - 0x00, 0x03, 0x41, 0x10, 0xf8, 0x33, 0x40, 0x82, 0x20, 0xf9, 0x09, 0xf2, 0x11, 0x24, 0x40, 0x3e, - 0x03, 0x04, 0x75, 0xea, 0xd1, 0x55, 0xdd, 0x3d, 0xa2, 0xd6, 0x76, 0xf2, 0x35, 0x53, 0xa7, 0x4e, - 0xd7, 0xf3, 0xbc, 0xeb, 0x54, 0x41, 0x35, 0x1c, 0x76, 0x6e, 0x0e, 0xc3, 0x20, 0x0e, 0x48, 0xb9, - 0xef, 0x87, 0xc3, 0x4e, 0xeb, 0x4a, 0x2f, 0x08, 0x7a, 0x7d, 0xba, 0xee, 0x0e, 0xbd, 0x75, 0xd7, - 0xf7, 0x83, 0xd8, 0x8d, 0xbd, 0xc0, 0x8f, 0x38, 0x92, 0xfd, 0x0d, 0x98, 0xb9, 0x4f, 0xfd, 0x43, - 0x4a, 0xbb, 0x0e, 0xfd, 0x68, 0x44, 0xa3, 0x98, 0xbc, 0x0e, 0x73, 0x2e, 0xfd, 0x26, 0xa5, 0xdd, - 0xf6, 0xd0, 0x8d, 0xa2, 0xe1, 0x49, 0xe8, 0x46, 0xb4, 0x69, 0xad, 0x58, 0xab, 0x75, 0xa7, 0xc1, - 0x2b, 0x0e, 0x14, 0x9c, 0xbc, 0x06, 0xf5, 0x88, 0xa1, 0x52, 0x3f, 0x0e, 0x83, 0xe1, 0x79, 0xb3, - 0x80, 0x78, 0x35, 0x06, 0xdb, 0xe1, 0x20, 0xbb, 0x0f, 0xb3, 0xaa, 0x87, 0x68, 0x18, 0xf8, 0x11, - 0x25, 0xb7, 0x60, 0xa1, 0xe3, 0x0d, 0x4f, 0x68, 0xd8, 0xc6, 0x8f, 0x07, 0x3e, 0x1d, 0x04, 0xbe, - 0xd7, 0x69, 0x5a, 0x2b, 0xc5, 0xd5, 0xaa, 0x43, 0x78, 0x1d, 0xfb, 0xe2, 0x3d, 0x51, 0x43, 0x6e, - 0xc0, 0x2c, 0xf5, 0x39, 0x9c, 0x76, 0xf1, 0x2b, 0xd1, 0xd5, 0x4c, 0x02, 0x66, 0x1f, 0xd8, 0x3f, - 0x5f, 0x80, 0xb9, 0x07, 0xbe, 0x17, 0x3f, 0x71, 0xfb, 0x7d, 0x1a, 0xcb, 0x39, 0xdd, 0x80, 0xd9, - 0x33, 0x04, 0xe0, 0x9c, 0xce, 0x82, 0xb0, 0x2b, 0x66, 0x34, 0xc3, 0xc1, 0x07, 0x02, 0x3a, 0x76, - 0x64, 0x85, 0xb1, 0x23, 0xcb, 0x5d, 0xae, 0xe2, 0x98, 0xe5, 0xba, 0x01, 0xb3, 0x21, 0xed, 0x04, - 0xa7, 0x34, 0x3c, 0x6f, 0x9f, 0x79, 0x7e, 0x37, 0x38, 0x6b, 0x96, 0x56, 0xac, 0xd5, 0xb2, 0x33, - 0x23, 0xc1, 0x4f, 0x10, 0x4a, 0x36, 0x61, 0xb6, 0x73, 0xe2, 0xfa, 0x3e, 0xed, 0xb7, 0x8f, 0xdc, - 0xce, 0xd3, 0xd1, 0x30, 0x6a, 0x96, 0x57, 0xac, 0xd5, 0xda, 0xed, 0x4b, 0x37, 0x71, 0x57, 0x6f, - 0x6e, 0x9d, 0xb8, 0xfe, 0x26, 0xd6, 0x1c, 0xfa, 0xee, 0x30, 0x3a, 0x09, 0x62, 0x67, 0x46, 0x7c, - 0xc1, 0xc1, 0x91, 0xbd, 0x00, 0x44, 0x5f, 0x09, 0xbe, 0xf6, 0xf6, 0x1f, 0x5a, 0x30, 0xff, 0xd8, - 0xef, 0x07, 0x9d, 0xa7, 0x3f, 0xe6, 0x12, 0xe5, 0xcc, 0xa1, 0xf0, 0xb2, 0x73, 0x28, 0x7e, 0xd2, - 0x39, 0x2c, 0xc1, 0x82, 0x39, 0x58, 0x31, 0x0b, 0x0a, 0x8b, 0xec, 0xeb, 0x1e, 0x95, 0xc3, 0x92, - 0xd3, 0xf8, 0x0c, 0x34, 0x3a, 0xa3, 0x30, 0xa4, 0x7e, 0x66, 0x1e, 0xb3, 0x02, 0xae, 0x26, 0xf2, - 0x1a, 0xd4, 0x7d, 0x7a, 0x96, 0xa0, 0x09, 0xda, 0xf5, 0xe9, 0x99, 0x44, 0xb1, 0x9b, 0xb0, 0x94, - 0xee, 0x46, 0x0c, 0xe0, 0xef, 0x2c, 0x28, 0x3d, 0x8e, 0x9f, 0x05, 0xe4, 0x26, 0x94, 0xe2, 0xf3, - 0x21, 0xe7, 0x90, 0x99, 0xdb, 0x44, 0x4c, 0x6d, 0xa3, 0xdb, 0x0d, 0x69, 0x14, 0x3d, 0x3a, 0x1f, - 0x52, 0xa7, 0xee, 0xf2, 0x42, 0x9b, 0xe1, 0x91, 0x26, 0x4c, 0x89, 0x32, 0x76, 0x58, 0x75, 0x64, - 0x91, 0x5c, 0x05, 0x70, 0x07, 0xc1, 0xc8, 0x8f, 0xdb, 0x91, 0x1b, 0xe3, 0x52, 0x15, 0x1d, 0x0d, - 0x42, 0xae, 0x40, 0x75, 0xf8, 0xb4, 0x1d, 0x75, 0x42, 0x6f, 0x18, 0x23, 0xd9, 0x54, 0x9d, 0x04, - 0x40, 0x5e, 0x87, 0x4a, 0x30, 0x8a, 0x87, 0x81, 0xe7, 0xc7, 0x82, 0x54, 0x66, 0xc5, 0x58, 0x1e, - 0x8e, 0xe2, 0x03, 0x06, 0x76, 0x14, 0x02, 0xb9, 0x06, 0xd3, 0x9d, 0xc0, 0x3f, 0xf6, 0xc2, 0x01, - 0x17, 0x06, 0xcd, 0x49, 0xec, 0xcd, 0x04, 0xda, 0xdf, 0x2e, 0x40, 0xed, 0x51, 0xe8, 0xfa, 0x91, - 0xdb, 0x61, 0x00, 0x36, 0xf4, 0xf8, 0x59, 0xfb, 0xc4, 0x8d, 0x4e, 0x70, 0xb6, 0x55, 0x47, 0x16, - 0xc9, 0x12, 0x4c, 0xf2, 0x81, 0xe2, 0x9c, 0x8a, 0x8e, 0x28, 0x91, 0x37, 0x60, 0xce, 0x1f, 0x0d, - 0xda, 0x66, 0x5f, 0x45, 0xa4, 0x96, 0x6c, 0x05, 0x5b, 0x80, 0x23, 0xb6, 0xd7, 0xbc, 0x0b, 0x3e, - 0x43, 0x0d, 0x42, 0x6c, 0xa8, 0x8b, 0x12, 0xf5, 0x7a, 0x27, 0x7c, 0x9a, 0x65, 0xc7, 0x80, 0xb1, - 0x36, 0x62, 0x6f, 0x40, 0xdb, 0x51, 0xec, 0x0e, 0x86, 0x62, 0x5a, 0x1a, 0x04, 0xeb, 0x83, 0xd8, - 0xed, 0xb7, 0x8f, 0x29, 0x8d, 0x9a, 0x53, 0xa2, 0x5e, 0x41, 0xc8, 0x75, 0x98, 0xe9, 0xd2, 0x28, - 0x6e, 0x8b, 0x4d, 0xa1, 0x51, 0xb3, 0x82, 0xac, 0x9f, 0x82, 0x32, 0xca, 0xb8, 0x4f, 0x63, 0x6d, - 0x75, 0x22, 0x41, 0x81, 0xf6, 0x1e, 0x10, 0x0d, 0xbc, 0x4d, 0x63, 0xd7, 0xeb, 0x47, 0xe4, 0x2d, - 0xa8, 0xc7, 0x1a, 0x32, 0x8a, 0xba, 0x9a, 0x22, 0x17, 0xed, 0x03, 0xc7, 0xc0, 0xb3, 0xef, 0x43, - 0xe5, 0x1e, 0xa5, 0x7b, 0xde, 0xc0, 0x8b, 0xc9, 0x12, 0x94, 0x8f, 0xbd, 0x67, 0x94, 0x13, 0x74, - 0x71, 0x77, 0xc2, 0xe1, 0x45, 0xd2, 0x82, 0xa9, 0x21, 0x0d, 0x3b, 0x54, 0x2e, 0xff, 0xee, 0x84, - 0x23, 0x01, 0x9b, 0x53, 0x50, 0xee, 0xb3, 0x8f, 0xed, 0x7f, 0x29, 0x40, 0xed, 0x90, 0xfa, 0x8a, - 0x51, 0x08, 0x94, 0xd8, 0x94, 0x04, 0x73, 0xe0, 0x7f, 0xf2, 0x2a, 0xd4, 0x70, 0x9a, 0x51, 0x1c, - 0x7a, 0x7e, 0x4f, 0xd0, 0x27, 0x30, 0xd0, 0x21, 0x42, 0x48, 0x03, 0x8a, 0xee, 0x40, 0xd2, 0x26, - 0xfb, 0xcb, 0x98, 0x68, 0xe8, 0x9e, 0x0f, 0x18, 0xbf, 0xa9, 0x5d, 0xab, 0x3b, 0x35, 0x01, 0xdb, - 0x65, 0xdb, 0x76, 0x13, 0xe6, 0x75, 0x14, 0xd9, 0x7a, 0x19, 0x5b, 0x9f, 0xd3, 0x30, 0x45, 0x27, - 0x37, 0x60, 0x56, 0xe2, 0x87, 0x7c, 0xb0, 0xb8, 0x8f, 0x55, 0x67, 0x46, 0x80, 0xe5, 0x14, 0x56, - 0xa1, 0x71, 0xec, 0xf9, 0x6e, 0xbf, 0xdd, 0xe9, 0xc7, 0xa7, 0xed, 0x2e, 0xed, 0xc7, 0x2e, 0xee, - 0x68, 0xd9, 0x99, 0x41, 0xf8, 0x56, 0x3f, 0x3e, 0xdd, 0x66, 0x50, 0xf2, 0x06, 0x54, 0x8f, 0x29, - 0x6d, 0xe3, 0x4a, 0x34, 0x2b, 0x06, 0x77, 0xc8, 0xd5, 0x75, 0x2a, 0xc7, 0x72, 0x9d, 0x57, 0xa1, - 0x11, 0x8c, 0xe2, 0x5e, 0xe0, 0xf9, 0xbd, 0x36, 0x93, 0x47, 0x6d, 0xaf, 0xdb, 0xac, 0xae, 0x58, - 0xab, 0x25, 0x67, 0x46, 0xc2, 0x99, 0x54, 0x78, 0xd0, 0x25, 0xaf, 0x00, 0x60, 0xdf, 0xbc, 0x61, - 0x58, 0xb1, 0x56, 0xa7, 0x9d, 0x2a, 0x83, 0x60, 0x43, 0xf6, 0x9f, 0x58, 0x50, 0xe7, 0x6b, 0x2e, - 0x14, 0xdf, 0x35, 0x98, 0x96, 0x53, 0xa3, 0x61, 0x18, 0x84, 0x82, 0x8f, 0x4c, 0x20, 0x59, 0x83, - 0x86, 0x04, 0x0c, 0x43, 0xea, 0x0d, 0xdc, 0x1e, 0x15, 0xc2, 0x29, 0x03, 0x27, 0xb7, 0x93, 0x16, - 0xc3, 0x60, 0x14, 0x53, 0x21, 0x62, 0xeb, 0x62, 0x76, 0x0e, 0x83, 0x39, 0x26, 0x0a, 0xe3, 0xa3, - 0x9c, 0x3d, 0x33, 0x60, 0xf6, 0xf7, 0x2d, 0x20, 0x6c, 0xe8, 0x8f, 0x02, 0xde, 0x84, 0x58, 0xf2, - 0xf4, 0x76, 0x5b, 0x2f, 0xbd, 0xdd, 0x85, 0x71, 0xdb, 0xbd, 0x0a, 0x93, 0x38, 0x2c, 0x26, 0x18, - 0x8a, 0xe9, 0xa1, 0x6f, 0x16, 0x9a, 0x96, 0x23, 0xea, 0x89, 0x0d, 0x65, 0x3e, 0xc7, 0x52, 0xce, - 0x1c, 0x79, 0x95, 0xfd, 0x1d, 0x0b, 0xea, 0x5b, 0x5c, 0x87, 0xa0, 0xd0, 0x23, 0xb7, 0x80, 0x1c, - 0x8f, 0xfc, 0x2e, 0xdb, 0xcb, 0xf8, 0x99, 0xd7, 0x6d, 0x1f, 0x9d, 0xb3, 0xae, 0x70, 0xdc, 0xbb, - 0x13, 0x4e, 0x4e, 0x1d, 0x79, 0x03, 0x1a, 0x06, 0x34, 0x8a, 0x43, 0x3e, 0xfa, 0xdd, 0x09, 0x27, - 0x53, 0xc3, 0x16, 0x93, 0x89, 0xd5, 0x51, 0xdc, 0xf6, 0xfc, 0x2e, 0x7d, 0x86, 0xeb, 0x3f, 0xed, - 0x18, 0xb0, 0xcd, 0x19, 0xa8, 0xeb, 0xdf, 0xd9, 0x1f, 0x42, 0x45, 0x0a, 0x65, 0x14, 0x48, 0xa9, - 0x71, 0x39, 0x1a, 0x84, 0xb4, 0xa0, 0x62, 0x8e, 0xc2, 0xa9, 0x7c, 0x92, 0xbe, 0xed, 0xff, 0x01, - 0x8d, 0x3d, 0x26, 0x19, 0x7d, 0xcf, 0xef, 0x09, 0xad, 0xc4, 0xc4, 0xf5, 0x70, 0x74, 0xf4, 0x94, - 0x9e, 0x0b, 0xfa, 0x13, 0x25, 0x26, 0x13, 0x4e, 0x82, 0x28, 0x16, 0xfd, 0xe0, 0x7f, 0xfb, 0xcf, - 0x2d, 0x20, 0x3b, 0x51, 0xec, 0x0d, 0xdc, 0x98, 0xde, 0xa3, 0x8a, 0x10, 0x1e, 0x42, 0x9d, 0xb5, - 0xf6, 0x28, 0xd8, 0xe0, 0x72, 0x9f, 0xcb, 0xb3, 0xd7, 0xc5, 0x96, 0x64, 0x3f, 0xb8, 0xa9, 0x63, - 0x33, 0xd3, 0xf0, 0xdc, 0x31, 0x1a, 0x60, 0xb2, 0x27, 0x76, 0xc3, 0x1e, 0x8d, 0x51, 0x29, 0x08, - 0x93, 0x02, 0x38, 0x68, 0x2b, 0xf0, 0x8f, 0x5b, 0x5f, 0x86, 0xb9, 0x4c, 0x1b, 0x4c, 0x20, 0x25, - 0xd3, 0x60, 0x7f, 0xc9, 0x02, 0x94, 0x4f, 0xdd, 0xfe, 0x88, 0x0a, 0x4d, 0xc4, 0x0b, 0x6f, 0x17, - 0xee, 0x58, 0x76, 0x07, 0xe6, 0x8d, 0x71, 0x09, 0x9e, 0x6c, 0xc2, 0x14, 0x93, 0x0d, 0x4c, 0xe7, - 0xa2, 0x5c, 0x75, 0x64, 0x91, 0xdc, 0x86, 0x85, 0x63, 0x4a, 0x43, 0x37, 0xc6, 0x62, 0x7b, 0x48, - 0x43, 0xdc, 0x13, 0xd1, 0x72, 0x6e, 0x9d, 0xfd, 0xf7, 0x16, 0xcc, 0x32, 0xbe, 0x79, 0xcf, 0xf5, - 0xcf, 0xe5, 0x5a, 0xed, 0xe5, 0xae, 0xd5, 0xaa, 0x58, 0xab, 0x14, 0xf6, 0x27, 0x5d, 0xa8, 0x62, - 0x7a, 0xa1, 0xc8, 0x0a, 0xd4, 0x8d, 0xe1, 0x96, 0xb9, 0x92, 0x8b, 0xdc, 0xf8, 0x80, 0x86, 0x9b, - 0xe7, 0x31, 0xfd, 0xc9, 0x97, 0xf2, 0x3a, 0x34, 0x92, 0x61, 0x8b, 0x75, 0x24, 0x50, 0x62, 0x84, - 0x29, 0x1a, 0xc0, 0xff, 0xf6, 0x6f, 0x59, 0x1c, 0x71, 0x2b, 0xf0, 0x94, 0x82, 0x64, 0x88, 0x4c, - 0x8f, 0x4a, 0x44, 0xf6, 0x7f, 0xac, 0x01, 0xf1, 0x93, 0x4f, 0x96, 0x5c, 0x82, 0x4a, 0x44, 0xfd, - 0x6e, 0xdb, 0xed, 0xf7, 0x51, 0x8f, 0x54, 0x9c, 0x29, 0x56, 0xde, 0xe8, 0xf7, 0xed, 0x1b, 0x30, - 0xa7, 0x8d, 0xee, 0x05, 0xf3, 0xd8, 0x07, 0xb2, 0xe7, 0x45, 0xf1, 0x63, 0x3f, 0x1a, 0x6a, 0xfa, - 0xe7, 0x32, 0x54, 0x07, 0x9e, 0x8f, 0x23, 0xe3, 0x9c, 0x5b, 0x76, 0x2a, 0x03, 0xcf, 0x67, 0xe3, - 0x8a, 0xb0, 0xd2, 0x7d, 0x26, 0x2a, 0x0b, 0xa2, 0xd2, 0x7d, 0x86, 0x95, 0xf6, 0x1d, 0x98, 0x37, - 0xda, 0x13, 0x5d, 0xbf, 0x06, 0xe5, 0x51, 0xfc, 0x2c, 0x90, 0xd6, 0x41, 0x4d, 0x50, 0x08, 0xb3, - 0x33, 0x1d, 0x5e, 0x63, 0xdf, 0x85, 0xb9, 0x7d, 0x7a, 0x26, 0x18, 0x59, 0x0e, 0xe4, 0xfa, 0x85, - 0x36, 0x28, 0xd6, 0xdb, 0x37, 0x81, 0xe8, 0x1f, 0x27, 0x0c, 0x20, 0x2d, 0x52, 0xcb, 0xb0, 0x48, - 0xed, 0xeb, 0x40, 0x0e, 0xbd, 0x9e, 0xff, 0x1e, 0x8d, 0x22, 0xb7, 0xa7, 0x58, 0xbf, 0x01, 0xc5, - 0x41, 0xd4, 0x13, 0xa2, 0x8a, 0xfd, 0xb5, 0x3f, 0x0b, 0xf3, 0x06, 0x9e, 0x68, 0xf8, 0x0a, 0x54, - 0x23, 0xaf, 0xe7, 0xbb, 0xf1, 0x28, 0xa4, 0xa2, 0xe9, 0x04, 0x60, 0xdf, 0x83, 0x85, 0xaf, 0xd2, - 0xd0, 0x3b, 0x3e, 0xbf, 0xa8, 0x79, 0xb3, 0x9d, 0x42, 0xba, 0x9d, 0x1d, 0x58, 0x4c, 0xb5, 0x23, - 0xba, 0xe7, 0xe4, 0x2b, 0x76, 0xb2, 0xe2, 0xf0, 0x82, 0x26, 0xfb, 0x0a, 0xba, 0xec, 0xb3, 0x1f, - 0x03, 0xd9, 0x0a, 0x7c, 0x9f, 0x76, 0xe2, 0x03, 0x4a, 0xc3, 0xc4, 0x19, 0x4e, 0x68, 0xb5, 0x76, - 0x7b, 0x59, 0xac, 0x6c, 0x5a, 0xa0, 0x0a, 0x22, 0x26, 0x50, 0x1a, 0xd2, 0x70, 0x80, 0x0d, 0x57, - 0x1c, 0xfc, 0x6f, 0x2f, 0xc2, 0xbc, 0xd1, 0xac, 0x70, 0x1f, 0xde, 0x84, 0xc5, 0x6d, 0x2f, 0xea, - 0x64, 0x3b, 0x6c, 0xc2, 0xd4, 0x70, 0x74, 0xd4, 0x4e, 0x38, 0x51, 0x16, 0x99, 0xc5, 0x99, 0xfe, - 0x44, 0x34, 0xf6, 0xb3, 0x16, 0x94, 0x76, 0x1f, 0xed, 0x6d, 0x31, 0x5d, 0xe1, 0xf9, 0x9d, 0x60, - 0xc0, 0xf4, 0x2d, 0x9f, 0xb4, 0x2a, 0x8f, 0xe5, 0xb0, 0x2b, 0x50, 0x45, 0x35, 0xcd, 0x8c, 0x68, - 0xe1, 0xb7, 0x26, 0x00, 0x66, 0xc0, 0xd3, 0x67, 0x43, 0x2f, 0x44, 0x0b, 0x5d, 0xda, 0xdd, 0x25, - 0x54, 0x33, 0xd9, 0x0a, 0xfb, 0x87, 0x65, 0x98, 0x12, 0xca, 0x17, 0xfb, 0xeb, 0xc4, 0xde, 0x29, - 0x15, 0x23, 0x11, 0x25, 0x66, 0x02, 0x85, 0x74, 0x10, 0xc4, 0xb4, 0x6d, 0x6c, 0x83, 0x09, 0x44, - 0x07, 0x45, 0xf8, 0x8e, 0xdc, 0xa5, 0x29, 0x72, 0x2c, 0x03, 0xc8, 0x16, 0x4b, 0xda, 0x67, 0x25, - 0xb4, 0xcf, 0x64, 0x91, 0xad, 0x44, 0xc7, 0x1d, 0xba, 0x1d, 0x2f, 0x3e, 0x17, 0x22, 0x41, 0x95, - 0x59, 0xdb, 0xfd, 0xa0, 0xe3, 0x32, 0xaf, 0xb4, 0xef, 0xfa, 0x1d, 0x2a, 0x9d, 0x1f, 0x03, 0xc8, - 0x1c, 0x01, 0x31, 0x24, 0x89, 0xc6, 0x9d, 0x85, 0x14, 0x94, 0xe9, 0xef, 0x4e, 0x30, 0x18, 0x78, - 0x31, 0xf3, 0x1f, 0xd0, 0xb6, 0x2c, 0x3a, 0x1a, 0x84, 0xbb, 0x5a, 0x58, 0x3a, 0xe3, 0xab, 0x57, - 0x95, 0xae, 0x96, 0x06, 0x64, 0xad, 0x30, 0xad, 0xc3, 0xc4, 0xd8, 0xd3, 0x33, 0x34, 0x24, 0x8b, - 0x8e, 0x06, 0x61, 0xfb, 0x30, 0xf2, 0x23, 0x1a, 0xc7, 0x7d, 0xda, 0x55, 0x03, 0xaa, 0x21, 0x5a, - 0xb6, 0x82, 0xdc, 0x82, 0x79, 0xee, 0xd2, 0x44, 0x6e, 0x1c, 0x44, 0x27, 0x5e, 0xd4, 0x8e, 0x98, - 0x73, 0x50, 0x47, 0xfc, 0xbc, 0x2a, 0x72, 0x07, 0x96, 0x53, 0xe0, 0x90, 0x76, 0xa8, 0x77, 0x4a, - 0xbb, 0xcd, 0x69, 0xfc, 0x6a, 0x5c, 0x35, 0x59, 0x81, 0x1a, 0xf3, 0xe4, 0x46, 0xc3, 0xae, 0xcb, - 0x0c, 0x98, 0x19, 0xdc, 0x07, 0x1d, 0x44, 0xde, 0x84, 0xe9, 0x21, 0xe5, 0xd6, 0xcf, 0x49, 0xdc, - 0xef, 0x44, 0xcd, 0x59, 0x43, 0xba, 0x31, 0xca, 0x75, 0x4c, 0x0c, 0x46, 0x94, 0x9d, 0x08, 0x4d, - 0x7a, 0xf7, 0xbc, 0xd9, 0x10, 0x66, 0xb5, 0x04, 0x20, 0x8f, 0x84, 0xde, 0xa9, 0x1b, 0xd3, 0xe6, - 0x1c, 0x17, 0xe8, 0xa2, 0xc8, 0xbe, 0xf3, 0x7c, 0x2f, 0xf6, 0xdc, 0x38, 0x08, 0x9b, 0x04, 0xeb, - 0x12, 0x00, 0x5b, 0x44, 0xa4, 0x8f, 0x28, 0x76, 0xe3, 0x51, 0xd4, 0x3e, 0xee, 0xbb, 0xbd, 0xa8, - 0x39, 0xcf, 0xed, 0xd2, 0x4c, 0x85, 0xfd, 0x3b, 0x16, 0x17, 0xd2, 0x82, 0xa0, 0x95, 0xb0, 0x7d, - 0x15, 0x6a, 0x9c, 0x94, 0xdb, 0x81, 0xdf, 0x3f, 0x17, 0xd4, 0x0d, 0x1c, 0xf4, 0xd0, 0xef, 0x9f, - 0x93, 0x4f, 0xc1, 0xb4, 0xe7, 0xeb, 0x28, 0x5c, 0x1e, 0xd4, 0x25, 0x10, 0x91, 0x5e, 0x85, 0xda, - 0x70, 0x74, 0xd4, 0xf7, 0x3a, 0x1c, 0xa5, 0xc8, 0x5b, 0xe1, 0x20, 0x44, 0x60, 0x96, 0x36, 0x9f, - 0x15, 0xc7, 0x28, 0x21, 0x46, 0x4d, 0xc0, 0x18, 0x8a, 0xbd, 0x09, 0x0b, 0xe6, 0x00, 0x85, 0xe0, - 0x5b, 0x83, 0x8a, 0xe0, 0x93, 0xa8, 0x59, 0xc3, 0xb5, 0x9e, 0xd1, 0x22, 0x2e, 0x3e, 0xed, 0x3b, - 0xaa, 0xde, 0xfe, 0xe3, 0x12, 0xcc, 0x0b, 0xe8, 0x56, 0x3f, 0x88, 0xe8, 0xe1, 0x68, 0x30, 0x70, - 0xc3, 0x1c, 0x06, 0xb4, 0x2e, 0x60, 0xc0, 0x82, 0xc9, 0x80, 0x8c, 0x2d, 0x4e, 0x5c, 0xcf, 0xe7, - 0x6e, 0x02, 0xe7, 0x5e, 0x0d, 0x42, 0x56, 0x61, 0xb6, 0xd3, 0x0f, 0x22, 0x6e, 0x12, 0xeb, 0x0e, - 0x7f, 0x1a, 0x9c, 0x15, 0x18, 0xe5, 0x3c, 0x81, 0xa1, 0x33, 0xfc, 0x64, 0x8a, 0xe1, 0x6d, 0xa8, - 0xb3, 0x46, 0xa9, 0x94, 0x5f, 0x53, 0xdc, 0x4c, 0xd6, 0x61, 0x6c, 0x3c, 0x69, 0xf6, 0xe2, 0xbc, - 0x3c, 0x9b, 0xc7, 0x5c, 0xde, 0x80, 0xa2, 0x7c, 0xd4, 0xb0, 0xab, 0x82, 0xb9, 0xb2, 0x55, 0xe4, - 0x1e, 0xf3, 0x12, 0x59, 0x5f, 0xa8, 0xa4, 0x01, 0x95, 0xf4, 0x75, 0x73, 0x47, 0xf4, 0xb5, 0xbf, - 0xc9, 0x0a, 0xa3, 0x90, 0xa2, 0xe2, 0xd6, 0xbe, 0xb4, 0x7f, 0xc1, 0x82, 0x9a, 0x56, 0x47, 0x16, - 0x61, 0x6e, 0xeb, 0xe1, 0xc3, 0x83, 0x1d, 0x67, 0xe3, 0xd1, 0x83, 0xaf, 0xee, 0xb4, 0xb7, 0xf6, - 0x1e, 0x1e, 0xee, 0x34, 0x26, 0x18, 0x78, 0xef, 0xe1, 0xd6, 0xc6, 0x5e, 0xfb, 0xde, 0x43, 0x67, - 0x4b, 0x82, 0x2d, 0xb2, 0x04, 0xc4, 0xd9, 0x79, 0xef, 0xe1, 0xa3, 0x1d, 0x03, 0x5e, 0x20, 0x0d, - 0xa8, 0x6f, 0x3a, 0x3b, 0x1b, 0x5b, 0xbb, 0x02, 0x52, 0x24, 0x0b, 0xd0, 0xb8, 0xf7, 0x78, 0x7f, - 0xfb, 0xc1, 0xfe, 0xfd, 0xf6, 0xd6, 0xc6, 0xfe, 0xd6, 0xce, 0xde, 0xce, 0x76, 0xa3, 0x44, 0xa6, - 0xa1, 0xba, 0xb1, 0xb9, 0xb1, 0xbf, 0xfd, 0x70, 0x7f, 0x67, 0xbb, 0x51, 0xb6, 0xff, 0xc6, 0x82, - 0x45, 0x1c, 0x75, 0x37, 0xcd, 0x20, 0x2b, 0x50, 0xeb, 0x04, 0xc1, 0x90, 0x19, 0xc7, 0x89, 0xf8, - 0xd7, 0x41, 0x8c, 0xf8, 0xb9, 0xb0, 0x3d, 0x0e, 0xc2, 0x0e, 0x15, 0xfc, 0x01, 0x08, 0xba, 0xc7, - 0x20, 0x8c, 0xf8, 0xc5, 0xf6, 0x72, 0x0c, 0xce, 0x1e, 0x35, 0x0e, 0xe3, 0x28, 0x4b, 0x30, 0x79, - 0x14, 0x52, 0xb7, 0x73, 0x22, 0x38, 0x43, 0x94, 0xc8, 0x67, 0x12, 0xef, 0xad, 0xc3, 0x56, 0xbf, - 0x4f, 0xbb, 0x48, 0x31, 0x15, 0x67, 0x56, 0xc0, 0xb7, 0x04, 0x98, 0x49, 0x0b, 0xf7, 0xc8, 0xf5, - 0xbb, 0x81, 0x4f, 0xbb, 0xc2, 0x34, 0x4c, 0x00, 0xf6, 0x01, 0x2c, 0xa5, 0xe7, 0x27, 0xf8, 0xeb, - 0x2d, 0x8d, 0xbf, 0xb8, 0xa5, 0xd6, 0x1a, 0xbf, 0x9b, 0x1a, 0xaf, 0xfd, 0x6d, 0x01, 0x4a, 0x4c, - 0x71, 0x8f, 0x57, 0xf2, 0xba, 0x2d, 0x56, 0xcc, 0x44, 0x07, 0xd1, 0x21, 0xe4, 0xa2, 0x9c, 0xab, - 0x3b, 0x0d, 0x92, 0xd4, 0x87, 0xb4, 0x73, 0x8a, 0x33, 0x56, 0xf5, 0x0c, 0xc2, 0x18, 0x84, 0x19, - 0xca, 0xf8, 0xb5, 0x60, 0x10, 0x59, 0x96, 0x75, 0xf8, 0xe5, 0x54, 0x52, 0x87, 0xdf, 0x35, 0x61, - 0xca, 0xf3, 0x8f, 0x82, 0x91, 0xdf, 0x45, 0x86, 0xa8, 0x38, 0xb2, 0x88, 0xf1, 0x48, 0x64, 0x54, - 0x6f, 0x20, 0xc9, 0x3f, 0x01, 0x90, 0xdb, 0x50, 0x8d, 0xce, 0xfd, 0x8e, 0x4e, 0xf3, 0x0b, 0x62, - 0x95, 0xd8, 0x1a, 0xdc, 0x3c, 0x3c, 0xf7, 0x3b, 0x48, 0xe1, 0x09, 0x9a, 0xfd, 0x65, 0xa8, 0x48, - 0x30, 0x23, 0xcb, 0xc7, 0xfb, 0xef, 0xee, 0x3f, 0x7c, 0xb2, 0xdf, 0x3e, 0x7c, 0x7f, 0x7f, 0xab, - 0x31, 0x41, 0x66, 0xa1, 0xb6, 0xb1, 0x85, 0x94, 0x8e, 0x00, 0x8b, 0xa1, 0x1c, 0x6c, 0x1c, 0x1e, - 0x2a, 0x48, 0xc1, 0x26, 0xcc, 0xd9, 0x8d, 0xd0, 0x3a, 0x52, 0xf1, 0xb8, 0xb7, 0x60, 0x4e, 0x83, - 0x25, 0x96, 0xf6, 0x90, 0x01, 0x52, 0x96, 0x36, 0x9a, 0x55, 0xbc, 0xc6, 0x6e, 0xc0, 0xcc, 0x7d, - 0x1a, 0x3f, 0xf0, 0x8f, 0x03, 0xd9, 0xd2, 0xef, 0x97, 0x60, 0x56, 0x81, 0x44, 0x43, 0xab, 0x30, - 0xeb, 0x75, 0xa9, 0x1f, 0x7b, 0xf1, 0x79, 0xdb, 0xf0, 0xa9, 0xd3, 0x60, 0x66, 0x8e, 0xba, 0x7d, - 0xcf, 0x95, 0x61, 0x5f, 0x5e, 0x60, 0x3e, 0x26, 0xd3, 0x95, 0x52, 0xfd, 0x29, 0xba, 0xe2, 0xae, - 0x7c, 0x6e, 0x1d, 0x93, 0x40, 0x0c, 0x2e, 0x54, 0x8c, 0xfa, 0x84, 0x9b, 0x65, 0x79, 0x55, 0x6c, - 0xab, 0x78, 0x4b, 0x6c, 0xca, 0x65, 0xae, 0x4f, 0x15, 0x20, 0x13, 0x57, 0x9d, 0xe4, 0xf2, 0x31, - 0x1d, 0x57, 0xd5, 0x62, 0xb3, 0x95, 0x4c, 0x6c, 0x96, 0xc9, 0xcf, 0x73, 0xbf, 0x43, 0xbb, 0xed, - 0x38, 0x68, 0xa3, 0x9c, 0x47, 0x92, 0xa8, 0x38, 0x69, 0x30, 0xb9, 0x02, 0x53, 0x31, 0x8d, 0x62, - 0x9f, 0xf2, 0x80, 0x59, 0x05, 0x43, 0x3c, 0x12, 0xc4, 0x6c, 0xe8, 0x51, 0xe8, 0x45, 0xcd, 0x3a, - 0x46, 0x5d, 0xf1, 0x3f, 0xf9, 0x1c, 0x2c, 0x1e, 0xd1, 0x28, 0x6e, 0x9f, 0x50, 0xb7, 0x4b, 0x43, - 0x24, 0x2f, 0x1e, 0xde, 0xe5, 0xa6, 0x49, 0x7e, 0x25, 0x23, 0xdc, 0x53, 0x1a, 0x46, 0x5e, 0xe0, - 0xa3, 0x51, 0x52, 0x75, 0x64, 0x91, 0xb5, 0xc7, 0x26, 0xaf, 0x94, 0xb4, 0x5a, 0xc1, 0x59, 0x9c, - 0x78, 0x7e, 0x25, 0xb9, 0x06, 0x93, 0x38, 0x81, 0xa8, 0xd9, 0x30, 0xe2, 0x54, 0x5b, 0x0c, 0xe8, - 0x88, 0xba, 0x77, 0x4a, 0x95, 0x5a, 0xa3, 0x6e, 0x7f, 0x01, 0xca, 0x08, 0x66, 0x9b, 0xce, 0x17, - 0x83, 0x13, 0x05, 0x2f, 0xb0, 0xa1, 0xf9, 0x34, 0x3e, 0x0b, 0xc2, 0xa7, 0xf2, 0x0c, 0x40, 0x14, - 0xed, 0x6f, 0xa2, 0x17, 0xa2, 0x62, 0xe2, 0x8f, 0xd1, 0x84, 0x62, 0xbe, 0x24, 0x5f, 0xea, 0xe8, - 0xc4, 0x15, 0x8e, 0x51, 0x05, 0x01, 0x87, 0x27, 0x2e, 0x93, 0x95, 0xc6, 0xee, 0x71, 0x5f, 0xb3, - 0x86, 0xb0, 0x5d, 0xbe, 0x79, 0xd7, 0x60, 0x46, 0x46, 0xdb, 0xa3, 0x76, 0x9f, 0x1e, 0xc7, 0x32, - 0x52, 0xe4, 0x8f, 0x06, 0xe8, 0x90, 0xee, 0xd1, 0xe3, 0xd8, 0xde, 0x87, 0x39, 0x21, 0xbf, 0x1e, - 0x0e, 0xa9, 0xec, 0xfa, 0x8b, 0x79, 0x76, 0x40, 0xed, 0xf6, 0xbc, 0x29, 0xf0, 0xf8, 0xf9, 0x82, - 0x89, 0x69, 0x3b, 0x40, 0x74, 0x79, 0x28, 0x1a, 0x14, 0xca, 0x58, 0xc6, 0xc2, 0xc4, 0x74, 0x0c, - 0x18, 0x5b, 0x9f, 0x68, 0xd4, 0xe9, 0xc8, 0x33, 0x12, 0xe6, 0xb1, 0xf3, 0xa2, 0xfd, 0x07, 0x16, - 0xcc, 0x63, 0x6b, 0xd2, 0x92, 0x11, 0x3a, 0xe7, 0xce, 0x27, 0x18, 0x66, 0xbd, 0xa3, 0xc7, 0x07, - 0x17, 0xa0, 0xac, 0x6b, 0x21, 0x5e, 0xf8, 0xe4, 0x71, 0x87, 0x52, 0x3a, 0xee, 0x60, 0xff, 0x86, - 0x05, 0x73, 0x5c, 0x11, 0xa0, 0x55, 0x29, 0xa6, 0xff, 0xdf, 0x61, 0x9a, 0x6b, 0x74, 0xc1, 0xd5, - 0x62, 0xa0, 0x89, 0x68, 0x44, 0x28, 0x47, 0xde, 0x9d, 0x70, 0x4c, 0x64, 0x72, 0x17, 0xad, 0x2a, - 0xbf, 0x8d, 0xd0, 0x9c, 0xd3, 0x34, 0x73, 0xad, 0x77, 0x27, 0x1c, 0x0d, 0x7d, 0xb3, 0x02, 0x93, - 0xdc, 0x24, 0xb7, 0xef, 0xc3, 0xb4, 0xd1, 0x91, 0x11, 0xf3, 0xa8, 0xf3, 0x98, 0x47, 0x26, 0xb8, - 0x58, 0xc8, 0x09, 0x2e, 0xfe, 0x51, 0x11, 0x08, 0x23, 0x96, 0xd4, 0x6e, 0x30, 0x9f, 0x20, 0xe8, - 0x1a, 0x1e, 0x5e, 0xdd, 0xd1, 0x41, 0xe4, 0x26, 0x10, 0xad, 0x28, 0x63, 0xc4, 0x5c, 0xe5, 0xe5, - 0xd4, 0x30, 0x31, 0x29, 0x2c, 0x06, 0xa1, 0xdb, 0x85, 0x2f, 0xcb, 0x97, 0x3d, 0xb7, 0x8e, 0x69, - 0xb5, 0xe1, 0x28, 0x3a, 0xc1, 0xc8, 0x9e, 0xf0, 0x01, 0x65, 0x39, 0xbd, 0xbf, 0x93, 0x17, 0xee, - 0xef, 0x54, 0x26, 0xae, 0xa4, 0x79, 0x21, 0x15, 0xd3, 0x0b, 0xb9, 0x06, 0xd3, 0x03, 0x66, 0xe7, - 0xc6, 0xfd, 0x4e, 0x7b, 0xc0, 0x7a, 0x17, 0x2e, 0x9f, 0x01, 0x24, 0x6b, 0xd0, 0x10, 0x36, 0x4e, - 0xe2, 0xea, 0xf0, 0x13, 0x84, 0x0c, 0x9c, 0xc9, 0xef, 0x24, 0xd2, 0x54, 0xc3, 0xc1, 0x26, 0x00, - 0xe6, 0xd7, 0x44, 0x8c, 0x42, 0xda, 0x23, 0x5f, 0x1c, 0xa8, 0xd1, 0x2e, 0x3a, 0x7b, 0x15, 0x27, - 0x5b, 0x61, 0xff, 0x8a, 0x05, 0x0d, 0xb6, 0x67, 0x06, 0x59, 0xbe, 0x0d, 0xc8, 0x15, 0x2f, 0x49, - 0x95, 0x06, 0x2e, 0xb9, 0x03, 0x55, 0x2c, 0x07, 0x43, 0xea, 0x0b, 0x9a, 0x6c, 0x9a, 0x34, 0x99, - 0xc8, 0x93, 0xdd, 0x09, 0x27, 0x41, 0xd6, 0x28, 0xf2, 0x2f, 0x2d, 0xa8, 0x89, 0x5e, 0x7e, 0xec, - 0x48, 0x46, 0x4b, 0x3b, 0x01, 0xe5, 0x94, 0x94, 0x1c, 0x78, 0xae, 0xc2, 0xec, 0xc0, 0x8d, 0x47, - 0x21, 0xd3, 0xc7, 0x46, 0x14, 0x23, 0x0d, 0x66, 0xca, 0x15, 0x45, 0x67, 0xd4, 0x8e, 0xbd, 0x7e, - 0x5b, 0xd6, 0x8a, 0xb3, 0xc6, 0xbc, 0x2a, 0x26, 0x41, 0xa2, 0xd8, 0xed, 0x51, 0xa1, 0x37, 0x79, - 0xc1, 0x6e, 0xc2, 0x92, 0x98, 0x50, 0xca, 0x3e, 0xb6, 0x7f, 0x50, 0x87, 0xe5, 0x4c, 0x95, 0xca, - 0x8c, 0x10, 0xee, 0x79, 0xdf, 0x1b, 0x1c, 0x05, 0xca, 0xb9, 0xb0, 0x74, 0xcf, 0xdd, 0xa8, 0x22, - 0x3d, 0x58, 0x94, 0x06, 0x02, 0x5b, 0xd3, 0x44, 0x99, 0x15, 0x50, 0x4b, 0xbd, 0x69, 0x6e, 0x61, - 0xba, 0x43, 0x09, 0xd7, 0x99, 0x38, 0xbf, 0x3d, 0x72, 0x02, 0x4d, 0x65, 0x89, 0x08, 0x61, 0xad, - 0x59, 0x2b, 0xac, 0xaf, 0x37, 0x2e, 0xe8, 0xcb, 0x30, 0xa7, 0x9d, 0xb1, 0xad, 0x91, 0x73, 0xb8, - 0x2a, 0xeb, 0x50, 0x1a, 0x67, 0xfb, 0x2b, 0xbd, 0xd4, 0xdc, 0xd0, 0x51, 0x30, 0x3b, 0xbd, 0xa0, - 0x61, 0xf2, 0x21, 0x2c, 0x9d, 0xb9, 0x5e, 0x2c, 0x87, 0xa5, 0xd9, 0x06, 0x65, 0xec, 0xf2, 0xf6, - 0x05, 0x5d, 0x3e, 0xe1, 0x1f, 0x1b, 0x2a, 0x6a, 0x4c, 0x8b, 0xad, 0x1f, 0x5a, 0x30, 0x63, 0xb6, - 0xc3, 0xc8, 0x54, 0xf0, 0xbe, 0x94, 0x81, 0xd2, 0x9a, 0x4c, 0x81, 0xb3, 0xfe, 0x79, 0x21, 0xcf, - 0x3f, 0xd7, 0xbd, 0xe2, 0xe2, 0x45, 0x61, 0xb0, 0xd2, 0xcb, 0x85, 0xc1, 0xca, 0x79, 0x61, 0xb0, - 0xd6, 0xbf, 0x59, 0x40, 0xb2, 0xb4, 0x44, 0xee, 0xf3, 0x00, 0x81, 0x4f, 0xfb, 0x42, 0xa4, 0xfc, - 0xb7, 0x97, 0xa3, 0x47, 0xb9, 0x76, 0xf2, 0x6b, 0xc6, 0x18, 0x7a, 0xb2, 0x80, 0x6e, 0xec, 0x4c, - 0x3b, 0x79, 0x55, 0xa9, 0xc0, 0x5c, 0xe9, 0xe2, 0xc0, 0x5c, 0xf9, 0xe2, 0xc0, 0xdc, 0x64, 0x3a, - 0x30, 0xd7, 0xfa, 0x19, 0x0b, 0xe6, 0x73, 0x36, 0xfd, 0xa7, 0x37, 0x71, 0xb6, 0x4d, 0x86, 0x2c, - 0x28, 0x88, 0x6d, 0xd2, 0x81, 0xad, 0xff, 0x03, 0xd3, 0x06, 0xa1, 0xff, 0xf4, 0xfa, 0x4f, 0xdb, - 0x6b, 0x9c, 0xce, 0x0c, 0x58, 0xeb, 0x9f, 0x0a, 0x40, 0xb2, 0xcc, 0xf6, 0x5f, 0x3a, 0x86, 0xec, - 0x3a, 0x15, 0x73, 0xd6, 0xe9, 0x3f, 0x55, 0x0f, 0xbc, 0x01, 0x73, 0x22, 0x03, 0x4a, 0x0b, 0x0b, - 0x71, 0x8a, 0xc9, 0x56, 0x30, 0x8b, 0xd5, 0x8c, 0x8a, 0x56, 0x8c, 0x8c, 0x10, 0x4d, 0x19, 0xa6, - 0x82, 0xa3, 0x76, 0x0b, 0x9a, 0x62, 0x85, 0x76, 0x4e, 0xa9, 0x1f, 0x1f, 0x8e, 0x8e, 0x78, 0x0a, - 0x90, 0x17, 0xf8, 0xf6, 0xf7, 0x8b, 0xca, 0xe8, 0xc6, 0x4a, 0xa1, 0xde, 0x3f, 0x07, 0x75, 0x5d, - 0x98, 0x8b, 0xed, 0x48, 0x45, 0x05, 0x99, 0x62, 0xd7, 0xb1, 0xc8, 0x36, 0xcc, 0xa0, 0xc8, 0xea, - 0xaa, 0xef, 0x0a, 0xf8, 0xdd, 0x0b, 0xa2, 0x1d, 0xbb, 0x13, 0x4e, 0xea, 0x1b, 0xf2, 0x25, 0x98, - 0x31, 0x5d, 0x29, 0x61, 0x23, 0xe4, 0xd9, 0xe6, 0xec, 0x73, 0x13, 0x99, 0x6c, 0x40, 0x23, 0xed, - 0x8b, 0x89, 0xf3, 0xff, 0x31, 0x0d, 0x64, 0xd0, 0xc9, 0x1d, 0x71, 0x3c, 0x56, 0xc6, 0x28, 0xc4, - 0x35, 0xf3, 0x33, 0x6d, 0x99, 0x6e, 0xf2, 0x1f, 0xed, 0xc0, 0xec, 0xeb, 0x00, 0x09, 0x8c, 0x34, - 0xa0, 0xfe, 0xf0, 0x60, 0x67, 0xbf, 0xbd, 0xb5, 0xbb, 0xb1, 0xbf, 0xbf, 0xb3, 0xd7, 0x98, 0x20, - 0x04, 0x66, 0x30, 0x68, 0xb6, 0xad, 0x60, 0x16, 0x83, 0x89, 0x30, 0x85, 0x84, 0x15, 0xc8, 0x02, - 0x34, 0x1e, 0xec, 0xa7, 0xa0, 0xc5, 0xcd, 0xaa, 0xe2, 0x0f, 0x7b, 0x09, 0x16, 0x78, 0x86, 0xdb, - 0x26, 0x27, 0x0f, 0x69, 0x2b, 0xfc, 0xb6, 0x05, 0x8b, 0xa9, 0x8a, 0x24, 0x95, 0x84, 0x9b, 0x03, - 0xa6, 0x8d, 0x60, 0x02, 0x31, 0xe4, 0x2d, 0x2d, 0xbf, 0x94, 0x04, 0xc9, 0x56, 0x30, 0x9a, 0xd7, - 0x2c, 0xc5, 0x14, 0x27, 0xe5, 0x55, 0xd9, 0xcb, 0x3c, 0x0f, 0x0f, 0x33, 0xf6, 0x8c, 0x81, 0x1f, - 0xf3, 0xcc, 0x39, 0xbd, 0x22, 0x39, 0x6e, 0x34, 0x87, 0x2c, 0x8b, 0xcc, 0xc8, 0x37, 0x4c, 0x0f, - 0x73, 0xbc, 0xb9, 0x75, 0xf6, 0xef, 0x16, 0x80, 0x7c, 0x65, 0x44, 0xc3, 0x73, 0xcc, 0x02, 0x51, - 0x31, 0xc8, 0xe5, 0x74, 0x84, 0x6d, 0x72, 0x38, 0x3a, 0x7a, 0x97, 0x9e, 0xcb, 0x0c, 0xa6, 0x42, - 0x92, 0xc1, 0x94, 0x97, 0x45, 0x54, 0xba, 0x38, 0x8b, 0xa8, 0x7c, 0x51, 0x16, 0xd1, 0xa7, 0x60, - 0xda, 0xeb, 0xf9, 0x01, 0xe3, 0x79, 0xa6, 0xb5, 0xa3, 0xe6, 0xe4, 0x4a, 0x91, 0x79, 0xba, 0x02, - 0xb8, 0xcf, 0x60, 0xe4, 0x0b, 0x09, 0x12, 0xed, 0xf6, 0x30, 0x23, 0x4d, 0x97, 0x02, 0x3b, 0xdd, - 0x1e, 0xdd, 0x0b, 0x3a, 0x6e, 0x1c, 0x84, 0xea, 0x43, 0x06, 0x8b, 0x98, 0x4b, 0x1f, 0x05, 0x23, - 0x66, 0xc3, 0xc8, 0x79, 0xf2, 0x98, 0x4c, 0x9d, 0x43, 0x0f, 0x70, 0xb6, 0xef, 0x94, 0x2a, 0xc5, - 0x46, 0xc9, 0x7e, 0x1f, 0x6a, 0x5a, 0x43, 0x98, 0xb4, 0x24, 0xac, 0x04, 0xe1, 0xf2, 0x95, 0xb8, - 0x51, 0xee, 0xd3, 0xfe, 0x83, 0x2e, 0x79, 0x1d, 0xe6, 0xba, 0x5e, 0x48, 0x31, 0xff, 0xac, 0x1d, - 0xd2, 0x53, 0x1a, 0x46, 0xd2, 0x39, 0x6e, 0xa8, 0x0a, 0x87, 0xc3, 0xed, 0xbb, 0x30, 0x6f, 0xac, - 0xbe, 0x22, 0x4e, 0x99, 0xd3, 0x63, 0x65, 0x73, 0x7a, 0x64, 0x3e, 0x8f, 0xfd, 0x73, 0x05, 0x28, - 0xee, 0x06, 0x43, 0xfd, 0x14, 0xc1, 0x32, 0x4f, 0x11, 0x84, 0x95, 0xd3, 0x56, 0x46, 0x8c, 0x50, - 0x7e, 0x06, 0x90, 0xac, 0xc1, 0x8c, 0x3b, 0x88, 0xdb, 0x71, 0xc0, 0xac, 0xba, 0x33, 0x37, 0xec, - 0x72, 0x8a, 0xc5, 0xc0, 0x52, 0xaa, 0x86, 0x2c, 0x40, 0x51, 0x99, 0x03, 0x88, 0xc0, 0x8a, 0xcc, - 0xa5, 0xc0, 0xd3, 0xcc, 0x73, 0x11, 0x1c, 0x13, 0x25, 0xc6, 0x10, 0xe6, 0xf7, 0xdc, 0x9f, 0xe3, - 0x42, 0x3d, 0xaf, 0x8a, 0x59, 0x5c, 0x8c, 0x46, 0x10, 0x4d, 0x84, 0x52, 0x65, 0x59, 0x0f, 0xfb, - 0x56, 0xcc, 0xb3, 0xdd, 0x7f, 0xb4, 0xa0, 0x8c, 0x6b, 0xc3, 0x14, 0x14, 0xe7, 0x60, 0x75, 0x90, - 0x80, 0x6b, 0x32, 0xed, 0xa4, 0xc1, 0xc4, 0x36, 0x32, 0x19, 0x0b, 0x6a, 0x42, 0x7a, 0x36, 0xe3, - 0x0a, 0x54, 0x79, 0x49, 0x65, 0xed, 0x21, 0x4a, 0x02, 0x24, 0x57, 0xa1, 0x74, 0x12, 0x0c, 0xa5, - 0x45, 0x0d, 0xf2, 0x4c, 0x2e, 0x18, 0x3a, 0x08, 0x4f, 0xc6, 0xc3, 0xda, 0xe3, 0xd3, 0xe2, 0x76, - 0x52, 0x1a, 0xcc, 0x2c, 0x45, 0xd5, 0xac, 0xbe, 0x4c, 0x29, 0xa8, 0xbd, 0x06, 0xb3, 0x8c, 0xf6, - 0xb5, 0xc0, 0xea, 0x58, 0x6e, 0xb5, 0xff, 0x9f, 0x05, 0x15, 0x89, 0x4c, 0x56, 0xa1, 0xc4, 0x18, - 0x29, 0xe5, 0x9b, 0xaa, 0xb3, 0x78, 0x86, 0xe7, 0x20, 0x06, 0xb3, 0x17, 0x30, 0xde, 0x95, 0xb8, - 0x42, 0x32, 0xda, 0x95, 0x58, 0xfa, 0x6a, 0xb8, 0x29, 0x03, 0x39, 0x05, 0xb5, 0xbf, 0x67, 0xc1, - 0xb4, 0xd1, 0x07, 0x59, 0x81, 0x5a, 0xdf, 0x8d, 0x62, 0x71, 0xbe, 0x29, 0xb6, 0x47, 0x07, 0xe9, - 0x1b, 0x5d, 0x30, 0xe3, 0xfb, 0x2a, 0x08, 0x5c, 0xd4, 0x83, 0xc0, 0xb7, 0xa0, 0x9a, 0xe4, 0x9b, - 0x96, 0x0c, 0x09, 0xc0, 0x7a, 0x94, 0x59, 0x06, 0x09, 0x12, 0xc6, 0x15, 0x83, 0x7e, 0x10, 0x8a, - 0xc3, 0x30, 0x5e, 0xb0, 0xef, 0x42, 0x4d, 0xc3, 0xd7, 0xc3, 0x8c, 0x96, 0x11, 0x66, 0x54, 0x29, - 0x38, 0x85, 0x24, 0x05, 0xc7, 0xfe, 0x67, 0x0b, 0xa6, 0x19, 0x0d, 0x7a, 0x7e, 0xef, 0x20, 0xe8, - 0x7b, 0x9d, 0x73, 0xdc, 0x7b, 0x49, 0x6e, 0x42, 0x30, 0x4a, 0x5a, 0x34, 0xc1, 0x8c, 0xea, 0x65, - 0x70, 0x43, 0xb0, 0xa8, 0x2a, 0x33, 0x1e, 0x66, 0x1c, 0x70, 0xe4, 0x46, 0x82, 0x2d, 0x84, 0x61, - 0x66, 0x00, 0x19, 0xa7, 0x31, 0x00, 0x26, 0x54, 0x0d, 0xbc, 0x7e, 0xdf, 0xe3, 0xb8, 0xdc, 0x6c, - 0xcf, 0xab, 0x62, 0x7d, 0x76, 0xbd, 0xc8, 0x3d, 0x4a, 0x0e, 0x78, 0x54, 0x19, 0x23, 0x30, 0xee, - 0x33, 0x2d, 0x02, 0x33, 0x89, 0x72, 0xc5, 0x04, 0xda, 0x7f, 0x5a, 0x80, 0x9a, 0xb4, 0x02, 0xba, - 0x3d, 0x2a, 0xce, 0x2c, 0x4d, 0xc1, 0xa8, 0x41, 0x64, 0xbd, 0xe1, 0x70, 0x69, 0x90, 0x34, 0x61, - 0x14, 0xb3, 0x84, 0x71, 0x05, 0xaa, 0x8c, 0x40, 0xdf, 0x44, 0xcf, 0x4e, 0xa4, 0x70, 0x2b, 0x80, - 0xac, 0xbd, 0x8d, 0xb5, 0xe5, 0xa4, 0x16, 0x01, 0x2f, 0x3c, 0xe1, 0xbc, 0x03, 0x75, 0xd1, 0x0c, - 0xee, 0x1c, 0x4a, 0x9e, 0x84, 0x45, 0x8c, 0x5d, 0x75, 0x0c, 0x4c, 0xf9, 0xe5, 0x6d, 0xf9, 0x65, - 0xe5, 0xa2, 0x2f, 0x25, 0xa6, 0x7d, 0x5f, 0x1d, 0x1c, 0xdf, 0x0f, 0xdd, 0xe1, 0x89, 0xe4, 0xe5, - 0x5b, 0x30, 0xef, 0xf9, 0x9d, 0xfe, 0xa8, 0x4b, 0xdb, 0x23, 0xdf, 0xf5, 0xfd, 0x60, 0xe4, 0x77, - 0xa8, 0xcc, 0xc1, 0xc9, 0xab, 0xb2, 0xbb, 0x2a, 0x63, 0x13, 0x1b, 0x22, 0x6b, 0x50, 0xe6, 0x0a, - 0x93, 0xeb, 0x8e, 0x7c, 0x46, 0xe7, 0x28, 0x64, 0x15, 0xca, 0x5c, 0x6f, 0x16, 0x0c, 0xae, 0xd1, - 0x76, 0xd5, 0xe1, 0x08, 0x4c, 0xec, 0x60, 0xd2, 0xae, 0x29, 0x76, 0x4c, 0xbd, 0x33, 0xd9, 0xc1, - 0xb4, 0x5e, 0x7b, 0x01, 0xc8, 0x3e, 0xe7, 0x14, 0xfd, 0xf8, 0xe7, 0x07, 0x45, 0xa8, 0x69, 0x60, - 0x26, 0x41, 0x7a, 0x6c, 0xc0, 0xed, 0xae, 0xe7, 0x0e, 0x68, 0x4c, 0x43, 0xc1, 0x1d, 0x29, 0x28, - 0xc3, 0x73, 0x4f, 0x7b, 0xed, 0x60, 0x14, 0xb7, 0xbb, 0xb4, 0x17, 0x52, 0xae, 0x4d, 0x99, 0x6a, - 0x32, 0xa0, 0x0c, 0x8f, 0xd1, 0xa7, 0x86, 0xc7, 0x29, 0x28, 0x05, 0x95, 0x87, 0x39, 0x7c, 0x8d, - 0x4a, 0xc9, 0x61, 0x0e, 0x5f, 0x91, 0xb4, 0xec, 0x2b, 0xe7, 0xc8, 0xbe, 0xb7, 0x60, 0x89, 0x4b, - 0x39, 0x21, 0x0f, 0xda, 0x29, 0xc2, 0x1a, 0x53, 0x4b, 0xd6, 0xa0, 0xc1, 0xc6, 0x2c, 0x59, 0x22, - 0xf2, 0xbe, 0xc9, 0x03, 0xa3, 0x96, 0x93, 0x81, 0x33, 0x5c, 0x8c, 0x50, 0xea, 0xb8, 0xfc, 0x44, - 0x3d, 0x03, 0x47, 0x5c, 0xf7, 0x99, 0x89, 0x5b, 0x15, 0xb8, 0x29, 0x38, 0xb9, 0x03, 0xcb, 0x03, - 0xda, 0xf5, 0x5c, 0xb3, 0x09, 0x0c, 0xf2, 0xf2, 0xb4, 0x99, 0x71, 0xd5, 0xf6, 0x34, 0xd4, 0x0e, - 0xe3, 0x60, 0x28, 0xb7, 0x73, 0x06, 0xea, 0xbc, 0x28, 0xb2, 0xa8, 0x2e, 0xc3, 0x25, 0xa4, 0xbf, - 0x47, 0xc1, 0x30, 0xe8, 0x07, 0xbd, 0x73, 0xc3, 0xaf, 0xfa, 0x0b, 0x0b, 0xe6, 0x8d, 0xda, 0xc4, - 0xb1, 0xc2, 0x90, 0x8c, 0x4c, 0x7f, 0xe1, 0x24, 0x3b, 0xa7, 0x09, 0x6f, 0x8e, 0xc8, 0xa3, 0xdf, - 0x8f, 0x45, 0x46, 0xcc, 0x46, 0x72, 0x33, 0x46, 0x7e, 0xc8, 0xe9, 0xb7, 0x99, 0xa5, 0x5f, 0xf1, - 0xbd, 0xbc, 0x18, 0x23, 0x9b, 0xf8, 0x92, 0xc8, 0x69, 0xe0, 0x7e, 0x96, 0x8c, 0xc0, 0x29, 0xcf, - 0x4c, 0xf7, 0xc3, 0xe5, 0x08, 0x3a, 0x0a, 0x18, 0xd9, 0xbf, 0x68, 0x01, 0x24, 0xa3, 0xc3, 0x93, - 0x70, 0xa5, 0x80, 0xf8, 0x2d, 0x2c, 0x4d, 0xd9, 0xbc, 0x06, 0x75, 0x75, 0x98, 0x99, 0xe8, 0xb4, - 0x9a, 0x84, 0x31, 0xb3, 0xfa, 0x06, 0xcc, 0xf6, 0xfa, 0xc1, 0x11, 0x1a, 0x04, 0x98, 0x96, 0x17, - 0x89, 0x5c, 0xb2, 0x19, 0x0e, 0xbe, 0x27, 0xa0, 0x89, 0x02, 0x2c, 0x69, 0x0a, 0xd0, 0xfe, 0xa5, - 0x82, 0x3a, 0x7b, 0x4a, 0xe6, 0x3c, 0x96, 0x3f, 0xc9, 0xed, 0x8c, 0x20, 0x1e, 0x73, 0xd4, 0x83, - 0x66, 0xed, 0xc1, 0x85, 0xa1, 0xb0, 0xbb, 0x30, 0x13, 0x72, 0x49, 0x27, 0xc5, 0x60, 0xe9, 0x05, - 0x62, 0x70, 0x3a, 0x34, 0xb4, 0xe4, 0x67, 0xa0, 0xe1, 0x76, 0x4f, 0x69, 0x18, 0x7b, 0x18, 0x8c, - 0x40, 0x13, 0x85, 0x0b, 0xef, 0x59, 0x0d, 0x8e, 0x96, 0xc3, 0x0d, 0x98, 0x15, 0xf9, 0x7b, 0x0a, - 0x53, 0xdc, 0x6c, 0x48, 0xc0, 0x0c, 0xd1, 0xfe, 0xae, 0x3c, 0xe6, 0x32, 0xf7, 0x70, 0xfc, 0x8a, - 0xe8, 0xb3, 0x2b, 0xa4, 0x66, 0xf7, 0x29, 0x71, 0xe4, 0xd4, 0x95, 0x11, 0x8f, 0xa2, 0x96, 0xff, - 0xd2, 0x15, 0x47, 0x84, 0xe6, 0x92, 0x96, 0x5e, 0x66, 0x49, 0xed, 0x1f, 0x59, 0x30, 0xb5, 0x1b, - 0x0c, 0x77, 0x45, 0x26, 0x10, 0x32, 0x82, 0x4a, 0x9c, 0x95, 0xc5, 0x17, 0xe4, 0x08, 0xe5, 0x5a, - 0x06, 0xd3, 0x69, 0xcb, 0xe0, 0x7f, 0xc2, 0x65, 0x8c, 0xb7, 0x85, 0xc1, 0x30, 0x08, 0x19, 0x33, - 0xba, 0x7d, 0x6e, 0x06, 0x04, 0x7e, 0x7c, 0x22, 0x05, 0xe0, 0x8b, 0x50, 0xd0, 0x09, 0x66, 0xbe, - 0x1d, 0x37, 0xea, 0x85, 0x25, 0xc3, 0xe5, 0x62, 0xb6, 0xc2, 0xfe, 0x22, 0x54, 0xd1, 0x14, 0xc7, - 0x69, 0xbd, 0x01, 0xd5, 0x93, 0x60, 0xd8, 0x3e, 0xf1, 0xfc, 0x58, 0x32, 0xf7, 0x4c, 0x62, 0x23, - 0xef, 0xe2, 0x82, 0x28, 0x04, 0xfb, 0xd7, 0x26, 0x61, 0xea, 0x81, 0x7f, 0x1a, 0x78, 0x1d, 0x3c, - 0x52, 0x1b, 0xd0, 0x41, 0x20, 0xd3, 0x88, 0xd9, 0x7f, 0x72, 0x05, 0xa6, 0x30, 0x6f, 0x6e, 0xc8, - 0x89, 0xb6, 0xce, 0x8f, 0xbe, 0x05, 0x88, 0x99, 0x17, 0x61, 0x72, 0xe1, 0x83, 0xb3, 0x8f, 0x06, - 0x61, 0x4e, 0x4a, 0xa8, 0x5f, 0xd8, 0x10, 0xa5, 0x24, 0x4d, 0xbb, 0xac, 0xa5, 0x69, 0xb3, 0xbe, - 0x44, 0xe6, 0x12, 0x4f, 0x6d, 0xe1, 0x7d, 0x09, 0x10, 0x3a, 0x56, 0x21, 0xe5, 0xf1, 0x52, 0x34, - 0x56, 0xa6, 0x84, 0x63, 0xa5, 0x03, 0x99, 0x41, 0xc3, 0x3f, 0xe0, 0x38, 0x5c, 0x7c, 0xeb, 0x20, - 0x66, 0x22, 0xa6, 0xef, 0xea, 0x54, 0x39, 0xed, 0xa7, 0xc0, 0x4c, 0xc6, 0x77, 0xa9, 0x12, 0xa8, - 0x7c, 0x1e, 0xc0, 0x2f, 0xb5, 0xa4, 0xe1, 0x9a, 0x3b, 0xc6, 0x53, 0x1c, 0xa5, 0x3b, 0xc6, 0x08, - 0xc6, 0xed, 0xf7, 0x8f, 0xdc, 0xce, 0x53, 0xbc, 0x8a, 0x85, 0x87, 0x5c, 0x55, 0xc7, 0x04, 0x62, - 0xfe, 0x51, 0xb2, 0xab, 0x98, 0x24, 0x50, 0x72, 0x74, 0x10, 0xb9, 0x0d, 0x35, 0x74, 0x41, 0xc5, - 0xbe, 0xce, 0xe0, 0xbe, 0x36, 0x74, 0x1f, 0x15, 0x77, 0x56, 0x47, 0xd2, 0x8f, 0xfb, 0x66, 0x33, - 0x49, 0x87, 0x6e, 0xb7, 0x2b, 0x4e, 0x49, 0x1b, 0xdc, 0x9d, 0x56, 0x00, 0xa6, 0x8f, 0xc5, 0x82, - 0x71, 0x84, 0x39, 0x44, 0x30, 0x60, 0xe4, 0x2a, 0x54, 0x98, 0x7b, 0x34, 0x74, 0xbd, 0x2e, 0x66, - 0x2d, 0x72, 0x2f, 0x4d, 0xc1, 0x58, 0x1b, 0xf2, 0x3f, 0x2a, 0xba, 0x79, 0x5c, 0x15, 0x03, 0xc6, - 0xd6, 0x46, 0x95, 0x91, 0x99, 0x16, 0xf8, 0x8e, 0x1a, 0x40, 0xf2, 0x26, 0x9e, 0x55, 0xc5, 0xb4, - 0xb9, 0x88, 0xb1, 0xb0, 0xcb, 0x62, 0xce, 0x82, 0x68, 0xe5, 0xef, 0x21, 0x43, 0x71, 0x38, 0xa6, - 0xbd, 0x01, 0x75, 0x1d, 0x4c, 0x2a, 0x50, 0x7a, 0x78, 0xb0, 0xb3, 0xdf, 0x98, 0x20, 0x35, 0x98, - 0x3a, 0xdc, 0x79, 0xf4, 0x68, 0x6f, 0x67, 0xbb, 0x61, 0x91, 0x3a, 0x54, 0x54, 0xb2, 0x58, 0x81, - 0x95, 0x36, 0xb6, 0xb6, 0x76, 0x0e, 0x1e, 0xed, 0x6c, 0x37, 0x8a, 0x76, 0x0c, 0x64, 0xa3, 0xdb, - 0x15, 0xad, 0xa8, 0x20, 0x41, 0x42, 0xcf, 0x96, 0x41, 0xcf, 0x39, 0x34, 0x55, 0xc8, 0xa7, 0xa9, - 0x17, 0xae, 0xbc, 0xbd, 0x03, 0xb5, 0x03, 0xed, 0x5e, 0x12, 0xb2, 0x97, 0xbc, 0x91, 0x24, 0xd8, - 0x52, 0x83, 0x68, 0xc3, 0x29, 0xe8, 0xc3, 0xb1, 0x7f, 0xcf, 0xe2, 0xc9, 0xff, 0x6a, 0xf8, 0xbc, - 0x6f, 0x1b, 0xea, 0x2a, 0x20, 0x95, 0xe4, 0x81, 0x1a, 0x30, 0x86, 0x83, 0x43, 0x69, 0x07, 0xc7, - 0xc7, 0x11, 0x95, 0x59, 0x5b, 0x06, 0x8c, 0xf1, 0x05, 0xb3, 0xcd, 0x98, 0x9d, 0xe3, 0xf1, 0x1e, - 0x22, 0x91, 0xbd, 0x95, 0x81, 0x33, 0x29, 0x2f, 0x02, 0x32, 0x32, 0x5f, 0x4d, 0x95, 0x55, 0xba, - 0x6a, 0x7a, 0x95, 0xd7, 0xa0, 0xa2, 0xda, 0x35, 0x05, 0x98, 0xc4, 0x54, 0xf5, 0x4c, 0x50, 0xa2, - 0xb7, 0x62, 0x0c, 0x9a, 0x0b, 0xed, 0x6c, 0x05, 0xb9, 0x09, 0xe4, 0xd8, 0x0b, 0xd3, 0xe8, 0x45, - 0x44, 0xcf, 0xa9, 0xb1, 0x9f, 0xc0, 0xbc, 0x24, 0x24, 0xcd, 0xb4, 0x32, 0x37, 0xd1, 0xba, 0x88, - 0x7d, 0x0a, 0x59, 0xf6, 0xb1, 0xff, 0xdd, 0x82, 0x29, 0xb1, 0xd3, 0x99, 0xbb, 0x6d, 0x7c, 0x9f, - 0x0d, 0x18, 0x69, 0x1a, 0xf7, 0x5a, 0x90, 0xd7, 0x84, 0xd0, 0xcc, 0x88, 0xc5, 0x62, 0x9e, 0x58, - 0x24, 0x50, 0x1a, 0xba, 0xf1, 0x09, 0x7a, 0xea, 0x55, 0x07, 0xff, 0x93, 0x06, 0x8f, 0x2b, 0x71, - 0x11, 0x8c, 0x31, 0xa5, 0xbc, 0x5b, 0x7c, 0x5c, 0xdb, 0x67, 0x6f, 0xf1, 0x5d, 0x81, 0x2a, 0x0e, - 0xa0, 0x9d, 0x84, 0x8d, 0x12, 0x00, 0xa3, 0x5c, 0x5e, 0x40, 0xbe, 0x16, 0x29, 0xe6, 0x09, 0xc4, - 0x5e, 0xe4, 0x3b, 0x2f, 0x96, 0x40, 0x9d, 0x33, 0x8b, 0xf4, 0xe0, 0x04, 0x9c, 0x50, 0x84, 0x18, - 0x40, 0x9a, 0x22, 0x04, 0xaa, 0xa3, 0xea, 0xed, 0x16, 0x34, 0xb7, 0x69, 0x9f, 0xc6, 0x74, 0xa3, - 0xdf, 0x4f, 0xb7, 0x7f, 0x19, 0x2e, 0xe5, 0xd4, 0x09, 0x6b, 0xfa, 0x2b, 0xb0, 0xb8, 0xc1, 0x53, - 0x29, 0x7f, 0x5a, 0x99, 0x3a, 0x76, 0x13, 0x96, 0xd2, 0x4d, 0x8a, 0xce, 0xee, 0xc1, 0xdc, 0x36, - 0x3d, 0x1a, 0xf5, 0xf6, 0xe8, 0x69, 0xd2, 0x11, 0x81, 0x52, 0x74, 0x12, 0x9c, 0x09, 0xc6, 0xc4, - 0xff, 0xe4, 0x15, 0x80, 0x3e, 0xc3, 0x69, 0x47, 0x43, 0xda, 0x91, 0x57, 0x49, 0x10, 0x72, 0x38, - 0xa4, 0x1d, 0xfb, 0x2d, 0x20, 0x7a, 0x3b, 0x62, 0xbd, 0x98, 0x16, 0x1c, 0x1d, 0xb5, 0xa3, 0xf3, - 0x28, 0xa6, 0x03, 0x79, 0x47, 0x46, 0x07, 0xd9, 0x37, 0xa0, 0x7e, 0xe0, 0x9e, 0x3b, 0xf4, 0x23, - 0x71, 0xa5, 0x71, 0x19, 0xa6, 0x86, 0xee, 0x39, 0x13, 0x53, 0x2a, 0x9e, 0x85, 0xd5, 0xf6, 0xbf, - 0x16, 0x60, 0x92, 0x63, 0xb2, 0x56, 0xbb, 0x34, 0x8a, 0x3d, 0x1f, 0x09, 0x4b, 0xb6, 0xaa, 0x81, - 0x32, 0xa4, 0x5c, 0xc8, 0x21, 0x65, 0xe1, 0xed, 0xc9, 0xb4, 0x7c, 0x41, 0xaf, 0x06, 0x8c, 0x11, - 0x57, 0x92, 0x32, 0xc7, 0x03, 0x2a, 0x09, 0x20, 0x15, 0xfa, 0x4c, 0x74, 0x2d, 0x1f, 0x9f, 0xe4, - 0x52, 0x41, 0xb9, 0x3a, 0x28, 0x57, 0xa3, 0x4f, 0x71, 0x02, 0xcf, 0x68, 0xf4, 0x8c, 0xe6, 0xae, - 0xbc, 0x84, 0xe6, 0xe6, 0x2e, 0xe0, 0x8b, 0x34, 0x37, 0xbc, 0x84, 0xe6, 0xb6, 0x09, 0x34, 0xf0, - 0xbe, 0x1f, 0xb3, 0x0d, 0x25, 0xed, 0x7e, 0xdb, 0x82, 0x86, 0xa0, 0x22, 0x55, 0x47, 0x5e, 0x33, - 0x6c, 0xe0, 0xdc, 0x84, 0xf7, 0x6b, 0x30, 0x8d, 0x96, 0xa9, 0x8a, 0xf1, 0x8a, 0x80, 0xb4, 0x01, - 0x64, 0xf3, 0x90, 0x47, 0xc4, 0x03, 0xaf, 0x2f, 0x36, 0x45, 0x07, 0xc9, 0x30, 0x71, 0xe8, 0x8a, - 0xd4, 0x31, 0xcb, 0x51, 0x65, 0xfb, 0xcf, 0x2c, 0x98, 0xd3, 0x06, 0x2c, 0xa8, 0xf0, 0x2e, 0x48, - 0x6e, 0xe0, 0x01, 0x5f, 0xce, 0xb9, 0xcb, 0x26, 0xdb, 0x24, 0x9f, 0x19, 0xc8, 0xb8, 0x99, 0xee, - 0x39, 0x0e, 0x30, 0x1a, 0x0d, 0x84, 0x10, 0xd5, 0x41, 0x8c, 0x90, 0xce, 0x28, 0x7d, 0xaa, 0x50, - 0xb8, 0x18, 0x37, 0x60, 0x18, 0x55, 0x63, 0x16, 0xb5, 0x42, 0x2a, 0x89, 0xa8, 0x9a, 0x0e, 0xb4, - 0xff, 0xda, 0x82, 0x79, 0xee, 0x1a, 0x09, 0xc7, 0x53, 0xdd, 0x6c, 0x9a, 0xe4, 0xbe, 0x20, 0xe7, - 0xc8, 0xdd, 0x09, 0x47, 0x94, 0xc9, 0xe7, 0x5f, 0xd2, 0x9d, 0x53, 0xf9, 0x6c, 0x63, 0xf6, 0xa2, - 0x98, 0xb7, 0x17, 0x2f, 0x58, 0xe9, 0xbc, 0x00, 0x67, 0x39, 0x37, 0xc0, 0xb9, 0x39, 0x05, 0xe5, - 0xa8, 0x13, 0x0c, 0xa9, 0xbd, 0x04, 0x0b, 0xe6, 0xe4, 0x84, 0x08, 0xfa, 0x8e, 0x05, 0xcd, 0x7b, - 0xfc, 0x20, 0xc0, 0xf3, 0x7b, 0xbb, 0x5e, 0x14, 0x07, 0xa1, 0xba, 0x00, 0x7a, 0x15, 0x20, 0x8a, - 0xdd, 0x30, 0xe6, 0xa9, 0xd2, 0x22, 0xb0, 0x98, 0x40, 0xd8, 0x18, 0xa9, 0xdf, 0xe5, 0xb5, 0x7c, - 0x6f, 0x54, 0x39, 0x63, 0x43, 0x08, 0xe7, 0xcd, 0xd0, 0xc4, 0xd7, 0x79, 0x7e, 0x27, 0xb3, 0x15, - 0xe8, 0x29, 0xca, 0x75, 0xee, 0x15, 0xa5, 0xa0, 0xf6, 0x5f, 0x59, 0x30, 0x9b, 0x0c, 0x12, 0x4f, - 0x3e, 0x4d, 0xe9, 0x20, 0xd4, 0x6f, 0x22, 0x1d, 0x64, 0xc8, 0xd3, 0x63, 0xfa, 0x58, 0x8c, 0x4d, - 0x83, 0x20, 0xc7, 0x8a, 0x52, 0x30, 0x92, 0x06, 0x8e, 0x0e, 0xe2, 0xd9, 0x5a, 0xcc, 0x12, 0x10, - 0x56, 0x8d, 0x28, 0x61, 0xa6, 0xfb, 0x20, 0xc6, 0xaf, 0x78, 0x70, 0x56, 0x16, 0xa5, 0x2a, 0x9d, - 0x42, 0x28, 0xaa, 0x52, 0xfd, 0x50, 0xa5, 0xc2, 0xd7, 0x47, 0x96, 0xed, 0x5f, 0xb6, 0xe0, 0x52, - 0xce, 0xc2, 0x0b, 0xae, 0xd9, 0x86, 0xb9, 0x63, 0x55, 0x29, 0x17, 0x87, 0xb3, 0xce, 0x92, 0x3c, - 0xba, 0x33, 0x17, 0xc4, 0xc9, 0x7e, 0xa0, 0xec, 0x22, 0xbe, 0xdc, 0x46, 0x3e, 0x64, 0xb6, 0xc2, - 0x3e, 0x80, 0xd6, 0xce, 0x33, 0xc6, 0x84, 0x5b, 0xfa, 0x5b, 0x26, 0x92, 0x16, 0x6e, 0x67, 0x84, - 0xcc, 0xc5, 0x8e, 0xf6, 0x31, 0x4c, 0x1b, 0x6d, 0x91, 0xcf, 0xbe, 0x6c, 0x23, 0xa9, 0xf0, 0x34, - 0x96, 0xf8, 0x63, 0x2c, 0x32, 0x2b, 0x53, 0x03, 0xd9, 0xa7, 0x30, 0xfb, 0xde, 0xa8, 0x1f, 0x7b, - 0xc9, 0xc3, 0x2c, 0xe4, 0xf3, 0xe2, 0x23, 0x6c, 0x42, 0x2e, 0x5d, 0x6e, 0x57, 0x3a, 0x1e, 0x5b, - 0xb1, 0x01, 0x6b, 0xa9, 0x9d, 0xed, 0x31, 0x5b, 0x61, 0x5f, 0x82, 0xe5, 0xa4, 0x4b, 0xbe, 0x76, - 0x52, 0x50, 0x7f, 0xd7, 0xe2, 0x09, 0x0d, 0xe6, 0x3b, 0x31, 0xe4, 0x3e, 0xcc, 0x47, 0x9e, 0xdf, - 0xeb, 0x53, 0xbd, 0x9d, 0x48, 0xac, 0xc4, 0xa2, 0x39, 0x3c, 0xf1, 0x96, 0x8c, 0x93, 0xf7, 0x05, - 0x23, 0x90, 0xfc, 0x81, 0x26, 0x04, 0x92, 0x5a, 0x92, 0xbc, 0x09, 0xbc, 0x03, 0x33, 0x66, 0x67, - 0xe4, 0x8e, 0x48, 0xa8, 0x4c, 0x46, 0xa6, 0xc7, 0xb2, 0x4d, 0xca, 0x30, 0x30, 0xed, 0x6f, 0x59, - 0xd0, 0x74, 0x28, 0x23, 0x63, 0xaa, 0x75, 0x2a, 0xa8, 0xe7, 0x6e, 0xa6, 0xd9, 0xf1, 0x13, 0x56, - 0x89, 0x9a, 0x72, 0xae, 0x37, 0xc7, 0x6e, 0xca, 0xee, 0x44, 0xce, 0xac, 0x36, 0x2b, 0x30, 0x29, - 0xe6, 0xb7, 0x0c, 0x8b, 0x62, 0x48, 0x72, 0x38, 0x49, 0xd0, 0xd4, 0xe8, 0xd4, 0x08, 0x9a, 0xb6, - 0xa0, 0xc9, 0x6f, 0xe6, 0xea, 0xf3, 0xe0, 0x1f, 0xae, 0x3d, 0x87, 0x9a, 0x76, 0x3f, 0x99, 0x2c, - 0xc3, 0xfc, 0x93, 0x07, 0x8f, 0xf6, 0x77, 0x0e, 0x0f, 0xdb, 0x07, 0x8f, 0x37, 0xdf, 0xdd, 0x79, - 0xbf, 0xbd, 0xbb, 0x71, 0xb8, 0xdb, 0x98, 0x20, 0x4b, 0x40, 0xf6, 0x77, 0x0e, 0x1f, 0xed, 0x6c, - 0x1b, 0x70, 0x8b, 0x5c, 0x85, 0xd6, 0xe3, 0xfd, 0xc7, 0x87, 0x3b, 0xdb, 0xed, 0xbc, 0xef, 0x0a, - 0xe4, 0x15, 0xb8, 0x24, 0xea, 0x73, 0x3e, 0x2f, 0xde, 0xfe, 0x56, 0x11, 0x66, 0x78, 0x5e, 0x05, - 0x7f, 0x5e, 0x88, 0x86, 0xe4, 0x3d, 0x98, 0x12, 0xef, 0x54, 0x11, 0xb9, 0x9e, 0xe6, 0xcb, 0x58, - 0xad, 0xa5, 0x34, 0x58, 0x2c, 0xc2, 0xfc, 0xff, 0xff, 0xd1, 0x3f, 0xfc, 0x6a, 0x61, 0x9a, 0xd4, - 0xd6, 0x4f, 0xdf, 0x5c, 0xef, 0x51, 0x3f, 0x62, 0x6d, 0x7c, 0x1d, 0x20, 0x79, 0x7d, 0x89, 0x34, - 0x95, 0xcf, 0x95, 0x7a, 0x9a, 0xaa, 0x75, 0x29, 0xa7, 0x46, 0xb4, 0x7b, 0x09, 0xdb, 0x9d, 0xb7, - 0x67, 0x58, 0xbb, 0x9e, 0xef, 0xc5, 0xfc, 0x25, 0xa6, 0xb7, 0xad, 0x35, 0xd2, 0x85, 0xba, 0xfe, - 0x2e, 0x12, 0x91, 0x81, 0xdf, 0x9c, 0x97, 0x9d, 0x5a, 0x97, 0x73, 0xeb, 0xe4, 0x06, 0x62, 0x1f, - 0x8b, 0x76, 0x83, 0xf5, 0x31, 0x42, 0x8c, 0xa4, 0x97, 0x3e, 0x27, 0xeb, 0xe4, 0xf9, 0x23, 0x72, - 0x45, 0xa3, 0xb4, 0xcc, 0xe3, 0x4b, 0xad, 0x57, 0xc6, 0xd4, 0x8a, 0xbe, 0x5e, 0xc1, 0xbe, 0x96, - 0x6d, 0xc2, 0xfa, 0xea, 0x20, 0x8e, 0x7c, 0x7c, 0xe9, 0x6d, 0x6b, 0xed, 0xf6, 0xaf, 0x5f, 0x87, - 0xaa, 0x3a, 0xe4, 0x21, 0x1f, 0xc2, 0xb4, 0x91, 0xf8, 0x42, 0xe4, 0x34, 0xf2, 0xf2, 0x64, 0x5a, - 0x57, 0xf2, 0x2b, 0x45, 0xc7, 0x57, 0xb1, 0xe3, 0x26, 0x59, 0x62, 0x1d, 0x8b, 0xcc, 0x91, 0x75, - 0x4c, 0xe1, 0xe2, 0xf7, 0x31, 0x9e, 0x6a, 0xec, 0xcb, 0x3b, 0xbb, 0x92, 0xe6, 0x28, 0xa3, 0xb7, - 0x57, 0xc6, 0xd4, 0x8a, 0xee, 0xae, 0x60, 0x77, 0x4b, 0x64, 0x41, 0xef, 0x4e, 0x1d, 0xbe, 0x50, - 0xbc, 0x44, 0xa4, 0xbf, 0x1c, 0x44, 0x5e, 0x51, 0x84, 0x95, 0xf7, 0xa2, 0x90, 0x22, 0x91, 0xec, - 0xb3, 0x42, 0x76, 0x13, 0xbb, 0x22, 0x04, 0xb7, 0x4f, 0x7f, 0x38, 0x88, 0x1c, 0x41, 0x4d, 0x7b, - 0xed, 0x82, 0x5c, 0x1a, 0xfb, 0x32, 0x47, 0xab, 0x95, 0x57, 0x95, 0x37, 0x15, 0xbd, 0xfd, 0x75, - 0xa6, 0x97, 0xbf, 0x06, 0x55, 0xf5, 0x7e, 0x02, 0x59, 0xd6, 0xde, 0xb3, 0xd0, 0xdf, 0x7b, 0x68, - 0x35, 0xb3, 0x15, 0x79, 0xc4, 0xa7, 0xb7, 0xce, 0x88, 0xef, 0x09, 0xd4, 0xb4, 0x37, 0x12, 0xd4, - 0x04, 0xb2, 0xef, 0x30, 0xa8, 0x09, 0xe4, 0x3c, 0xa9, 0x60, 0xcf, 0x61, 0x17, 0x35, 0x52, 0x45, - 0xfa, 0x8e, 0x9f, 0x05, 0x11, 0xd9, 0x83, 0x45, 0x21, 0xa6, 0x8e, 0xe8, 0x27, 0xd9, 0x86, 0x9c, - 0xc7, 0x9a, 0x6e, 0x59, 0xe4, 0x2e, 0x54, 0xe4, 0x53, 0x18, 0x64, 0x29, 0xff, 0x49, 0x8f, 0xd6, - 0x72, 0x06, 0x2e, 0xcc, 0x93, 0xf7, 0x01, 0x92, 0x07, 0x19, 0x94, 0x90, 0xc8, 0x3c, 0xf0, 0xa0, - 0x28, 0x20, 0xfb, 0x7a, 0x83, 0xbd, 0x84, 0x13, 0x6c, 0x10, 0x14, 0x12, 0x3e, 0x3d, 0x93, 0xf7, - 0x05, 0xbf, 0x01, 0x35, 0xed, 0x4d, 0x06, 0xb5, 0x7c, 0xd9, 0xf7, 0x1c, 0xd4, 0xf2, 0xe5, 0x3c, - 0xe1, 0x60, 0xb7, 0xb0, 0xf5, 0x05, 0x7b, 0x96, 0xb5, 0x1e, 0x79, 0x3d, 0x7f, 0xc0, 0x11, 0xd8, - 0x06, 0x9d, 0xc0, 0xb4, 0xf1, 0xf0, 0x82, 0xe2, 0xd0, 0xbc, 0x67, 0x1d, 0x14, 0x87, 0xe6, 0xbe, - 0xd5, 0x20, 0xe9, 0xcc, 0x9e, 0x63, 0xfd, 0x9c, 0x22, 0x8a, 0xd6, 0xd3, 0x07, 0x50, 0xd3, 0x1e, - 0x51, 0x50, 0x73, 0xc9, 0xbe, 0xd7, 0xa0, 0xe6, 0x92, 0xf7, 0xe6, 0xc2, 0x02, 0xf6, 0x31, 0x63, - 0x23, 0x29, 0xe0, 0xcd, 0x37, 0xd6, 0xf6, 0x87, 0x30, 0x63, 0x3e, 0xab, 0xa0, 0x78, 0x3f, 0xf7, - 0x81, 0x06, 0xc5, 0xfb, 0x63, 0xde, 0x62, 0x10, 0x24, 0xbd, 0x36, 0xaf, 0x3a, 0x59, 0xff, 0x58, - 0x24, 0x7f, 0x3c, 0x27, 0x5f, 0x61, 0x02, 0x4e, 0x5c, 0x45, 0x24, 0xcb, 0x1a, 0xd5, 0xea, 0x17, - 0x16, 0x15, 0xbf, 0x64, 0x6e, 0x2d, 0x9a, 0xc4, 0xcc, 0xef, 0xee, 0xa1, 0xd6, 0xc2, 0x2b, 0x89, - 0x9a, 0xd6, 0xd2, 0x6f, 0x2d, 0x6a, 0x5a, 0xcb, 0xb8, 0xb9, 0x98, 0xd6, 0x5a, 0xb1, 0xc7, 0xda, - 0xf0, 0x61, 0x36, 0x95, 0x9c, 0xab, 0xb8, 0x22, 0xff, 0x36, 0x43, 0xeb, 0xea, 0x8b, 0x73, 0x7a, - 0x4d, 0x09, 0x22, 0x85, 0xe0, 0xba, 0xbc, 0x3b, 0xf2, 0xbf, 0xa1, 0xae, 0x5f, 0x61, 0x27, 0x3a, - 0x2b, 0xa7, 0x7b, 0xba, 0x9c, 0x5b, 0x67, 0x6e, 0x2e, 0xa9, 0xeb, 0xdd, 0x90, 0xaf, 0xc2, 0x92, - 0x62, 0x75, 0x3d, 0xdf, 0x33, 0x22, 0xaf, 0xe6, 0x64, 0x81, 0xea, 0xc6, 0x4b, 0xeb, 0xd2, 0xd8, - 0x34, 0xd1, 0x5b, 0x16, 0x23, 0x1a, 0xf3, 0x6e, 0x70, 0xa2, 0x30, 0xf2, 0xae, 0x44, 0x27, 0x0a, - 0x23, 0xf7, 0x42, 0xb1, 0x24, 0x1a, 0x32, 0x6f, 0xac, 0x11, 0x3f, 0x9f, 0x23, 0x1f, 0xc0, 0xac, - 0x96, 0x51, 0x7f, 0x78, 0xee, 0x77, 0x14, 0x03, 0x64, 0xaf, 0x5e, 0xb5, 0xf2, 0x4c, 0x73, 0x7b, - 0x19, 0xdb, 0x9f, 0xb3, 0x8d, 0xc5, 0x61, 0xc4, 0xbf, 0x05, 0x35, 0x3d, 0x5b, 0xff, 0x05, 0xed, - 0x2e, 0x6b, 0x55, 0xfa, 0xcd, 0xa1, 0x5b, 0x16, 0xf9, 0x4d, 0x0b, 0xea, 0x46, 0xee, 0xbb, 0x71, - 0x0a, 0x9d, 0x6a, 0xa7, 0xa9, 0xd7, 0xe9, 0x0d, 0xd9, 0x0e, 0x0e, 0x72, 0x6f, 0xed, 0x1d, 0x63, - 0x11, 0x3e, 0x36, 0xe2, 0x2f, 0x37, 0xd3, 0xcf, 0x6f, 0x3d, 0x4f, 0x23, 0xe8, 0xd7, 0xd3, 0x9e, - 0xdf, 0xb2, 0xc8, 0xf7, 0x2c, 0x98, 0x31, 0xa3, 0x86, 0x6a, 0xab, 0x72, 0xe3, 0x93, 0x6a, 0xab, - 0xc6, 0x84, 0x1a, 0x3f, 0xc0, 0x51, 0x3e, 0x5a, 0x73, 0x8c, 0x51, 0x8a, 0x5b, 0xe3, 0x3f, 0xd9, - 0x68, 0xc9, 0xdb, 0xfc, 0x85, 0x3e, 0x19, 0xca, 0x26, 0x9a, 0xd6, 0x48, 0x6f, 0xaf, 0xfe, 0xaa, - 0xdc, 0xaa, 0x75, 0xcb, 0x22, 0xdf, 0xe0, 0xcf, 0x4e, 0x89, 0x6f, 0x91, 0x4a, 0x5e, 0xf6, 0x7b, - 0xfb, 0x1a, 0xce, 0xe9, 0xaa, 0x7d, 0xc9, 0x98, 0x53, 0x5a, 0x1f, 0x6f, 0xf0, 0xd1, 0x89, 0x07, - 0xe1, 0x12, 0x85, 0x92, 0x79, 0x24, 0x6e, 0xfc, 0x20, 0x07, 0x7c, 0x90, 0x02, 0xdd, 0x20, 0xe5, - 0x97, 0x6c, 0xc6, 0x5e, 0xc3, 0xb1, 0x5e, 0xb3, 0x5f, 0x1d, 0x3b, 0xd6, 0x75, 0x8c, 0xfd, 0xb1, - 0x11, 0x1f, 0x00, 0x24, 0xc7, 0x4e, 0x24, 0x75, 0xec, 0xa1, 0x18, 0x3c, 0x7b, 0x32, 0x65, 0xf2, - 0x8b, 0x3c, 0x1d, 0x61, 0x2d, 0x7e, 0x8d, 0x8b, 0xab, 0x07, 0xf2, 0xc0, 0x44, 0x37, 0x4a, 0xcc, - 0xf3, 0x21, 0xc3, 0x28, 0x49, 0xb7, 0x6f, 0x08, 0x2b, 0x75, 0xfa, 0xf2, 0x18, 0xa6, 0xf7, 0x82, - 0xe0, 0xe9, 0x68, 0xa8, 0x8e, 0x90, 0xcd, 0xb0, 0xfc, 0xae, 0x1b, 0x9d, 0xb4, 0x52, 0xb3, 0xb0, - 0x57, 0xb0, 0xa9, 0x16, 0x69, 0x6a, 0x4d, 0xad, 0x7f, 0x9c, 0x1c, 0x6b, 0x3d, 0x27, 0x2e, 0xcc, - 0x29, 0x19, 0xa8, 0x06, 0xde, 0x32, 0x9b, 0x31, 0x24, 0x5f, 0xba, 0x0b, 0xc3, 0x7a, 0x96, 0xa3, - 0x5d, 0x8f, 0x64, 0x9b, 0xb7, 0x2c, 0x72, 0x00, 0xf5, 0x6d, 0xda, 0x09, 0xba, 0x54, 0xc4, 0xb6, - 0xe7, 0x93, 0x81, 0xab, 0xa0, 0x78, 0x6b, 0xda, 0x00, 0x9a, 0x7a, 0x61, 0xe8, 0x9e, 0x87, 0xf4, - 0xa3, 0xf5, 0x8f, 0x45, 0xd4, 0xfc, 0xb9, 0xd4, 0x0b, 0xf2, 0x58, 0xc1, 0xd0, 0x0b, 0xa9, 0x73, - 0x08, 0x43, 0x2f, 0x64, 0xce, 0x21, 0x8c, 0xa5, 0x96, 0xc7, 0x1a, 0xa4, 0x0f, 0x73, 0x99, 0xa3, - 0x0b, 0xa5, 0x12, 0xc6, 0x1d, 0x78, 0xb4, 0x56, 0xc6, 0x23, 0x98, 0xbd, 0xad, 0x99, 0xbd, 0x1d, - 0xc2, 0xf4, 0x36, 0xe5, 0x8b, 0xc5, 0x33, 0xdc, 0x52, 0x17, 0x28, 0xf4, 0xfc, 0xb9, 0xb4, 0x00, - 0xc7, 0x3a, 0x53, 0xf1, 0x63, 0x7a, 0x19, 0xf9, 0x1a, 0xd4, 0xee, 0xd3, 0x58, 0xa6, 0xb4, 0x29, - 0xd3, 0x33, 0x95, 0xe3, 0xd6, 0xca, 0xc9, 0x88, 0x33, 0x69, 0x06, 0x5b, 0x5b, 0xa7, 0xdd, 0x1e, - 0xe5, 0xc2, 0xa9, 0xed, 0x75, 0x9f, 0x93, 0xff, 0x85, 0x8d, 0xab, 0xcc, 0xdb, 0x25, 0x2d, 0x9f, - 0x49, 0x6f, 0x7c, 0x36, 0x05, 0xcf, 0x6b, 0xd9, 0x0f, 0xba, 0x54, 0x33, 0x81, 0x7c, 0xa8, 0x69, - 0x09, 0xe3, 0x8a, 0x81, 0xb2, 0x29, 0xfc, 0x8a, 0x81, 0x72, 0xf2, 0xcb, 0xed, 0x55, 0xec, 0xc7, - 0x26, 0x2b, 0x49, 0x3f, 0x3c, 0xa7, 0x3c, 0xe9, 0x69, 0xfd, 0x63, 0x77, 0x10, 0x3f, 0x27, 0x4f, - 0xf0, 0x15, 0x07, 0x3d, 0x6d, 0x2f, 0xb1, 0xa5, 0xd3, 0x19, 0x7e, 0x6a, 0xb1, 0xb4, 0x2a, 0xd3, - 0xbe, 0xe6, 0x5d, 0xa1, 0xa5, 0xf4, 0x79, 0x80, 0xc3, 0x38, 0x18, 0x6e, 0xbb, 0x74, 0x10, 0xf8, - 0x89, 0xac, 0x4d, 0x12, 0xcc, 0x12, 0xf9, 0xa5, 0x65, 0x99, 0x91, 0x27, 0x9a, 0xf3, 0x61, 0x64, - 0x3d, 0x4a, 0xe2, 0x1a, 0x9b, 0x83, 0xa6, 0x16, 0x24, 0x27, 0x0f, 0xed, 0x96, 0x45, 0x36, 0x00, - 0x92, 0xb3, 0x2b, 0xe5, 0x4a, 0x64, 0x8e, 0xc5, 0x94, 0xd8, 0xcb, 0x39, 0xe8, 0x3a, 0x80, 0x6a, - 0x72, 0x18, 0xb2, 0x9c, 0xdc, 0x6c, 0x30, 0x8e, 0x4e, 0x94, 0x06, 0xcf, 0x1c, 0x51, 0xd8, 0x0d, - 0x5c, 0x2a, 0x20, 0x15, 0xb6, 0x54, 0x78, 0xee, 0xe0, 0xc1, 0x3c, 0x1f, 0xa0, 0x32, 0x47, 0x30, - 0x65, 0x4a, 0xce, 0x24, 0xe7, 0x98, 0x40, 0x71, 0x73, 0x6e, 0x94, 0xdd, 0x88, 0x88, 0x30, 0x6a, - 0xe5, 0xe9, 0x5a, 0x4c, 0x34, 0x0f, 0x60, 0x2e, 0x13, 0x06, 0x56, 0x2c, 0x3d, 0x2e, 0x32, 0xaf, - 0x58, 0x7a, 0x6c, 0x04, 0xd9, 0x5e, 0xc4, 0x2e, 0x67, 0x6d, 0x40, 0x0f, 0xe8, 0xcc, 0x8b, 0x3b, - 0x27, 0xac, 0xbb, 0xef, 0x5a, 0x30, 0x9f, 0x13, 0xe5, 0x25, 0xaf, 0x49, 0x67, 0x7a, 0x6c, 0x04, - 0xb8, 0x95, 0x1b, 0x04, 0xb4, 0x0f, 0xb1, 0x9f, 0xf7, 0xc8, 0xbb, 0x86, 0x62, 0xe3, 0xf1, 0x37, - 0xc1, 0x99, 0x2f, 0x34, 0x2a, 0x72, 0x2d, 0x8a, 0x8f, 0x60, 0x99, 0x0f, 0x64, 0xa3, 0xdf, 0x4f, - 0x05, 0x28, 0xaf, 0x66, 0x1e, 0xe1, 0x36, 0x02, 0xaf, 0xad, 0xf1, 0x8f, 0x74, 0x8f, 0x31, 0x57, - 0xf9, 0x50, 0xc9, 0x08, 0x1a, 0xe9, 0xa0, 0x1f, 0x19, 0xdf, 0x56, 0xeb, 0x55, 0xc3, 0x2d, 0xcc, - 0x06, 0x0a, 0xed, 0x4f, 0x63, 0x67, 0xaf, 0xda, 0xad, 0xbc, 0x75, 0xe1, 0x9e, 0x22, 0xdb, 0x8f, - 0xff, 0xab, 0x22, 0x94, 0xa9, 0x79, 0xca, 0x0e, 0xc6, 0x85, 0x54, 0x95, 0x63, 0x9a, 0x1f, 0xe0, - 0xbc, 0x8e, 0xdd, 0xaf, 0xd8, 0x97, 0xf3, 0xba, 0x0f, 0xf9, 0x27, 0xdc, 0x45, 0x5d, 0x4e, 0xf3, - 0xb5, 0x1c, 0xc1, 0x4a, 0xde, 0x7e, 0x8f, 0xf5, 0x35, 0x52, 0x6b, 0x3d, 0x71, 0xcb, 0xda, 0xbc, - 0xf1, 0xc1, 0xa7, 0x7b, 0x5e, 0x7c, 0x32, 0x3a, 0xba, 0xd9, 0x09, 0x06, 0xeb, 0x7d, 0x19, 0x22, - 0x13, 0xe9, 0xb9, 0xeb, 0x7d, 0xbf, 0xbb, 0x8e, 0xdf, 0x1f, 0x4d, 0xe2, 0x9b, 0xfe, 0x9f, 0xfd, - 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xd8, 0x05, 0xe4, 0x05, 0x60, 0x00, 0x00, +var fileDescriptor_rpc_ea34ec0435bf8f95 = []byte{ + // 7715 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5d, 0x6c, 0x24, 0xd9, + 0x59, 0xa8, 0xab, 0x7f, 0xec, 0xee, 0xaf, 0xdb, 0x76, 0xfb, 0xf8, 0xaf, 0xa7, 0x67, 0x76, 0xd6, + 0x5b, 0x99, 0xcc, 0x38, 0xde, 0xbd, 0xe3, 0xd9, 0x49, 0xb2, 0x99, 0xec, 0xdc, 0xdc, 0x5c, 0xff, + 0xcd, 0x78, 0x76, 0xbd, 0x1e, 0xa7, 0x3c, 0x93, 0xb9, 0xbb, 0xc9, 0x55, 0xa7, 0xdc, 0x7d, 0xdc, + 0xae, 0x9d, 0xee, 0xaa, 0xde, 0xaa, 0x6a, 0x7b, 0x9c, 0xbd, 0x73, 0x85, 0x10, 0x02, 0x84, 0x40, + 0x28, 0x20, 0x10, 0x41, 0x20, 0x44, 0x82, 0x04, 0x11, 0x4f, 0x3c, 0x80, 0x90, 0x20, 0xcf, 0x48, + 0x91, 0x10, 0x42, 0x79, 0x44, 0x02, 0x21, 0x78, 0x41, 0x3c, 0x20, 0x90, 0x78, 0x44, 0x42, 0xe7, + 0x3b, 0x3f, 0x75, 0x4e, 0x55, 0xf5, 0x78, 0x36, 0x09, 0x3c, 0x75, 0x9f, 0xef, 0x7c, 0x75, 0x7e, + 0xbf, 0xff, 0xf3, 0x9d, 0x03, 0xd5, 0x70, 0xd8, 0xb9, 0x39, 0x0c, 0x83, 0x38, 0x20, 0xe5, 0xbe, + 0x1f, 0x0e, 0x3b, 0xad, 0x2b, 0xbd, 0x20, 0xe8, 0xf5, 0xe9, 0xba, 0x3b, 0xf4, 0xd6, 0x5d, 0xdf, + 0x0f, 0x62, 0x37, 0xf6, 0x02, 0x3f, 0xe2, 0x48, 0xf6, 0x37, 0x60, 0xe6, 0x3e, 0xf5, 0x0f, 0x29, + 0xed, 0x3a, 0xf4, 0xa3, 0x11, 0x8d, 0x62, 0xf2, 0x3a, 0xcc, 0xb9, 0xf4, 0x9b, 0x94, 0x76, 0xdb, + 0x43, 0x37, 0x8a, 0x86, 0x27, 0xa1, 0x1b, 0xd1, 0xa6, 0xb5, 0x62, 0xad, 0xd6, 0x9d, 0x06, 0xaf, + 0x38, 0x50, 0x70, 0xf2, 0x1a, 0xd4, 0x23, 0x86, 0x4a, 0xfd, 0x38, 0x0c, 0x86, 0xe7, 0xcd, 0x02, + 0xe2, 0xd5, 0x18, 0x6c, 0x87, 0x83, 0xec, 0x3e, 0xcc, 0xaa, 0x1e, 0xa2, 0x61, 0xe0, 0x47, 0x94, + 0xdc, 0x82, 0x85, 0x8e, 0x37, 0x3c, 0xa1, 0x61, 0x1b, 0x3f, 0x1e, 0xf8, 0x74, 0x10, 0xf8, 0x5e, + 0xa7, 0x69, 0xad, 0x14, 0x57, 0xab, 0x0e, 0xe1, 0x75, 0xec, 0x8b, 0xf7, 0x44, 0x0d, 0xb9, 0x01, + 0xb3, 0xd4, 0xe7, 0x70, 0xda, 0xc5, 0xaf, 0x44, 0x57, 0x33, 0x09, 0x98, 0x7d, 0x60, 0xff, 0x7c, + 0x01, 0xe6, 0x1e, 0xf8, 0x5e, 0xfc, 0xc4, 0xed, 0xf7, 0x69, 0x2c, 0xe7, 0x74, 0x03, 0x66, 0xcf, + 0x10, 0x80, 0x73, 0x3a, 0x0b, 0xc2, 0xae, 0x98, 0xd1, 0x0c, 0x07, 0x1f, 0x08, 0xe8, 0xd8, 0x91, + 0x15, 0xc6, 0x8e, 0x2c, 0x77, 0xb9, 0x8a, 0x63, 0x96, 0xeb, 0x06, 0xcc, 0x86, 0xb4, 0x13, 0x9c, + 0xd2, 0xf0, 0xbc, 0x7d, 0xe6, 0xf9, 0xdd, 0xe0, 0xac, 0x59, 0x5a, 0xb1, 0x56, 0xcb, 0xce, 0x8c, + 0x04, 0x3f, 0x41, 0x28, 0xd9, 0x84, 0xd9, 0xce, 0x89, 0xeb, 0xfb, 0xb4, 0xdf, 0x3e, 0x72, 0x3b, + 0x4f, 0x47, 0xc3, 0xa8, 0x59, 0x5e, 0xb1, 0x56, 0x6b, 0xb7, 0x2f, 0xdd, 0xc4, 0x5d, 0xbd, 0xb9, + 0x75, 0xe2, 0xfa, 0x9b, 0x58, 0x73, 0xe8, 0xbb, 0xc3, 0xe8, 0x24, 0x88, 0x9d, 0x19, 0xf1, 0x05, + 0x07, 0x47, 0xf6, 0x02, 0x10, 0x7d, 0x25, 0xf8, 0xda, 0xdb, 0x7f, 0x68, 0xc1, 0xfc, 0x63, 0xbf, + 0x1f, 0x74, 0x9e, 0xfe, 0x88, 0x4b, 0x94, 0x33, 0x87, 0xc2, 0xcb, 0xce, 0xa1, 0xf8, 0x49, 0xe7, + 0xb0, 0x04, 0x0b, 0xe6, 0x60, 0xc5, 0x2c, 0x28, 0x2c, 0xb2, 0xaf, 0x7b, 0x54, 0x0e, 0x4b, 0x4e, + 0xe3, 0x33, 0xd0, 0xe8, 0x8c, 0xc2, 0x90, 0xfa, 0x99, 0x79, 0xcc, 0x0a, 0xb8, 0x9a, 0xc8, 0x6b, + 0x50, 0xf7, 0xe9, 0x59, 0x82, 0x26, 0x68, 0xd7, 0xa7, 0x67, 0x12, 0xc5, 0x6e, 0xc2, 0x52, 0xba, + 0x1b, 0x31, 0x80, 0xbf, 0xb7, 0xa0, 0xf4, 0x38, 0x7e, 0x16, 0x90, 0x9b, 0x50, 0x8a, 0xcf, 0x87, + 0x9c, 0x43, 0x66, 0x6e, 0x13, 0x31, 0xb5, 0x8d, 0x6e, 0x37, 0xa4, 0x51, 0xf4, 0xe8, 0x7c, 0x48, + 0x9d, 0xba, 0xcb, 0x0b, 0x6d, 0x86, 0x47, 0x9a, 0x30, 0x25, 0xca, 0xd8, 0x61, 0xd5, 0x91, 0x45, + 0x72, 0x15, 0xc0, 0x1d, 0x04, 0x23, 0x3f, 0x6e, 0x47, 0x6e, 0x8c, 0x4b, 0x55, 0x74, 0x34, 0x08, + 0xb9, 0x02, 0xd5, 0xe1, 0xd3, 0x76, 0xd4, 0x09, 0xbd, 0x61, 0x8c, 0x64, 0x53, 0x75, 0x12, 0x00, + 0x79, 0x1d, 0x2a, 0xc1, 0x28, 0x1e, 0x06, 0x9e, 0x1f, 0x0b, 0x52, 0x99, 0x15, 0x63, 0x79, 0x38, + 0x8a, 0x0f, 0x18, 0xd8, 0x51, 0x08, 0xe4, 0x1a, 0x4c, 0x77, 0x02, 0xff, 0xd8, 0x0b, 0x07, 0x5c, + 0x18, 0x34, 0x27, 0xb1, 0x37, 0x13, 0x68, 0x7f, 0xbb, 0x00, 0xb5, 0x47, 0xa1, 0xeb, 0x47, 0x6e, + 0x87, 0x01, 0xd8, 0xd0, 0xe3, 0x67, 0xed, 0x13, 0x37, 0x3a, 0xc1, 0xd9, 0x56, 0x1d, 0x59, 0x24, + 0x4b, 0x30, 0xc9, 0x07, 0x8a, 0x73, 0x2a, 0x3a, 0xa2, 0x44, 0xde, 0x80, 0x39, 0x7f, 0x34, 0x68, + 0x9b, 0x7d, 0x15, 0x91, 0x5a, 0xb2, 0x15, 0x6c, 0x01, 0x8e, 0xd8, 0x5e, 0xf3, 0x2e, 0xf8, 0x0c, + 0x35, 0x08, 0xb1, 0xa1, 0x2e, 0x4a, 0xd4, 0xeb, 0x9d, 0xf0, 0x69, 0x96, 0x1d, 0x03, 0xc6, 0xda, + 0x88, 0xbd, 0x01, 0x6d, 0x47, 0xb1, 0x3b, 0x18, 0x8a, 0x69, 0x69, 0x10, 0xac, 0x0f, 0x62, 0xb7, + 0xdf, 0x3e, 0xa6, 0x34, 0x6a, 0x4e, 0x89, 0x7a, 0x05, 0x21, 0xd7, 0x61, 0xa6, 0x4b, 0xa3, 0xb8, + 0x2d, 0x36, 0x85, 0x46, 0xcd, 0x0a, 0xb2, 0x7e, 0x0a, 0xca, 0x28, 0xe3, 0x3e, 0x8d, 0xb5, 0xd5, + 0x89, 0x04, 0x05, 0xda, 0x7b, 0x40, 0x34, 0xf0, 0x36, 0x8d, 0x5d, 0xaf, 0x1f, 0x91, 0xb7, 0xa0, + 0x1e, 0x6b, 0xc8, 0x28, 0xea, 0x6a, 0x8a, 0x5c, 0xb4, 0x0f, 0x1c, 0x03, 0xcf, 0xbe, 0x0f, 0x95, + 0x7b, 0x94, 0xee, 0x79, 0x03, 0x2f, 0x26, 0x4b, 0x50, 0x3e, 0xf6, 0x9e, 0x51, 0x4e, 0xd0, 0xc5, + 0xdd, 0x09, 0x87, 0x17, 0x49, 0x0b, 0xa6, 0x86, 0x34, 0xec, 0x50, 0xb9, 0xfc, 0xbb, 0x13, 0x8e, + 0x04, 0x6c, 0x4e, 0x41, 0xb9, 0xcf, 0x3e, 0xb6, 0xff, 0xb5, 0x00, 0xb5, 0x43, 0xea, 0x2b, 0x46, + 0x21, 0x50, 0x62, 0x53, 0x12, 0xcc, 0x81, 0xff, 0xc9, 0xab, 0x50, 0xc3, 0x69, 0x46, 0x71, 0xe8, + 0xf9, 0x3d, 0x41, 0x9f, 0xc0, 0x40, 0x87, 0x08, 0x21, 0x0d, 0x28, 0xba, 0x03, 0x49, 0x9b, 0xec, + 0x2f, 0x63, 0xa2, 0xa1, 0x7b, 0x3e, 0x60, 0xfc, 0xa6, 0x76, 0xad, 0xee, 0xd4, 0x04, 0x6c, 0x97, + 0x6d, 0xdb, 0x4d, 0x98, 0xd7, 0x51, 0x64, 0xeb, 0x65, 0x6c, 0x7d, 0x4e, 0xc3, 0x14, 0x9d, 0xdc, + 0x80, 0x59, 0x89, 0x1f, 0xf2, 0xc1, 0xe2, 0x3e, 0x56, 0x9d, 0x19, 0x01, 0x96, 0x53, 0x58, 0x85, + 0xc6, 0xb1, 0xe7, 0xbb, 0xfd, 0x76, 0xa7, 0x1f, 0x9f, 0xb6, 0xbb, 0xb4, 0x1f, 0xbb, 0xb8, 0xa3, + 0x65, 0x67, 0x06, 0xe1, 0x5b, 0xfd, 0xf8, 0x74, 0x9b, 0x41, 0xc9, 0x1b, 0x50, 0x3d, 0xa6, 0xb4, + 0x8d, 0x2b, 0xd1, 0xac, 0x18, 0xdc, 0x21, 0x57, 0xd7, 0xa9, 0x1c, 0xcb, 0x75, 0x5e, 0x85, 0x46, + 0x30, 0x8a, 0x7b, 0x81, 0xe7, 0xf7, 0xda, 0x4c, 0x1e, 0xb5, 0xbd, 0x6e, 0xb3, 0xba, 0x62, 0xad, + 0x96, 0x9c, 0x19, 0x09, 0x67, 0x52, 0xe1, 0x41, 0x97, 0xbc, 0x02, 0x80, 0x7d, 0xf3, 0x86, 0x61, + 0xc5, 0x5a, 0x9d, 0x76, 0xaa, 0x0c, 0x82, 0x0d, 0xd9, 0x7f, 0x6a, 0x41, 0x9d, 0xaf, 0xb9, 0x50, + 0x7c, 0xd7, 0x60, 0x5a, 0x4e, 0x8d, 0x86, 0x61, 0x10, 0x0a, 0x3e, 0x32, 0x81, 0x64, 0x0d, 0x1a, + 0x12, 0x30, 0x0c, 0xa9, 0x37, 0x70, 0x7b, 0x54, 0x08, 0xa7, 0x0c, 0x9c, 0xdc, 0x4e, 0x5a, 0x0c, + 0x83, 0x51, 0x4c, 0x85, 0x88, 0xad, 0x8b, 0xd9, 0x39, 0x0c, 0xe6, 0x98, 0x28, 0x8c, 0x8f, 0x72, + 0xf6, 0xcc, 0x80, 0xd9, 0xdf, 0xb2, 0x80, 0xb0, 0xa1, 0x3f, 0x0a, 0x78, 0x13, 0x62, 0xc9, 0xd3, + 0xdb, 0x6d, 0xbd, 0xf4, 0x76, 0x17, 0xc6, 0x6d, 0xb7, 0x0d, 0x65, 0x3e, 0xf2, 0x52, 0xce, 0xc8, + 0x79, 0xd5, 0x3b, 0xa5, 0x4a, 0xb1, 0x51, 0xb2, 0xbf, 0x63, 0x41, 0x7d, 0x8b, 0xeb, 0x07, 0x14, + 0x68, 0xe4, 0x16, 0x90, 0xe3, 0x91, 0xdf, 0x65, 0xfb, 0x14, 0x3f, 0xf3, 0xba, 0xed, 0xa3, 0xf3, + 0x98, 0x46, 0x7c, 0x4c, 0xbb, 0x13, 0x4e, 0x4e, 0x1d, 0x79, 0x03, 0x1a, 0x06, 0x34, 0x8a, 0x43, + 0x3e, 0xb2, 0xdd, 0x09, 0x27, 0x53, 0xc3, 0x16, 0x8a, 0x89, 0xcc, 0x51, 0xdc, 0xf6, 0xfc, 0x2e, + 0x7d, 0x86, 0x6b, 0x3b, 0xed, 0x18, 0xb0, 0xcd, 0x19, 0xa8, 0xeb, 0xdf, 0xd9, 0x1f, 0x42, 0x45, + 0x0a, 0x5c, 0x14, 0x36, 0xa9, 0x71, 0x39, 0x1a, 0x84, 0xb4, 0xa0, 0x62, 0x8e, 0xc2, 0xa9, 0x7c, + 0x92, 0xbe, 0xed, 0xff, 0x05, 0x8d, 0x3d, 0x26, 0xf5, 0x7c, 0xcf, 0xef, 0x09, 0x8d, 0xc3, 0x44, + 0xf1, 0x70, 0x74, 0xf4, 0x94, 0x9e, 0x0b, 0xda, 0x12, 0x25, 0xc6, 0xef, 0x27, 0x41, 0x14, 0x8b, + 0x7e, 0xf0, 0xbf, 0xfd, 0x17, 0x16, 0x90, 0x9d, 0x28, 0xf6, 0x06, 0x6e, 0x4c, 0xef, 0x51, 0xb5, + 0xc9, 0x0f, 0xa1, 0xce, 0x5a, 0x7b, 0x14, 0x6c, 0x70, 0x99, 0xce, 0x65, 0xd5, 0xeb, 0x62, 0x63, + 0xb2, 0x1f, 0xdc, 0xd4, 0xb1, 0x99, 0xd9, 0x77, 0xee, 0x18, 0x0d, 0x30, 0xb9, 0x12, 0xbb, 0x61, + 0x8f, 0xc6, 0x28, 0xf0, 0x85, 0xb9, 0x00, 0x1c, 0xb4, 0x15, 0xf8, 0xc7, 0xad, 0x2f, 0xc3, 0x5c, + 0xa6, 0x0d, 0x26, 0x6c, 0x92, 0x69, 0xb0, 0xbf, 0x64, 0x01, 0xca, 0xa7, 0x6e, 0x7f, 0x44, 0x85, + 0x96, 0xe1, 0x85, 0xb7, 0x0b, 0x77, 0x2c, 0xbb, 0x03, 0xf3, 0xc6, 0xb8, 0x04, 0xbf, 0x35, 0x61, + 0x8a, 0xf1, 0x3d, 0xd3, 0xa7, 0x28, 0x33, 0x1d, 0x59, 0x24, 0xb7, 0x61, 0xe1, 0x98, 0xd2, 0xd0, + 0x8d, 0xb1, 0xd8, 0x1e, 0xd2, 0x10, 0xf7, 0x44, 0xb4, 0x9c, 0x5b, 0x67, 0xff, 0x83, 0x05, 0xb3, + 0x8c, 0x27, 0xde, 0x73, 0xfd, 0x73, 0xb9, 0x56, 0x7b, 0xb9, 0x6b, 0xb5, 0x2a, 0xd6, 0x2a, 0x85, + 0xfd, 0x49, 0x17, 0xaa, 0x98, 0x5e, 0x28, 0xb2, 0x02, 0x75, 0x63, 0xb8, 0x65, 0xae, 0xc0, 0x22, + 0x37, 0x3e, 0xa0, 0xe1, 0xe6, 0x79, 0x4c, 0x7f, 0xfc, 0xa5, 0xbc, 0x0e, 0x8d, 0x64, 0xd8, 0x62, + 0x1d, 0x09, 0x94, 0x18, 0x61, 0x8a, 0x06, 0xf0, 0xbf, 0xfd, 0x5b, 0x16, 0x47, 0xdc, 0x0a, 0x3c, + 0xa5, 0xfc, 0x18, 0x22, 0xd3, 0x91, 0x12, 0x91, 0xfd, 0x1f, 0x6b, 0x1c, 0xfc, 0xf8, 0x93, 0x25, + 0x97, 0xa0, 0x12, 0x51, 0xbf, 0xdb, 0x76, 0xfb, 0x7d, 0xd4, 0x11, 0x15, 0x67, 0x8a, 0x95, 0x37, + 0xfa, 0x7d, 0xfb, 0x06, 0xcc, 0x69, 0xa3, 0x7b, 0xc1, 0x3c, 0xf6, 0x81, 0xec, 0x79, 0x51, 0xfc, + 0xd8, 0x8f, 0x86, 0x9a, 0x6e, 0xb9, 0x0c, 0xd5, 0x81, 0xe7, 0xe3, 0xc8, 0x38, 0xe7, 0x96, 0x9d, + 0xca, 0xc0, 0xf3, 0xd9, 0xb8, 0x22, 0xac, 0x74, 0x9f, 0x89, 0xca, 0x82, 0xa8, 0x74, 0x9f, 0x61, + 0xa5, 0x7d, 0x07, 0xe6, 0x8d, 0xf6, 0x44, 0xd7, 0xaf, 0x41, 0x79, 0x14, 0x3f, 0x0b, 0xa4, 0xe6, + 0xaf, 0x09, 0x0a, 0x61, 0x36, 0xa4, 0xc3, 0x6b, 0xec, 0xbb, 0x30, 0xb7, 0x4f, 0xcf, 0x04, 0x23, + 0xcb, 0x81, 0x5c, 0xbf, 0xd0, 0xbe, 0xc4, 0x7a, 0xfb, 0x26, 0x10, 0xfd, 0xe3, 0x84, 0x01, 0xa4, + 0xb5, 0x69, 0x19, 0xd6, 0xa6, 0x7d, 0x1d, 0xc8, 0xa1, 0xd7, 0xf3, 0xdf, 0xa3, 0x51, 0xe4, 0xf6, + 0x14, 0xeb, 0x37, 0xa0, 0x38, 0x88, 0x7a, 0x42, 0x54, 0xb1, 0xbf, 0xf6, 0x67, 0x61, 0xde, 0xc0, + 0x13, 0x0d, 0x5f, 0x81, 0x6a, 0xe4, 0xf5, 0x7c, 0x37, 0x1e, 0x85, 0x54, 0x34, 0x9d, 0x00, 0xec, + 0x7b, 0xb0, 0xf0, 0x55, 0x1a, 0x7a, 0xc7, 0xe7, 0x17, 0x35, 0x6f, 0xb6, 0x53, 0x48, 0xb7, 0xb3, + 0x03, 0x8b, 0xa9, 0x76, 0x44, 0xf7, 0x9c, 0x7c, 0xc5, 0x4e, 0x56, 0x1c, 0x5e, 0xd0, 0x64, 0x5f, + 0x41, 0x97, 0x7d, 0xf6, 0x63, 0x20, 0x5b, 0x81, 0xef, 0xd3, 0x4e, 0x7c, 0x40, 0x69, 0x98, 0x38, + 0xba, 0x09, 0xad, 0xd6, 0x6e, 0x2f, 0x8b, 0x95, 0x4d, 0x0b, 0x54, 0x41, 0xc4, 0x04, 0x4a, 0x43, + 0x1a, 0x0e, 0xb0, 0xe1, 0x8a, 0x83, 0xff, 0xed, 0x45, 0x98, 0x37, 0x9a, 0x15, 0xae, 0xc1, 0x9b, + 0xb0, 0xb8, 0xed, 0x45, 0x9d, 0x6c, 0x87, 0x4d, 0x98, 0x1a, 0x8e, 0x8e, 0xda, 0x09, 0x27, 0xca, + 0x22, 0xb3, 0x26, 0xd3, 0x9f, 0x88, 0xc6, 0x7e, 0xd6, 0x82, 0xd2, 0xee, 0xa3, 0xbd, 0x2d, 0xa6, + 0x2b, 0x3c, 0xbf, 0x13, 0x0c, 0x98, 0x2e, 0xe5, 0x93, 0x56, 0xe5, 0xb1, 0x1c, 0x76, 0x05, 0xaa, + 0xa8, 0x82, 0x99, 0x81, 0x2c, 0x7c, 0xd2, 0x04, 0xc0, 0x8c, 0x73, 0xfa, 0x6c, 0xe8, 0x85, 0x68, + 0x7d, 0x4b, 0x9b, 0xba, 0x84, 0x6a, 0x26, 0x5b, 0x61, 0xff, 0xa0, 0x0c, 0x53, 0x42, 0xf9, 0x62, + 0x7f, 0x9d, 0xd8, 0x3b, 0xa5, 0x62, 0x24, 0xa2, 0xc4, 0xcc, 0x9b, 0x90, 0x0e, 0x82, 0x98, 0xb6, + 0x8d, 0x6d, 0x30, 0x81, 0xe8, 0x7c, 0x08, 0xbf, 0x90, 0xbb, 0x2b, 0x45, 0x8e, 0x65, 0x00, 0xd9, + 0x62, 0x49, 0xdb, 0xab, 0x84, 0xb6, 0x97, 0x2c, 0xb2, 0x95, 0xe8, 0xb8, 0x43, 0xb7, 0xe3, 0xc5, + 0xe7, 0x42, 0x24, 0xa8, 0x32, 0x6b, 0xbb, 0x1f, 0x74, 0x5c, 0xe6, 0x71, 0xf6, 0x5d, 0xbf, 0x43, + 0xa5, 0x63, 0x63, 0x00, 0x99, 0x91, 0x2f, 0x86, 0x24, 0xd1, 0xb8, 0x23, 0x90, 0x82, 0x32, 0xfd, + 0xdd, 0x09, 0x06, 0x03, 0x2f, 0x66, 0xbe, 0x01, 0xda, 0x8d, 0x45, 0x47, 0x83, 0x70, 0x37, 0x0a, + 0x4b, 0x67, 0x7c, 0xf5, 0xaa, 0xd2, 0x8d, 0xd2, 0x80, 0xac, 0x15, 0xa6, 0x75, 0x98, 0x18, 0x7b, + 0x7a, 0x86, 0x46, 0x62, 0xd1, 0xd1, 0x20, 0x6c, 0x1f, 0x46, 0x7e, 0x44, 0xe3, 0xb8, 0x4f, 0xbb, + 0x6a, 0x40, 0x35, 0x44, 0xcb, 0x56, 0x90, 0x5b, 0x30, 0xcf, 0xdd, 0x95, 0xc8, 0x8d, 0x83, 0xe8, + 0xc4, 0x8b, 0xda, 0x11, 0x33, 0xfc, 0xeb, 0x88, 0x9f, 0x57, 0x45, 0xee, 0xc0, 0x72, 0x0a, 0x1c, + 0xd2, 0x0e, 0xf5, 0x4e, 0x69, 0xb7, 0x39, 0x8d, 0x5f, 0x8d, 0xab, 0x26, 0x2b, 0x50, 0x63, 0x5e, + 0xda, 0x68, 0xd8, 0x75, 0x99, 0x01, 0x33, 0x83, 0xfb, 0xa0, 0x83, 0xc8, 0x9b, 0x30, 0x3d, 0xa4, + 0xdc, 0xfa, 0x39, 0x89, 0xfb, 0x9d, 0xa8, 0x39, 0x6b, 0x48, 0x37, 0x46, 0xb9, 0x8e, 0x89, 0xc1, + 0x88, 0xb2, 0x13, 0xa1, 0xb9, 0xee, 0x9e, 0x37, 0x1b, 0xc2, 0x64, 0x96, 0x00, 0xe4, 0x91, 0xd0, + 0x3b, 0x75, 0x63, 0xda, 0x9c, 0xe3, 0x02, 0x5d, 0x14, 0xd9, 0x77, 0x9e, 0xef, 0xc5, 0x9e, 0x1b, + 0x07, 0x61, 0x93, 0x60, 0x5d, 0x02, 0x60, 0x8b, 0x88, 0xf4, 0x11, 0xc5, 0x6e, 0x3c, 0x8a, 0xda, + 0xc7, 0x7d, 0xb7, 0x17, 0x35, 0xe7, 0xb9, 0xcd, 0x99, 0xa9, 0xb0, 0x7f, 0xc7, 0xe2, 0x42, 0x5a, + 0x10, 0xb4, 0x12, 0xb6, 0xaf, 0x42, 0x8d, 0x93, 0x72, 0x3b, 0xf0, 0xfb, 0xe7, 0x82, 0xba, 0x81, + 0x83, 0x1e, 0xfa, 0xfd, 0x73, 0xf2, 0x29, 0x98, 0xf6, 0x7c, 0x1d, 0x85, 0xcb, 0x83, 0xba, 0x04, + 0x22, 0xd2, 0xab, 0x50, 0x1b, 0x8e, 0x8e, 0xfa, 0x5e, 0x87, 0xa3, 0x14, 0x79, 0x2b, 0x1c, 0x84, + 0x08, 0xcc, 0x8a, 0xe6, 0xb3, 0xe2, 0x18, 0x25, 0xc4, 0xa8, 0x09, 0x18, 0x43, 0xb1, 0x37, 0x61, + 0xc1, 0x1c, 0xa0, 0x10, 0x7c, 0x6b, 0x50, 0x11, 0x7c, 0x12, 0x35, 0x6b, 0xb8, 0xd6, 0x33, 0x5a, + 0x34, 0xc5, 0xa7, 0x7d, 0x47, 0xd5, 0xdb, 0x7f, 0x52, 0x82, 0x79, 0x01, 0xdd, 0xea, 0x07, 0x11, + 0x3d, 0x1c, 0x0d, 0x06, 0x6e, 0x98, 0xc3, 0x80, 0xd6, 0x05, 0x0c, 0x58, 0x30, 0x19, 0x90, 0xb1, + 0xc5, 0x89, 0xeb, 0xf9, 0xdc, 0x05, 0xe0, 0xdc, 0xab, 0x41, 0xc8, 0x2a, 0xcc, 0x76, 0xfa, 0x41, + 0xc4, 0x4d, 0x62, 0xdd, 0x99, 0x4f, 0x83, 0xb3, 0x02, 0xa3, 0x9c, 0x27, 0x30, 0x74, 0x86, 0x9f, + 0x4c, 0x31, 0xbc, 0x0d, 0x75, 0xd6, 0x28, 0x95, 0xf2, 0x6b, 0x8a, 0x9b, 0xc9, 0x3a, 0x8c, 0x8d, + 0x27, 0xcd, 0x5e, 0x9c, 0x97, 0x67, 0xf3, 0x98, 0xcb, 0x1b, 0x50, 0x94, 0x8f, 0x1a, 0x76, 0x55, + 0x30, 0x57, 0xb6, 0x8a, 0xdc, 0x63, 0x1e, 0x20, 0xeb, 0x0b, 0x95, 0x34, 0xa0, 0x92, 0xbe, 0x6e, + 0xee, 0x88, 0xbe, 0xf6, 0x37, 0x59, 0x61, 0x14, 0x52, 0x54, 0xdc, 0xda, 0x97, 0xf6, 0x2f, 0x58, + 0x50, 0xd3, 0xea, 0xc8, 0x22, 0xcc, 0x6d, 0x3d, 0x7c, 0x78, 0xb0, 0xe3, 0x6c, 0x3c, 0x7a, 0xf0, + 0xd5, 0x9d, 0xf6, 0xd6, 0xde, 0xc3, 0xc3, 0x9d, 0xc6, 0x04, 0x03, 0xef, 0x3d, 0xdc, 0xda, 0xd8, + 0x6b, 0xdf, 0x7b, 0xe8, 0x6c, 0x49, 0xb0, 0x45, 0x96, 0x80, 0x38, 0x3b, 0xef, 0x3d, 0x7c, 0xb4, + 0x63, 0xc0, 0x0b, 0xa4, 0x01, 0xf5, 0x4d, 0x67, 0x67, 0x63, 0x6b, 0x57, 0x40, 0x8a, 0x64, 0x01, + 0x1a, 0xf7, 0x1e, 0xef, 0x6f, 0x3f, 0xd8, 0xbf, 0xdf, 0xde, 0xda, 0xd8, 0xdf, 0xda, 0xd9, 0xdb, + 0xd9, 0x6e, 0x94, 0xc8, 0x34, 0x54, 0x37, 0x36, 0x37, 0xf6, 0xb7, 0x1f, 0xee, 0xef, 0x6c, 0x37, + 0xca, 0xf6, 0xdf, 0x5a, 0xb0, 0x88, 0xa3, 0xee, 0xa6, 0x19, 0x64, 0x05, 0x6a, 0x9d, 0x20, 0x18, + 0x32, 0xe3, 0x38, 0x11, 0xff, 0x3a, 0x88, 0x11, 0x3f, 0x17, 0xb6, 0xc7, 0x41, 0xd8, 0xa1, 0x82, + 0x3f, 0x00, 0x41, 0xf7, 0x18, 0x84, 0x11, 0xbf, 0xd8, 0x5e, 0x8e, 0xc1, 0xd9, 0xa3, 0xc6, 0x61, + 0x1c, 0x65, 0x09, 0x26, 0x8f, 0x42, 0xea, 0x76, 0x4e, 0x04, 0x67, 0x88, 0x12, 0xf9, 0x4c, 0xe2, + 0xbd, 0x75, 0xd8, 0xea, 0xf7, 0x69, 0x17, 0x29, 0xa6, 0xe2, 0xcc, 0x0a, 0xf8, 0x96, 0x00, 0x33, + 0x69, 0xe1, 0x1e, 0xb9, 0x7e, 0x37, 0xf0, 0x69, 0x57, 0x98, 0x86, 0x09, 0xc0, 0x3e, 0x80, 0xa5, + 0xf4, 0xfc, 0x04, 0x7f, 0xbd, 0xa5, 0xf1, 0x17, 0xb7, 0xd4, 0x5a, 0xe3, 0x77, 0x53, 0xe3, 0xb5, + 0xbf, 0x2b, 0x40, 0x89, 0x29, 0xee, 0xf1, 0x4a, 0x5e, 0xb7, 0xc5, 0x8a, 0x99, 0xc8, 0x1f, 0x3a, + 0x84, 0x5c, 0x94, 0x73, 0x75, 0xa7, 0x41, 0x92, 0xfa, 0x90, 0x76, 0x4e, 0x71, 0xc6, 0xaa, 0x9e, + 0x41, 0x18, 0x83, 0x30, 0x43, 0x19, 0xbf, 0x16, 0x0c, 0x22, 0xcb, 0xb2, 0x0e, 0xbf, 0x9c, 0x4a, + 0xea, 0xf0, 0xbb, 0x26, 0x4c, 0x79, 0xfe, 0x51, 0x30, 0xf2, 0xbb, 0xc8, 0x10, 0x15, 0x47, 0x16, + 0x31, 0xd6, 0x88, 0x8c, 0xea, 0x0d, 0x24, 0xf9, 0x27, 0x00, 0x72, 0x1b, 0xaa, 0xd1, 0xb9, 0xdf, + 0xd1, 0x69, 0x7e, 0x41, 0xac, 0x12, 0x5b, 0x83, 0x9b, 0x87, 0xe7, 0x7e, 0x07, 0x29, 0x3c, 0x41, + 0xb3, 0xbf, 0x0c, 0x15, 0x09, 0x66, 0x64, 0xf9, 0x78, 0xff, 0xdd, 0xfd, 0x87, 0x4f, 0xf6, 0xdb, + 0x87, 0xef, 0xef, 0x6f, 0x35, 0x26, 0xc8, 0x2c, 0xd4, 0x36, 0xb6, 0x90, 0xd2, 0x11, 0x60, 0x31, + 0x94, 0x83, 0x8d, 0xc3, 0x43, 0x05, 0x29, 0xd8, 0x84, 0x39, 0xbb, 0x11, 0x5a, 0x47, 0x2a, 0xd6, + 0xf6, 0x16, 0xcc, 0x69, 0xb0, 0xc4, 0xd2, 0x1e, 0x32, 0x40, 0xca, 0xd2, 0x46, 0xb3, 0x8a, 0xd7, + 0xd8, 0x0d, 0x98, 0xb9, 0x4f, 0xe3, 0x07, 0xfe, 0x71, 0x20, 0x5b, 0xfa, 0xfd, 0x12, 0xcc, 0x2a, + 0x90, 0x68, 0x68, 0x15, 0x66, 0xbd, 0x2e, 0xf5, 0x63, 0x2f, 0x3e, 0x6f, 0x1b, 0x3e, 0x75, 0x1a, + 0xcc, 0xcc, 0x51, 0xb7, 0xef, 0xb9, 0x32, 0xa4, 0xcb, 0x0b, 0xcc, 0xc7, 0x64, 0xba, 0x52, 0xaa, + 0x3f, 0x45, 0x57, 0xdc, 0x95, 0xcf, 0xad, 0x63, 0x12, 0x88, 0xc1, 0x85, 0x8a, 0x51, 0x9f, 0x70, + 0xb3, 0x2c, 0xaf, 0x8a, 0x6d, 0x15, 0x6f, 0x89, 0x4d, 0xb9, 0xcc, 0xf5, 0xa9, 0x02, 0x64, 0x62, + 0xa6, 0x93, 0x5c, 0x3e, 0xa6, 0x63, 0xa6, 0x5a, 0xdc, 0xb5, 0x92, 0x89, 0xbb, 0x32, 0xf9, 0x79, + 0xee, 0x77, 0x68, 0xb7, 0x1d, 0x07, 0x6d, 0x94, 0xf3, 0x48, 0x12, 0x15, 0x27, 0x0d, 0x26, 0x57, + 0x60, 0x2a, 0xa6, 0x51, 0xec, 0x53, 0x1e, 0x0c, 0xab, 0x6c, 0x16, 0x9a, 0x96, 0x23, 0x41, 0xcc, + 0x86, 0x1e, 0x85, 0x5e, 0xd4, 0xac, 0x63, 0x44, 0x15, 0xff, 0x93, 0xcf, 0xc1, 0xe2, 0x11, 0x8d, + 0xe2, 0xf6, 0x09, 0x75, 0xbb, 0x34, 0x44, 0xf2, 0xe2, 0xa1, 0x5b, 0x6e, 0x9a, 0xe4, 0x57, 0x32, + 0xc2, 0x3d, 0xa5, 0x61, 0xe4, 0x05, 0x3e, 0x1a, 0x25, 0x55, 0x47, 0x16, 0x59, 0x7b, 0x6c, 0xf2, + 0x4a, 0x49, 0xab, 0x15, 0x9c, 0xc5, 0x89, 0xe7, 0x57, 0x92, 0x6b, 0x30, 0x89, 0x13, 0x88, 0x9a, + 0x0d, 0xa4, 0x99, 0x7a, 0xc2, 0xf3, 0x9e, 0xef, 0x88, 0xba, 0x77, 0x4a, 0x95, 0x5a, 0xa3, 0x6e, + 0x7f, 0x01, 0xca, 0x08, 0x66, 0x9b, 0xce, 0x17, 0x83, 0x13, 0x05, 0x2f, 0xb0, 0xa1, 0xf9, 0x34, + 0x3e, 0x0b, 0xc2, 0xa7, 0x32, 0xbe, 0x2f, 0x8a, 0xf6, 0x37, 0xd1, 0x0b, 0x51, 0xf1, 0xee, 0xc7, + 0x68, 0x42, 0x31, 0x5f, 0x92, 0x2f, 0x75, 0x74, 0xe2, 0x0a, 0xc7, 0xa8, 0x82, 0x80, 0xc3, 0x13, + 0x97, 0xc9, 0x4a, 0x63, 0xf7, 0xb8, 0xaf, 0x59, 0x43, 0xd8, 0x2e, 0xdf, 0xbc, 0x6b, 0x30, 0x23, + 0x23, 0xe9, 0x51, 0xbb, 0x4f, 0x8f, 0x63, 0x19, 0x29, 0xf2, 0x47, 0x03, 0x74, 0x48, 0xf7, 0xe8, + 0x71, 0x6c, 0xef, 0xc3, 0x9c, 0x90, 0x5f, 0x0f, 0x87, 0x54, 0x76, 0xfd, 0xc5, 0x3c, 0x3b, 0xa0, + 0x76, 0x7b, 0xde, 0x14, 0x78, 0xfc, 0xec, 0xc0, 0xc4, 0xb4, 0x1d, 0x20, 0xba, 0x3c, 0x14, 0x0d, + 0x0a, 0x65, 0x2c, 0x63, 0x61, 0x62, 0x3a, 0x06, 0x8c, 0xad, 0x4f, 0x34, 0xea, 0x74, 0xe4, 0xf9, + 0x07, 0xf3, 0xd8, 0x79, 0xd1, 0xfe, 0x03, 0x0b, 0xe6, 0xb1, 0x35, 0x69, 0xc9, 0x08, 0x9d, 0x73, + 0xe7, 0x13, 0x0c, 0xb3, 0xde, 0xd1, 0xe3, 0x83, 0x0b, 0x50, 0xd6, 0xb5, 0x10, 0x2f, 0x7c, 0xf2, + 0xb8, 0x43, 0x29, 0x1d, 0x77, 0xb0, 0x7f, 0xc3, 0x82, 0x39, 0xae, 0x08, 0xd0, 0xaa, 0x14, 0xd3, + 0xff, 0x9f, 0x30, 0xcd, 0x35, 0xba, 0xe0, 0x6a, 0x31, 0xd0, 0x44, 0x34, 0x22, 0x94, 0x23, 0xef, + 0x4e, 0x38, 0x26, 0x32, 0xb9, 0x8b, 0x56, 0x95, 0xdf, 0x46, 0x68, 0xce, 0x49, 0x99, 0xb9, 0xd6, + 0xbb, 0x13, 0x8e, 0x86, 0xbe, 0x59, 0x81, 0x49, 0x6e, 0x92, 0xdb, 0xf7, 0x61, 0xda, 0xe8, 0xc8, + 0x88, 0x79, 0xd4, 0x79, 0xcc, 0x23, 0x13, 0x5c, 0x2c, 0xe4, 0x04, 0x17, 0xff, 0xa8, 0x08, 0x84, + 0x11, 0x4b, 0x6a, 0x37, 0x98, 0x4f, 0x10, 0x74, 0x0d, 0x0f, 0xaf, 0xee, 0xe8, 0x20, 0x72, 0x13, + 0x88, 0x56, 0x94, 0xf1, 0x5f, 0xae, 0xf2, 0x72, 0x6a, 0x98, 0x98, 0x14, 0x16, 0x83, 0xd0, 0xed, + 0xc2, 0x97, 0xe5, 0xcb, 0x9e, 0x5b, 0xc7, 0xb4, 0xda, 0x70, 0x14, 0x9d, 0x60, 0x64, 0x4f, 0xf8, + 0x80, 0xb2, 0x9c, 0xde, 0xdf, 0xc9, 0x0b, 0xf7, 0x77, 0x2a, 0x13, 0x57, 0xd2, 0xbc, 0x90, 0x8a, + 0xe9, 0x85, 0x5c, 0x83, 0xe9, 0x01, 0xb3, 0x73, 0xe3, 0x7e, 0xa7, 0x3d, 0x60, 0xbd, 0x0b, 0x97, + 0xcf, 0x00, 0x92, 0x35, 0x68, 0x08, 0x1b, 0x27, 0x71, 0x75, 0xf8, 0xe9, 0x40, 0x06, 0xce, 0xe4, + 0x77, 0x12, 0x69, 0xaa, 0xe1, 0x60, 0x13, 0x00, 0xf3, 0x6b, 0x22, 0x46, 0x21, 0xed, 0x91, 0x2f, + 0x0e, 0xcb, 0x68, 0x17, 0x9d, 0xbd, 0x8a, 0x93, 0xad, 0xb0, 0x7f, 0xc5, 0x82, 0x06, 0xdb, 0x33, + 0x83, 0x2c, 0xdf, 0x06, 0xe4, 0x8a, 0x97, 0xa4, 0x4a, 0x03, 0x97, 0xdc, 0x81, 0x2a, 0x96, 0x83, + 0x21, 0xf5, 0x05, 0x4d, 0x36, 0x4d, 0x9a, 0x4c, 0xe4, 0xc9, 0xee, 0x84, 0x93, 0x20, 0x6b, 0x14, + 0xf9, 0x57, 0x16, 0xd4, 0x44, 0x2f, 0x3f, 0x72, 0x24, 0xa3, 0xa5, 0x9d, 0x6e, 0x72, 0x4a, 0x4a, + 0x0e, 0x33, 0x57, 0x61, 0x76, 0xe0, 0xc6, 0xa3, 0x90, 0xe9, 0x63, 0x23, 0x8a, 0x91, 0x06, 0x33, + 0xe5, 0x8a, 0xa2, 0x33, 0x6a, 0xc7, 0x5e, 0xbf, 0x2d, 0x6b, 0xc5, 0x39, 0x62, 0x5e, 0x15, 0x93, + 0x20, 0x51, 0xec, 0xf6, 0xa8, 0xd0, 0x9b, 0xbc, 0x60, 0x37, 0x61, 0x49, 0x4c, 0x28, 0x65, 0x1f, + 0xdb, 0xdf, 0xaf, 0xc3, 0x72, 0xa6, 0x4a, 0x65, 0x3d, 0x08, 0xf7, 0xbc, 0xef, 0x0d, 0x8e, 0x02, + 0xe5, 0x5c, 0x58, 0xba, 0xe7, 0x6e, 0x54, 0x91, 0x1e, 0x2c, 0x4a, 0x03, 0x81, 0xad, 0x69, 0xa2, + 0xcc, 0x0a, 0xa8, 0xa5, 0xde, 0x34, 0xb7, 0x30, 0xdd, 0xa1, 0x84, 0xeb, 0x4c, 0x9c, 0xdf, 0x1e, + 0x39, 0x81, 0xa6, 0xb2, 0x44, 0x84, 0xb0, 0xd6, 0xac, 0x15, 0xd6, 0xd7, 0x1b, 0x17, 0xf4, 0x65, + 0x98, 0xd3, 0xce, 0xd8, 0xd6, 0xc8, 0x39, 0x5c, 0x95, 0x75, 0x28, 0x8d, 0xb3, 0xfd, 0x95, 0x5e, + 0x6a, 0x6e, 0xe8, 0x28, 0x98, 0x9d, 0x5e, 0xd0, 0x30, 0xf9, 0x10, 0x96, 0xce, 0x5c, 0x2f, 0x96, + 0xc3, 0xd2, 0x6c, 0x83, 0x32, 0x76, 0x79, 0xfb, 0x82, 0x2e, 0x9f, 0xf0, 0x8f, 0x0d, 0x15, 0x35, + 0xa6, 0xc5, 0xd6, 0x0f, 0x2c, 0x98, 0x31, 0xdb, 0x61, 0x64, 0x2a, 0x78, 0x5f, 0xca, 0x40, 0x69, + 0x4d, 0xa6, 0xc0, 0x59, 0xff, 0xbc, 0x90, 0xe7, 0x9f, 0xeb, 0x5e, 0x71, 0xf1, 0xa2, 0x30, 0x58, + 0xe9, 0xe5, 0xc2, 0x60, 0xe5, 0xbc, 0x30, 0x58, 0xeb, 0xdf, 0x2d, 0x20, 0x59, 0x5a, 0x22, 0xf7, + 0x79, 0x80, 0xc0, 0xa7, 0x7d, 0x21, 0x52, 0xfe, 0xc7, 0xcb, 0xd1, 0xa3, 0x5c, 0x3b, 0xf9, 0x35, + 0x63, 0x0c, 0x3d, 0x11, 0x40, 0x37, 0x76, 0xa6, 0x9d, 0xbc, 0xaa, 0x54, 0x60, 0xae, 0x74, 0x71, + 0x60, 0xae, 0x7c, 0x71, 0x60, 0x6e, 0x32, 0x1d, 0x98, 0x6b, 0xfd, 0x8c, 0x05, 0xf3, 0x39, 0x9b, + 0xfe, 0x93, 0x9b, 0x38, 0xdb, 0x26, 0x43, 0x16, 0x14, 0xc4, 0x36, 0xe9, 0xc0, 0xd6, 0xff, 0x83, + 0x69, 0x83, 0xd0, 0x7f, 0x72, 0xfd, 0xa7, 0xed, 0x35, 0x4e, 0x67, 0x06, 0xac, 0xf5, 0xcf, 0x05, + 0x20, 0x59, 0x66, 0xfb, 0x6f, 0x1d, 0x43, 0x76, 0x9d, 0x8a, 0x39, 0xeb, 0xf4, 0x5f, 0xaa, 0x07, + 0xde, 0x80, 0x39, 0x91, 0xdd, 0xa4, 0x85, 0x85, 0x38, 0xc5, 0x64, 0x2b, 0x98, 0xc5, 0x6a, 0x46, + 0x45, 0x2b, 0x46, 0xb6, 0x87, 0xa6, 0x0c, 0x53, 0xc1, 0x51, 0xbb, 0x05, 0x4d, 0xb1, 0x42, 0x3b, + 0xa7, 0xd4, 0x8f, 0x0f, 0x47, 0x47, 0x3c, 0xbd, 0xc7, 0x0b, 0x7c, 0xfb, 0x8f, 0x8b, 0xca, 0xe8, + 0xc6, 0x4a, 0xa1, 0xde, 0x3f, 0x07, 0x75, 0x5d, 0x98, 0x8b, 0xed, 0x48, 0x45, 0x05, 0x99, 0x62, + 0xd7, 0xb1, 0xc8, 0x36, 0xcc, 0xa0, 0xc8, 0xea, 0xaa, 0xef, 0x0a, 0xf8, 0xdd, 0x0b, 0xa2, 0x1d, + 0xbb, 0x13, 0x4e, 0xea, 0x1b, 0xf2, 0x25, 0x98, 0x31, 0x5d, 0x29, 0x61, 0x23, 0xe4, 0xd9, 0xe6, + 0xec, 0x73, 0x13, 0x99, 0x6c, 0x40, 0x23, 0xed, 0x8b, 0x89, 0x2c, 0x80, 0x31, 0x0d, 0x64, 0xd0, + 0xc9, 0x1d, 0x71, 0x3c, 0x56, 0xc6, 0x28, 0xc4, 0x35, 0xf3, 0x33, 0x6d, 0x99, 0x6e, 0xf2, 0x1f, + 0xed, 0xc0, 0xec, 0xeb, 0x00, 0x09, 0x8c, 0x34, 0xa0, 0xfe, 0xf0, 0x60, 0x67, 0xbf, 0xbd, 0xb5, + 0xbb, 0xb1, 0xbf, 0xbf, 0xb3, 0xd7, 0x98, 0x20, 0x04, 0x66, 0x30, 0x68, 0xb6, 0xad, 0x60, 0x16, + 0x83, 0x89, 0x30, 0x85, 0x84, 0x15, 0xc8, 0x02, 0x34, 0x1e, 0xec, 0xa7, 0xa0, 0xc5, 0xcd, 0xaa, + 0xe2, 0x0f, 0x7b, 0x09, 0x16, 0x78, 0xf6, 0xda, 0x26, 0x27, 0x0f, 0x69, 0x2b, 0xfc, 0xb6, 0x05, + 0x8b, 0xa9, 0x8a, 0x24, 0x4d, 0x84, 0x9b, 0x03, 0xa6, 0x8d, 0x60, 0x02, 0x31, 0xe4, 0x2d, 0x2d, + 0xbf, 0x94, 0x04, 0xc9, 0x56, 0x30, 0x9a, 0xd7, 0x2c, 0xc5, 0x14, 0x27, 0xe5, 0x55, 0xd9, 0xcb, + 0x3c, 0xc7, 0x0e, 0xb3, 0xf1, 0x8c, 0x81, 0x1f, 0xf3, 0xac, 0x38, 0xbd, 0x22, 0x39, 0x6e, 0x34, + 0x87, 0x2c, 0x8b, 0xcc, 0xc8, 0x37, 0x4c, 0x0f, 0x73, 0xbc, 0xb9, 0x75, 0xf6, 0xef, 0x16, 0x80, + 0x7c, 0x65, 0x44, 0xc3, 0x73, 0xcc, 0x05, 0x51, 0x31, 0xc8, 0xe5, 0x74, 0x84, 0x6d, 0x72, 0x38, + 0x3a, 0x7a, 0x97, 0x9e, 0xcb, 0xec, 0xa4, 0x42, 0x92, 0x9d, 0x94, 0x97, 0x21, 0x54, 0xba, 0x38, + 0x43, 0xa8, 0x7c, 0x51, 0x86, 0xd0, 0xa7, 0x60, 0xda, 0xeb, 0xf9, 0x01, 0xe3, 0x79, 0xa6, 0xb5, + 0xa3, 0xe6, 0xe4, 0x4a, 0x91, 0x79, 0xba, 0x02, 0xb8, 0xcf, 0x60, 0xe4, 0x0b, 0x09, 0x12, 0xed, + 0xf6, 0x30, 0xdb, 0x4c, 0x97, 0x02, 0x3b, 0xdd, 0x1e, 0xdd, 0x0b, 0x3a, 0x6e, 0x1c, 0x84, 0xea, + 0x43, 0x06, 0x8b, 0x98, 0x4b, 0x1f, 0x05, 0x23, 0x66, 0xc3, 0xc8, 0x79, 0xf2, 0x98, 0x4c, 0x9d, + 0x43, 0x0f, 0x70, 0xb6, 0x22, 0x27, 0xe6, 0x7d, 0xa8, 0x69, 0x0d, 0x61, 0x42, 0x92, 0xb0, 0x12, + 0x84, 0xcb, 0x57, 0xe2, 0x46, 0xb9, 0x4f, 0xfb, 0x0f, 0xba, 0xe4, 0x75, 0x98, 0xeb, 0x7a, 0x21, + 0xc5, 0xdc, 0xb2, 0x76, 0x48, 0x4f, 0x69, 0x18, 0x49, 0xe7, 0xb8, 0xa1, 0x2a, 0x1c, 0x0e, 0xb7, + 0xef, 0xc2, 0xbc, 0xb1, 0xfa, 0x8a, 0x38, 0x27, 0x31, 0x29, 0x47, 0xc6, 0xd7, 0xcc, 0x84, 0x1d, + 0x51, 0x67, 0xff, 0x5c, 0x01, 0x8a, 0xbb, 0xc1, 0x50, 0x3f, 0x45, 0xb0, 0xcc, 0x53, 0x04, 0x61, + 0xe5, 0xb4, 0x95, 0x11, 0x23, 0x94, 0x9f, 0x01, 0x24, 0x6b, 0x30, 0xe3, 0x0e, 0xe2, 0x76, 0x1c, + 0x30, 0xab, 0xee, 0xcc, 0x0d, 0xbb, 0x9c, 0x62, 0x31, 0xb0, 0x94, 0xaa, 0x21, 0x0b, 0x50, 0x54, + 0xe6, 0x00, 0x22, 0xb0, 0x22, 0x73, 0x29, 0xf0, 0x34, 0xf3, 0x5c, 0x04, 0xc7, 0x44, 0x89, 0x31, + 0x84, 0xf9, 0x3d, 0xf7, 0xe7, 0xb8, 0x50, 0xcf, 0xab, 0x62, 0x16, 0x17, 0xa3, 0x11, 0x44, 0x13, + 0xa1, 0x54, 0x59, 0xd6, 0xc3, 0xbe, 0x15, 0xf3, 0x6c, 0xf7, 0x9f, 0x2c, 0x28, 0xe3, 0xda, 0x30, + 0x05, 0xc5, 0x39, 0x58, 0x1d, 0x24, 0xe0, 0x9a, 0x4c, 0x3b, 0x69, 0x30, 0xb1, 0x8d, 0x2c, 0xc5, + 0x82, 0x9a, 0x90, 0x9e, 0xa9, 0xb8, 0x02, 0x55, 0x5e, 0x52, 0x19, 0x79, 0x88, 0x92, 0x00, 0xc9, + 0x55, 0x28, 0x9d, 0x04, 0x43, 0x69, 0x51, 0x83, 0x3c, 0x93, 0x0b, 0x86, 0x0e, 0xc2, 0x93, 0xf1, + 0xb0, 0xf6, 0xf8, 0xb4, 0xb8, 0x9d, 0x94, 0x06, 0x33, 0x4b, 0x51, 0x35, 0xab, 0x2f, 0x53, 0x0a, + 0x6a, 0xaf, 0xc1, 0x2c, 0xa3, 0x7d, 0x2d, 0xb0, 0x3a, 0x96, 0x5b, 0xed, 0x9f, 0xb2, 0xa0, 0x22, + 0x91, 0xc9, 0x2a, 0x94, 0x18, 0x23, 0xa5, 0x7c, 0x53, 0x75, 0x16, 0xcf, 0xf0, 0x1c, 0xc4, 0x60, + 0xf6, 0x02, 0xc6, 0xbb, 0x12, 0x57, 0x48, 0x46, 0xbb, 0x12, 0x4b, 0x5f, 0x0d, 0x37, 0x65, 0x20, + 0xa7, 0xa0, 0xf6, 0xf7, 0x2c, 0x98, 0x36, 0xfa, 0x20, 0x2b, 0x50, 0xeb, 0xbb, 0x51, 0x2c, 0xce, + 0x37, 0xc5, 0xf6, 0xe8, 0x20, 0x7d, 0xa3, 0x0b, 0x66, 0x7c, 0x5f, 0x05, 0x81, 0x8b, 0x7a, 0x10, + 0xf8, 0x16, 0x54, 0x93, 0x5c, 0xd2, 0x92, 0x21, 0x01, 0x58, 0x8f, 0x32, 0xcb, 0x20, 0x41, 0xc2, + 0xb8, 0x62, 0xd0, 0x0f, 0x42, 0x71, 0x18, 0xc6, 0x0b, 0xf6, 0x5d, 0xa8, 0x69, 0xf8, 0x7a, 0x98, + 0xd1, 0x32, 0xc2, 0x8c, 0x2a, 0x05, 0xa7, 0x90, 0xa4, 0xe0, 0xd8, 0xff, 0x62, 0xc1, 0x34, 0xa3, + 0x41, 0xcf, 0xef, 0x1d, 0x04, 0x7d, 0xaf, 0x73, 0x8e, 0x7b, 0x2f, 0xc9, 0x4d, 0x08, 0x46, 0x49, + 0x8b, 0x26, 0x98, 0x51, 0xbd, 0x0c, 0x6e, 0x08, 0x16, 0x55, 0x65, 0xc6, 0xc3, 0x8c, 0x03, 0x8e, + 0xdc, 0x48, 0xb0, 0x85, 0x30, 0xcc, 0x0c, 0x20, 0xe3, 0x34, 0x06, 0xc0, 0x84, 0xaa, 0x81, 0xd7, + 0xef, 0x7b, 0x1c, 0x97, 0x9b, 0xed, 0x79, 0x55, 0xac, 0xcf, 0xae, 0x17, 0xb9, 0x47, 0xc9, 0x01, + 0x8f, 0x2a, 0x63, 0x04, 0xc6, 0x7d, 0xa6, 0x45, 0x60, 0x26, 0x51, 0xae, 0x98, 0x40, 0xfb, 0xcf, + 0x0a, 0x50, 0x93, 0x56, 0x40, 0xb7, 0x47, 0xc5, 0x99, 0xa5, 0x29, 0x18, 0x35, 0x88, 0xac, 0x37, + 0x1c, 0x2e, 0x0d, 0x92, 0x26, 0x8c, 0x62, 0x96, 0x30, 0xae, 0x40, 0x95, 0x11, 0xe8, 0x9b, 0xe8, + 0xd9, 0x89, 0xf4, 0x6c, 0x05, 0x90, 0xb5, 0xb7, 0xb1, 0xb6, 0x9c, 0xd4, 0x22, 0xe0, 0x85, 0x27, + 0x9c, 0x77, 0xa0, 0x2e, 0x9a, 0xc1, 0x9d, 0x43, 0xc9, 0x93, 0xb0, 0x88, 0xb1, 0xab, 0x8e, 0x81, + 0x29, 0xbf, 0xbc, 0x2d, 0xbf, 0xac, 0x5c, 0xf4, 0xa5, 0xc4, 0xb4, 0xef, 0xab, 0x83, 0xe3, 0xfb, + 0xa1, 0x3b, 0x3c, 0x91, 0xbc, 0x7c, 0x0b, 0xe6, 0x3d, 0xbf, 0xd3, 0x1f, 0x75, 0x69, 0x7b, 0xe4, + 0xbb, 0xbe, 0x1f, 0x8c, 0xfc, 0x0e, 0x95, 0x39, 0x38, 0x79, 0x55, 0x76, 0x57, 0x65, 0x6c, 0x62, + 0x43, 0x64, 0x0d, 0xca, 0x5c, 0x61, 0x72, 0xdd, 0x91, 0xcf, 0xe8, 0x1c, 0x85, 0xac, 0x42, 0x99, + 0xeb, 0xcd, 0x82, 0xc1, 0x35, 0xda, 0xae, 0x3a, 0x1c, 0x81, 0x89, 0x1d, 0x4c, 0xc8, 0x35, 0xc5, + 0x8e, 0xa9, 0x77, 0x26, 0x3b, 0x98, 0xb2, 0x6b, 0x2f, 0x00, 0xd9, 0xe7, 0x9c, 0xa2, 0x1f, 0xff, + 0x7c, 0xbf, 0x08, 0x35, 0x0d, 0xcc, 0x24, 0x48, 0x8f, 0x0d, 0xb8, 0xdd, 0xf5, 0xdc, 0x01, 0x8d, + 0x69, 0x28, 0xb8, 0x23, 0x05, 0x65, 0x78, 0xee, 0x69, 0xaf, 0x1d, 0x8c, 0xe2, 0x76, 0x97, 0xf6, + 0x42, 0xca, 0xb5, 0x29, 0x53, 0x4d, 0x06, 0x94, 0xe1, 0x31, 0xfa, 0xd4, 0xf0, 0x38, 0x05, 0xa5, + 0xa0, 0xf2, 0x30, 0x87, 0xaf, 0x51, 0x29, 0x39, 0xcc, 0xe1, 0x2b, 0x92, 0x96, 0x7d, 0xe5, 0x1c, + 0xd9, 0xf7, 0x16, 0x2c, 0x71, 0x29, 0x27, 0xe4, 0x41, 0x3b, 0x45, 0x58, 0x63, 0x6a, 0xc9, 0x1a, + 0x34, 0xd8, 0x98, 0x25, 0x4b, 0x44, 0xde, 0x37, 0x79, 0x60, 0xd4, 0x72, 0x32, 0x70, 0x86, 0x8b, + 0x11, 0x4a, 0x1d, 0x97, 0x9f, 0xa8, 0x67, 0xe0, 0x88, 0xeb, 0x3e, 0x33, 0x71, 0xab, 0x02, 0x37, + 0x05, 0x27, 0x77, 0x60, 0x79, 0x40, 0xbb, 0x9e, 0x6b, 0x36, 0x81, 0x41, 0x5e, 0x9e, 0x36, 0x33, + 0xae, 0xda, 0x9e, 0x86, 0xda, 0x61, 0x1c, 0x0c, 0xe5, 0x76, 0xce, 0x40, 0x9d, 0x17, 0x45, 0x16, + 0xd5, 0x65, 0xb8, 0x84, 0xf4, 0xf7, 0x28, 0x18, 0x06, 0xfd, 0xa0, 0x77, 0x6e, 0xf8, 0x55, 0x7f, + 0x69, 0xc1, 0xbc, 0x51, 0x9b, 0x38, 0x56, 0x18, 0x92, 0x91, 0xe9, 0x2f, 0x9c, 0x64, 0xe7, 0x34, + 0xe1, 0xcd, 0x11, 0x79, 0xf4, 0xfb, 0xb1, 0xc8, 0x88, 0xd9, 0x48, 0x6e, 0xbd, 0xc8, 0x0f, 0x39, + 0xfd, 0x36, 0xb3, 0xf4, 0x2b, 0xbe, 0x97, 0x97, 0x5e, 0x64, 0x13, 0x5f, 0x12, 0x39, 0x0d, 0xdc, + 0xcf, 0x92, 0x11, 0x38, 0xe5, 0x99, 0xe9, 0x7e, 0xb8, 0x1c, 0x41, 0x47, 0x01, 0x23, 0xfb, 0x17, + 0x2d, 0x80, 0x64, 0x74, 0x78, 0x12, 0xae, 0x14, 0x10, 0xbf, 0x61, 0xa5, 0x29, 0x9b, 0xd7, 0xa0, + 0xae, 0x0e, 0x33, 0x13, 0x9d, 0x56, 0x93, 0x30, 0x66, 0x56, 0xdf, 0x80, 0xd9, 0x5e, 0x3f, 0x38, + 0x42, 0x83, 0x00, 0xd3, 0xf2, 0x22, 0x91, 0x4b, 0x36, 0xc3, 0xc1, 0xf7, 0x04, 0x34, 0x51, 0x80, + 0x25, 0x4d, 0x01, 0xda, 0xbf, 0x54, 0x50, 0x67, 0x4f, 0xc9, 0x9c, 0xc7, 0xf2, 0x27, 0xb9, 0x9d, + 0x11, 0xc4, 0x63, 0x8e, 0x7a, 0xd0, 0xac, 0x3d, 0xb8, 0x30, 0x14, 0x76, 0x17, 0x66, 0x42, 0x2e, + 0xe9, 0xa4, 0x18, 0x2c, 0xbd, 0x40, 0x0c, 0x4e, 0x87, 0x86, 0x96, 0xfc, 0x0c, 0x34, 0xdc, 0xee, + 0x29, 0x0d, 0x63, 0x0f, 0x83, 0x11, 0x68, 0xa2, 0x70, 0xe1, 0x3d, 0xab, 0xc1, 0xd1, 0x72, 0xb8, + 0x01, 0xb3, 0x22, 0x7f, 0x4f, 0x61, 0x8a, 0x5b, 0x0b, 0x09, 0x98, 0x21, 0xda, 0xdf, 0x95, 0xc7, + 0x5c, 0xe6, 0x1e, 0x8e, 0x5f, 0x11, 0x7d, 0x76, 0x85, 0xd4, 0xec, 0x3e, 0x25, 0x8e, 0x9c, 0xba, + 0x32, 0xe2, 0x51, 0xd4, 0xf2, 0x5f, 0xba, 0xe2, 0x88, 0xd0, 0x5c, 0xd2, 0xd2, 0xcb, 0x2c, 0xa9, + 0xfd, 0x43, 0x0b, 0xa6, 0x76, 0x83, 0xe1, 0xae, 0xc8, 0x04, 0x42, 0x46, 0x50, 0x89, 0xb3, 0xb2, + 0xf8, 0x82, 0x1c, 0xa1, 0x5c, 0xcb, 0x60, 0x3a, 0x6d, 0x19, 0xfc, 0x6f, 0xb8, 0x8c, 0xf1, 0xb6, + 0x30, 0x18, 0x06, 0x21, 0x63, 0x46, 0xb7, 0xcf, 0xcd, 0x80, 0xc0, 0x8f, 0x4f, 0xa4, 0x00, 0x7c, + 0x11, 0x0a, 0x3a, 0xc1, 0xcc, 0xb7, 0xe3, 0x46, 0xbd, 0xb0, 0x64, 0xb8, 0x5c, 0xcc, 0x56, 0xd8, + 0x5f, 0x84, 0x2a, 0x9a, 0xe2, 0x38, 0xad, 0x37, 0xa0, 0x7a, 0x12, 0x0c, 0xdb, 0x27, 0x9e, 0x1f, + 0x4b, 0xe6, 0x9e, 0x49, 0x6c, 0xe4, 0x5d, 0x5c, 0x10, 0x85, 0x60, 0xff, 0xda, 0x24, 0x4c, 0x3d, + 0xf0, 0x4f, 0x03, 0xaf, 0x83, 0x47, 0x6a, 0x03, 0x3a, 0x08, 0x64, 0x1a, 0x31, 0xfb, 0x4f, 0xae, + 0xc0, 0x14, 0xe6, 0xcd, 0x0d, 0x39, 0xd1, 0xd6, 0xf9, 0xd1, 0xb7, 0x00, 0x31, 0xf3, 0x22, 0x4c, + 0x2e, 0x73, 0x70, 0xf6, 0xd1, 0x20, 0xcc, 0x49, 0x09, 0xf5, 0xcb, 0x18, 0xa2, 0x94, 0xa4, 0x69, + 0x97, 0xb5, 0x34, 0x6d, 0xd6, 0x97, 0xc8, 0x5c, 0xe2, 0xa9, 0x2d, 0xbc, 0x2f, 0x01, 0x42, 0xc7, + 0x2a, 0xa4, 0x3c, 0x5e, 0x8a, 0xc6, 0xca, 0x94, 0x70, 0xac, 0x74, 0x20, 0x33, 0x68, 0xf8, 0x07, + 0x1c, 0x87, 0x8b, 0x6f, 0x1d, 0xc4, 0x4c, 0xc4, 0xf4, 0x3d, 0x9c, 0x2a, 0xa7, 0xfd, 0x14, 0x98, + 0xc9, 0xf8, 0x2e, 0x55, 0x02, 0x95, 0xcf, 0x03, 0xf8, 0x85, 0x95, 0x34, 0x5c, 0x73, 0xc7, 0x78, + 0x8a, 0xa3, 0x74, 0xc7, 0x18, 0xc1, 0xb8, 0xfd, 0xfe, 0x91, 0xdb, 0x79, 0x8a, 0xd7, 0xac, 0xf0, + 0x90, 0xab, 0xea, 0x98, 0x40, 0xcc, 0x3f, 0x4a, 0x76, 0x15, 0x93, 0x04, 0x4a, 0x8e, 0x0e, 0x22, + 0xb7, 0xa1, 0x86, 0x2e, 0xa8, 0xd8, 0xd7, 0x19, 0xdc, 0xd7, 0x86, 0xee, 0xa3, 0xe2, 0xce, 0xea, + 0x48, 0xfa, 0x71, 0xdf, 0x6c, 0x26, 0xe9, 0xd0, 0xed, 0x76, 0xc5, 0x29, 0x69, 0x83, 0xbb, 0xd3, + 0x0a, 0xc0, 0xf4, 0xb1, 0x58, 0x30, 0x8e, 0x30, 0x87, 0x08, 0x06, 0x8c, 0x5c, 0x85, 0x0a, 0x73, + 0x8f, 0x86, 0xae, 0xd7, 0xc5, 0xac, 0x45, 0xee, 0xa5, 0x29, 0x18, 0x6b, 0x43, 0xfe, 0x47, 0x45, + 0x37, 0x8f, 0xab, 0x62, 0xc0, 0xd8, 0xda, 0xa8, 0x32, 0x32, 0xd3, 0x02, 0xdf, 0x51, 0x03, 0x48, + 0xde, 0xc4, 0xb3, 0xaa, 0x98, 0x36, 0x17, 0x31, 0x16, 0x76, 0x59, 0xcc, 0x59, 0x10, 0xad, 0xfc, + 0x3d, 0x64, 0x28, 0x0e, 0xc7, 0xb4, 0x37, 0xa0, 0xae, 0x83, 0x49, 0x05, 0x4a, 0x0f, 0x0f, 0x76, + 0xf6, 0x1b, 0x13, 0xa4, 0x06, 0x53, 0x87, 0x3b, 0x8f, 0x1e, 0xed, 0xed, 0x6c, 0x37, 0x2c, 0x52, + 0x87, 0x8a, 0x4a, 0x16, 0x2b, 0xb0, 0xd2, 0xc6, 0xd6, 0xd6, 0xce, 0xc1, 0xa3, 0x9d, 0xed, 0x46, + 0xd1, 0x8e, 0x81, 0x6c, 0x74, 0xbb, 0xa2, 0x15, 0x15, 0x24, 0x48, 0xe8, 0xd9, 0x32, 0xe8, 0x39, + 0x87, 0xa6, 0x0a, 0xf9, 0x34, 0xf5, 0xc2, 0x95, 0xb7, 0x77, 0xa0, 0x76, 0xa0, 0xdd, 0x39, 0x42, + 0xf6, 0x92, 0xb7, 0x8d, 0x04, 0x5b, 0x6a, 0x10, 0x6d, 0x38, 0x05, 0x7d, 0x38, 0xf6, 0xef, 0x59, + 0x3c, 0xf9, 0x5f, 0x0d, 0x9f, 0xf7, 0x6d, 0x43, 0x5d, 0x05, 0xa4, 0x92, 0x3c, 0x50, 0x03, 0xc6, + 0x70, 0x70, 0x28, 0xed, 0xe0, 0xf8, 0x38, 0xa2, 0x32, 0x6b, 0xcb, 0x80, 0x31, 0xbe, 0x60, 0xb6, + 0x19, 0xb3, 0x73, 0x3c, 0xde, 0x43, 0x24, 0xb2, 0xb7, 0x32, 0x70, 0x26, 0xe5, 0x45, 0x40, 0x46, + 0xe6, 0xab, 0xa9, 0xb2, 0x4a, 0x57, 0x4d, 0xaf, 0xf2, 0x1a, 0x54, 0x54, 0xbb, 0xa6, 0x00, 0x93, + 0x98, 0xaa, 0x9e, 0x09, 0x4a, 0xf4, 0x56, 0x8c, 0x41, 0x73, 0xa1, 0x9d, 0xad, 0x20, 0x37, 0x81, + 0x1c, 0x7b, 0x61, 0x1a, 0xbd, 0x88, 0xe8, 0x39, 0x35, 0xf6, 0x13, 0x98, 0x97, 0x84, 0xa4, 0x99, + 0x56, 0xe6, 0x26, 0x5a, 0x17, 0xb1, 0x4f, 0x21, 0xcb, 0x3e, 0xf6, 0x7f, 0x58, 0x30, 0x25, 0x76, + 0x3a, 0x73, 0x6f, 0x8d, 0xef, 0xb3, 0x01, 0x23, 0x4d, 0xe3, 0x5e, 0x0b, 0xf2, 0x9a, 0x10, 0x9a, + 0x19, 0xb1, 0x58, 0xcc, 0x13, 0x8b, 0x04, 0x4a, 0x43, 0x37, 0x3e, 0x41, 0x4f, 0xbd, 0xea, 0xe0, + 0x7f, 0xd2, 0xe0, 0x71, 0x25, 0x2e, 0x82, 0x31, 0xa6, 0x94, 0x77, 0x43, 0x8f, 0x6b, 0xfb, 0xec, + 0x0d, 0xbd, 0x2b, 0x50, 0xc5, 0x01, 0xb4, 0x93, 0xb0, 0x51, 0x02, 0x60, 0x94, 0xcb, 0x0b, 0xc8, + 0xd7, 0x22, 0xc5, 0x3c, 0x81, 0xd8, 0x8b, 0x7c, 0xe7, 0xc5, 0x12, 0xa8, 0x73, 0x66, 0x91, 0x1e, + 0x9c, 0x80, 0x13, 0x8a, 0x10, 0x03, 0x48, 0x53, 0x84, 0x40, 0x75, 0x54, 0xbd, 0xdd, 0x82, 0xe6, + 0x36, 0xed, 0xd3, 0x98, 0x6e, 0xf4, 0xfb, 0xe9, 0xf6, 0x2f, 0xc3, 0xa5, 0x9c, 0x3a, 0x61, 0x4d, + 0x7f, 0x05, 0x16, 0x37, 0x78, 0x2a, 0xe5, 0x4f, 0x2a, 0x53, 0xc7, 0x6e, 0xc2, 0x52, 0xba, 0x49, + 0xd1, 0xd9, 0x3d, 0x98, 0xdb, 0xa6, 0x47, 0xa3, 0xde, 0x1e, 0x3d, 0x4d, 0x3a, 0x22, 0x50, 0x8a, + 0x4e, 0x82, 0x33, 0xc1, 0x98, 0xf8, 0x9f, 0xbc, 0x02, 0xd0, 0x67, 0x38, 0xed, 0x68, 0x48, 0x3b, + 0xf2, 0x2a, 0x09, 0x42, 0x0e, 0x87, 0xb4, 0x63, 0xbf, 0x05, 0x44, 0x6f, 0x47, 0xac, 0x17, 0xd3, + 0x82, 0xa3, 0xa3, 0x76, 0x74, 0x1e, 0xc5, 0x74, 0x20, 0xef, 0xc8, 0xe8, 0x20, 0xfb, 0x06, 0xd4, + 0x0f, 0xdc, 0x73, 0x87, 0x7e, 0x24, 0xae, 0x2b, 0x2e, 0xc3, 0xd4, 0xd0, 0x3d, 0x67, 0x62, 0x4a, + 0xc5, 0xb3, 0xb0, 0xda, 0xfe, 0xb7, 0x02, 0x4c, 0x72, 0x4c, 0xd6, 0x6a, 0x97, 0x46, 0xb1, 0xe7, + 0x23, 0x61, 0xc9, 0x56, 0x35, 0x50, 0x86, 0x94, 0x0b, 0x39, 0xa4, 0x2c, 0xbc, 0x3d, 0x99, 0x96, + 0x2f, 0xe8, 0xd5, 0x80, 0x31, 0xe2, 0x4a, 0x52, 0xe6, 0x78, 0x40, 0x25, 0x01, 0xa4, 0x42, 0x9f, + 0x89, 0xae, 0xe5, 0xe3, 0x93, 0x5c, 0x2a, 0x28, 0x57, 0x07, 0xe5, 0x6a, 0xf4, 0x29, 0x4e, 0xe0, + 0x19, 0x8d, 0x9e, 0xd1, 0xdc, 0x95, 0x97, 0xd0, 0xdc, 0xdc, 0x05, 0x7c, 0x91, 0xe6, 0x86, 0x97, + 0xd0, 0xdc, 0x36, 0x81, 0x06, 0xde, 0xf7, 0x63, 0xb6, 0xa1, 0xa4, 0xdd, 0x6f, 0x5b, 0xd0, 0x10, + 0x54, 0xa4, 0xea, 0xc8, 0x6b, 0x86, 0x0d, 0x9c, 0x9b, 0xf0, 0x7e, 0x0d, 0xa6, 0xd1, 0x32, 0x55, + 0x31, 0x5e, 0x11, 0x90, 0x36, 0x80, 0x6c, 0x1e, 0xf2, 0x88, 0x78, 0xe0, 0xf5, 0xc5, 0xa6, 0xe8, + 0x20, 0x19, 0x26, 0x0e, 0x5d, 0x91, 0x3a, 0x66, 0x39, 0xaa, 0x6c, 0xff, 0xb9, 0x05, 0x73, 0xda, + 0x80, 0x05, 0x15, 0xde, 0x05, 0xc9, 0x0d, 0x3c, 0xe0, 0xcb, 0x39, 0x77, 0xd9, 0x64, 0x9b, 0xe4, + 0x33, 0x03, 0x19, 0x37, 0xd3, 0x3d, 0xc7, 0x01, 0x46, 0xa3, 0x81, 0x10, 0xa2, 0x3a, 0x88, 0x11, + 0xd2, 0x19, 0xa5, 0x4f, 0x15, 0x0a, 0x17, 0xe3, 0x06, 0x0c, 0xa3, 0x6a, 0xcc, 0xa2, 0x56, 0x48, + 0x25, 0x11, 0x55, 0xd3, 0x81, 0xf6, 0xdf, 0x58, 0x30, 0xcf, 0x5d, 0x23, 0xe1, 0x78, 0xaa, 0x9b, + 0x4d, 0x93, 0xdc, 0x17, 0xe4, 0x1c, 0xb9, 0x3b, 0xe1, 0x88, 0x32, 0xf9, 0xfc, 0x4b, 0xba, 0x73, + 0x2a, 0x9f, 0x6d, 0xcc, 0x5e, 0x14, 0xf3, 0xf6, 0xe2, 0x05, 0x2b, 0x9d, 0x17, 0xe0, 0x2c, 0xe7, + 0x06, 0x38, 0x37, 0xa7, 0xa0, 0x1c, 0x75, 0x82, 0x21, 0xb5, 0x97, 0x60, 0xc1, 0x9c, 0x9c, 0x10, + 0x41, 0xdf, 0xb1, 0xa0, 0x79, 0x8f, 0x1f, 0x04, 0x78, 0x7e, 0x6f, 0xd7, 0x8b, 0xe2, 0x20, 0x54, + 0x17, 0x40, 0xaf, 0x02, 0x44, 0xb1, 0x1b, 0xc6, 0x3c, 0x55, 0x5a, 0x04, 0x16, 0x13, 0x08, 0x1b, + 0x23, 0xf5, 0xbb, 0xbc, 0x96, 0xef, 0x8d, 0x2a, 0x67, 0x6c, 0x08, 0xe1, 0xbc, 0x19, 0x9a, 0xf8, + 0x3a, 0xcf, 0xef, 0x64, 0xb6, 0x02, 0x3d, 0x45, 0xb9, 0xce, 0xbd, 0xa2, 0x14, 0xd4, 0xfe, 0x6b, + 0x0b, 0x66, 0x93, 0x41, 0xe2, 0xc9, 0xa7, 0x29, 0x1d, 0x84, 0xfa, 0x4d, 0xa4, 0x83, 0x0c, 0x79, + 0x7a, 0x4c, 0x1f, 0x8b, 0xb1, 0x69, 0x10, 0xe4, 0x58, 0x51, 0x0a, 0x46, 0xd2, 0xc0, 0xd1, 0x41, + 0x3c, 0x5b, 0x8b, 0x59, 0x02, 0xc2, 0xaa, 0x11, 0x25, 0xcc, 0x74, 0x1f, 0xc4, 0xf8, 0x15, 0x0f, + 0xce, 0xca, 0xa2, 0x54, 0xa5, 0x53, 0x08, 0x45, 0x55, 0xaa, 0x1f, 0xaa, 0x54, 0xf8, 0xfa, 0xc8, + 0xb2, 0xfd, 0xcb, 0x16, 0x5c, 0xca, 0x59, 0x78, 0xc1, 0x35, 0xdb, 0x30, 0x77, 0xac, 0x2a, 0xe5, + 0xe2, 0x70, 0xd6, 0x59, 0x92, 0x47, 0x77, 0xe6, 0x82, 0x38, 0xd9, 0x0f, 0x94, 0x5d, 0xc4, 0x97, + 0xdb, 0xc8, 0x87, 0xcc, 0x56, 0xd8, 0x07, 0xd0, 0xda, 0x79, 0xc6, 0x98, 0x70, 0x4b, 0x7f, 0xa7, + 0x44, 0xd2, 0xc2, 0xed, 0x8c, 0x90, 0xb9, 0xd8, 0xd1, 0x3e, 0x86, 0x69, 0xa3, 0x2d, 0xf2, 0xd9, + 0x97, 0x6d, 0x24, 0x15, 0x9e, 0xc6, 0x12, 0x7f, 0x68, 0x45, 0x66, 0x65, 0x6a, 0x20, 0xfb, 0x14, + 0x66, 0xdf, 0x1b, 0xf5, 0x63, 0x2f, 0x79, 0x74, 0x85, 0x7c, 0x5e, 0x7c, 0x84, 0x4d, 0xc8, 0xa5, + 0xcb, 0xed, 0x4a, 0xc7, 0x63, 0x2b, 0x36, 0x60, 0x2d, 0xb5, 0xb3, 0x3d, 0x66, 0x2b, 0xec, 0x4b, + 0xb0, 0x9c, 0x74, 0xc9, 0xd7, 0x4e, 0x0a, 0xea, 0xef, 0x5a, 0x3c, 0xa1, 0xc1, 0x7c, 0x03, 0x86, + 0xdc, 0x87, 0xf9, 0xc8, 0xf3, 0x7b, 0x7d, 0xaa, 0xb7, 0x13, 0x89, 0x95, 0x58, 0x34, 0x87, 0x27, + 0xde, 0x89, 0x71, 0xf2, 0xbe, 0x60, 0x04, 0x92, 0x3f, 0xd0, 0x84, 0x40, 0x52, 0x4b, 0x92, 0x37, + 0x81, 0x77, 0x60, 0xc6, 0xec, 0x8c, 0xdc, 0x11, 0x09, 0x95, 0xc9, 0xc8, 0xf4, 0x58, 0xb6, 0x49, + 0x19, 0x06, 0xa6, 0xfd, 0x2d, 0x0b, 0x9a, 0x0e, 0x65, 0x64, 0x4c, 0xb5, 0x4e, 0x05, 0xf5, 0xdc, + 0xcd, 0x34, 0x3b, 0x7e, 0xc2, 0x2a, 0x51, 0x53, 0xce, 0xf5, 0xe6, 0xd8, 0x4d, 0xd9, 0x9d, 0xc8, + 0x99, 0xd5, 0x66, 0x05, 0x26, 0xc5, 0xfc, 0x96, 0x61, 0x51, 0x0c, 0x49, 0x0e, 0x27, 0x09, 0x9a, + 0x1a, 0x9d, 0x1a, 0x41, 0xd3, 0x16, 0x34, 0xf9, 0xcd, 0x5c, 0x7d, 0x1e, 0xfc, 0xc3, 0xb5, 0xe7, + 0x50, 0xd3, 0xee, 0x27, 0x93, 0x65, 0x98, 0x7f, 0xf2, 0xe0, 0xd1, 0xfe, 0xce, 0xe1, 0x61, 0xfb, + 0xe0, 0xf1, 0xe6, 0xbb, 0x3b, 0xef, 0xb7, 0x77, 0x37, 0x0e, 0x77, 0x1b, 0x13, 0x64, 0x09, 0xc8, + 0xfe, 0xce, 0xe1, 0xa3, 0x9d, 0x6d, 0x03, 0x6e, 0x91, 0xab, 0xd0, 0x7a, 0xbc, 0xff, 0xf8, 0x70, + 0x67, 0xbb, 0x9d, 0xf7, 0x5d, 0x81, 0xbc, 0x02, 0x97, 0x44, 0x7d, 0xce, 0xe7, 0xc5, 0xdb, 0xdf, + 0x2a, 0xc2, 0x0c, 0xcf, 0xab, 0xe0, 0x4f, 0x07, 0xd1, 0x90, 0xbc, 0x07, 0x53, 0xe2, 0x0d, 0x2a, + 0x22, 0xd7, 0xd3, 0x7c, 0xf5, 0xaa, 0xb5, 0x94, 0x06, 0x8b, 0x45, 0x98, 0xff, 0xe9, 0x1f, 0xfe, + 0xe3, 0xaf, 0x16, 0xa6, 0x49, 0x6d, 0xfd, 0xf4, 0xcd, 0xf5, 0x1e, 0xf5, 0x23, 0xd6, 0xc6, 0xd7, + 0x01, 0x92, 0x97, 0x95, 0x48, 0x53, 0xf9, 0x5c, 0xa9, 0x67, 0xa7, 0x5a, 0x97, 0x72, 0x6a, 0x44, + 0xbb, 0x97, 0xb0, 0xdd, 0x79, 0x7b, 0x86, 0xb5, 0xeb, 0xf9, 0x5e, 0xcc, 0x5f, 0x59, 0x7a, 0xdb, + 0x5a, 0x23, 0x5d, 0xa8, 0xeb, 0x6f, 0x1e, 0x11, 0x19, 0xf8, 0xcd, 0x79, 0xb5, 0xa9, 0x75, 0x39, + 0xb7, 0x4e, 0x6e, 0x20, 0xf6, 0xb1, 0x68, 0x37, 0x58, 0x1f, 0x23, 0xc4, 0x48, 0x7a, 0xe9, 0x73, + 0xb2, 0x4e, 0x9e, 0x36, 0x22, 0x57, 0x34, 0x4a, 0xcb, 0x3c, 0xac, 0xd4, 0x7a, 0x65, 0x4c, 0xad, + 0xe8, 0xeb, 0x15, 0xec, 0x6b, 0xd9, 0x26, 0xac, 0xaf, 0x0e, 0xe2, 0xc8, 0x87, 0x95, 0xde, 0xb6, + 0xd6, 0x6e, 0xff, 0xfa, 0x75, 0xa8, 0xaa, 0x43, 0x1e, 0xf2, 0x21, 0x4c, 0x1b, 0x89, 0x2f, 0x44, + 0x4e, 0x23, 0x2f, 0x4f, 0xa6, 0x75, 0x25, 0xbf, 0x52, 0x74, 0x7c, 0x15, 0x3b, 0x6e, 0x92, 0x25, + 0xd6, 0xb1, 0xc8, 0x1c, 0x59, 0xc7, 0x14, 0x2e, 0x7e, 0x1f, 0xe3, 0xa9, 0xc6, 0xbe, 0xbc, 0xb3, + 0x2b, 0x69, 0x8e, 0x32, 0x7a, 0x7b, 0x65, 0x4c, 0xad, 0xe8, 0xee, 0x0a, 0x76, 0xb7, 0x44, 0x16, + 0xf4, 0xee, 0xd4, 0xe1, 0x0b, 0xc5, 0x4b, 0x44, 0xfa, 0xab, 0x40, 0xe4, 0x15, 0x45, 0x58, 0x79, + 0xaf, 0x05, 0x29, 0x12, 0xc9, 0x3e, 0x19, 0x64, 0x37, 0xb1, 0x2b, 0x42, 0x70, 0xfb, 0xf4, 0x47, + 0x81, 0xc8, 0x11, 0xd4, 0xb4, 0xd7, 0x2e, 0xc8, 0xa5, 0xb1, 0x2f, 0x73, 0xb4, 0x5a, 0x79, 0x55, + 0x79, 0x53, 0xd1, 0xdb, 0x5f, 0x67, 0x7a, 0xf9, 0x6b, 0x50, 0x55, 0xef, 0x27, 0x90, 0x65, 0xed, + 0x3d, 0x0b, 0xfd, 0xbd, 0x87, 0x56, 0x33, 0x5b, 0x91, 0x47, 0x7c, 0x7a, 0xeb, 0x8c, 0xf8, 0x9e, + 0x40, 0x4d, 0x7b, 0x23, 0x41, 0x4d, 0x20, 0xfb, 0x0e, 0x83, 0x9a, 0x40, 0xce, 0x93, 0x0a, 0xf6, + 0x1c, 0x76, 0x51, 0x23, 0x55, 0xa4, 0xef, 0xf8, 0x59, 0x10, 0x91, 0x3d, 0x58, 0x14, 0x62, 0xea, + 0x88, 0x7e, 0x92, 0x6d, 0xc8, 0x79, 0x88, 0xe9, 0x96, 0x45, 0xee, 0x42, 0x45, 0x3e, 0x85, 0x41, + 0x96, 0xf2, 0x9f, 0xf4, 0x68, 0x2d, 0x67, 0xe0, 0xc2, 0x3c, 0x79, 0x1f, 0x20, 0x79, 0x90, 0x41, + 0x09, 0x89, 0xcc, 0x03, 0x0f, 0x8a, 0x02, 0xb2, 0xaf, 0x37, 0xd8, 0x4b, 0x38, 0xc1, 0x06, 0x41, + 0x21, 0xe1, 0xd3, 0x33, 0x79, 0x5f, 0xf0, 0x1b, 0x50, 0xd3, 0xde, 0x64, 0x50, 0xcb, 0x97, 0x7d, + 0xcf, 0x41, 0x2d, 0x5f, 0xce, 0x13, 0x0e, 0x76, 0x0b, 0x5b, 0x5f, 0xb0, 0x67, 0x59, 0xeb, 0x91, + 0xd7, 0xf3, 0x07, 0x1c, 0x81, 0x6d, 0xd0, 0x09, 0x4c, 0x1b, 0x0f, 0x2f, 0x28, 0x0e, 0xcd, 0x7b, + 0xd6, 0x41, 0x71, 0x68, 0xee, 0x5b, 0x0d, 0x92, 0xce, 0xec, 0x39, 0xd6, 0xcf, 0x29, 0xa2, 0x68, + 0x3d, 0x7d, 0x00, 0x35, 0xed, 0x11, 0x05, 0x35, 0x97, 0xec, 0x7b, 0x0d, 0x6a, 0x2e, 0x79, 0x6f, + 0x2e, 0x2c, 0x60, 0x1f, 0x33, 0x36, 0x92, 0x02, 0xde, 0x7c, 0x63, 0x6d, 0x7f, 0x08, 0x33, 0xe6, + 0xb3, 0x0a, 0x8a, 0xf7, 0x73, 0x1f, 0x68, 0x50, 0xbc, 0x3f, 0xe6, 0x2d, 0x06, 0x41, 0xd2, 0x6b, + 0xf3, 0xaa, 0x93, 0xf5, 0x8f, 0x45, 0xf2, 0xc7, 0x73, 0xf2, 0x15, 0x26, 0xe0, 0xc4, 0x55, 0x44, + 0xb2, 0xac, 0x51, 0xad, 0x7e, 0x61, 0x51, 0xf1, 0x4b, 0xe6, 0xd6, 0xa2, 0x49, 0xcc, 0xfc, 0xee, + 0x1e, 0x6a, 0x2d, 0xbc, 0x92, 0xa8, 0x69, 0x2d, 0xfd, 0xd6, 0xa2, 0xa6, 0xb5, 0x8c, 0x9b, 0x8b, + 0x69, 0xad, 0x15, 0x7b, 0xac, 0x0d, 0x1f, 0x66, 0x53, 0xc9, 0xb9, 0x8a, 0x2b, 0xf2, 0x6f, 0x33, + 0xb4, 0xae, 0xbe, 0x38, 0xa7, 0xd7, 0x94, 0x20, 0x52, 0x08, 0xae, 0xcb, 0xbb, 0x23, 0xff, 0x17, + 0xea, 0xfa, 0x15, 0x76, 0xa2, 0xb3, 0x72, 0xba, 0xa7, 0xcb, 0xb9, 0x75, 0xe6, 0xe6, 0x92, 0xba, + 0xde, 0x0d, 0xf9, 0x2a, 0x2c, 0x29, 0x56, 0xd7, 0xf3, 0x3d, 0x23, 0xf2, 0x6a, 0x4e, 0x16, 0xa8, + 0x6e, 0xbc, 0xb4, 0x2e, 0x8d, 0x4d, 0x13, 0xbd, 0x65, 0x31, 0xa2, 0x31, 0xef, 0x06, 0x27, 0x0a, + 0x23, 0xef, 0x4a, 0x74, 0xa2, 0x30, 0x72, 0x2f, 0x14, 0x4b, 0xa2, 0x21, 0xf3, 0xc6, 0x1a, 0xf1, + 0xf3, 0x39, 0xf2, 0x01, 0xcc, 0x6a, 0x19, 0xf5, 0x87, 0xe7, 0x7e, 0x47, 0x31, 0x40, 0xf6, 0xea, + 0x55, 0x2b, 0xcf, 0x34, 0xb7, 0x97, 0xb1, 0xfd, 0x39, 0xdb, 0x58, 0x1c, 0x46, 0xfc, 0x5b, 0x50, + 0xd3, 0xb3, 0xf5, 0x5f, 0xd0, 0xee, 0xb2, 0x56, 0xa5, 0xdf, 0x1c, 0xba, 0x65, 0x91, 0xdf, 0xb4, + 0xa0, 0x6e, 0xe4, 0xbe, 0x1b, 0xa7, 0xd0, 0xa9, 0x76, 0x9a, 0x7a, 0x9d, 0xde, 0x90, 0xed, 0xe0, + 0x20, 0xf7, 0xd6, 0xde, 0x31, 0x16, 0xe1, 0x63, 0x23, 0xfe, 0x72, 0x33, 0xfd, 0xfc, 0xd6, 0xf3, + 0x34, 0x82, 0x7e, 0x3d, 0xed, 0xf9, 0x2d, 0x8b, 0x7c, 0xcf, 0x82, 0x19, 0x33, 0x6a, 0xa8, 0xb6, + 0x2a, 0x37, 0x3e, 0xa9, 0xb6, 0x6a, 0x4c, 0xa8, 0xf1, 0x03, 0x1c, 0xe5, 0xa3, 0x35, 0xc7, 0x18, + 0xa5, 0xb8, 0x35, 0xfe, 0xe3, 0x8d, 0x96, 0xbc, 0xcd, 0x5f, 0xdf, 0x93, 0xa1, 0x6c, 0xa2, 0x69, + 0x8d, 0xf4, 0xf6, 0xea, 0x2f, 0xc6, 0xad, 0x5a, 0xb7, 0x2c, 0xf2, 0x0d, 0xfe, 0xec, 0x94, 0xf8, + 0x16, 0xa9, 0xe4, 0x65, 0xbf, 0xb7, 0xaf, 0xe1, 0x9c, 0xae, 0xda, 0x97, 0x8c, 0x39, 0xa5, 0xf5, + 0xf1, 0x06, 0x1f, 0x9d, 0x78, 0xec, 0x2d, 0x51, 0x28, 0x99, 0x07, 0xe0, 0xc6, 0x0f, 0x72, 0xc0, + 0x07, 0x29, 0xd0, 0x0d, 0x52, 0x7e, 0xc9, 0x66, 0xec, 0x35, 0x1c, 0xeb, 0x35, 0xfb, 0xd5, 0xb1, + 0x63, 0x5d, 0xc7, 0xd8, 0x1f, 0x1b, 0xf1, 0x01, 0x40, 0x72, 0xec, 0x44, 0x52, 0xc7, 0x1e, 0x8a, + 0xc1, 0xb3, 0x27, 0x53, 0x26, 0xbf, 0xc8, 0xd3, 0x11, 0xd6, 0xe2, 0xd7, 0xb8, 0xb8, 0x7a, 0x20, + 0x0f, 0x4c, 0x74, 0xa3, 0xc4, 0x3c, 0x1f, 0x32, 0x8c, 0x92, 0x74, 0xfb, 0x86, 0xb0, 0x52, 0xa7, + 0x2f, 0x8f, 0x61, 0x7a, 0x2f, 0x08, 0x9e, 0x8e, 0x86, 0xea, 0x08, 0xd9, 0x0c, 0xcb, 0xef, 0xba, + 0xd1, 0x49, 0x2b, 0x35, 0x0b, 0x7b, 0x05, 0x9b, 0x6a, 0x91, 0xa6, 0xd6, 0xd4, 0xfa, 0xc7, 0xc9, + 0xb1, 0xd6, 0x73, 0xe2, 0xc2, 0x9c, 0x92, 0x81, 0x6a, 0xe0, 0x2d, 0xb3, 0x19, 0x43, 0xf2, 0xa5, + 0xbb, 0x30, 0xac, 0x67, 0x39, 0xda, 0xf5, 0x48, 0xb6, 0x79, 0xcb, 0x22, 0x07, 0x50, 0xdf, 0xa6, + 0x9d, 0xa0, 0x4b, 0x45, 0x6c, 0x7b, 0x3e, 0x19, 0xb8, 0x0a, 0x8a, 0xb7, 0xa6, 0x0d, 0xa0, 0xa9, + 0x17, 0x86, 0xee, 0x79, 0x48, 0x3f, 0x5a, 0xff, 0x58, 0x44, 0xcd, 0x9f, 0x4b, 0xbd, 0x20, 0x8f, + 0x15, 0x0c, 0xbd, 0x90, 0x3a, 0x87, 0x30, 0xf4, 0x42, 0xe6, 0x1c, 0xc2, 0x58, 0x6a, 0x79, 0xac, + 0x41, 0xfa, 0x30, 0x97, 0x39, 0xba, 0x50, 0x2a, 0x61, 0xdc, 0x81, 0x47, 0x6b, 0x65, 0x3c, 0x82, + 0xd9, 0xdb, 0x9a, 0xd9, 0xdb, 0x21, 0x4c, 0x6f, 0x53, 0xbe, 0x58, 0x3c, 0xc3, 0x2d, 0x75, 0x81, + 0x42, 0xcf, 0x9f, 0x4b, 0x0b, 0x70, 0xac, 0x33, 0x15, 0x3f, 0xa6, 0x97, 0x91, 0xaf, 0x41, 0xed, + 0x3e, 0x8d, 0x65, 0x4a, 0x9b, 0x32, 0x3d, 0x53, 0x39, 0x6e, 0xad, 0x9c, 0x8c, 0x38, 0x93, 0x66, + 0xb0, 0xb5, 0x75, 0xda, 0xed, 0x51, 0x2e, 0x9c, 0xda, 0x5e, 0xf7, 0x39, 0xf9, 0x3f, 0xd8, 0xb8, + 0xca, 0xbc, 0x5d, 0xd2, 0xf2, 0x99, 0xf4, 0xc6, 0x67, 0x53, 0xf0, 0xbc, 0x96, 0xfd, 0xa0, 0x4b, + 0x35, 0x13, 0xc8, 0x87, 0x9a, 0x96, 0x30, 0xae, 0x18, 0x28, 0x9b, 0xc2, 0xaf, 0x18, 0x28, 0x27, + 0xbf, 0xdc, 0x5e, 0xc5, 0x7e, 0x6c, 0xb2, 0x92, 0xf4, 0xc3, 0x73, 0xca, 0x93, 0x9e, 0xd6, 0x3f, + 0x76, 0x07, 0xf1, 0x73, 0xf2, 0x04, 0x5f, 0x71, 0xd0, 0xd3, 0xf6, 0x12, 0x5b, 0x3a, 0x9d, 0xe1, + 0xa7, 0x16, 0x4b, 0xab, 0x32, 0xed, 0x6b, 0xde, 0x15, 0x5a, 0x4a, 0x9f, 0x07, 0x38, 0x8c, 0x83, + 0xe1, 0xb6, 0x4b, 0x07, 0x81, 0x9f, 0xc8, 0xda, 0x24, 0xc1, 0x2c, 0x91, 0x5f, 0x5a, 0x96, 0x19, + 0x79, 0xa2, 0x39, 0x1f, 0x46, 0xd6, 0xa3, 0x24, 0xae, 0xb1, 0x39, 0x68, 0x6a, 0x41, 0x72, 0xf2, + 0xd0, 0x6e, 0x59, 0x64, 0x03, 0x20, 0x39, 0xbb, 0x52, 0xae, 0x44, 0xe6, 0x58, 0x4c, 0x89, 0xbd, + 0x9c, 0x83, 0xae, 0x03, 0xa8, 0x26, 0x87, 0x21, 0xcb, 0xc9, 0xcd, 0x06, 0xe3, 0xe8, 0x44, 0x69, + 0xf0, 0xcc, 0x11, 0x85, 0xdd, 0xc0, 0xa5, 0x02, 0x52, 0x61, 0x4b, 0x85, 0xe7, 0x0e, 0x1e, 0xcc, + 0xf3, 0x01, 0x2a, 0x73, 0x04, 0x53, 0xa6, 0xe4, 0x4c, 0x72, 0x8e, 0x09, 0x14, 0x37, 0xe7, 0x46, + 0xd9, 0x8d, 0x88, 0x08, 0xa3, 0x56, 0x9e, 0xae, 0xc5, 0x44, 0xf3, 0x00, 0xe6, 0x32, 0x61, 0x60, + 0xc5, 0xd2, 0xe3, 0x22, 0xf3, 0x8a, 0xa5, 0xc7, 0x46, 0x90, 0xed, 0x45, 0xec, 0x72, 0xd6, 0x06, + 0xf4, 0x80, 0xce, 0xbc, 0xb8, 0x73, 0xc2, 0xba, 0xfb, 0xae, 0x05, 0xf3, 0x39, 0x51, 0x5e, 0xf2, + 0x9a, 0x74, 0xa6, 0xc7, 0x46, 0x80, 0x5b, 0xb9, 0x41, 0x40, 0xfb, 0x10, 0xfb, 0x79, 0x8f, 0xbc, + 0x6b, 0x28, 0x36, 0x1e, 0x7f, 0x13, 0x9c, 0xf9, 0x42, 0xa3, 0x22, 0xd7, 0xa2, 0xf8, 0x08, 0x96, + 0xf9, 0x40, 0x36, 0xfa, 0xfd, 0x54, 0x80, 0xf2, 0x6a, 0xe6, 0x81, 0x6d, 0x23, 0xf0, 0xda, 0x1a, + 0xff, 0x00, 0xf7, 0x18, 0x73, 0x95, 0x0f, 0x95, 0x8c, 0xa0, 0x91, 0x0e, 0xfa, 0x91, 0xf1, 0x6d, + 0xb5, 0x5e, 0x35, 0xdc, 0xc2, 0x6c, 0xa0, 0xd0, 0xfe, 0x34, 0x76, 0xf6, 0xaa, 0xdd, 0xca, 0x5b, + 0x17, 0xee, 0x29, 0xb2, 0xfd, 0xf8, 0xff, 0x2a, 0x42, 0x99, 0x9a, 0xa7, 0xec, 0x60, 0x5c, 0x48, + 0x55, 0x39, 0xa6, 0xf9, 0x01, 0xce, 0xeb, 0xd8, 0xfd, 0x8a, 0x7d, 0x39, 0xaf, 0xfb, 0x90, 0x7f, + 0xc2, 0x5d, 0xd4, 0xe5, 0x34, 0x5f, 0xcb, 0x11, 0xac, 0xe4, 0xed, 0xf7, 0x58, 0x5f, 0x23, 0xb5, + 0xd6, 0x13, 0xb7, 0xac, 0xcd, 0x1b, 0x1f, 0x7c, 0xba, 0xe7, 0xc5, 0x27, 0xa3, 0xa3, 0x9b, 0x9d, + 0x60, 0xb0, 0xde, 0x97, 0x21, 0x32, 0x91, 0x9e, 0xbb, 0xde, 0xf7, 0xbb, 0xeb, 0xf8, 0xfd, 0xd1, + 0x24, 0xbe, 0xd7, 0xff, 0xd9, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x9c, 0xb9, 0xa5, 0xe1, + 0x5f, 0x00, 0x00, } diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 026f8a5b..95edc392 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -896,13 +896,7 @@ message SendToRouteRequest { /// An optional hex-encoded payment hash to be used for the HTLC. string payment_hash_string = 2; - /** - Deprecated. The set of routes that should be used to attempt to complete the - payment. The possibility to pass in multiple routes is deprecated and - instead the single route field below should be used in combination with the - streaming variant of SendToRoute. - */ - repeated Route routes = 3 [deprecated = true]; + reserved 3; /// Route that should be used to attempt to complete the payment. Route route = 4; diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 33d4afb4..0c1f8f86 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -3216,13 +3216,6 @@ "type": "string", "description": "/ An optional hex-encoded payment hash to be used for the HTLC." }, - "routes": { - "type": "array", - "items": { - "$ref": "#/definitions/lnrpcRoute" - }, - "description": "*\nDeprecated. The set of routes that should be used to attempt to complete the\npayment. The possibility to pass in multiple routes is deprecated and \ninstead the single route field below should be used in combination with the \nstreaming variant of SendToRoute." - }, "route": { "$ref": "#/definitions/lnrpcRoute", "description": "/ Route that should be used to attempt to complete the payment." diff --git a/routing/missioncontrol.go b/routing/missioncontrol.go index 3628623a..0a8a48a1 100644 --- a/routing/missioncontrol.go +++ b/routing/missioncontrol.go @@ -231,18 +231,14 @@ func (m *missionControl) NewPaymentSession(routeHints [][]zpay32.HopHint, }, nil } -// NewPaymentSessionFromRoutes creates a new paymentSession instance that will -// skip all path finding, and will instead utilize a set of pre-built routes. -// This constructor allows callers to specify their own routes which can be -// used for things like channel rebalancing, and swaps. -func (m *missionControl) NewPaymentSessionFromRoutes(routes []*route.Route) *paymentSession { +// NewPaymentSessionForRoute creates a new paymentSession instance that is just +// used for failure reporting to missioncontrol. +func (m *missionControl) NewPaymentSessionForRoute(preBuiltRoute *route.Route) *paymentSession { return &paymentSession{ pruneViewSnapshot: m.GraphPruneView(), - haveRoutes: true, - preBuiltRoutes: routes, errFailedPolicyChans: make(map[EdgeLocator]struct{}), mc: m, - pathFinder: findPath, + preBuiltRoute: preBuiltRoute, } } diff --git a/routing/payment_session.go b/routing/payment_session.go index 2f5f127a..459a8de2 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -32,8 +32,8 @@ type paymentSession struct { mc *missionControl - haveRoutes bool - preBuiltRoutes []*route.Route + preBuiltRoute *route.Route + preBuiltRouteTried bool pathFinder pathFinder } @@ -115,19 +115,17 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, height uint32, finalCltvDelta uint16) (*route.Route, error) { switch { - // If we have a set of pre-built routes, then we'll just pop off the - // next route from the queue, and use it directly. - case p.haveRoutes && len(p.preBuiltRoutes) > 0: - nextRoute := p.preBuiltRoutes[0] - p.preBuiltRoutes[0] = nil // Set to nil to avoid GC leak. - p.preBuiltRoutes = p.preBuiltRoutes[1:] - return nextRoute, nil + // If we have a pre-built route, use that directly. + case p.preBuiltRoute != nil && !p.preBuiltRouteTried: + p.preBuiltRouteTried = true - // If we were instantiated with a set of pre-built routes, and we've - // run out, then we'll return a terminal error. - case p.haveRoutes && len(p.preBuiltRoutes) == 0: - return nil, fmt.Errorf("pre-built routes exhausted") + return p.preBuiltRoute, nil + + // If the pre-built route has been tried already, the payment session is + // over. + case p.preBuiltRoute != nil: + return nil, fmt.Errorf("pre-built route already tried") } // Otherwise we actually need to perform path finding, so we'll obtain diff --git a/routing/router.go b/routing/router.go index 5ca73e8b..d49533c6 100644 --- a/routing/router.go +++ b/routing/router.go @@ -20,6 +20,7 @@ import ( "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/input" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/multimutex" @@ -1523,21 +1524,24 @@ func (r *ChannelRouter) SendPayment(payment *LightningPayment) ([32]byte, *route return r.sendPayment(payment, paySession) } -// SendToRoute attempts to send a payment as described within the passed -// LightningPayment through the provided routes. This function is blocking -// and will return either: when the payment is successful, or all routes -// have been attempted and resulted in a failed payment. If the payment -// succeeds, then a non-nil Route will be returned which describes the -// path the successful payment traversed within the network to reach the -// destination. Additionally, the payment preimage will also be returned. -func (r *ChannelRouter) SendToRoute(routes []*route.Route, - payment *LightningPayment) ([32]byte, *route.Route, error) { +// SendToRoute attempts to send a payment with the given hash through the +// provided route. This function is blocking and will return the obtained +// preimage if the payment is successful or the full error in case of a failure. +func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( + lntypes.Preimage, error) { - paySession := r.missionControl.NewPaymentSessionFromRoutes( - routes, - ) + // Create a payment session for just this route. + paySession := r.missionControl.NewPaymentSessionForRoute(route) - return r.sendPayment(payment, paySession) + // Create a (mostly) dummy payment, as the created payment session is + // not going to do path finding. + payment := &LightningPayment{ + PaymentHash: hash, + } + + preimage, _, err := r.sendPayment(payment, paySession) + + return preimage, err } // sendPayment attempts to send a payment as described within the passed diff --git a/routing/router_test.go b/routing/router_test.go index 14969abe..f4367d29 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -18,6 +18,7 @@ import ( sphinx "github.com/lightningnetwork/lightning-onion" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/htlcswitch" + "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/zpay32" @@ -407,12 +408,12 @@ func TestChannelUpdateValidation(t *testing.T) { // The payment parameter is mostly redundant in SendToRoute. Can be left // empty for this test. - payment := &LightningPayment{} + var payment lntypes.Hash // Send off the payment request to the router. The specified route // should be attempted and the channel update should be received by // router and ignored because it is missing a valid signature. - _, _, err = ctx.router.SendToRoute([]*route.Route{rt}, payment) + _, err = ctx.router.SendToRoute(payment, rt) if err == nil { t.Fatalf("expected route to fail with channel update") } @@ -445,7 +446,7 @@ func TestChannelUpdateValidation(t *testing.T) { } // Retry the payment using the same route as before. - _, _, err = ctx.router.SendToRoute([]*route.Route{rt}, payment) + _, err = ctx.router.SendToRoute(payment, rt) if err == nil { t.Fatalf("expected route to fail with channel update") } diff --git a/rpcserver.go b/rpcserver.go index 7cc748e9..9b9fc1f1 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -2771,7 +2771,7 @@ type paymentStream struct { // lnrpc.SendToRouteRequest can be passed to sendPayment. type rpcPaymentRequest struct { *lnrpc.SendRequest - routes []*route.Route + route *route.Route } // calculateFeeLimit returns the fee limit in millisatoshis. If a percentage @@ -2854,29 +2854,13 @@ func (r *rpcServer) SendToRoute(stream lnrpc.Lightning_SendToRouteServer) error func unmarshallSendToRouteRequest(req *lnrpc.SendToRouteRequest, graph *channeldb.ChannelGraph) (*rpcPaymentRequest, error) { - switch { - case len(req.Routes) == 0 && req.Route == nil: - return nil, fmt.Errorf("unable to send, no routes provided") - case len(req.Routes) > 0 && req.Route != nil: - return nil, fmt.Errorf("cannot use both route and routes field") + if req.Route == nil { + return nil, fmt.Errorf("unable to send, no route provided") } - var routes []*route.Route - if len(req.Routes) > 0 { - routes = make([]*route.Route, len(req.Routes)) - for i, rpcroute := range req.Routes { - route, err := routerrpc.UnmarshallRoute(rpcroute, graph) - if err != nil { - return nil, err - } - routes[i] = route - } - } else { - rt, err := routerrpc.UnmarshallRoute(req.Route, graph) - if err != nil { - return nil, err - } - routes = []*route.Route{rt} + route, err := routerrpc.UnmarshallRoute(req.Route, graph) + if err != nil { + return nil, err } return &rpcPaymentRequest{ @@ -2884,7 +2868,7 @@ func unmarshallSendToRouteRequest(req *lnrpc.SendToRouteRequest, PaymentHash: req.PaymentHash, PaymentHashString: req.PaymentHashString, }, - routes: routes, + route: route, }, nil } @@ -2903,7 +2887,7 @@ type rpcPaymentIntent struct { routeHints [][]zpay32.HopHint outgoingChannelID *uint64 - routes []*route.Route + route *route.Route } // extractPaymentIntent attempts to parse the complete details required to @@ -2914,7 +2898,7 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error payIntent := rpcPaymentIntent{} // If a route was specified, then we can use that directly. - if len(rpcPayReq.routes) != 0 { + if rpcPayReq.route != nil { // If the user is using the REST interface, then they'll be // passing the payment hash as a hex encoded string. if rpcPayReq.PaymentHashString != "" { @@ -2930,7 +2914,7 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error copy(payIntent.rHash[:], rpcPayReq.PaymentHash) } - payIntent.routes = rpcPayReq.routes + payIntent.route = rpcPayReq.route return payIntent, nil } @@ -3089,7 +3073,7 @@ func (r *rpcServer) dispatchPaymentIntent( // If a route was specified, then we'll pass the route directly to the // router, otherwise we'll create a payment session to execute it. - if len(payIntent.routes) == 0 { + if payIntent.route == nil { payment := &routing.LightningPayment{ Target: payIntent.dest, Amount: payIntent.msat, @@ -3110,13 +3094,11 @@ func (r *rpcServer) dispatchPaymentIntent( payment, ) } else { - payment := &routing.LightningPayment{ - PaymentHash: payIntent.rHash, - } - - preImage, route, routerErr = r.server.chanRouter.SendToRoute( - payIntent.routes, payment, + preImage, routerErr = r.server.chanRouter.SendToRoute( + payIntent.rHash, payIntent.route, ) + + route = payIntent.route } // If the route failed, then we'll return a nil save err, but a non-nil @@ -3127,14 +3109,8 @@ func (r *rpcServer) dispatchPaymentIntent( }, nil } - // If a route was used to complete this payment, then we'll need to - // compute the final amount sent - var amt lnwire.MilliSatoshi - if len(payIntent.routes) > 0 { - amt = route.TotalAmount - route.TotalFees - } else { - amt = payIntent.msat - } + // Calculate amount paid to receiver. + amt := route.TotalAmount - route.TotalFees // Save the completed payment to the database for record keeping // purposes. @@ -3328,7 +3304,7 @@ func (r *rpcServer) SendPaymentSync(ctx context.Context, func (r *rpcServer) SendToRouteSync(ctx context.Context, req *lnrpc.SendToRouteRequest) (*lnrpc.SendResponse, error) { - if len(req.Routes) == 0 { + if req.Route == nil { return nil, fmt.Errorf("unable to send, no routes provided") } From b2eb2619bf6647b970ddbc831be7a929ea63c6b7 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 14 Mar 2019 15:13:45 +0100 Subject: [PATCH 3/4] routerrpc: connect UnmarshallRoute to existing config fields --- lnrpc/routerrpc/router_backend.go | 44 ++++++++++++++----------------- rpcserver.go | 29 +++++++++++++------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index b635b9b2..916d44f2 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/btcsuite/btcutil" - "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing" @@ -27,6 +26,11 @@ type RouterBackend struct { // capacity of a channel to populate in responses. FetchChannelCapacity func(chanID uint64) (btcutil.Amount, error) + // FetchChannelEndpoints returns the pubkeys of both endpoints of the + // given channel id. + FetchChannelEndpoints func(chanID uint64) (route.Vertex, + route.Vertex, error) + // FindRoutes is a closure that abstracts away how we locate/query for // routes. FindRoute func(source, target route.Vertex, @@ -224,22 +228,21 @@ func (r *RouterBackend) MarshallRoute(route *route.Route) *lnrpc.Route { // not known. This function will query the channel graph with channel id to // retrieve both endpoints and determine the hop pubkey using the previous hop // pubkey. If the channel is unknown, an error is returned. -func UnmarshallHopByChannelLookup(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, +func (r *RouterBackend) UnmarshallHopByChannelLookup(hop *lnrpc.Hop, prevPubKeyBytes [33]byte) (*route.Hop, error) { // Discard edge policies, because they may be nil. - edgeInfo, _, _, err := graph.FetchChannelEdgesByID(hop.ChanId) + node1, node2, err := r.FetchChannelEndpoints(hop.ChanId) if err != nil { - return nil, fmt.Errorf("unable to fetch channel edges by "+ - "channel ID %d: %v", hop.ChanId, err) + return nil, err } var pubKeyBytes [33]byte switch { - case prevPubKeyBytes == edgeInfo.NodeKey1Bytes: - pubKeyBytes = edgeInfo.NodeKey2Bytes - case prevPubKeyBytes == edgeInfo.NodeKey2Bytes: - pubKeyBytes = edgeInfo.NodeKey1Bytes + case prevPubKeyBytes == node1: + pubKeyBytes = node2 + case prevPubKeyBytes == node2: + pubKeyBytes = node1 default: return nil, fmt.Errorf("channel edge does not match expected node") } @@ -248,7 +251,7 @@ func UnmarshallHopByChannelLookup(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, OutgoingTimeLock: hop.Expiry, AmtToForward: lnwire.MilliSatoshi(hop.AmtToForwardMsat), PubKeyBytes: pubKeyBytes, - ChannelID: edgeInfo.ChannelID, + ChannelID: hop.ChanId, }, nil } @@ -274,14 +277,14 @@ func UnmarshallKnownPubkeyHop(hop *lnrpc.Hop) (*route.Hop, error) { // UnmarshallHop unmarshalls an rpc hop that may or may not contain a node // pubkey. -func UnmarshallHop(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, +func (r *RouterBackend) UnmarshallHop(hop *lnrpc.Hop, prevNodePubKey [33]byte) (*route.Hop, error) { if hop.PubKey == "" { // If no pub key is given of the hop, the local channel // graph needs to be queried to complete the information // necessary for routing. - return UnmarshallHopByChannelLookup(graph, hop, prevNodePubKey) + return r.UnmarshallHopByChannelLookup(hop, prevNodePubKey) } return UnmarshallKnownPubkeyHop(hop) @@ -289,21 +292,14 @@ func UnmarshallHop(graph *channeldb.ChannelGraph, hop *lnrpc.Hop, // UnmarshallRoute unmarshalls an rpc route. For hops that don't specify a // pubkey, the channel graph is queried. -func UnmarshallRoute(rpcroute *lnrpc.Route, - graph *channeldb.ChannelGraph) (*route.Route, error) { +func (r *RouterBackend) UnmarshallRoute(rpcroute *lnrpc.Route) ( + *route.Route, error) { - sourceNode, err := graph.SourceNode() - if err != nil { - return nil, fmt.Errorf("unable to fetch source node from graph "+ - "while unmarshaling route. %v", err) - } - - prevNodePubKey := sourceNode.PubKeyBytes + prevNodePubKey := r.SelfNode hops := make([]*route.Hop, len(rpcroute.Hops)) for i, hop := range rpcroute.Hops { - routeHop, err := UnmarshallHop(graph, - hop, prevNodePubKey) + routeHop, err := r.UnmarshallHop(hop, prevNodePubKey) if err != nil { return nil, err } @@ -316,7 +312,7 @@ func UnmarshallRoute(rpcroute *lnrpc.Route, route, err := route.NewRouteFromHops( lnwire.MilliSatoshi(rpcroute.TotalAmtMsat), rpcroute.TotalTimeLock, - sourceNode.PubKeyBytes, + r.SelfNode, hops, ) if err != nil { diff --git a/rpcserver.go b/rpcserver.go index 9b9fc1f1..858d6867 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -462,6 +462,21 @@ func newRPCServer(s *server, macService *macaroons.Service, } return info.Capacity, nil }, + FetchChannelEndpoints: func(chanID uint64) (route.Vertex, + route.Vertex, error) { + + info, _, _, err := graph.FetchChannelEdgesByID( + chanID, + ) + if err != nil { + return route.Vertex{}, route.Vertex{}, + fmt.Errorf("unable to fetch channel "+ + "edges by channel ID %d: %v", + chanID, err) + } + + return info.NodeKey1Bytes, info.NodeKey2Bytes, nil + }, FindRoute: s.chanRouter.FindRoute, } @@ -2837,9 +2852,7 @@ func (r *rpcServer) SendToRoute(stream lnrpc.Lightning_SendToRouteServer) error return nil, err } - graph := r.server.chanDB.ChannelGraph() - - return unmarshallSendToRouteRequest(req, graph) + return r.unmarshallSendToRouteRequest(req) }, send: func(r *lnrpc.SendResponse) error { // Calling stream.Send concurrently is not safe. @@ -2851,14 +2864,14 @@ func (r *rpcServer) SendToRoute(stream lnrpc.Lightning_SendToRouteServer) error } // unmarshallSendToRouteRequest unmarshalls an rpc sendtoroute request -func unmarshallSendToRouteRequest(req *lnrpc.SendToRouteRequest, - graph *channeldb.ChannelGraph) (*rpcPaymentRequest, error) { +func (r *rpcServer) unmarshallSendToRouteRequest( + req *lnrpc.SendToRouteRequest) (*rpcPaymentRequest, error) { if req.Route == nil { return nil, fmt.Errorf("unable to send, no route provided") } - route, err := routerrpc.UnmarshallRoute(req.Route, graph) + route, err := r.routerBackend.UnmarshallRoute(req.Route) if err != nil { return nil, err } @@ -3308,9 +3321,7 @@ func (r *rpcServer) SendToRouteSync(ctx context.Context, return nil, fmt.Errorf("unable to send, no routes provided") } - graph := r.server.chanDB.ChannelGraph() - - paymentRequest, err := unmarshallSendToRouteRequest(req, graph) + paymentRequest, err := r.unmarshallSendToRouteRequest(req) if err != nil { return nil, err } From c97592692ce4063fddd43450d2ab56936c6ffb04 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 14 Mar 2019 16:31:39 +0100 Subject: [PATCH 4/4] routerrpc: add SendToRoute with structured failure message --- lnrpc/routerrpc/router.pb.go | 570 +++++++++++++++++++++++++++++-- lnrpc/routerrpc/router.proto | 132 +++++++ lnrpc/routerrpc/router_server.go | 178 +++++++++- 3 files changed, 844 insertions(+), 36 deletions(-) diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index cd7bcfe4..f1c85d07 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -1,11 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: routerrpc/router.proto -package routerrpc +package routerrpc // import "github.com/lightningnetwork/lnd/lnrpc/routerrpc" import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" +import lnrpc "github.com/lightningnetwork/lnd/lnrpc" import ( context "golang.org/x/net/context" @@ -23,6 +24,93 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +type Failure_FailureCode int32 + +const ( + // * + // The numbers assigned in this enumeration match the failure codes as + // defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + // a RESERVED value is added. + Failure_RESERVED Failure_FailureCode = 0 + Failure_UNKNOWN_PAYMENT_HASH Failure_FailureCode = 1 + Failure_INCORRECT_PAYMENT_AMOUNT Failure_FailureCode = 2 + Failure_FINAL_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 3 + Failure_FINAL_INCORRECT_HTLC_AMOUNT Failure_FailureCode = 4 + Failure_FINAL_EXPIRY_TOO_SOON Failure_FailureCode = 5 + Failure_INVALID_REALM Failure_FailureCode = 6 + Failure_EXPIRY_TOO_SOON Failure_FailureCode = 7 + Failure_INVALID_ONION_VERSION Failure_FailureCode = 8 + Failure_INVALID_ONION_HMAC Failure_FailureCode = 9 + Failure_INVALID_ONION_KEY Failure_FailureCode = 10 + Failure_AMOUNT_BELOW_MINIMUM Failure_FailureCode = 11 + Failure_FEE_INSUFFICIENT Failure_FailureCode = 12 + Failure_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 13 + Failure_CHANNEL_DISABLED Failure_FailureCode = 14 + Failure_TEMPORARY_CHANNEL_FAILURE Failure_FailureCode = 15 + Failure_REQUIRED_NODE_FEATURE_MISSING Failure_FailureCode = 16 + Failure_REQUIRED_CHANNEL_FEATURE_MISSING Failure_FailureCode = 17 + Failure_UNKNOWN_NEXT_PEER Failure_FailureCode = 18 + Failure_TEMPORARY_NODE_FAILURE Failure_FailureCode = 19 + Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20 + Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21 +) + +var Failure_FailureCode_name = map[int32]string{ + 0: "RESERVED", + 1: "UNKNOWN_PAYMENT_HASH", + 2: "INCORRECT_PAYMENT_AMOUNT", + 3: "FINAL_INCORRECT_CLTV_EXPIRY", + 4: "FINAL_INCORRECT_HTLC_AMOUNT", + 5: "FINAL_EXPIRY_TOO_SOON", + 6: "INVALID_REALM", + 7: "EXPIRY_TOO_SOON", + 8: "INVALID_ONION_VERSION", + 9: "INVALID_ONION_HMAC", + 10: "INVALID_ONION_KEY", + 11: "AMOUNT_BELOW_MINIMUM", + 12: "FEE_INSUFFICIENT", + 13: "INCORRECT_CLTV_EXPIRY", + 14: "CHANNEL_DISABLED", + 15: "TEMPORARY_CHANNEL_FAILURE", + 16: "REQUIRED_NODE_FEATURE_MISSING", + 17: "REQUIRED_CHANNEL_FEATURE_MISSING", + 18: "UNKNOWN_NEXT_PEER", + 19: "TEMPORARY_NODE_FAILURE", + 20: "PERMANENT_NODE_FAILURE", + 21: "PERMANENT_CHANNEL_FAILURE", +} +var Failure_FailureCode_value = map[string]int32{ + "RESERVED": 0, + "UNKNOWN_PAYMENT_HASH": 1, + "INCORRECT_PAYMENT_AMOUNT": 2, + "FINAL_INCORRECT_CLTV_EXPIRY": 3, + "FINAL_INCORRECT_HTLC_AMOUNT": 4, + "FINAL_EXPIRY_TOO_SOON": 5, + "INVALID_REALM": 6, + "EXPIRY_TOO_SOON": 7, + "INVALID_ONION_VERSION": 8, + "INVALID_ONION_HMAC": 9, + "INVALID_ONION_KEY": 10, + "AMOUNT_BELOW_MINIMUM": 11, + "FEE_INSUFFICIENT": 12, + "INCORRECT_CLTV_EXPIRY": 13, + "CHANNEL_DISABLED": 14, + "TEMPORARY_CHANNEL_FAILURE": 15, + "REQUIRED_NODE_FEATURE_MISSING": 16, + "REQUIRED_CHANNEL_FEATURE_MISSING": 17, + "UNKNOWN_NEXT_PEER": 18, + "TEMPORARY_NODE_FAILURE": 19, + "PERMANENT_NODE_FAILURE": 20, + "PERMANENT_CHANNEL_FAILURE": 21, +} + +func (x Failure_FailureCode) String() string { + return proto.EnumName(Failure_FailureCode_name, int32(x)) +} +func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_router_111acc30110a7cf6, []int{6, 0} +} + type PaymentRequest struct { // * // A serialized BOLT-11 payment request that contains all information @@ -59,7 +147,7 @@ func (m *PaymentRequest) Reset() { *m = PaymentRequest{} } func (m *PaymentRequest) String() string { return proto.CompactTextString(m) } func (*PaymentRequest) ProtoMessage() {} func (*PaymentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_router_e218e7c710fe8172, []int{0} + return fileDescriptor_router_111acc30110a7cf6, []int{0} } func (m *PaymentRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PaymentRequest.Unmarshal(m, b) @@ -134,7 +222,7 @@ func (m *PaymentResponse) Reset() { *m = PaymentResponse{} } func (m *PaymentResponse) String() string { return proto.CompactTextString(m) } func (*PaymentResponse) ProtoMessage() {} func (*PaymentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_router_e218e7c710fe8172, []int{1} + return fileDescriptor_router_111acc30110a7cf6, []int{1} } func (m *PaymentResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PaymentResponse.Unmarshal(m, b) @@ -191,7 +279,7 @@ func (m *RouteFeeRequest) Reset() { *m = RouteFeeRequest{} } func (m *RouteFeeRequest) String() string { return proto.CompactTextString(m) } func (*RouteFeeRequest) ProtoMessage() {} func (*RouteFeeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_router_e218e7c710fe8172, []int{2} + return fileDescriptor_router_111acc30110a7cf6, []int{2} } func (m *RouteFeeRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteFeeRequest.Unmarshal(m, b) @@ -244,7 +332,7 @@ func (m *RouteFeeResponse) Reset() { *m = RouteFeeResponse{} } func (m *RouteFeeResponse) String() string { return proto.CompactTextString(m) } func (*RouteFeeResponse) ProtoMessage() {} func (*RouteFeeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_router_e218e7c710fe8172, []int{3} + return fileDescriptor_router_111acc30110a7cf6, []int{3} } func (m *RouteFeeResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteFeeResponse.Unmarshal(m, b) @@ -278,11 +366,336 @@ func (m *RouteFeeResponse) GetTimeLockDelay() int64 { return 0 } +type SendToRouteRequest struct { + // / The payment hash to use for the HTLC. + PaymentHash []byte `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"` + // / Route that should be used to attempt to complete the payment. + Route *lnrpc.Route `protobuf:"bytes,2,opt,name=route,proto3" json:"route,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SendToRouteRequest) Reset() { *m = SendToRouteRequest{} } +func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) } +func (*SendToRouteRequest) ProtoMessage() {} +func (*SendToRouteRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_router_111acc30110a7cf6, []int{4} +} +func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SendToRouteRequest.Unmarshal(m, b) +} +func (m *SendToRouteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SendToRouteRequest.Marshal(b, m, deterministic) +} +func (dst *SendToRouteRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SendToRouteRequest.Merge(dst, src) +} +func (m *SendToRouteRequest) XXX_Size() int { + return xxx_messageInfo_SendToRouteRequest.Size(m) +} +func (m *SendToRouteRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SendToRouteRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SendToRouteRequest proto.InternalMessageInfo + +func (m *SendToRouteRequest) GetPaymentHash() []byte { + if m != nil { + return m.PaymentHash + } + return nil +} + +func (m *SendToRouteRequest) GetRoute() *lnrpc.Route { + if m != nil { + return m.Route + } + return nil +} + +type SendToRouteResponse struct { + // / The preimage obtained by making the payment. + Preimage []byte `protobuf:"bytes,1,opt,name=preimage,proto3" json:"preimage,omitempty"` + // / The failure message in case the payment failed. + Failure *Failure `protobuf:"bytes,2,opt,name=failure,proto3" json:"failure,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SendToRouteResponse) Reset() { *m = SendToRouteResponse{} } +func (m *SendToRouteResponse) String() string { return proto.CompactTextString(m) } +func (*SendToRouteResponse) ProtoMessage() {} +func (*SendToRouteResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_router_111acc30110a7cf6, []int{5} +} +func (m *SendToRouteResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SendToRouteResponse.Unmarshal(m, b) +} +func (m *SendToRouteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SendToRouteResponse.Marshal(b, m, deterministic) +} +func (dst *SendToRouteResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SendToRouteResponse.Merge(dst, src) +} +func (m *SendToRouteResponse) XXX_Size() int { + return xxx_messageInfo_SendToRouteResponse.Size(m) +} +func (m *SendToRouteResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SendToRouteResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SendToRouteResponse proto.InternalMessageInfo + +func (m *SendToRouteResponse) GetPreimage() []byte { + if m != nil { + return m.Preimage + } + return nil +} + +func (m *SendToRouteResponse) GetFailure() *Failure { + if m != nil { + return m.Failure + } + return nil +} + +type Failure struct { + // / Failure code as defined in the Lightning spec + Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=routerrpc.Failure_FailureCode" json:"code,omitempty"` + // * + // The node pubkey of the intermediate or final node that generated the failure + // message. + FailureSourcePubkey []byte `protobuf:"bytes,2,opt,name=failure_source_pubkey,json=failureSourcePubkey,proto3" json:"failure_source_pubkey,omitempty"` + // / An optional channel update message. + ChannelUpdate *ChannelUpdate `protobuf:"bytes,3,opt,name=channel_update,json=channelUpdate,proto3" json:"channel_update,omitempty"` + // / A failure type-dependent htlc value. + HtlcMsat uint64 `protobuf:"varint,4,opt,name=htlc_msat,json=htlcMsat,proto3" json:"htlc_msat,omitempty"` + // / The sha256 sum of the onion payload. + OnionSha_256 []byte `protobuf:"bytes,5,opt,name=onion_sha_256,json=onionSha256,proto3" json:"onion_sha_256,omitempty"` + // / A failure type-dependent cltv expiry value. + CltvExpiry uint32 `protobuf:"varint,6,opt,name=cltv_expiry,json=cltvExpiry,proto3" json:"cltv_expiry,omitempty"` + // / A failure type-dependent flags value. + Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Failure) Reset() { *m = Failure{} } +func (m *Failure) String() string { return proto.CompactTextString(m) } +func (*Failure) ProtoMessage() {} +func (*Failure) Descriptor() ([]byte, []int) { + return fileDescriptor_router_111acc30110a7cf6, []int{6} +} +func (m *Failure) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Failure.Unmarshal(m, b) +} +func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Failure.Marshal(b, m, deterministic) +} +func (dst *Failure) XXX_Merge(src proto.Message) { + xxx_messageInfo_Failure.Merge(dst, src) +} +func (m *Failure) XXX_Size() int { + return xxx_messageInfo_Failure.Size(m) +} +func (m *Failure) XXX_DiscardUnknown() { + xxx_messageInfo_Failure.DiscardUnknown(m) +} + +var xxx_messageInfo_Failure proto.InternalMessageInfo + +func (m *Failure) GetCode() Failure_FailureCode { + if m != nil { + return m.Code + } + return Failure_RESERVED +} + +func (m *Failure) GetFailureSourcePubkey() []byte { + if m != nil { + return m.FailureSourcePubkey + } + return nil +} + +func (m *Failure) GetChannelUpdate() *ChannelUpdate { + if m != nil { + return m.ChannelUpdate + } + return nil +} + +func (m *Failure) GetHtlcMsat() uint64 { + if m != nil { + return m.HtlcMsat + } + return 0 +} + +func (m *Failure) GetOnionSha_256() []byte { + if m != nil { + return m.OnionSha_256 + } + return nil +} + +func (m *Failure) GetCltvExpiry() uint32 { + if m != nil { + return m.CltvExpiry + } + return 0 +} + +func (m *Failure) GetFlags() uint32 { + if m != nil { + return m.Flags + } + return 0 +} + +type ChannelUpdate struct { + // Signature is used to validate the announced data and prove the + // ownership of node id. + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + // ChainHash denotes the target chain that this channel was opened + // within. This value should be the genesis hash of the target chain. + // Along with the short channel ID, this uniquely identifies the + // channel globally in a blockchain. + ChainHash []byte `protobuf:"bytes,2,opt,name=chain_hash,json=chainHash,proto3" json:"chain_hash,omitempty"` + // ShortChannelID is the unique description of the funding transaction. + ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId,proto3" json:"chan_id,omitempty"` + // Timestamp allows ordering in the case of multiple announcements. We + // should ignore the message if timestamp is not greater than + // the last-received. + Timestamp uint32 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Flags is a bitfield that describes additional meta-data concerning + // how the update is to be interpreted. Currently, the + // least-significant bit must be set to 0 if the creating node + // corresponds to the first node in the previously sent channel + // announcement and 1 otherwise. If the second bit is set, then the + // channel is set to be disabled. + ChannelFlags uint32 `protobuf:"varint,5,opt,name=channel_flags,json=channelFlags,proto3" json:"channel_flags,omitempty"` + // TimeLockDelta is the minimum number of blocks this node requires to + // be added to the expiry of HTLCs. This is a security parameter + // determined by the node operator. This value represents the required + // gap between the time locks of the incoming and outgoing HTLC's set + // to this node. + TimeLockDelta uint32 `protobuf:"varint,6,opt,name=time_lock_delta,json=timeLockDelta,proto3" json:"time_lock_delta,omitempty"` + // HtlcMinimumMsat is the minimum HTLC value which will be accepted. + HtlcMinimumMsat uint64 `protobuf:"varint,7,opt,name=htlc_minimum_msat,json=htlcMinimumMsat,proto3" json:"htlc_minimum_msat,omitempty"` + // BaseFee is the base fee that must be used for incoming HTLC's to + // this particular channel. This value will be tacked onto the required + // for a payment independent of the size of the payment. + BaseFee uint32 `protobuf:"varint,8,opt,name=base_fee,json=baseFee,proto3" json:"base_fee,omitempty"` + // FeeRate is the fee rate that will be charged per millionth of a + // satoshi. + FeeRate uint32 `protobuf:"varint,9,opt,name=fee_rate,json=feeRate,proto3" json:"fee_rate,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} } +func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) } +func (*ChannelUpdate) ProtoMessage() {} +func (*ChannelUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_router_111acc30110a7cf6, []int{7} +} +func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ChannelUpdate.Unmarshal(m, b) +} +func (m *ChannelUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ChannelUpdate.Marshal(b, m, deterministic) +} +func (dst *ChannelUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChannelUpdate.Merge(dst, src) +} +func (m *ChannelUpdate) XXX_Size() int { + return xxx_messageInfo_ChannelUpdate.Size(m) +} +func (m *ChannelUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ChannelUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_ChannelUpdate proto.InternalMessageInfo + +func (m *ChannelUpdate) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *ChannelUpdate) GetChainHash() []byte { + if m != nil { + return m.ChainHash + } + return nil +} + +func (m *ChannelUpdate) GetChanId() uint64 { + if m != nil { + return m.ChanId + } + return 0 +} + +func (m *ChannelUpdate) GetTimestamp() uint32 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *ChannelUpdate) GetChannelFlags() uint32 { + if m != nil { + return m.ChannelFlags + } + return 0 +} + +func (m *ChannelUpdate) GetTimeLockDelta() uint32 { + if m != nil { + return m.TimeLockDelta + } + return 0 +} + +func (m *ChannelUpdate) GetHtlcMinimumMsat() uint64 { + if m != nil { + return m.HtlcMinimumMsat + } + return 0 +} + +func (m *ChannelUpdate) GetBaseFee() uint32 { + if m != nil { + return m.BaseFee + } + return 0 +} + +func (m *ChannelUpdate) GetFeeRate() uint32 { + if m != nil { + return m.FeeRate + } + return 0 +} + func init() { proto.RegisterType((*PaymentRequest)(nil), "routerrpc.PaymentRequest") proto.RegisterType((*PaymentResponse)(nil), "routerrpc.PaymentResponse") proto.RegisterType((*RouteFeeRequest)(nil), "routerrpc.RouteFeeRequest") proto.RegisterType((*RouteFeeResponse)(nil), "routerrpc.RouteFeeResponse") + proto.RegisterType((*SendToRouteRequest)(nil), "routerrpc.SendToRouteRequest") + proto.RegisterType((*SendToRouteResponse)(nil), "routerrpc.SendToRouteResponse") + proto.RegisterType((*Failure)(nil), "routerrpc.Failure") + proto.RegisterType((*ChannelUpdate)(nil), "routerrpc.ChannelUpdate") + proto.RegisterEnum("routerrpc.Failure_FailureCode", Failure_FailureCode_name, Failure_FailureCode_value) } // Reference imports to suppress errors if they are not otherwise used. @@ -308,6 +721,11 @@ type RouterClient interface { // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it // may cost to send an HTLC to the target end destination. EstimateRouteFee(ctx context.Context, in *RouteFeeRequest, opts ...grpc.CallOption) (*RouteFeeResponse, error) + // * + // SendToRoute attempts to make a payment via the specified route. This method + // differs from SendPayment in that it allows users to specify a full route + // manually. This can be used for things like rebalancing, and atomic swaps. + SendToRoute(ctx context.Context, in *SendToRouteRequest, opts ...grpc.CallOption) (*SendToRouteResponse, error) } type routerClient struct { @@ -336,6 +754,15 @@ func (c *routerClient) EstimateRouteFee(ctx context.Context, in *RouteFeeRequest return out, nil } +func (c *routerClient) SendToRoute(ctx context.Context, in *SendToRouteRequest, opts ...grpc.CallOption) (*SendToRouteResponse, error) { + out := new(SendToRouteResponse) + err := c.cc.Invoke(ctx, "/routerrpc.Router/SendToRoute", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // RouterServer is the server API for Router service. type RouterServer interface { // * @@ -349,6 +776,11 @@ type RouterServer interface { // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it // may cost to send an HTLC to the target end destination. EstimateRouteFee(context.Context, *RouteFeeRequest) (*RouteFeeResponse, error) + // * + // SendToRoute attempts to make a payment via the specified route. This method + // differs from SendPayment in that it allows users to specify a full route + // manually. This can be used for things like rebalancing, and atomic swaps. + SendToRoute(context.Context, *SendToRouteRequest) (*SendToRouteResponse, error) } func RegisterRouterServer(s *grpc.Server, srv RouterServer) { @@ -391,6 +823,24 @@ func _Router_EstimateRouteFee_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Router_SendToRoute_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendToRouteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RouterServer).SendToRoute(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/routerrpc.Router/SendToRoute", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RouterServer).SendToRoute(ctx, req.(*SendToRouteRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Router_serviceDesc = grpc.ServiceDesc{ ServiceName: "routerrpc.Router", HandlerType: (*RouterServer)(nil), @@ -403,39 +853,91 @@ var _Router_serviceDesc = grpc.ServiceDesc{ MethodName: "EstimateRouteFee", Handler: _Router_EstimateRouteFee_Handler, }, + { + MethodName: "SendToRoute", + Handler: _Router_SendToRoute_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "routerrpc/router.proto", } -func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_router_e218e7c710fe8172) } +func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_router_111acc30110a7cf6) } -var fileDescriptor_router_e218e7c710fe8172 = []byte{ - // 409 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xdf, 0x6e, 0xd3, 0x30, - 0x14, 0xc6, 0x15, 0xb6, 0x85, 0xe5, 0x74, 0x6b, 0x8b, 0x91, 0x20, 0xeb, 0x84, 0xa8, 0x72, 0x01, - 0xb9, 0x0a, 0x12, 0xdc, 0x73, 0xc3, 0x36, 0x31, 0x31, 0x24, 0xe4, 0x3e, 0x80, 0x65, 0x92, 0xb3, - 0x26, 0x34, 0x8e, 0x5d, 0xdb, 0x41, 0xca, 0xb3, 0xf0, 0x3c, 0xbc, 0x17, 0xb2, 0xe3, 0x96, 0x82, - 0x7a, 0xe7, 0x7c, 0xe7, 0xef, 0xf7, 0x3b, 0x81, 0x17, 0x5a, 0xf6, 0x16, 0xb5, 0x56, 0xe5, 0xbb, - 0xf1, 0x55, 0x28, 0x2d, 0xad, 0x24, 0xc9, 0x5e, 0xcf, 0x7e, 0x47, 0x30, 0xfd, 0xc6, 0x07, 0x81, - 0x9d, 0xa5, 0xb8, 0xed, 0xd1, 0x58, 0xf2, 0x12, 0x9e, 0x2a, 0x3e, 0x30, 0x8d, 0xdb, 0x34, 0x5a, - 0x46, 0x79, 0x42, 0x63, 0xc5, 0x07, 0x8a, 0x5b, 0x92, 0xc1, 0xe5, 0x23, 0x22, 0x6b, 0x1b, 0xd1, - 0x58, 0x66, 0xb8, 0x4d, 0x9f, 0x2c, 0xa3, 0xfc, 0x84, 0x4e, 0x1e, 0x11, 0x1f, 0x9c, 0xb6, 0xe2, - 0x96, 0xbc, 0x02, 0x28, 0x5b, 0xfb, 0x73, 0x4c, 0x4a, 0x4f, 0x96, 0x51, 0x7e, 0x46, 0x13, 0xa7, - 0xf8, 0x0c, 0xf2, 0x16, 0x66, 0xb6, 0x11, 0x28, 0x7b, 0xcb, 0x0c, 0x96, 0xb2, 0xab, 0x4c, 0x7a, - 0xea, 0x73, 0xa6, 0x41, 0x5e, 0x8d, 0x2a, 0x29, 0xe0, 0xb9, 0xec, 0xed, 0x5a, 0x36, 0xdd, 0x9a, - 0x95, 0x35, 0xef, 0x3a, 0x6c, 0x59, 0x53, 0xa5, 0x67, 0x7e, 0xe2, 0xb3, 0x5d, 0xe8, 0xd3, 0x18, - 0xb9, 0xaf, 0xb2, 0x1f, 0x30, 0xdb, 0xdb, 0x30, 0x4a, 0x76, 0x06, 0xc9, 0x15, 0x9c, 0x3b, 0x1f, - 0x35, 0x37, 0xb5, 0x37, 0x72, 0x41, 0x9d, 0xaf, 0xcf, 0xdc, 0xd4, 0xe4, 0x1a, 0x12, 0xa5, 0x91, - 0x35, 0x82, 0xaf, 0xd1, 0xbb, 0xb8, 0xa0, 0xe7, 0x4a, 0xe3, 0xbd, 0xfb, 0x26, 0xaf, 0x61, 0xa2, - 0xc6, 0x56, 0x0c, 0xb5, 0xf6, 0x1e, 0x12, 0x0a, 0x41, 0xba, 0xd5, 0x3a, 0xfb, 0x08, 0x33, 0xea, - 0x00, 0xde, 0x21, 0xee, 0x98, 0x11, 0x38, 0xad, 0xd0, 0xd8, 0x30, 0xc7, 0xbf, 0x1d, 0x47, 0x2e, - 0x0e, 0x41, 0xc5, 0x5c, 0x38, 0x46, 0x59, 0x05, 0xf3, 0xbf, 0xf5, 0x61, 0xd9, 0x1c, 0xe6, 0xee, - 0x28, 0xce, 0xae, 0x63, 0x2c, 0x5c, 0x55, 0xe4, 0xab, 0xa6, 0x41, 0xbf, 0x43, 0xfc, 0x6a, 0xb8, - 0x25, 0x6f, 0x46, 0x84, 0xac, 0x95, 0xe5, 0x86, 0x55, 0xd8, 0xf2, 0x21, 0xb4, 0xbf, 0x74, 0xf2, - 0x83, 0x2c, 0x37, 0x37, 0x4e, 0x7c, 0xff, 0x2b, 0x82, 0xd8, 0x8f, 0xd1, 0xe4, 0x06, 0x26, 0x2b, - 0xec, 0xaa, 0x00, 0x88, 0x5c, 0x15, 0xfb, 0xfb, 0x17, 0xff, 0xde, 0x7e, 0xb1, 0x38, 0x16, 0x0a, - 0x2b, 0x7e, 0x81, 0xf9, 0xad, 0xb1, 0x8d, 0xe0, 0x16, 0x77, 0xeb, 0x93, 0xc3, 0xfc, 0xff, 0x98, - 0x2c, 0xae, 0x8f, 0xc6, 0xc6, 0x66, 0xdf, 0x63, 0xff, 0x27, 0x7e, 0xf8, 0x13, 0x00, 0x00, 0xff, - 0xff, 0x95, 0xc2, 0xf8, 0xec, 0xa3, 0x02, 0x00, 0x00, +var fileDescriptor_router_111acc30110a7cf6 = []byte{ + // 1172 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x56, 0xdd, 0x72, 0x1a, 0x37, + 0x14, 0x2e, 0xb1, 0xcd, 0xcf, 0x01, 0xec, 0xb5, 0x6c, 0x27, 0x98, 0xc4, 0x89, 0x43, 0x3b, 0xad, + 0xa7, 0xd3, 0xb1, 0xa7, 0x74, 0x92, 0xcb, 0x76, 0x36, 0x20, 0xea, 0x9d, 0xc0, 0x2e, 0xd5, 0x82, + 0x13, 0xb7, 0x17, 0x1a, 0x99, 0x95, 0x61, 0x6b, 0xf6, 0x27, 0xbb, 0xa2, 0xad, 0x5f, 0xa0, 0x0f, + 0xd4, 0x77, 0xe8, 0x43, 0xf4, 0x11, 0xfa, 0x16, 0x1d, 0x49, 0xbb, 0x18, 0x6c, 0xf7, 0x8a, 0xd5, + 0xf7, 0x1d, 0x7d, 0xd2, 0x39, 0x3a, 0x3f, 0xc0, 0xd3, 0x24, 0x5a, 0x08, 0x9e, 0x24, 0xf1, 0xe4, + 0x4c, 0x7f, 0x9d, 0xc6, 0x49, 0x24, 0x22, 0x54, 0x59, 0xe2, 0xcd, 0x4a, 0x12, 0x4f, 0x34, 0xda, + 0xfa, 0xbb, 0x00, 0xdb, 0x43, 0x76, 0x1b, 0xf0, 0x50, 0x10, 0xfe, 0x69, 0xc1, 0x53, 0x81, 0x9e, + 0x41, 0x29, 0x66, 0xb7, 0x34, 0xe1, 0x9f, 0x1a, 0x85, 0xe3, 0xc2, 0x49, 0x85, 0x14, 0x63, 0x76, + 0x4b, 0xf8, 0x27, 0xd4, 0x82, 0xfa, 0x35, 0xe7, 0x74, 0xee, 0x07, 0xbe, 0xa0, 0x29, 0x13, 0x8d, + 0x27, 0xc7, 0x85, 0x93, 0x0d, 0x52, 0xbd, 0xe6, 0xbc, 0x2f, 0x31, 0x97, 0x09, 0x74, 0x04, 0x30, + 0x99, 0x8b, 0xdf, 0xb4, 0x51, 0x63, 0xe3, 0xb8, 0x70, 0xb2, 0x45, 0x2a, 0x12, 0x51, 0x16, 0xe8, + 0x2b, 0xd8, 0x11, 0x7e, 0xc0, 0xa3, 0x85, 0xa0, 0x29, 0x9f, 0x44, 0xa1, 0x97, 0x36, 0x36, 0x95, + 0xcd, 0x76, 0x06, 0xbb, 0x1a, 0x45, 0xa7, 0xb0, 0x17, 0x2d, 0xc4, 0x34, 0xf2, 0xc3, 0x29, 0x9d, + 0xcc, 0x58, 0x18, 0xf2, 0x39, 0xf5, 0xbd, 0xc6, 0x96, 0x3a, 0x71, 0x37, 0xa7, 0x3a, 0x9a, 0xb1, + 0xbc, 0xd6, 0xaf, 0xb0, 0xb3, 0x74, 0x23, 0x8d, 0xa3, 0x30, 0xe5, 0xe8, 0x10, 0xca, 0xd2, 0x8f, + 0x19, 0x4b, 0x67, 0xca, 0x91, 0x1a, 0x91, 0x7e, 0x9d, 0xb3, 0x74, 0x86, 0x9e, 0x43, 0x25, 0x4e, + 0x38, 0xf5, 0x03, 0x36, 0xe5, 0xca, 0x8b, 0x1a, 0x29, 0xc7, 0x09, 0xb7, 0xe4, 0x1a, 0xbd, 0x82, + 0x6a, 0xac, 0xa5, 0x28, 0x4f, 0x12, 0xe5, 0x43, 0x85, 0x40, 0x06, 0xe1, 0x24, 0x69, 0x7d, 0x0f, + 0x3b, 0x44, 0xc6, 0xb2, 0xc7, 0x79, 0x1e, 0x33, 0x04, 0x9b, 0x1e, 0x4f, 0x45, 0x76, 0x8e, 0xfa, + 0x96, 0x71, 0x64, 0xc1, 0x6a, 0xa0, 0x8a, 0x2c, 0x90, 0x31, 0x6a, 0x79, 0x60, 0xdc, 0xed, 0xcf, + 0x2e, 0x7b, 0x02, 0x86, 0x7c, 0x1f, 0xe9, 0xae, 0x8c, 0x71, 0x20, 0x77, 0x15, 0xd4, 0xae, 0xed, + 0x0c, 0xef, 0x71, 0x3e, 0x48, 0x99, 0x40, 0x5f, 0xea, 0x10, 0xd2, 0x79, 0x34, 0xb9, 0xa1, 0x1e, + 0x9f, 0xb3, 0xdb, 0x4c, 0xbe, 0x2e, 0xe1, 0x7e, 0x34, 0xb9, 0xe9, 0x4a, 0xb0, 0xf5, 0x0b, 0x20, + 0x97, 0x87, 0xde, 0x28, 0x52, 0x67, 0xe5, 0x17, 0x7d, 0x0d, 0xb5, 0xdc, 0xb9, 0x95, 0xc0, 0xe4, + 0x0e, 0xab, 0xe0, 0xb4, 0x60, 0x4b, 0xa5, 0x8a, 0x92, 0xad, 0xb6, 0x6b, 0xa7, 0xf3, 0x50, 0xe6, + 0x8b, 0x96, 0xd1, 0x54, 0x8b, 0xc2, 0xde, 0x9a, 0x78, 0xe6, 0x45, 0x13, 0x64, 0x18, 0x75, 0x58, + 0x0b, 0xcb, 0xb0, 0xaa, 0x35, 0xfa, 0x06, 0x4a, 0xd7, 0xcc, 0x9f, 0x2f, 0x92, 0x5c, 0x18, 0x9d, + 0x2e, 0x33, 0xf2, 0xb4, 0xa7, 0x19, 0x92, 0x9b, 0xb4, 0xfe, 0x2c, 0x41, 0x29, 0x03, 0x51, 0x1b, + 0x36, 0x27, 0x91, 0xa7, 0x15, 0xb7, 0xdb, 0x2f, 0x1f, 0x6e, 0xcb, 0x7f, 0x3b, 0x91, 0xc7, 0x89, + 0xb2, 0x45, 0x6d, 0x38, 0xc8, 0xa4, 0x68, 0x1a, 0x2d, 0x92, 0x09, 0xa7, 0xf1, 0xe2, 0xea, 0x86, + 0xdf, 0x66, 0xaf, 0xbd, 0x97, 0x91, 0xae, 0xe2, 0x86, 0x8a, 0x42, 0x3f, 0xc0, 0x76, 0x9e, 0x6a, + 0x8b, 0xd8, 0x63, 0x82, 0xab, 0xb7, 0xaf, 0xb6, 0x1b, 0x2b, 0x27, 0x66, 0x19, 0x37, 0x56, 0x3c, + 0xa9, 0x4f, 0x56, 0x97, 0x32, 0xad, 0x66, 0x62, 0x3e, 0xd1, 0xaf, 0x27, 0xf3, 0x7a, 0x93, 0x94, + 0x25, 0xa0, 0xde, 0xad, 0x05, 0xf5, 0x28, 0xf4, 0xa3, 0x90, 0xa6, 0x33, 0x46, 0xdb, 0x6f, 0xde, + 0xaa, 0x5c, 0xae, 0x91, 0xaa, 0x02, 0xdd, 0x19, 0x6b, 0xbf, 0x79, 0x2b, 0x53, 0x4f, 0x55, 0x0f, + 0xff, 0x23, 0xf6, 0x93, 0xdb, 0x46, 0xf1, 0xb8, 0x70, 0x52, 0x27, 0xaa, 0xa0, 0xb0, 0x42, 0xd0, + 0x3e, 0x6c, 0x5d, 0xcf, 0xd9, 0x34, 0x6d, 0x94, 0x14, 0xa5, 0x17, 0xad, 0x7f, 0x36, 0xa1, 0xba, + 0x12, 0x02, 0x54, 0x83, 0x32, 0xc1, 0x2e, 0x26, 0x17, 0xb8, 0x6b, 0x7c, 0x86, 0x1a, 0xb0, 0x3f, + 0xb6, 0xdf, 0xdb, 0xce, 0x07, 0x9b, 0x0e, 0xcd, 0xcb, 0x01, 0xb6, 0x47, 0xf4, 0xdc, 0x74, 0xcf, + 0x8d, 0x02, 0x7a, 0x01, 0x0d, 0xcb, 0xee, 0x38, 0x84, 0xe0, 0xce, 0x68, 0xc9, 0x99, 0x03, 0x67, + 0x6c, 0x8f, 0x8c, 0x27, 0xe8, 0x15, 0x3c, 0xef, 0x59, 0xb6, 0xd9, 0xa7, 0x77, 0x36, 0x9d, 0xfe, + 0xe8, 0x82, 0xe2, 0x8f, 0x43, 0x8b, 0x5c, 0x1a, 0x1b, 0x8f, 0x19, 0x9c, 0x8f, 0xfa, 0x9d, 0x5c, + 0x61, 0x13, 0x1d, 0xc2, 0x81, 0x36, 0xd0, 0x5b, 0xe8, 0xc8, 0x71, 0xa8, 0xeb, 0x38, 0xb6, 0xb1, + 0x85, 0x76, 0xa1, 0x6e, 0xd9, 0x17, 0x66, 0xdf, 0xea, 0x52, 0x82, 0xcd, 0xfe, 0xc0, 0x28, 0xa2, + 0x3d, 0xd8, 0xb9, 0x6f, 0x57, 0x92, 0x12, 0xb9, 0x9d, 0x63, 0x5b, 0x8e, 0x4d, 0x2f, 0x30, 0x71, + 0x2d, 0xc7, 0x36, 0xca, 0xe8, 0x29, 0xa0, 0x75, 0xea, 0x7c, 0x60, 0x76, 0x8c, 0x0a, 0x3a, 0x80, + 0xdd, 0x75, 0xfc, 0x3d, 0xbe, 0x34, 0x40, 0x86, 0x41, 0x5f, 0x8c, 0xbe, 0xc3, 0x7d, 0xe7, 0x03, + 0x1d, 0x58, 0xb6, 0x35, 0x18, 0x0f, 0x8c, 0x2a, 0xda, 0x07, 0xa3, 0x87, 0x31, 0xb5, 0x6c, 0x77, + 0xdc, 0xeb, 0x59, 0x1d, 0x0b, 0xdb, 0x23, 0xa3, 0xa6, 0x4f, 0x7e, 0xcc, 0xf1, 0xba, 0xdc, 0xd0, + 0x39, 0x37, 0x6d, 0x1b, 0xf7, 0x69, 0xd7, 0x72, 0xcd, 0x77, 0x7d, 0xdc, 0x35, 0xb6, 0xd1, 0x11, + 0x1c, 0x8e, 0xf0, 0x60, 0xe8, 0x10, 0x93, 0x5c, 0xd2, 0x9c, 0xef, 0x99, 0x56, 0x7f, 0x4c, 0xb0, + 0xb1, 0x83, 0x5e, 0xc3, 0x11, 0xc1, 0x3f, 0x8d, 0x2d, 0x82, 0xbb, 0xd4, 0x76, 0xba, 0x98, 0xf6, + 0xb0, 0x39, 0x1a, 0x13, 0x4c, 0x07, 0x96, 0xeb, 0x5a, 0xf6, 0x8f, 0x86, 0x81, 0xbe, 0x80, 0xe3, + 0xa5, 0xc9, 0x52, 0xe0, 0x9e, 0xd5, 0xae, 0xf4, 0x2f, 0x7f, 0x4f, 0x1b, 0x7f, 0x1c, 0xd1, 0x21, + 0xc6, 0xc4, 0x40, 0xa8, 0x09, 0x4f, 0xef, 0x8e, 0xd7, 0x07, 0x64, 0x67, 0xef, 0x49, 0x6e, 0x88, + 0xc9, 0xc0, 0xb4, 0xe5, 0x03, 0xaf, 0x71, 0xfb, 0xf2, 0xda, 0x77, 0xdc, 0xfd, 0x6b, 0x1f, 0xb4, + 0xfe, 0x7a, 0x02, 0xf5, 0xb5, 0xa4, 0x47, 0x2f, 0xa0, 0x92, 0xfa, 0xd3, 0x90, 0x09, 0x59, 0xca, + 0xba, 0xca, 0xef, 0x00, 0x35, 0x00, 0x66, 0xcc, 0x0f, 0x75, 0x7b, 0xd1, 0xd5, 0x56, 0x51, 0x88, + 0x6a, 0x2e, 0xcf, 0xa0, 0x24, 0x6b, 0x46, 0xf6, 0xf2, 0x0d, 0x55, 0x20, 0x45, 0xb9, 0xb4, 0x3c, + 0xa9, 0x2a, 0xfb, 0x57, 0x2a, 0x58, 0x10, 0xab, 0xda, 0xa9, 0x93, 0x3b, 0x00, 0x7d, 0x0e, 0x79, + 0xa9, 0x51, 0x9d, 0xff, 0x5b, 0xca, 0xa2, 0x96, 0x81, 0x3d, 0x89, 0x3d, 0xe8, 0x8c, 0x82, 0x65, + 0x15, 0xb4, 0xda, 0x19, 0x05, 0x43, 0x5f, 0xc3, 0xae, 0x2e, 0x53, 0x3f, 0xf4, 0x83, 0x45, 0xa0, + 0xcb, 0xb5, 0xa4, 0x6e, 0xb3, 0xa3, 0xca, 0x55, 0xe3, 0xaa, 0x6a, 0x0f, 0xa1, 0x7c, 0xc5, 0x52, + 0x2e, 0x9b, 0x72, 0xa3, 0xac, 0xc4, 0x4a, 0x72, 0xdd, 0xe3, 0x6a, 0xbe, 0xc8, 0x56, 0x9d, 0xc8, + 0x46, 0x51, 0xd1, 0xd4, 0x35, 0xe7, 0x84, 0x09, 0xde, 0xfe, 0xb7, 0x00, 0x45, 0xd5, 0x19, 0x13, + 0xd4, 0x85, 0xaa, 0xec, 0x94, 0xd9, 0x70, 0x42, 0x87, 0x2b, 0xbd, 0x64, 0x7d, 0xee, 0x36, 0x9b, + 0x8f, 0x51, 0x59, 0x63, 0x7d, 0x0f, 0x06, 0x4e, 0x85, 0x1f, 0xc8, 0xa6, 0x93, 0x8d, 0x0e, 0xb4, + 0x6a, 0x7f, 0x6f, 0x1e, 0x35, 0x9f, 0x3f, 0xca, 0x65, 0x62, 0x7d, 0x7d, 0xa5, 0xac, 0x79, 0xa3, + 0xa3, 0x15, 0xdb, 0x87, 0x13, 0xa3, 0xf9, 0xf2, 0xff, 0x68, 0xad, 0xf6, 0xee, 0xdb, 0x9f, 0xcf, + 0xa6, 0xbe, 0x98, 0x2d, 0xae, 0x4e, 0x27, 0x51, 0x70, 0x36, 0xf7, 0xa7, 0x33, 0x11, 0xfa, 0xe1, + 0x34, 0xe4, 0xe2, 0xf7, 0x28, 0xb9, 0x39, 0x9b, 0x87, 0xde, 0x99, 0x1a, 0x20, 0x67, 0x4b, 0x99, + 0xab, 0xa2, 0xfa, 0xef, 0xf1, 0xdd, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x7d, 0x2a, 0xf5, + 0xab, 0x08, 0x00, 0x00, } diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index 4ab4af29..94992269 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -1,7 +1,11 @@ syntax = "proto3"; +import "rpc.proto"; + package routerrpc; +option go_package = "github.com/lightningnetwork/lnd/lnrpc/routerrpc"; + message PaymentRequest { /** A serialized BOLT-11 payment request that contains all information @@ -85,6 +89,127 @@ message RouteFeeResponse { int64 time_lock_delay = 2; } +message SendToRouteRequest { + /// The payment hash to use for the HTLC. + bytes payment_hash = 1; + + /// Route that should be used to attempt to complete the payment. + lnrpc.Route route = 2; +} + +message SendToRouteResponse { + /// The preimage obtained by making the payment. + bytes preimage = 1; + + /// The failure message in case the payment failed. + Failure failure = 2; +} + +message Failure { + enum FailureCode { + /** + The numbers assigned in this enumeration match the failure codes as + defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + a RESERVED value is added. + */ + RESERVED = 0; + + UNKNOWN_PAYMENT_HASH = 1; + INCORRECT_PAYMENT_AMOUNT = 2; + FINAL_INCORRECT_CLTV_EXPIRY = 3; + FINAL_INCORRECT_HTLC_AMOUNT = 4; + FINAL_EXPIRY_TOO_SOON = 5; + INVALID_REALM = 6; + EXPIRY_TOO_SOON = 7; + INVALID_ONION_VERSION = 8; + INVALID_ONION_HMAC = 9; + INVALID_ONION_KEY = 10; + AMOUNT_BELOW_MINIMUM = 11; + FEE_INSUFFICIENT = 12; + INCORRECT_CLTV_EXPIRY = 13; + CHANNEL_DISABLED = 14; + TEMPORARY_CHANNEL_FAILURE = 15; + REQUIRED_NODE_FEATURE_MISSING = 16; + REQUIRED_CHANNEL_FEATURE_MISSING = 17; + UNKNOWN_NEXT_PEER = 18; + TEMPORARY_NODE_FAILURE = 19; + PERMANENT_NODE_FAILURE = 20; + PERMANENT_CHANNEL_FAILURE = 21; + } + + /// Failure code as defined in the Lightning spec + FailureCode code = 1; + + /** + The node pubkey of the intermediate or final node that generated the failure + message. + **/ + bytes failure_source_pubkey = 2; + + /// An optional channel update message. + ChannelUpdate channel_update = 3; + + /// A failure type-dependent htlc value. + uint64 htlc_msat = 4; + + /// The sha256 sum of the onion payload. + bytes onion_sha_256 = 5; + + /// A failure type-dependent cltv expiry value. + uint32 cltv_expiry = 6; + + /// A failure type-dependent flags value. + uint32 flags = 7; +} + + +message ChannelUpdate { + // Signature is used to validate the announced data and prove the + // ownership of node id. + bytes signature = 1; + + // ChainHash denotes the target chain that this channel was opened + // within. This value should be the genesis hash of the target chain. + // Along with the short channel ID, this uniquely identifies the + // channel globally in a blockchain. + bytes chain_hash = 2; + + // ShortChannelID is the unique description of the funding transaction. + uint64 chan_id = 3; + + // Timestamp allows ordering in the case of multiple announcements. We + // should ignore the message if timestamp is not greater than + // the last-received. + uint32 timestamp = 4; + + // Flags is a bitfield that describes additional meta-data concerning + // how the update is to be interpreted. Currently, the + // least-significant bit must be set to 0 if the creating node + // corresponds to the first node in the previously sent channel + // announcement and 1 otherwise. If the second bit is set, then the + // channel is set to be disabled. + uint32 channel_flags = 5; + + // TimeLockDelta is the minimum number of blocks this node requires to + // be added to the expiry of HTLCs. This is a security parameter + // determined by the node operator. This value represents the required + // gap between the time locks of the incoming and outgoing HTLC's set + // to this node. + uint32 time_lock_delta = 6; + + // HtlcMinimumMsat is the minimum HTLC value which will be accepted. + uint64 htlc_minimum_msat = 7; + + // BaseFee is the base fee that must be used for incoming HTLC's to + // this particular channel. This value will be tacked onto the required + // for a payment independent of the size of the payment. + uint32 base_fee = 8; + + // FeeRate is the fee rate that will be charged per millionth of a + // satoshi. + uint32 fee_rate = 9; +} + service Router { /** SendPayment attempts to route a payment described by the passed @@ -100,4 +225,11 @@ service Router { may cost to send an HTLC to the target end destination. */ rpc EstimateRouteFee(RouteFeeRequest) returns (RouteFeeResponse); + + /** + SendToRoute attempts to make a payment via the specified route. This method + differs from SendPayment in that it allows users to specify a full route + manually. This can be used for things like rebalancing, and atomic swaps. + */ + rpc SendToRoute(SendToRouteRequest) returns (SendToRouteResponse); } diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index 4bb7f249..9ba35892 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -11,6 +11,9 @@ import ( "path/filepath" "time" + "github.com/lightningnetwork/lnd/htlcswitch" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/btcsuite/btcutil" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwire" @@ -32,6 +35,10 @@ var ( // macaroonOps are the set of capabilities that our minted macaroon (if // it doesn't already exist) will have. macaroonOps = []bakery.Op{ + { + Entity: "offchain", + Action: "read", + }, { Entity: "offchain", Action: "write", @@ -40,11 +47,15 @@ var ( // macPermissions maps RPC calls to the permissions they require. macPermissions = map[string][]bakery.Op{ - "/routerpc.Router/SendPayment": {{ + "/routerrpc.Router/SendPayment": {{ Entity: "offchain", Action: "write", }}, - "/routerpc.Router/EstimateRouteFee": {{ + "/routerrpc.Router/SendToRoute": {{ + Entity: "offchain", + Action: "write", + }}, + "/routerrpc.Router/EstimateRouteFee": {{ Entity: "offchain", Action: "read", }}, @@ -262,3 +273,166 @@ func (s *Server) EstimateRouteFee(ctx context.Context, TimeLockDelay: int64(route.TotalTimeLock), }, nil } + +// SendToRoute sends a payment through a predefined route. The response of this +// call contains structured error information. +func (s *Server) SendToRoute(ctx context.Context, + req *SendToRouteRequest) (*SendToRouteResponse, error) { + + if req.Route == nil { + return nil, fmt.Errorf("unable to send, no routes provided") + } + + route, err := s.cfg.RouterBackend.UnmarshallRoute(req.Route) + if err != nil { + return nil, err + } + + hash, err := lntypes.MakeHash(req.PaymentHash) + if err != nil { + return nil, err + } + + preimage, err := s.cfg.Router.SendToRoute(hash, route) + + // In the success case, return the preimage. + if err == nil { + return &SendToRouteResponse{ + Preimage: preimage[:], + }, nil + } + + // In the failure case, marshall the failure message to the rpc format + // before returning it to the caller. + rpcErr, err := marshallError(err) + if err != nil { + return nil, err + } + + return &SendToRouteResponse{ + Failure: rpcErr, + }, nil +} + +// marshallError marshall an error as received from the switch to rpc structs +// suitable for returning to the caller of an rpc method. +// +// Because of difficulties with using protobuf oneof constructs in some +// languages, the decision was made here to use a single message format for all +// failure messages with some fields left empty depending on the failure type. +func marshallError(sendError error) (*Failure, error) { + response := &Failure{} + + fErr, ok := sendError.(*htlcswitch.ForwardingError) + if !ok { + return nil, sendError + } + + switch onionErr := fErr.FailureMessage.(type) { + + case *lnwire.FailUnknownPaymentHash: + response.Code = Failure_UNKNOWN_PAYMENT_HASH + + case *lnwire.FailIncorrectPaymentAmount: + response.Code = Failure_INCORRECT_PAYMENT_AMOUNT + + case *lnwire.FailFinalIncorrectCltvExpiry: + response.Code = Failure_FINAL_INCORRECT_CLTV_EXPIRY + response.CltvExpiry = onionErr.CltvExpiry + + case *lnwire.FailFinalIncorrectHtlcAmount: + response.Code = Failure_FINAL_INCORRECT_HTLC_AMOUNT + response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount) + + case *lnwire.FailFinalExpiryTooSoon: + response.Code = Failure_FINAL_EXPIRY_TOO_SOON + + case *lnwire.FailInvalidRealm: + response.Code = Failure_INVALID_REALM + + case *lnwire.FailExpiryTooSoon: + response.Code = Failure_EXPIRY_TOO_SOON + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + + case *lnwire.FailInvalidOnionVersion: + response.Code = Failure_INVALID_ONION_VERSION + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailInvalidOnionHmac: + response.Code = Failure_INVALID_ONION_HMAC + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailInvalidOnionKey: + response.Code = Failure_INVALID_ONION_KEY + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailAmountBelowMinimum: + response.Code = Failure_AMOUNT_BELOW_MINIMUM + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.HtlcMsat = uint64(onionErr.HtlcMsat) + + case *lnwire.FailFeeInsufficient: + response.Code = Failure_FEE_INSUFFICIENT + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.HtlcMsat = uint64(onionErr.HtlcMsat) + + case *lnwire.FailIncorrectCltvExpiry: + response.Code = Failure_INCORRECT_CLTV_EXPIRY + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.CltvExpiry = onionErr.CltvExpiry + + case *lnwire.FailChannelDisabled: + response.Code = Failure_CHANNEL_DISABLED + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.Flags = uint32(onionErr.Flags) + + case *lnwire.FailTemporaryChannelFailure: + response.Code = Failure_TEMPORARY_CHANNEL_FAILURE + response.ChannelUpdate = marshallChannelUpdate(onionErr.Update) + + case *lnwire.FailRequiredNodeFeatureMissing: + response.Code = Failure_REQUIRED_NODE_FEATURE_MISSING + + case *lnwire.FailRequiredChannelFeatureMissing: + response.Code = Failure_REQUIRED_CHANNEL_FEATURE_MISSING + + case *lnwire.FailUnknownNextPeer: + response.Code = Failure_UNKNOWN_NEXT_PEER + + case *lnwire.FailTemporaryNodeFailure: + response.Code = Failure_TEMPORARY_NODE_FAILURE + + case *lnwire.FailPermanentNodeFailure: + response.Code = Failure_PERMANENT_NODE_FAILURE + + case *lnwire.FailPermanentChannelFailure: + response.Code = Failure_PERMANENT_CHANNEL_FAILURE + + default: + return nil, errors.New("unknown wire error") + } + + response.FailureSourcePubkey = fErr.ErrorSource.SerializeCompressed() + + return response, nil +} + +// marshallChannelUpdate marshalls a channel update as received over the wire to +// the router rpc format. +func marshallChannelUpdate(update *lnwire.ChannelUpdate) *ChannelUpdate { + if update == nil { + return nil + } + + return &ChannelUpdate{ + Signature: update.Signature[:], + ChainHash: update.ChainHash[:], + ChanId: update.ShortChannelID.ToUint64(), + Timestamp: update.Timestamp, + ChannelFlags: uint32(update.ChannelFlags), + TimeLockDelta: uint32(update.TimeLockDelta), + HtlcMinimumMsat: uint64(update.HtlcMinimumMsat), + BaseFee: update.BaseFee, + FeeRate: update.FeeRate, + } +}