Merge pull request #618 from wpaulino/change-wallet-password

Change wallet password
This commit is contained in:
Olaoluwa Osuntokun 2018-06-01 17:49:40 -07:00 committed by GitHub
commit 2fa2644aec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 990 additions and 574 deletions

@ -1382,6 +1382,66 @@ func unlock(ctx *cli.Context) error {
return nil
}
var changePasswordCommand = cli.Command{
Name: "changepassword",
Category: "Startup",
Usage: "Change an encrypted wallet's password at startup.",
Description: `
The changepassword command is used to Change lnd's encrypted wallet's
password. It will automatically unlock the daemon if the password change
is successful.
If one did not specify a password for their wallet (running lnd with
--noencryptwallet), one must restart their daemon without
--noencryptwallet and use this command. The "current password" field
should be left empty.
`,
Action: actionDecorator(changePassword),
}
func changePassword(ctx *cli.Context) error {
ctxb := context.Background()
client, cleanUp := getWalletUnlockerClient(ctx)
defer cleanUp()
fmt.Printf("Input current wallet password: ")
currentPw, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
return err
}
fmt.Println()
fmt.Printf("Input new wallet password: ")
newPw, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
return err
}
fmt.Println()
fmt.Printf("Confirm new wallet password: ")
confirmPw, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
return err
}
fmt.Println()
if !bytes.Equal(newPw, confirmPw) {
return fmt.Errorf("passwords don't match")
}
req := &lnrpc.ChangePasswordRequest{
CurrentPassword: currentPw,
NewPassword: newPw,
}
_, err = client.ChangePassword(ctxb, req)
if err != nil {
return err
}
return nil
}
var walletBalanceCommand = cli.Command{
Name: "walletbalance",
Category: "Wallet",
@ -1407,9 +1467,9 @@ func walletBalance(ctx *cli.Context) error {
var channelBalanceCommand = cli.Command{
Name: "channelbalance",
Category: "Channels",
Usage: "Returns the sum of the total available channel balance across " +
Usage: "Returns the sum of the total available channel balance across " +
"all open channels.",
Action: actionDecorator(channelBalance),
Action: actionDecorator(channelBalance),
}
func channelBalance(ctx *cli.Context) error {
@ -2356,7 +2416,7 @@ func queryRoutes(ctx *cli.Context) error {
var getNetworkInfoCommand = cli.Command{
Name: "getnetworkinfo",
Category: "Channels",
Usage: "Get statistical information about the current " +
Usage: "Get statistical information about the current " +
"state of the network.",
Description: "Returns a set of statistics pertaining to the known " +
"channel graph",
@ -2639,9 +2699,9 @@ func feeReport(ctx *cli.Context) error {
}
var updateChannelPolicyCommand = cli.Command{
Name: "updatechanpolicy",
Category: "Channels",
Usage: "Update the channel policy for all channels, or a single " +
Name: "updatechanpolicy",
Category: "Channels",
Usage: "Update the channel policy for all channels, or a single " +
"channel.",
ArgsUsage: "base_fee_msat fee_rate time_lock_delta [channel_point]",
Description: `

@ -194,6 +194,7 @@ func main() {
app.Commands = []cli.Command{
createCommand,
unlockCommand,
changePasswordCommand,
newAddressCommand,
sendManyCommand,
sendCoinsCommand,

68
lnd.go

@ -195,32 +195,20 @@ func lndMain() error {
}
proxyOpts := []grpc.DialOption{grpc.WithTransportCredentials(cCreds)}
var macaroonService *macaroons.Service
if !cfg.NoMacaroons {
// Create the macaroon authentication/authorization service.
macaroonService, err = macaroons.NewService(macaroonDatabaseDir,
macaroons.IPLockChecker)
if err != nil {
srvrLog.Errorf("unable to create macaroon service: %v", err)
return err
}
defer macaroonService.Close()
}
var (
privateWalletPw = []byte("hello")
publicWalletPw = []byte("public")
privateWalletPw = lnwallet.DefaultPrivatePassphrase
publicWalletPw = lnwallet.DefaultPublicPassphrase
birthday time.Time
recoveryWindow uint32
)
// We wait until the user provides a password over RPC. In case lnd is
// started with the --noencryptwallet flag, we use the default password
// "hello" for wallet encryption.
// for wallet encryption.
if !cfg.NoEncryptWallet {
walletInitParams, err := waitForWalletPassword(
cfg.RPCListeners, cfg.RESTListeners, serverOpts,
proxyOpts, tlsConf, macaroonService,
proxyOpts, tlsConf,
)
if err != nil {
return err
@ -238,12 +226,20 @@ func lndMain() error {
}
}
var macaroonService *macaroons.Service
if !cfg.NoMacaroons {
// Create the macaroon authentication/authorization service.
macaroonService, err = macaroons.NewService(macaroonDatabaseDir,
macaroons.IPLockChecker)
if err != nil {
srvrLog.Errorf("unable to create macaroon service: %v", err)
return err
}
defer macaroonService.Close()
// Try to unlock the macaroon store with the private password.
// Ignore ErrAlreadyUnlocked since it could be unlocked by the
// wallet unlocker.
err = macaroonService.CreateUnlock(&privateWalletPw)
if err != nil && err != macaroons.ErrAlreadyUnlocked {
if err != nil {
srvrLog.Error(err)
return err
}
@ -879,23 +875,30 @@ type WalletUnlockParams struct {
// waitForWalletPassword will spin up gRPC and REST endpoints for the
// WalletUnlocker server, and block until a password is provided by
// the user to this RPC server.
func waitForWalletPassword(
grpcEndpoints, restEndpoints []string,
serverOpts []grpc.ServerOption,
proxyOpts []grpc.DialOption,
tlsConf *tls.Config,
macaroonService *macaroons.Service) (*WalletUnlockParams, error) {
func waitForWalletPassword(grpcEndpoints, restEndpoints []string,
serverOpts []grpc.ServerOption, proxyOpts []grpc.DialOption,
tlsConf *tls.Config) (*WalletUnlockParams, error) {
// Set up a new PasswordService, which will listen
// for passwords provided over RPC.
// Set up a new PasswordService, which will listen for passwords
// provided over RPC.
grpcServer := grpc.NewServer(serverOpts...)
chainConfig := cfg.Bitcoin
if registeredChains.PrimaryChain() == litecoinChain {
chainConfig = cfg.Litecoin
}
pwService := walletunlocker.New(macaroonService,
chainConfig.ChainDir, activeNetParams.Params)
// The macaroon files are passed to the wallet unlocker since they are
// also encrypted with the wallet's password. These files will be
// deleted within it and recreated when successfully changing the
// wallet's password.
macaroonFiles := []string{
filepath.Join(macaroonDatabaseDir, macaroons.DBFilename),
cfg.AdminMacPath, cfg.ReadMacPath, cfg.InvoiceMacPath,
}
pwService := walletunlocker.New(
chainConfig.ChainDir, activeNetParams.Params, macaroonFiles,
)
lnrpc.RegisterWalletUnlockerServer(grpcServer, pwService)
// Use a WaitGroup so we can be sure the instructions on how to input the
@ -957,9 +960,10 @@ func waitForWalletPassword(
wg.Wait()
// Wait for user to provide the password.
ltndLog.Infof("Waiting for wallet encryption password. " +
"Use `lncli create` to create wallet, or " +
"`lncli unlock` to unlock already created wallet.")
ltndLog.Infof("Waiting for wallet encryption password. Use `lncli " +
"create` to create a wallet, `lncli unlock` to unlock an " +
"existing wallet, or `lncli changepassword` to change the " +
"password of an existing wallet and unlock it.")
// We currently don't distinguish between getting a password to be used
// for creation or unlocking, as a new wallet db will be created if

@ -14,6 +14,8 @@ It has these top-level messages:
InitWalletResponse
UnlockWalletRequest
UnlockWalletResponse
ChangePasswordRequest
ChangePasswordResponse
Transaction
GetTransactionsRequest
TransactionDetails
@ -151,7 +153,7 @@ func (x NewAddressRequest_AddressType) String() string {
return proto.EnumName(NewAddressRequest_AddressType_name, int32(x))
}
func (NewAddressRequest_AddressType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{17, 0}
return fileDescriptor0, []int{19, 0}
}
type GenSeedRequest struct {
@ -324,6 +326,44 @@ func (m *UnlockWalletResponse) String() string { return proto.Compact
func (*UnlockWalletResponse) ProtoMessage() {}
func (*UnlockWalletResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
type ChangePasswordRequest struct {
// *
// current_password should be the current valid passphrase used to unlock the
// daemon.
CurrentPassword []byte `protobuf:"bytes,1,opt,name=current_password,json=currentPassword,proto3" json:"current_password,omitempty"`
// *
// new_password should be the new passphrase that will be needed to unlock the
// daemon.
NewPassword []byte `protobuf:"bytes,2,opt,name=new_password,json=newPassword,proto3" json:"new_password,omitempty"`
}
func (m *ChangePasswordRequest) Reset() { *m = ChangePasswordRequest{} }
func (m *ChangePasswordRequest) String() string { return proto.CompactTextString(m) }
func (*ChangePasswordRequest) ProtoMessage() {}
func (*ChangePasswordRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *ChangePasswordRequest) GetCurrentPassword() []byte {
if m != nil {
return m.CurrentPassword
}
return nil
}
func (m *ChangePasswordRequest) GetNewPassword() []byte {
if m != nil {
return m.NewPassword
}
return nil
}
type ChangePasswordResponse struct {
}
func (m *ChangePasswordResponse) Reset() { *m = ChangePasswordResponse{} }
func (m *ChangePasswordResponse) String() string { return proto.CompactTextString(m) }
func (*ChangePasswordResponse) ProtoMessage() {}
func (*ChangePasswordResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
type Transaction struct {
// / The transaction hash
TxHash string `protobuf:"bytes,1,opt,name=tx_hash" json:"tx_hash,omitempty"`
@ -346,7 +386,7 @@ type Transaction struct {
func (m *Transaction) Reset() { *m = Transaction{} }
func (m *Transaction) String() string { return proto.CompactTextString(m) }
func (*Transaction) ProtoMessage() {}
func (*Transaction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (*Transaction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *Transaction) GetTxHash() string {
if m != nil {
@ -410,7 +450,7 @@ type GetTransactionsRequest struct {
func (m *GetTransactionsRequest) Reset() { *m = GetTransactionsRequest{} }
func (m *GetTransactionsRequest) String() string { return proto.CompactTextString(m) }
func (*GetTransactionsRequest) ProtoMessage() {}
func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (*GetTransactionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
type TransactionDetails struct {
// / The list of transactions relevant to the wallet.
@ -420,7 +460,7 @@ type TransactionDetails struct {
func (m *TransactionDetails) Reset() { *m = TransactionDetails{} }
func (m *TransactionDetails) String() string { return proto.CompactTextString(m) }
func (*TransactionDetails) ProtoMessage() {}
func (*TransactionDetails) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (*TransactionDetails) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *TransactionDetails) GetTransactions() []*Transaction {
if m != nil {
@ -452,7 +492,7 @@ type SendRequest struct {
func (m *SendRequest) Reset() { *m = SendRequest{} }
func (m *SendRequest) String() string { return proto.CompactTextString(m) }
func (*SendRequest) ProtoMessage() {}
func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*SendRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *SendRequest) GetDest() []byte {
if m != nil {
@ -512,7 +552,7 @@ type SendResponse struct {
func (m *SendResponse) Reset() { *m = SendResponse{} }
func (m *SendResponse) String() string { return proto.CompactTextString(m) }
func (*SendResponse) ProtoMessage() {}
func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (*SendResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *SendResponse) GetPaymentError() string {
if m != nil {
@ -547,11 +587,9 @@ type ChannelPoint struct {
func (m *ChannelPoint) Reset() { *m = ChannelPoint{} }
func (m *ChannelPoint) String() string { return proto.CompactTextString(m) }
func (*ChannelPoint) ProtoMessage() {}
func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
type isChannelPoint_FundingTxid interface {
isChannelPoint_FundingTxid()
}
type isChannelPoint_FundingTxid interface{ isChannelPoint_FundingTxid() }
type ChannelPoint_FundingTxidBytes struct {
FundingTxidBytes []byte `protobuf:"bytes,1,opt,name=funding_txid_bytes,proto3,oneof"`
@ -667,7 +705,7 @@ type LightningAddress struct {
func (m *LightningAddress) Reset() { *m = LightningAddress{} }
func (m *LightningAddress) String() string { return proto.CompactTextString(m) }
func (*LightningAddress) ProtoMessage() {}
func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*LightningAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *LightningAddress) GetPubkey() string {
if m != nil {
@ -695,7 +733,7 @@ type SendManyRequest struct {
func (m *SendManyRequest) Reset() { *m = SendManyRequest{} }
func (m *SendManyRequest) String() string { return proto.CompactTextString(m) }
func (*SendManyRequest) ProtoMessage() {}
func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*SendManyRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *SendManyRequest) GetAddrToAmount() map[string]int64 {
if m != nil {
@ -726,7 +764,7 @@ type SendManyResponse struct {
func (m *SendManyResponse) Reset() { *m = SendManyResponse{} }
func (m *SendManyResponse) String() string { return proto.CompactTextString(m) }
func (*SendManyResponse) ProtoMessage() {}
func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*SendManyResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *SendManyResponse) GetTxid() string {
if m != nil {
@ -749,7 +787,7 @@ type SendCoinsRequest struct {
func (m *SendCoinsRequest) Reset() { *m = SendCoinsRequest{} }
func (m *SendCoinsRequest) String() string { return proto.CompactTextString(m) }
func (*SendCoinsRequest) ProtoMessage() {}
func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*SendCoinsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *SendCoinsRequest) GetAddr() string {
if m != nil {
@ -787,7 +825,7 @@ type SendCoinsResponse struct {
func (m *SendCoinsResponse) Reset() { *m = SendCoinsResponse{} }
func (m *SendCoinsResponse) String() string { return proto.CompactTextString(m) }
func (*SendCoinsResponse) ProtoMessage() {}
func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*SendCoinsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *SendCoinsResponse) GetTxid() string {
if m != nil {
@ -810,7 +848,7 @@ type NewAddressRequest struct {
func (m *NewAddressRequest) Reset() { *m = NewAddressRequest{} }
func (m *NewAddressRequest) String() string { return proto.CompactTextString(m) }
func (*NewAddressRequest) ProtoMessage() {}
func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*NewAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *NewAddressRequest) GetType() NewAddressRequest_AddressType {
if m != nil {
@ -825,7 +863,7 @@ type NewWitnessAddressRequest struct {
func (m *NewWitnessAddressRequest) Reset() { *m = NewWitnessAddressRequest{} }
func (m *NewWitnessAddressRequest) String() string { return proto.CompactTextString(m) }
func (*NewWitnessAddressRequest) ProtoMessage() {}
func (*NewWitnessAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*NewWitnessAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
type NewAddressResponse struct {
// / The newly generated wallet address
@ -835,7 +873,7 @@ type NewAddressResponse struct {
func (m *NewAddressResponse) Reset() { *m = NewAddressResponse{} }
func (m *NewAddressResponse) String() string { return proto.CompactTextString(m) }
func (*NewAddressResponse) ProtoMessage() {}
func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*NewAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *NewAddressResponse) GetAddress() string {
if m != nil {
@ -852,7 +890,7 @@ type SignMessageRequest struct {
func (m *SignMessageRequest) Reset() { *m = SignMessageRequest{} }
func (m *SignMessageRequest) String() string { return proto.CompactTextString(m) }
func (*SignMessageRequest) ProtoMessage() {}
func (*SignMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (*SignMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *SignMessageRequest) GetMsg() []byte {
if m != nil {
@ -869,7 +907,7 @@ type SignMessageResponse struct {
func (m *SignMessageResponse) Reset() { *m = SignMessageResponse{} }
func (m *SignMessageResponse) String() string { return proto.CompactTextString(m) }
func (*SignMessageResponse) ProtoMessage() {}
func (*SignMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (*SignMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *SignMessageResponse) GetSignature() string {
if m != nil {
@ -888,7 +926,7 @@ type VerifyMessageRequest struct {
func (m *VerifyMessageRequest) Reset() { *m = VerifyMessageRequest{} }
func (m *VerifyMessageRequest) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageRequest) ProtoMessage() {}
func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (m *VerifyMessageRequest) GetMsg() []byte {
if m != nil {
@ -914,7 +952,7 @@ type VerifyMessageResponse struct {
func (m *VerifyMessageResponse) Reset() { *m = VerifyMessageResponse{} }
func (m *VerifyMessageResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageResponse) ProtoMessage() {}
func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (m *VerifyMessageResponse) GetValid() bool {
if m != nil {
@ -941,7 +979,7 @@ type ConnectPeerRequest struct {
func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} }
func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerRequest) ProtoMessage() {}
func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (m *ConnectPeerRequest) GetAddr() *LightningAddress {
if m != nil {
@ -963,7 +1001,7 @@ type ConnectPeerResponse struct {
func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} }
func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerResponse) ProtoMessage() {}
func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
type DisconnectPeerRequest struct {
// / The pubkey of the node to disconnect from
@ -973,7 +1011,7 @@ type DisconnectPeerRequest struct {
func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} }
func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerRequest) ProtoMessage() {}
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (m *DisconnectPeerRequest) GetPubKey() string {
if m != nil {
@ -988,7 +1026,7 @@ type DisconnectPeerResponse struct {
func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{} }
func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerResponse) ProtoMessage() {}
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
type HTLC struct {
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
@ -1000,7 +1038,7 @@ type HTLC struct {
func (m *HTLC) Reset() { *m = HTLC{} }
func (m *HTLC) String() string { return proto.CompactTextString(m) }
func (*HTLC) ProtoMessage() {}
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (m *HTLC) GetIncoming() bool {
if m != nil {
@ -1090,7 +1128,7 @@ type Channel struct {
func (m *Channel) Reset() { *m = Channel{} }
func (m *Channel) String() string { return proto.CompactTextString(m) }
func (*Channel) ProtoMessage() {}
func (*Channel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (*Channel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (m *Channel) GetActive() bool {
if m != nil {
@ -1221,7 +1259,7 @@ type ListChannelsRequest struct {
func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} }
func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*ListChannelsRequest) ProtoMessage() {}
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (m *ListChannelsRequest) GetActiveOnly() bool {
if m != nil {
@ -1259,7 +1297,7 @@ type ListChannelsResponse struct {
func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} }
func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*ListChannelsResponse) ProtoMessage() {}
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (m *ListChannelsResponse) GetChannels() []*Channel {
if m != nil {
@ -1290,7 +1328,7 @@ type Peer struct {
func (m *Peer) Reset() { *m = Peer{} }
func (m *Peer) String() string { return proto.CompactTextString(m) }
func (*Peer) ProtoMessage() {}
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (m *Peer) GetPubKey() string {
if m != nil {
@ -1354,7 +1392,7 @@ type ListPeersRequest struct {
func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} }
func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) }
func (*ListPeersRequest) ProtoMessage() {}
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
type ListPeersResponse struct {
// / The list of currently connected peers
@ -1364,7 +1402,7 @@ type ListPeersResponse struct {
func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} }
func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) }
func (*ListPeersResponse) ProtoMessage() {}
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (m *ListPeersResponse) GetPeers() []*Peer {
if m != nil {
@ -1379,7 +1417,7 @@ type GetInfoRequest struct {
func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} }
func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetInfoRequest) ProtoMessage() {}
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
type GetInfoResponse struct {
// / The identity pubkey of the current node.
@ -1413,7 +1451,7 @@ type GetInfoResponse struct {
func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} }
func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetInfoResponse) ProtoMessage() {}
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (m *GetInfoResponse) GetIdentityPubkey() string {
if m != nil {
@ -1515,7 +1553,7 @@ type ConfirmationUpdate struct {
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) }
func (*ConfirmationUpdate) ProtoMessage() {}
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (m *ConfirmationUpdate) GetBlockSha() []byte {
if m != nil {
@ -1545,7 +1583,7 @@ type ChannelOpenUpdate struct {
func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelOpenUpdate) ProtoMessage() {}
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -1562,7 +1600,7 @@ type ChannelCloseUpdate struct {
func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} }
func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelCloseUpdate) ProtoMessage() {}
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (m *ChannelCloseUpdate) GetClosingTxid() []byte {
if m != nil {
@ -1595,7 +1633,7 @@ type CloseChannelRequest struct {
func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} }
func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) }
func (*CloseChannelRequest) ProtoMessage() {}
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (m *CloseChannelRequest) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -1636,11 +1674,9 @@ type CloseStatusUpdate struct {
func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} }
func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*CloseStatusUpdate) ProtoMessage() {}
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
type isCloseStatusUpdate_Update interface {
isCloseStatusUpdate_Update()
}
type isCloseStatusUpdate_Update interface{ isCloseStatusUpdate_Update() }
type CloseStatusUpdate_ClosePending struct {
ClosePending *PendingUpdate `protobuf:"bytes,1,opt,name=close_pending,oneof"`
@ -1785,7 +1821,7 @@ type PendingUpdate struct {
func (m *PendingUpdate) Reset() { *m = PendingUpdate{} }
func (m *PendingUpdate) String() string { return proto.CompactTextString(m) }
func (*PendingUpdate) ProtoMessage() {}
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (m *PendingUpdate) GetTxid() []byte {
if m != nil {
@ -1825,7 +1861,7 @@ type OpenChannelRequest struct {
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) }
func (*OpenChannelRequest) ProtoMessage() {}
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (m *OpenChannelRequest) GetNodePubkey() []byte {
if m != nil {
@ -1901,11 +1937,9 @@ type OpenStatusUpdate struct {
func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} }
func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*OpenStatusUpdate) ProtoMessage() {}
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
type isOpenStatusUpdate_Update interface {
isOpenStatusUpdate_Update()
}
type isOpenStatusUpdate_Update interface{ isOpenStatusUpdate_Update() }
type OpenStatusUpdate_ChanPending struct {
ChanPending *PendingUpdate `protobuf:"bytes,1,opt,name=chan_pending,oneof"`
@ -2063,7 +2097,7 @@ type PendingHTLC struct {
func (m *PendingHTLC) Reset() { *m = PendingHTLC{} }
func (m *PendingHTLC) String() string { return proto.CompactTextString(m) }
func (*PendingHTLC) ProtoMessage() {}
func (*PendingHTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (*PendingHTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (m *PendingHTLC) GetIncoming() bool {
if m != nil {
@ -2113,7 +2147,7 @@ type PendingChannelsRequest struct {
func (m *PendingChannelsRequest) Reset() { *m = PendingChannelsRequest{} }
func (m *PendingChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsRequest) ProtoMessage() {}
func (*PendingChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (*PendingChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
type PendingChannelsResponse struct {
// / The balance in satoshis encumbered in pending channels
@ -2131,7 +2165,7 @@ type PendingChannelsResponse struct {
func (m *PendingChannelsResponse) Reset() { *m = PendingChannelsResponse{} }
func (m *PendingChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsResponse) ProtoMessage() {}
func (*PendingChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (*PendingChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (m *PendingChannelsResponse) GetTotalLimboBalance() int64 {
if m != nil {
@ -2182,7 +2216,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 fileDescriptor0, []int{47, 0}
return fileDescriptor0, []int{49, 0}
}
func (m *PendingChannelsResponse_PendingChannel) GetRemoteNodePub() string {
@ -2249,7 +2283,7 @@ func (m *PendingChannelsResponse_PendingOpenChannel) String() string {
}
func (*PendingChannelsResponse_PendingOpenChannel) ProtoMessage() {}
func (*PendingChannelsResponse_PendingOpenChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{47, 1}
return fileDescriptor0, []int{49, 1}
}
func (m *PendingChannelsResponse_PendingOpenChannel) GetChannel() *PendingChannelsResponse_PendingChannel {
@ -2302,7 +2336,7 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) String() string {
}
func (*PendingChannelsResponse_WaitingCloseChannel) ProtoMessage() {}
func (*PendingChannelsResponse_WaitingCloseChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{47, 2}
return fileDescriptor0, []int{49, 2}
}
func (m *PendingChannelsResponse_WaitingCloseChannel) GetChannel() *PendingChannelsResponse_PendingChannel {
@ -2330,7 +2364,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 fileDescriptor0, []int{47, 3}
return fileDescriptor0, []int{49, 3}
}
func (m *PendingChannelsResponse_ClosedChannel) GetChannel() *PendingChannelsResponse_PendingChannel {
@ -2374,7 +2408,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string {
}
func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {}
func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{47, 4}
return fileDescriptor0, []int{49, 4}
}
func (m *PendingChannelsResponse_ForceClosedChannel) GetChannel() *PendingChannelsResponse_PendingChannel {
@ -2432,7 +2466,7 @@ type WalletBalanceRequest struct {
func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceRequest) ProtoMessage() {}
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
type WalletBalanceResponse struct {
// / The balance of the wallet
@ -2446,7 +2480,7 @@ type WalletBalanceResponse struct {
func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} }
func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceResponse) ProtoMessage() {}
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (m *WalletBalanceResponse) GetTotalBalance() int64 {
if m != nil {
@ -2475,7 +2509,7 @@ type ChannelBalanceRequest struct {
func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} }
func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceRequest) ProtoMessage() {}
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
type ChannelBalanceResponse struct {
// / Sum of channels balances denominated in satoshis
@ -2487,7 +2521,7 @@ type ChannelBalanceResponse struct {
func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} }
func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceResponse) ProtoMessage() {}
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (m *ChannelBalanceResponse) GetBalance() int64 {
if m != nil {
@ -2515,7 +2549,7 @@ type QueryRoutesRequest struct {
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesRequest) ProtoMessage() {}
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (m *QueryRoutesRequest) GetPubKey() string {
if m != nil {
@ -2545,7 +2579,7 @@ type QueryRoutesResponse struct {
func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} }
func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesResponse) ProtoMessage() {}
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (m *QueryRoutesResponse) GetRoutes() []*Route {
if m != nil {
@ -2571,7 +2605,7 @@ type Hop struct {
func (m *Hop) Reset() { *m = Hop{} }
func (m *Hop) String() string { return proto.CompactTextString(m) }
func (*Hop) ProtoMessage() {}
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
func (m *Hop) GetChanId() uint64 {
if m != nil {
@ -2661,7 +2695,7 @@ type Route struct {
func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (m *Route) GetTotalTimeLock() uint32 {
if m != nil {
@ -2713,7 +2747,7 @@ type NodeInfoRequest struct {
func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
func (m *NodeInfoRequest) GetPubKey() string {
if m != nil {
@ -2736,7 +2770,7 @@ type NodeInfo struct {
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
func (m *NodeInfo) String() string { return proto.CompactTextString(m) }
func (*NodeInfo) ProtoMessage() {}
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (m *NodeInfo) GetNode() *LightningNode {
if m != nil {
@ -2775,7 +2809,7 @@ type LightningNode struct {
func (m *LightningNode) Reset() { *m = LightningNode{} }
func (m *LightningNode) String() string { return proto.CompactTextString(m) }
func (*LightningNode) ProtoMessage() {}
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (m *LightningNode) GetLastUpdate() uint32 {
if m != nil {
@ -2820,7 +2854,7 @@ type NodeAddress struct {
func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (m *NodeAddress) GetNetwork() string {
if m != nil {
@ -2846,7 +2880,7 @@ type RoutingPolicy struct {
func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) }
func (*RoutingPolicy) ProtoMessage() {}
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (m *RoutingPolicy) GetTimeLockDelta() uint32 {
if m != nil {
@ -2900,7 +2934,7 @@ type ChannelEdge struct {
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
func (m *ChannelEdge) String() string { return proto.CompactTextString(m) }
func (*ChannelEdge) ProtoMessage() {}
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (m *ChannelEdge) GetChannelId() uint64 {
if m != nil {
@ -2964,7 +2998,7 @@ type ChannelGraphRequest struct {
func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} }
func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelGraphRequest) ProtoMessage() {}
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
// / Returns a new instance of the directed channel graph.
type ChannelGraph struct {
@ -2977,7 +3011,7 @@ type ChannelGraph struct {
func (m *ChannelGraph) Reset() { *m = ChannelGraph{} }
func (m *ChannelGraph) String() string { return proto.CompactTextString(m) }
func (*ChannelGraph) ProtoMessage() {}
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (m *ChannelGraph) GetNodes() []*LightningNode {
if m != nil {
@ -3004,7 +3038,7 @@ type ChanInfoRequest struct {
func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) }
func (*ChanInfoRequest) ProtoMessage() {}
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (m *ChanInfoRequest) GetChanId() uint64 {
if m != nil {
@ -3019,7 +3053,7 @@ type NetworkInfoRequest struct {
func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} }
func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
type NetworkInfo struct {
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,omitempty"`
@ -3036,7 +3070,7 @@ type NetworkInfo struct {
func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
func (m *NetworkInfo) String() string { return proto.CompactTextString(m) }
func (*NetworkInfo) ProtoMessage() {}
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
func (m *NetworkInfo) GetGraphDiameter() uint32 {
if m != nil {
@ -3107,7 +3141,7 @@ type StopRequest struct {
func (m *StopRequest) Reset() { *m = StopRequest{} }
func (m *StopRequest) String() string { return proto.CompactTextString(m) }
func (*StopRequest) ProtoMessage() {}
func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
type StopResponse struct {
}
@ -3115,7 +3149,7 @@ type StopResponse struct {
func (m *StopResponse) Reset() { *m = StopResponse{} }
func (m *StopResponse) String() string { return proto.CompactTextString(m) }
func (*StopResponse) ProtoMessage() {}
func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
type GraphTopologySubscription struct {
}
@ -3123,7 +3157,7 @@ type GraphTopologySubscription struct {
func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} }
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
type GraphTopologyUpdate struct {
NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"`
@ -3134,7 +3168,7 @@ type GraphTopologyUpdate struct {
func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate {
if m != nil {
@ -3167,7 +3201,7 @@ type NodeUpdate struct {
func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (m *NodeUpdate) GetAddresses() []string {
if m != nil {
@ -3213,7 +3247,7 @@ type ChannelEdgeUpdate struct {
func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
func (m *ChannelEdgeUpdate) GetChanId() uint64 {
if m != nil {
@ -3271,7 +3305,7 @@ type ClosedChannelUpdate struct {
func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (m *ClosedChannelUpdate) GetChanId() uint64 {
if m != nil {
@ -3319,7 +3353,7 @@ type HopHint struct {
func (m *HopHint) Reset() { *m = HopHint{} }
func (m *HopHint) String() string { return proto.CompactTextString(m) }
func (*HopHint) ProtoMessage() {}
func (*HopHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
func (*HopHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
func (m *HopHint) GetNodeId() string {
if m != nil {
@ -3366,7 +3400,7 @@ type RouteHint struct {
func (m *RouteHint) Reset() { *m = RouteHint{} }
func (m *RouteHint) String() string { return proto.CompactTextString(m) }
func (*RouteHint) ProtoMessage() {}
func (*RouteHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (*RouteHint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (m *RouteHint) GetHopHints() []*HopHint {
if m != nil {
@ -3425,7 +3459,7 @@ type Invoice struct {
func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
func (m *Invoice) GetMemo() string {
if m != nil {
@ -3544,7 +3578,7 @@ type AddInvoiceResponse struct {
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
func (m *AddInvoiceResponse) GetRHash() []byte {
if m != nil {
@ -3572,7 +3606,7 @@ type PaymentHash struct {
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }
func (m *PaymentHash) GetRHashStr() string {
if m != nil {
@ -3596,7 +3630,7 @@ type ListInvoiceRequest struct {
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }
func (m *ListInvoiceRequest) GetPendingOnly() bool {
if m != nil {
@ -3612,7 +3646,7 @@ type ListInvoiceResponse struct {
func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} }
func (m *ListInvoiceResponse) GetInvoices() []*Invoice {
if m != nil {
@ -3627,7 +3661,7 @@ type InvoiceSubscription struct {
func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} }
type Payment struct {
// / The payment hash
@ -3647,7 +3681,7 @@ type Payment struct {
func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} }
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} }
func (m *Payment) GetPaymentHash() string {
if m != nil {
@ -3697,7 +3731,7 @@ type ListPaymentsRequest struct {
func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} }
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} }
type ListPaymentsResponse struct {
// / The list of payments
@ -3707,7 +3741,7 @@ type ListPaymentsResponse struct {
func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{84} }
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} }
func (m *ListPaymentsResponse) GetPayments() []*Payment {
if m != nil {
@ -3722,7 +3756,7 @@ type DeleteAllPaymentsRequest struct {
func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} }
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{85} }
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} }
type DeleteAllPaymentsResponse struct {
}
@ -3730,7 +3764,7 @@ type DeleteAllPaymentsResponse struct {
func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} }
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{86} }
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} }
type DebugLevelRequest struct {
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
@ -3740,7 +3774,7 @@ type DebugLevelRequest struct {
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{87} }
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} }
func (m *DebugLevelRequest) GetShow() bool {
if m != nil {
@ -3763,7 +3797,7 @@ type DebugLevelResponse struct {
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{88} }
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{90} }
func (m *DebugLevelResponse) GetSubSystems() string {
if m != nil {
@ -3780,7 +3814,7 @@ type PayReqString struct {
func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{89} }
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{91} }
func (m *PayReqString) GetPayReq() string {
if m != nil {
@ -3805,7 +3839,7 @@ type PayReq struct {
func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{90} }
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{92} }
func (m *PayReq) GetDestination() string {
if m != nil {
@ -3883,7 +3917,7 @@ type FeeReportRequest struct {
func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} }
func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) }
func (*FeeReportRequest) ProtoMessage() {}
func (*FeeReportRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{91} }
func (*FeeReportRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{93} }
type ChannelFeeReport struct {
// / The channel that this fee report belongs to.
@ -3899,7 +3933,7 @@ type ChannelFeeReport struct {
func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} }
func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) }
func (*ChannelFeeReport) ProtoMessage() {}
func (*ChannelFeeReport) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{92} }
func (*ChannelFeeReport) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{94} }
func (m *ChannelFeeReport) GetChanPoint() string {
if m != nil {
@ -3943,7 +3977,7 @@ type FeeReportResponse struct {
func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} }
func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) }
func (*FeeReportResponse) ProtoMessage() {}
func (*FeeReportResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{93} }
func (*FeeReportResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{95} }
func (m *FeeReportResponse) GetChannelFees() []*ChannelFeeReport {
if m != nil {
@ -3989,11 +4023,9 @@ type PolicyUpdateRequest struct {
func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} }
func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateRequest) ProtoMessage() {}
func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{94} }
func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{96} }
type isPolicyUpdateRequest_Scope interface {
isPolicyUpdateRequest_Scope()
}
type isPolicyUpdateRequest_Scope interface{ isPolicyUpdateRequest_Scope() }
type PolicyUpdateRequest_Global struct {
Global bool `protobuf:"varint,1,opt,name=global,oneof"`
@ -4126,7 +4158,7 @@ type PolicyUpdateResponse struct {
func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} }
func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateResponse) ProtoMessage() {}
func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{95} }
func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} }
type ForwardingHistoryRequest struct {
// / Start time is the starting point of the forwarding history request. All records beyond this point will be included, respecting the end time, and the index offset.
@ -4142,7 +4174,7 @@ type ForwardingHistoryRequest struct {
func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryRequest{} }
func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryRequest) ProtoMessage() {}
func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{96} }
func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{98} }
func (m *ForwardingHistoryRequest) GetStartTime() uint64 {
if m != nil {
@ -4190,7 +4222,7 @@ type ForwardingEvent struct {
func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} }
func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardingEvent) ProtoMessage() {}
func (*ForwardingEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{97} }
func (*ForwardingEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{99} }
func (m *ForwardingEvent) GetTimestamp() uint64 {
if m != nil {
@ -4244,7 +4276,7 @@ type ForwardingHistoryResponse struct {
func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResponse{} }
func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryResponse) ProtoMessage() {}
func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{98} }
func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{100} }
func (m *ForwardingHistoryResponse) GetForwardingEvents() []*ForwardingEvent {
if m != nil {
@ -4267,6 +4299,8 @@ func init() {
proto.RegisterType((*InitWalletResponse)(nil), "lnrpc.InitWalletResponse")
proto.RegisterType((*UnlockWalletRequest)(nil), "lnrpc.UnlockWalletRequest")
proto.RegisterType((*UnlockWalletResponse)(nil), "lnrpc.UnlockWalletResponse")
proto.RegisterType((*ChangePasswordRequest)(nil), "lnrpc.ChangePasswordRequest")
proto.RegisterType((*ChangePasswordResponse)(nil), "lnrpc.ChangePasswordResponse")
proto.RegisterType((*Transaction)(nil), "lnrpc.Transaction")
proto.RegisterType((*GetTransactionsRequest)(nil), "lnrpc.GetTransactionsRequest")
proto.RegisterType((*TransactionDetails)(nil), "lnrpc.TransactionDetails")
@ -4407,6 +4441,10 @@ type WalletUnlockerClient interface {
// UnlockWallet is used at startup of lnd to provide a password to unlock
// the wallet database.
UnlockWallet(ctx context.Context, in *UnlockWalletRequest, opts ...grpc.CallOption) (*UnlockWalletResponse, error)
// * lncli: `changepassword`
// ChangePassword changes the password of the encrypted wallet. This will
// automatically unlock the wallet database if successful.
ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*ChangePasswordResponse, error)
}
type walletUnlockerClient struct {
@ -4444,6 +4482,15 @@ func (c *walletUnlockerClient) UnlockWallet(ctx context.Context, in *UnlockWalle
return out, nil
}
func (c *walletUnlockerClient) ChangePassword(ctx context.Context, in *ChangePasswordRequest, opts ...grpc.CallOption) (*ChangePasswordResponse, error) {
out := new(ChangePasswordResponse)
err := grpc.Invoke(ctx, "/lnrpc.WalletUnlocker/ChangePassword", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for WalletUnlocker service
type WalletUnlockerServer interface {
@ -4475,6 +4522,10 @@ type WalletUnlockerServer interface {
// UnlockWallet is used at startup of lnd to provide a password to unlock
// the wallet database.
UnlockWallet(context.Context, *UnlockWalletRequest) (*UnlockWalletResponse, error)
// * lncli: `changepassword`
// ChangePassword changes the password of the encrypted wallet. This will
// automatically unlock the wallet database if successful.
ChangePassword(context.Context, *ChangePasswordRequest) (*ChangePasswordResponse, error)
}
func RegisterWalletUnlockerServer(s *grpc.Server, srv WalletUnlockerServer) {
@ -4535,6 +4586,24 @@ func _WalletUnlocker_UnlockWallet_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler)
}
func _WalletUnlocker_ChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ChangePasswordRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(WalletUnlockerServer).ChangePassword(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.WalletUnlocker/ChangePassword",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(WalletUnlockerServer).ChangePassword(ctx, req.(*ChangePasswordRequest))
}
return interceptor(ctx, in, info, handler)
}
var _WalletUnlocker_serviceDesc = grpc.ServiceDesc{
ServiceName: "lnrpc.WalletUnlocker",
HandlerType: (*WalletUnlockerServer)(nil),
@ -4551,6 +4620,10 @@ var _WalletUnlocker_serviceDesc = grpc.ServiceDesc{
MethodName: "UnlockWallet",
Handler: _WalletUnlocker_UnlockWallet_Handler,
},
{
MethodName: "ChangePassword",
Handler: _WalletUnlocker_ChangePassword_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "rpc.proto",
@ -6379,358 +6452,363 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 5640 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x4d, 0x90, 0x1c, 0xc9,
0x55, 0xbf, 0xaa, 0xa7, 0xe7, 0xa3, 0x5f, 0xf7, 0xf4, 0xcc, 0xe4, 0x8c, 0x46, 0xad, 0x96, 0x56,
0xab, 0x2d, 0x6f, 0x58, 0xfa, 0xcf, 0x7f, 0xd1, 0x68, 0xc7, 0xf6, 0xb2, 0x5e, 0x81, 0x8d, 0xbe,
0x67, 0x6d, 0xad, 0x3c, 0xae, 0x91, 0x2c, 0xb0, 0x81, 0x76, 0x4d, 0x77, 0x4e, 0x4f, 0xad, 0xaa,
0xab, 0x6a, 0xab, 0xaa, 0x67, 0xd4, 0xbb, 0x28, 0x82, 0xaf, 0xe0, 0x84, 0x83, 0x03, 0x5c, 0x4c,
0x04, 0x41, 0x84, 0x7d, 0x81, 0x03, 0x47, 0x4e, 0x86, 0x1b, 0x27, 0x22, 0x08, 0x0e, 0x7b, 0x72,
0x70, 0xe3, 0xe3, 0x00, 0x0e, 0x2e, 0x44, 0x70, 0xe1, 0x40, 0x10, 0xef, 0xe5, 0x47, 0x65, 0x56,
0xd5, 0x48, 0xf2, 0x07, 0xdc, 0x3a, 0x7f, 0xf9, 0xea, 0xe5, 0xd7, 0x7b, 0x2f, 0xdf, 0x7b, 0x99,
0xd9, 0xd0, 0x4a, 0x93, 0xe1, 0xb5, 0x24, 0x8d, 0xf3, 0x98, 0xcd, 0x87, 0x51, 0x9a, 0x0c, 0xfb,
0x17, 0xc7, 0x71, 0x3c, 0x0e, 0xf9, 0xb6, 0x9f, 0x04, 0xdb, 0x7e, 0x14, 0xc5, 0xb9, 0x9f, 0x07,
0x71, 0x94, 0x09, 0x22, 0xf7, 0xdb, 0xd0, 0xbd, 0xcf, 0xa3, 0x7d, 0xce, 0x47, 0x1e, 0xff, 0x68,
0xca, 0xb3, 0x9c, 0xfd, 0x7f, 0x58, 0xf3, 0xf9, 0xc7, 0x9c, 0x8f, 0x06, 0x89, 0x9f, 0x65, 0xc9,
0x51, 0xea, 0x67, 0xbc, 0xe7, 0x5c, 0x76, 0xae, 0x76, 0xbc, 0x55, 0x51, 0xb1, 0xa7, 0x71, 0xf6,
0x06, 0x74, 0x32, 0x24, 0xe5, 0x51, 0x9e, 0xc6, 0xc9, 0xac, 0xd7, 0x20, 0xba, 0x36, 0x62, 0x77,
0x05, 0xe4, 0x86, 0xb0, 0xa2, 0x5b, 0xc8, 0x92, 0x38, 0xca, 0x38, 0xbb, 0x0e, 0x1b, 0xc3, 0x20,
0x39, 0xe2, 0xe9, 0x80, 0x3e, 0x9e, 0x44, 0x7c, 0x12, 0x47, 0xc1, 0xb0, 0xe7, 0x5c, 0x9e, 0xbb,
0xda, 0xf2, 0x98, 0xa8, 0xc3, 0x2f, 0x3e, 0x90, 0x35, 0xec, 0x0a, 0xac, 0xf0, 0x48, 0xe0, 0x7c,
0x44, 0x5f, 0xc9, 0xa6, 0xba, 0x05, 0x8c, 0x1f, 0xb8, 0x7f, 0xe3, 0xc0, 0xda, 0xfb, 0x51, 0x90,
0x3f, 0xf1, 0xc3, 0x90, 0xe7, 0x6a, 0x4c, 0x57, 0x60, 0xe5, 0x84, 0x00, 0x1a, 0xd3, 0x49, 0x9c,
0x8e, 0xe4, 0x88, 0xba, 0x02, 0xde, 0x93, 0xe8, 0xa9, 0x3d, 0x6b, 0x9c, 0xda, 0xb3, 0xda, 0xe9,
0x9a, 0x3b, 0x65, 0xba, 0xae, 0xc0, 0x4a, 0xca, 0x87, 0xf1, 0x31, 0x4f, 0x67, 0x83, 0x93, 0x20,
0x1a, 0xc5, 0x27, 0xbd, 0xe6, 0x65, 0xe7, 0xea, 0xbc, 0xd7, 0x55, 0xf0, 0x13, 0x42, 0xdd, 0x0d,
0x60, 0xe6, 0x28, 0xc4, 0xbc, 0xb9, 0x63, 0x58, 0x7f, 0x1c, 0x85, 0xf1, 0xf0, 0xe9, 0x4f, 0x38,
0xba, 0x9a, 0xe6, 0x1b, 0xb5, 0xcd, 0x6f, 0xc2, 0x86, 0xdd, 0x90, 0xec, 0xc0, 0x77, 0x1b, 0xd0,
0x7e, 0x94, 0xfa, 0x51, 0xe6, 0x0f, 0x51, 0x88, 0x58, 0x0f, 0x16, 0xf3, 0x67, 0x83, 0x23, 0x3f,
0x3b, 0xa2, 0x16, 0x5b, 0x9e, 0x2a, 0xb2, 0x4d, 0x58, 0xf0, 0x27, 0xf1, 0x34, 0xca, 0xa9, 0x85,
0x39, 0x4f, 0x96, 0xd8, 0x5b, 0xb0, 0x16, 0x4d, 0x27, 0x83, 0x61, 0x1c, 0x1d, 0x06, 0xe9, 0x44,
0x88, 0x22, 0x4d, 0xd7, 0xbc, 0x57, 0xad, 0x60, 0x97, 0x00, 0x0e, 0xb0, 0x1b, 0xa2, 0x89, 0x26,
0x35, 0x61, 0x20, 0xcc, 0x85, 0x8e, 0x2c, 0xf1, 0x60, 0x7c, 0x94, 0xf7, 0xe6, 0x89, 0x91, 0x85,
0x21, 0x8f, 0x3c, 0x98, 0xf0, 0x41, 0x96, 0xfb, 0x93, 0xa4, 0xb7, 0x40, 0xbd, 0x31, 0x10, 0xaa,
0x8f, 0x73, 0x3f, 0x1c, 0x1c, 0x72, 0x9e, 0xf5, 0x16, 0x65, 0xbd, 0x46, 0xd8, 0x67, 0xa1, 0x3b,
0xe2, 0x59, 0x3e, 0xf0, 0x47, 0xa3, 0x94, 0x67, 0x19, 0xcf, 0x7a, 0x4b, 0x24, 0x0c, 0x25, 0xd4,
0xed, 0xc1, 0xe6, 0x7d, 0x9e, 0x1b, 0xb3, 0x93, 0xc9, 0xf5, 0x71, 0x1f, 0x00, 0x33, 0xe0, 0x3b,
0x3c, 0xf7, 0x83, 0x30, 0x63, 0xef, 0x40, 0x27, 0x37, 0x88, 0x49, 0xf8, 0xdb, 0x3b, 0xec, 0x1a,
0x69, 0xed, 0x35, 0xe3, 0x03, 0xcf, 0xa2, 0x73, 0xff, 0xcb, 0x81, 0xf6, 0x3e, 0x8f, 0xb4, 0xbe,
0x32, 0x68, 0x62, 0x4f, 0xe4, 0x92, 0xd3, 0x6f, 0xf6, 0x3a, 0xb4, 0xa9, 0x77, 0x59, 0x9e, 0x06,
0xd1, 0x98, 0x96, 0xa0, 0xe5, 0x01, 0x42, 0xfb, 0x84, 0xb0, 0x55, 0x98, 0xf3, 0x27, 0x39, 0x4d,
0xfc, 0x9c, 0x87, 0x3f, 0x51, 0x93, 0x13, 0x7f, 0x36, 0xe1, 0x51, 0x5e, 0x4c, 0x76, 0xc7, 0x6b,
0x4b, 0x6c, 0x17, 0x67, 0xfb, 0x1a, 0xac, 0x9b, 0x24, 0x8a, 0xfb, 0x3c, 0x71, 0x5f, 0x33, 0x28,
0x65, 0x23, 0x57, 0x60, 0x45, 0xd1, 0xa7, 0xa2, 0xb3, 0x34, 0xfd, 0x2d, 0xaf, 0x2b, 0x61, 0x35,
0x84, 0xab, 0xb0, 0x7a, 0x18, 0x44, 0x7e, 0x38, 0x18, 0x86, 0xf9, 0xf1, 0x60, 0xc4, 0xc3, 0xdc,
0xa7, 0x85, 0x98, 0xf7, 0xba, 0x84, 0xdf, 0x0e, 0xf3, 0xe3, 0x3b, 0x88, 0xba, 0x7f, 0xe4, 0x40,
0x47, 0x0c, 0x5e, 0x9a, 0x92, 0x37, 0x61, 0x59, 0xb5, 0xc1, 0xd3, 0x34, 0x4e, 0xa5, 0x1c, 0xda,
0x20, 0xdb, 0x82, 0x55, 0x05, 0x24, 0x29, 0x0f, 0x26, 0xfe, 0x98, 0x4b, 0xfb, 0x51, 0xc1, 0xd9,
0x4e, 0xc1, 0x31, 0x8d, 0xa7, 0xb9, 0x50, 0xe6, 0xf6, 0x4e, 0x47, 0x2e, 0x8c, 0x87, 0x98, 0x67,
0x93, 0xb8, 0xdf, 0x73, 0xa0, 0x73, 0xfb, 0xc8, 0x8f, 0x22, 0x1e, 0xee, 0xc5, 0x41, 0x94, 0xb3,
0xeb, 0xc0, 0x0e, 0xa7, 0xd1, 0x28, 0x88, 0xc6, 0x83, 0xfc, 0x59, 0x30, 0x1a, 0x1c, 0xcc, 0x72,
0x9e, 0x89, 0x25, 0xda, 0x3d, 0xe3, 0xd5, 0xd4, 0xb1, 0xb7, 0x60, 0xd5, 0x42, 0xb3, 0x3c, 0x15,
0xeb, 0xb6, 0x7b, 0xc6, 0xab, 0xd4, 0xa0, 0xe0, 0xc7, 0xd3, 0x3c, 0x99, 0xe6, 0x83, 0x20, 0x1a,
0xf1, 0x67, 0xd4, 0xc7, 0x65, 0xcf, 0xc2, 0x6e, 0x75, 0xa1, 0x63, 0x7e, 0xe7, 0x7e, 0x09, 0x56,
0x1f, 0xa0, 0x46, 0x44, 0x41, 0x34, 0xbe, 0x29, 0xc4, 0x16, 0xd5, 0x34, 0x99, 0x1e, 0x3c, 0xe5,
0x33, 0x39, 0x6f, 0xb2, 0x84, 0x42, 0x75, 0x14, 0x67, 0xb9, 0x94, 0x1c, 0xfa, 0xed, 0xfe, 0x93,
0x03, 0x2b, 0x38, 0xf7, 0x1f, 0xf8, 0xd1, 0x4c, 0xad, 0xdc, 0x03, 0xe8, 0x20, 0xab, 0x47, 0xf1,
0x4d, 0xa1, 0xec, 0x42, 0x88, 0xaf, 0xca, 0xb9, 0x2a, 0x51, 0x5f, 0x33, 0x49, 0x71, 0x7b, 0x98,
0x79, 0xd6, 0xd7, 0x28, 0xb6, 0xb9, 0x9f, 0x8e, 0x79, 0x4e, 0x66, 0x40, 0x9a, 0x05, 0x10, 0xd0,
0xed, 0x38, 0x3a, 0x64, 0x97, 0xa1, 0x93, 0xf9, 0xf9, 0x20, 0xe1, 0x29, 0xcd, 0x1a, 0x89, 0xde,
0x9c, 0x07, 0x99, 0x9f, 0xef, 0xf1, 0xf4, 0xd6, 0x2c, 0xe7, 0xfd, 0x2f, 0xc3, 0x5a, 0xa5, 0x15,
0x94, 0xf6, 0x62, 0x88, 0xf8, 0x93, 0x6d, 0xc0, 0xfc, 0xb1, 0x1f, 0x4e, 0xb9, 0xb4, 0x4e, 0xa2,
0xf0, 0x5e, 0xe3, 0x5d, 0xc7, 0xfd, 0x2c, 0xac, 0x16, 0xdd, 0x96, 0x42, 0xc6, 0xa0, 0x89, 0x33,
0x28, 0x19, 0xd0, 0x6f, 0xf7, 0xb7, 0x1c, 0x41, 0x78, 0x3b, 0x0e, 0xb4, 0xa6, 0x23, 0x21, 0x1a,
0x04, 0x45, 0x88, 0xbf, 0x4f, 0xb5, 0x84, 0x3f, 0xfd, 0x60, 0xdd, 0x2b, 0xb0, 0x66, 0x74, 0xe1,
0x05, 0x9d, 0xfd, 0x8e, 0x03, 0x6b, 0x0f, 0xf9, 0x89, 0x5c, 0x75, 0xd5, 0xdb, 0x77, 0xa1, 0x99,
0xcf, 0x12, 0xb1, 0xb9, 0x77, 0x77, 0xde, 0x94, 0x8b, 0x56, 0xa1, 0xbb, 0x26, 0x8b, 0x8f, 0x66,
0x09, 0xf7, 0xe8, 0x0b, 0xf7, 0x4b, 0xd0, 0x36, 0x40, 0x76, 0x0e, 0xd6, 0x9f, 0xbc, 0xff, 0xe8,
0xe1, 0xdd, 0xfd, 0xfd, 0xc1, 0xde, 0xe3, 0x5b, 0x5f, 0xbd, 0xfb, 0x2b, 0x83, 0xdd, 0x9b, 0xfb,
0xbb, 0xab, 0x67, 0xd8, 0x26, 0xb0, 0x87, 0x77, 0xf7, 0x1f, 0xdd, 0xbd, 0x63, 0xe1, 0x8e, 0xdb,
0x87, 0xde, 0x43, 0x7e, 0xf2, 0x24, 0xc8, 0x23, 0x9e, 0x65, 0x76, 0x6b, 0xee, 0x35, 0x60, 0x66,
0x17, 0xe4, 0xa8, 0x7a, 0xb0, 0x28, 0x4d, 0xad, 0xda, 0x69, 0x64, 0xd1, 0xfd, 0x2c, 0xb0, 0xfd,
0x60, 0x1c, 0x7d, 0xc0, 0xb3, 0xcc, 0x1f, 0x73, 0x35, 0xb6, 0x55, 0x98, 0x9b, 0x64, 0x63, 0x69,
0x14, 0xf1, 0xa7, 0xfb, 0x39, 0x58, 0xb7, 0xe8, 0x24, 0xe3, 0x8b, 0xd0, 0xca, 0x82, 0x71, 0xe4,
0xe7, 0xd3, 0x94, 0x4b, 0xd6, 0x05, 0xe0, 0xde, 0x83, 0x8d, 0x6f, 0xf0, 0x34, 0x38, 0x9c, 0xbd,
0x8c, 0xbd, 0xcd, 0xa7, 0x51, 0xe6, 0x73, 0x17, 0xce, 0x96, 0xf8, 0xc8, 0xe6, 0x85, 0x20, 0xca,
0xe5, 0x5a, 0xf2, 0x44, 0xc1, 0x50, 0xcb, 0x86, 0xa9, 0x96, 0xee, 0x63, 0x60, 0xb7, 0xe3, 0x28,
0xe2, 0xc3, 0x7c, 0x8f, 0xf3, 0xb4, 0xf0, 0xd8, 0x0a, 0xa9, 0x6b, 0xef, 0x9c, 0x93, 0xeb, 0x58,
0xd6, 0x75, 0x29, 0x8e, 0x0c, 0x9a, 0x09, 0x4f, 0x27, 0xc4, 0x78, 0xc9, 0xa3, 0xdf, 0xee, 0x59,
0x58, 0xb7, 0xd8, 0xca, 0xdd, 0xfe, 0x6d, 0x38, 0x7b, 0x27, 0xc8, 0x86, 0xd5, 0x06, 0x7b, 0xb0,
0x98, 0x4c, 0x0f, 0x06, 0x85, 0x4e, 0xa9, 0x22, 0x6e, 0x82, 0xe5, 0x4f, 0x24, 0xb3, 0xdf, 0x73,
0xa0, 0xb9, 0xfb, 0xe8, 0xc1, 0x6d, 0xd6, 0x87, 0xa5, 0x20, 0x1a, 0xc6, 0x13, 0xdc, 0x3a, 0xc4,
0xa0, 0x75, 0xf9, 0x54, 0x5d, 0xb9, 0x08, 0x2d, 0xda, 0x71, 0x70, 0x5f, 0x97, 0xce, 0x55, 0x01,
0xa0, 0x4f, 0xc1, 0x9f, 0x25, 0x41, 0x4a, 0x4e, 0x83, 0x72, 0x05, 0x9a, 0x64, 0x11, 0xab, 0x15,
0xee, 0x7f, 0x37, 0x61, 0x51, 0xda, 0x6a, 0x6a, 0x6f, 0x98, 0x07, 0xc7, 0x5c, 0xf6, 0x44, 0x96,
0x70, 0x57, 0x49, 0xf9, 0x24, 0xce, 0xf9, 0xc0, 0x5a, 0x06, 0x1b, 0x44, 0xaa, 0xa1, 0x60, 0x34,
0x48, 0xd0, 0xea, 0x53, 0xcf, 0x5a, 0x9e, 0x0d, 0xe2, 0x64, 0x21, 0x30, 0x08, 0x46, 0xd4, 0xa7,
0xa6, 0xa7, 0x8a, 0x38, 0x13, 0x43, 0x3f, 0xf1, 0x87, 0x41, 0x3e, 0x93, 0xca, 0xad, 0xcb, 0xc8,
0x3b, 0x8c, 0x87, 0x7e, 0x38, 0x38, 0xf0, 0x43, 0x3f, 0x1a, 0x72, 0xe9, 0xb8, 0xd8, 0x20, 0xfa,
0x26, 0xb2, 0x4b, 0x8a, 0x4c, 0xf8, 0x2f, 0x25, 0x14, 0x7d, 0x9c, 0x61, 0x3c, 0x99, 0x04, 0x39,
0xba, 0x34, 0xbd, 0x25, 0x61, 0x48, 0x0a, 0x84, 0x46, 0x22, 0x4a, 0x27, 0x62, 0xf6, 0x5a, 0xa2,
0x35, 0x0b, 0x44, 0x2e, 0x87, 0x9c, 0x93, 0x41, 0x7a, 0x7a, 0xd2, 0x03, 0xc1, 0xa5, 0x40, 0x70,
0x1d, 0xa6, 0x51, 0xc6, 0xf3, 0x3c, 0xe4, 0x23, 0xdd, 0xa1, 0x36, 0x91, 0x55, 0x2b, 0xd8, 0x75,
0x58, 0x17, 0x5e, 0x56, 0xe6, 0xe7, 0x71, 0x76, 0x14, 0x64, 0x83, 0x8c, 0x47, 0x79, 0xaf, 0x43,
0xf4, 0x75, 0x55, 0xec, 0x5d, 0x38, 0x57, 0x82, 0x53, 0x3e, 0xe4, 0xc1, 0x31, 0x1f, 0xf5, 0x96,
0xe9, 0xab, 0xd3, 0xaa, 0xd9, 0x65, 0x68, 0xa3, 0x73, 0x39, 0x4d, 0x46, 0x3e, 0xee, 0xc3, 0x5d,
0x5a, 0x07, 0x13, 0x62, 0x6f, 0xc3, 0x72, 0xc2, 0xc5, 0x66, 0x79, 0x94, 0x87, 0xc3, 0xac, 0xb7,
0x42, 0x3b, 0x59, 0x5b, 0x2a, 0x13, 0x4a, 0xae, 0x67, 0x53, 0xa0, 0x50, 0x0e, 0x33, 0x72, 0x57,
0xfc, 0x59, 0x6f, 0x95, 0xc4, 0xad, 0x00, 0x48, 0x47, 0xd2, 0xe0, 0xd8, 0xcf, 0x79, 0x6f, 0x8d,
0x64, 0x4b, 0x15, 0xdd, 0x3f, 0x75, 0x60, 0xfd, 0x41, 0x90, 0xe5, 0x52, 0x08, 0xb5, 0x39, 0x7e,
0x1d, 0xda, 0x42, 0xfc, 0x06, 0x71, 0x14, 0xce, 0xa4, 0x44, 0x82, 0x80, 0xbe, 0x16, 0x85, 0x33,
0xf6, 0x19, 0x58, 0x0e, 0x22, 0x93, 0x44, 0xe8, 0x70, 0x47, 0x81, 0x44, 0xf4, 0x3a, 0xb4, 0x93,
0xe9, 0x41, 0x18, 0x0c, 0x05, 0xc9, 0x9c, 0xe0, 0x22, 0x20, 0x22, 0x40, 0x47, 0x4f, 0xf4, 0x44,
0x50, 0x34, 0x89, 0xa2, 0x2d, 0x31, 0x24, 0x71, 0x6f, 0xc1, 0x86, 0xdd, 0x41, 0x69, 0xac, 0xb6,
0x60, 0x49, 0xca, 0x76, 0xd6, 0x6b, 0xd3, 0xfc, 0x74, 0xe5, 0xfc, 0x48, 0x52, 0x4f, 0xd7, 0xbb,
0xff, 0xe6, 0x40, 0x13, 0x0d, 0xc0, 0xe9, 0xc6, 0xc2, 0xb4, 0xe9, 0x73, 0x96, 0x4d, 0x27, 0xbf,
0x1f, 0xbd, 0x22, 0x21, 0x12, 0x42, 0x6d, 0x0c, 0xa4, 0xa8, 0x4f, 0xf9, 0xf0, 0x98, 0x74, 0x47,
0xd7, 0x23, 0x82, 0x9a, 0x85, 0x5b, 0x27, 0x7d, 0x2d, 0x14, 0x47, 0x97, 0x55, 0x1d, 0x7d, 0xb9,
0x58, 0xd4, 0xd1, 0x77, 0x3d, 0x58, 0x0c, 0xa2, 0x83, 0x78, 0x1a, 0x8d, 0x48, 0x49, 0x96, 0x3c,
0x55, 0xc4, 0xc5, 0x4e, 0xc8, 0x93, 0x0a, 0x26, 0x5c, 0x6a, 0x47, 0x01, 0xb8, 0x0c, 0x5d, 0xab,
0x8c, 0x0c, 0x9e, 0xde, 0xc7, 0xde, 0x81, 0x35, 0x03, 0x93, 0x33, 0xf8, 0x06, 0xcc, 0x27, 0x08,
0x48, 0x47, 0x49, 0x89, 0x17, 0x59, 0x4a, 0x51, 0xe3, 0xae, 0x62, 0x44, 0x9e, 0xbf, 0x1f, 0x1d,
0xc6, 0x8a, 0xd3, 0x0f, 0xe7, 0x30, 0x84, 0x96, 0x90, 0x64, 0x74, 0x15, 0x56, 0x82, 0x11, 0x8f,
0xf2, 0x20, 0x9f, 0x0d, 0x2c, 0x0f, 0xae, 0x0c, 0xe3, 0x0e, 0xe3, 0x87, 0x81, 0x9f, 0x49, 0x1b,
0x26, 0x0a, 0x6c, 0x07, 0x36, 0x50, 0xfc, 0x95, 0x44, 0xeb, 0x65, 0x15, 0x8e, 0x64, 0x6d, 0x1d,
0x6a, 0x2c, 0xe2, 0x52, 0x02, 0xf5, 0x27, 0xc2, 0xd2, 0xd6, 0x55, 0xe1, 0xac, 0x09, 0x4e, 0x38,
0xe4, 0x79, 0xa1, 0x22, 0x1a, 0xa8, 0x44, 0x6f, 0x0b, 0xc2, 0x89, 0x2d, 0x47, 0x6f, 0x46, 0x04,
0xb8, 0x54, 0x89, 0x00, 0xaf, 0xc2, 0x4a, 0x36, 0x8b, 0x86, 0x7c, 0x34, 0xc8, 0x63, 0x6c, 0x37,
0x88, 0x68, 0x75, 0x96, 0xbc, 0x32, 0x4c, 0xb1, 0x2a, 0xcf, 0xf2, 0x88, 0xe7, 0x64, 0xba, 0x96,
0x3c, 0x55, 0xc4, 0x5d, 0x80, 0x48, 0x84, 0x50, 0xb7, 0x3c, 0x59, 0xc2, 0xad, 0x72, 0x9a, 0x06,
0x59, 0xaf, 0x43, 0x28, 0xfd, 0x66, 0x9f, 0x87, 0xb3, 0x07, 0x18, 0x59, 0x1d, 0x71, 0x7f, 0xc4,
0x53, 0x5a, 0x7d, 0x11, 0x58, 0x0a, 0x0b, 0x54, 0x5f, 0x89, 0x6d, 0x1f, 0xf3, 0x34, 0x0b, 0xe2,
0x88, 0x6c, 0x4f, 0xcb, 0x53, 0x45, 0xf7, 0x63, 0xda, 0xd1, 0x75, 0xc8, 0xfb, 0x98, 0xcc, 0x11,
0xbb, 0x00, 0x2d, 0x31, 0xc6, 0xec, 0xc8, 0x97, 0x4e, 0xc6, 0x12, 0x01, 0xfb, 0x47, 0x3e, 0x2a,
0xb0, 0x35, 0x6d, 0x22, 0x84, 0x6f, 0x13, 0xb6, 0x2b, 0x66, 0xed, 0x4d, 0xe8, 0xaa, 0x60, 0x3a,
0x1b, 0x84, 0xfc, 0x30, 0x57, 0x01, 0x42, 0x34, 0x9d, 0x60, 0x73, 0xd9, 0x03, 0x7e, 0x98, 0xbb,
0x0f, 0x61, 0x4d, 0xea, 0xed, 0xd7, 0x12, 0xae, 0x9a, 0xfe, 0x62, 0x79, 0x53, 0x13, 0x5e, 0xc5,
0xba, 0xad, 0xe8, 0x14, 0xe5, 0x94, 0x76, 0x3a, 0xd7, 0x03, 0x26, 0xab, 0x6f, 0x87, 0x71, 0xc6,
0x25, 0x43, 0x17, 0x3a, 0xc3, 0x30, 0xce, 0x54, 0x18, 0x22, 0x87, 0x63, 0x61, 0x38, 0x3f, 0xd9,
0x74, 0x38, 0x44, 0x4b, 0x20, 0x6c, 0x9a, 0x2a, 0xba, 0x7f, 0xe6, 0xc0, 0x3a, 0x71, 0x53, 0x16,
0x46, 0xfb, 0xae, 0xaf, 0xde, 0xcd, 0xce, 0xd0, 0x0c, 0xcd, 0x36, 0x60, 0xfe, 0x30, 0x4e, 0x87,
0x5c, 0xb6, 0x24, 0x0a, 0x3f, 0xbe, 0x37, 0xde, 0xac, 0x78, 0xe3, 0x3f, 0x74, 0x60, 0x8d, 0xba,
0xba, 0x9f, 0xfb, 0xf9, 0x34, 0x93, 0xc3, 0xff, 0x05, 0x58, 0xc6, 0xa1, 0x72, 0xa5, 0x4e, 0xb2,
0xa3, 0x1b, 0x5a, 0xf3, 0x09, 0x15, 0xc4, 0xbb, 0x67, 0x3c, 0x9b, 0x98, 0x7d, 0x19, 0x3a, 0x66,
0x46, 0x84, 0xfa, 0xdc, 0xde, 0x39, 0xaf, 0x46, 0x59, 0x91, 0x9c, 0xdd, 0x33, 0x9e, 0xf5, 0x01,
0xbb, 0x01, 0x40, 0xee, 0x06, 0xb1, 0x95, 0xa1, 0xec, 0x79, 0x7b, 0x92, 0x8c, 0xc5, 0xda, 0x3d,
0xe3, 0x19, 0xe4, 0xb7, 0x96, 0x60, 0x41, 0xec, 0x8f, 0xee, 0x7d, 0x58, 0xb6, 0x7a, 0x6a, 0x45,
0x19, 0x1d, 0x11, 0x65, 0x54, 0x82, 0xd2, 0x46, 0x35, 0x28, 0x75, 0xff, 0xa5, 0x01, 0x0c, 0xa5,
0xad, 0xb4, 0x9c, 0xb8, 0x41, 0xc7, 0x23, 0xcb, 0xdd, 0xea, 0x78, 0x26, 0xc4, 0xae, 0x01, 0x33,
0x8a, 0x2a, 0xf7, 0x20, 0xf6, 0x8d, 0x9a, 0x1a, 0x34, 0x70, 0xc2, 0x57, 0x52, 0x31, 0xb0, 0x74,
0x2c, 0xc5, 0xba, 0xd5, 0xd6, 0xe1, 0xd6, 0x90, 0x4c, 0xb3, 0x23, 0x74, 0x20, 0x94, 0x43, 0xa6,
0xca, 0x65, 0x01, 0x59, 0x78, 0xa9, 0x80, 0x2c, 0x96, 0x05, 0xc4, 0x74, 0x09, 0x96, 0x2c, 0x97,
0x00, 0xfd, 0xaf, 0x49, 0x10, 0x91, 0x5f, 0x31, 0x98, 0x60, 0xeb, 0xd2, 0xff, 0xb2, 0x40, 0xb6,
0x05, 0xab, 0xd2, 0xaf, 0x2b, 0xfc, 0x0e, 0xa0, 0x39, 0xae, 0xe0, 0xee, 0xa7, 0x0e, 0xac, 0xe2,
0x3c, 0x5b, 0xb2, 0xf8, 0x1e, 0x90, 0x2a, 0xbc, 0xa2, 0x28, 0x5a, 0xb4, 0x3f, 0xbd, 0x24, 0xbe,
0x0b, 0x2d, 0x62, 0x18, 0x27, 0x3c, 0x92, 0x82, 0xd8, 0xb3, 0x05, 0xb1, 0xb0, 0x42, 0xbb, 0x67,
0xbc, 0x82, 0xd8, 0x10, 0xc3, 0xbf, 0x77, 0xa0, 0x2d, 0xbb, 0xf9, 0x13, 0xc7, 0x12, 0x7d, 0x58,
0x42, 0x89, 0x34, 0x1c, 0x76, 0x5d, 0xc6, 0xdd, 0x64, 0x82, 0x01, 0x1b, 0x6e, 0x9f, 0x56, 0x1c,
0x51, 0x86, 0x71, 0x2f, 0x24, 0x83, 0x9b, 0x0d, 0xf2, 0x20, 0x1c, 0xa8, 0x5a, 0x99, 0x80, 0xac,
0xab, 0x42, 0xbb, 0x93, 0xe5, 0xfe, 0x98, 0xcb, 0x6d, 0x4e, 0x14, 0x30, 0x60, 0x92, 0x03, 0x2a,
0xb9, 0x83, 0xee, 0x5f, 0x77, 0xe0, 0x5c, 0xa5, 0x4a, 0x27, 0xd0, 0xa5, 0x83, 0x1c, 0x06, 0x93,
0x83, 0x58, 0xfb, 0xda, 0x8e, 0xe9, 0x3b, 0x5b, 0x55, 0x6c, 0x0c, 0x67, 0xd5, 0x7e, 0x8e, 0x73,
0x5a, 0xec, 0xde, 0x0d, 0x72, 0x44, 0xde, 0xb6, 0x65, 0xa0, 0xdc, 0xa0, 0xc2, 0x4d, 0xcd, 0xad,
0xe7, 0xc7, 0x8e, 0xa0, 0xa7, 0x1d, 0x07, 0x69, 0xe2, 0x0d, 0xe7, 0x02, 0xdb, 0x7a, 0xeb, 0x25,
0x6d, 0x91, 0x3d, 0x1a, 0xa9, 0x66, 0x4e, 0xe5, 0xc6, 0x66, 0x70, 0x49, 0xd5, 0x91, 0x0d, 0xaf,
0xb6, 0xd7, 0x7c, 0xa5, 0xb1, 0xdd, 0xc3, 0x8f, 0xed, 0x46, 0x5f, 0xc2, 0x98, 0x7d, 0x08, 0x9b,
0x27, 0x7e, 0x90, 0xab, 0x6e, 0x19, 0xce, 0xd0, 0x3c, 0x35, 0xb9, 0xf3, 0x92, 0x26, 0x9f, 0x88,
0x8f, 0xad, 0x8d, 0xed, 0x14, 0x8e, 0xfd, 0xbf, 0x75, 0xa0, 0x6b, 0xf3, 0x41, 0x31, 0x95, 0x0a,
0xaf, 0x0c, 0x9f, 0x72, 0xfe, 0x4a, 0x70, 0x35, 0x44, 0x6d, 0xd4, 0x85, 0xa8, 0x66, 0x20, 0x3a,
0xf7, 0xb2, 0x40, 0xb4, 0xf9, 0x6a, 0x81, 0xe8, 0x7c, 0x5d, 0x20, 0xda, 0xff, 0x4f, 0x07, 0x58,
0x55, 0x96, 0xd8, 0x7d, 0x11, 0x23, 0x47, 0x3c, 0x94, 0x36, 0xe9, 0xe7, 0x5e, 0x4d, 0x1e, 0xd5,
0xdc, 0xa9, 0xaf, 0x51, 0x31, 0x4c, 0xa3, 0x63, 0xba, 0x48, 0xcb, 0x5e, 0x5d, 0x55, 0x29, 0x34,
0x6e, 0xbe, 0x3c, 0x34, 0x9e, 0x7f, 0x79, 0x68, 0xbc, 0x50, 0x0e, 0x8d, 0xfb, 0xbf, 0xeb, 0xc0,
0x7a, 0xcd, 0xa2, 0xff, 0xec, 0x06, 0x8e, 0xcb, 0x64, 0xd9, 0x82, 0x86, 0x5c, 0x26, 0x13, 0xec,
0xff, 0x06, 0x2c, 0x5b, 0x82, 0xfe, 0xb3, 0x6b, 0xbf, 0xec, 0xe5, 0x09, 0x39, 0xb3, 0xb0, 0xfe,
0x8f, 0x1a, 0xc0, 0xaa, 0xca, 0xf6, 0x7f, 0xda, 0x87, 0xea, 0x3c, 0xcd, 0xd5, 0xcc, 0xd3, 0xff,
0xea, 0x3e, 0xf0, 0x16, 0xac, 0xc9, 0xd3, 0x36, 0x23, 0x4b, 0x22, 0x24, 0xa6, 0x5a, 0x81, 0x7e,
0xae, 0x9d, 0x97, 0x58, 0xb2, 0x8e, 0x89, 0x8c, 0xcd, 0xb0, 0x94, 0x9e, 0x70, 0x37, 0x61, 0x43,
0x9c, 0xde, 0xdd, 0x12, 0xac, 0xd4, 0xbe, 0xf2, 0x27, 0x0e, 0x9c, 0x2d, 0x55, 0x14, 0x67, 0x29,
0x62, 0xeb, 0xb0, 0xf7, 0x13, 0x1b, 0xc4, 0xfe, 0x4b, 0x3d, 0x32, 0xfa, 0x2f, 0xa4, 0xad, 0x5a,
0x81, 0xf3, 0x33, 0x8d, 0xaa, 0xf4, 0x62, 0xd6, 0xeb, 0xaa, 0xdc, 0x73, 0x70, 0x56, 0xae, 0x6c,
0xa9, 0xe3, 0x87, 0xb0, 0x59, 0xae, 0x28, 0x92, 0xc3, 0x76, 0x97, 0x55, 0x11, 0xbd, 0x40, 0x6b,
0x9b, 0xb2, 0xfb, 0x5b, 0x5b, 0xe7, 0xfe, 0x3a, 0xb0, 0xaf, 0x4f, 0x79, 0x3a, 0xa3, 0x93, 0x1e,
0x9d, 0x9d, 0x39, 0x57, 0x4e, 0x63, 0x2c, 0x24, 0xd3, 0x83, 0xaf, 0xf2, 0x99, 0x3a, 0x4a, 0x6b,
0x14, 0x47, 0x69, 0xaf, 0x01, 0x60, 0xf4, 0x45, 0x47, 0x43, 0xea, 0x70, 0x13, 0xc3, 0x5e, 0xc1,
0xd0, 0xbd, 0x01, 0xeb, 0x16, 0x7f, 0x3d, 0xfb, 0x0b, 0xf2, 0x0b, 0x91, 0x1b, 0xb0, 0x0f, 0x9c,
0x64, 0x9d, 0xfb, 0xef, 0x0e, 0xcc, 0xed, 0xc6, 0x89, 0x99, 0x55, 0x74, 0xec, 0xac, 0xa2, 0x34,
0xf9, 0x03, 0x6d, 0xd1, 0xa5, 0x25, 0xb0, 0x40, 0xb6, 0x05, 0x5d, 0x7f, 0x92, 0x63, 0x74, 0x7c,
0x18, 0xa7, 0x27, 0x7e, 0x3a, 0x12, 0x4b, 0x72, 0xab, 0xd1, 0x73, 0xbc, 0x52, 0x0d, 0xdb, 0x80,
0x39, 0x6d, 0x1b, 0x89, 0x00, 0x8b, 0xe8, 0x5f, 0x51, 0x72, 0x75, 0x26, 0x03, 0x7b, 0x59, 0xc2,
0x15, 0xb7, 0xbf, 0x17, 0x1e, 0xad, 0x90, 0xf0, 0xba, 0x2a, 0xdc, 0x7e, 0xd0, 0x54, 0x12, 0x99,
0xcc, 0xc8, 0xa8, 0xb2, 0xfb, 0xaf, 0x0e, 0xcc, 0xd3, 0x0c, 0xa0, 0x4e, 0x0a, 0x41, 0xa4, 0xb3,
0x5b, 0xca, 0x04, 0x3b, 0x42, 0x27, 0x4b, 0x30, 0x73, 0xad, 0x13, 0xdd, 0x86, 0xee, 0xb6, 0x79,
0xaa, 0x7b, 0x19, 0x5a, 0xa2, 0xa4, 0x8f, 0x41, 0x89, 0xa4, 0x00, 0xd9, 0x25, 0x68, 0x1e, 0xc5,
0x89, 0x72, 0x22, 0x40, 0x25, 0x02, 0xe3, 0xc4, 0x23, 0xbc, 0xe8, 0x0f, 0xf2, 0x13, 0x9d, 0x17,
0x5b, 0x43, 0x19, 0xc6, 0xcd, 0x51, 0xb3, 0x35, 0x27, 0xa3, 0x84, 0xba, 0x5b, 0xb0, 0xf2, 0x30,
0x1e, 0x71, 0x23, 0xf5, 0x73, 0xaa, 0xd4, 0xb9, 0xbf, 0xe9, 0xc0, 0x92, 0x22, 0x66, 0x57, 0xa1,
0x89, 0x3b, 0x7e, 0xc9, 0x9f, 0xd7, 0x07, 0x00, 0x48, 0xe7, 0x11, 0x05, 0x9a, 0x48, 0x4a, 0x0c,
0x14, 0xde, 0x9f, 0x4a, 0x0b, 0x14, 0xce, 0x8d, 0xee, 0x6e, 0xc9, 0x27, 0x28, 0xa1, 0xee, 0x9f,
0x3b, 0xb0, 0x6c, 0xb5, 0x81, 0x51, 0x5c, 0xe8, 0x67, 0xb9, 0x4c, 0xaa, 0xca, 0xe5, 0x31, 0x21,
0x33, 0x19, 0xd8, 0xb0, 0x93, 0x81, 0x3a, 0x4d, 0x35, 0x67, 0xa6, 0xa9, 0xae, 0x43, 0xab, 0x38,
0x77, 0x6f, 0x5a, 0xa6, 0x0f, 0x5b, 0x54, 0x47, 0x1b, 0x05, 0x11, 0xf2, 0x19, 0xc6, 0x61, 0x9c,
0xca, 0x63, 0x69, 0x51, 0x70, 0x6f, 0x40, 0xdb, 0xa0, 0xc7, 0x6e, 0x44, 0x3c, 0x3f, 0x89, 0xd3,
0xa7, 0x2a, 0x27, 0x29, 0x8b, 0xfa, 0x04, 0xaf, 0x51, 0x9c, 0xe0, 0xb9, 0x7f, 0xe1, 0xc0, 0x32,
0xca, 0x60, 0x10, 0x8d, 0xf7, 0xe2, 0x30, 0x18, 0xce, 0x68, 0xed, 0x95, 0xb8, 0xc9, 0xf3, 0x6a,
0x25, 0x8b, 0x36, 0x8c, 0xb2, 0xad, 0x82, 0x38, 0xa9, 0x88, 0xba, 0x8c, 0x9a, 0x8a, 0x72, 0x7e,
0xe0, 0x67, 0x52, 0xf8, 0xe5, 0x5e, 0x64, 0x81, 0xa8, 0x4f, 0x08, 0xa4, 0x7e, 0xce, 0x07, 0x93,
0x20, 0x0c, 0x03, 0x41, 0x2b, 0x3c, 0x95, 0xba, 0x2a, 0xf7, 0x07, 0x0d, 0x68, 0x4b, 0x4b, 0x79,
0x77, 0x34, 0x16, 0xd9, 0x7f, 0xe9, 0xef, 0x69, 0x73, 0x61, 0x20, 0xaa, 0xde, 0xf2, 0x10, 0x0d,
0xa4, 0xbc, 0xac, 0x73, 0xd5, 0x65, 0xbd, 0x08, 0x2d, 0x14, 0xaf, 0xb7, 0xc9, 0x15, 0x15, 0xd7,
0x34, 0x0a, 0x40, 0xd5, 0xee, 0x50, 0xed, 0x7c, 0x51, 0x4b, 0x80, 0xe5, 0x7c, 0x2e, 0x94, 0x9c,
0xcf, 0x77, 0xa1, 0x23, 0xd9, 0xd0, 0xbc, 0x93, 0x75, 0x28, 0x04, 0xdc, 0x5a, 0x13, 0xcf, 0xa2,
0x54, 0x5f, 0xee, 0xa8, 0x2f, 0x97, 0x5e, 0xf6, 0xa5, 0xa2, 0xa4, 0xc3, 0x30, 0x31, 0x37, 0xf7,
0x53, 0x3f, 0x39, 0x52, 0xbb, 0xcf, 0x48, 0x9f, 0xf0, 0x13, 0xcc, 0xb6, 0x60, 0x1e, 0x3f, 0x53,
0xd6, 0xba, 0x5e, 0xe9, 0x04, 0x09, 0xbb, 0x0a, 0xf3, 0x7c, 0x34, 0xe6, 0x2a, 0xd8, 0x62, 0x76,
0xd8, 0x8b, 0x6b, 0xe4, 0x09, 0x02, 0x34, 0x01, 0x88, 0x96, 0x4c, 0x80, 0x6d, 0xe9, 0x17, 0xb0,
0xf8, 0xfe, 0xc8, 0xdd, 0x00, 0xf6, 0x50, 0x48, 0xad, 0x99, 0x2c, 0xfe, 0x9d, 0x39, 0x68, 0x1b,
0x30, 0x6a, 0xf3, 0x18, 0x3b, 0x3c, 0x18, 0x05, 0xfe, 0x84, 0xe7, 0x3c, 0x95, 0x92, 0x5a, 0x42,
0x91, 0xce, 0x3f, 0x1e, 0x0f, 0xe2, 0x69, 0x3e, 0x18, 0xf1, 0x71, 0xca, 0xc5, 0x1e, 0x89, 0x9b,
0x81, 0x85, 0x22, 0xdd, 0xc4, 0x7f, 0x66, 0xd2, 0x09, 0x79, 0x28, 0xa1, 0x2a, 0xf5, 0x2b, 0xe6,
0xa8, 0x59, 0xa4, 0x7e, 0xc5, 0x8c, 0x94, 0xed, 0xd0, 0x7c, 0x8d, 0x1d, 0x7a, 0x07, 0x36, 0x85,
0xc5, 0x91, 0xba, 0x39, 0x28, 0x89, 0xc9, 0x29, 0xb5, 0x6c, 0x0b, 0x56, 0xb1, 0xcf, 0x4a, 0xc0,
0xb3, 0xe0, 0x63, 0x91, 0x8c, 0x71, 0xbc, 0x0a, 0x8e, 0xb4, 0xa8, 0x8e, 0x16, 0xad, 0x38, 0x1e,
0xab, 0xe0, 0x44, 0xeb, 0x3f, 0xb3, 0x69, 0x5b, 0x92, 0xb6, 0x84, 0xbb, 0xcb, 0xd0, 0xde, 0xcf,
0xe3, 0x44, 0x2d, 0x4a, 0x17, 0x3a, 0xa2, 0x28, 0x0f, 0x43, 0x2f, 0xc0, 0x79, 0x92, 0xa2, 0x47,
0x71, 0x12, 0x87, 0xf1, 0x78, 0xb6, 0x3f, 0x3d, 0xc8, 0x86, 0x69, 0x90, 0x60, 0x60, 0xe2, 0xfe,
0x9d, 0x03, 0xeb, 0x56, 0xad, 0xcc, 0xde, 0x7c, 0x5e, 0x88, 0xb4, 0x3e, 0xc5, 0x12, 0x82, 0xb7,
0x66, 0x98, 0x43, 0x41, 0x28, 0xf2, 0x66, 0x8f, 0xe5, 0xc1, 0xd6, 0x4d, 0x58, 0x51, 0x3d, 0x53,
0x1f, 0x0a, 0x29, 0xec, 0x55, 0xa5, 0x50, 0x7e, 0xdf, 0x95, 0x1f, 0x28, 0x16, 0xbf, 0x28, 0xfc,
0x6a, 0x3e, 0xa2, 0x31, 0xaa, 0x30, 0xbe, 0xaf, 0xbe, 0x37, 0x9d, 0x79, 0xd5, 0x83, 0xa1, 0x06,
0x33, 0xf7, 0xf7, 0x1d, 0x80, 0xa2, 0x77, 0x28, 0x18, 0x85, 0x49, 0x17, 0x37, 0xfe, 0x0c, 0xf3,
0xfd, 0x06, 0x74, 0xf4, 0x01, 0x46, 0xb1, 0x4b, 0xb4, 0x15, 0x86, 0x0e, 0xd7, 0x15, 0x58, 0x19,
0x87, 0xf1, 0x01, 0x6d, 0xb1, 0x74, 0xba, 0x9e, 0xc9, 0x23, 0xe1, 0xae, 0x80, 0xef, 0x49, 0xb4,
0xd8, 0x52, 0x9a, 0xc6, 0x96, 0xe2, 0x7e, 0xa7, 0xa1, 0xd3, 0xde, 0xc5, 0x98, 0x4f, 0xd5, 0x32,
0xb6, 0x53, 0x31, 0x8e, 0xa7, 0x64, 0x99, 0x29, 0x61, 0xb5, 0xf7, 0xd2, 0x78, 0xfa, 0x06, 0x74,
0x53, 0x61, 0x7d, 0x94, 0x69, 0x6a, 0xbe, 0xc0, 0x34, 0x2d, 0xa7, 0xd6, 0xbe, 0xf3, 0xff, 0x60,
0xd5, 0x1f, 0x1d, 0xf3, 0x34, 0x0f, 0x28, 0xa2, 0xa1, 0x4d, 0x5f, 0x18, 0xd4, 0x15, 0x03, 0xa7,
0xbd, 0xf8, 0x0a, 0xac, 0xc8, 0x63, 0x78, 0x4d, 0x29, 0x2f, 0x5f, 0x15, 0x30, 0x12, 0xba, 0xdf,
0x57, 0x19, 0x76, 0x7b, 0x0d, 0x4f, 0x9f, 0x11, 0x73, 0x74, 0x8d, 0xd2, 0xe8, 0x3e, 0x23, 0xb3,
0xdd, 0x23, 0x15, 0x36, 0xc9, 0x73, 0x07, 0x01, 0xca, 0xd3, 0x09, 0x7b, 0x4a, 0x9b, 0xaf, 0x32,
0xa5, 0xee, 0xa7, 0x0e, 0x2c, 0xee, 0xc6, 0xc9, 0xae, 0x3c, 0x51, 0x27, 0x45, 0xd0, 0x97, 0x5c,
0x54, 0xd1, 0xf4, 0x8a, 0x1b, 0x15, 0xaf, 0xb8, 0xba, 0xd7, 0x2e, 0x97, 0xf7, 0xda, 0x5f, 0x82,
0x0b, 0x14, 0xb4, 0xa7, 0x71, 0x12, 0xa7, 0xa8, 0x8c, 0x7e, 0x28, 0x36, 0xd6, 0x38, 0xca, 0x8f,
0x94, 0x19, 0x7b, 0x11, 0x09, 0x45, 0x47, 0x61, 0x7e, 0x3c, 0x10, 0xce, 0xb0, 0xf4, 0x0d, 0x84,
0x75, 0xab, 0x56, 0xb8, 0x5f, 0x84, 0x16, 0x39, 0xb7, 0x34, 0xac, 0xb7, 0xa0, 0x75, 0x14, 0x27,
0x83, 0xa3, 0x20, 0xca, 0x95, 0x72, 0x77, 0x0b, 0xaf, 0x73, 0x97, 0x26, 0x44, 0x13, 0xb8, 0x3f,
0x9a, 0x83, 0xc5, 0xf7, 0xa3, 0xe3, 0x38, 0x18, 0x52, 0x32, 0x7e, 0xc2, 0x27, 0xb1, 0xba, 0xf2,
0x83, 0xbf, 0x71, 0x2a, 0xe8, 0xf8, 0x3b, 0xc9, 0x65, 0x36, 0x5d, 0x15, 0x71, 0xbb, 0x4f, 0x8b,
0x6b, 0x70, 0x42, 0x75, 0x0c, 0x04, 0x1d, 0xfb, 0xd4, 0xbc, 0x03, 0x28, 0x4b, 0xc5, 0x9d, 0xa9,
0x79, 0xe3, 0xce, 0x14, 0x1d, 0xdd, 0x88, 0x93, 0x7d, 0x92, 0xaf, 0x25, 0x4f, 0x15, 0x29, 0x10,
0x49, 0xb9, 0x48, 0xb6, 0x90, 0xe3, 0xb0, 0x28, 0x03, 0x11, 0x13, 0x44, 0xe7, 0x42, 0x7c, 0x20,
0x68, 0x84, 0xf1, 0x35, 0x21, 0x74, 0xb6, 0xca, 0xd7, 0x08, 0x5b, 0x42, 0xe6, 0x4b, 0x30, 0x5a,
0xe8, 0x11, 0xd7, 0x86, 0x54, 0x8c, 0x01, 0xc4, 0x35, 0xbf, 0x32, 0x6e, 0x84, 0x2f, 0xe2, 0x86,
0x82, 0x0a, 0x5f, 0x50, 0x50, 0xfc, 0x30, 0x3c, 0xf0, 0x87, 0x4f, 0xe9, 0x72, 0x27, 0x5d, 0x48,
0x68, 0x79, 0x36, 0x88, 0xbd, 0x36, 0x56, 0x93, 0x0e, 0xff, 0x9a, 0x9e, 0x09, 0xb1, 0x1d, 0x68,
0x53, 0xc8, 0x26, 0xd7, 0xb3, 0x4b, 0xeb, 0xb9, 0x6a, 0xc6, 0x74, 0xb4, 0xa2, 0x26, 0x91, 0x79,
0x40, 0xb0, 0x62, 0xdf, 0x19, 0xf8, 0x06, 0xb0, 0x9b, 0xa3, 0x91, 0x5c, 0x6f, 0x1d, 0x32, 0x16,
0x2b, 0xe5, 0x58, 0x2b, 0x55, 0x33, 0x63, 0x8d, 0xda, 0x19, 0x73, 0xef, 0x42, 0x7b, 0xcf, 0xb8,
0xe1, 0x49, 0xa2, 0xa1, 0xee, 0x76, 0x4a, 0x71, 0x32, 0x10, 0xa3, 0xc1, 0x86, 0xd9, 0xa0, 0xfb,
0xf3, 0xc0, 0x1e, 0x04, 0x59, 0xae, 0xfb, 0x27, 0x96, 0xe3, 0x0d, 0xe8, 0xe8, 0x00, 0xbb, 0xb8,
0xd1, 0xd0, 0x96, 0x18, 0xdd, 0x34, 0xb8, 0x29, 0xae, 0x42, 0x94, 0x07, 0xb6, 0x05, 0x4b, 0x81,
0x80, 0xca, 0x9a, 0xa0, 0x28, 0x75, 0x3d, 0xfa, 0x6b, 0x12, 0xb4, 0x76, 0xd1, 0x1f, 0x38, 0xb0,
0x28, 0x87, 0x86, 0xde, 0x86, 0x75, 0xb7, 0x55, 0x0c, 0xcc, 0xc2, 0xea, 0x6f, 0x04, 0x56, 0x65,
0x78, 0xae, 0x4e, 0x86, 0x19, 0x34, 0x13, 0x3f, 0x3f, 0xa2, 0x00, 0xa5, 0xe5, 0xd1, 0x6f, 0xb6,
0x2a, 0x82, 0x66, 0xa1, 0x2b, 0x14, 0x30, 0xd7, 0x5d, 0x42, 0x15, 0x26, 0xb9, 0x82, 0xe3, 0xa0,
0xe8, 0xf2, 0x80, 0xc0, 0xf5, 0x99, 0x80, 0xbc, 0x98, 0x51, 0xc0, 0xc5, 0x7c, 0x49, 0x16, 0xe5,
0xf9, 0x92, 0xa4, 0x9e, 0xae, 0x77, 0xfb, 0xd0, 0xbb, 0xc3, 0x43, 0x9e, 0xf3, 0x9b, 0x61, 0x58,
0xe6, 0x7f, 0x01, 0xce, 0xd7, 0xd4, 0x49, 0xa7, 0xe5, 0x1e, 0xac, 0xdd, 0xe1, 0x07, 0xd3, 0xf1,
0x03, 0x7e, 0x5c, 0x1c, 0xdc, 0x31, 0x68, 0x66, 0x47, 0xf1, 0x89, 0x5c, 0x5b, 0xfa, 0xcd, 0x5e,
0x03, 0x08, 0x91, 0x66, 0x90, 0x25, 0x7c, 0xa8, 0xee, 0xc2, 0x11, 0xb2, 0x9f, 0xf0, 0xa1, 0xfb,
0x0e, 0x30, 0x93, 0x8f, 0x1c, 0x02, 0xda, 0x81, 0xe9, 0xc1, 0x20, 0x9b, 0x65, 0x39, 0x9f, 0xa8,
0x4b, 0x7e, 0x26, 0xe4, 0x5e, 0x81, 0xce, 0x9e, 0x3f, 0xf3, 0xf8, 0x47, 0xf2, 0x7a, 0x31, 0xc6,
0xc6, 0xfe, 0x0c, 0x45, 0x59, 0xc7, 0xc6, 0x54, 0xed, 0xfe, 0x47, 0x03, 0x16, 0x04, 0x25, 0x72,
0x1d, 0xf1, 0x2c, 0x0f, 0x22, 0x71, 0x68, 0x25, 0xb9, 0x1a, 0x50, 0x45, 0x36, 0x1a, 0x35, 0xb2,
0x21, 0xbd, 0x55, 0x75, 0xaf, 0x48, 0x0a, 0x81, 0x85, 0xa1, 0x5b, 0x53, 0x5c, 0x06, 0x10, 0xc1,
0x59, 0x01, 0x94, 0x92, 0x25, 0x85, 0xb5, 0x11, 0xfd, 0x53, 0x42, 0x2b, 0xc5, 0xc1, 0x84, 0x6a,
0x6d, 0xda, 0xa2, 0x90, 0x9a, 0x8a, 0x4d, 0xab, 0xd8, 0xae, 0xa5, 0x57, 0xb0, 0x5d, 0xc2, 0x85,
0x7d, 0x91, 0xed, 0x82, 0x57, 0xb0, 0x5d, 0x2e, 0x83, 0xd5, 0x7b, 0x9c, 0x7b, 0x1c, 0x77, 0x45,
0x25, 0x4e, 0xdf, 0x75, 0x60, 0x55, 0x6e, 0xe8, 0xba, 0x8e, 0xbd, 0x61, 0xed, 0xfe, 0x4e, 0xdd,
0x79, 0xc4, 0x9b, 0xb0, 0x4c, 0x7b, 0xb2, 0xce, 0x0a, 0xc9, 0x14, 0x96, 0x05, 0xe2, 0x38, 0x54,
0x86, 0x7d, 0x12, 0x84, 0x72, 0x51, 0x4c, 0x48, 0x25, 0x96, 0x30, 0x3e, 0xa6, 0x25, 0x71, 0x3c,
0x5d, 0x76, 0xff, 0xca, 0x81, 0x35, 0xa3, 0xc3, 0x52, 0x0a, 0x6f, 0x80, 0xba, 0x2c, 0x20, 0x92,
0x47, 0x42, 0x99, 0xce, 0xd9, 0xce, 0x49, 0xf1, 0x99, 0x45, 0x4c, 0x8b, 0xe9, 0xcf, 0xa8, 0x83,
0xd9, 0x74, 0x22, 0x3d, 0x10, 0x13, 0x42, 0x41, 0x3a, 0xe1, 0xfc, 0xa9, 0x26, 0x99, 0x23, 0x12,
0x0b, 0xa3, 0xb3, 0x60, 0xf4, 0x25, 0x34, 0x91, 0xb8, 0xfe, 0x64, 0x83, 0xee, 0x3f, 0x38, 0xb0,
0x2e, 0x9c, 0x42, 0xe9, 0x72, 0xeb, 0xab, 0x99, 0x0b, 0xc2, 0x0b, 0x16, 0x1a, 0xb9, 0x7b, 0xc6,
0x93, 0x65, 0xf6, 0x85, 0x57, 0x74, 0x64, 0xf5, 0x1d, 0x80, 0x53, 0xd6, 0x62, 0xae, 0x6e, 0x2d,
0x5e, 0x30, 0xd3, 0x75, 0xc9, 0x92, 0xf9, 0xda, 0x64, 0xc9, 0xad, 0x45, 0x98, 0xcf, 0x86, 0x71,
0xc2, 0xdd, 0x4d, 0xd8, 0xb0, 0x07, 0x27, 0x4d, 0xd0, 0xf7, 0x1c, 0xe8, 0xdd, 0x13, 0xa9, 0xc3,
0x20, 0x1a, 0xef, 0x06, 0x59, 0x1e, 0xa7, 0xfa, 0x2e, 0xfa, 0x25, 0x80, 0x2c, 0xf7, 0xd3, 0x5c,
0xdc, 0xd1, 0x92, 0x69, 0x8e, 0x02, 0xc1, 0x3e, 0xf2, 0x68, 0x24, 0x6a, 0xc5, 0xda, 0xe8, 0x32,
0x2e, 0x0c, 0xdd, 0x4f, 0x18, 0xc4, 0x87, 0x87, 0x19, 0xd7, 0x6e, 0xab, 0x89, 0x61, 0xe4, 0x8b,
0x1a, 0x8f, 0xb1, 0x1e, 0x3f, 0x26, 0x53, 0x2b, 0xfc, 0xc1, 0x12, 0xea, 0xfe, 0xa5, 0x03, 0x2b,
0x45, 0x27, 0xef, 0x22, 0x68, 0x5b, 0x07, 0xd1, 0x35, 0xc3, 0x3a, 0xa8, 0x04, 0x4c, 0x30, 0x1a,
0x04, 0x91, 0xec, 0x9b, 0x81, 0x90, 0xc6, 0xca, 0x52, 0x3c, 0x55, 0xf7, 0xe1, 0x4c, 0x48, 0x1c,
0x76, 0xe7, 0xf8, 0xb5, 0xb8, 0x0c, 0x27, 0x4b, 0x74, 0xc5, 0x6e, 0x92, 0xd3, 0x57, 0x0b, 0xc2,
0x21, 0x96, 0x45, 0xb5, 0x3f, 0x2d, 0x12, 0x8a, 0x3f, 0xdd, 0x3f, 0x70, 0xe0, 0x7c, 0xcd, 0xe4,
0x4a, 0xcd, 0xb8, 0x03, 0x6b, 0x87, 0xba, 0x52, 0x4d, 0x80, 0x50, 0x8f, 0x4d, 0x29, 0x45, 0xa5,
0x41, 0x7b, 0xd5, 0x0f, 0xd0, 0x3d, 0xa6, 0xbc, 0x91, 0x98, 0x52, 0xeb, 0x9e, 0x48, 0xb5, 0x62,
0xe7, 0xfb, 0x0d, 0xe8, 0x8a, 0xa3, 0x0a, 0xf1, 0x1a, 0x89, 0xa7, 0xec, 0x03, 0x58, 0x94, 0xaf,
0xc9, 0xd8, 0x59, 0xd9, 0xac, 0xfd, 0x7e, 0xad, 0xbf, 0x59, 0x86, 0xa5, 0xec, 0xac, 0xff, 0xf6,
0xa7, 0xff, 0xfc, 0x87, 0x8d, 0x65, 0xd6, 0xde, 0x3e, 0x7e, 0x7b, 0x7b, 0xcc, 0xa3, 0x0c, 0x79,
0xfc, 0x2a, 0x40, 0xf1, 0xce, 0x8a, 0xf5, 0xb4, 0x93, 0x51, 0x7a, 0x40, 0xd6, 0x3f, 0x5f, 0x53,
0x23, 0xf9, 0x9e, 0x27, 0xbe, 0xeb, 0x6e, 0x17, 0xf9, 0x06, 0x51, 0x90, 0x8b, 0x47, 0x57, 0xef,
0x39, 0x5b, 0x6c, 0x04, 0x1d, 0xf3, 0x19, 0x15, 0x53, 0x21, 0x73, 0xcd, 0x23, 0xae, 0xfe, 0x85,
0xda, 0x3a, 0x95, 0x2f, 0xa0, 0x36, 0xce, 0xba, 0xab, 0xd8, 0xc6, 0x94, 0x28, 0x74, 0x2b, 0x3b,
0xff, 0x78, 0x01, 0x5a, 0x3a, 0xed, 0xc4, 0x3e, 0x84, 0x65, 0xeb, 0x74, 0x87, 0x29, 0xc6, 0x75,
0x87, 0x41, 0xfd, 0x8b, 0xf5, 0x95, 0xb2, 0xd9, 0x4b, 0xd4, 0x6c, 0x8f, 0x6d, 0x62, 0xb3, 0xf2,
0x78, 0x64, 0x9b, 0xce, 0xb4, 0xc4, 0x95, 0xba, 0xa7, 0xd0, 0xb5, 0x4f, 0x64, 0xd8, 0x45, 0xdb,
0xa0, 0x94, 0x5a, 0x7b, 0xed, 0x94, 0x5a, 0xd9, 0xdc, 0x45, 0x6a, 0x6e, 0x93, 0x6d, 0x98, 0xcd,
0xe9, 0x74, 0x10, 0xa7, 0x4b, 0x90, 0xe6, 0xfb, 0x2a, 0xf6, 0x9a, 0x5e, 0xea, 0xba, 0x77, 0x57,
0x7a, 0xd1, 0xaa, 0x8f, 0xaf, 0xdc, 0x1e, 0x35, 0xc5, 0x18, 0x4d, 0xa8, 0xf9, 0xbc, 0x8a, 0x7d,
0x0b, 0x5a, 0xfa, 0x4d, 0x05, 0x3b, 0x67, 0x3c, 0x64, 0x31, 0x1f, 0x7a, 0xf4, 0x7b, 0xd5, 0x8a,
0xba, 0xa5, 0x32, 0x39, 0xa3, 0x40, 0x3c, 0x80, 0xb3, 0xd2, 0x49, 0x3d, 0xe0, 0x3f, 0xce, 0x48,
0x6a, 0x5e, 0x85, 0x5d, 0x77, 0xd8, 0x0d, 0x58, 0x52, 0x4f, 0x55, 0xd8, 0x66, 0xfd, 0x93, 0x9b,
0xfe, 0xb9, 0x0a, 0x2e, 0xf5, 0xf9, 0x26, 0x40, 0xf1, 0xcc, 0x42, 0x4b, 0x7e, 0xe5, 0xf1, 0x87,
0x9e, 0xc4, 0x9a, 0x37, 0x19, 0x63, 0x7a, 0x54, 0x62, 0xbf, 0xe2, 0x60, 0xaf, 0x17, 0xf4, 0xb5,
0xef, 0x3b, 0x5e, 0xc0, 0xd0, 0xdd, 0xa4, 0xb9, 0x5b, 0x65, 0xa4, 0x4a, 0x11, 0x3f, 0x51, 0xd7,
0x81, 0xef, 0x40, 0xdb, 0x78, 0xba, 0xc1, 0x14, 0x87, 0xea, 0xb3, 0x8f, 0x7e, 0xbf, 0xae, 0x4a,
0x76, 0xf7, 0x2b, 0xb0, 0x6c, 0xbd, 0xc1, 0xd0, 0x9a, 0x51, 0xf7, 0xc2, 0x43, 0x6b, 0x46, 0xfd,
0xb3, 0x8d, 0x6f, 0x42, 0xdb, 0x78, 0x31, 0xc1, 0x8c, 0x6b, 0x50, 0xa5, 0xb7, 0x12, 0xba, 0x47,
0x75, 0x0f, 0x2c, 0x36, 0x68, 0xbc, 0x5d, 0xb7, 0x85, 0xe3, 0xa5, 0x3b, 0xb1, 0x28, 0x24, 0x1f,
0x42, 0xd7, 0x7e, 0x43, 0xa1, 0xb5, 0xaa, 0xf6, 0x35, 0x86, 0xd6, 0xaa, 0x53, 0x1e, 0x5e, 0x48,
0x81, 0xdc, 0x5a, 0xd7, 0x8d, 0x6c, 0x7f, 0x22, 0x0f, 0x5d, 0x9e, 0xb3, 0xaf, 0xa3, 0xe9, 0x90,
0x97, 0x94, 0x59, 0xf1, 0x72, 0xc4, 0xbe, 0xca, 0xac, 0xa5, 0xbd, 0x72, 0x9f, 0xd9, 0x5d, 0x23,
0xe6, 0x6d, 0x56, 0x8c, 0x40, 0x58, 0x68, 0xba, 0xac, 0x6c, 0x58, 0x68, 0xf3, 0x3e, 0xb3, 0x61,
0xa1, 0xad, 0x3b, 0xcd, 0x65, 0x0b, 0x9d, 0x07, 0xc8, 0x23, 0x82, 0x95, 0xd2, 0x3d, 0x00, 0xad,
0x2c, 0xf5, 0x17, 0xa7, 0xfa, 0x97, 0x5e, 0x7c, 0x7d, 0xc0, 0x36, 0x33, 0xca, 0xbc, 0x6c, 0xab,
0x7b, 0x6e, 0xbf, 0x06, 0x1d, 0xf3, 0xee, 0xbb, 0xb6, 0xd9, 0x35, 0x37, 0xf6, 0xb5, 0xcd, 0xae,
0xbb, 0x2c, 0xaf, 0x16, 0x97, 0x75, 0xcc, 0x66, 0xd8, 0x37, 0x61, 0xc5, 0xb8, 0xf8, 0xb2, 0x3f,
0x8b, 0x86, 0x5a, 0x78, 0xaa, 0xd7, 0x22, 0xfb, 0x75, 0xfe, 0x99, 0x7b, 0x8e, 0x18, 0xaf, 0xb9,
0x16, 0x63, 0x14, 0x9c, 0xdb, 0xd0, 0x36, 0x2f, 0xd5, 0xbc, 0x80, 0xef, 0x39, 0xa3, 0xca, 0xbc,
0x21, 0x78, 0xdd, 0x61, 0x7f, 0xec, 0x40, 0xc7, 0xba, 0xa2, 0x62, 0xe5, 0x79, 0x4b, 0x7c, 0x7a,
0x66, 0x9d, 0xc9, 0xc8, 0xf5, 0xa8, 0x93, 0x0f, 0xb6, 0xbe, 0x62, 0x4d, 0xf2, 0x27, 0x96, 0x9f,
0x7f, 0xad, 0xfc, 0xac, 0xf1, 0x79, 0x99, 0xc0, 0xbc, 0x3a, 0xfa, 0xfc, 0xba, 0xc3, 0xde, 0x13,
0x4f, 0x5f, 0x55, 0x5c, 0xcf, 0x0c, 0xe3, 0x56, 0x9e, 0x32, 0xf3, 0x95, 0xe8, 0x55, 0xe7, 0xba,
0xc3, 0xbe, 0x2d, 0x5e, 0x2f, 0xca, 0x6f, 0x69, 0xe6, 0x5f, 0xf5, 0x7b, 0xf7, 0x4d, 0x1a, 0xcd,
0x25, 0xf7, 0xbc, 0x35, 0x9a, 0xb2, 0x75, 0xdf, 0x03, 0x28, 0x92, 0x34, 0xac, 0x94, 0xb1, 0xd0,
0x76, 0xaf, 0x9a, 0xc7, 0xb1, 0x57, 0x54, 0x25, 0x36, 0x90, 0xe3, 0xb7, 0x84, 0x30, 0x4a, 0xfa,
0x4c, 0x2f, 0x69, 0x35, 0xd9, 0xd2, 0xef, 0xd7, 0x55, 0xd5, 0x89, 0xa2, 0xe2, 0xcf, 0x1e, 0xc3,
0xf2, 0x83, 0x38, 0x7e, 0x3a, 0x4d, 0x74, 0x1a, 0xd1, 0xce, 0x19, 0xec, 0xfa, 0xd9, 0x51, 0xbf,
0x34, 0x0a, 0xf7, 0x32, 0xb1, 0xea, 0xb3, 0x9e, 0xc1, 0x6a, 0xfb, 0x93, 0x22, 0x45, 0xf4, 0x9c,
0xf9, 0xb0, 0xa6, 0xf7, 0x38, 0xdd, 0xf1, 0xbe, 0xcd, 0xc6, 0xcc, 0xd4, 0x54, 0x9a, 0xb0, 0xbc,
0x0e, 0xd5, 0xdb, 0xed, 0x4c, 0xf1, 0xbc, 0xee, 0xb0, 0x3d, 0xe8, 0xdc, 0xe1, 0xc3, 0x78, 0xc4,
0x65, 0x94, 0xbf, 0x5e, 0x74, 0x5c, 0xa7, 0x07, 0xfa, 0xcb, 0x16, 0x68, 0x6b, 0x7d, 0xe2, 0xcf,
0x52, 0xfe, 0xd1, 0xf6, 0x27, 0x32, 0x7f, 0xf0, 0x5c, 0x69, 0xbd, 0xca, 0x79, 0x58, 0x5a, 0x5f,
0x4a, 0x92, 0x58, 0x5a, 0x5f, 0x49, 0x92, 0x58, 0x53, 0xad, 0x72, 0x2e, 0x2c, 0x84, 0xb5, 0x4a,
0x5e, 0x45, 0xef, 0x94, 0xa7, 0x65, 0x63, 0xfa, 0x97, 0x4f, 0x27, 0xb0, 0x5b, 0xdb, 0xb2, 0x5b,
0xdb, 0x87, 0xe5, 0x3b, 0x5c, 0x4c, 0x96, 0x38, 0xab, 0xec, 0xdb, 0x66, 0xc4, 0x3c, 0xd7, 0x2c,
0x9b, 0x18, 0xaa, 0xb3, 0xcd, 0x3a, 0x1d, 0x14, 0xb2, 0x6f, 0x41, 0xfb, 0x3e, 0xcf, 0xd5, 0xe1,
0xa4, 0xf6, 0x37, 0x4a, 0xa7, 0x95, 0xfd, 0x9a, 0xb3, 0x4d, 0x5b, 0x66, 0x88, 0xdb, 0x36, 0x1f,
0x8d, 0xb9, 0x50, 0xf6, 0x41, 0x30, 0x7a, 0xce, 0x7e, 0x99, 0x98, 0xeb, 0xfb, 0x0c, 0x9b, 0xc6,
0x99, 0x96, 0xc9, 0x7c, 0xa5, 0x84, 0xd7, 0x71, 0x8e, 0xe2, 0x11, 0x37, 0x36, 0xb8, 0x08, 0xda,
0xc6, 0x65, 0x1b, 0xad, 0x40, 0xd5, 0x0b, 0x3e, 0x5a, 0x81, 0x6a, 0xee, 0xe6, 0xb8, 0x57, 0xa9,
0x1d, 0x97, 0x5d, 0x2e, 0xda, 0x11, 0xf7, 0x71, 0x8a, 0x96, 0xb6, 0x3f, 0xf1, 0x27, 0xf9, 0x73,
0xf6, 0x84, 0x5e, 0xef, 0x98, 0x07, 0xb0, 0x85, 0xbf, 0x53, 0x3e, 0xab, 0xd5, 0x93, 0x65, 0x54,
0xd9, 0x3e, 0x90, 0x68, 0x8a, 0xf6, 0xc1, 0x2f, 0x00, 0xec, 0xe7, 0x71, 0x72, 0xc7, 0xe7, 0x93,
0x38, 0x2a, 0x2c, 0x57, 0x71, 0xc8, 0x58, 0x58, 0x2e, 0xe3, 0xa4, 0x91, 0x3d, 0x31, 0x3c, 0x4e,
0xeb, 0xfc, 0x5a, 0x09, 0xd7, 0xa9, 0xe7, 0x90, 0x7a, 0x42, 0x6a, 0xce, 0x22, 0xaf, 0x3b, 0xe8,
0x3f, 0x16, 0x59, 0x3c, 0xed, 0x3f, 0x56, 0x12, 0x84, 0xda, 0xec, 0xd5, 0xa4, 0xfc, 0xf6, 0xa0,
0x55, 0xa4, 0x85, 0xd4, 0x96, 0x54, 0x4e, 0x22, 0xe9, 0x3d, 0xa6, 0x92, 0xac, 0x71, 0x57, 0x69,
0xaa, 0x80, 0x2d, 0xe1, 0x54, 0x51, 0x06, 0x26, 0x80, 0x75, 0xd1, 0x41, 0xbd, 0x61, 0xd2, 0xb1,
0x99, 0x1a, 0x49, 0x4d, 0xc2, 0x44, 0x6b, 0x73, 0x6d, 0xbe, 0xc1, 0x8a, 0xed, 0x50, 0x5a, 0xc5,
0x91, 0x1d, 0x9a, 0xe6, 0x09, 0xac, 0x55, 0x82, 0x65, 0xad, 0xd2, 0xa7, 0xe5, 0x28, 0xb4, 0x4a,
0x9f, 0x1a, 0x67, 0xbb, 0x67, 0xa9, 0xc9, 0x15, 0x17, 0xb0, 0xc9, 0xec, 0x24, 0xc8, 0x87, 0x47,
0xef, 0x39, 0x5b, 0x07, 0x0b, 0xf4, 0x77, 0x2d, 0x9f, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff,
0x5c, 0x78, 0xf8, 0x82, 0xe0, 0x45, 0x00, 0x00,
// 5714 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3c, 0x4b, 0x90, 0x1c, 0xc9,
0x55, 0xaa, 0x9e, 0x9e, 0x4f, 0xbf, 0xee, 0xe9, 0x99, 0xc9, 0x19, 0xcd, 0xb4, 0x7a, 0xb5, 0x5a,
0x6d, 0x79, 0xc3, 0x92, 0x87, 0x45, 0xa3, 0x1d, 0xdb, 0xcb, 0x7a, 0x05, 0x36, 0xfa, 0xcf, 0xda,
0x5a, 0x79, 0x5c, 0x23, 0x59, 0x60, 0x03, 0xed, 0x9a, 0xee, 0x9c, 0x9e, 0xb2, 0xaa, 0xab, 0xca,
0x55, 0xd5, 0x33, 0x6a, 0x2f, 0x8a, 0xe0, 0x17, 0x9c, 0x70, 0x10, 0x04, 0x5c, 0x4c, 0x04, 0x41,
0x84, 0xb9, 0xc0, 0x81, 0x23, 0x27, 0xc3, 0x8d, 0x13, 0x11, 0x04, 0x87, 0x3d, 0x39, 0xb8, 0xf1,
0x39, 0x80, 0x83, 0x0b, 0x11, 0x5c, 0x38, 0x10, 0xc4, 0x7b, 0xf9, 0xa9, 0xcc, 0xaa, 0x1a, 0x49,
0xfe, 0xc0, 0xad, 0xf3, 0xe5, 0xab, 0x97, 0xbf, 0xf7, 0x7f, 0x99, 0x0d, 0xad, 0x34, 0x19, 0x5e,
0x4b, 0xd2, 0x38, 0x8f, 0xd9, 0x7c, 0x18, 0xa5, 0xc9, 0xb0, 0x7f, 0x71, 0x1c, 0xc7, 0xe3, 0x90,
0xef, 0xf8, 0x49, 0xb0, 0xe3, 0x47, 0x51, 0x9c, 0xfb, 0x79, 0x10, 0x47, 0x99, 0x40, 0x72, 0xbf,
0x01, 0xdd, 0xfb, 0x3c, 0x3a, 0xe0, 0x7c, 0xe4, 0xf1, 0x6f, 0x4d, 0x79, 0x96, 0xb3, 0x9f, 0x81,
0x35, 0x9f, 0x7f, 0x9b, 0xf3, 0xd1, 0x20, 0xf1, 0xb3, 0x2c, 0x39, 0x4e, 0xfd, 0x8c, 0xf7, 0x9c,
0xcb, 0xce, 0xd5, 0x8e, 0xb7, 0x2a, 0x3a, 0xf6, 0x35, 0x9c, 0xbd, 0x09, 0x9d, 0x0c, 0x51, 0x79,
0x94, 0xa7, 0x71, 0x32, 0xeb, 0x35, 0x08, 0xaf, 0x8d, 0xb0, 0xbb, 0x02, 0xe4, 0x86, 0xb0, 0xa2,
0x47, 0xc8, 0x92, 0x38, 0xca, 0x38, 0xbb, 0x0e, 0x1b, 0xc3, 0x20, 0x39, 0xe6, 0xe9, 0x80, 0x3e,
0x9e, 0x44, 0x7c, 0x12, 0x47, 0xc1, 0xb0, 0xe7, 0x5c, 0x9e, 0xbb, 0xda, 0xf2, 0x98, 0xe8, 0xc3,
0x2f, 0x3e, 0x94, 0x3d, 0xec, 0x0a, 0xac, 0xf0, 0x48, 0xc0, 0xf9, 0x88, 0xbe, 0x92, 0x43, 0x75,
0x0b, 0x30, 0x7e, 0xe0, 0xfe, 0xad, 0x03, 0x6b, 0x1f, 0x44, 0x41, 0xfe, 0xc4, 0x0f, 0x43, 0x9e,
0xab, 0x35, 0x5d, 0x81, 0x95, 0x53, 0x02, 0xd0, 0x9a, 0x4e, 0xe3, 0x74, 0x24, 0x57, 0xd4, 0x15,
0xe0, 0x7d, 0x09, 0x3d, 0x73, 0x66, 0x8d, 0x33, 0x67, 0x56, 0xbb, 0x5d, 0x73, 0x67, 0x6c, 0xd7,
0x15, 0x58, 0x49, 0xf9, 0x30, 0x3e, 0xe1, 0xe9, 0x6c, 0x70, 0x1a, 0x44, 0xa3, 0xf8, 0xb4, 0xd7,
0xbc, 0xec, 0x5c, 0x9d, 0xf7, 0xba, 0x0a, 0xfc, 0x84, 0xa0, 0xee, 0x06, 0x30, 0x73, 0x15, 0x62,
0xdf, 0xdc, 0x31, 0xac, 0x3f, 0x8e, 0xc2, 0x78, 0xf8, 0xf4, 0xc7, 0x5c, 0x5d, 0xcd, 0xf0, 0x8d,
0xda, 0xe1, 0x37, 0x61, 0xc3, 0x1e, 0x48, 0x4e, 0x80, 0xc3, 0xf9, 0xdb, 0xc7, 0x7e, 0x34, 0xe6,
0x8a, 0xa4, 0x9a, 0xc2, 0xa7, 0x60, 0x75, 0x38, 0x4d, 0x53, 0x1e, 0x55, 0xe6, 0xb0, 0x22, 0xe1,
0x7a, 0x12, 0x6f, 0x42, 0x27, 0xe2, 0xa7, 0x05, 0x9a, 0x64, 0x99, 0x88, 0x9f, 0x2a, 0x14, 0xb7,
0x07, 0x9b, 0xe5, 0x61, 0xe4, 0x04, 0xbe, 0xdb, 0x80, 0xf6, 0xa3, 0xd4, 0x8f, 0x32, 0x7f, 0x88,
0x5c, 0xcc, 0x7a, 0xb0, 0x98, 0x3f, 0x1b, 0x1c, 0xfb, 0xd9, 0x31, 0x0d, 0xd7, 0xf2, 0x54, 0x93,
0x6d, 0xc2, 0x82, 0x3f, 0x89, 0xa7, 0x51, 0x4e, 0x03, 0xcc, 0x79, 0xb2, 0xc5, 0xde, 0x86, 0xb5,
0x68, 0x3a, 0x19, 0x0c, 0xe3, 0xe8, 0x28, 0x48, 0x27, 0x42, 0x16, 0xe8, 0xbc, 0xe6, 0xbd, 0x6a,
0x07, 0xbb, 0x04, 0x70, 0x88, 0xfb, 0x20, 0x86, 0x68, 0xd2, 0x10, 0x06, 0x84, 0xb9, 0xd0, 0x91,
0x2d, 0x1e, 0x8c, 0x8f, 0xf3, 0xde, 0x3c, 0x11, 0xb2, 0x60, 0x48, 0x23, 0x0f, 0x26, 0x7c, 0x90,
0xe5, 0xfe, 0x24, 0xe9, 0x2d, 0xd0, 0x6c, 0x0c, 0x08, 0xf5, 0xc7, 0xb9, 0x1f, 0x0e, 0x8e, 0x38,
0xcf, 0x7a, 0x8b, 0xb2, 0x5f, 0x43, 0xd8, 0x27, 0xa1, 0x3b, 0xe2, 0x59, 0x3e, 0xf0, 0x47, 0xa3,
0x94, 0x67, 0x19, 0xcf, 0x7a, 0x4b, 0xc4, 0x8d, 0x25, 0x28, 0xee, 0xda, 0x7d, 0x9e, 0x1b, 0xbb,
0x93, 0xc9, 0xd3, 0x71, 0x1f, 0x00, 0x33, 0xc0, 0x77, 0x78, 0xee, 0x07, 0x61, 0xc6, 0xde, 0x85,
0x4e, 0x6e, 0x20, 0x93, 0xf4, 0xb5, 0x77, 0xd9, 0x35, 0x52, 0x1b, 0xd7, 0x8c, 0x0f, 0x3c, 0x0b,
0xcf, 0xfd, 0x6f, 0x07, 0xda, 0x07, 0x3c, 0xd2, 0x67, 0xcf, 0xa0, 0x89, 0x33, 0x91, 0xe7, 0x4d,
0xbf, 0xd9, 0x1b, 0xd0, 0xa6, 0xd9, 0x65, 0x79, 0x1a, 0x44, 0x63, 0x3a, 0x82, 0x96, 0x07, 0x08,
0x3a, 0x20, 0x08, 0x5b, 0x85, 0x39, 0x7f, 0x92, 0xd3, 0xc6, 0xcf, 0x79, 0xf8, 0x13, 0xf9, 0x22,
0xf1, 0x67, 0x13, 0x64, 0x21, 0xbd, 0xd9, 0x1d, 0xaf, 0x2d, 0x61, 0x7b, 0xb8, 0xdb, 0xd7, 0x60,
0xdd, 0x44, 0x51, 0xd4, 0xe7, 0x89, 0xfa, 0x9a, 0x81, 0x29, 0x07, 0xb9, 0x02, 0x2b, 0x0a, 0x3f,
0x15, 0x93, 0xa5, 0xed, 0x6f, 0x79, 0x5d, 0x09, 0x56, 0x4b, 0xb8, 0x0a, 0xab, 0x47, 0x41, 0xe4,
0x87, 0x83, 0x61, 0x98, 0x9f, 0x0c, 0x46, 0x3c, 0xcc, 0x7d, 0x3a, 0x88, 0x79, 0xaf, 0x4b, 0xf0,
0xdb, 0x61, 0x7e, 0x72, 0x07, 0xa1, 0xee, 0x1f, 0x39, 0xd0, 0x11, 0x8b, 0x97, 0xba, 0xec, 0x2d,
0x58, 0x56, 0x63, 0xf0, 0x34, 0x8d, 0x53, 0xc9, 0x87, 0x36, 0x90, 0x6d, 0xc3, 0xaa, 0x02, 0x24,
0x29, 0x0f, 0x26, 0xfe, 0x98, 0x4b, 0xc6, 0xaf, 0xc0, 0xd9, 0x6e, 0x41, 0x31, 0x8d, 0xa7, 0xb9,
0xd0, 0x26, 0xed, 0xdd, 0x8e, 0x3c, 0x18, 0x0f, 0x61, 0x9e, 0x8d, 0xe2, 0x7e, 0xcf, 0x81, 0x0e,
0x8a, 0x4c, 0xc4, 0xc3, 0xfd, 0x38, 0x88, 0x72, 0x76, 0x1d, 0xd8, 0xd1, 0x34, 0x1a, 0x05, 0xd1,
0x78, 0x90, 0x3f, 0x0b, 0x46, 0x83, 0xc3, 0x59, 0xce, 0x33, 0x71, 0x44, 0x7b, 0xe7, 0xbc, 0x9a,
0x3e, 0xf6, 0x36, 0xac, 0x5a, 0xd0, 0x2c, 0x4f, 0xc5, 0xb9, 0xed, 0x9d, 0xf3, 0x2a, 0x3d, 0xc8,
0xf8, 0xf1, 0x34, 0x4f, 0xa6, 0xf9, 0x20, 0x88, 0x46, 0xfc, 0x19, 0xcd, 0x71, 0xd9, 0xb3, 0x60,
0xb7, 0xba, 0xd0, 0x31, 0xbf, 0x73, 0x3f, 0x0f, 0xab, 0x0f, 0x50, 0x22, 0xa2, 0x20, 0x1a, 0xdf,
0x14, 0x6c, 0x8b, 0x62, 0x9a, 0x4c, 0x0f, 0x9f, 0xf2, 0x99, 0xdc, 0x37, 0xd9, 0x42, 0xa6, 0x3a,
0x8e, 0xb3, 0x5c, 0x72, 0x0e, 0xfd, 0x76, 0xff, 0xd9, 0x81, 0x15, 0xdc, 0xfb, 0x0f, 0xfd, 0x68,
0xa6, 0x4e, 0xee, 0x01, 0x74, 0x90, 0xd4, 0xa3, 0xf8, 0xa6, 0x10, 0x76, 0xc1, 0xc4, 0x57, 0xe5,
0x5e, 0x95, 0xb0, 0xaf, 0x99, 0xa8, 0x68, 0x9f, 0x66, 0x9e, 0xf5, 0x35, 0xb2, 0x6d, 0xee, 0xa7,
0x63, 0x9e, 0x93, 0x1a, 0x90, 0x6a, 0x01, 0x04, 0xe8, 0x76, 0x1c, 0x1d, 0xb1, 0xcb, 0xd0, 0xc9,
0xfc, 0x7c, 0x90, 0xf0, 0x94, 0x76, 0x8d, 0x58, 0x6f, 0xce, 0x83, 0xcc, 0xcf, 0xf7, 0x79, 0x7a,
0x6b, 0x96, 0xf3, 0xfe, 0x17, 0x60, 0xad, 0x32, 0x0a, 0x72, 0x7b, 0xb1, 0x44, 0xfc, 0xc9, 0x36,
0x60, 0xfe, 0xc4, 0x0f, 0xa7, 0x5c, 0x6a, 0x27, 0xd1, 0x78, 0xbf, 0xf1, 0x9e, 0xe3, 0x7e, 0x12,
0x56, 0x8b, 0x69, 0x4b, 0x26, 0x63, 0xd0, 0xc4, 0x1d, 0x94, 0x04, 0xe8, 0xb7, 0xfb, 0x9b, 0x8e,
0x40, 0xbc, 0x1d, 0x07, 0x5a, 0xd2, 0x11, 0x11, 0x15, 0x82, 0x42, 0xc4, 0xdf, 0x67, 0x6a, 0xc2,
0x9f, 0x7c, 0xb1, 0xee, 0x15, 0x58, 0x33, 0xa6, 0xf0, 0x82, 0xc9, 0x7e, 0xc7, 0x81, 0xb5, 0x87,
0xfc, 0x54, 0x9e, 0xba, 0x9a, 0xed, 0x7b, 0xd0, 0xcc, 0x67, 0x89, 0xf0, 0x2e, 0xba, 0xbb, 0x6f,
0xc9, 0x43, 0xab, 0xe0, 0x5d, 0x93, 0xcd, 0x47, 0xb3, 0x84, 0x7b, 0xf4, 0x85, 0xfb, 0x79, 0x68,
0x1b, 0x40, 0xb6, 0x05, 0xeb, 0x4f, 0x3e, 0x78, 0xf4, 0xf0, 0xee, 0xc1, 0xc1, 0x60, 0xff, 0xf1,
0xad, 0x2f, 0xdd, 0xfd, 0xe5, 0xc1, 0xde, 0xcd, 0x83, 0xbd, 0xd5, 0x73, 0x6c, 0x13, 0xd8, 0xc3,
0xbb, 0x07, 0x8f, 0xee, 0xde, 0xb1, 0xe0, 0x8e, 0xdb, 0x87, 0xde, 0x43, 0x7e, 0xfa, 0x24, 0xc8,
0x23, 0x9e, 0x65, 0xf6, 0x68, 0xee, 0x35, 0x60, 0xe6, 0x14, 0xe4, 0xaa, 0x7a, 0xb0, 0x28, 0x55,
0xad, 0xb2, 0x34, 0xb2, 0xe9, 0x7e, 0x12, 0xd8, 0x41, 0x30, 0x8e, 0x3e, 0xe4, 0x59, 0xe6, 0x8f,
0xb9, 0x5a, 0xdb, 0x2a, 0xcc, 0x4d, 0xb2, 0xb1, 0x54, 0x8a, 0xf8, 0xd3, 0xfd, 0x34, 0xac, 0x5b,
0x78, 0x92, 0xf0, 0x45, 0x68, 0x65, 0xc1, 0x38, 0xf2, 0xf3, 0x69, 0xca, 0x25, 0xe9, 0x02, 0xe0,
0xde, 0x83, 0x8d, 0xaf, 0xf2, 0x34, 0x38, 0x9a, 0xbd, 0x8c, 0xbc, 0x4d, 0xa7, 0x51, 0xa6, 0x73,
0x17, 0xce, 0x97, 0xe8, 0xc8, 0xe1, 0x05, 0x23, 0xca, 0xe3, 0x5a, 0xf2, 0x44, 0xc3, 0x10, 0xcb,
0x86, 0x29, 0x96, 0xee, 0x63, 0x60, 0xb7, 0xe3, 0x28, 0xe2, 0xc3, 0x7c, 0x9f, 0xf3, 0xb4, 0x70,
0x19, 0x0b, 0xae, 0x6b, 0xef, 0x6e, 0xc9, 0x73, 0x2c, 0xcb, 0xba, 0x64, 0x47, 0x06, 0xcd, 0x84,
0xa7, 0x13, 0x22, 0xbc, 0xe4, 0xd1, 0x6f, 0xf7, 0x3c, 0xac, 0x5b, 0x64, 0xa5, 0xb5, 0x7f, 0x07,
0xce, 0xdf, 0x09, 0xb2, 0x61, 0x75, 0xc0, 0x1e, 0x2c, 0x26, 0xd3, 0xc3, 0x41, 0x21, 0x53, 0xaa,
0x89, 0x46, 0xb0, 0xfc, 0x89, 0x24, 0xf6, 0xbb, 0x0e, 0x34, 0xf7, 0x1e, 0x3d, 0xb8, 0xcd, 0xfa,
0xb0, 0x14, 0x44, 0xc3, 0x78, 0x82, 0xa6, 0x43, 0x2c, 0x5a, 0xb7, 0xcf, 0x94, 0x95, 0x8b, 0xd0,
0x22, 0x8b, 0x83, 0x76, 0x5d, 0x7a, 0x77, 0x05, 0x00, 0x7d, 0x0a, 0xfe, 0x2c, 0x09, 0x52, 0x72,
0x1a, 0x94, 0x2b, 0xd0, 0x24, 0x8d, 0x58, 0xed, 0x70, 0xff, 0xa7, 0x09, 0x8b, 0x52, 0x57, 0xd3,
0x78, 0xc3, 0x3c, 0x38, 0xe1, 0x72, 0x26, 0xb2, 0x85, 0x56, 0x25, 0xe5, 0x93, 0x38, 0xe7, 0x03,
0xeb, 0x18, 0x6c, 0x20, 0x62, 0x0d, 0x05, 0xa1, 0x41, 0x82, 0x5a, 0x9f, 0x66, 0xd6, 0xf2, 0x6c,
0x20, 0x6e, 0x16, 0x02, 0x06, 0xc1, 0x88, 0xe6, 0xd4, 0xf4, 0x54, 0x13, 0x77, 0x62, 0xe8, 0x27,
0xfe, 0x30, 0xc8, 0x67, 0x52, 0xb8, 0x75, 0x1b, 0x69, 0x87, 0xf1, 0xd0, 0x0f, 0x07, 0x87, 0x7e,
0xe8, 0x47, 0x43, 0x2e, 0x1d, 0x17, 0x1b, 0x88, 0xbe, 0x89, 0x9c, 0x92, 0x42, 0x13, 0xfe, 0x4b,
0x09, 0x8a, 0x3e, 0xce, 0x30, 0x9e, 0x4c, 0x82, 0x1c, 0x5d, 0x9a, 0xde, 0x92, 0x50, 0x24, 0x05,
0x84, 0x56, 0x22, 0x5a, 0xa7, 0x62, 0xf7, 0x5a, 0x62, 0x34, 0x0b, 0x88, 0x54, 0x8e, 0x38, 0x27,
0x85, 0xf4, 0xf4, 0xb4, 0x07, 0x82, 0x4a, 0x01, 0xc1, 0x73, 0x98, 0x46, 0x19, 0xcf, 0xf3, 0x90,
0x8f, 0xf4, 0x84, 0xda, 0x84, 0x56, 0xed, 0x60, 0xd7, 0x61, 0x5d, 0x78, 0x59, 0x99, 0x9f, 0xc7,
0xd9, 0x71, 0x90, 0x0d, 0x32, 0x1e, 0xe5, 0xbd, 0x0e, 0xe1, 0xd7, 0x75, 0xb1, 0xf7, 0x60, 0xab,
0x04, 0x4e, 0xf9, 0x90, 0x07, 0x27, 0x7c, 0xd4, 0x5b, 0xa6, 0xaf, 0xce, 0xea, 0x66, 0x97, 0xa1,
0x8d, 0xce, 0xe5, 0x34, 0x19, 0xf9, 0x68, 0x87, 0xbb, 0x74, 0x0e, 0x26, 0x88, 0xbd, 0x03, 0xcb,
0x09, 0x17, 0xc6, 0xf2, 0x38, 0x0f, 0x87, 0x59, 0x6f, 0x85, 0x2c, 0x59, 0x5b, 0x0a, 0x13, 0x72,
0xae, 0x67, 0x63, 0x20, 0x53, 0x0e, 0x33, 0x72, 0x57, 0xfc, 0x59, 0x6f, 0x95, 0xd8, 0xad, 0x00,
0x90, 0x8c, 0xa4, 0xc1, 0x89, 0x9f, 0xf3, 0xde, 0x1a, 0xf1, 0x96, 0x6a, 0xba, 0x7f, 0xea, 0xc0,
0xfa, 0x83, 0x20, 0xcb, 0x25, 0x13, 0x6a, 0x75, 0xfc, 0x06, 0xb4, 0x05, 0xfb, 0x0d, 0xe2, 0x28,
0x9c, 0x49, 0x8e, 0x04, 0x01, 0xfa, 0x72, 0x14, 0xce, 0xd8, 0x27, 0x60, 0x39, 0x88, 0x4c, 0x14,
0x21, 0xc3, 0x1d, 0x05, 0x24, 0xa4, 0x37, 0xa0, 0x9d, 0x4c, 0x0f, 0xc3, 0x60, 0x28, 0x50, 0xe6,
0x04, 0x15, 0x01, 0x22, 0x04, 0x74, 0xf4, 0xc4, 0x4c, 0x04, 0x46, 0x93, 0x30, 0xda, 0x12, 0x86,
0x28, 0xee, 0x2d, 0xd8, 0xb0, 0x27, 0x28, 0x95, 0xd5, 0x36, 0x2c, 0x49, 0xde, 0xce, 0x7a, 0x6d,
0xda, 0x9f, 0xae, 0xdc, 0x1f, 0x89, 0xea, 0xe9, 0x7e, 0xf7, 0xdf, 0x1d, 0x68, 0xa2, 0x02, 0x38,
0x5b, 0x59, 0x98, 0x3a, 0x7d, 0xce, 0xd2, 0xe9, 0xe4, 0xf7, 0xa3, 0x57, 0x24, 0x58, 0x42, 0x88,
0x8d, 0x01, 0x29, 0xfa, 0x53, 0x3e, 0x3c, 0x21, 0xd9, 0xd1, 0xfd, 0x08, 0x41, 0xc9, 0x42, 0xd3,
0x49, 0x5f, 0x0b, 0xc1, 0xd1, 0x6d, 0xd5, 0x47, 0x5f, 0x2e, 0x16, 0x7d, 0xf4, 0x5d, 0x0f, 0x16,
0x83, 0xe8, 0x30, 0x9e, 0x46, 0x23, 0x12, 0x92, 0x25, 0x4f, 0x35, 0xf1, 0xb0, 0x13, 0xf2, 0xa4,
0x82, 0x09, 0x97, 0xd2, 0x51, 0x00, 0x5c, 0x86, 0xae, 0x55, 0x46, 0x0a, 0x4f, 0xdb, 0xb1, 0x77,
0x61, 0xcd, 0x80, 0xc9, 0x1d, 0x7c, 0x13, 0xe6, 0x13, 0x04, 0x48, 0x47, 0x49, 0xb1, 0x17, 0x69,
0x4a, 0xd1, 0xe3, 0xae, 0x42, 0xf7, 0x3e, 0xcf, 0x3f, 0x88, 0x8e, 0x62, 0x45, 0xe9, 0x07, 0x73,
0x18, 0xc3, 0x4b, 0x90, 0x24, 0x74, 0x15, 0x56, 0x82, 0x11, 0x8f, 0xf2, 0x20, 0x9f, 0x0d, 0x2c,
0x0f, 0xae, 0x0c, 0x46, 0x0b, 0xe3, 0x87, 0x81, 0x9f, 0x49, 0x1d, 0x26, 0x1a, 0x6c, 0x17, 0x36,
0x90, 0xfd, 0x15, 0x47, 0xeb, 0x63, 0x15, 0x8e, 0x64, 0x6d, 0x1f, 0x4a, 0x2c, 0xc2, 0x25, 0x07,
0xea, 0x4f, 0x84, 0xa6, 0xad, 0xeb, 0xc2, 0x5d, 0x13, 0x94, 0x70, 0xc9, 0xf3, 0x42, 0x44, 0x34,
0xa0, 0x12, 0xbd, 0x2d, 0x08, 0x27, 0xb6, 0x1c, 0xbd, 0x19, 0x11, 0xe0, 0x52, 0x25, 0x02, 0xbc,
0x0a, 0x2b, 0xd9, 0x2c, 0x1a, 0xf2, 0xd1, 0x20, 0x8f, 0x71, 0xdc, 0x20, 0xa2, 0xd3, 0x59, 0xf2,
0xca, 0x60, 0x8a, 0x55, 0x79, 0x96, 0x47, 0x3c, 0x27, 0xd5, 0xb5, 0xe4, 0xa9, 0x26, 0x5a, 0x01,
0x42, 0x11, 0x4c, 0xdd, 0xf2, 0x64, 0x0b, 0x4d, 0xe5, 0x34, 0x0d, 0xb2, 0x5e, 0x87, 0xa0, 0xf4,
0x9b, 0x7d, 0x06, 0xce, 0x1f, 0x62, 0x64, 0x75, 0xcc, 0xfd, 0x11, 0x4f, 0xe9, 0xf4, 0x45, 0x60,
0x29, 0x34, 0x50, 0x7d, 0x27, 0x8e, 0x7d, 0xc2, 0xd3, 0x2c, 0x88, 0x23, 0xd2, 0x3d, 0x2d, 0x4f,
0x35, 0xdd, 0x6f, 0x93, 0x45, 0xd7, 0x21, 0xef, 0x63, 0x52, 0x47, 0xec, 0x35, 0x68, 0x89, 0x35,
0x66, 0xc7, 0xbe, 0x74, 0x32, 0x96, 0x08, 0x70, 0x70, 0xec, 0xa3, 0x00, 0x5b, 0xdb, 0x26, 0x72,
0x08, 0x6d, 0x82, 0xed, 0x89, 0x5d, 0x7b, 0x0b, 0xba, 0x2a, 0x98, 0xce, 0x06, 0x21, 0x3f, 0xca,
0x55, 0x80, 0x10, 0x4d, 0x27, 0x38, 0x5c, 0xf6, 0x80, 0x1f, 0xe5, 0xee, 0x43, 0x58, 0x93, 0x72,
0xfb, 0xe5, 0x84, 0xab, 0xa1, 0x3f, 0x57, 0x36, 0x6a, 0xc2, 0xab, 0x58, 0xb7, 0x05, 0x9d, 0xa2,
0x9c, 0x92, 0xa5, 0x73, 0x3d, 0x60, 0xb2, 0xfb, 0x76, 0x18, 0x67, 0x5c, 0x12, 0x74, 0xa1, 0x33,
0x0c, 0xe3, 0x4c, 0x85, 0x21, 0x72, 0x39, 0x16, 0x0c, 0xf7, 0x27, 0x9b, 0x0e, 0x87, 0xa8, 0x09,
0x84, 0x4e, 0x53, 0x4d, 0xf7, 0xcf, 0x1d, 0x58, 0x27, 0x6a, 0x4a, 0xc3, 0x68, 0xdf, 0xf5, 0xd5,
0xa7, 0xd9, 0x19, 0x9a, 0xa1, 0xd9, 0x06, 0xcc, 0x1f, 0xc5, 0xe9, 0x90, 0xcb, 0x91, 0x44, 0xe3,
0x47, 0xf7, 0xc6, 0x9b, 0x15, 0x6f, 0xfc, 0x07, 0x0e, 0xac, 0xd1, 0x54, 0x0f, 0x72, 0x3f, 0x9f,
0x66, 0x72, 0xf9, 0x3f, 0x0f, 0xcb, 0xb8, 0x54, 0xae, 0xc4, 0x49, 0x4e, 0x74, 0x43, 0x4b, 0x3e,
0x41, 0x05, 0xf2, 0xde, 0x39, 0xcf, 0x46, 0x66, 0x5f, 0x80, 0x8e, 0x99, 0x11, 0xa1, 0x39, 0xb7,
0x77, 0x2f, 0xa8, 0x55, 0x56, 0x38, 0x67, 0xef, 0x9c, 0x67, 0x7d, 0xc0, 0x6e, 0x00, 0x90, 0xbb,
0x41, 0x64, 0x65, 0x28, 0x7b, 0xc1, 0xde, 0x24, 0xe3, 0xb0, 0xf6, 0xce, 0x79, 0x06, 0xfa, 0xad,
0x25, 0x58, 0x10, 0xf6, 0xd1, 0xbd, 0x0f, 0xcb, 0xd6, 0x4c, 0xad, 0x28, 0xa3, 0x23, 0xa2, 0x8c,
0x4a, 0x50, 0xda, 0xa8, 0x06, 0xa5, 0xee, 0xbf, 0x36, 0x80, 0x21, 0xb7, 0x95, 0x8e, 0x13, 0x0d,
0x74, 0x3c, 0xb2, 0xdc, 0xad, 0x8e, 0x67, 0x82, 0xd8, 0x35, 0x60, 0x46, 0x53, 0xe5, 0x1e, 0x84,
0xdd, 0xa8, 0xe9, 0x41, 0x05, 0x27, 0x7c, 0x25, 0x15, 0x03, 0x4b, 0xc7, 0x52, 0x9c, 0x5b, 0x6d,
0x1f, 0x9a, 0x86, 0x64, 0x9a, 0x1d, 0xa3, 0x03, 0xa1, 0x1c, 0x32, 0xd5, 0x2e, 0x33, 0xc8, 0xc2,
0x4b, 0x19, 0x64, 0xb1, 0xcc, 0x20, 0xa6, 0x4b, 0xb0, 0x64, 0xb9, 0x04, 0xe8, 0x7f, 0x4d, 0x82,
0x88, 0xfc, 0x8a, 0xc1, 0x04, 0x47, 0x97, 0xfe, 0x97, 0x05, 0x64, 0xdb, 0xb0, 0x2a, 0xfd, 0xba,
0xc2, 0xef, 0x00, 0xda, 0xe3, 0x0a, 0xdc, 0xfd, 0xd8, 0x81, 0x55, 0xdc, 0x67, 0x8b, 0x17, 0xdf,
0x07, 0x12, 0x85, 0x57, 0x64, 0x45, 0x0b, 0xf7, 0x27, 0xe7, 0xc4, 0xf7, 0xa0, 0x45, 0x04, 0xe3,
0x84, 0x47, 0x92, 0x11, 0x7b, 0x36, 0x23, 0x16, 0x5a, 0x68, 0xef, 0x9c, 0x57, 0x20, 0x1b, 0x6c,
0xf8, 0x0f, 0x0e, 0xb4, 0xe5, 0x34, 0x7f, 0xec, 0x58, 0xa2, 0x0f, 0x4b, 0xc8, 0x91, 0x86, 0xc3,
0xae, 0xdb, 0x68, 0x4d, 0x26, 0x18, 0xb0, 0xa1, 0xf9, 0xb4, 0xe2, 0x88, 0x32, 0x18, 0x6d, 0x21,
0x29, 0xdc, 0x6c, 0x90, 0x07, 0xe1, 0x40, 0xf5, 0xca, 0x04, 0x64, 0x5d, 0x17, 0xea, 0x9d, 0x2c,
0xf7, 0xc7, 0x5c, 0x9a, 0x39, 0xd1, 0xc0, 0x80, 0x49, 0x2e, 0xa8, 0xe4, 0x0e, 0xba, 0x7f, 0xd3,
0x81, 0xad, 0x4a, 0x97, 0xce, 0xe0, 0x4b, 0x07, 0x39, 0x0c, 0x26, 0x87, 0xb1, 0xf6, 0xb5, 0x1d,
0xd3, 0x77, 0xb6, 0xba, 0xd8, 0x18, 0xce, 0x2b, 0x7b, 0x8e, 0x7b, 0x5a, 0x58, 0xef, 0x06, 0x39,
0x22, 0xef, 0xd8, 0x3c, 0x50, 0x1e, 0x50, 0xc1, 0x4d, 0xc9, 0xad, 0xa7, 0xc7, 0x8e, 0xa1, 0xa7,
0x1d, 0x07, 0xa9, 0xe2, 0x0d, 0xe7, 0x02, 0xc7, 0x7a, 0xfb, 0x25, 0x63, 0x91, 0x3e, 0x1a, 0xa9,
0x61, 0xce, 0xa4, 0xc6, 0x66, 0x70, 0x49, 0xf5, 0x91, 0x0e, 0xaf, 0x8e, 0xd7, 0x7c, 0xa5, 0xb5,
0xdd, 0xc3, 0x8f, 0xed, 0x41, 0x5f, 0x42, 0x98, 0x7d, 0x13, 0x36, 0x4f, 0xfd, 0x20, 0x57, 0xd3,
0x32, 0x9c, 0xa1, 0x79, 0x1a, 0x72, 0xf7, 0x25, 0x43, 0x3e, 0x11, 0x1f, 0x5b, 0x86, 0xed, 0x0c,
0x8a, 0xfd, 0xbf, 0x73, 0xa0, 0x6b, 0xd3, 0x41, 0x36, 0x95, 0x02, 0xaf, 0x14, 0x9f, 0x72, 0xfe,
0x4a, 0xe0, 0x6a, 0x88, 0xda, 0xa8, 0x0b, 0x51, 0xcd, 0x40, 0x74, 0xee, 0x65, 0x81, 0x68, 0xf3,
0xd5, 0x02, 0xd1, 0xf9, 0xba, 0x40, 0xb4, 0xff, 0x5f, 0x0e, 0xb0, 0x2a, 0x2f, 0xb1, 0xfb, 0x22,
0x46, 0x8e, 0x78, 0x28, 0x75, 0xd2, 0xcf, 0xbe, 0x1a, 0x3f, 0xaa, 0xbd, 0x53, 0x5f, 0xa3, 0x60,
0x98, 0x4a, 0xc7, 0x74, 0x91, 0x96, 0xbd, 0xba, 0xae, 0x52, 0x68, 0xdc, 0x7c, 0x79, 0x68, 0x3c,
0xff, 0xf2, 0xd0, 0x78, 0xa1, 0x1c, 0x1a, 0xf7, 0x7f, 0xc7, 0x81, 0xf5, 0x9a, 0x43, 0xff, 0xe9,
0x2d, 0x1c, 0x8f, 0xc9, 0xd2, 0x05, 0x0d, 0x79, 0x4c, 0x26, 0xb0, 0xff, 0xeb, 0xb0, 0x6c, 0x31,
0xfa, 0x4f, 0x6f, 0xfc, 0xb2, 0x97, 0x27, 0xf8, 0xcc, 0x82, 0xf5, 0x7f, 0xd8, 0x00, 0x56, 0x15,
0xb6, 0xff, 0xd7, 0x39, 0x54, 0xf7, 0x69, 0xae, 0x66, 0x9f, 0xfe, 0x4f, 0xed, 0xc0, 0xdb, 0xb0,
0x26, 0xcb, 0x7d, 0x46, 0x96, 0x44, 0x70, 0x4c, 0xb5, 0x03, 0xfd, 0x5c, 0x3b, 0x2f, 0xb1, 0x64,
0x95, 0x89, 0x0c, 0x63, 0x58, 0x4a, 0x4f, 0xb8, 0x9b, 0xb0, 0x21, 0xca, 0x87, 0xb7, 0x04, 0x29,
0x65, 0x57, 0xfe, 0xc4, 0x81, 0xf3, 0xa5, 0x8e, 0xa2, 0x96, 0x22, 0x4c, 0x87, 0x6d, 0x4f, 0x6c,
0x20, 0xce, 0x5f, 0xca, 0x91, 0x31, 0x7f, 0xc1, 0x6d, 0xd5, 0x0e, 0xdc, 0x9f, 0x69, 0x54, 0xc5,
0x17, 0xbb, 0x5e, 0xd7, 0xe5, 0x6e, 0x89, 0x22, 0x67, 0xc4, 0xc3, 0xd2, 0xc4, 0x8f, 0x44, 0x59,
0xd2, 0xec, 0x28, 0x92, 0xc3, 0xf6, 0x94, 0x55, 0x13, 0xbd, 0x40, 0xcb, 0x4c, 0xd9, 0xf3, 0xad,
0xed, 0x73, 0x7f, 0x0d, 0xd8, 0x57, 0xa6, 0x3c, 0x9d, 0x51, 0xa5, 0x47, 0x67, 0x67, 0xb6, 0xca,
0x69, 0x8c, 0x85, 0x64, 0x7a, 0xf8, 0x25, 0x3e, 0x53, 0xa5, 0xb4, 0x46, 0x51, 0x4a, 0x7b, 0x1d,
0x00, 0xa3, 0x2f, 0x2a, 0x0d, 0xa9, 0xe2, 0x26, 0x86, 0xbd, 0x82, 0xa0, 0x7b, 0x03, 0xd6, 0x2d,
0xfa, 0x7a, 0xf7, 0x17, 0xe4, 0x17, 0x22, 0x37, 0x60, 0x17, 0x9c, 0x64, 0x9f, 0xfb, 0x1f, 0x0e,
0xcc, 0xed, 0xc5, 0x89, 0x99, 0x55, 0x74, 0xec, 0xac, 0xa2, 0x54, 0xf9, 0x03, 0xad, 0xd1, 0xa5,
0x26, 0xb0, 0x80, 0x6c, 0x1b, 0xba, 0xfe, 0x24, 0xc7, 0xe8, 0xf8, 0x28, 0x4e, 0x4f, 0xfd, 0x74,
0x24, 0x8e, 0xe4, 0x56, 0xa3, 0xe7, 0x78, 0xa5, 0x1e, 0xb6, 0x01, 0x73, 0x5a, 0x37, 0x12, 0x02,
0x36, 0xd1, 0xbf, 0xa2, 0xe4, 0xea, 0x4c, 0x06, 0xf6, 0xb2, 0x85, 0x27, 0x6e, 0x7f, 0x2f, 0x3c,
0x5a, 0xc1, 0xe1, 0x75, 0x5d, 0x68, 0x7e, 0x50, 0x55, 0x12, 0x9a, 0xcc, 0xc8, 0xa8, 0xb6, 0xfb,
0x6f, 0x0e, 0xcc, 0xd3, 0x0e, 0xa0, 0x4c, 0x0a, 0x46, 0xa4, 0xda, 0x2d, 0x65, 0x82, 0x1d, 0x21,
0x93, 0x25, 0x30, 0x73, 0xad, 0x8a, 0x6e, 0x43, 0x4f, 0xdb, 0xac, 0xea, 0x5e, 0x86, 0x96, 0x68,
0xe9, 0x32, 0x28, 0xa1, 0x14, 0x40, 0x76, 0x09, 0x9a, 0xc7, 0x71, 0xa2, 0x9c, 0x08, 0x50, 0x89,
0xc0, 0x38, 0xf1, 0x08, 0x5e, 0xcc, 0x07, 0xe9, 0x89, 0xc9, 0x0b, 0xd3, 0x50, 0x06, 0xa3, 0x71,
0xd4, 0x64, 0xcd, 0xcd, 0x28, 0x41, 0xdd, 0x6d, 0x58, 0x79, 0x18, 0x8f, 0xb8, 0x91, 0xfa, 0x39,
0x93, 0xeb, 0xdc, 0xdf, 0x70, 0x60, 0x49, 0x21, 0xb3, 0xab, 0xd0, 0x44, 0x8b, 0x5f, 0xf2, 0xe7,
0x75, 0x01, 0x00, 0xf1, 0x3c, 0xc2, 0x40, 0x15, 0x49, 0x89, 0x81, 0xc2, 0xfb, 0x53, 0x69, 0x81,
0xc2, 0xb9, 0xd1, 0xd3, 0x2d, 0xf9, 0x04, 0x25, 0xa8, 0xfb, 0x17, 0x0e, 0x2c, 0x5b, 0x63, 0x60,
0x14, 0x17, 0xfa, 0x59, 0x2e, 0x93, 0xaa, 0xf2, 0x78, 0x4c, 0x90, 0x99, 0x0c, 0x6c, 0xd8, 0xc9,
0x40, 0x9d, 0xa6, 0x9a, 0x33, 0xd3, 0x54, 0xd7, 0xa1, 0x55, 0xd4, 0xdd, 0x9b, 0x96, 0xea, 0xc3,
0x11, 0x55, 0x69, 0xa3, 0x40, 0x42, 0x3a, 0xc3, 0x38, 0x8c, 0x53, 0x59, 0x96, 0x16, 0x0d, 0xf7,
0x06, 0xb4, 0x0d, 0x7c, 0x9c, 0x46, 0xc4, 0xf3, 0xd3, 0x38, 0x7d, 0xaa, 0x72, 0x92, 0xb2, 0xa9,
0x2b, 0x78, 0x8d, 0xa2, 0x82, 0xe7, 0xfe, 0xa5, 0x03, 0xcb, 0xc8, 0x83, 0x41, 0x34, 0xde, 0x8f,
0xc3, 0x60, 0x38, 0xa3, 0xb3, 0x57, 0xec, 0x26, 0xeb, 0xd5, 0x8a, 0x17, 0x6d, 0x30, 0xf2, 0xb6,
0x0a, 0xe2, 0xa4, 0x20, 0xea, 0x36, 0x4a, 0x2a, 0xf2, 0xf9, 0xa1, 0x9f, 0x49, 0xe6, 0x97, 0xb6,
0xc8, 0x02, 0xa2, 0x3c, 0x21, 0x20, 0xf5, 0x73, 0x3e, 0x98, 0x04, 0x61, 0x18, 0x08, 0x5c, 0xe1,
0xa9, 0xd4, 0x75, 0xb9, 0xdf, 0x6f, 0x40, 0x5b, 0x6a, 0xca, 0xbb, 0xa3, 0xb1, 0xc8, 0xfe, 0x4b,
0x7f, 0x4f, 0xab, 0x0b, 0x03, 0xa2, 0xfa, 0x2d, 0x0f, 0xd1, 0x80, 0x94, 0x8f, 0x75, 0xae, 0x7a,
0xac, 0x17, 0xa1, 0x85, 0xec, 0xf5, 0x0e, 0xb9, 0xa2, 0xe2, 0x9a, 0x46, 0x01, 0x50, 0xbd, 0xbb,
0xd4, 0x3b, 0x5f, 0xf4, 0x12, 0xc0, 0x72, 0x3e, 0x17, 0x4a, 0xce, 0xe7, 0x7b, 0xd0, 0x91, 0x64,
0x68, 0xdf, 0x49, 0x3b, 0x14, 0x0c, 0x6e, 0x9d, 0x89, 0x67, 0x61, 0xaa, 0x2f, 0x77, 0xd5, 0x97,
0x4b, 0x2f, 0xfb, 0x52, 0x61, 0x52, 0x31, 0x4c, 0xec, 0xcd, 0xfd, 0xd4, 0x4f, 0x8e, 0x95, 0xf5,
0x19, 0xe9, 0x0a, 0x3f, 0x81, 0xd9, 0x36, 0xcc, 0xe3, 0x67, 0x4a, 0x5b, 0xd7, 0x0b, 0x9d, 0x40,
0x61, 0x57, 0x61, 0x9e, 0x8f, 0xc6, 0x5c, 0x05, 0x5b, 0xcc, 0x0e, 0x7b, 0xf1, 0x8c, 0x3c, 0x81,
0x80, 0x2a, 0x00, 0xa1, 0x25, 0x15, 0x60, 0x6b, 0xfa, 0x05, 0x6c, 0x7e, 0x30, 0x72, 0x37, 0x80,
0x3d, 0x14, 0x5c, 0x6b, 0x26, 0x8b, 0x7f, 0x7b, 0x0e, 0xda, 0x06, 0x18, 0xa5, 0x79, 0x8c, 0x13,
0x1e, 0x8c, 0x02, 0x7f, 0xc2, 0x73, 0x9e, 0x4a, 0x4e, 0x2d, 0x41, 0x11, 0xcf, 0x3f, 0x19, 0x0f,
0xe2, 0x69, 0x3e, 0x18, 0xf1, 0x71, 0xca, 0x85, 0x8d, 0x44, 0x63, 0x60, 0x41, 0x11, 0x6f, 0xe2,
0x3f, 0x33, 0xf1, 0x04, 0x3f, 0x94, 0xa0, 0x2a, 0xf5, 0x2b, 0xf6, 0xa8, 0x59, 0xa4, 0x7e, 0xc5,
0x8e, 0x94, 0xf5, 0xd0, 0x7c, 0x8d, 0x1e, 0x7a, 0x17, 0x36, 0x85, 0xc6, 0x91, 0xb2, 0x39, 0x28,
0xb1, 0xc9, 0x19, 0xbd, 0x6c, 0x1b, 0x56, 0x71, 0xce, 0x8a, 0xc1, 0xb3, 0xe0, 0xdb, 0x22, 0x19,
0xe3, 0x78, 0x15, 0x38, 0xe2, 0xa2, 0x38, 0x5a, 0xb8, 0xa2, 0x3c, 0x56, 0x81, 0x13, 0xae, 0xff,
0xcc, 0xc6, 0x6d, 0x49, 0xdc, 0x12, 0xdc, 0x5d, 0x86, 0xf6, 0x41, 0x1e, 0x27, 0xea, 0x50, 0xba,
0xd0, 0x11, 0x4d, 0x59, 0x0c, 0x7d, 0x0d, 0x2e, 0x10, 0x17, 0x3d, 0x8a, 0x93, 0x38, 0x8c, 0xc7,
0xb3, 0x83, 0xe9, 0x61, 0x36, 0x4c, 0x83, 0x04, 0x03, 0x13, 0xf7, 0xef, 0x1d, 0x58, 0xb7, 0x7a,
0x65, 0xf6, 0xe6, 0x33, 0x82, 0xa5, 0x75, 0x15, 0x4b, 0x30, 0xde, 0x9a, 0xa1, 0x0e, 0x05, 0xa2,
0xc8, 0x9b, 0x3d, 0x96, 0x85, 0xad, 0x9b, 0xb0, 0xa2, 0x66, 0xa6, 0x3e, 0x14, 0x5c, 0xd8, 0xab,
0x72, 0xa1, 0xfc, 0xbe, 0x2b, 0x3f, 0x50, 0x24, 0x7e, 0x41, 0xf8, 0xd5, 0x7c, 0x44, 0x6b, 0x54,
0x61, 0x7c, 0x5f, 0x7d, 0x6f, 0x3a, 0xf3, 0x6a, 0x06, 0x43, 0x0d, 0xcc, 0xdc, 0xdf, 0x73, 0x00,
0x8a, 0xd9, 0x21, 0x63, 0x14, 0x2a, 0x5d, 0x5c, 0x39, 0x34, 0xd4, 0xf7, 0x9b, 0xd0, 0xd1, 0x05,
0x8c, 0xc2, 0x4a, 0xb4, 0x15, 0x0c, 0x1d, 0xae, 0x2b, 0xb0, 0x32, 0x0e, 0xe3, 0x43, 0x32, 0xb1,
0x54, 0x5d, 0xcf, 0x64, 0x49, 0xb8, 0x2b, 0xc0, 0xf7, 0x24, 0xb4, 0x30, 0x29, 0x4d, 0xc3, 0xa4,
0xb8, 0xdf, 0x69, 0xe8, 0xb4, 0x77, 0xb1, 0xe6, 0x33, 0xa5, 0x8c, 0xed, 0x56, 0x94, 0xe3, 0x19,
0x59, 0x66, 0x4a, 0x58, 0xed, 0xbf, 0x34, 0x9e, 0xbe, 0x01, 0xdd, 0x54, 0x68, 0x1f, 0xa5, 0x9a,
0x9a, 0x2f, 0x50, 0x4d, 0xcb, 0xa9, 0x65, 0x77, 0x3e, 0x05, 0xab, 0xfe, 0xe8, 0x84, 0xa7, 0x79,
0x40, 0x11, 0x0d, 0x19, 0x7d, 0xa1, 0x50, 0x57, 0x0c, 0x38, 0xd9, 0xe2, 0x2b, 0xb0, 0x22, 0xcb,
0xf0, 0x1a, 0x53, 0x5e, 0xbe, 0x2a, 0xc0, 0x88, 0xe8, 0xfe, 0x99, 0xca, 0xb0, 0xdb, 0x67, 0x78,
0xf6, 0x8e, 0x98, 0xab, 0x6b, 0x94, 0x56, 0xf7, 0x09, 0x99, 0xed, 0x1e, 0xa9, 0xb0, 0x49, 0xd6,
0x1d, 0x04, 0x50, 0x56, 0x27, 0xec, 0x2d, 0x6d, 0xbe, 0xca, 0x96, 0xba, 0x1f, 0x3b, 0xb0, 0xb8,
0x17, 0x27, 0x7b, 0xb2, 0xa2, 0x4e, 0x82, 0xa0, 0x2f, 0xb9, 0xa8, 0xa6, 0xe9, 0x15, 0x37, 0x2a,
0x5e, 0x71, 0xd5, 0xd6, 0x2e, 0x97, 0x6d, 0xed, 0x2f, 0xc2, 0x6b, 0x14, 0xb4, 0xa7, 0x71, 0x12,
0xa7, 0x28, 0x8c, 0x7e, 0x28, 0x0c, 0x6b, 0x1c, 0xe5, 0xc7, 0x4a, 0x8d, 0xbd, 0x08, 0x85, 0xa2,
0xa3, 0x30, 0x3f, 0x19, 0x08, 0x67, 0x58, 0xfa, 0x06, 0x42, 0xbb, 0x55, 0x3b, 0xdc, 0xcf, 0x41,
0x8b, 0x9c, 0x5b, 0x5a, 0xd6, 0xdb, 0xd0, 0x3a, 0x8e, 0x93, 0xc1, 0x71, 0x10, 0xe5, 0x4a, 0xb8,
0xbb, 0x85, 0xd7, 0xb9, 0x47, 0x1b, 0xa2, 0x11, 0xdc, 0x1f, 0xce, 0xc1, 0xe2, 0x07, 0xd1, 0x49,
0x1c, 0x0c, 0x29, 0x19, 0x3f, 0xe1, 0x93, 0x58, 0x5d, 0xf9, 0xc1, 0xdf, 0xb8, 0x15, 0x54, 0xfe,
0x4e, 0x72, 0x99, 0x4d, 0x57, 0x4d, 0x34, 0xf7, 0x69, 0x71, 0x0d, 0x4e, 0x88, 0x8e, 0x01, 0x41,
0xc7, 0x3e, 0x35, 0xef, 0x00, 0xca, 0x56, 0x71, 0x67, 0x6a, 0xde, 0xb8, 0x33, 0x45, 0xa5, 0x1b,
0x51, 0xd9, 0x27, 0xfe, 0x5a, 0xf2, 0x54, 0x93, 0x02, 0x91, 0x94, 0x8b, 0x64, 0x0b, 0x39, 0x0e,
0x8b, 0x32, 0x10, 0x31, 0x81, 0xe8, 0x5c, 0x88, 0x0f, 0x04, 0x8e, 0x50, 0xbe, 0x26, 0x08, 0x9d,
0xad, 0xf2, 0x35, 0xc2, 0x96, 0xe0, 0xf9, 0x12, 0x18, 0x35, 0xf4, 0x88, 0x6b, 0x45, 0x2a, 0xd6,
0x00, 0xe2, 0x9a, 0x5f, 0x19, 0x6e, 0x84, 0x2f, 0xe2, 0x86, 0x82, 0x0a, 0x5f, 0x90, 0x51, 0xfc,
0x30, 0x3c, 0xf4, 0x87, 0x4f, 0xe9, 0x72, 0x27, 0x5d, 0x48, 0x68, 0x79, 0x36, 0x10, 0x67, 0x6d,
0x9c, 0x26, 0x15, 0xff, 0x9a, 0x9e, 0x09, 0x62, 0xbb, 0xd0, 0xa6, 0x90, 0x4d, 0x9e, 0x67, 0x97,
0xce, 0x73, 0xd5, 0x8c, 0xe9, 0xe8, 0x44, 0x4d, 0x24, 0xb3, 0x40, 0xb0, 0x62, 0xdf, 0x19, 0xf8,
0x2a, 0xb0, 0x9b, 0xa3, 0x91, 0x3c, 0x6f, 0x1d, 0x32, 0x16, 0x27, 0xe5, 0x58, 0x27, 0x55, 0xb3,
0x63, 0x8d, 0xda, 0x1d, 0x73, 0xef, 0x42, 0x7b, 0xdf, 0xb8, 0xe1, 0x49, 0xac, 0xa1, 0xee, 0x76,
0x4a, 0x76, 0x32, 0x20, 0xc6, 0x80, 0x0d, 0x73, 0x40, 0xf7, 0xe7, 0x80, 0x3d, 0x08, 0xb2, 0x5c,
0xcf, 0x4f, 0x1c, 0xc7, 0x9b, 0xd0, 0xd1, 0x01, 0x76, 0x71, 0xa3, 0xa1, 0x2d, 0x61, 0x74, 0xd3,
0xe0, 0xa6, 0xb8, 0x0a, 0x51, 0x5e, 0xd8, 0x36, 0x2c, 0x05, 0x02, 0x54, 0x96, 0x04, 0x85, 0xa9,
0xfb, 0xd1, 0x5f, 0x93, 0x40, 0xcb, 0x8a, 0x7e, 0xdf, 0x81, 0x45, 0xb9, 0x34, 0xf4, 0x36, 0xac,
0xbb, 0xad, 0x62, 0x61, 0x16, 0xac, 0xfe, 0x46, 0x60, 0x95, 0x87, 0xe7, 0xea, 0x78, 0x98, 0x41,
0x33, 0xf1, 0xf3, 0x63, 0x0a, 0x50, 0x5a, 0x1e, 0xfd, 0x66, 0xab, 0x22, 0x68, 0x16, 0xb2, 0x42,
0x01, 0x73, 0xdd, 0x25, 0x54, 0xa1, 0x92, 0x2b, 0x70, 0x5c, 0x14, 0x5d, 0x1e, 0x10, 0x70, 0x5d,
0x13, 0x90, 0x17, 0x33, 0x0a, 0x70, 0xb1, 0x5f, 0x92, 0x44, 0x79, 0xbf, 0x24, 0xaa, 0xa7, 0xfb,
0xdd, 0x3e, 0xf4, 0xee, 0xf0, 0x90, 0xe7, 0xfc, 0x66, 0x18, 0x96, 0xe9, 0xbf, 0x06, 0x17, 0x6a,
0xfa, 0xa4, 0xd3, 0x72, 0x0f, 0xd6, 0xee, 0xf0, 0xc3, 0xe9, 0xf8, 0x01, 0x3f, 0x29, 0x0a, 0x77,
0x0c, 0x9a, 0xd9, 0x71, 0x7c, 0x2a, 0xcf, 0x96, 0x7e, 0xb3, 0xd7, 0x01, 0x42, 0xc4, 0x19, 0x64,
0x09, 0x1f, 0xaa, 0xbb, 0x70, 0x04, 0x39, 0x48, 0xf8, 0xd0, 0x7d, 0x17, 0x98, 0x49, 0x47, 0x2e,
0x01, 0xf5, 0xc0, 0xf4, 0x70, 0x90, 0xcd, 0xb2, 0x9c, 0x4f, 0xd4, 0x25, 0x3f, 0x13, 0xe4, 0x5e,
0x81, 0xce, 0xbe, 0x3f, 0xf3, 0xf8, 0xb7, 0xe4, 0xf5, 0x62, 0x8c, 0x8d, 0xfd, 0x19, 0xb2, 0xb2,
0x8e, 0x8d, 0xa9, 0xdb, 0xfd, 0xcf, 0x06, 0x2c, 0x08, 0x4c, 0xa4, 0x3a, 0xe2, 0x59, 0x1e, 0x44,
0xa2, 0x68, 0x25, 0xa9, 0x1a, 0xa0, 0x0a, 0x6f, 0x34, 0x6a, 0x78, 0x43, 0x7a, 0xab, 0xea, 0x5e,
0x91, 0x64, 0x02, 0x0b, 0x86, 0x6e, 0x4d, 0x71, 0x19, 0x40, 0x04, 0x67, 0x05, 0xa0, 0x94, 0x2c,
0x29, 0xb4, 0x8d, 0x98, 0x9f, 0x62, 0x5a, 0xc9, 0x0e, 0x26, 0xa8, 0x56, 0xa7, 0x2d, 0x0a, 0xae,
0xa9, 0xe8, 0xb4, 0x8a, 0xee, 0x5a, 0x7a, 0x05, 0xdd, 0x25, 0x5c, 0xd8, 0x17, 0xe9, 0x2e, 0x78,
0x05, 0xdd, 0xe5, 0x32, 0x58, 0xbd, 0xc7, 0xb9, 0xc7, 0xd1, 0x2a, 0x2a, 0x76, 0xfa, 0xae, 0x03,
0xab, 0xd2, 0xa0, 0xeb, 0x3e, 0xf6, 0xa6, 0x65, 0xfd, 0x9d, 0xba, 0x7a, 0xc4, 0x5b, 0xb0, 0x4c,
0x36, 0x59, 0x67, 0x85, 0x64, 0x0a, 0xcb, 0x02, 0xe2, 0x3a, 0x54, 0x86, 0x7d, 0x12, 0x84, 0xf2,
0x50, 0x4c, 0x90, 0x4a, 0x2c, 0x61, 0x7c, 0x4c, 0x47, 0xe2, 0x78, 0xba, 0xed, 0xfe, 0xb5, 0x03,
0x6b, 0xc6, 0x84, 0x25, 0x17, 0xde, 0x00, 0x75, 0x59, 0x40, 0x24, 0x8f, 0x84, 0x30, 0x6d, 0xd9,
0xce, 0x49, 0xf1, 0x99, 0x85, 0x4c, 0x87, 0xe9, 0xcf, 0x68, 0x82, 0xd9, 0x74, 0x22, 0x3d, 0x10,
0x13, 0x84, 0x8c, 0x74, 0xca, 0xf9, 0x53, 0x8d, 0x32, 0x47, 0x28, 0x16, 0x8c, 0x6a, 0xc1, 0xe8,
0x4b, 0x68, 0x24, 0x71, 0xfd, 0xc9, 0x06, 0xba, 0xff, 0xe8, 0xc0, 0xba, 0x70, 0x0a, 0xa5, 0xcb,
0xad, 0xaf, 0x66, 0x2e, 0x08, 0x2f, 0x58, 0x48, 0xe4, 0xde, 0x39, 0x4f, 0xb6, 0xd9, 0x67, 0x5f,
0xd1, 0x91, 0xd5, 0x77, 0x00, 0xce, 0x38, 0x8b, 0xb9, 0xba, 0xb3, 0x78, 0xc1, 0x4e, 0xd7, 0x25,
0x4b, 0xe6, 0x6b, 0x93, 0x25, 0xb7, 0x16, 0x61, 0x3e, 0x1b, 0xc6, 0x09, 0x77, 0x37, 0x61, 0xc3,
0x5e, 0x9c, 0x54, 0x41, 0xdf, 0x73, 0xa0, 0x77, 0x4f, 0xa4, 0x0e, 0x83, 0x68, 0xbc, 0x17, 0x64,
0x79, 0x9c, 0xea, 0xbb, 0xe8, 0x97, 0x00, 0xb2, 0xdc, 0x4f, 0x73, 0x71, 0x47, 0x4b, 0xa6, 0x39,
0x0a, 0x08, 0xce, 0x91, 0x47, 0x23, 0xd1, 0x2b, 0xce, 0x46, 0xb7, 0xf1, 0x60, 0xe8, 0x7e, 0xc2,
0x20, 0x3e, 0x3a, 0xca, 0xb8, 0x76, 0x5b, 0x4d, 0x18, 0x46, 0xbe, 0x28, 0xf1, 0x18, 0xeb, 0xf1,
0x13, 0x52, 0xb5, 0xc2, 0x1f, 0x2c, 0x41, 0xdd, 0xbf, 0x72, 0x60, 0xa5, 0x98, 0xe4, 0x5d, 0x04,
0xda, 0xda, 0x41, 0x4c, 0xcd, 0xd0, 0x0e, 0x2a, 0x01, 0x13, 0x8c, 0x06, 0x41, 0x24, 0xe7, 0x66,
0x40, 0x48, 0x62, 0x65, 0x2b, 0x9e, 0xaa, 0xfb, 0x70, 0x26, 0x48, 0x14, 0xbb, 0x73, 0xfc, 0x5a,
0x5c, 0x86, 0x93, 0x2d, 0xba, 0x62, 0x37, 0xc9, 0xe9, 0xab, 0x05, 0xe1, 0x10, 0xcb, 0xa6, 0xb2,
0x4f, 0x8b, 0x04, 0xc5, 0x9f, 0xee, 0xef, 0x3b, 0x70, 0xa1, 0x66, 0x73, 0xa5, 0x64, 0xdc, 0x81,
0xb5, 0x23, 0xdd, 0xa9, 0x36, 0x40, 0x88, 0xc7, 0xa6, 0xe4, 0xa2, 0xd2, 0xa2, 0xbd, 0xea, 0x07,
0xe8, 0x1e, 0x53, 0xde, 0x48, 0x6c, 0xa9, 0x75, 0x4f, 0xa4, 0xda, 0xb1, 0xfb, 0x07, 0x73, 0xd0,
0x15, 0xa5, 0x0a, 0xf1, 0x1c, 0x8a, 0xa7, 0xec, 0x43, 0x58, 0x94, 0xcf, 0xd9, 0xd8, 0x79, 0x39,
0xac, 0xfd, 0x80, 0xae, 0xbf, 0x59, 0x06, 0x4b, 0xde, 0x59, 0xff, 0xad, 0x8f, 0xff, 0xe5, 0x0f,
0x1b, 0xcb, 0xac, 0xbd, 0x73, 0xf2, 0xce, 0xce, 0x98, 0x47, 0x19, 0xd2, 0xf8, 0x15, 0x80, 0xe2,
0xa1, 0x17, 0xeb, 0x69, 0x27, 0xa3, 0xf4, 0x82, 0xad, 0x7f, 0xa1, 0xa6, 0x47, 0xd2, 0xbd, 0x40,
0x74, 0xd7, 0xdd, 0x2e, 0xd2, 0x0d, 0xa2, 0x20, 0x17, 0xaf, 0xbe, 0xde, 0x77, 0xb6, 0xd9, 0x08,
0x3a, 0xe6, 0x3b, 0x2e, 0xa6, 0x42, 0xe6, 0x9a, 0x57, 0x64, 0xfd, 0xd7, 0x6a, 0xfb, 0x54, 0xbe,
0x80, 0xc6, 0x38, 0xef, 0xae, 0xe2, 0x18, 0x53, 0xc2, 0x28, 0x46, 0x09, 0xa1, 0x6b, 0x3f, 0xd7,
0x62, 0x17, 0x0d, 0xb1, 0xae, 0x3c, 0x16, 0xeb, 0xbf, 0x7e, 0x46, 0xaf, 0x1c, 0xeb, 0x75, 0x1a,
0x6b, 0xcb, 0x65, 0x38, 0xd6, 0x90, 0x70, 0xd4, 0x63, 0xb1, 0xf7, 0x9d, 0xed, 0xdd, 0x7f, 0x7a,
0x0d, 0x5a, 0x3a, 0xc9, 0xc5, 0xbe, 0x09, 0xcb, 0x56, 0x2d, 0x89, 0xa9, 0x65, 0xd4, 0x95, 0x9e,
0xfa, 0x17, 0xeb, 0x3b, 0xe5, 0xc0, 0x97, 0x68, 0xe0, 0x1e, 0xdb, 0xc4, 0x81, 0x65, 0x31, 0x66,
0x87, 0x2a, 0x68, 0xe2, 0x02, 0xdf, 0x53, 0xb1, 0xce, 0xa2, 0xfe, 0x63, 0xad, 0xb3, 0x52, 0x2f,
0xb2, 0xd6, 0x59, 0x2d, 0x1a, 0xb9, 0x17, 0x69, 0xb8, 0x4d, 0xb6, 0x61, 0x0e, 0xa7, 0x93, 0x4f,
0x9c, 0xae, 0x5c, 0x9a, 0xaf, 0xb9, 0xd8, 0xeb, 0x9a, 0xb1, 0xea, 0x5e, 0x79, 0x69, 0x16, 0xa9,
0x3e, 0xf5, 0x72, 0x7b, 0x34, 0x14, 0x63, 0x74, 0x7c, 0xe6, 0x63, 0x2e, 0xf6, 0x75, 0x68, 0xe9,
0x17, 0x1c, 0x6c, 0xcb, 0x78, 0x36, 0x63, 0x3e, 0x2b, 0xe9, 0xf7, 0xaa, 0x1d, 0x75, 0x8c, 0x61,
0x52, 0x46, 0xc6, 0x78, 0x00, 0xe7, 0xa5, 0x4b, 0x7c, 0xc8, 0x7f, 0x94, 0x95, 0xd4, 0xbc, 0x41,
0xbb, 0xee, 0xb0, 0x1b, 0xb0, 0xa4, 0x1e, 0xc6, 0xb0, 0xcd, 0xfa, 0x07, 0x3e, 0xfd, 0xad, 0x0a,
0x5c, 0x6a, 0x8f, 0x9b, 0x00, 0xc5, 0xa3, 0x0e, 0x2d, 0x67, 0x95, 0xa7, 0x26, 0x7a, 0x13, 0x6b,
0x5e, 0x80, 0x8c, 0xe9, 0x09, 0x8b, 0xfd, 0x66, 0x84, 0xbd, 0x51, 0xe0, 0xd7, 0xbe, 0x26, 0x79,
0x01, 0x41, 0x77, 0x93, 0xf6, 0x6e, 0x95, 0x91, 0xe0, 0x46, 0xfc, 0x54, 0x5d, 0x3e, 0xbe, 0x03,
0x6d, 0xe3, 0xa1, 0x08, 0x53, 0x14, 0xaa, 0x8f, 0x4c, 0xfa, 0xfd, 0xba, 0x2e, 0x39, 0xdd, 0x2f,
0xc2, 0xb2, 0xf5, 0xe2, 0x43, 0x4b, 0x46, 0xdd, 0x7b, 0x12, 0x2d, 0x19, 0xf5, 0x8f, 0x44, 0xbe,
0x06, 0x6d, 0xe3, 0x7d, 0x06, 0x33, 0x2e, 0x5d, 0x95, 0x5e, 0x66, 0xe8, 0x19, 0xd5, 0x3d, 0xe7,
0xd8, 0xa0, 0xf5, 0x76, 0xdd, 0x16, 0xae, 0x97, 0x6e, 0xe0, 0x22, 0x93, 0x7c, 0x13, 0xba, 0xf6,
0x8b, 0x0d, 0x2d, 0x55, 0xb5, 0x6f, 0x3f, 0xb4, 0x54, 0x9d, 0xf1, 0xcc, 0x43, 0x32, 0xe4, 0xf6,
0xba, 0x1e, 0x64, 0xe7, 0x23, 0x59, 0xe2, 0x79, 0xce, 0xbe, 0x82, 0xaa, 0x43, 0x5e, 0x89, 0x66,
0xc5, 0x3b, 0x15, 0xfb, 0xe2, 0xb4, 0xe6, 0xf6, 0xca, 0xed, 0x69, 0x77, 0x8d, 0x88, 0xb7, 0x59,
0xb1, 0x02, 0x61, 0x0f, 0xe8, 0x6a, 0xb4, 0x61, 0x0f, 0xcc, 0xdb, 0xd3, 0x86, 0x3d, 0xb0, 0x6e,
0x50, 0x97, 0xed, 0x41, 0x1e, 0x20, 0x8d, 0x08, 0x56, 0x4a, 0xb7, 0x0e, 0xb4, 0xb0, 0xd4, 0x5f,
0xd3, 0xea, 0x5f, 0x7a, 0xf1, 0x65, 0x05, 0x5b, 0xcd, 0x28, 0xf5, 0xb2, 0xa3, 0x6e, 0xd5, 0xfd,
0x2a, 0x74, 0xcc, 0x9b, 0xf6, 0xda, 0x42, 0xd4, 0xbc, 0x0f, 0xd0, 0x16, 0xa2, 0xee, 0x6a, 0xbe,
0x3a, 0x5c, 0xd6, 0x31, 0x87, 0x61, 0x5f, 0x83, 0x15, 0xe3, 0x9a, 0xcd, 0xc1, 0x2c, 0x1a, 0x6a,
0xe6, 0xa9, 0x5e, 0xc2, 0xec, 0xd7, 0x79, 0x83, 0xee, 0x16, 0x11, 0x5e, 0x73, 0x2d, 0xc2, 0xc8,
0x38, 0xb7, 0xa1, 0x6d, 0x5e, 0xe1, 0x79, 0x01, 0xdd, 0x2d, 0xa3, 0xcb, 0xbc, 0x8f, 0x78, 0xdd,
0x61, 0x7f, 0xec, 0x40, 0xc7, 0xba, 0x10, 0x63, 0x65, 0x95, 0x4b, 0x74, 0x7a, 0x66, 0x9f, 0x49,
0xc8, 0xf5, 0x68, 0x92, 0x0f, 0xb6, 0xbf, 0x68, 0x6d, 0xf2, 0x47, 0x56, 0x54, 0x71, 0xad, 0xfc,
0x88, 0xf2, 0x79, 0x19, 0xc1, 0xbc, 0xa8, 0xfa, 0xfc, 0xba, 0xc3, 0xde, 0x17, 0x0f, 0x6d, 0x55,
0x16, 0x81, 0x19, 0xca, 0xad, 0xbc, 0x65, 0xe6, 0x9b, 0xd4, 0xab, 0xce, 0x75, 0x87, 0x7d, 0x43,
0xbc, 0x95, 0x94, 0xdf, 0xd2, 0xce, 0xbf, 0xea, 0xf7, 0xee, 0x5b, 0xb4, 0x9a, 0x4b, 0xee, 0x05,
0x6b, 0x35, 0x65, 0xed, 0xbe, 0x0f, 0x50, 0xa4, 0x84, 0x58, 0x29, 0x3f, 0xa2, 0xf5, 0x5e, 0x35,
0x6b, 0x64, 0x9f, 0xa8, 0x4a, 0xa3, 0x20, 0xc5, 0xaf, 0x0b, 0x66, 0x94, 0xf8, 0x99, 0x3e, 0xd2,
0x6a, 0x6a, 0xa7, 0xdf, 0xaf, 0xeb, 0xaa, 0x63, 0x45, 0x45, 0x9f, 0x3d, 0x86, 0xe5, 0x07, 0x71,
0xfc, 0x74, 0x9a, 0xe8, 0xa4, 0xa5, 0x9d, 0xa1, 0xd8, 0xf3, 0xb3, 0xe3, 0x7e, 0x69, 0x15, 0xee,
0x65, 0x22, 0xd5, 0x67, 0x3d, 0x83, 0xd4, 0xce, 0x47, 0x45, 0x42, 0xea, 0x39, 0xf3, 0x61, 0x4d,
0xdb, 0x38, 0x3d, 0xf1, 0xbe, 0x4d, 0xc6, 0xcc, 0x0b, 0x55, 0x86, 0xb0, 0xbc, 0x0e, 0x35, 0xdb,
0x9d, 0x4c, 0xd1, 0xbc, 0xee, 0xb0, 0x7d, 0xe8, 0xdc, 0xe1, 0xc3, 0x78, 0xc4, 0x65, 0x4e, 0x61,
0xbd, 0x98, 0xb8, 0x4e, 0x46, 0xf4, 0x97, 0x2d, 0xa0, 0x2d, 0xf5, 0x89, 0x3f, 0x4b, 0xf9, 0xb7,
0x76, 0x3e, 0x92, 0xd9, 0x8a, 0xe7, 0x4a, 0xea, 0x55, 0x86, 0xc5, 0x92, 0xfa, 0x52, 0x4a, 0xc6,
0x92, 0xfa, 0x4a, 0x4a, 0xc6, 0xda, 0x6a, 0x95, 0xe1, 0x61, 0x21, 0xac, 0x55, 0xb2, 0x38, 0xda,
0x52, 0x9e, 0x95, 0xfb, 0xe9, 0x5f, 0x3e, 0x1b, 0xc1, 0x1e, 0x6d, 0xdb, 0x1e, 0xed, 0x00, 0x96,
0xef, 0x70, 0xb1, 0x59, 0xa2, 0x32, 0xda, 0xb7, 0xd5, 0x88, 0x59, 0x45, 0x2d, 0xab, 0x18, 0xea,
0xb3, 0xd5, 0x3a, 0x95, 0x25, 0xd9, 0xd7, 0xa1, 0x7d, 0x9f, 0xe7, 0xaa, 0x14, 0xaa, 0xfd, 0x8d,
0x52, 0x6d, 0xb4, 0x5f, 0x53, 0x49, 0xb5, 0x79, 0x86, 0xa8, 0xed, 0xf0, 0xd1, 0x98, 0x0b, 0x61,
0x1f, 0x04, 0xa3, 0xe7, 0xec, 0x97, 0x88, 0xb8, 0xbe, 0x3d, 0xb1, 0x69, 0x54, 0xd0, 0x4c, 0xe2,
0x2b, 0x25, 0x78, 0x1d, 0xe5, 0x28, 0x1e, 0x71, 0xc3, 0xc0, 0x45, 0xd0, 0x36, 0xae, 0xf6, 0x68,
0x01, 0xaa, 0x5e, 0x27, 0xd2, 0x02, 0x54, 0x73, 0x13, 0xc8, 0xbd, 0x4a, 0xe3, 0xb8, 0xec, 0x72,
0x31, 0x8e, 0xb8, 0xfd, 0x53, 0x8c, 0xb4, 0xf3, 0x91, 0x3f, 0xc9, 0x9f, 0xb3, 0x27, 0xf4, 0x56,
0xc8, 0x2c, 0xf7, 0x16, 0xfe, 0x4e, 0xb9, 0x32, 0xac, 0x37, 0xcb, 0xe8, 0xb2, 0x7d, 0x20, 0x31,
0x14, 0xd9, 0xc1, 0xcf, 0x02, 0x1c, 0xe4, 0x71, 0x72, 0xc7, 0xe7, 0x93, 0x38, 0x2a, 0x34, 0x57,
0x51, 0xd2, 0x2c, 0x34, 0x97, 0x51, 0xd7, 0x64, 0x4f, 0x0c, 0x8f, 0xd3, 0xaa, 0x96, 0x2b, 0xe6,
0x3a, 0xb3, 0xea, 0xa9, 0x37, 0xa4, 0xa6, 0xf2, 0x79, 0xdd, 0x41, 0xff, 0xb1, 0xc8, 0x19, 0x6a,
0xff, 0xb1, 0x92, 0x8e, 0xd4, 0x6a, 0xaf, 0x26, 0xc1, 0xb8, 0x0f, 0xad, 0x22, 0x09, 0xa5, 0x4c,
0x52, 0x39, 0x65, 0xa5, 0x6d, 0x4c, 0x25, 0x35, 0xe4, 0xae, 0xd2, 0x56, 0x01, 0x5b, 0xc2, 0xad,
0xa2, 0x7c, 0x4f, 0x00, 0xeb, 0x62, 0x82, 0xda, 0x60, 0x52, 0x91, 0x4e, 0xad, 0xa4, 0x26, 0x3d,
0xa3, 0xa5, 0xb9, 0x36, 0xbb, 0x61, 0x45, 0x92, 0xc8, 0xad, 0xa2, 0x40, 0x88, 0xaa, 0x79, 0x02,
0x6b, 0x95, 0xd0, 0x5c, 0x8b, 0xf4, 0x59, 0x19, 0x11, 0x2d, 0xd2, 0x67, 0x46, 0xf5, 0xee, 0x79,
0x1a, 0x72, 0xc5, 0x05, 0x1c, 0x32, 0x3b, 0x0d, 0xf2, 0xe1, 0xf1, 0xfb, 0xce, 0xf6, 0xe1, 0x02,
0xfd, 0x3b, 0xcd, 0xa7, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xe4, 0xec, 0x07, 0x7d, 0xcf, 0x46,
0x00, 0x00,
}

@ -71,6 +71,19 @@ func request_WalletUnlocker_UnlockWallet_0(ctx context.Context, marshaler runtim
}
func request_WalletUnlocker_ChangePassword_0(ctx context.Context, marshaler runtime.Marshaler, client WalletUnlockerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ChangePasswordRequest
var metadata runtime.ServerMetadata
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ChangePassword(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func request_Lightning_WalletBalance_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq WalletBalanceRequest
var metadata runtime.ServerMetadata
@ -592,15 +605,7 @@ func RegisterWalletUnlockerHandlerFromEndpoint(ctx context.Context, mux *runtime
// RegisterWalletUnlockerHandler registers the http handlers for service WalletUnlocker to "mux".
// The handlers forward requests to the grpc endpoint over "conn".
func RegisterWalletUnlockerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterWalletUnlockerHandlerClient(ctx, mux, NewWalletUnlockerClient(conn))
}
// RegisterWalletUnlockerHandler registers the http handlers for service WalletUnlocker to "mux".
// The handlers forward requests to the grpc endpoint over the given implementation of "WalletUnlockerClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "WalletUnlockerClient"
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
// "WalletUnlockerClient" to call the correct interceptors.
func RegisterWalletUnlockerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WalletUnlockerClient) error {
client := NewWalletUnlockerClient(conn)
mux.Handle("GET", pattern_WalletUnlocker_GenSeed_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(ctx)
@ -689,6 +694,35 @@ func RegisterWalletUnlockerHandlerClient(ctx context.Context, mux *runtime.Serve
})
mux.Handle("POST", pattern_WalletUnlocker_ChangePassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
if cn, ok := w.(http.CloseNotifier); ok {
go func(done <-chan struct{}, closed <-chan bool) {
select {
case <-done:
case <-closed:
cancel()
}
}(ctx.Done(), cn.CloseNotify())
}
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_WalletUnlocker_ChangePassword_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_WalletUnlocker_ChangePassword_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -698,6 +732,8 @@ var (
pattern_WalletUnlocker_InitWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "initwallet"}, ""))
pattern_WalletUnlocker_UnlockWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "unlockwallet"}, ""))
pattern_WalletUnlocker_ChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "changepassword"}, ""))
)
var (
@ -706,6 +742,8 @@ var (
forward_WalletUnlocker_InitWallet_0 = runtime.ForwardResponseMessage
forward_WalletUnlocker_UnlockWallet_0 = runtime.ForwardResponseMessage
forward_WalletUnlocker_ChangePassword_0 = runtime.ForwardResponseMessage
)
// RegisterLightningHandlerFromEndpoint is same as RegisterLightningHandler but
@ -736,15 +774,7 @@ func RegisterLightningHandlerFromEndpoint(ctx context.Context, mux *runtime.Serv
// RegisterLightningHandler registers the http handlers for service Lightning to "mux".
// The handlers forward requests to the grpc endpoint over "conn".
func RegisterLightningHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterLightningHandlerClient(ctx, mux, NewLightningClient(conn))
}
// RegisterLightningHandler registers the http handlers for service Lightning to "mux".
// The handlers forward requests to the grpc endpoint over the given implementation of "LightningClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "LightningClient"
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
// "LightningClient" to call the correct interceptors.
func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, client LightningClient) error {
client := NewLightningClient(conn)
mux.Handle("GET", pattern_Lightning_WalletBalance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(ctx)

@ -75,6 +75,17 @@ service WalletUnlocker {
body: "*"
};
}
/** lncli: `changepassword`
ChangePassword changes the password of the encrypted wallet. This will
automatically unlock the wallet database if successful.
*/
rpc ChangePassword (ChangePasswordRequest) returns (ChangePasswordResponse) {
option (google.api.http) = {
post: "/v1/changepassword"
body: "*"
};
}
}
message GenSeedRequest {
@ -159,6 +170,21 @@ message UnlockWalletRequest {
}
message UnlockWalletResponse {}
message ChangePasswordRequest {
/**
current_password should be the current valid passphrase used to unlock the
daemon.
*/
bytes current_password = 1;
/**
new_password should be the new passphrase that will be needed to unlock the
daemon.
*/
bytes new_password = 2;
}
message ChangePasswordResponse {}
service Lightning {
/** lncli: `walletbalance`
WalletBalance returns total unspent outputs(confirmed and unconfirmed), all

@ -49,6 +49,33 @@
]
}
},
"/v1/changepassword": {
"post": {
"summary": "* lncli: `changepassword`\nChangePassword changes the password of the encrypted wallet. This will\nautomatically unlock the wallet database if successful.",
"operationId": "ChangePassword",
"responses": {
"200": {
"description": "",
"schema": {
"$ref": "#/definitions/lnrpcChangePasswordResponse"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/lnrpcChangePasswordRequest"
}
}
],
"tags": [
"WalletUnlocker"
]
}
},
"/v1/channels": {
"get": {
"summary": "* lncli: `listchannels`\nListChannels returns a description of all the open channels that this node\nis a participant in.",
@ -920,6 +947,24 @@
}
}
},
"lnrpcChangePasswordRequest": {
"type": "object",
"properties": {
"current_password": {
"type": "string",
"format": "byte",
"description": "*\ncurrent_password should be the current valid passphrase used to unlock the\ndaemon."
},
"new_password": {
"type": "string",
"format": "byte",
"description": "*\nnew_password should be the new passphrase that will be needed to unlock the\ndaemon."
}
}
},
"lnrpcChangePasswordResponse": {
"type": "object"
},
"lnrpcChannel": {
"type": "object",
"properties": {

@ -11,10 +11,6 @@ import (
"github.com/roasbeef/btcutil"
)
// ErrNotMine is an error denoting that a WalletController instance is unable
// to spend a specified output.
var ErrNotMine = errors.New("the passed output doesn't belong to the wallet")
// AddressType is an enum-like type which denotes the possible address types
// WalletController supports.
type AddressType uint8
@ -32,10 +28,24 @@ const (
UnknownAddressType
)
// ErrDoubleSpend is returned from PublishTransaction in case the
// tx being published is spending an output spent by a conflicting
// transaction.
var ErrDoubleSpend = errors.New("Transaction rejected: output already spent")
var (
// DefaultPublicPassphrase is the default public passphrase used for the
// wallet.
DefaultPublicPassphrase = []byte("public")
// DefaultPrivatePassphrase is the default private passphrase used for
// the wallet.
DefaultPrivatePassphrase = []byte("hello")
// ErrDoubleSpend is returned from PublishTransaction in case the
// tx being published is spending an output spent by a conflicting
// transaction.
ErrDoubleSpend = errors.New("Transaction rejected: output already spent")
// ErrNotMine is an error denoting that a WalletController instance is
// unable to spend a specified output.
ErrNotMine = errors.New("the passed output doesn't belong to the wallet")
)
// Utxo is an unspent output denoted by its outpoint, and output value of the
// original output.

@ -18,9 +18,9 @@ import (
)
var (
// dbFileName is the filename within the data directory which contains
// DBFilename is the filename within the data directory which contains
// the macaroon stores.
dbFilename = "macaroons.db"
DBFilename = "macaroons.db"
)
// Service encapsulates bakery.Bakery and adds a Close() method that zeroes the
@ -42,7 +42,7 @@ type Service struct {
func NewService(dir string, checks ...Checker) (*Service, error) {
// Open the database that we'll use to store the primary macaroon key,
// and all generated macaroons+caveats.
macaroonDB, err := bolt.Open(path.Join(dir, dbFilename), 0600,
macaroonDB, err := bolt.Open(path.Join(dir, DBFilename), 0600,
bolt.DefaultOptions)
if err != nil {
return nil, err

@ -2,13 +2,15 @@ package walletunlocker
import (
"crypto/rand"
"errors"
"fmt"
"os"
"time"
"github.com/lightningnetwork/lnd/aezeed"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwallet/btcwallet"
"github.com/lightningnetwork/lnd/macaroons"
"github.com/roasbeef/btcd/chaincfg"
"github.com/roasbeef/btcwallet/wallet"
"golang.org/x/net/context"
@ -65,20 +67,21 @@ type UnlockerService struct {
// sent.
UnlockMsgs chan *WalletUnlockMsg
chainDir string
netParams *chaincfg.Params
authSvc *macaroons.Service
chainDir string
netParams *chaincfg.Params
macaroonFiles []string
}
// New creates and returns a new UnlockerService.
func New(authSvc *macaroons.Service, chainDir string,
params *chaincfg.Params) *UnlockerService {
func New(chainDir string, params *chaincfg.Params,
macaroonFiles []string) *UnlockerService {
return &UnlockerService{
InitMsgs: make(chan *WalletInitMsg, 1),
UnlockMsgs: make(chan *WalletUnlockMsg, 1),
chainDir: chainDir,
netParams: params,
InitMsgs: make(chan *WalletInitMsg, 1),
UnlockMsgs: make(chan *WalletUnlockMsg, 1),
chainDir: chainDir,
netParams: params,
macaroonFiles: macaroonFiles,
}
}
@ -172,12 +175,10 @@ func (u *UnlockerService) GenSeed(ctx context.Context,
func (u *UnlockerService) InitWallet(ctx context.Context,
in *lnrpc.InitWalletRequest) (*lnrpc.InitWalletResponse, error) {
// Require the provided password to have a length of at least 8
// characters.
// Make sure the password meets our constraints.
password := in.WalletPassword
if len(password) < 8 {
return nil, fmt.Errorf("password must have " +
"at least 8 characters")
if err := validatePassword(password); err != nil {
return nil, err
}
// Require that the recovery window be non-negative.
@ -216,15 +217,6 @@ func (u *UnlockerService) InitWallet(ctx context.Context,
return nil, err
}
// Attempt to create a password for the macaroon service.
if u.authSvc != nil {
err = u.authSvc.CreateUnlock(&password)
if err != nil {
return nil, fmt.Errorf("unable to create/unlock "+
"macaroon store: %v", err)
}
}
// With the cipher seed deciphered, and the auth service created, we'll
// now send over the wallet password and the seed. This will allow the
// daemon to initialize itself and startup.
@ -277,15 +269,6 @@ func (u *UnlockerService) UnlockWallet(ctx context.Context,
return nil, err
}
// Attempt to create a password for the macaroon service.
if u.authSvc != nil {
err = u.authSvc.CreateUnlock(&password)
if err != nil {
return nil, fmt.Errorf("unable to create/unlock "+
"macaroon store: %v", err)
}
}
walletUnlockMsg := &WalletUnlockMsg{
Passphrase: password,
RecoveryWindow: recoveryWindow,
@ -298,3 +281,85 @@ func (u *UnlockerService) UnlockWallet(ctx context.Context,
return &lnrpc.UnlockWalletResponse{}, nil
}
// ChangePassword changes the password of the wallet and sends the new password
// across the UnlockPasswords channel to automatically unlock the wallet if
// successful.
func (u *UnlockerService) ChangePassword(ctx context.Context,
in *lnrpc.ChangePasswordRequest) (*lnrpc.ChangePasswordResponse, error) {
netDir := btcwallet.NetworkDir(u.chainDir, u.netParams)
loader := wallet.NewLoader(u.netParams, netDir, 0)
// First, we'll make sure the wallet exists for the specific chain and
// network.
walletExists, err := loader.WalletExists()
if err != nil {
return nil, err
}
if !walletExists {
return nil, errors.New("wallet not found")
}
publicPw := in.CurrentPassword
privatePw := in.CurrentPassword
// If the current password is blank, we'll assume the user is coming
// from a --noencryptwallet state, so we'll use the default passwords.
if len(in.CurrentPassword) == 0 {
publicPw = lnwallet.DefaultPublicPassphrase
privatePw = lnwallet.DefaultPrivatePassphrase
}
// Make sure the new password meets our constraints.
if err := validatePassword(in.NewPassword); err != nil {
return nil, err
}
// Load the existing wallet in order to proceed with the password change.
w, err := loader.OpenExistingWallet(publicPw, false)
if err != nil {
return nil, err
}
// Unload the wallet to allow lnd to open it later on.
defer loader.UnloadWallet()
// Since the macaroon database is also encrypted with the wallet's
// password, we'll remove all of the macaroon files so that they're
// re-generated at startup using the new password. We'll make sure to do
// this after unlocking the wallet to ensure macaroon files don't get
// deleted with incorrect password attempts.
for _, file := range u.macaroonFiles {
if err := os.Remove(file); err != nil {
return nil, err
}
}
// Attempt to change both the public and private passphrases for the
// wallet. This will be done atomically in order to prevent one
// passphrase change from being successful and not the other.
err = w.ChangePassphrases(
publicPw, in.NewPassword, privatePw, in.NewPassword,
)
if err != nil {
return nil, fmt.Errorf("unable to change wallet passphrase: "+
"%v", err)
}
// Finally, send the new password across the UnlockPasswords channel to
// automatically unlock the wallet.
u.UnlockMsgs <- &WalletUnlockMsg{Passphrase: in.NewPassword}
return &lnrpc.ChangePasswordResponse{}, nil
}
// validatePassword assures the password meets all of our constraints.
func validatePassword(password []byte) error {
// Passwords should have a length of at least 8 characters.
if len(password) < 8 {
return errors.New("password must have at least 8 characters")
}
return nil
}

@ -64,10 +64,9 @@ func TestGenSeed(t *testing.T) {
if err != nil {
t.Fatalf("unable to create temp directory: %v", err)
}
defer func() {
os.RemoveAll(testDir)
}()
service := walletunlocker.New(nil, testDir, testNetParams)
defer os.RemoveAll(testDir)
service := walletunlocker.New(testDir, testNetParams, nil)
// Now that the service has been created, we'll ask it to generate a
// new seed for us given a test passphrase.
@ -108,7 +107,7 @@ func TestGenSeedGenerateEntropy(t *testing.T) {
defer func() {
os.RemoveAll(testDir)
}()
service := walletunlocker.New(nil, testDir, testNetParams)
service := walletunlocker.New(testDir, testNetParams, nil)
// Now that the service has been created, we'll ask it to generate a
// new seed for us given a test passphrase. Note that we don't actually
@ -148,7 +147,7 @@ func TestGenSeedInvalidEntropy(t *testing.T) {
defer func() {
os.RemoveAll(testDir)
}()
service := walletunlocker.New(nil, testDir, testNetParams)
service := walletunlocker.New(testDir, testNetParams, nil)
// Now that the service has been created, we'll ask it to generate a
// new seed for us given a test passphrase. However, we'll be using an
@ -186,7 +185,7 @@ func TestInitWallet(t *testing.T) {
}()
// Create new UnlockerService.
service := walletunlocker.New(nil, testDir, testNetParams)
service := walletunlocker.New(testDir, testNetParams, nil)
// Once we have the unlocker service created, we'll now instantiate a
// new cipher seed instance.
@ -287,7 +286,7 @@ func TestCreateWalletInvalidEntropy(t *testing.T) {
}()
// Create new UnlockerService.
service := walletunlocker.New(nil, testDir, testNetParams)
service := walletunlocker.New(testDir, testNetParams, nil)
// We'll attempt to init the wallet with an invalid cipher seed and
// passphrase.
@ -320,7 +319,7 @@ func TestUnlockWallet(t *testing.T) {
}()
// Create new UnlockerService.
service := walletunlocker.New(nil, testDir, testNetParams)
service := walletunlocker.New(testDir, testNetParams, nil)
ctx := context.Background()
req := &lnrpc.UnlockWalletRequest{
@ -368,3 +367,101 @@ func TestUnlockWallet(t *testing.T) {
t.Fatalf("password not received")
}
}
// TestChangeWalletPassword tests that we can successfully change the wallet's
// password needed to unlock it.
func TestChangeWalletPassword(t *testing.T) {
t.Parallel()
// testDir is empty, meaning wallet was not created from before.
testDir, err := ioutil.TempDir("", "testchangepassword")
if err != nil {
t.Fatalf("unable to create temp directory: %v", err)
}
defer os.RemoveAll(testDir)
// Create some files that will act as macaroon files that should be
// deleted after a password change is successful.
var tempFiles []string
for i := 0; i < 3; i++ {
file, err := ioutil.TempFile(testDir, "")
if err != nil {
t.Fatalf("unable to create temp file: %v", err)
}
tempFiles = append(tempFiles, file.Name())
file.Close()
}
// Create a new UnlockerService with our temp files.
service := walletunlocker.New(testDir, testNetParams, tempFiles)
ctx := context.Background()
newPassword := []byte("hunter2???")
req := &lnrpc.ChangePasswordRequest{
CurrentPassword: testPassword,
NewPassword: newPassword,
}
// Changing the password to a non-existing wallet should fail.
_, err = service.ChangePassword(ctx, req)
if err == nil {
t.Fatal("expected call to ChangePassword to fail")
}
// Create a wallet to test changing the password.
createTestWallet(t, testDir, testNetParams)
// Attempting to change the wallet's password using an incorrect
// current password should fail.
wrongReq := &lnrpc.ChangePasswordRequest{
CurrentPassword: []byte("wrong-ofc"),
NewPassword: newPassword,
}
_, err = service.ChangePassword(ctx, wrongReq)
if err == nil {
t.Fatal("expected call to ChangePassword to fail")
}
// The files should still exist after an unsuccessful attempt to change
// the wallet's password.
for _, tempFile := range tempFiles {
if _, err := os.Stat(tempFile); os.IsNotExist(err) {
t.Fatal("file does not exist but it should")
}
}
// Attempting to change the wallet's password using an invalid
// new password should fail.
wrongReq.NewPassword = []byte("8")
_, err = service.ChangePassword(ctx, wrongReq)
if err == nil {
t.Fatal("expected call to ChangePassword to fail")
}
// When providing the correct wallet's current password and a new
// password that meets the length requirement, the password change
// should succeed.
_, err = service.ChangePassword(ctx, req)
if err != nil {
t.Fatalf("unable to change wallet's password: %v", err)
}
// The files should no longer exist.
for _, tempFile := range tempFiles {
if _, err := os.Open(tempFile); err == nil {
t.Fatal("file exists but it shouldn't")
}
}
// The new password should be sent over the channel.
select {
case unlockMsg := <-service.UnlockMsgs:
if !bytes.Equal(unlockMsg.Passphrase, newPassword) {
t.Fatalf("expected to receive password %x, got %x",
testPassword, unlockMsg.Passphrase)
}
case <-time.After(3 * time.Second):
t.Fatalf("password not received")
}
}