From 7a5bd29a69d659629f8fdcc8dd9aec7b2cfa4904 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Tue, 7 May 2019 17:01:01 +0200 Subject: [PATCH] lnrpc+routing: remove k shortest path finding --- cmd/lncli/commands.go | 6 - lnd_test.go | 25 +- lnrpc/routerrpc/router_backend.go | 39 +- lnrpc/routerrpc/router_backend_test.go | 16 +- lnrpc/routerrpc/router_server.go | 12 +- lnrpc/rpc.pb.go | 1261 ++++++++++++------------ lnrpc/rpc.proto | 6 +- lnrpc/rpc.swagger.json | 8 - routing/pathfind.go | 177 ---- routing/pathfind_test.go | 167 +--- routing/router.go | 135 +-- routing/router_test.go | 90 +- rpcserver.go | 2 +- 13 files changed, 715 insertions(+), 1229 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index ab7f38748ec0..c4d3109a67a4 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -2977,11 +2977,6 @@ var queryRoutesCommand = cli.Command{ Usage: "percentage of the payment's amount used as the " + "maximum fee allowed when sending the payment", }, - cli.Int64Flag{ - Name: "num_max_routes", - Usage: "the max number of routes to be returned", - Value: 10, - }, cli.Int64Flag{ Name: "final_cltv_delta", Usage: "(optional) number of blocks the last hop has to reveal " + @@ -3035,7 +3030,6 @@ func queryRoutes(ctx *cli.Context) error { PubKey: dest, Amt: amt, FeeLimit: feeLimit, - NumRoutes: int32(ctx.Int("num_max_routes")), FinalCltvDelta: int32(ctx.Int("final_cltv_delta")), } diff --git a/lnd_test.go b/lnd_test.go index 96676d59a2b8..d526ec74d5eb 100644 --- a/lnd_test.go +++ b/lnd_test.go @@ -1460,7 +1460,6 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) { routesReq := &lnrpc.QueryRoutesRequest{ PubKey: carol.PubKeyStr, Amt: int64(payAmt), - NumRoutes: 1, FinalCltvDelta: defaultTimeLockDelta, } @@ -4270,7 +4269,6 @@ func testSingleHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) { routesReq := &lnrpc.QueryRoutesRequest{ PubKey: net.Bob.PubKeyStr, Amt: paymentAmt, - NumRoutes: 1, FinalCltvDelta: defaultBitcoinTimeLockDelta, } ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) @@ -4442,7 +4440,6 @@ func testMultiHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) { routesReq := &lnrpc.QueryRoutesRequest{ PubKey: carol.PubKeyStr, Amt: paymentAmt, - NumRoutes: 1, FinalCltvDelta: defaultBitcoinTimeLockDelta, } ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) @@ -4603,9 +4600,8 @@ func testSendToRouteErrorPropagation(net *lntest.NetworkHarness, t *harnessTest) // Query routes from Carol to Charlie which will be an invalid route // for Alice -> Bob. fakeReq := &lnrpc.QueryRoutesRequest{ - PubKey: charlie.PubKeyStr, - Amt: int64(1), - NumRoutes: 1, + PubKey: charlie.PubKeyStr, + Amt: int64(1), } ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) fakeRoute, err := carol.QueryRoutes(ctxt, fakeReq) @@ -12342,9 +12338,8 @@ func testQueryRoutes(net *lntest.NetworkHarness, t *harnessTest) { // Query for routes to pay from Alice to Dave. const paymentAmt = 1000 routesReq := &lnrpc.QueryRoutesRequest{ - PubKey: dave.PubKeyStr, - Amt: paymentAmt, - NumRoutes: 1, + PubKey: dave.PubKeyStr, + Amt: paymentAmt, } ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) routesRes, err := net.Alice.QueryRoutes(ctxt, routesReq) @@ -12646,10 +12641,9 @@ func testRouteFeeCutoff(net *lntest.NetworkHarness, t *harnessTest) { // payments. testFeeCutoff := func(feeLimit *lnrpc.FeeLimit) { queryRoutesReq := &lnrpc.QueryRoutesRequest{ - PubKey: dave.PubKeyStr, - Amt: paymentAmt, - FeeLimit: feeLimit, - NumRoutes: 2, + PubKey: dave.PubKeyStr, + Amt: paymentAmt, + FeeLimit: feeLimit, } ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) routesResp, err := net.Alice.QueryRoutes(ctxt, queryRoutesReq) @@ -12657,11 +12651,6 @@ func testRouteFeeCutoff(net *lntest.NetworkHarness, t *harnessTest) { t.Fatalf("unable to get routes: %v", err) } - if len(routesResp.Routes) != 1 { - t.Fatalf("expected one route, got %d", - len(routesResp.Routes)) - } - checkRoute(routesResp.Routes[0]) invoice := &lnrpc.Invoice{Value: paymentAmt} diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 4136968aacac..714e71571014 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -28,10 +28,9 @@ type RouterBackend struct { // FindRoutes is a closure that abstracts away how we locate/query for // routes. - FindRoutes func(source, target route.Vertex, + FindRoute func(source, target route.Vertex, amt lnwire.MilliSatoshi, restrictions *routing.RestrictParams, - numPaths uint32, finalExpiry ...uint16) ( - []*route.Route, error) + finalExpiry ...uint16) (*route.Route, error) } // QueryRoutes attempts to query the daemons' Channel Router for a possible @@ -122,53 +121,35 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context, IgnoredEdges: ignoredEdges, } - // numRoutes will default to 10 if not specified explicitly. - numRoutesIn := uint32(in.NumRoutes) - if numRoutesIn == 0 { - numRoutesIn = 10 - } - // Query the channel router for a possible path to the destination that // can carry `in.Amt` satoshis _including_ the total fee required on // the route. var ( - routes []*route.Route + route *route.Route findErr error ) if in.FinalCltvDelta == 0 { - routes, findErr = r.FindRoutes( + route, findErr = r.FindRoute( sourcePubKey, targetPubKey, amtMSat, restrictions, - numRoutesIn, ) } else { - routes, findErr = r.FindRoutes( + route, findErr = r.FindRoute( sourcePubKey, targetPubKey, amtMSat, restrictions, - numRoutesIn, uint16(in.FinalCltvDelta), + uint16(in.FinalCltvDelta), ) } if findErr != nil { return nil, findErr } - // As the number of returned routes can be less than the number of - // requested routes, we'll clamp down the length of the response to the - // minimum of the two. - numRoutes := uint32(len(routes)) - if numRoutesIn < numRoutes { - numRoutes = numRoutesIn - } - // For each valid route, we'll convert the result into the format // required by the RPC system. + + rpcRoute := r.MarshallRoute(route) + routeResp := &lnrpc.QueryRoutesResponse{ - Routes: make([]*lnrpc.Route, 0, in.NumRoutes), - } - for i := uint32(0); i < numRoutes; i++ { - routeResp.Routes = append( - routeResp.Routes, - r.MarshallRoute(routes[i]), - ) + Routes: []*lnrpc.Route{rpcRoute}, } return routeResp, nil diff --git a/lnrpc/routerrpc/router_backend_test.go b/lnrpc/routerrpc/router_backend_test.go index 60cd8ab08511..b8f0f6c439a8 100644 --- a/lnrpc/routerrpc/router_backend_test.go +++ b/lnrpc/routerrpc/router_backend_test.go @@ -42,7 +42,6 @@ func TestQueryRoutes(t *testing.T) { request := &lnrpc.QueryRoutesRequest{ PubKey: destKey, Amt: 100000, - NumRoutes: 1, FinalCltvDelta: 100, FeeLimit: &lnrpc.FeeLimit{ Limit: &lnrpc.FeeLimit_Fixed{ @@ -58,19 +57,14 @@ func TestQueryRoutes(t *testing.T) { rt := &route.Route{} - findRoutes := func(source, target route.Vertex, + findRoute := func(source, target route.Vertex, amt lnwire.MilliSatoshi, restrictions *routing.RestrictParams, - numPaths uint32, finalExpiry ...uint16) ( - []*route.Route, error) { + finalExpiry ...uint16) (*route.Route, error) { if int64(amt) != request.Amt*1000 { t.Fatal("unexpected amount") } - if numPaths != 1 { - t.Fatal("unexpected number of routes") - } - if source != sourceKey { t.Fatal("unexpected source key") } @@ -101,14 +95,12 @@ func TestQueryRoutes(t *testing.T) { t.Fatal("unexpected ignored node") } - return []*route.Route{ - rt, - }, nil + return rt, nil } backend := &RouterBackend{ MaxPaymentMSat: lnwire.NewMSatFromSatoshis(1000000), - FindRoutes: findRoutes, + FindRoute: findRoute, SelfNode: route.Vertex{1, 2, 3}, FetchChannelCapacity: func(chanID uint64) ( btcutil.Amount, error) { diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index e423c5a26693..4bb7f2491aaf 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -247,22 +247,18 @@ func (s *Server) EstimateRouteFee(ctx context.Context, // Finally, we'll query for a route to the destination that can carry // that target amount, we'll only request a single route. - routes, err := s.cfg.Router.FindRoutes( + route, err := s.cfg.Router.FindRoute( s.cfg.RouterBackend.SelfNode, destNode, amtMsat, &routing.RestrictParams{ FeeLimit: feeLimit, - }, 1, + }, ) if err != nil { return nil, err } - if len(routes) == 0 { - return nil, fmt.Errorf("unable to find route to dest: %v", err) - } - return &RouteFeeResponse{ - RoutingFeeMsat: int64(routes[0].TotalFees), - TimeLockDelay: int64(routes[0].TotalTimeLock), + RoutingFeeMsat: int64(route.TotalFees), + TimeLockDelay: int64(route.TotalTimeLock), }, nil } diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index bdd4edb92a93..2223013a6272 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_85b0b58f0d9865bd, []int{0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{41, 0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{44, 0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{62, 0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{92, 0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{0} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{1} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{2} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{3} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{4} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{5} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{6} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{7} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{8} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{9} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{10} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{11} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{12} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{13} + return fileDescriptor_rpc_c21d4a52f85dc337, []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_85b0b58f0d9865bd, []int{14} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{14} } func (m *SendResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendResponse.Unmarshal(m, b) @@ -1204,7 +1204,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_85b0b58f0d9865bd, []int{15} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{15} } func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendToRouteRequest.Unmarshal(m, b) @@ -1269,7 +1269,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_85b0b58f0d9865bd, []int{16} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{16} } func (m *ChannelPoint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelPoint.Unmarshal(m, b) @@ -1415,7 +1415,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_85b0b58f0d9865bd, []int{17} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{17} } func (m *OutPoint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OutPoint.Unmarshal(m, b) @@ -1470,7 +1470,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_85b0b58f0d9865bd, []int{18} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{18} } func (m *LightningAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LightningAddress.Unmarshal(m, b) @@ -1518,7 +1518,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_85b0b58f0d9865bd, []int{19} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{19} } func (m *EstimateFeeRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EstimateFeeRequest.Unmarshal(m, b) @@ -1566,7 +1566,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_85b0b58f0d9865bd, []int{20} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{20} } func (m *EstimateFeeResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EstimateFeeResponse.Unmarshal(m, b) @@ -1616,7 +1616,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_85b0b58f0d9865bd, []int{21} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{21} } func (m *SendManyRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendManyRequest.Unmarshal(m, b) @@ -1669,7 +1669,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_85b0b58f0d9865bd, []int{22} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{22} } func (m *SendManyResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendManyResponse.Unmarshal(m, b) @@ -1719,7 +1719,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_85b0b58f0d9865bd, []int{23} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{23} } func (m *SendCoinsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendCoinsRequest.Unmarshal(m, b) @@ -1786,7 +1786,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_85b0b58f0d9865bd, []int{24} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{24} } func (m *SendCoinsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SendCoinsResponse.Unmarshal(m, b) @@ -1827,7 +1827,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_85b0b58f0d9865bd, []int{25} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{25} } func (m *ListUnspentRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListUnspentRequest.Unmarshal(m, b) @@ -1873,7 +1873,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_85b0b58f0d9865bd, []int{26} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{26} } func (m *ListUnspentResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListUnspentResponse.Unmarshal(m, b) @@ -1912,7 +1912,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_85b0b58f0d9865bd, []int{27} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{27} } func (m *NewAddressRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NewAddressRequest.Unmarshal(m, b) @@ -1951,7 +1951,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_85b0b58f0d9865bd, []int{28} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{28} } func (m *NewAddressResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NewAddressResponse.Unmarshal(m, b) @@ -1990,7 +1990,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_85b0b58f0d9865bd, []int{29} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{29} } func (m *SignMessageRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignMessageRequest.Unmarshal(m, b) @@ -2029,7 +2029,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_85b0b58f0d9865bd, []int{30} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{30} } func (m *SignMessageResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignMessageResponse.Unmarshal(m, b) @@ -2070,7 +2070,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_85b0b58f0d9865bd, []int{31} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{31} } func (m *VerifyMessageRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyMessageRequest.Unmarshal(m, b) @@ -2118,7 +2118,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_85b0b58f0d9865bd, []int{32} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{32} } func (m *VerifyMessageResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyMessageResponse.Unmarshal(m, b) @@ -2167,7 +2167,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_85b0b58f0d9865bd, []int{33} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{33} } func (m *ConnectPeerRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConnectPeerRequest.Unmarshal(m, b) @@ -2211,7 +2211,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_85b0b58f0d9865bd, []int{34} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{34} } func (m *ConnectPeerResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConnectPeerResponse.Unmarshal(m, b) @@ -2243,7 +2243,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_85b0b58f0d9865bd, []int{35} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{35} } func (m *DisconnectPeerRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectPeerRequest.Unmarshal(m, b) @@ -2280,7 +2280,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_85b0b58f0d9865bd, []int{36} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{36} } func (m *DisconnectPeerResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectPeerResponse.Unmarshal(m, b) @@ -2314,7 +2314,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_85b0b58f0d9865bd, []int{37} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{37} } func (m *HTLC) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HTLC.Unmarshal(m, b) @@ -2429,7 +2429,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_85b0b58f0d9865bd, []int{38} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{38} } func (m *Channel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Channel.Unmarshal(m, b) @@ -2596,7 +2596,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_85b0b58f0d9865bd, []int{39} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{39} } func (m *ListChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListChannelsRequest.Unmarshal(m, b) @@ -2656,7 +2656,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_85b0b58f0d9865bd, []int{40} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{40} } func (m *ListChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListChannelsResponse.Unmarshal(m, b) @@ -2713,7 +2713,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_85b0b58f0d9865bd, []int{41} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{41} } func (m *ChannelCloseSummary) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelCloseSummary.Unmarshal(m, b) @@ -2819,7 +2819,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_85b0b58f0d9865bd, []int{42} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{42} } func (m *ClosedChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelsRequest.Unmarshal(m, b) @@ -2892,7 +2892,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_85b0b58f0d9865bd, []int{43} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{43} } func (m *ClosedChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelsResponse.Unmarshal(m, b) @@ -2947,7 +2947,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_85b0b58f0d9865bd, []int{44} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{44} } func (m *Peer) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Peer.Unmarshal(m, b) @@ -3040,7 +3040,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_85b0b58f0d9865bd, []int{45} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{45} } func (m *ListPeersRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPeersRequest.Unmarshal(m, b) @@ -3072,7 +3072,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_85b0b58f0d9865bd, []int{46} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{46} } func (m *ListPeersResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPeersResponse.Unmarshal(m, b) @@ -3109,7 +3109,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_85b0b58f0d9865bd, []int{47} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{47} } func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetInfoRequest.Unmarshal(m, b) @@ -3169,7 +3169,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_85b0b58f0d9865bd, []int{48} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{48} } func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetInfoResponse.Unmarshal(m, b) @@ -3302,7 +3302,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_85b0b58f0d9865bd, []int{49} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{49} } func (m *Chain) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Chain.Unmarshal(m, b) @@ -3349,7 +3349,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_85b0b58f0d9865bd, []int{50} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{50} } func (m *ConfirmationUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ConfirmationUpdate.Unmarshal(m, b) @@ -3401,7 +3401,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_85b0b58f0d9865bd, []int{51} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{51} } func (m *ChannelOpenUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelOpenUpdate.Unmarshal(m, b) @@ -3440,7 +3440,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_85b0b58f0d9865bd, []int{52} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{52} } func (m *ChannelCloseUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelCloseUpdate.Unmarshal(m, b) @@ -3495,7 +3495,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_85b0b58f0d9865bd, []int{53} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{53} } func (m *CloseChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CloseChannelRequest.Unmarshal(m, b) @@ -3557,7 +3557,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_85b0b58f0d9865bd, []int{54} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{54} } func (m *CloseStatusUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CloseStatusUpdate.Unmarshal(m, b) @@ -3700,7 +3700,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_85b0b58f0d9865bd, []int{55} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{55} } func (m *PendingUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingUpdate.Unmarshal(m, b) @@ -3766,7 +3766,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_85b0b58f0d9865bd, []int{56} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{56} } func (m *OpenChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OpenChannelRequest.Unmarshal(m, b) @@ -3877,7 +3877,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_85b0b58f0d9865bd, []int{57} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{57} } func (m *OpenStatusUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OpenStatusUpdate.Unmarshal(m, b) @@ -4033,7 +4033,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_85b0b58f0d9865bd, []int{58} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{58} } func (m *PendingHTLC) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingHTLC.Unmarshal(m, b) @@ -4105,7 +4105,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_85b0b58f0d9865bd, []int{59} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{59} } func (m *PendingChannelsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsRequest.Unmarshal(m, b) @@ -4145,7 +4145,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_85b0b58f0d9865bd, []int{60} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60} } func (m *PendingChannelsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse.Unmarshal(m, b) @@ -4217,7 +4217,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_85b0b58f0d9865bd, []int{60, 0} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 0} } func (m *PendingChannelsResponse_PendingChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_PendingChannel.Unmarshal(m, b) @@ -4304,7 +4304,7 @@ func (m *PendingChannelsResponse_PendingOpenChannel) String() string { } func (*PendingChannelsResponse_PendingOpenChannel) ProtoMessage() {} func (*PendingChannelsResponse_PendingOpenChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 1} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 1} } func (m *PendingChannelsResponse_PendingOpenChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_PendingOpenChannel.Unmarshal(m, b) @@ -4377,7 +4377,7 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) String() string { } func (*PendingChannelsResponse_WaitingCloseChannel) ProtoMessage() {} func (*PendingChannelsResponse_WaitingCloseChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 2} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 2} } func (m *PendingChannelsResponse_WaitingCloseChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_WaitingCloseChannel.Unmarshal(m, b) @@ -4425,7 +4425,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_85b0b58f0d9865bd, []int{60, 3} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 3} } func (m *PendingChannelsResponse_ClosedChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_ClosedChannel.Unmarshal(m, b) @@ -4489,7 +4489,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string { } func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 4} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 4} } func (m *PendingChannelsResponse_ForceClosedChannel) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PendingChannelsResponse_ForceClosedChannel.Unmarshal(m, b) @@ -4568,7 +4568,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_85b0b58f0d9865bd, []int{61} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{61} } func (m *ChannelEventSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEventSubscription.Unmarshal(m, b) @@ -4605,7 +4605,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_85b0b58f0d9865bd, []int{62} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{62} } func (m *ChannelEventUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEventUpdate.Unmarshal(m, b) @@ -4817,7 +4817,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_85b0b58f0d9865bd, []int{63} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{63} } func (m *WalletBalanceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WalletBalanceRequest.Unmarshal(m, b) @@ -4853,7 +4853,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_85b0b58f0d9865bd, []int{64} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{64} } func (m *WalletBalanceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WalletBalanceResponse.Unmarshal(m, b) @@ -4904,7 +4904,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_85b0b58f0d9865bd, []int{65} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{65} } func (m *ChannelBalanceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBalanceRequest.Unmarshal(m, b) @@ -4938,7 +4938,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_85b0b58f0d9865bd, []int{66} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{66} } func (m *ChannelBalanceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBalanceResponse.Unmarshal(m, b) @@ -4977,10 +4977,6 @@ type QueryRoutesRequest struct { PubKey string `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` // / The amount to send expressed in satoshis Amt int64 `protobuf:"varint,2,opt,name=amt,proto3" json:"amt,omitempty"` - // * - // Deprecated. The max number of routes to return. In the future, QueryRoutes - // will only return a single route. - NumRoutes int32 `protobuf:"varint,3,opt,name=num_routes,json=numRoutes,proto3" json:"num_routes,omitempty"` // Deprecated: Do not use. // / An optional CLTV delta from the current height that should be used for the timelock of the final hop FinalCltvDelta int32 `protobuf:"varint,4,opt,name=final_cltv_delta,json=finalCltvDelta,proto3" json:"final_cltv_delta,omitempty"` // * @@ -5008,7 +5004,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_85b0b58f0d9865bd, []int{67} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{67} } func (m *QueryRoutesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryRoutesRequest.Unmarshal(m, b) @@ -5042,14 +5038,6 @@ func (m *QueryRoutesRequest) GetAmt() int64 { return 0 } -// Deprecated: Do not use. -func (m *QueryRoutesRequest) GetNumRoutes() int32 { - if m != nil { - return m.NumRoutes - } - return 0 -} - func (m *QueryRoutesRequest) GetFinalCltvDelta() int32 { if m != nil { return m.FinalCltvDelta @@ -5103,7 +5091,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_85b0b58f0d9865bd, []int{68} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{68} } func (m *EdgeLocator) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_EdgeLocator.Unmarshal(m, b) @@ -5148,7 +5136,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_85b0b58f0d9865bd, []int{69} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{69} } func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_QueryRoutesResponse.Unmarshal(m, b) @@ -5200,7 +5188,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_85b0b58f0d9865bd, []int{70} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{70} } func (m *Hop) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Hop.Unmarshal(m, b) @@ -5321,7 +5309,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_85b0b58f0d9865bd, []int{71} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{71} } func (m *Route) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Route.Unmarshal(m, b) @@ -5397,7 +5385,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_85b0b58f0d9865bd, []int{72} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{72} } func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeInfoRequest.Unmarshal(m, b) @@ -5442,7 +5430,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_85b0b58f0d9865bd, []int{73} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{73} } func (m *NodeInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeInfo.Unmarshal(m, b) @@ -5503,7 +5491,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_85b0b58f0d9865bd, []int{74} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{74} } func (m *LightningNode) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LightningNode.Unmarshal(m, b) @@ -5570,7 +5558,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_85b0b58f0d9865bd, []int{75} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{75} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeAddress.Unmarshal(m, b) @@ -5620,7 +5608,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_85b0b58f0d9865bd, []int{76} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{76} } func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RoutingPolicy.Unmarshal(m, b) @@ -5710,7 +5698,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_85b0b58f0d9865bd, []int{77} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{77} } func (m *ChannelEdge) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEdge.Unmarshal(m, b) @@ -5801,7 +5789,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_85b0b58f0d9865bd, []int{78} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{78} } func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelGraphRequest.Unmarshal(m, b) @@ -5843,7 +5831,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_85b0b58f0d9865bd, []int{79} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{79} } func (m *ChannelGraph) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelGraph.Unmarshal(m, b) @@ -5892,7 +5880,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_85b0b58f0d9865bd, []int{80} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{80} } func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanInfoRequest.Unmarshal(m, b) @@ -5929,7 +5917,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_85b0b58f0d9865bd, []int{81} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{81} } func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkInfoRequest.Unmarshal(m, b) @@ -5969,7 +5957,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_85b0b58f0d9865bd, []int{82} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{82} } func (m *NetworkInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkInfo.Unmarshal(m, b) @@ -6069,7 +6057,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_85b0b58f0d9865bd, []int{83} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{83} } func (m *StopRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopRequest.Unmarshal(m, b) @@ -6099,7 +6087,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_85b0b58f0d9865bd, []int{84} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{84} } func (m *StopResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopResponse.Unmarshal(m, b) @@ -6129,7 +6117,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_85b0b58f0d9865bd, []int{85} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{85} } func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GraphTopologySubscription.Unmarshal(m, b) @@ -6162,7 +6150,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_85b0b58f0d9865bd, []int{86} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{86} } func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GraphTopologyUpdate.Unmarshal(m, b) @@ -6217,7 +6205,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_85b0b58f0d9865bd, []int{87} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{87} } func (m *NodeUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NodeUpdate.Unmarshal(m, b) @@ -6285,7 +6273,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_85b0b58f0d9865bd, []int{88} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{88} } func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelEdgeUpdate.Unmarshal(m, b) @@ -6365,7 +6353,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_85b0b58f0d9865bd, []int{89} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{89} } func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ClosedChannelUpdate.Unmarshal(m, b) @@ -6435,7 +6423,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_85b0b58f0d9865bd, []int{90} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{90} } func (m *HopHint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_HopHint.Unmarshal(m, b) @@ -6504,7 +6492,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_85b0b58f0d9865bd, []int{91} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{91} } func (m *RouteHint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RouteHint.Unmarshal(m, b) @@ -6619,7 +6607,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_85b0b58f0d9865bd, []int{92} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{92} } func (m *Invoice) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Invoice.Unmarshal(m, b) @@ -6811,7 +6799,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_85b0b58f0d9865bd, []int{93} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{93} } func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AddInvoiceResponse.Unmarshal(m, b) @@ -6868,7 +6856,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_85b0b58f0d9865bd, []int{94} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{94} } func (m *PaymentHash) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PaymentHash.Unmarshal(m, b) @@ -6924,7 +6912,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_85b0b58f0d9865bd, []int{95} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{95} } func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListInvoiceRequest.Unmarshal(m, b) @@ -6994,7 +6982,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_85b0b58f0d9865bd, []int{96} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{96} } func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListInvoiceResponse.Unmarshal(m, b) @@ -7057,7 +7045,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_85b0b58f0d9865bd, []int{97} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{97} } func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InvoiceSubscription.Unmarshal(m, b) @@ -7117,7 +7105,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_85b0b58f0d9865bd, []int{98} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{98} } func (m *Payment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Payment.Unmarshal(m, b) @@ -7204,7 +7192,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_85b0b58f0d9865bd, []int{99} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{99} } func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPaymentsRequest.Unmarshal(m, b) @@ -7236,7 +7224,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_85b0b58f0d9865bd, []int{100} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{100} } func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListPaymentsResponse.Unmarshal(m, b) @@ -7273,7 +7261,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_85b0b58f0d9865bd, []int{101} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{101} } func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteAllPaymentsRequest.Unmarshal(m, b) @@ -7303,7 +7291,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_85b0b58f0d9865bd, []int{102} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{102} } func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DeleteAllPaymentsResponse.Unmarshal(m, b) @@ -7334,7 +7322,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_85b0b58f0d9865bd, []int{103} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{103} } func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AbandonChannelRequest.Unmarshal(m, b) @@ -7371,7 +7359,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_85b0b58f0d9865bd, []int{104} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{104} } func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AbandonChannelResponse.Unmarshal(m, b) @@ -7403,7 +7391,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_85b0b58f0d9865bd, []int{105} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{105} } func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DebugLevelRequest.Unmarshal(m, b) @@ -7448,7 +7436,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_85b0b58f0d9865bd, []int{106} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{106} } func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DebugLevelResponse.Unmarshal(m, b) @@ -7487,7 +7475,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_85b0b58f0d9865bd, []int{107} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{107} } func (m *PayReqString) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PayReqString.Unmarshal(m, b) @@ -7534,7 +7522,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_85b0b58f0d9865bd, []int{108} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{108} } func (m *PayReq) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PayReq.Unmarshal(m, b) @@ -7634,7 +7622,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_85b0b58f0d9865bd, []int{109} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{109} } func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeeReportRequest.Unmarshal(m, b) @@ -7672,7 +7660,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_85b0b58f0d9865bd, []int{110} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{110} } func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelFeeReport.Unmarshal(m, b) @@ -7738,7 +7726,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_85b0b58f0d9865bd, []int{111} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{111} } func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeeReportResponse.Unmarshal(m, b) @@ -7806,7 +7794,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_85b0b58f0d9865bd, []int{112} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{112} } func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PolicyUpdateRequest.Unmarshal(m, b) @@ -7967,7 +7955,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_85b0b58f0d9865bd, []int{113} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{113} } func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PolicyUpdateResponse.Unmarshal(m, b) @@ -8005,7 +7993,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_85b0b58f0d9865bd, []int{114} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{114} } func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingHistoryRequest.Unmarshal(m, b) @@ -8077,7 +8065,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_85b0b58f0d9865bd, []int{115} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{115} } func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingEvent.Unmarshal(m, b) @@ -8160,7 +8148,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_85b0b58f0d9865bd, []int{116} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{116} } func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ForwardingHistoryResponse.Unmarshal(m, b) @@ -8206,7 +8194,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_85b0b58f0d9865bd, []int{117} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{117} } func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExportChannelBackupRequest.Unmarshal(m, b) @@ -8251,7 +8239,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_85b0b58f0d9865bd, []int{118} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{118} } func (m *ChannelBackup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackup.Unmarshal(m, b) @@ -8303,7 +8291,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_85b0b58f0d9865bd, []int{119} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{119} } func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MultiChanBackup.Unmarshal(m, b) @@ -8347,7 +8335,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_85b0b58f0d9865bd, []int{120} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{120} } func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanBackupExportRequest.Unmarshal(m, b) @@ -8385,7 +8373,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_85b0b58f0d9865bd, []int{121} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{121} } func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChanBackupSnapshot.Unmarshal(m, b) @@ -8432,7 +8420,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_85b0b58f0d9865bd, []int{122} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{122} } func (m *ChannelBackups) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackups.Unmarshal(m, b) @@ -8473,7 +8461,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_85b0b58f0d9865bd, []int{123} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{123} } func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreChanBackupRequest.Unmarshal(m, b) @@ -8610,7 +8598,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_85b0b58f0d9865bd, []int{124} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{124} } func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreBackupResponse.Unmarshal(m, b) @@ -8640,7 +8628,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_85b0b58f0d9865bd, []int{125} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{125} } func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChannelBackupSubscription.Unmarshal(m, b) @@ -8670,7 +8658,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_85b0b58f0d9865bd, []int{126} + return fileDescriptor_rpc_c21d4a52f85dc337, []int{126} } func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VerifyChanBackupResponse.Unmarshal(m, b) @@ -11462,492 +11450,491 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ Metadata: "rpc.proto", } -func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_85b0b58f0d9865bd) } - -var fileDescriptor_rpc_85b0b58f0d9865bd = []byte{ - // 7735 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5b, 0x6c, 0x24, 0xd9, - 0x59, 0xb0, 0xab, 0x2f, 0x76, 0xf7, 0xd7, 0x6d, 0xbb, 0x7d, 0x7c, 0xeb, 0xe9, 0x99, 0x9d, 0xf5, - 0x56, 0x26, 0x33, 0x8e, 0x77, 0xff, 0xf1, 0xec, 0x24, 0xd9, 0x4c, 0x76, 0xfe, 0xfc, 0xf9, 0x7d, - 0x9b, 0xf1, 0x64, 0xbd, 0x1e, 0xa7, 0x3c, 0x93, 0xf9, 0x77, 0x93, 0x5f, 0x9d, 0x72, 0xf7, 0x71, - 0xbb, 0x76, 0xba, 0xab, 0x7a, 0xab, 0xaa, 0xed, 0x71, 0x96, 0x41, 0x08, 0x21, 0x40, 0x08, 0x84, - 0x02, 0x02, 0x11, 0x04, 0x42, 0x4a, 0x90, 0x20, 0xe2, 0x89, 0x87, 0x20, 0x24, 0x08, 0xaf, 0x48, - 0x91, 0x10, 0x42, 0x79, 0x44, 0x02, 0x21, 0x78, 0x41, 0x3c, 0x20, 0x90, 0x78, 0x44, 0x42, 0xe7, - 0x3b, 0x97, 0x3a, 0xa7, 0xaa, 0x7a, 0x3c, 0x9b, 0x04, 0x9e, 0xba, 0xcf, 0x77, 0xbe, 0x3a, 0xd7, - 0xef, 0x7e, 0xbe, 0x73, 0xa0, 0x1a, 0x0e, 0x3b, 0x37, 0x87, 0x61, 0x10, 0x07, 0xa4, 0xdc, 0xf7, - 0xc3, 0x61, 0xa7, 0x75, 0xa5, 0x17, 0x04, 0xbd, 0x3e, 0x5d, 0x77, 0x87, 0xde, 0xba, 0xeb, 0xfb, - 0x41, 0xec, 0xc6, 0x5e, 0xe0, 0x47, 0x1c, 0xc9, 0xfe, 0x3a, 0xcc, 0xdc, 0xa7, 0xfe, 0x21, 0xa5, - 0x5d, 0x87, 0x7e, 0x38, 0xa2, 0x51, 0x4c, 0x5e, 0x87, 0x39, 0x97, 0x7e, 0x83, 0xd2, 0x6e, 0x7b, - 0xe8, 0x46, 0xd1, 0xf0, 0x24, 0x74, 0x23, 0xda, 0xb4, 0x56, 0xac, 0xd5, 0xba, 0xd3, 0xe0, 0x15, - 0x07, 0x0a, 0x4e, 0x5e, 0x83, 0x7a, 0xc4, 0x50, 0xa9, 0x1f, 0x87, 0xc1, 0xf0, 0xbc, 0x59, 0x40, - 0xbc, 0x1a, 0x83, 0xed, 0x70, 0x90, 0xdd, 0x87, 0x59, 0xd5, 0x43, 0x34, 0x0c, 0xfc, 0x88, 0x92, - 0x5b, 0xb0, 0xd0, 0xf1, 0x86, 0x27, 0x34, 0x6c, 0xe3, 0xc7, 0x03, 0x9f, 0x0e, 0x02, 0xdf, 0xeb, - 0x34, 0xad, 0x95, 0xe2, 0x6a, 0xd5, 0x21, 0xbc, 0x8e, 0x7d, 0xf1, 0xae, 0xa8, 0x21, 0x37, 0x60, - 0x96, 0xfa, 0x1c, 0x4e, 0xbb, 0xf8, 0x95, 0xe8, 0x6a, 0x26, 0x01, 0xb3, 0x0f, 0xec, 0x5f, 0x2c, - 0xc0, 0xdc, 0x03, 0xdf, 0x8b, 0x9f, 0xb8, 0xfd, 0x3e, 0x8d, 0xe5, 0x9c, 0x6e, 0xc0, 0xec, 0x19, - 0x02, 0x70, 0x4e, 0x67, 0x41, 0xd8, 0x15, 0x33, 0x9a, 0xe1, 0xe0, 0x03, 0x01, 0x1d, 0x3b, 0xb2, - 0xc2, 0xd8, 0x91, 0xe5, 0x2e, 0x57, 0x71, 0xcc, 0x72, 0xdd, 0x80, 0xd9, 0x90, 0x76, 0x82, 0x53, - 0x1a, 0x9e, 0xb7, 0xcf, 0x3c, 0xbf, 0x1b, 0x9c, 0x35, 0x4b, 0x2b, 0xd6, 0x6a, 0xd9, 0x99, 0x91, - 0xe0, 0x27, 0x08, 0x25, 0x9b, 0x30, 0xdb, 0x39, 0x71, 0x7d, 0x9f, 0xf6, 0xdb, 0x47, 0x6e, 0xe7, - 0xe9, 0x68, 0x18, 0x35, 0xcb, 0x2b, 0xd6, 0x6a, 0xed, 0xf6, 0xa5, 0x9b, 0xb8, 0xab, 0x37, 0xb7, - 0x4e, 0x5c, 0x7f, 0x13, 0x6b, 0x0e, 0x7d, 0x77, 0x18, 0x9d, 0x04, 0xb1, 0x33, 0x23, 0xbe, 0xe0, - 0xe0, 0xc8, 0x5e, 0x00, 0xa2, 0xaf, 0x04, 0x5f, 0x7b, 0xfb, 0x8f, 0x2c, 0x98, 0x7f, 0xec, 0xf7, - 0x83, 0xce, 0xd3, 0x1f, 0x71, 0x89, 0x72, 0xe6, 0x50, 0x78, 0xd9, 0x39, 0x14, 0x3f, 0xee, 0x1c, - 0x96, 0x60, 0xc1, 0x1c, 0xac, 0x98, 0x05, 0x85, 0x45, 0xf6, 0x75, 0x8f, 0xca, 0x61, 0xc9, 0x69, - 0x7c, 0x0a, 0x1a, 0x9d, 0x51, 0x18, 0x52, 0x3f, 0x33, 0x8f, 0x59, 0x01, 0x57, 0x13, 0x79, 0x0d, - 0xea, 0x3e, 0x3d, 0x4b, 0xd0, 0x04, 0xed, 0xfa, 0xf4, 0x4c, 0xa2, 0xd8, 0x4d, 0x58, 0x4a, 0x77, - 0x23, 0x06, 0xf0, 0x0f, 0x16, 0x94, 0x1e, 0xc7, 0xcf, 0x02, 0x72, 0x13, 0x4a, 0xf1, 0xf9, 0x90, - 0x73, 0xc8, 0xcc, 0x6d, 0x22, 0xa6, 0xb6, 0xd1, 0xed, 0x86, 0x34, 0x8a, 0x1e, 0x9d, 0x0f, 0xa9, - 0x53, 0x77, 0x79, 0xa1, 0xcd, 0xf0, 0x48, 0x13, 0xa6, 0x44, 0x19, 0x3b, 0xac, 0x3a, 0xb2, 0x48, - 0xae, 0x02, 0xb8, 0x83, 0x60, 0xe4, 0xc7, 0xed, 0xc8, 0x8d, 0x71, 0xa9, 0x8a, 0x8e, 0x06, 0x21, - 0x57, 0xa0, 0x3a, 0x7c, 0xda, 0x8e, 0x3a, 0xa1, 0x37, 0x8c, 0x91, 0x6c, 0xaa, 0x4e, 0x02, 0x20, - 0xaf, 0x43, 0x25, 0x18, 0xc5, 0xc3, 0xc0, 0xf3, 0x63, 0x41, 0x2a, 0xb3, 0x62, 0x2c, 0x0f, 0x47, - 0xf1, 0x01, 0x03, 0x3b, 0x0a, 0x81, 0x5c, 0x83, 0xe9, 0x4e, 0xe0, 0x1f, 0x7b, 0xe1, 0x80, 0x0b, - 0x83, 0xe6, 0x24, 0xf6, 0x66, 0x02, 0xed, 0x6f, 0x15, 0xa0, 0xf6, 0x28, 0x74, 0xfd, 0xc8, 0xed, - 0x30, 0x00, 0x1b, 0x7a, 0xfc, 0xac, 0x7d, 0xe2, 0x46, 0x27, 0x38, 0xdb, 0xaa, 0x23, 0x8b, 0x64, - 0x09, 0x26, 0xf9, 0x40, 0x71, 0x4e, 0x45, 0x47, 0x94, 0xc8, 0x1b, 0x30, 0xe7, 0x8f, 0x06, 0x6d, - 0xb3, 0xaf, 0x22, 0x52, 0x4b, 0xb6, 0x82, 0x2d, 0xc0, 0x11, 0xdb, 0x6b, 0xde, 0x05, 0x9f, 0xa1, - 0x06, 0x21, 0x36, 0xd4, 0x45, 0x89, 0x7a, 0xbd, 0x13, 0x3e, 0xcd, 0xb2, 0x63, 0xc0, 0x58, 0x1b, - 0xb1, 0x37, 0xa0, 0xed, 0x28, 0x76, 0x07, 0x43, 0x31, 0x2d, 0x0d, 0x82, 0xf5, 0x41, 0xec, 0xf6, - 0xdb, 0xc7, 0x94, 0x46, 0xcd, 0x29, 0x51, 0xaf, 0x20, 0xe4, 0x3a, 0xcc, 0x74, 0x69, 0x14, 0xb7, - 0xc5, 0xa6, 0xd0, 0xa8, 0x59, 0x41, 0xd6, 0x4f, 0x41, 0x19, 0x65, 0xdc, 0xa7, 0xb1, 0xb6, 0x3a, - 0x91, 0xa0, 0x40, 0x7b, 0x0f, 0x88, 0x06, 0xde, 0xa6, 0xb1, 0xeb, 0xf5, 0x23, 0xf2, 0x16, 0xd4, - 0x63, 0x0d, 0x19, 0x45, 0x5d, 0x4d, 0x91, 0x8b, 0xf6, 0x81, 0x63, 0xe0, 0xd9, 0xf7, 0xa1, 0x72, - 0x8f, 0xd2, 0x3d, 0x6f, 0xe0, 0xc5, 0x64, 0x09, 0xca, 0xc7, 0xde, 0x33, 0xca, 0x09, 0xba, 0xb8, - 0x3b, 0xe1, 0xf0, 0x22, 0x69, 0xc1, 0xd4, 0x90, 0x86, 0x1d, 0x2a, 0x97, 0x7f, 0x77, 0xc2, 0x91, - 0x80, 0xcd, 0x29, 0x28, 0xf7, 0xd9, 0xc7, 0xf6, 0xbf, 0x15, 0xa0, 0x76, 0x48, 0x7d, 0xc5, 0x28, - 0x04, 0x4a, 0x6c, 0x4a, 0x82, 0x39, 0xf0, 0x3f, 0x79, 0x15, 0x6a, 0x38, 0xcd, 0x28, 0x0e, 0x3d, - 0xbf, 0x27, 0xe8, 0x13, 0x18, 0xe8, 0x10, 0x21, 0xa4, 0x01, 0x45, 0x77, 0x20, 0x69, 0x93, 0xfd, - 0x65, 0x4c, 0x34, 0x74, 0xcf, 0x07, 0x8c, 0xdf, 0xd4, 0xae, 0xd5, 0x9d, 0x9a, 0x80, 0xed, 0xb2, - 0x6d, 0xbb, 0x09, 0xf3, 0x3a, 0x8a, 0x6c, 0xbd, 0x8c, 0xad, 0xcf, 0x69, 0x98, 0xa2, 0x93, 0x1b, - 0x30, 0x2b, 0xf1, 0x43, 0x3e, 0x58, 0xdc, 0xc7, 0xaa, 0x33, 0x23, 0xc0, 0x72, 0x0a, 0xab, 0xd0, - 0x38, 0xf6, 0x7c, 0xb7, 0xdf, 0xee, 0xf4, 0xe3, 0xd3, 0x76, 0x97, 0xf6, 0x63, 0x17, 0x77, 0xb4, - 0xec, 0xcc, 0x20, 0x7c, 0xab, 0x1f, 0x9f, 0x6e, 0x33, 0x28, 0x79, 0x03, 0xaa, 0xc7, 0x94, 0xb6, - 0x71, 0x25, 0x9a, 0x15, 0x83, 0x3b, 0xe4, 0xea, 0x3a, 0x95, 0x63, 0xb9, 0xce, 0xab, 0xd0, 0x08, - 0x46, 0x71, 0x2f, 0xf0, 0xfc, 0x5e, 0x9b, 0xc9, 0xa3, 0xb6, 0xd7, 0x6d, 0x56, 0x57, 0xac, 0xd5, - 0x92, 0x33, 0x23, 0xe1, 0x4c, 0x2a, 0x3c, 0xe8, 0x92, 0x57, 0x00, 0xb0, 0x6f, 0xde, 0x30, 0xac, - 0x58, 0xab, 0xd3, 0x4e, 0x95, 0x41, 0xb0, 0x21, 0xfb, 0x4f, 0x2d, 0xa8, 0xf3, 0x35, 0x17, 0x8a, - 0xef, 0x1a, 0x4c, 0xcb, 0xa9, 0xd1, 0x30, 0x0c, 0x42, 0xc1, 0x47, 0x26, 0x90, 0xac, 0x41, 0x43, - 0x02, 0x86, 0x21, 0xf5, 0x06, 0x6e, 0x8f, 0x0a, 0xe1, 0x94, 0x81, 0x93, 0xdb, 0x49, 0x8b, 0x61, - 0x30, 0x8a, 0xa9, 0x10, 0xb1, 0x75, 0x31, 0x3b, 0x87, 0xc1, 0x1c, 0x13, 0x85, 0xf1, 0x51, 0xce, - 0x9e, 0x19, 0x30, 0xfb, 0x7b, 0x16, 0x10, 0x36, 0xf4, 0x47, 0x01, 0x6f, 0x42, 0x2c, 0x79, 0x7a, - 0xbb, 0xad, 0x97, 0xde, 0xee, 0xc2, 0xb8, 0xed, 0x5e, 0x85, 0x49, 0x1c, 0x16, 0x13, 0x0c, 0xc5, - 0xf4, 0xd0, 0x37, 0x0b, 0x4d, 0xcb, 0x11, 0xf5, 0xc4, 0x86, 0x32, 0x9f, 0x63, 0x29, 0x67, 0x8e, - 0xbc, 0xca, 0xfe, 0xb6, 0x05, 0xf5, 0x2d, 0xae, 0x43, 0x50, 0xe8, 0x91, 0x5b, 0x40, 0x8e, 0x47, - 0x7e, 0x97, 0xed, 0x65, 0xfc, 0xcc, 0xeb, 0xb6, 0x8f, 0xce, 0x59, 0x57, 0x38, 0xee, 0xdd, 0x09, - 0x27, 0xa7, 0x8e, 0xbc, 0x01, 0x0d, 0x03, 0x1a, 0xc5, 0x21, 0x1f, 0xfd, 0xee, 0x84, 0x93, 0xa9, - 0x61, 0x8b, 0xc9, 0xc4, 0xea, 0x28, 0x6e, 0x7b, 0x7e, 0x97, 0x3e, 0xc3, 0xf5, 0x9f, 0x76, 0x0c, - 0xd8, 0xe6, 0x0c, 0xd4, 0xf5, 0xef, 0xec, 0x0f, 0xa0, 0x22, 0x85, 0x32, 0x0a, 0xa4, 0xd4, 0xb8, - 0x1c, 0x0d, 0x42, 0x5a, 0x50, 0x31, 0x47, 0xe1, 0x54, 0x3e, 0x4e, 0xdf, 0xf6, 0xff, 0x81, 0xc6, - 0x1e, 0x93, 0x8c, 0xbe, 0xe7, 0xf7, 0x84, 0x56, 0x62, 0xe2, 0x7a, 0x38, 0x3a, 0x7a, 0x4a, 0xcf, - 0x05, 0xfd, 0x89, 0x12, 0x93, 0x09, 0x27, 0x41, 0x14, 0x8b, 0x7e, 0xf0, 0xbf, 0xfd, 0x97, 0x16, - 0x90, 0x9d, 0x28, 0xf6, 0x06, 0x6e, 0x4c, 0xef, 0x51, 0x45, 0x08, 0x0f, 0xa1, 0xce, 0x5a, 0x7b, - 0x14, 0x6c, 0x70, 0xb9, 0xcf, 0xe5, 0xd9, 0xeb, 0x62, 0x4b, 0xb2, 0x1f, 0xdc, 0xd4, 0xb1, 0x99, - 0x69, 0x78, 0xee, 0x18, 0x0d, 0x30, 0xd9, 0x13, 0xbb, 0x61, 0x8f, 0xc6, 0xa8, 0x14, 0x84, 0x49, - 0x01, 0x1c, 0xb4, 0x15, 0xf8, 0xc7, 0xad, 0x2f, 0xc2, 0x5c, 0xa6, 0x0d, 0x26, 0x90, 0x92, 0x69, - 0xb0, 0xbf, 0x64, 0x01, 0xca, 0xa7, 0x6e, 0x7f, 0x44, 0x85, 0x26, 0xe2, 0x85, 0xb7, 0x0b, 0x77, - 0x2c, 0xbb, 0x03, 0xf3, 0xc6, 0xb8, 0x04, 0x4f, 0x36, 0x61, 0x8a, 0xc9, 0x06, 0xa6, 0x73, 0x51, - 0xae, 0x3a, 0xb2, 0x48, 0x6e, 0xc3, 0xc2, 0x31, 0xa5, 0xa1, 0x1b, 0x63, 0xb1, 0x3d, 0xa4, 0x21, - 0xee, 0x89, 0x68, 0x39, 0xb7, 0xce, 0xfe, 0x47, 0x0b, 0x66, 0x19, 0xdf, 0xbc, 0xeb, 0xfa, 0xe7, - 0x72, 0xad, 0xf6, 0x72, 0xd7, 0x6a, 0x55, 0xac, 0x55, 0x0a, 0xfb, 0xe3, 0x2e, 0x54, 0x31, 0xbd, - 0x50, 0x64, 0x05, 0xea, 0xc6, 0x70, 0xcb, 0x5c, 0xc9, 0x45, 0x6e, 0x7c, 0x40, 0xc3, 0xcd, 0xf3, - 0x98, 0xfe, 0xf8, 0x4b, 0x79, 0x1d, 0x1a, 0xc9, 0xb0, 0xc5, 0x3a, 0x12, 0x28, 0x31, 0xc2, 0x14, - 0x0d, 0xe0, 0x7f, 0xfb, 0x77, 0x2c, 0x8e, 0xb8, 0x15, 0x78, 0x4a, 0x41, 0x32, 0x44, 0xa6, 0x47, - 0x25, 0x22, 0xfb, 0x3f, 0xd6, 0x80, 0xf8, 0xf1, 0x27, 0x4b, 0x2e, 0x41, 0x25, 0xa2, 0x7e, 0xb7, - 0xed, 0xf6, 0xfb, 0xa8, 0x47, 0x2a, 0xce, 0x14, 0x2b, 0x6f, 0xf4, 0xfb, 0xf6, 0x0d, 0x98, 0xd3, - 0x46, 0xf7, 0x82, 0x79, 0xec, 0x03, 0xd9, 0xf3, 0xa2, 0xf8, 0xb1, 0x1f, 0x0d, 0x35, 0xfd, 0x73, - 0x19, 0xaa, 0x03, 0xcf, 0xc7, 0x91, 0x71, 0xce, 0x2d, 0x3b, 0x95, 0x81, 0xe7, 0xb3, 0x71, 0x45, - 0x58, 0xe9, 0x3e, 0x13, 0x95, 0x05, 0x51, 0xe9, 0x3e, 0xc3, 0x4a, 0xfb, 0x0e, 0xcc, 0x1b, 0xed, - 0x89, 0xae, 0x5f, 0x83, 0xf2, 0x28, 0x7e, 0x16, 0x48, 0xeb, 0xa0, 0x26, 0x28, 0x84, 0xd9, 0x99, - 0x0e, 0xaf, 0xb1, 0xef, 0xc2, 0xdc, 0x3e, 0x3d, 0x13, 0x8c, 0x2c, 0x07, 0x72, 0xfd, 0x42, 0x1b, - 0x14, 0xeb, 0xed, 0x9b, 0x40, 0xf4, 0x8f, 0x13, 0x06, 0x90, 0x16, 0xa9, 0x65, 0x58, 0xa4, 0xf6, - 0x75, 0x20, 0x87, 0x5e, 0xcf, 0x7f, 0x97, 0x46, 0x91, 0xdb, 0x53, 0xac, 0xdf, 0x80, 0xe2, 0x20, - 0xea, 0x09, 0x51, 0xc5, 0xfe, 0xda, 0x9f, 0x86, 0x79, 0x03, 0x4f, 0x34, 0x7c, 0x05, 0xaa, 0x91, - 0xd7, 0xf3, 0xdd, 0x78, 0x14, 0x52, 0xd1, 0x74, 0x02, 0xb0, 0xef, 0xc1, 0xc2, 0x57, 0x68, 0xe8, - 0x1d, 0x9f, 0x5f, 0xd4, 0xbc, 0xd9, 0x4e, 0x21, 0xdd, 0xce, 0x0e, 0x2c, 0xa6, 0xda, 0x11, 0xdd, - 0x73, 0xf2, 0x15, 0x3b, 0x59, 0x71, 0x78, 0x41, 0x93, 0x7d, 0x05, 0x5d, 0xf6, 0xd9, 0x8f, 0x81, - 0x6c, 0x05, 0xbe, 0x4f, 0x3b, 0xf1, 0x01, 0xa5, 0x61, 0xe2, 0x0c, 0x27, 0xb4, 0x5a, 0xbb, 0xbd, - 0x2c, 0x56, 0x36, 0x2d, 0x50, 0x05, 0x11, 0x13, 0x28, 0x0d, 0x69, 0x38, 0xc0, 0x86, 0x2b, 0x0e, - 0xfe, 0xb7, 0x17, 0x61, 0xde, 0x68, 0x56, 0xb8, 0x0f, 0x6f, 0xc2, 0xe2, 0xb6, 0x17, 0x75, 0xb2, - 0x1d, 0x36, 0x61, 0x6a, 0x38, 0x3a, 0x6a, 0x27, 0x9c, 0x28, 0x8b, 0xcc, 0xe2, 0x4c, 0x7f, 0x22, - 0x1a, 0xfb, 0x79, 0x0b, 0x4a, 0xbb, 0x8f, 0xf6, 0xb6, 0x98, 0xae, 0xf0, 0xfc, 0x4e, 0x30, 0x60, - 0xfa, 0x96, 0x4f, 0x5a, 0x95, 0xc7, 0x72, 0xd8, 0x15, 0xa8, 0xa2, 0x9a, 0x66, 0x46, 0xb4, 0xf0, - 0x5b, 0x13, 0x00, 0x33, 0xe0, 0xe9, 0xb3, 0xa1, 0x17, 0xa2, 0x85, 0x2e, 0xed, 0xee, 0x12, 0xaa, - 0x99, 0x6c, 0x85, 0xfd, 0x83, 0x32, 0x4c, 0x09, 0xe5, 0x8b, 0xfd, 0x75, 0x62, 0xef, 0x94, 0x8a, - 0x91, 0x88, 0x12, 0x33, 0x81, 0x42, 0x3a, 0x08, 0x62, 0xda, 0x36, 0xb6, 0xc1, 0x04, 0xa2, 0x83, - 0x22, 0x7c, 0x47, 0xee, 0xd2, 0x14, 0x39, 0x96, 0x01, 0x64, 0x8b, 0x25, 0xed, 0xb3, 0x12, 0xda, - 0x67, 0xb2, 0xc8, 0x56, 0xa2, 0xe3, 0x0e, 0xdd, 0x8e, 0x17, 0x9f, 0x0b, 0x91, 0xa0, 0xca, 0xac, - 0xed, 0x7e, 0xd0, 0x71, 0x99, 0x57, 0xda, 0x77, 0xfd, 0x0e, 0x95, 0xce, 0x8f, 0x01, 0x64, 0x8e, - 0x80, 0x18, 0x92, 0x44, 0xe3, 0xce, 0x42, 0x0a, 0xca, 0xf4, 0x77, 0x27, 0x18, 0x0c, 0xbc, 0x98, - 0xf9, 0x0f, 0x68, 0x5b, 0x16, 0x1d, 0x0d, 0xc2, 0x5d, 0x2d, 0x2c, 0x9d, 0xf1, 0xd5, 0xab, 0x4a, - 0x57, 0x4b, 0x03, 0xb2, 0x56, 0x98, 0xd6, 0x61, 0x62, 0xec, 0xe9, 0x19, 0x1a, 0x92, 0x45, 0x47, - 0x83, 0xb0, 0x7d, 0x18, 0xf9, 0x11, 0x8d, 0xe3, 0x3e, 0xed, 0xaa, 0x01, 0xd5, 0x10, 0x2d, 0x5b, - 0x41, 0x6e, 0xc1, 0x3c, 0x77, 0x69, 0x22, 0x37, 0x0e, 0xa2, 0x13, 0x2f, 0x6a, 0x47, 0xcc, 0x39, - 0xa8, 0x23, 0x7e, 0x5e, 0x15, 0xb9, 0x03, 0xcb, 0x29, 0x70, 0x48, 0x3b, 0xd4, 0x3b, 0xa5, 0xdd, - 0xe6, 0x34, 0x7e, 0x35, 0xae, 0x9a, 0xac, 0x40, 0x8d, 0x79, 0x72, 0xa3, 0x61, 0xd7, 0x65, 0x06, - 0xcc, 0x0c, 0xee, 0x83, 0x0e, 0x22, 0x6f, 0xc2, 0xf4, 0x90, 0x72, 0xeb, 0xe7, 0x24, 0xee, 0x77, - 0xa2, 0xe6, 0xac, 0x21, 0xdd, 0x18, 0xe5, 0x3a, 0x26, 0x06, 0x23, 0xca, 0x4e, 0x84, 0x26, 0xbd, - 0x7b, 0xde, 0x6c, 0x08, 0xb3, 0x5a, 0x02, 0x90, 0x47, 0x42, 0xef, 0xd4, 0x8d, 0x69, 0x73, 0x8e, - 0x0b, 0x74, 0x51, 0x64, 0xdf, 0x79, 0xbe, 0x17, 0x7b, 0x6e, 0x1c, 0x84, 0x4d, 0x82, 0x75, 0x09, - 0x80, 0x2d, 0x22, 0xd2, 0x47, 0x14, 0xbb, 0xf1, 0x28, 0x6a, 0x1f, 0xf7, 0xdd, 0x5e, 0xd4, 0x9c, - 0xe7, 0x76, 0x69, 0xa6, 0xc2, 0xfe, 0x3d, 0x8b, 0x0b, 0x69, 0x41, 0xd0, 0x4a, 0xd8, 0xbe, 0x0a, - 0x35, 0x4e, 0xca, 0xed, 0xc0, 0xef, 0x9f, 0x0b, 0xea, 0x06, 0x0e, 0x7a, 0xe8, 0xf7, 0xcf, 0xc9, - 0x27, 0x60, 0xda, 0xf3, 0x75, 0x14, 0x2e, 0x0f, 0xea, 0x12, 0x88, 0x48, 0xaf, 0x42, 0x6d, 0x38, - 0x3a, 0xea, 0x7b, 0x1d, 0x8e, 0x52, 0xe4, 0xad, 0x70, 0x10, 0x22, 0x30, 0x4b, 0x9b, 0xcf, 0x8a, - 0x63, 0x94, 0x10, 0xa3, 0x26, 0x60, 0x0c, 0xc5, 0xde, 0x84, 0x05, 0x73, 0x80, 0x42, 0xf0, 0xad, - 0x41, 0x45, 0xf0, 0x49, 0xd4, 0xac, 0xe1, 0x5a, 0xcf, 0x68, 0x11, 0x17, 0x9f, 0xf6, 0x1d, 0x55, - 0x6f, 0xff, 0x49, 0x09, 0xe6, 0x05, 0x74, 0xab, 0x1f, 0x44, 0xf4, 0x70, 0x34, 0x18, 0xb8, 0x61, - 0x0e, 0x03, 0x5a, 0x17, 0x30, 0x60, 0xc1, 0x64, 0x40, 0xc6, 0x16, 0x27, 0xae, 0xe7, 0x73, 0x37, - 0x81, 0x73, 0xaf, 0x06, 0x21, 0xab, 0x30, 0xdb, 0xe9, 0x07, 0x11, 0x37, 0x89, 0x75, 0x87, 0x3f, - 0x0d, 0xce, 0x0a, 0x8c, 0x72, 0x9e, 0xc0, 0xd0, 0x19, 0x7e, 0x32, 0xc5, 0xf0, 0x36, 0xd4, 0x59, - 0xa3, 0x54, 0xca, 0xaf, 0x29, 0x6e, 0x26, 0xeb, 0x30, 0x36, 0x9e, 0x34, 0x7b, 0x71, 0x5e, 0x9e, - 0xcd, 0x63, 0x2e, 0x6f, 0x40, 0x51, 0x3e, 0x6a, 0xd8, 0x55, 0xc1, 0x5c, 0xd9, 0x2a, 0x72, 0x8f, - 0x79, 0x89, 0xac, 0x2f, 0x54, 0xd2, 0x80, 0x4a, 0xfa, 0xba, 0xb9, 0x23, 0xfa, 0xda, 0xdf, 0x64, - 0x85, 0x51, 0x48, 0x51, 0x71, 0x6b, 0x5f, 0xda, 0xbf, 0x64, 0x41, 0x4d, 0xab, 0x23, 0x8b, 0x30, - 0xb7, 0xf5, 0xf0, 0xe1, 0xc1, 0x8e, 0xb3, 0xf1, 0xe8, 0xc1, 0x57, 0x76, 0xda, 0x5b, 0x7b, 0x0f, - 0x0f, 0x77, 0x1a, 0x13, 0x0c, 0xbc, 0xf7, 0x70, 0x6b, 0x63, 0xaf, 0x7d, 0xef, 0xa1, 0xb3, 0x25, - 0xc1, 0x16, 0x59, 0x02, 0xe2, 0xec, 0xbc, 0xfb, 0xf0, 0xd1, 0x8e, 0x01, 0x2f, 0x90, 0x06, 0xd4, - 0x37, 0x9d, 0x9d, 0x8d, 0xad, 0x5d, 0x01, 0x29, 0x92, 0x05, 0x68, 0xdc, 0x7b, 0xbc, 0xbf, 0xfd, - 0x60, 0xff, 0x7e, 0x7b, 0x6b, 0x63, 0x7f, 0x6b, 0x67, 0x6f, 0x67, 0xbb, 0x51, 0x22, 0xd3, 0x50, - 0xdd, 0xd8, 0xdc, 0xd8, 0xdf, 0x7e, 0xb8, 0xbf, 0xb3, 0xdd, 0x28, 0xdb, 0x7f, 0x67, 0xc1, 0x22, - 0x8e, 0xba, 0x9b, 0x66, 0x90, 0x15, 0xa8, 0x75, 0x82, 0x60, 0xc8, 0x8c, 0xe3, 0x44, 0xfc, 0xeb, - 0x20, 0x46, 0xfc, 0x5c, 0xd8, 0x1e, 0x07, 0x61, 0x87, 0x0a, 0xfe, 0x00, 0x04, 0xdd, 0x63, 0x10, - 0x46, 0xfc, 0x62, 0x7b, 0x39, 0x06, 0x67, 0x8f, 0x1a, 0x87, 0x71, 0x94, 0x25, 0x98, 0x3c, 0x0a, - 0xa9, 0xdb, 0x39, 0x11, 0x9c, 0x21, 0x4a, 0xe4, 0x53, 0x89, 0xf7, 0xd6, 0x61, 0xab, 0xdf, 0xa7, - 0x5d, 0xa4, 0x98, 0x8a, 0x33, 0x2b, 0xe0, 0x5b, 0x02, 0xcc, 0xa4, 0x85, 0x7b, 0xe4, 0xfa, 0xdd, - 0xc0, 0xa7, 0x5d, 0x61, 0x1a, 0x26, 0x00, 0xfb, 0x00, 0x96, 0xd2, 0xf3, 0x13, 0xfc, 0xf5, 0x96, - 0xc6, 0x5f, 0xdc, 0x52, 0x6b, 0x8d, 0xdf, 0x4d, 0x8d, 0xd7, 0xfe, 0xbe, 0x00, 0x25, 0xa6, 0xb8, - 0xc7, 0x2b, 0x79, 0xdd, 0x16, 0x2b, 0x66, 0xa2, 0x83, 0xe8, 0x10, 0x72, 0x51, 0xce, 0xd5, 0x9d, - 0x06, 0x49, 0xea, 0x43, 0xda, 0x39, 0xc5, 0x19, 0xab, 0x7a, 0x06, 0x61, 0x0c, 0xc2, 0x0c, 0x65, - 0xfc, 0x5a, 0x30, 0x88, 0x2c, 0xcb, 0x3a, 0xfc, 0x72, 0x2a, 0xa9, 0xc3, 0xef, 0x9a, 0x30, 0xe5, - 0xf9, 0x47, 0xc1, 0xc8, 0xef, 0x22, 0x43, 0x54, 0x1c, 0x59, 0xc4, 0x78, 0x24, 0x32, 0xaa, 0x37, - 0x90, 0xe4, 0x9f, 0x00, 0xc8, 0x6d, 0xa8, 0x46, 0xe7, 0x7e, 0x47, 0xa7, 0xf9, 0x05, 0xb1, 0x4a, - 0x6c, 0x0d, 0x6e, 0x1e, 0x9e, 0xfb, 0x1d, 0xa4, 0xf0, 0x04, 0xcd, 0xfe, 0x22, 0x54, 0x24, 0x98, - 0x91, 0xe5, 0xe3, 0xfd, 0x77, 0xf6, 0x1f, 0x3e, 0xd9, 0x6f, 0x1f, 0xbe, 0xb7, 0xbf, 0xd5, 0x98, - 0x20, 0xb3, 0x50, 0xdb, 0xd8, 0x42, 0x4a, 0x47, 0x80, 0xc5, 0x50, 0x0e, 0x36, 0x0e, 0x0f, 0x15, - 0xa4, 0x60, 0x13, 0xe6, 0xec, 0x46, 0x68, 0x1d, 0xa9, 0x78, 0xdc, 0x5b, 0x30, 0xa7, 0xc1, 0x12, - 0x4b, 0x7b, 0xc8, 0x00, 0x29, 0x4b, 0x1b, 0xcd, 0x2a, 0x5e, 0x63, 0x37, 0x60, 0xe6, 0x3e, 0x8d, - 0x1f, 0xf8, 0xc7, 0x81, 0x6c, 0xe9, 0x0f, 0x4a, 0x30, 0xab, 0x40, 0xa2, 0xa1, 0x55, 0x98, 0xf5, - 0xba, 0xd4, 0x8f, 0xbd, 0xf8, 0xbc, 0x6d, 0xf8, 0xd4, 0x69, 0x30, 0x33, 0x47, 0xdd, 0xbe, 0xe7, - 0xca, 0xb0, 0x2f, 0x2f, 0x30, 0x1f, 0x93, 0xe9, 0x4a, 0xa9, 0xfe, 0x14, 0x5d, 0x71, 0x57, 0x3e, - 0xb7, 0x8e, 0x49, 0x20, 0x06, 0x17, 0x2a, 0x46, 0x7d, 0xc2, 0xcd, 0xb2, 0xbc, 0x2a, 0xb6, 0x55, - 0xbc, 0x25, 0x36, 0xe5, 0x32, 0xd7, 0xa7, 0x0a, 0x90, 0x89, 0xab, 0x4e, 0x72, 0xf9, 0x98, 0x8e, - 0xab, 0x6a, 0xb1, 0xd9, 0x4a, 0x26, 0x36, 0xcb, 0xe4, 0xe7, 0xb9, 0xdf, 0xa1, 0xdd, 0x76, 0x1c, - 0xb4, 0x51, 0xce, 0x23, 0x49, 0x54, 0x9c, 0x34, 0x98, 0x5c, 0x81, 0xa9, 0x98, 0x46, 0xb1, 0x4f, - 0x79, 0xc0, 0xac, 0x82, 0x21, 0x1e, 0x09, 0x62, 0x36, 0xf4, 0x28, 0xf4, 0xa2, 0x66, 0x1d, 0xa3, - 0xae, 0xf8, 0x9f, 0x7c, 0x06, 0x16, 0x8f, 0x68, 0x14, 0xb7, 0x4f, 0xa8, 0xdb, 0xa5, 0x21, 0x92, - 0x17, 0x0f, 0xef, 0x72, 0xd3, 0x24, 0xbf, 0x92, 0x11, 0xee, 0x29, 0x0d, 0x23, 0x2f, 0xf0, 0xd1, - 0x28, 0xa9, 0x3a, 0xb2, 0xc8, 0xda, 0x63, 0x93, 0x57, 0x4a, 0x5a, 0xad, 0xe0, 0x2c, 0x4e, 0x3c, - 0xbf, 0x92, 0x5c, 0x83, 0x49, 0x9c, 0x40, 0xd4, 0x6c, 0x18, 0x71, 0xaa, 0x2d, 0x06, 0x74, 0x44, - 0xdd, 0x97, 0x4a, 0x95, 0x5a, 0xa3, 0x6e, 0x7f, 0x0e, 0xca, 0x08, 0x66, 0x9b, 0xce, 0x17, 0x83, - 0x13, 0x05, 0x2f, 0xb0, 0xa1, 0xf9, 0x34, 0x3e, 0x0b, 0xc2, 0xa7, 0xf2, 0x0c, 0x40, 0x14, 0xed, - 0x6f, 0xa0, 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, 0xf3, 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, 0x87, 0x16, 0xcc, - 0x63, 0x6b, 0xd2, 0x92, 0x11, 0x3a, 0xe7, 0xce, 0xc7, 0x18, 0x66, 0xbd, 0xa3, 0xc7, 0x07, 0x17, - 0xa0, 0xac, 0x6b, 0x21, 0x5e, 0xf8, 0xf8, 0x71, 0x87, 0x52, 0x3a, 0xee, 0x60, 0xff, 0x96, 0x05, - 0x73, 0x5c, 0x11, 0xa0, 0x55, 0x29, 0xa6, 0xff, 0xbf, 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, 0x71, 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, 0x9a, 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, 0xaf, 0x2d, 0xa8, 0x89, 0x5e, 0x7e, 0xe4, 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, 0xbf, 0x5f, 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, 0x01, 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, 0x58, 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, - 0x7f, 0x58, 0x40, 0xb2, 0xb4, 0x44, 0xee, 0xf3, 0x00, 0x81, 0x4f, 0xfb, 0x42, 0xa4, 0xfc, 0xaf, - 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, 0x39, 0x0b, 0xe6, 0x73, 0x36, 0xfd, 0x27, 0x37, 0x71, 0xb6, 0x4d, 0x86, 0x2c, 0x28, - 0x88, 0x6d, 0xd2, 0x81, 0xad, 0x9f, 0x82, 0x69, 0x83, 0xd0, 0x7f, 0x72, 0xfd, 0xa7, 0xed, 0x35, - 0x4e, 0x67, 0x06, 0xac, 0xf5, 0x2f, 0x05, 0x20, 0x59, 0x66, 0xfb, 0x1f, 0x1d, 0x43, 0x76, 0x9d, - 0x8a, 0x39, 0xeb, 0xf4, 0xdf, 0xaa, 0x07, 0xde, 0x80, 0x39, 0x91, 0x01, 0xa5, 0x85, 0x85, 0x38, - 0xc5, 0x64, 0x2b, 0x98, 0xc5, 0x6a, 0x46, 0x45, 0x2b, 0x46, 0x46, 0x88, 0xa6, 0x0c, 0x53, 0xc1, - 0x51, 0xbb, 0x05, 0x4d, 0xb1, 0x42, 0x3b, 0xa7, 0xd4, 0x8f, 0x0f, 0x47, 0x47, 0x3c, 0x05, 0xc8, - 0x0b, 0x7c, 0xfb, 0x7b, 0x45, 0x65, 0x74, 0x63, 0xa5, 0x50, 0xef, 0x9f, 0x81, 0xba, 0x2e, 0xcc, - 0xc5, 0x76, 0xa4, 0xa2, 0x82, 0x4c, 0xb1, 0xeb, 0x58, 0x64, 0x1b, 0x66, 0x50, 0x64, 0x75, 0xd5, - 0x77, 0x05, 0xfc, 0xee, 0x05, 0xd1, 0x8e, 0xdd, 0x09, 0x27, 0xf5, 0x0d, 0xf9, 0x02, 0xcc, 0x98, - 0xae, 0x94, 0xb0, 0x11, 0xf2, 0x6c, 0x73, 0xf6, 0xb9, 0x89, 0x4c, 0x36, 0xa0, 0x91, 0xf6, 0xc5, - 0xc4, 0xf9, 0xff, 0x98, 0x06, 0x32, 0xe8, 0xe4, 0x8e, 0x38, 0x1e, 0x2b, 0x63, 0x14, 0xe2, 0x9a, - 0xf9, 0x99, 0xb6, 0x4c, 0x37, 0xf9, 0x8f, 0x76, 0x60, 0xf6, 0x35, 0x80, 0x04, 0x46, 0x1a, 0x50, - 0x7f, 0x78, 0xb0, 0xb3, 0xdf, 0xde, 0xda, 0xdd, 0xd8, 0xdf, 0xdf, 0xd9, 0x6b, 0x4c, 0x10, 0x02, - 0x33, 0x18, 0x34, 0xdb, 0x56, 0x30, 0x8b, 0xc1, 0x44, 0x98, 0x42, 0xc2, 0x0a, 0x64, 0x01, 0x1a, - 0x0f, 0xf6, 0x53, 0xd0, 0xe2, 0x66, 0x55, 0xf1, 0x87, 0xbd, 0x04, 0x0b, 0x3c, 0xc3, 0x6d, 0x93, - 0x93, 0x87, 0xb4, 0x15, 0x7e, 0xd7, 0x82, 0xc5, 0x54, 0x45, 0x92, 0x4a, 0xc2, 0xcd, 0x01, 0xd3, - 0x46, 0x30, 0x81, 0x18, 0xf2, 0x96, 0x96, 0x5f, 0x4a, 0x82, 0x64, 0x2b, 0x18, 0xcd, 0x6b, 0x96, - 0x62, 0x8a, 0x93, 0xf2, 0xaa, 0xec, 0x65, 0x9e, 0x87, 0x87, 0x19, 0x7b, 0xc6, 0xc0, 0x8f, 0x79, - 0xe6, 0x9c, 0x5e, 0x91, 0x1c, 0x37, 0x9a, 0x43, 0x96, 0x45, 0x66, 0xe4, 0x1b, 0xa6, 0x87, 0x39, - 0xde, 0xdc, 0x3a, 0xfb, 0x2f, 0x0a, 0x40, 0xbe, 0x3c, 0xa2, 0xe1, 0x39, 0x66, 0x81, 0xa8, 0x18, - 0xe4, 0x72, 0x3a, 0xc2, 0x36, 0x39, 0x1c, 0x1d, 0xbd, 0x43, 0xcf, 0x65, 0x06, 0x53, 0x41, 0xcf, - 0x60, 0x02, 0xe6, 0x1c, 0xab, 0x1c, 0x14, 0x6b, 0xb5, 0x8c, 0x21, 0x89, 0xaa, 0x3f, 0x1a, 0xf0, - 0x46, 0x73, 0x13, 0x8d, 0x4a, 0x17, 0x27, 0x1a, 0x95, 0x2f, 0x4a, 0x34, 0xfa, 0x04, 0x4c, 0x7b, - 0x3d, 0x3f, 0x60, 0x62, 0x81, 0x29, 0xf6, 0xa8, 0x39, 0xb9, 0x52, 0x64, 0xce, 0xb0, 0x00, 0xee, - 0x33, 0x18, 0xf9, 0x5c, 0x82, 0x44, 0xbb, 0x3d, 0x4c, 0x5a, 0xd3, 0x05, 0xc5, 0x4e, 0xb7, 0x47, - 0xf7, 0x82, 0x8e, 0x1b, 0x07, 0xa1, 0xfa, 0x90, 0xc1, 0x22, 0xe6, 0xf5, 0x47, 0xc1, 0x88, 0x99, - 0x39, 0x72, 0x29, 0x78, 0xd8, 0xa6, 0xce, 0xa1, 0x07, 0xb8, 0x20, 0xf6, 0x7b, 0x50, 0xd3, 0x9a, - 0xc0, 0x8c, 0x26, 0x61, 0x42, 0x08, 0x7f, 0xb0, 0xc4, 0x2d, 0x76, 0x9f, 0xf6, 0x1f, 0x74, 0xc9, - 0xeb, 0x30, 0xd7, 0xf5, 0x42, 0x8a, 0xc9, 0x69, 0xed, 0x90, 0x9e, 0xd2, 0x30, 0x92, 0x9e, 0x73, - 0x43, 0x55, 0x38, 0x1c, 0x6e, 0xdf, 0x85, 0x79, 0x63, 0x6b, 0x14, 0xe5, 0xca, 0x84, 0x1f, 0x2b, - 0x9b, 0xf0, 0x23, 0x93, 0x7d, 0xec, 0x5f, 0x28, 0x40, 0x71, 0x37, 0x18, 0xea, 0x47, 0x0c, 0x96, - 0x79, 0xc4, 0x20, 0x4c, 0xa0, 0xb6, 0xb2, 0x70, 0x84, 0x66, 0x34, 0x80, 0x64, 0x0d, 0x66, 0xdc, - 0x41, 0xdc, 0x8e, 0x03, 0x66, 0xf2, 0x9d, 0xb9, 0x61, 0x97, 0x93, 0x33, 0x6e, 0x71, 0xaa, 0x86, - 0x2c, 0x40, 0x51, 0xd9, 0x0a, 0x88, 0xc0, 0x8a, 0xcc, 0xdf, 0xc0, 0xa3, 0xce, 0x73, 0x11, 0x39, - 0x13, 0x25, 0xc6, 0x2d, 0xe6, 0xf7, 0xdc, 0xd9, 0xe3, 0x12, 0x3f, 0xaf, 0x8a, 0x99, 0x63, 0x8c, - 0x3a, 0x10, 0x4d, 0xc4, 0x59, 0x65, 0x59, 0x8f, 0x09, 0x57, 0xcc, 0x83, 0xdf, 0x7f, 0xb6, 0xa0, - 0x8c, 0x6b, 0xc3, 0xb4, 0x17, 0x67, 0x6f, 0x75, 0xca, 0x80, 0x6b, 0x32, 0xed, 0xa4, 0xc1, 0xc4, - 0x36, 0xd2, 0x1c, 0x0b, 0x6a, 0x42, 0x7a, 0xaa, 0xe3, 0x0a, 0x54, 0x79, 0x49, 0xa5, 0xf4, 0x71, - 0xba, 0x57, 0x40, 0x72, 0x15, 0x4a, 0x27, 0xc1, 0x50, 0x9a, 0xdb, 0x20, 0x0f, 0xec, 0x82, 0xa1, - 0x83, 0xf0, 0x64, 0x3c, 0xac, 0x3d, 0x3e, 0x2d, 0x6e, 0x44, 0xa5, 0xc1, 0xcc, 0x8c, 0x54, 0xcd, - 0xea, 0xcb, 0x94, 0x82, 0xda, 0x6b, 0x30, 0xcb, 0xa8, 0x5e, 0x8b, 0xba, 0x8e, 0x65, 0x65, 0xfb, - 0x67, 0x2c, 0xa8, 0x48, 0x64, 0xb2, 0x0a, 0x25, 0xc6, 0x42, 0x29, 0xc7, 0x55, 0x1d, 0xd4, 0x33, - 0x3c, 0x07, 0x31, 0x98, 0x31, 0x81, 0xc1, 0xb0, 0xc4, 0x4f, 0x92, 0xa1, 0xb0, 0xc4, 0x0d, 0x50, - 0xc3, 0x4d, 0x59, 0xcf, 0x29, 0xa8, 0xfd, 0x5d, 0x0b, 0xa6, 0x8d, 0x3e, 0xc8, 0x0a, 0xd4, 0xfa, - 0x6e, 0x14, 0x8b, 0xc3, 0x4f, 0xb1, 0x3d, 0x3a, 0x48, 0xdf, 0xe8, 0x82, 0x19, 0xfc, 0x57, 0x11, - 0xe2, 0xa2, 0x1e, 0x21, 0xbe, 0x05, 0xd5, 0x24, 0x19, 0xb5, 0x64, 0xf0, 0x3e, 0xeb, 0x51, 0xa6, - 0x20, 0x24, 0x48, 0x18, 0x74, 0x0c, 0xfa, 0x41, 0x28, 0x4e, 0xca, 0x78, 0xc1, 0xbe, 0x0b, 0x35, - 0x0d, 0x5f, 0x8f, 0x41, 0x5a, 0x46, 0x0c, 0x52, 0xe5, 0xe7, 0x14, 0x92, 0xfc, 0x1c, 0xfb, 0x5f, - 0x2d, 0x98, 0x66, 0x34, 0xe8, 0xf9, 0xbd, 0x83, 0xa0, 0xef, 0x75, 0xce, 0x71, 0xef, 0x25, 0xb9, - 0x09, 0x91, 0x28, 0x69, 0xd1, 0x04, 0x33, 0xaa, 0x97, 0x91, 0x0f, 0xc1, 0xa2, 0xaa, 0xcc, 0x78, - 0x98, 0x71, 0xc0, 0x91, 0x1b, 0x09, 0xb6, 0x10, 0x56, 0x9b, 0x01, 0x64, 0x9c, 0xc6, 0x00, 0x98, - 0x6d, 0x35, 0xf0, 0xfa, 0x7d, 0x8f, 0xe3, 0x72, 0x9b, 0x3e, 0xaf, 0x8a, 0xf5, 0xd9, 0xf5, 0x22, - 0xf7, 0x28, 0x39, 0xfd, 0x51, 0x65, 0x0c, 0xcf, 0xb8, 0xcf, 0xb4, 0xf0, 0xcc, 0x24, 0xca, 0x15, - 0x13, 0x68, 0xff, 0x59, 0x01, 0x6a, 0xd2, 0x44, 0xe8, 0xf6, 0xa8, 0x38, 0xd0, 0x34, 0x05, 0xa3, - 0x06, 0x91, 0xf5, 0x86, 0x37, 0xa6, 0x41, 0xd2, 0x84, 0x51, 0xcc, 0x12, 0xc6, 0x15, 0xa8, 0x32, - 0x02, 0x7d, 0x13, 0xdd, 0x3e, 0x91, 0xdf, 0xad, 0x00, 0xb2, 0xf6, 0x36, 0xd6, 0x96, 0x93, 0x5a, - 0x04, 0xbc, 0xf0, 0xf8, 0xf3, 0x0e, 0xd4, 0x45, 0x33, 0xb8, 0x73, 0x28, 0x79, 0x12, 0x16, 0x31, - 0x76, 0xd5, 0x31, 0x30, 0xe5, 0x97, 0xb7, 0xe5, 0x97, 0x95, 0x8b, 0xbe, 0x94, 0x98, 0xf6, 0x7d, - 0x75, 0xaa, 0x7c, 0x3f, 0x74, 0x87, 0x27, 0x92, 0x97, 0x6f, 0xc1, 0xbc, 0xe7, 0x77, 0xfa, 0xa3, - 0x2e, 0x6d, 0x8f, 0x7c, 0xd7, 0xf7, 0x83, 0x91, 0xdf, 0xa1, 0x32, 0x41, 0x27, 0xaf, 0xca, 0xee, - 0xaa, 0x74, 0x4e, 0x6c, 0x88, 0xac, 0x41, 0x99, 0xab, 0x4a, 0xae, 0x3b, 0xf2, 0x19, 0x9d, 0xa3, - 0x90, 0x55, 0x28, 0x73, 0x8d, 0x59, 0x30, 0xb8, 0x46, 0xdb, 0x55, 0x87, 0x23, 0x30, 0xb1, 0x83, - 0x19, 0xbd, 0xa6, 0xd8, 0x31, 0xf5, 0xce, 0x64, 0x07, 0x73, 0x7e, 0xed, 0x05, 0x20, 0xfb, 0x9c, - 0x53, 0xf4, 0xb3, 0xa1, 0xef, 0x17, 0xa1, 0xa6, 0x81, 0x99, 0x04, 0xe9, 0xb1, 0x01, 0xb7, 0xbb, - 0x9e, 0x3b, 0xa0, 0x31, 0x0d, 0x05, 0x77, 0xa4, 0xa0, 0x0c, 0xcf, 0x3d, 0xed, 0xb5, 0x83, 0x51, - 0xdc, 0xee, 0xd2, 0x5e, 0x48, 0xb9, 0x36, 0x65, 0xaa, 0xc9, 0x80, 0x32, 0x3c, 0x46, 0x9f, 0x1a, - 0x1e, 0xa7, 0xa0, 0x14, 0x54, 0x9e, 0xf4, 0xf0, 0x35, 0x2a, 0x25, 0x27, 0x3d, 0x7c, 0x45, 0xd2, - 0xb2, 0xaf, 0x9c, 0x23, 0xfb, 0xde, 0x82, 0x25, 0x2e, 0xe5, 0x84, 0x3c, 0x68, 0xa7, 0x08, 0x6b, - 0x4c, 0x2d, 0x59, 0x83, 0x06, 0x1b, 0xb3, 0x64, 0x89, 0xc8, 0xfb, 0x06, 0x8f, 0x9a, 0x5a, 0x4e, - 0x06, 0xce, 0x70, 0x31, 0x7c, 0xa9, 0xe3, 0xf2, 0xe3, 0xf6, 0x0c, 0x1c, 0x71, 0xdd, 0x67, 0x26, - 0x6e, 0x55, 0xe0, 0xa6, 0xe0, 0xe4, 0x0e, 0x2c, 0x0f, 0x68, 0xd7, 0x73, 0xcd, 0x26, 0x30, 0x02, - 0xcc, 0x73, 0x6a, 0xc6, 0x55, 0xdb, 0xd3, 0x50, 0x3b, 0x8c, 0x83, 0xa1, 0xdc, 0xce, 0x19, 0xa8, - 0xf3, 0xa2, 0x48, 0xb1, 0xba, 0x0c, 0x97, 0x90, 0xfe, 0x1e, 0x05, 0xc3, 0xa0, 0x1f, 0xf4, 0xce, - 0x0d, 0xa7, 0xeb, 0xaf, 0x2c, 0x98, 0x37, 0x6a, 0x13, 0xaf, 0x0b, 0xe3, 0x35, 0x32, 0x37, 0x86, - 0x93, 0xec, 0x9c, 0x26, 0xbc, 0x39, 0x22, 0x0f, 0x8d, 0x3f, 0x16, 0xe9, 0x32, 0x1b, 0xc9, 0xb5, - 0x19, 0xf9, 0x21, 0xa7, 0xdf, 0x66, 0x96, 0x7e, 0xc5, 0xf7, 0xf2, 0xd6, 0x8c, 0x6c, 0xe2, 0x0b, - 0x22, 0xe1, 0x81, 0x3b, 0x61, 0x32, 0x3c, 0xa7, 0xdc, 0x36, 0xdd, 0x49, 0x97, 0x23, 0xe8, 0x28, - 0x60, 0x64, 0xff, 0xb2, 0x05, 0x90, 0x8c, 0x0e, 0x8f, 0xc9, 0x95, 0x02, 0xe2, 0x57, 0xb4, 0x34, - 0x65, 0xf3, 0x1a, 0xd4, 0xd5, 0x49, 0x67, 0xa2, 0xd3, 0x6a, 0x12, 0xc6, 0x6c, 0xee, 0x1b, 0x30, - 0xdb, 0xeb, 0x07, 0x47, 0x68, 0x10, 0x60, 0xce, 0x5e, 0x24, 0x12, 0xcd, 0x66, 0x38, 0xf8, 0x9e, - 0x80, 0x26, 0x0a, 0xb0, 0xa4, 0x29, 0x40, 0xfb, 0x57, 0x0a, 0xea, 0x60, 0x2a, 0x99, 0xf3, 0x58, - 0xfe, 0x24, 0xb7, 0x33, 0x82, 0x78, 0xcc, 0x39, 0x10, 0x9a, 0xb5, 0x07, 0x17, 0xc6, 0xc9, 0xee, - 0xc2, 0x4c, 0xc8, 0x25, 0x9d, 0x14, 0x83, 0xa5, 0x17, 0x88, 0xc1, 0xe9, 0xd0, 0xd0, 0x92, 0x9f, - 0x82, 0x86, 0xdb, 0x3d, 0xa5, 0x61, 0xec, 0x61, 0xa4, 0x02, 0x4d, 0x14, 0x2e, 0xbc, 0x67, 0x35, - 0x38, 0x5a, 0x0e, 0x37, 0x60, 0x56, 0x24, 0xf7, 0x29, 0x4c, 0x71, 0xed, 0x21, 0x01, 0x33, 0x44, - 0xfb, 0x3b, 0xf2, 0x0c, 0xcc, 0xdc, 0xc3, 0xf1, 0x2b, 0xa2, 0xcf, 0xae, 0x90, 0x9a, 0xdd, 0x27, - 0xc4, 0x79, 0x54, 0x57, 0x86, 0x43, 0x8a, 0x5a, 0x72, 0x4c, 0x57, 0x9c, 0x1f, 0x9a, 0x4b, 0x5a, - 0x7a, 0x99, 0x25, 0xb5, 0x7f, 0x68, 0xc1, 0xd4, 0x6e, 0x30, 0xdc, 0x15, 0x69, 0x42, 0xc8, 0x08, - 0x2a, 0xab, 0x56, 0x16, 0x5f, 0x90, 0x40, 0x94, 0x6b, 0x19, 0x4c, 0xa7, 0x2d, 0x83, 0xff, 0x0b, - 0x97, 0x31, 0x18, 0x17, 0x06, 0xc3, 0x20, 0x64, 0xcc, 0xe8, 0xf6, 0xb9, 0x19, 0x10, 0xf8, 0xf1, - 0x89, 0x14, 0x80, 0x2f, 0x42, 0x41, 0x0f, 0x99, 0x79, 0x75, 0xdc, 0xa8, 0x17, 0x96, 0x0c, 0x97, - 0x8b, 0xd9, 0x0a, 0xfb, 0xf3, 0x50, 0x45, 0x53, 0x1c, 0xa7, 0xf5, 0x06, 0x54, 0x4f, 0x82, 0x61, - 0xfb, 0xc4, 0xf3, 0x63, 0xc9, 0xdc, 0x33, 0x89, 0x8d, 0xbc, 0x8b, 0x0b, 0xa2, 0x10, 0xec, 0xdf, - 0x98, 0x84, 0xa9, 0x07, 0xfe, 0x69, 0xe0, 0x75, 0xf0, 0xbc, 0x6d, 0x40, 0x07, 0x81, 0xcc, 0x31, - 0x66, 0xff, 0xc9, 0x15, 0x98, 0xc2, 0xa4, 0xba, 0x21, 0x27, 0xda, 0x3a, 0x3f, 0x17, 0x17, 0x20, - 0x66, 0x5e, 0x84, 0xc9, 0x6d, 0x10, 0xce, 0x3e, 0x1a, 0x84, 0x39, 0x29, 0xa1, 0x7e, 0x9b, 0x43, - 0x94, 0x92, 0x1c, 0xee, 0xb2, 0x96, 0xc3, 0xcd, 0xfa, 0x12, 0x69, 0x4d, 0x3c, 0xef, 0x85, 0xf7, - 0x25, 0x40, 0xe8, 0x58, 0x85, 0x94, 0x07, 0x53, 0xd1, 0x58, 0x99, 0x12, 0x8e, 0x95, 0x0e, 0x64, - 0x06, 0x0d, 0xff, 0x80, 0xe3, 0x70, 0xf1, 0xad, 0x83, 0x98, 0x89, 0x98, 0xbe, 0xc8, 0x53, 0xe5, - 0xb4, 0x9f, 0x02, 0x33, 0x19, 0xdf, 0xa5, 0x4a, 0xa0, 0xf2, 0x79, 0x00, 0xbf, 0xf1, 0x92, 0x86, - 0x6b, 0xee, 0x18, 0xcf, 0x7f, 0x94, 0xee, 0x18, 0x23, 0x18, 0xb7, 0xdf, 0x3f, 0x72, 0x3b, 0x4f, - 0xf1, 0x9e, 0x16, 0x9e, 0x80, 0x55, 0x1d, 0x13, 0x88, 0xc9, 0x49, 0xc9, 0xae, 0x62, 0x06, 0x41, - 0xc9, 0xd1, 0x41, 0xe4, 0x36, 0xd4, 0xd0, 0x05, 0x15, 0xfb, 0x3a, 0x83, 0xfb, 0xda, 0xd0, 0x7d, - 0x54, 0xdc, 0x59, 0x1d, 0x49, 0x3f, 0x0b, 0x9c, 0xcd, 0x64, 0x24, 0xba, 0xdd, 0xae, 0x38, 0x42, - 0x6d, 0x70, 0x77, 0x5a, 0x01, 0x98, 0x3e, 0x16, 0x0b, 0xc6, 0x11, 0xe6, 0x10, 0xc1, 0x80, 0x91, - 0xab, 0x50, 0x61, 0xee, 0xd1, 0xd0, 0xf5, 0xba, 0x98, 0xd2, 0xc8, 0xbd, 0x34, 0x05, 0x63, 0x6d, - 0xc8, 0xff, 0xa8, 0xe8, 0xe6, 0x71, 0x55, 0x0c, 0x18, 0x5b, 0x1b, 0x55, 0x46, 0x66, 0x5a, 0xe0, - 0x3b, 0x6a, 0x00, 0xc9, 0x9b, 0x78, 0x90, 0x15, 0xd3, 0xe6, 0x22, 0x06, 0xca, 0x2e, 0x8b, 0x39, - 0x0b, 0xa2, 0x95, 0xbf, 0x87, 0x0c, 0xc5, 0xe1, 0x98, 0xf6, 0x06, 0xd4, 0x75, 0x30, 0xa9, 0x40, - 0xe9, 0xe1, 0xc1, 0xce, 0x7e, 0x63, 0x82, 0xd4, 0x60, 0xea, 0x70, 0xe7, 0xd1, 0xa3, 0xbd, 0x9d, - 0xed, 0x86, 0x45, 0xea, 0x50, 0x51, 0x99, 0x64, 0x05, 0x56, 0xda, 0xd8, 0xda, 0xda, 0x39, 0x78, - 0xb4, 0xb3, 0xdd, 0x28, 0xda, 0x31, 0x90, 0x8d, 0x6e, 0x57, 0xb4, 0xa2, 0x82, 0x04, 0x09, 0x3d, - 0x5b, 0x06, 0x3d, 0xe7, 0xd0, 0x54, 0x21, 0x9f, 0xa6, 0x5e, 0xb8, 0xf2, 0xf6, 0x0e, 0xd4, 0x0e, - 0xb4, 0x4b, 0x4b, 0xc8, 0x5e, 0xf2, 0xba, 0x92, 0x60, 0x4b, 0x0d, 0xa2, 0x0d, 0xa7, 0xa0, 0x0f, - 0xc7, 0xfe, 0x7d, 0x8b, 0xdf, 0x0c, 0x50, 0xc3, 0xe7, 0x7d, 0xdb, 0x50, 0x57, 0xd1, 0xaa, 0x24, - 0x49, 0xd4, 0x80, 0x31, 0x1c, 0x1c, 0x4a, 0x3b, 0x38, 0x3e, 0x8e, 0xa8, 0x4c, 0xe9, 0x32, 0x60, - 0x8c, 0x2f, 0x98, 0x6d, 0xc6, 0xec, 0x1c, 0x8f, 0xf7, 0x10, 0x89, 0xd4, 0xae, 0x0c, 0x9c, 0x49, - 0x79, 0x11, 0x90, 0x91, 0xc9, 0x6c, 0xaa, 0xac, 0x72, 0x59, 0xd3, 0xab, 0xbc, 0x06, 0x15, 0xd5, - 0xae, 0x29, 0xc0, 0x24, 0xa6, 0xaa, 0x67, 0x82, 0x12, 0xbd, 0x15, 0x63, 0xd0, 0x5c, 0x68, 0x67, - 0x2b, 0xc8, 0x4d, 0x20, 0xc7, 0x5e, 0x98, 0x46, 0x2f, 0x22, 0x7a, 0x4e, 0x8d, 0xfd, 0x04, 0xe6, - 0x25, 0x21, 0x69, 0xa6, 0x95, 0xb9, 0x89, 0xd6, 0x45, 0xec, 0x53, 0xc8, 0xb2, 0x8f, 0xfd, 0x9f, - 0x16, 0x4c, 0x89, 0x9d, 0xce, 0x5c, 0x7c, 0xe3, 0xfb, 0x6c, 0xc0, 0x48, 0xd3, 0xb8, 0xf4, 0x82, - 0xbc, 0x26, 0x84, 0x66, 0x46, 0x2c, 0x16, 0xf3, 0xc4, 0x22, 0x81, 0xd2, 0xd0, 0x8d, 0x4f, 0xd0, - 0x53, 0xaf, 0x3a, 0xf8, 0x9f, 0x34, 0x78, 0x5c, 0x89, 0x8b, 0x60, 0x8c, 0x29, 0xe5, 0x5d, 0xf1, - 0xe3, 0xda, 0x3e, 0x7b, 0xc5, 0xef, 0x0a, 0x54, 0x71, 0x00, 0xed, 0x24, 0x6c, 0x94, 0x00, 0x18, - 0xe5, 0xf2, 0x02, 0xf2, 0xb5, 0xc8, 0x3f, 0x4f, 0x20, 0xf6, 0x22, 0xdf, 0x79, 0xb1, 0x04, 0xea, - 0x10, 0x5a, 0xe4, 0x0e, 0x27, 0xe0, 0x84, 0x22, 0xc4, 0x00, 0xd2, 0x14, 0x21, 0x50, 0x1d, 0x55, - 0x6f, 0xb7, 0xa0, 0xb9, 0x4d, 0xfb, 0x34, 0xa6, 0x1b, 0xfd, 0x7e, 0xba, 0xfd, 0xcb, 0x70, 0x29, - 0xa7, 0x4e, 0x58, 0xd3, 0x5f, 0x86, 0xc5, 0x0d, 0x9e, 0x67, 0xf9, 0x93, 0x4a, 0xe3, 0xb1, 0x9b, - 0xb0, 0x94, 0x6e, 0x52, 0x74, 0x76, 0x0f, 0xe6, 0xb6, 0xe9, 0xd1, 0xa8, 0xb7, 0x47, 0x4f, 0x93, - 0x8e, 0x08, 0x94, 0xa2, 0x93, 0xe0, 0x4c, 0x30, 0x26, 0xfe, 0x27, 0xaf, 0x00, 0xf4, 0x19, 0x4e, - 0x3b, 0x1a, 0xd2, 0x8e, 0xbc, 0x67, 0x82, 0x90, 0xc3, 0x21, 0xed, 0xd8, 0x6f, 0x01, 0xd1, 0xdb, - 0x11, 0xeb, 0xc5, 0xb4, 0xe0, 0xe8, 0xa8, 0x1d, 0x9d, 0x47, 0x31, 0x1d, 0xc8, 0x0b, 0x34, 0x3a, - 0xc8, 0xbe, 0x01, 0xf5, 0x03, 0xf7, 0xdc, 0xa1, 0x1f, 0x8a, 0xfb, 0x8e, 0xcb, 0x30, 0x35, 0x74, - 0xcf, 0x99, 0x98, 0x52, 0xf1, 0x2c, 0xac, 0xb6, 0xff, 0xbd, 0x00, 0x93, 0x1c, 0x93, 0xb5, 0xda, - 0xa5, 0x51, 0xec, 0xf9, 0x48, 0x58, 0xb2, 0x55, 0x0d, 0x94, 0x21, 0xe5, 0x42, 0x0e, 0x29, 0x0b, - 0x6f, 0x4f, 0xe6, 0xec, 0x0b, 0x7a, 0x35, 0x60, 0x8c, 0xb8, 0x92, 0x7c, 0x3a, 0x1e, 0x50, 0x49, - 0x00, 0xa9, 0xd0, 0x67, 0xa2, 0x6b, 0xf9, 0xf8, 0x24, 0x97, 0x0a, 0xca, 0xd5, 0x41, 0xb9, 0x1a, - 0x7d, 0x8a, 0x13, 0x78, 0x46, 0xa3, 0x67, 0x34, 0x77, 0xe5, 0x25, 0x34, 0x37, 0x77, 0x01, 0x5f, - 0xa4, 0xb9, 0xe1, 0x25, 0x34, 0xb7, 0x4d, 0xa0, 0x81, 0x97, 0x01, 0x99, 0x6d, 0x28, 0x69, 0xf7, - 0x5b, 0x16, 0x34, 0x04, 0x15, 0xa9, 0x3a, 0xf2, 0x9a, 0x61, 0x03, 0xe7, 0x66, 0xc3, 0x5f, 0x83, - 0x69, 0xb4, 0x4c, 0x55, 0x8c, 0x57, 0x04, 0xa4, 0x0d, 0x20, 0x9b, 0x87, 0x3c, 0x3f, 0x1e, 0x78, - 0x7d, 0xb1, 0x29, 0x3a, 0x48, 0x86, 0x89, 0x43, 0x57, 0xe4, 0x95, 0x59, 0x8e, 0x2a, 0xdb, 0x7f, - 0x6e, 0xc1, 0x9c, 0x36, 0x60, 0x41, 0x85, 0x77, 0x41, 0x72, 0x03, 0x0f, 0xf8, 0x72, 0xce, 0x5d, - 0x36, 0xd9, 0x26, 0xf9, 0xcc, 0x40, 0xc6, 0xcd, 0x74, 0xcf, 0x71, 0x80, 0xd1, 0x68, 0x20, 0x84, - 0xa8, 0x0e, 0x62, 0x84, 0x74, 0x46, 0xe9, 0x53, 0x85, 0xc2, 0xc5, 0xb8, 0x01, 0xc3, 0xa8, 0x1a, - 0xb3, 0xa8, 0x15, 0x52, 0x49, 0x44, 0xd5, 0x74, 0xa0, 0xfd, 0xb7, 0x16, 0xcc, 0x73, 0xd7, 0x48, - 0x38, 0x9e, 0xea, 0xda, 0xd3, 0x24, 0xf7, 0x05, 0x39, 0x47, 0xee, 0x4e, 0x38, 0xa2, 0x4c, 0x3e, - 0xfb, 0x92, 0xee, 0x9c, 0x4a, 0x76, 0x1b, 0xb3, 0x17, 0xc5, 0xbc, 0xbd, 0x78, 0xc1, 0x4a, 0xe7, - 0x05, 0x38, 0xcb, 0xb9, 0x01, 0xce, 0xcd, 0x29, 0x28, 0x47, 0x9d, 0x60, 0x48, 0xed, 0x25, 0x58, - 0x30, 0x27, 0x27, 0x44, 0xd0, 0xb7, 0x2d, 0x68, 0xde, 0xe3, 0x07, 0x01, 0x9e, 0xdf, 0xdb, 0xf5, - 0xa2, 0x38, 0x08, 0xd5, 0xed, 0xd0, 0xab, 0x00, 0x51, 0xec, 0x86, 0x31, 0xcf, 0xa3, 0x16, 0x81, - 0xc5, 0x04, 0xc2, 0xc6, 0x48, 0xfd, 0x2e, 0xaf, 0xe5, 0x7b, 0xa3, 0xca, 0x19, 0x1b, 0x42, 0x38, - 0x6f, 0x86, 0x26, 0xbe, 0xce, 0x93, 0x3f, 0x99, 0xad, 0x40, 0x4f, 0x51, 0xae, 0x73, 0xaf, 0x28, - 0x05, 0xb5, 0xff, 0xc6, 0x82, 0xd9, 0x64, 0x90, 0x78, 0x2c, 0x6a, 0x4a, 0x07, 0xa1, 0x7e, 0x13, - 0xe9, 0x20, 0x43, 0x9e, 0x1e, 0xd3, 0xc7, 0x62, 0x6c, 0x1a, 0x04, 0x39, 0x56, 0x94, 0x82, 0x91, - 0x34, 0x70, 0x74, 0x10, 0x4f, 0xe5, 0x62, 0x96, 0x80, 0xb0, 0x6a, 0x44, 0x09, 0xd3, 0xe0, 0x07, - 0x31, 0x7e, 0xc5, 0x83, 0xb3, 0xb2, 0x28, 0x55, 0xe9, 0x14, 0x42, 0x51, 0x95, 0xea, 0x87, 0x2a, - 0x15, 0xbe, 0x3e, 0xb2, 0x6c, 0xff, 0xaa, 0x05, 0x97, 0x72, 0x16, 0x5e, 0x70, 0xcd, 0x36, 0xcc, - 0x1d, 0xab, 0x4a, 0xb9, 0x38, 0x9c, 0x75, 0x96, 0xe4, 0xa1, 0x9d, 0xb9, 0x20, 0x4e, 0xf6, 0x03, - 0x65, 0x17, 0xf1, 0xe5, 0x36, 0x92, 0x25, 0xb3, 0x15, 0xf6, 0x01, 0xb4, 0x76, 0x9e, 0x31, 0x26, - 0xdc, 0xd2, 0x1f, 0x3a, 0x91, 0xb4, 0x70, 0x3b, 0x23, 0x64, 0x2e, 0x76, 0xb4, 0x8f, 0x61, 0xda, - 0x68, 0x8b, 0x7c, 0xfa, 0x65, 0x1b, 0x49, 0x85, 0xa7, 0xb1, 0xc4, 0x5f, 0x6a, 0x91, 0x29, 0x9b, - 0x1a, 0xc8, 0x3e, 0x85, 0xd9, 0x77, 0x47, 0xfd, 0xd8, 0x4b, 0x5e, 0x6d, 0x21, 0x9f, 0x15, 0x1f, - 0x61, 0x13, 0x72, 0xe9, 0x72, 0xbb, 0xd2, 0xf1, 0xd8, 0x8a, 0x0d, 0x58, 0x4b, 0xed, 0x6c, 0x8f, - 0xd9, 0x0a, 0xfb, 0x12, 0x2c, 0x27, 0x5d, 0xf2, 0xb5, 0x93, 0x82, 0xfa, 0x3b, 0x16, 0xcf, 0x76, - 0x30, 0x1f, 0x91, 0x21, 0xf7, 0x61, 0x3e, 0xf2, 0xfc, 0x5e, 0x9f, 0xea, 0xed, 0x44, 0x62, 0x25, - 0x16, 0xcd, 0xe1, 0x89, 0x87, 0x66, 0x9c, 0xbc, 0x2f, 0x18, 0x81, 0xe4, 0x0f, 0x34, 0x21, 0x90, - 0xd4, 0x92, 0xe4, 0x4d, 0xe0, 0x4b, 0x30, 0x63, 0x76, 0x46, 0xee, 0x88, 0x6c, 0xcb, 0x64, 0x64, - 0x7a, 0x2c, 0xdb, 0xa4, 0x0c, 0x03, 0xd3, 0xfe, 0xa6, 0x05, 0x4d, 0x87, 0x32, 0x32, 0xa6, 0x5a, - 0xa7, 0x82, 0x7a, 0xee, 0x66, 0x9a, 0x1d, 0x3f, 0x61, 0x95, 0xc5, 0x29, 0xe7, 0x7a, 0x73, 0xec, - 0xa6, 0xec, 0x4e, 0xe4, 0xcc, 0x6a, 0xb3, 0x02, 0x93, 0x62, 0x7e, 0xcb, 0xb0, 0x28, 0x86, 0x24, - 0x87, 0x93, 0x04, 0x4d, 0x8d, 0x4e, 0x8d, 0xa0, 0x69, 0x0b, 0x9a, 0xfc, 0xda, 0xae, 0x3e, 0x0f, - 0xfe, 0xe1, 0xda, 0x73, 0xa8, 0x69, 0x97, 0x97, 0xc9, 0x32, 0xcc, 0x3f, 0x79, 0xf0, 0x68, 0x7f, - 0xe7, 0xf0, 0xb0, 0x7d, 0xf0, 0x78, 0xf3, 0x9d, 0x9d, 0xf7, 0xda, 0xbb, 0x1b, 0x87, 0xbb, 0x8d, - 0x09, 0xb2, 0x04, 0x64, 0x7f, 0xe7, 0xf0, 0xd1, 0xce, 0xb6, 0x01, 0xb7, 0xc8, 0x55, 0x68, 0x3d, - 0xde, 0x7f, 0x7c, 0xb8, 0xb3, 0xdd, 0xce, 0xfb, 0xae, 0x40, 0x5e, 0x81, 0x4b, 0xa2, 0x3e, 0xe7, - 0xf3, 0xe2, 0xed, 0x6f, 0x16, 0x61, 0x86, 0x27, 0x5d, 0xf0, 0xb7, 0x87, 0x68, 0x48, 0xde, 0x85, - 0x29, 0xf1, 0x88, 0x15, 0x91, 0xeb, 0x69, 0x3e, 0x9b, 0xd5, 0x5a, 0x4a, 0x83, 0xc5, 0x22, 0xcc, - 0xff, 0xec, 0x0f, 0xff, 0xe9, 0xd7, 0x0b, 0xd3, 0xa4, 0xb6, 0x7e, 0xfa, 0xe6, 0x7a, 0x8f, 0xfa, - 0x11, 0x6b, 0xe3, 0x6b, 0x00, 0xc9, 0xd3, 0x4c, 0xa4, 0xa9, 0x7c, 0xae, 0xd4, 0xbb, 0x55, 0xad, - 0x4b, 0x39, 0x35, 0xa2, 0xdd, 0x4b, 0xd8, 0xee, 0xbc, 0x3d, 0xc3, 0xda, 0xf5, 0x7c, 0x2f, 0xe6, - 0xcf, 0x34, 0xbd, 0x6d, 0xad, 0x91, 0x2e, 0xd4, 0xf5, 0x47, 0x93, 0x88, 0x0c, 0xfc, 0xe6, 0x3c, - 0xfb, 0xd4, 0xba, 0x9c, 0x5b, 0x27, 0x37, 0x10, 0xfb, 0x58, 0xb4, 0x1b, 0xac, 0x8f, 0x11, 0x62, - 0x24, 0xbd, 0xf4, 0x39, 0x59, 0x27, 0x6f, 0x23, 0x91, 0x2b, 0x1a, 0xa5, 0x65, 0x5e, 0x66, 0x6a, - 0xbd, 0x32, 0xa6, 0x56, 0xf4, 0xf5, 0x0a, 0xf6, 0xb5, 0x6c, 0x13, 0xd6, 0x57, 0x07, 0x71, 0xe4, - 0xcb, 0x4c, 0x6f, 0x5b, 0x6b, 0xb7, 0x7f, 0xf3, 0x3a, 0x54, 0xd5, 0x21, 0x0f, 0xf9, 0x00, 0xa6, - 0x8d, 0xac, 0x18, 0x22, 0xa7, 0x91, 0x97, 0x44, 0xd3, 0xba, 0x92, 0x5f, 0x29, 0x3a, 0xbe, 0x8a, - 0x1d, 0x37, 0xc9, 0x12, 0xeb, 0x58, 0xa4, 0x95, 0xac, 0x63, 0x7e, 0x17, 0xbf, 0xac, 0xf1, 0x54, - 0x63, 0x5f, 0xde, 0xd9, 0x95, 0x34, 0x47, 0x19, 0xbd, 0xbd, 0x32, 0xa6, 0x56, 0x74, 0x77, 0x05, - 0xbb, 0x5b, 0x22, 0x0b, 0x7a, 0x77, 0xea, 0xf0, 0x85, 0xe2, 0x0d, 0x23, 0xfd, 0x59, 0x21, 0xf2, - 0x8a, 0x22, 0xac, 0xbc, 0xe7, 0x86, 0x14, 0x89, 0x64, 0xdf, 0x1c, 0xb2, 0x9b, 0xd8, 0x15, 0x21, - 0xb8, 0x7d, 0xfa, 0xab, 0x42, 0xe4, 0x08, 0x6a, 0xda, 0x53, 0x18, 0xe4, 0xd2, 0xd8, 0x67, 0x3b, - 0x5a, 0xad, 0xbc, 0xaa, 0xbc, 0xa9, 0xe8, 0xed, 0xaf, 0x33, 0xbd, 0xfc, 0x55, 0xa8, 0xaa, 0xc7, - 0x15, 0xc8, 0xb2, 0xf6, 0xd8, 0x85, 0xfe, 0x18, 0x44, 0xab, 0x99, 0xad, 0xc8, 0x23, 0x3e, 0xbd, - 0x75, 0x46, 0x7c, 0x4f, 0xa0, 0xa6, 0x3d, 0xa0, 0xa0, 0x26, 0x90, 0x7d, 0xa4, 0x41, 0x4d, 0x20, - 0xe7, 0xbd, 0x05, 0x7b, 0x0e, 0xbb, 0xa8, 0x91, 0x2a, 0xd2, 0x77, 0xfc, 0x2c, 0x88, 0xc8, 0x1e, - 0x2c, 0x0a, 0x31, 0x75, 0x44, 0x3f, 0xce, 0x36, 0xe4, 0xbc, 0xe4, 0x74, 0xcb, 0x22, 0x77, 0xa1, - 0x22, 0xdf, 0xc9, 0x20, 0x4b, 0xf9, 0xef, 0x7d, 0xb4, 0x96, 0x33, 0x70, 0x61, 0x9e, 0xbc, 0x07, - 0x90, 0xbc, 0xd6, 0xa0, 0x84, 0x44, 0xe6, 0xf5, 0x07, 0x45, 0x01, 0xd9, 0xa7, 0x1d, 0xec, 0x25, - 0x9c, 0x60, 0x83, 0xa0, 0x90, 0xf0, 0xe9, 0x99, 0xbc, 0x4c, 0xf8, 0x75, 0xa8, 0x69, 0x0f, 0x36, - 0xa8, 0xe5, 0xcb, 0x3e, 0xf6, 0xa0, 0x96, 0x2f, 0xe7, 0x7d, 0x07, 0xbb, 0x85, 0xad, 0x2f, 0xd8, - 0xb3, 0xac, 0xf5, 0xc8, 0xeb, 0xf9, 0x03, 0x8e, 0xc0, 0x36, 0xe8, 0x04, 0xa6, 0x8d, 0x57, 0x19, - 0x14, 0x87, 0xe6, 0xbd, 0xf9, 0xa0, 0x38, 0x34, 0xf7, 0x21, 0x07, 0x49, 0x67, 0xf6, 0x1c, 0xeb, - 0xe7, 0x14, 0x51, 0xb4, 0x9e, 0xde, 0x87, 0x9a, 0xf6, 0xc2, 0x82, 0x9a, 0x4b, 0xf6, 0x31, 0x07, - 0x35, 0x97, 0xbc, 0x07, 0x19, 0x16, 0xb0, 0x8f, 0x19, 0x1b, 0x49, 0x01, 0xaf, 0xc5, 0xb1, 0xb6, - 0x3f, 0x80, 0x19, 0xf3, 0xcd, 0x05, 0xc5, 0xfb, 0xb9, 0xaf, 0x37, 0x28, 0xde, 0x1f, 0xf3, 0x50, - 0x83, 0x20, 0xe9, 0xb5, 0x79, 0xd5, 0xc9, 0xfa, 0x47, 0x22, 0xf9, 0xe3, 0x39, 0xf9, 0x32, 0x13, - 0x70, 0xe2, 0x9e, 0x22, 0x59, 0xd6, 0xa8, 0x56, 0xbf, 0xcd, 0xa8, 0xf8, 0x25, 0x73, 0xa5, 0xd1, - 0x24, 0x66, 0x7e, 0xb1, 0x0f, 0xb5, 0x16, 0xde, 0x57, 0xd4, 0xb4, 0x96, 0x7e, 0xa5, 0x51, 0xd3, - 0x5a, 0xc6, 0xb5, 0xc6, 0xb4, 0xd6, 0x8a, 0x3d, 0xd6, 0x86, 0x0f, 0xb3, 0xa9, 0xcc, 0x5d, 0xc5, - 0x15, 0xf9, 0x57, 0x1d, 0x5a, 0x57, 0x5f, 0x9c, 0xf0, 0x6b, 0x4a, 0x10, 0x29, 0x04, 0xd7, 0xe5, - 0xc5, 0x92, 0xff, 0x0f, 0x75, 0xfd, 0x7e, 0x3b, 0xd1, 0x59, 0x39, 0xdd, 0xd3, 0xe5, 0xdc, 0x3a, - 0x73, 0x73, 0x49, 0x5d, 0xef, 0x86, 0x7c, 0x05, 0x96, 0x14, 0xab, 0xeb, 0xc9, 0xa0, 0x11, 0x79, - 0x35, 0x27, 0x45, 0x54, 0x37, 0x5e, 0x5a, 0x97, 0xc6, 0xe6, 0x90, 0xde, 0xb2, 0x18, 0xd1, 0x98, - 0x17, 0x87, 0x13, 0x85, 0x91, 0x77, 0x5f, 0x3a, 0x51, 0x18, 0xb9, 0xb7, 0x8d, 0x25, 0xd1, 0x90, - 0x79, 0x63, 0x8d, 0xf8, 0xf9, 0x1c, 0x79, 0x1f, 0x66, 0xb5, 0x74, 0xfb, 0xc3, 0x73, 0xbf, 0xa3, - 0x18, 0x20, 0x7b, 0x2f, 0xab, 0x95, 0x67, 0x9a, 0xdb, 0xcb, 0xd8, 0xfe, 0x9c, 0x6d, 0x2c, 0x0e, - 0x23, 0xfe, 0x2d, 0xa8, 0xe9, 0xa9, 0xfc, 0x2f, 0x68, 0x77, 0x59, 0xab, 0xd2, 0xaf, 0x15, 0xdd, - 0xb2, 0xc8, 0x6f, 0x5b, 0x50, 0x37, 0x12, 0xe3, 0x8d, 0x53, 0xe8, 0x54, 0x3b, 0x4d, 0xbd, 0x4e, - 0x6f, 0xc8, 0x76, 0x70, 0x90, 0x7b, 0x6b, 0x5f, 0x32, 0x16, 0xe1, 0x23, 0x23, 0xfe, 0x72, 0x33, - 0xfd, 0x36, 0xd7, 0xf3, 0x34, 0x82, 0x7e, 0x77, 0xed, 0xf9, 0x2d, 0x8b, 0x7c, 0xd7, 0x82, 0x19, - 0x33, 0x6a, 0xa8, 0xb6, 0x2a, 0x37, 0x3e, 0xa9, 0xb6, 0x6a, 0x4c, 0xa8, 0xf1, 0x7d, 0x1c, 0xe5, - 0xa3, 0x35, 0xc7, 0x18, 0xa5, 0xb8, 0x52, 0xfe, 0xe3, 0x8d, 0x96, 0xbc, 0xcd, 0x9f, 0xef, 0x93, - 0xa1, 0x6c, 0xa2, 0x69, 0x8d, 0xf4, 0xf6, 0xea, 0x4f, 0xce, 0xad, 0x5a, 0xb7, 0x2c, 0xf2, 0x75, - 0xfe, 0x26, 0x95, 0xf8, 0x16, 0xa9, 0xe4, 0x65, 0xbf, 0xb7, 0xaf, 0xe1, 0x9c, 0xae, 0xda, 0x97, - 0x8c, 0x39, 0xa5, 0xf5, 0xf1, 0x06, 0x1f, 0x9d, 0x78, 0x2d, 0x2e, 0x51, 0x28, 0x99, 0x17, 0xe4, - 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, 0x57, - 0xb9, 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, 0x47, 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, 0x5c, 0xff, 0x48, 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, 0xbb, 0x42, 0xcf, 0x9f, 0x4b, 0x0b, 0x70, 0xac, 0x33, 0x15, 0x3f, 0xa6, 0x97, - 0x91, 0xaf, 0x42, 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, 0x7f, 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, 0xdf, - 0xaf, 0x18, 0x28, 0x27, 0xbf, 0xdc, 0x5e, 0xc5, 0x7e, 0x6c, 0xb2, 0x92, 0xf4, 0xc3, 0x73, 0xca, - 0x93, 0x9e, 0xd6, 0x3f, 0x72, 0x07, 0xf1, 0x73, 0xf2, 0x04, 0x9f, 0x78, 0xd0, 0xd3, 0xf6, 0x12, - 0x5b, 0x3a, 0x9d, 0xe1, 0xa7, 0x16, 0x4b, 0xab, 0x32, 0xed, 0x6b, 0xde, 0x15, 0x5a, 0x4a, 0x9f, - 0x05, 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, 0x9d, 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, 0x8e, 0x05, 0xf3, - 0x39, 0x51, 0x5e, 0xf2, 0x9a, 0x74, 0xa6, 0xc7, 0x46, 0x80, 0x5b, 0xb9, 0x41, 0x40, 0xfb, 0x10, - 0xfb, 0x79, 0x97, 0xbc, 0x63, 0x28, 0x36, 0x1e, 0x7f, 0x13, 0x9c, 0xf9, 0x42, 0xa3, 0x22, 0xd7, - 0xa2, 0xf8, 0x10, 0x96, 0xf9, 0x40, 0x36, 0xfa, 0xfd, 0x54, 0x80, 0xf2, 0x6a, 0xe6, 0x85, 0x6e, - 0x23, 0xf0, 0xda, 0x1a, 0xff, 0x82, 0xf7, 0x18, 0x73, 0x95, 0x0f, 0x95, 0x8c, 0xa0, 0x91, 0x0e, - 0xfa, 0x91, 0xf1, 0x6d, 0xb5, 0x5e, 0x35, 0xdc, 0xc2, 0x6c, 0xa0, 0xd0, 0xfe, 0x24, 0x76, 0xf6, - 0xaa, 0xdd, 0xca, 0x5b, 0x17, 0xee, 0x29, 0xb2, 0xfd, 0xf8, 0x69, 0x15, 0xa1, 0x4c, 0xcd, 0x53, - 0x76, 0x30, 0x2e, 0xa4, 0xaa, 0x1c, 0xd3, 0xfc, 0x00, 0xe7, 0x75, 0xec, 0x7e, 0xc5, 0xbe, 0x9c, - 0xd7, 0x7d, 0xc8, 0x3f, 0xe1, 0x2e, 0xea, 0x72, 0x9a, 0xaf, 0xe5, 0x08, 0x56, 0xf2, 0xf6, 0x7b, - 0xac, 0xaf, 0x91, 0x5a, 0xeb, 0x89, 0x5b, 0xd6, 0xe6, 0x8d, 0xf7, 0x3f, 0xd9, 0xf3, 0xe2, 0x93, - 0xd1, 0xd1, 0xcd, 0x4e, 0x30, 0x58, 0xef, 0xcb, 0x10, 0x99, 0x48, 0xcf, 0x5d, 0xef, 0xfb, 0xdd, - 0x75, 0xfc, 0xfe, 0x68, 0x12, 0x1f, 0xfc, 0xff, 0xf4, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb7, - 0x24, 0x9f, 0x62, 0x22, 0x60, 0x00, 0x00, +func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_c21d4a52f85dc337) } + +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, } diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index dfe5520937d8..026f8a5bcefd 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -1606,11 +1606,7 @@ message QueryRoutesRequest { /// The amount to send expressed in satoshis int64 amt = 2; - /** - Deprecated. The max number of routes to return. In the future, QueryRoutes - will only return a single route. - */ - int32 num_routes = 3 [deprecated = true]; + reserved 3; /// An optional CLTV delta from the current height that should be used for the timelock of the final hop int32 final_cltv_delta = 4; diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index d7ed2e6c97d4..33d4afb442dc 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -673,14 +673,6 @@ "type": "string", "format": "int64" }, - { - "name": "num_routes", - "description": "*\nDeprecated. The max number of routes to return. In the future, QueryRoutes\nwill only return a single route.", - "in": "query", - "required": false, - "type": "integer", - "format": "int32" - }, { "name": "final_cltv_delta", "description": "/ An optional CLTV delta from the current height that should be used for the timelock of the final hop.", diff --git a/routing/pathfind.go b/routing/pathfind.go index af6b9f3c608a..222479854724 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -616,180 +616,3 @@ func findPath(g *graphParams, r *RestrictParams, source, target route.Vertex, return pathEdges, nil } - -// findPaths implements a k-shortest paths algorithm to find all the reachable -// paths between the passed source and target. The algorithm will continue to -// traverse the graph until all possible candidate paths have been depleted. -// This function implements a modified version of Yen's. To find each path -// itself, we utilize our modified version of Dijkstra's found above. When -// examining possible spur and root paths, rather than removing edges or -// Vertexes from the graph, we instead utilize a Vertex+edge black-list that -// will be ignored by our modified Dijkstra's algorithm. With this approach, we -// make our inner path finding algorithm aware of our k-shortest paths -// algorithm, rather than attempting to use an unmodified path finding -// algorithm in a block box manner. -func findPaths(tx *bbolt.Tx, graph *channeldb.ChannelGraph, - source, target route.Vertex, amt lnwire.MilliSatoshi, - restrictions *RestrictParams, numPaths uint32, - bandwidthHints map[uint64]lnwire.MilliSatoshi) ( - [][]*channeldb.ChannelEdgePolicy, error) { - - // TODO(roasbeef): modifying ordering within heap to eliminate final - // sorting step? - var ( - shortestPaths [][]*channeldb.ChannelEdgePolicy - candidatePaths pathHeap - ) - - // First we'll find a single shortest path from the source (our - // selfNode) to the target destination that's capable of carrying amt - // satoshis along the path before fees are calculated. - startingPath, err := findPath( - &graphParams{ - tx: tx, - graph: graph, - bandwidthHints: bandwidthHints, - }, - restrictions, source, target, amt, - ) - if err != nil { - log.Errorf("Unable to find path: %v", err) - return nil, err - } - - // Manually insert a "self" edge emanating from ourselves. This - // self-edge is required in order for the path finding algorithm to - // function properly. - firstPath := make([]*channeldb.ChannelEdgePolicy, 0, len(startingPath)+1) - firstPath = append(firstPath, &channeldb.ChannelEdgePolicy{ - Node: &channeldb.LightningNode{PubKeyBytes: source}, - }) - firstPath = append(firstPath, startingPath...) - - shortestPaths = append(shortestPaths, firstPath) - - // While we still have candidate paths to explore we'll keep exploring - // the sub-graphs created to find the next k-th shortest path. - for k := uint32(1); k < numPaths; k++ { - prevShortest := shortestPaths[k-1] - - // We'll examine each edge in the previous iteration's shortest - // path in order to find path deviations from each node in the - // path. - for i := 0; i < len(prevShortest)-1; i++ { - // These two maps will mark the edges and Vertexes - // we'll exclude from the next path finding attempt. - // These are required to ensure the paths are unique - // and loopless. - ignoredEdges := make(map[EdgeLocator]struct{}) - ignoredVertexes := make(map[route.Vertex]struct{}) - - for e := range restrictions.IgnoredEdges { - ignoredEdges[e] = struct{}{} - } - for n := range restrictions.IgnoredNodes { - ignoredVertexes[n] = struct{}{} - } - - // Our spur node is the i-th node in the prior shortest - // path, and our root path will be all nodes in the - // path leading up to our spurNode. - spurNode := prevShortest[i].Node - rootPath := prevShortest[:i+1] - - // Before we kickoff our next path finding iteration, - // we'll find all the edges we need to ignore in this - // next round. This ensures that we create a new unique - // path. - for _, path := range shortestPaths { - // If our current rootPath is a prefix of this - // shortest path, then we'll remove the edge - // directly _after_ our spur node from the - // graph so we don't repeat paths. - if len(path) > i+1 && - isSamePath(rootPath, path[:i+1]) { - - locator := newEdgeLocator(path[i+1]) - ignoredEdges[*locator] = struct{}{} - } - } - - // Next we'll remove all entries in the root path that - // aren't the current spur node from the graph. This - // ensures we don't create a path with loops. - for _, hop := range rootPath { - node := hop.Node.PubKeyBytes - if node == spurNode.PubKeyBytes { - continue - } - - ignoredVertexes[route.Vertex(node)] = struct{}{} - } - - // With the edges that are part of our root path, and - // the Vertexes (other than the spur path) within the - // root path removed, we'll attempt to find another - // shortest path from the spur node to the destination. - // - // TODO: Fee limit passed to spur path finding isn't - // correct, because it doesn't take into account the - // fees already paid on the root path. - // - // TODO: Outgoing channel restriction isn't obeyed for - // spur paths. - spurRestrictions := &RestrictParams{ - IgnoredEdges: ignoredEdges, - IgnoredNodes: ignoredVertexes, - FeeLimit: restrictions.FeeLimit, - } - - spurPath, err := findPath( - &graphParams{ - tx: tx, - graph: graph, - bandwidthHints: bandwidthHints, - }, - spurRestrictions, spurNode.PubKeyBytes, - target, amt, - ) - - // If we weren't able to find a path, we'll continue to - // the next round. - if IsError(err, ErrNoPathFound) { - continue - } else if err != nil { - return nil, err - } - - // Create the new combined path by concatenating the - // rootPath to the spurPath. - newPathLen := len(rootPath) + len(spurPath) - newPath := path{ - hops: make([]*channeldb.ChannelEdgePolicy, 0, newPathLen), - dist: newPathLen, - } - newPath.hops = append(newPath.hops, rootPath...) - newPath.hops = append(newPath.hops, spurPath...) - - // TODO(roasbeef): add and consult path finger print - - // We'll now add this newPath to the heap of candidate - // shortest paths. - heap.Push(&candidatePaths, newPath) - } - - // If our min-heap of candidate paths is empty, then we can - // exit early. - if candidatePaths.Len() == 0 { - break - } - - // To conclude this latest iteration, we'll take the shortest - // path in our set of candidate paths and add it to our - // shortestPaths list as the *next* shortest path. - nextShortestPath := heap.Pop(&candidatePaths).(path).hops - shortestPaths = append(shortestPaths, nextShortestPath) - } - - return shortestPaths, nil -} diff --git a/routing/pathfind_test.go b/routing/pathfind_test.go index 3a8e18684969..7ce114c29071 100644 --- a/routing/pathfind_test.go +++ b/routing/pathfind_test.go @@ -948,63 +948,6 @@ func TestPathFindingWithAdditionalEdges(t *testing.T) { assertExpectedPath(t, graph.aliasMap, path, "songoku", "doge") } -func TestKShortestPathFinding(t *testing.T) { - t.Parallel() - - graph, err := parseTestGraph(basicGraphFilePath) - if err != nil { - t.Fatalf("unable to create graph: %v", err) - } - defer graph.cleanUp() - - sourceNode, err := graph.graph.SourceNode() - if err != nil { - t.Fatalf("unable to fetch source node: %v", err) - } - - // In this test we'd like to ensure that our algorithm to find the - // k-shortest paths from a given source node to any destination node - // works as expected. - - // In our basic_graph.json, there exist two paths from roasbeef to luo - // ji. Our algorithm should properly find both paths, and also rank - // them in order of their total "distance". - - paymentAmt := lnwire.NewMSatFromSatoshis(100) - target := graph.aliasMap["luoji"] - restrictions := &RestrictParams{ - FeeLimit: noFeeLimit, - } - paths, err := findPaths( - nil, graph.graph, sourceNode.PubKeyBytes, target, paymentAmt, - restrictions, 100, nil, - ) - if err != nil { - t.Fatalf("unable to find paths between roasbeef and "+ - "luo ji: %v", err) - } - - // The algorithm should have found two paths from roasbeef to luo ji. - if len(paths) != 2 { - t.Fatalf("two path shouldn't been found, instead %v were", - len(paths)) - } - - // Additionally, the total hop length of the first path returned should - // be _less_ than that of the second path returned. - if len(paths[0]) > len(paths[1]) { - t.Fatalf("paths found not ordered properly") - } - - // The first route should be a direct route to luo ji. - assertExpectedPath(t, graph.aliasMap, paths[0], "roasbeef", "luoji") - - // The second route should be a route to luo ji via satoshi. - assertExpectedPath( - t, graph.aliasMap, paths[1], "roasbeef", "satoshi", "luoji", - ) -} - // TestNewRoute tests whether the construction of hop payloads by newRoute // is executed correctly. func TestNewRoute(t *testing.T) { @@ -1732,45 +1675,38 @@ func TestPathFindSpecExample(t *testing.T) { // Query for a route of 4,999,999 mSAT to carol. carol := ctx.aliases["C"] const amt lnwire.MilliSatoshi = 4999999 - routes, err := ctx.router.FindRoutes( - bobNode.PubKeyBytes, carol, amt, noRestrictions, 100, + route, err := ctx.router.FindRoute( + bobNode.PubKeyBytes, carol, amt, noRestrictions, ) if err != nil { t.Fatalf("unable to find route: %v", err) } - // We should come back with _exactly_ two routes. - if len(routes) != 2 { - t.Fatalf("expected %v routes, instead have: %v", 2, - len(routes)) - } - - // Now we'll examine the first route returned for correctness. + // Now we'll examine the route returned for correctness. // // It should be sending the exact payment amount as there are no // additional hops. - firstRoute := routes[0] - if firstRoute.TotalAmount != amt { + if route.TotalAmount != amt { t.Fatalf("wrong total amount: got %v, expected %v", - firstRoute.TotalAmount, amt) + route.TotalAmount, amt) } - if firstRoute.Hops[0].AmtToForward != amt { + if route.Hops[0].AmtToForward != amt { t.Fatalf("wrong forward amount: got %v, expected %v", - firstRoute.Hops[0].AmtToForward, amt) + route.Hops[0].AmtToForward, amt) } - fee := firstRoute.HopFee(0) + fee := route.HopFee(0) if fee != 0 { t.Fatalf("wrong hop fee: got %v, expected %v", fee, 0) } // The CLTV expiry should be the current height plus 9 (the expiry for // the B -> C channel. - if firstRoute.TotalTimeLock != + if route.TotalTimeLock != startingHeight+zpay32.DefaultFinalCLTVDelta { t.Fatalf("wrong total time lock: got %v, expecting %v", - firstRoute.TotalTimeLock, + route.TotalTimeLock, startingHeight+zpay32.DefaultFinalCLTVDelta) } @@ -1798,48 +1734,38 @@ func TestPathFindSpecExample(t *testing.T) { } // We'll now request a route from A -> B -> C. - routes, err = ctx.router.FindRoutes( - source.PubKeyBytes, carol, amt, noRestrictions, 100, + route, err = ctx.router.FindRoute( + source.PubKeyBytes, carol, amt, noRestrictions, ) if err != nil { t.Fatalf("unable to find routes: %v", err) } - // We should come back with _exactly_ two routes. - if len(routes) != 2 { - t.Fatalf("expected %v routes, instead have: %v", 2, - len(routes)) - } - - // Both routes should be two hops. - if len(routes[0].Hops) != 2 { - t.Fatalf("route should be %v hops, is instead %v", 2, - len(routes[0].Hops)) - } - if len(routes[1].Hops) != 2 { + // The route should be two hops. + if len(route.Hops) != 2 { t.Fatalf("route should be %v hops, is instead %v", 2, - len(routes[1].Hops)) + len(route.Hops)) } // The total amount should factor in a fee of 10199 and also use a CLTV // delta total of 29 (20 + 9), expectedAmt := lnwire.MilliSatoshi(5010198) - if routes[0].TotalAmount != expectedAmt { + if route.TotalAmount != expectedAmt { t.Fatalf("wrong amount: got %v, expected %v", - routes[0].TotalAmount, expectedAmt) + route.TotalAmount, expectedAmt) } - if routes[0].TotalTimeLock != startingHeight+29 { + if route.TotalTimeLock != startingHeight+29 { t.Fatalf("wrong total time lock: got %v, expecting %v", - routes[0].TotalTimeLock, startingHeight+29) + route.TotalTimeLock, startingHeight+29) } - // Ensure that the hops of the first route are properly crafted. + // Ensure that the hops of the route are properly crafted. // // After taking the fee, Bob should be forwarding the remainder which // is the exact payment to Bob. - if routes[0].Hops[0].AmtToForward != amt { + if route.Hops[0].AmtToForward != amt { t.Fatalf("wrong forward amount: got %v, expected %v", - routes[0].Hops[0].AmtToForward, amt) + route.Hops[0].AmtToForward, amt) } // We shouldn't pay any fee for the first, hop, but the fee for the @@ -1850,70 +1776,31 @@ func TestPathFindSpecExample(t *testing.T) { // // * 200 + 4999999 * 2000 / 1000000 = 10199 - fee = routes[0].HopFee(0) + fee = route.HopFee(0) if fee != 10199 { t.Fatalf("wrong hop fee: got %v, expected %v", fee, 10199) } // While for the final hop, as there's no additional hop afterwards, we // pay no fee. - fee = routes[0].HopFee(1) + fee = route.HopFee(1) if fee != 0 { t.Fatalf("wrong hop fee: got %v, expected %v", fee, 0) } // The outgoing CLTV value itself should be the current height plus 30 // to meet Carol's requirements. - if routes[0].Hops[0].OutgoingTimeLock != + if route.Hops[0].OutgoingTimeLock != startingHeight+zpay32.DefaultFinalCLTVDelta { t.Fatalf("wrong total time lock: got %v, expecting %v", - routes[0].Hops[0].OutgoingTimeLock, + route.Hops[0].OutgoingTimeLock, startingHeight+zpay32.DefaultFinalCLTVDelta) } // For B -> C, we assert that the final hop also has the proper // parameters. - lastHop := routes[0].Hops[1] - if lastHop.AmtToForward != amt { - t.Fatalf("wrong forward amount: got %v, expected %v", - lastHop.AmtToForward, amt) - } - if lastHop.OutgoingTimeLock != - startingHeight+zpay32.DefaultFinalCLTVDelta { - - t.Fatalf("wrong total time lock: got %v, expecting %v", - lastHop.OutgoingTimeLock, - startingHeight+zpay32.DefaultFinalCLTVDelta) - } - - // We'll also make similar assertions for the second route from A to C - // via D. - secondRoute := routes[1] - expectedAmt = 5020398 - if secondRoute.TotalAmount != expectedAmt { - t.Fatalf("wrong amount: got %v, expected %v", - secondRoute.TotalAmount, expectedAmt) - } - expectedTimeLock := startingHeight + daveFinalCLTV + zpay32.DefaultFinalCLTVDelta - if secondRoute.TotalTimeLock != uint32(expectedTimeLock) { - t.Fatalf("wrong total time lock: got %v, expecting %v", - secondRoute.TotalTimeLock, expectedTimeLock) - } - onionPayload := secondRoute.Hops[0] - if onionPayload.AmtToForward != amt { - t.Fatalf("wrong forward amount: got %v, expected %v", - onionPayload.AmtToForward, amt) - } - expectedTimeLock = startingHeight + zpay32.DefaultFinalCLTVDelta - if onionPayload.OutgoingTimeLock != uint32(expectedTimeLock) { - t.Fatalf("wrong outgoing time lock: got %v, expecting %v", - onionPayload.OutgoingTimeLock, - expectedTimeLock) - } - - // The B -> C hop should also be identical as the prior cases. - lastHop = secondRoute.Hops[1] + lastHop := route.Hops[1] if lastHop.AmtToForward != amt { t.Fatalf("wrong forward amount: got %v, expected %v", lastHop.AmtToForward, amt) diff --git a/routing/router.go b/routing/router.go index 96f503abafe5..eeeee088ebb2 100644 --- a/routing/router.go +++ b/routing/router.go @@ -5,7 +5,6 @@ import ( "crypto/sha256" "fmt" "runtime" - "sort" "sync" "sync/atomic" "time" @@ -1312,72 +1311,12 @@ type routingMsg struct { err chan error } -// pathsToFeeSortedRoutes takes a set of paths, and returns a corresponding set -// of routes. A route differs from a path in that it has full time-lock and -// fee information attached. The set of routes returned may be less than the -// initial set of paths as it's possible we drop a route if it can't handle the -// total payment flow after fees are calculated. -func pathsToFeeSortedRoutes(source route.Vertex, paths [][]*channeldb.ChannelEdgePolicy, - finalCLTVDelta uint16, amt lnwire.MilliSatoshi, - currentHeight uint32) ([]*route.Route, error) { - - validRoutes := make([]*route.Route, 0, len(paths)) - for _, path := range paths { - // Attempt to make the path into a route. We snip off the first - // hop in the path as it contains a "self-hop" that is inserted - // by our KSP algorithm. - route, err := newRoute( - amt, source, path[1:], currentHeight, finalCLTVDelta, - ) - if err != nil { - // TODO(roasbeef): report straw breaking edge? - continue - } - - // If the path as enough total flow to support the computed - // route, then we'll add it to our set of valid routes. - validRoutes = append(validRoutes, route) - } - - // If all our perspective routes were eliminating during the transition - // from path to route, then we'll return an error to the caller - if len(validRoutes) == 0 { - return nil, newErr(ErrNoPathFound, "unable to find a path to "+ - "destination") - } - - // Finally, we'll sort the set of validate routes to optimize for - // lowest total fees, using the required time-lock within the route as - // a tie-breaker. - sort.Slice(validRoutes, func(i, j int) bool { - // To make this decision we first check if the total fees - // required for both routes are equal. If so, then we'll let - // the total time lock be the tie breaker. Otherwise, we'll put - // the route with the lowest total fees first. - if validRoutes[i].TotalFees == validRoutes[j].TotalFees { - timeLockI := validRoutes[i].TotalTimeLock - timeLockJ := validRoutes[j].TotalTimeLock - return timeLockI < timeLockJ - } - - return validRoutes[i].TotalFees < validRoutes[j].TotalFees - }) - - return validRoutes, nil -} - -// FindRoutes attempts to query the ChannelRouter for a bounded number -// available paths to a particular target destination which is able to send -// `amt` after factoring in channel capacities and cumulative fees along each -// route. To `numPaths eligible paths, we use a modified version of -// Yen's algorithm which itself uses a modified version of Dijkstra's algorithm -// within its inner loop. Once we have a set of candidate routes, we calculate -// the required fee and time lock values running backwards along the route. The -// route that will be ranked the highest is the one with the lowest cumulative -// fee along the route. -func (r *ChannelRouter) FindRoutes(source, target route.Vertex, - amt lnwire.MilliSatoshi, restrictions *RestrictParams, numPaths uint32, - finalExpiry ...uint16) ([]*route.Route, error) { +// FindRoute attempts to query the ChannelRouter for the optimum path to a +// particular target destination to which it is able to send `amt` after +// factoring in channel capacities and cumulative fees along the route. +func (r *ChannelRouter) FindRoute(source, target route.Vertex, + amt lnwire.MilliSatoshi, restrictions *RestrictParams, + finalExpiry ...uint16) (*route.Route, error) { var finalCLTVDelta uint16 if len(finalExpiry) == 0 { @@ -1388,11 +1327,6 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex, log.Debugf("Searching for path to %x, sending %v", target, amt) - // If we don't have a set of routes cached, we'll query the graph for a - // set of potential routes to the destination node that can support our - // payment amount. If no such routes can be found then an error will be - // returned. - // We can short circuit the routing by opportunistically checking to // see if the target vertex event exists in the current graph. if _, exists, err := r.cfg.Graph.HasLightningNode(target); err != nil { @@ -1402,16 +1336,8 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex, return nil, newErrf(ErrTargetNotInNetwork, "target not found") } - // We'll also fetch the current block height so we can properly - // calculate the required HTLC time locks within the route. - _, currentHeight, err := r.cfg.Chain.GetBestBlock() - if err != nil { - return nil, err - } - - // Before we open the db transaction below, we'll attempt to obtain a - // set of bandwidth hints that can help us eliminate certain routes - // early on in the path finding process. + // We'll attempt to obtain a set of bandwidth hints that can help us + // eliminate certain routes early on in the path finding process. bandwidthHints, err := generateBandwidthHints( r.selfNode, r.cfg.QueryBandwidth, ) @@ -1419,47 +1345,38 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex, return nil, err } - tx, err := r.cfg.Graph.Database().Begin(false) - if err != nil { - tx.Rollback() - return nil, err - } - - // Now that we know the destination is reachable within the graph, - // we'll execute our KSP algorithm to find the k-shortest paths from - // our source to the destination. - shortestPaths, err := findPaths( - tx, r.cfg.Graph, source, target, amt, restrictions, - numPaths, bandwidthHints, + // Now that we know the destination is reachable within the graph, we'll + // execute our path finding algorithm. + path, err := findPath( + &graphParams{ + graph: r.cfg.Graph, + bandwidthHints: bandwidthHints, + }, + restrictions, source, target, amt, ) + + // We'll fetch the current block height so we can properly calculate the + // required HTLC time locks within the route. + _, currentHeight, err := r.cfg.Chain.GetBestBlock() if err != nil { - tx.Rollback() return nil, err } - tx.Rollback() - - // Now that we have a set of paths, we'll need to turn them into - // *routes* by computing the required time-lock and fee information for - // each path. During this process, some paths may be discarded if they - // aren't able to support the total satoshis flow once fees have been - // factored in. - sourceVertex := route.Vertex(r.selfNode.PubKeyBytes) - validRoutes, err := pathsToFeeSortedRoutes( - sourceVertex, shortestPaths, finalCLTVDelta, amt, - uint32(currentHeight), + // Create the route with absolute time lock values. + route, err := newRoute( + amt, source, path, uint32(currentHeight), finalCLTVDelta, ) if err != nil { return nil, err } - go log.Tracef("Obtained %v paths sending %v to %x: %v", len(validRoutes), + go log.Tracef("Obtained path to send %v to %x: %v", amt, target, newLogClosure(func() string { - return spew.Sdump(validRoutes) + return spew.Sdump(route) }), ) - return validRoutes, nil + return route, nil } // generateSphinxPacket generates then encodes a sphinx packet which encodes diff --git a/routing/router_test.go b/routing/router_test.go index 6627b7572300..14969abe7513 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -23,10 +23,6 @@ import ( "github.com/lightningnetwork/lnd/zpay32" ) -// defaultNumRoutes is the default value for the maximum number of routes to -// be returned by FindRoutes -const defaultNumRoutes = 10 - type testCtx struct { router *ChannelRouter @@ -165,60 +161,6 @@ func createTestCtxFromFile(startingHeight uint32, testGraph string) (*testCtx, f return createTestCtxFromGraphInstance(startingHeight, graphInstance) } -// TestFindRoutesFeeSorting asserts that routes found by the FindRoutes method -// within the channel router are properly returned in a sorted order, with the -// lowest fee route coming first. -func TestFindRoutesFeeSorting(t *testing.T) { - t.Parallel() - - const startingBlockHeight = 101 - ctx, cleanUp, err := createTestCtxFromFile(startingBlockHeight, basicGraphFilePath) - if err != nil { - t.Fatalf("unable to create router: %v", err) - } - defer cleanUp() - - // In this test we'd like to ensure proper integration of the various - // functions that are involved in path finding, and also route - // selection. - - // Execute a query for all possible routes between roasbeef and luo ji. - paymentAmt := lnwire.NewMSatFromSatoshis(100) - target := ctx.aliases["luoji"] - routes, err := ctx.router.FindRoutes( - ctx.router.selfNode.PubKeyBytes, - target, paymentAmt, noRestrictions, defaultNumRoutes, - zpay32.DefaultFinalCLTVDelta, - ) - if err != nil { - t.Fatalf("unable to find any routes: %v", err) - } - - // Exactly, two such paths should be found. - if len(routes) != 2 { - t.Fatalf("2 routes should've been selected, instead %v were: %v", - len(routes), spew.Sdump(routes)) - } - - // We shouldn't pay a fee for the fist route, but the second route - // should have a fee intact. - if routes[0].TotalFees != 0 { - t.Fatalf("incorrect fees for first route, expected 0 got: %v", - routes[0].TotalFees) - } - if routes[1].TotalFees == 0 { - t.Fatalf("total fees not set in second route: %v", - spew.Sdump(routes[0])) - } - - // The paths should properly be ranked according to their total fee - // rate. - if routes[0].TotalFees > routes[1].TotalFees { - t.Fatalf("routes not ranked by total fee: %v", - spew.Sdump(routes)) - } -} - // TestFindRoutesWithFeeLimit asserts that routes found by the FindRoutes method // within the channel router contain a total fee less than or equal to the fee // limit. @@ -247,24 +189,20 @@ func TestFindRoutesWithFeeLimit(t *testing.T) { FeeLimit: lnwire.NewMSatFromSatoshis(10), } - routes, err := ctx.router.FindRoutes( + route, err := ctx.router.FindRoute( ctx.router.selfNode.PubKeyBytes, - target, paymentAmt, restrictions, defaultNumRoutes, + target, paymentAmt, restrictions, zpay32.DefaultFinalCLTVDelta, ) if err != nil { t.Fatalf("unable to find any routes: %v", err) } - if len(routes) != 1 { - t.Fatalf("expected 1 route, got %d", len(routes)) + if route.TotalFees > restrictions.FeeLimit { + t.Fatalf("route exceeded fee limit: %v", spew.Sdump(route)) } - if routes[0].TotalFees > restrictions.FeeLimit { - t.Fatalf("route exceeded fee limit: %v", spew.Sdump(routes[0])) - } - - hops := routes[0].Hops + hops := route.Hops if len(hops) != 2 { t.Fatalf("expected 2 hops, got %d", len(hops)) } @@ -1339,22 +1277,19 @@ func TestAddEdgeUnknownVertexes(t *testing.T) { t.Fatalf("unable to update edge policy: %v", err) } - // We should now be able to find two routes to node 2. + // We should now be able to find a route to node 2. paymentAmt := lnwire.NewMSatFromSatoshis(100) targetNode := priv2.PubKey() var targetPubKeyBytes route.Vertex copy(targetPubKeyBytes[:], targetNode.SerializeCompressed()) - routes, err := ctx.router.FindRoutes( + _, err = ctx.router.FindRoute( ctx.router.selfNode.PubKeyBytes, - targetPubKeyBytes, paymentAmt, noRestrictions, defaultNumRoutes, + targetPubKeyBytes, paymentAmt, noRestrictions, zpay32.DefaultFinalCLTVDelta, ) if err != nil { t.Fatalf("unable to find any routes: %v", err) } - if len(routes) != 2 { - t.Fatalf("expected to find 2 route, found: %v", len(routes)) - } // Now check that we can update the node info for the partial node // without messing up the channel graph. @@ -1388,19 +1323,16 @@ func TestAddEdgeUnknownVertexes(t *testing.T) { t.Fatalf("could not add node: %v", err) } - // Should still be able to find the routes, and the info should be + // Should still be able to find the route, and the info should be // updated. - routes, err = ctx.router.FindRoutes( + _, err = ctx.router.FindRoute( ctx.router.selfNode.PubKeyBytes, - targetPubKeyBytes, paymentAmt, noRestrictions, defaultNumRoutes, + targetPubKeyBytes, paymentAmt, noRestrictions, zpay32.DefaultFinalCLTVDelta, ) if err != nil { t.Fatalf("unable to find any routes: %v", err) } - if len(routes) != 2 { - t.Fatalf("expected to find 2 route, found: %v", len(routes)) - } copy1, err := ctx.graph.FetchLightningNode(priv1.PubKey()) if err != nil { diff --git a/rpcserver.go b/rpcserver.go index bef358f37f1f..a5c93c1edc71 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -462,7 +462,7 @@ func newRPCServer(s *server, macService *macaroons.Service, } return info.Capacity, nil }, - FindRoutes: s.chanRouter.FindRoutes, + FindRoute: s.chanRouter.FindRoute, } var (