fix merge conflicts while rebasing onto file-cache branch

This commit is contained in:
Larry Ruane 2020-03-22 13:18:48 -06:00 committed by Larry Ruane
parent ccb7211712
commit 8974cd1586
8 changed files with 172 additions and 419 deletions

View File

@ -48,6 +48,7 @@ var rootCmd = &cobra.Command{
NoTLSVeryInsecure: viper.GetBool("no-tls-very-insecure"),
DataDir: viper.GetString("data-dir"),
Redownload: viper.GetBool("redownload"),
DarkSide: viper.GetBool("darkside-very-insecure"),
}
common.Log.Debugf("Options: %#v\n", opts)
@ -56,12 +57,14 @@ var rootCmd = &cobra.Command{
opts.TLSCertPath,
opts.TLSKeyPath,
opts.LogFile,
opts.ZcashConfPath,
}
if !fileExists(opts.LogFile) {
os.OpenFile(opts.LogFile, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
}
if !opts.DarkSide {
filesThatShouldExist = append(filesThatShouldExist, opts.ZcashConfPath)
}
for _, filename := range filesThatShouldExist {
if opts.NoTLSVeryInsecure && (filename == opts.TLSCertPath || filename == opts.TLSKeyPath) {
continue
@ -159,14 +162,18 @@ func startServer(opts *common.Options) error {
// sending transactions, but in the future it could back a different type
// of block streamer.
rpcClient, err := frontend.NewZRPCFromConf(opts.ZcashConfPath)
if err != nil {
common.Log.WithFields(logrus.Fields{
"error": err,
}).Fatal("setting up RPC connection to zcashd")
if opts.DarkSide {
common.RawRequest = common.DarkSideRawRequest
} else {
rpcClient, err := frontend.NewZRPCFromConf(opts.ZcashConfPath)
if err != nil {
common.Log.WithFields(logrus.Fields{
"error": err,
}).Fatal("setting up RPC connection to zcashd")
}
// Indirect function for test mocking (so unit tests can talk to stub functions).
common.RawRequest = rpcClient.RawRequest
}
// Indirect function for test mocking (so unit tests can talk to stub functions).
common.RawRequest = rpcClient.RawRequest
// Get the sapling activation height from the RPC
// (this first RPC also verifies that we can communicate with zcashd)
@ -249,6 +256,7 @@ func init() {
rootCmd.Flags().Bool("no-tls-very-insecure", false, "run without the required TLS certificate, only for debugging, DO NOT use in production")
rootCmd.Flags().Bool("redownload", false, "re-fetch all blocks from zcashd; reinitialize local cache files")
rootCmd.Flags().String("data-dir", "/var/lib/lightwalletd", "data directory (such as db)")
rootCmd.Flags().Bool("darkside-very-insecure", false, "run with GRPC-controllable mock zcashd for integration testing (shuts down after 30 minutes)")
viper.BindPFlag("grpc-bind-addr", rootCmd.Flags().Lookup("grpc-bind-addr"))
viper.SetDefault("grpc-bind-addr", "127.0.0.1:9067")
@ -270,6 +278,8 @@ func init() {
viper.SetDefault("redownload", false)
viper.BindPFlag("data-dir", rootCmd.Flags().Lookup("data-dir"))
viper.SetDefault("data-dir", "/var/lib/lightwalletd")
viper.BindPFlag("darkside-very-insecure", rootCmd.Flags().Lookup("darkside-very-insecure"))
viper.SetDefault("darkside-very-insecure", false)
logger.SetFormatter(&logrus.TextFormatter{
//DisableColors: true,

View File

@ -1,266 +0,0 @@
package main
import (
"context"
"flag"
"fmt"
"net"
"os"
"os/signal"
"syscall"
"time"
"github.com/sirupsen/logrus"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/peer"
"google.golang.org/grpc/reflection"
"github.com/zcash/lightwalletd/common"
"github.com/zcash/lightwalletd/frontend"
"github.com/zcash/lightwalletd/walletrpc"
)
var logger = logrus.New()
func init() {
logger.SetFormatter(&logrus.TextFormatter{
//DisableColors: true,
FullTimestamp: true,
DisableLevelTruncation: true,
})
onexit := func() {
fmt.Println("Lightwalletd died with a Fatal error. Check logfile for details.")
}
common.Log = logger.WithFields(logrus.Fields{
"app": "frontend-grpc",
})
logrus.RegisterExitHandler(onexit)
}
// TODO stream logging
func LoggingInterceptor() grpc.ServerOption {
return grpc.UnaryInterceptor(logInterceptor)
}
func logInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
reqLog := loggerFromContext(ctx)
start := time.Now()
resp, err := handler(ctx, req)
entry := reqLog.WithFields(logrus.Fields{
"method": info.FullMethod,
"duration": time.Since(start),
"error": err,
})
if err != nil {
entry.Error("call failed")
} else {
entry.Info("method called")
}
return resp, err
}
func loggerFromContext(ctx context.Context) *logrus.Entry {
// TODO: anonymize the addresses. cryptopan?
if peerInfo, ok := peer.FromContext(ctx); ok {
return common.Log.WithFields(logrus.Fields{"peer_addr": peerInfo.Addr})
}
return common.Log.WithFields(logrus.Fields{"peer_addr": "unknown"})
}
type Options struct {
bindAddr string `json:"bind_address,omitempty"`
tlsCertPath string `json:"tls_cert_path,omitempty"`
tlsKeyPath string `json:"tls_cert_key,omitempty"`
logLevel uint64 `json:"log_level,omitempty"`
logPath string `json:"log_file,omitempty"`
zcashConfPath string `json:"zcash_conf,omitempty"`
veryInsecure bool `json:"very_insecure,omitempty"`
darkSide bool `json:"very_insecure,omitempty"`
cacheSize int `json:"cache_size,omitempty"`
wantVersion bool
}
func fileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
func main() {
opts := &Options{}
flag.StringVar(&opts.bindAddr, "bind-addr", "127.0.0.1:9067", "the address to listen on")
flag.StringVar(&opts.tlsCertPath, "tls-cert", "", "the path to a TLS certificate")
flag.StringVar(&opts.tlsKeyPath, "tls-key", "", "the path to a TLS key file")
flag.Uint64Var(&opts.logLevel, "log-level", uint64(logrus.InfoLevel), "log level (logrus 1-7)")
flag.StringVar(&opts.logPath, "log-file", "./server.log", "log file to write to")
flag.StringVar(&opts.zcashConfPath, "conf-file", "./zcash.conf", "conf file to pull RPC creds from")
flag.BoolVar(&opts.veryInsecure, "no-tls-very-insecure", false, "run without the required TLS certificate, only for debugging, DO NOT use in production")
flag.BoolVar(&opts.darkSide, "darkside-very-insecure", false, "run with GRPC-controllable mock zcashd for integration testing (shuts down after 30 minutes)")
flag.BoolVar(&opts.wantVersion, "version", false, "version (major.minor.patch)")
flag.IntVar(&opts.cacheSize, "cache-size", 80000, "number of blocks to hold in the cache")
// TODO prod metrics
// TODO support config from file and env vars
flag.Parse()
if opts.wantVersion {
fmt.Println("lightwalletd version v0.3.0")
return
}
// production (unlike unit tests) use the real sleep function
common.Sleep = time.Sleep
if opts.logPath != "" {
// instead write parsable logs for logstash/splunk/etc
output, err := os.OpenFile(opts.logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
os.Stderr.WriteString(fmt.Sprintf("Cannot open log file %s: %v\n",
opts.logPath, err))
os.Exit(1)
}
defer output.Close()
logger.SetOutput(output)
logger.SetFormatter(&logrus.JSONFormatter{})
}
logger.SetLevel(logrus.Level(opts.logLevel))
filesThatShouldExist := []string{}
if !opts.darkSide {
filesThatShouldExist = append(filesThatShouldExist, opts.zcashConfPath)
}
if opts.tlsCertPath != "" {
filesThatShouldExist = append(filesThatShouldExist, opts.tlsCertPath)
}
if opts.tlsKeyPath != "" {
filesThatShouldExist = append(filesThatShouldExist, opts.tlsKeyPath)
}
for _, filename := range filesThatShouldExist {
if !fileExists(filename) {
common.Log.WithFields(logrus.Fields{
"filename": filename,
}).Error("cannot open required file")
os.Stderr.WriteString("Cannot open required file: " + filename + "\n")
os.Exit(1)
}
}
// gRPC initialization
var server *grpc.Server
var err error
if opts.veryInsecure {
server = grpc.NewServer(LoggingInterceptor())
} else {
var transportCreds credentials.TransportCredentials
if (opts.tlsCertPath == "") && (opts.tlsKeyPath == "") {
common.Log.Warning("Certificate and key not provided, generating self signed values")
tlsCert := common.GenerateCerts()
transportCreds = credentials.NewServerTLSFromCert(tlsCert)
} else {
transportCreds, err = credentials.NewServerTLSFromFile(opts.tlsCertPath, opts.tlsKeyPath)
if err != nil {
common.Log.WithFields(logrus.Fields{
"cert_file": opts.tlsCertPath,
"key_path": opts.tlsKeyPath,
"error": err,
}).Fatal("couldn't load TLS credentials")
}
}
server = grpc.NewServer(grpc.Creds(transportCreds), LoggingInterceptor())
}
// Enable reflection for debugging
if opts.logLevel >= uint64(logrus.WarnLevel) {
reflection.Register(server)
}
if opts.darkSide {
common.RawRequest = common.DarkSideRawRequest
} else {
// Initialize Zcash RPC client. Right now (Jan 2018) this is only for
// sending transactions, but in the future it could back a different type
// of block streamer.
rpcClient, err := frontend.NewZRPCFromConf(opts.zcashConfPath)
if err != nil {
common.Log.WithFields(logrus.Fields{
"error": err,
}).Fatal("setting up RPC connection to zcashd")
}
// indirect function for test mocking (so unit tests can talk to stub functions)
common.RawRequest = rpcClient.RawRequest
}
// Get the sapling activation height from the RPC
// (this first RPC also verifies that we can communicate with zcashd)
saplingHeight, blockHeight, chainName, branchID := common.GetSaplingInfo()
common.Log.Info("Got sapling height ", saplingHeight, " chain ", chainName, " branchID ", branchID)
// Initialize the cache
cache := common.NewBlockCache(opts.cacheSize)
// Start the block cache importer at cacheSize blocks before current height
cacheStart := blockHeight - opts.cacheSize
if cacheStart < saplingHeight {
cacheStart = saplingHeight
}
// The last argument, repetition count, is only nonzero for testing
go common.BlockIngestor(cache, cacheStart, 0)
// Compact transaction service initialization
service, err := frontend.NewLwdStreamer(cache)
if err != nil {
common.Log.WithFields(logrus.Fields{
"error": err,
}).Fatal("couldn't create backend")
}
// Register service
walletrpc.RegisterCompactTxStreamerServer(server, service)
// Start listening
listener, err := net.Listen("tcp", opts.bindAddr)
if err != nil {
common.Log.WithFields(logrus.Fields{
"bind_addr": opts.bindAddr,
"error": err,
}).Fatal("couldn't create listener")
}
// Signal handler for graceful stops
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
go func() {
s := <-signals
common.Log.WithFields(logrus.Fields{
"signal": s.String(),
}).Info("caught signal, stopping gRPC server")
os.Stderr.WriteString("Caught signal: " + s.String() + "\n")
os.Exit(1)
}()
common.Log.Infof("Starting gRPC server on %s", opts.bindAddr)
err = server.Serve(listener)
if err != nil {
common.Log.WithFields(logrus.Fields{
"error": err,
}).Fatal("gRPC server exited")
}
}

View File

@ -33,6 +33,7 @@ type Options struct {
NoTLSVeryInsecure bool `json:"no_tls_very_insecure,omitempty"`
Redownload bool `json:"redownload"`
DataDir string `json:"data-dir"`
DarkSide bool `json:"darkside"`
}
// RawRequest points to the function to send a an RPC request to zcashd;
@ -131,6 +132,7 @@ func getBlockFromRPC(height int) (*walletrpc.CompactBlock, error) {
if len(rest) != 0 {
return nil, errors.New("received overlong message")
}
// TODO COINBASE-HEIGHT: restore this check after coinbase height is fixed
if false && block.GetHeight() != height {
return nil, errors.New("received unexpected height block")

View File

@ -192,7 +192,7 @@ func getblockStub(method string, params []json.RawMessage) (json.RawMessage, err
if sleepCount != 2 || sleepDuration != 11*time.Second {
testT.Error("unexpected sleeps", sleepCount, sleepDuration)
}
// should re-request the same height
// Back up to 41.
if height != "380641" {
testT.Error("unexpected height", height)
}

View File

@ -256,9 +256,7 @@ func (s *LwdStreamer) Ping(ctx context.Context, in *walletrpc.Duration) (*wallet
return &response, nil
}
// Darkside
func (s *LwdStreamer) DarksideGetIncomingTransactions(in *walletrpc.Empty, resp walletrpc.CompactTxStreamer_DarksideGetIncomingTransactionsServer) error {
// Get all of the new incoming transactions evil zcashd has accepted.
result, rpcErr := common.RawRequest("x_getincomingtransactions", nil)
@ -307,7 +305,7 @@ func (s *LwdStreamer) DarksideSetState(ctx context.Context, state *walletrpc.Dar
for i, block := range state.Blocks {
st += "\"" + block + "\""
if i < len(state.Blocks) - 1 {
if i < len(state.Blocks)-1 {
st += ", "
}
}

2
go.sum
View File

@ -245,8 +245,6 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
google.golang.org/grpc v1.28.1 h1:C1QC6KzgSiLyBabDi87BbjaGreoRgGUF5nOyvfrAZ1k=
google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=

View File

@ -8,4 +8,4 @@ JSON="{\"startHeight\": $1, \"saplingActivation\": $2, \"branchID\": \"2bb40e60\
JSON="$JSON$(cat "$3" | sed 's/^/"/' | sed 's/$/"/' | sed '1s/^/[/;$!s/$/,/;$s/$/]/')"
JSON="$JSON}"
grpcurl -insecure -import-path ./walletrpc/ -proto service.proto -d "$JSON" localhost:9067 cash.z.wallet.sdk.rpc.CompactTxStreamer/DarksideSetState
grpcurl -plaintext -import-path ./walletrpc/ -proto service.proto -d "$JSON" localhost:9067 cash.z.wallet.sdk.rpc.CompactTxStreamer/DarksideSetState

View File

@ -486,12 +486,6 @@ func (m *TransparentAddressBlockFilter) GetRange() *BlockRange {
// are microseconds.
type Duration struct {
IntervalUs int64 `protobuf:"varint,1,opt,name=intervalUs,proto3" json:"intervalUs,omitempty"`
type DarksideLightwalletdState struct {
StartHeight int32 `protobuf:"varint,1,opt,name=startHeight,proto3" json:"startHeight,omitempty"`
SaplingActivation int32 `protobuf:"varint,2,opt,name=saplingActivation,proto3" json:"saplingActivation,omitempty"`
BranchID string `protobuf:"bytes,3,opt,name=branchID,proto3" json:"branchID,omitempty"`
ChainName string `protobuf:"bytes,4,opt,name=chainName,proto3" json:"chainName,omitempty"`
Blocks []string `protobuf:"bytes,5,rep,name=blocks,proto3" json:"blocks,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -502,47 +496,29 @@ func (m *Duration) String() string { return proto.CompactTextString(m) }
func (*Duration) ProtoMessage() {}
func (*Duration) Descriptor() ([]byte, []int) {
return fileDescriptor_a0b84a42fa06f626, []int{9}
func (m *DarksideLightwalletdState) Reset() { *m = DarksideLightwalletdState{} }
func (m *DarksideLightwalletdState) String() string { return proto.CompactTextString(m) }
func (*DarksideLightwalletdState) ProtoMessage() {}
func (*DarksideLightwalletdState) Descriptor() ([]byte, []int) {
return fileDescriptor_a0b84a42fa06f626, []int{10}
}
func (m *Duration) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Duration.Unmarshal(m, b)
func (m *DarksideLightwalletdState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DarksideLightwalletdState.Unmarshal(m, b)
}
func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Duration.Marshal(b, m, deterministic)
func (m *DarksideLightwalletdState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DarksideLightwalletdState.Marshal(b, m, deterministic)
}
func (m *Duration) XXX_Merge(src proto.Message) {
xxx_messageInfo_Duration.Merge(m, src)
func (m *DarksideLightwalletdState) XXX_Merge(src proto.Message) {
xxx_messageInfo_DarksideLightwalletdState.Merge(m, src)
}
func (m *Duration) XXX_Size() int {
return xxx_messageInfo_Duration.Size(m)
func (m *DarksideLightwalletdState) XXX_Size() int {
return xxx_messageInfo_DarksideLightwalletdState.Size(m)
}
func (m *Duration) XXX_DiscardUnknown() {
xxx_messageInfo_Duration.DiscardUnknown(m)
func (m *DarksideLightwalletdState) XXX_DiscardUnknown() {
xxx_messageInfo_DarksideLightwalletdState.DiscardUnknown(m)
}
var xxx_messageInfo_Duration proto.InternalMessageInfo
var xxx_messageInfo_DarksideLightwalletdState proto.InternalMessageInfo
func (m *Duration) GetIntervalUs() int64 {
func (m *DarksideLightwalletdState) GetStartHeight() int32 {
if m != nil {
return m.IntervalUs
return m.StartHeight
}
return 0
}
@ -556,11 +532,6 @@ type PingResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
func (m *DarksideLightwalletdState) GetSaplingActivation() int32 {
if m != nil {
return m.SaplingActivation
}
return 0
}
func (m *PingResponse) Reset() { *m = PingResponse{} }
@ -568,11 +539,6 @@ func (m *PingResponse) String() string { return proto.CompactTextString(m) }
func (*PingResponse) ProtoMessage() {}
func (*PingResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a0b84a42fa06f626, []int{10}
func (m *DarksideLightwalletdState) GetBranchID() string {
if m != nil {
return m.BranchID
}
return ""
}
func (m *PingResponse) XXX_Unmarshal(b []byte) error {
@ -594,22 +560,87 @@ func (m *PingResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_PingResponse proto.InternalMessageInfo
func (m *PingResponse) GetEntry() int64 {
func (m *DarksideLightwalletdState) GetChainName() string {
if m != nil {
return m.Entry
return m.ChainName
}
return 0
return ""
}
func (m *PingResponse) GetExit() int64 {
func (m *DarksideLightwalletdState) GetBlocks() []string {
if m != nil {
return m.Exit
return m.Blocks
}
return 0
}
type DarksideLightwalletdState struct {
StartHeight int32 `protobuf:"varint,1,opt,name=startHeight,proto3" json:"startHeight,omitempty"`
SaplingActivation int32 `protobuf:"varint,2,opt,name=saplingActivation,proto3" json:"saplingActivation,omitempty"`
BranchID string `protobuf:"bytes,3,opt,name=branchID,proto3" json:"branchID,omitempty"`
ChainName string `protobuf:"bytes,4,opt,name=chainName,proto3" json:"chainName,omitempty"`
Blocks []string `protobuf:"bytes,5,rep,name=blocks,proto3" json:"blocks,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *DarksideLightwalletdState) Reset() { *m = DarksideLightwalletdState{} }
func (m *DarksideLightwalletdState) String() string { return proto.CompactTextString(m) }
func (*DarksideLightwalletdState) ProtoMessage() {}
func (*DarksideLightwalletdState) Descriptor() ([]byte, []int) {
return fileDescriptor_a0b84a42fa06f626, []int{11}
}
func (m *DarksideLightwalletdState) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DarksideLightwalletdState.Unmarshal(m, b)
}
func (m *DarksideLightwalletdState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DarksideLightwalletdState.Marshal(b, m, deterministic)
}
func (m *DarksideLightwalletdState) XXX_Merge(src proto.Message) {
xxx_messageInfo_DarksideLightwalletdState.Merge(m, src)
}
func (m *DarksideLightwalletdState) XXX_Size() int {
return xxx_messageInfo_DarksideLightwalletdState.Size(m)
}
func (m *DarksideLightwalletdState) XXX_DiscardUnknown() {
xxx_messageInfo_DarksideLightwalletdState.DiscardUnknown(m)
}
var xxx_messageInfo_DarksideLightwalletdState proto.InternalMessageInfo
func (m *DarksideLightwalletdState) GetStartHeight() int32 {
if m != nil {
return m.StartHeight
}
return 0
}
func (m *DarksideLightwalletdState) GetSaplingActivation() int32 {
if m != nil {
return m.SaplingActivation
}
return 0
}
func (m *DarksideLightwalletdState) GetBranchID() string {
if m != nil {
return m.BranchID
}
return ""
}
func (m *DarksideLightwalletdState) GetChainName() string {
if m != nil {
return m.ChainName
}
return ""
}
func (m *DarksideLightwalletdState) GetBlocks() []string {
if m != nil {
return m.Blocks
}
return nil
}
@ -633,101 +664,59 @@ func init() {
}
var fileDescriptor_a0b84a42fa06f626 = []byte{
// 708 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0x5f, 0x4f, 0x13, 0x41,
0x10, 0xef, 0xbf, 0xa3, 0xed, 0x50, 0x20, 0x6c, 0x40, 0x9b, 0x06, 0xb1, 0xae, 0x31, 0x21, 0xc6,
0x34, 0x04, 0x31, 0xf2, 0xe0, 0x0b, 0x7f, 0x14, 0x49, 0x90, 0xe0, 0xb6, 0xbe, 0xe0, 0x03, 0x59,
0xee, 0x86, 0xde, 0x49, 0xbb, 0x77, 0xd9, 0x5d, 0x4a, 0xf1, 0x23, 0xf8, 0x91, 0xfc, 0x50, 0x7e,
0x06, 0xb3, 0xbb, 0x57, 0x38, 0xa2, 0x47, 0xfb, 0x76, 0x33, 0x3b, 0xf3, 0x9b, 0xd9, 0xdf, 0xfe,
0x66, 0x0e, 0x16, 0x14, 0xca, 0x51, 0xe4, 0x63, 0x27, 0x91, 0xb1, 0x8e, 0xc9, 0xaa, 0xcf, 0x55,
0xd8, 0xf9, 0xd9, 0xb9, 0xe1, 0x83, 0x01, 0xea, 0x8e, 0x0a, 0xae, 0x3a, 0x32, 0xf1, 0x5b, 0xab,
0x7e, 0x3c, 0x4c, 0xb8, 0xaf, 0xcf, 0x2f, 0x63, 0x39, 0xe4, 0x5a, 0xb9, 0x68, 0xfa, 0x0e, 0xaa,
0x7b, 0x83, 0xd8, 0xbf, 0x3a, 0x3a, 0x20, 0x4f, 0x60, 0x2e, 0xc4, 0xa8, 0x1f, 0xea, 0x66, 0xb1,
0x5d, 0xdc, 0xa8, 0xb0, 0xd4, 0x22, 0x04, 0x2a, 0x21, 0x57, 0x61, 0xb3, 0xd4, 0x2e, 0x6e, 0x34,
0x98, 0xfd, 0xa6, 0x1a, 0xc0, 0xa6, 0x31, 0x2e, 0xfa, 0x48, 0xb6, 0xc1, 0x53, 0x9a, 0x4b, 0x97,
0x38, 0xbf, 0xb5, 0xde, 0xf9, 0x6f, 0x0b, 0x9d, 0xb4, 0x10, 0x73, 0xc1, 0x64, 0x13, 0xca, 0x28,
0x02, 0x0b, 0x3b, 0x3d, 0xc7, 0x84, 0xd2, 0x1f, 0x50, 0xeb, 0x8d, 0x3f, 0x45, 0x03, 0x8d, 0xd2,
0xd4, 0xbc, 0x30, 0x67, 0xb3, 0xd6, 0xb4, 0xc1, 0x64, 0x05, 0xbc, 0x48, 0x04, 0x38, 0xb6, 0x55,
0x2b, 0xcc, 0x19, 0x77, 0x37, 0x2c, 0x67, 0x6e, 0xf8, 0x01, 0x16, 0x19, 0xbf, 0xe9, 0x49, 0x2e,
0x14, 0xf7, 0x75, 0x14, 0x0b, 0x13, 0x15, 0x70, 0xcd, 0x6d, 0xc1, 0x06, 0xb3, 0xdf, 0x19, 0xce,
0x4a, 0x59, 0xce, 0xe8, 0x29, 0x34, 0xba, 0x28, 0x02, 0x86, 0x2a, 0x89, 0x85, 0x42, 0xb2, 0x06,
0x75, 0x94, 0x32, 0x96, 0xfb, 0x71, 0x80, 0x16, 0xc0, 0x63, 0xf7, 0x0e, 0x42, 0xa1, 0x61, 0x8d,
0x2f, 0xa8, 0x14, 0xef, 0xa3, 0xc5, 0xaa, 0xb3, 0x07, 0x3e, 0x3a, 0x0f, 0xf5, 0xfd, 0x90, 0x47,
0xa2, 0x9b, 0xa0, 0x4f, 0xab, 0xe0, 0x7d, 0x1c, 0x26, 0xfa, 0x96, 0xfe, 0x2a, 0x01, 0x1c, 0x9b,
0x8a, 0xc1, 0x91, 0xb8, 0x8c, 0x49, 0x13, 0xaa, 0x23, 0x94, 0x2a, 0x8a, 0x85, 0x2d, 0x52, 0x67,
0x13, 0xd3, 0x34, 0x3a, 0x42, 0x11, 0xc4, 0x32, 0x05, 0x4f, 0x2d, 0x53, 0x5a, 0xf3, 0x20, 0x90,
0xdd, 0xeb, 0x24, 0x89, 0xa5, 0xb6, 0x14, 0xd4, 0xd8, 0x03, 0x9f, 0x69, 0xde, 0x37, 0xa5, 0x4f,
0xf8, 0x10, 0x9b, 0x15, 0x9b, 0x7e, 0xef, 0x20, 0x3b, 0xf0, 0x54, 0xf1, 0x64, 0x10, 0x89, 0xfe,
0xae, 0xaf, 0xa3, 0x11, 0x37, 0x5c, 0x7d, 0x76, 0x9c, 0x78, 0x96, 0x93, 0xbc, 0x63, 0xf2, 0x06,
0x96, 0x7d, 0xc3, 0x8e, 0x50, 0xd7, 0x6a, 0x4f, 0x72, 0xe1, 0x87, 0x47, 0x41, 0x73, 0xce, 0xe2,
0xff, 0x7b, 0x40, 0xda, 0x30, 0x6f, 0xdf, 0x30, 0xc5, 0xae, 0x5a, 0xec, 0xac, 0x8b, 0x4a, 0x78,
0x66, 0xdf, 0x2b, 0xe1, 0x12, 0x85, 0xde, 0x0d, 0x02, 0x89, 0x4a, 0x59, 0x01, 0xa4, 0x9a, 0x69,
0x42, 0x95, 0x3b, 0xef, 0x84, 0x9e, 0xd4, 0x24, 0xef, 0xc1, 0x93, 0x46, 0xca, 0xa9, 0x1a, 0x5f,
0x3c, 0xa6, 0x26, 0xab, 0x79, 0xe6, 0xe2, 0xe9, 0x6b, 0xa8, 0x1d, 0x5c, 0x4b, 0x7b, 0x2b, 0xb2,
0x0e, 0x10, 0x09, 0x8d, 0x72, 0xc4, 0x07, 0xdf, 0x5c, 0x85, 0x32, 0xcb, 0x78, 0xe8, 0x0e, 0x34,
0x4e, 0x23, 0xd1, 0xbf, 0x13, 0xc5, 0x0a, 0x78, 0x28, 0xb4, 0xbc, 0x4d, 0x43, 0x9d, 0x61, 0x64,
0x86, 0xe3, 0xc8, 0x09, 0xaa, 0xcc, 0xec, 0xf7, 0xd6, 0x1f, 0x0f, 0x96, 0xf7, 0xdd, 0xfc, 0xf6,
0xc6, 0x5d, 0x2d, 0x91, 0x0f, 0x51, 0x92, 0x1e, 0x2c, 0x1e, 0xa2, 0x3e, 0xe6, 0x1a, 0x95, 0xb6,
0x9d, 0x91, 0x76, 0x4e, 0xdf, 0x77, 0xca, 0x69, 0x4d, 0x99, 0x13, 0x5a, 0x20, 0x5f, 0xa1, 0x76,
0x88, 0x29, 0xde, 0x94, 0xe8, 0xd6, 0xcb, 0xbc, 0x7a, 0xae, 0x57, 0x1b, 0x46, 0x0b, 0xe4, 0x3b,
0x2c, 0x4c, 0x20, 0xdd, 0xc2, 0x98, 0xce, 0xef, 0x8c, 0xd0, 0x9b, 0x45, 0x72, 0x66, 0x59, 0xc8,
0x0e, 0xea, 0xf3, 0x9c, 0xd4, 0xc9, 0xee, 0x68, 0xbd, 0xca, 0x09, 0x78, 0x38, 0xf0, 0xb4, 0x40,
0xce, 0x61, 0xc9, 0x8c, 0x71, 0x16, 0x7c, 0xb6, 0xdc, 0xdc, 0xf6, 0xb3, 0x5b, 0x81, 0x16, 0x88,
0x84, 0xa5, 0x43, 0x9c, 0x48, 0xb5, 0x37, 0x8e, 0x02, 0x45, 0xb6, 0xf3, 0xba, 0x7f, 0x4c, 0xda,
0x33, 0x5f, 0x69, 0xb3, 0x48, 0x98, 0x7d, 0x8d, 0xcc, 0xd6, 0x58, 0xcb, 0xc9, 0xb5, 0x2b, 0xa6,
0x95, 0xf7, 0x56, 0xf7, 0x00, 0xb4, 0x40, 0x4e, 0xa0, 0x62, 0xa4, 0x9d, 0x4b, 0xfd, 0x64, 0x46,
0x72, 0x79, 0xc9, 0x0e, 0x06, 0x2d, 0xec, 0x2d, 0x9e, 0xd5, 0x5d, 0x80, 0x4c, 0xfc, 0xdf, 0xa5,
0xc2, 0xc5, 0x9c, 0xfd, 0x5b, 0xbd, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x3f, 0xd2, 0xc0, 0xf7,
0xec, 0x06, 0x00, 0x00,
// 760 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x4e, 0x23, 0x37,
0x14, 0x4e, 0x42, 0x26, 0x3f, 0x87, 0x00, 0xc5, 0x2a, 0x34, 0x8d, 0x68, 0x49, 0x5d, 0x55, 0xe2,
0xa2, 0x1a, 0x45, 0x94, 0xaa, 0xbd, 0xe8, 0x0d, 0x3f, 0x6d, 0x88, 0x44, 0xab, 0xd6, 0xc9, 0x15,
0xbd, 0x40, 0x66, 0x6c, 0x92, 0x81, 0xc4, 0x33, 0xb2, 0x4d, 0xc8, 0xee, 0x23, 0xec, 0x23, 0xad,
0xb4, 0xef, 0xb4, 0x8f, 0xb0, 0xf2, 0x99, 0x09, 0x19, 0x94, 0x1d, 0x92, 0xbd, 0x9b, 0x63, 0x9f,
0xf3, 0x7d, 0xc7, 0xdf, 0xf9, 0x19, 0xd8, 0x32, 0x52, 0x4f, 0xc3, 0x40, 0xfa, 0xb1, 0x8e, 0x6c,
0x44, 0xf6, 0x02, 0x6e, 0x46, 0xfe, 0x5b, 0xff, 0x89, 0x8f, 0xc7, 0xd2, 0xfa, 0x46, 0x3c, 0xf8,
0x3a, 0x0e, 0x5a, 0x7b, 0x41, 0x34, 0x89, 0x79, 0x60, 0x6f, 0xee, 0x22, 0x3d, 0xe1, 0xd6, 0x24,
0xde, 0xf4, 0x57, 0xa8, 0x9e, 0x8d, 0xa3, 0xe0, 0xa1, 0x77, 0x41, 0xf6, 0xa1, 0x32, 0x92, 0xe1,
0x70, 0x64, 0x9b, 0xc5, 0x76, 0xf1, 0xa8, 0xcc, 0x52, 0x8b, 0x10, 0x28, 0x8f, 0xb8, 0x19, 0x35,
0x4b, 0xed, 0xe2, 0x51, 0x83, 0xe1, 0x37, 0xb5, 0x00, 0x18, 0xc6, 0xb8, 0x1a, 0x4a, 0x72, 0x02,
0x9e, 0xb1, 0x5c, 0x27, 0x81, 0x9b, 0xc7, 0xdf, 0xfb, 0x9f, 0x4d, 0xc1, 0x4f, 0x89, 0x58, 0xe2,
0x4c, 0x3a, 0xb0, 0x21, 0x95, 0x40, 0xd8, 0xd5, 0x31, 0xce, 0x95, 0xde, 0x43, 0x6d, 0x30, 0xfb,
0x2b, 0x1c, 0x5b, 0xa9, 0x1d, 0xe7, 0xad, 0xbb, 0x5b, 0x97, 0x13, 0x9d, 0xc9, 0xd7, 0xe0, 0x85,
0x4a, 0xc8, 0x19, 0xb2, 0x96, 0x59, 0x62, 0x3c, 0xbf, 0x70, 0x23, 0xf3, 0xc2, 0x3f, 0x60, 0x9b,
0xf1, 0xa7, 0x81, 0xe6, 0xca, 0xf0, 0xc0, 0x86, 0x91, 0x72, 0x5e, 0x82, 0x5b, 0x8e, 0x84, 0x0d,
0x86, 0xdf, 0x19, 0xcd, 0x4a, 0x59, 0xcd, 0xe8, 0xbf, 0xd0, 0xe8, 0x4b, 0x25, 0x98, 0x34, 0x71,
0xa4, 0x8c, 0x24, 0x07, 0x50, 0x97, 0x5a, 0x47, 0xfa, 0x3c, 0x12, 0x12, 0x01, 0x3c, 0xb6, 0x38,
0x20, 0x14, 0x1a, 0x68, 0xfc, 0x2d, 0x8d, 0xe1, 0x43, 0x89, 0x58, 0x75, 0xf6, 0xe2, 0x8c, 0x6e,
0x42, 0xfd, 0x7c, 0xc4, 0x43, 0xd5, 0x8f, 0x65, 0x40, 0xab, 0xe0, 0xfd, 0x39, 0x89, 0xed, 0x1b,
0xfa, 0xae, 0x04, 0x70, 0xe5, 0x18, 0x45, 0x4f, 0xdd, 0x45, 0xa4, 0x09, 0xd5, 0xa9, 0xd4, 0x26,
0x8c, 0x14, 0x92, 0xd4, 0xd9, 0xdc, 0x74, 0x89, 0x4e, 0xa5, 0x12, 0x91, 0x4e, 0xc1, 0x53, 0xcb,
0x51, 0x5b, 0x2e, 0x84, 0xee, 0x3f, 0xc6, 0x71, 0xa4, 0x2d, 0x4a, 0x50, 0x63, 0x2f, 0xce, 0x5c,
0xf2, 0x81, 0xa3, 0xfe, 0x87, 0x4f, 0x64, 0xb3, 0x8c, 0xe1, 0x8b, 0x03, 0xf2, 0x3b, 0x7c, 0x63,
0x78, 0x3c, 0x0e, 0xd5, 0xf0, 0x34, 0xb0, 0xe1, 0x94, 0x3b, 0xad, 0x2e, 0x13, 0x4d, 0x3c, 0xd4,
0x24, 0xef, 0x9a, 0xfc, 0x0c, 0xbb, 0x81, 0x53, 0x47, 0x99, 0x47, 0x73, 0xa6, 0xb9, 0x0a, 0x46,
0x3d, 0xd1, 0xac, 0x20, 0xfe, 0xf2, 0x05, 0x69, 0xc3, 0x26, 0xd6, 0x30, 0xc5, 0xae, 0x22, 0x76,
0xf6, 0x88, 0xfa, 0x40, 0xb0, 0x5e, 0x31, 0xd7, 0x52, 0xd9, 0x53, 0x21, 0xb4, 0x34, 0xc6, 0x69,
0xc2, 0x93, 0xcf, 0xb9, 0x26, 0xa9, 0x49, 0x35, 0x7c, 0xb7, 0xec, 0x8f, 0x0d, 0x93, 0xf6, 0x58,
0x6e, 0x28, 0xf9, 0x0d, 0x3c, 0xed, 0x5a, 0x3f, 0xed, 0xde, 0x1f, 0x5e, 0xeb, 0x3e, 0x9c, 0x11,
0x96, 0xf8, 0xd3, 0x0f, 0x45, 0xf8, 0xf6, 0x82, 0xeb, 0x07, 0x13, 0x0a, 0x89, 0x85, 0x4b, 0x22,
0x44, 0xdf, 0x72, 0x2b, 0xdd, 0x1b, 0x71, 0x36, 0x2e, 0x17, 0x73, 0xe8, 0xb1, 0xec, 0x91, 0xd3,
0x6c, 0x49, 0x4e, 0x4c, 0xc2, 0x63, 0xcb, 0x17, 0xa4, 0x05, 0xb5, 0xdb, 0x44, 0xbf, 0x0b, 0xac,
0x6c, 0x9d, 0x3d, 0xdb, 0x2b, 0xaa, 0xba, 0x0f, 0x15, 0x94, 0xd6, 0x34, 0xbd, 0xf6, 0x86, 0xeb,
0x97, 0xc4, 0x3a, 0xfe, 0x58, 0x81, 0xdd, 0xf3, 0x64, 0x93, 0x0c, 0x66, 0x7d, 0xab, 0x25, 0x9f,
0x48, 0x4d, 0x06, 0xb0, 0xdd, 0x95, 0xf6, 0x8a, 0x5b, 0x69, 0x2c, 0xbe, 0x99, 0xb4, 0x73, 0x14,
0x79, 0xee, 0xe1, 0xd6, 0x8a, 0x89, 0xa5, 0x05, 0xf2, 0x1f, 0xd4, 0xba, 0x32, 0xc5, 0x5b, 0xe1,
0xdd, 0xfa, 0x31, 0x8f, 0x2f, 0xc9, 0x15, 0xdd, 0x68, 0x81, 0xfc, 0x0f, 0x5b, 0x73, 0xc8, 0x64,
0x75, 0xad, 0xae, 0xdc, 0x9a, 0xd0, 0x9d, 0x22, 0xb9, 0x46, 0x15, 0xb2, 0x2b, 0xe3, 0x30, 0x27,
0x74, 0xbe, 0xc5, 0x5a, 0x3f, 0xe5, 0x38, 0xbc, 0x5c, 0x3d, 0xb4, 0x40, 0x6e, 0x60, 0xc7, 0x2d,
0x94, 0x2c, 0xf8, 0x7a, 0xb1, 0xb9, 0xe9, 0x67, 0xf7, 0x13, 0x2d, 0x10, 0x0d, 0x3b, 0x5d, 0x39,
0x1f, 0x82, 0xc1, 0x2c, 0x14, 0x86, 0x9c, 0xe4, 0x65, 0xff, 0xda, 0xd0, 0xac, 0xfd, 0xa4, 0x4e,
0x91, 0x30, 0xac, 0x46, 0x66, 0x7f, 0x1d, 0xe4, 0xc4, 0xe2, 0xb2, 0x6b, 0xe5, 0xd5, 0x6a, 0x01,
0x40, 0x0b, 0xe4, 0x1e, 0x0e, 0xe7, 0xf3, 0xd5, 0x95, 0xb6, 0xa7, 0x82, 0x68, 0x12, 0xaa, 0x61,
0x86, 0xd9, 0xac, 0x60, 0xf9, 0x82, 0xfc, 0x05, 0x7c, 0x35, 0xe7, 0xea, 0x4b, 0x9b, 0x8c, 0x70,
0x27, 0x27, 0x3c, 0x77, 0xe8, 0x5b, 0xaf, 0xa6, 0x43, 0x0b, 0x67, 0xdb, 0xd7, 0xf5, 0xe4, 0x46,
0xc7, 0xc1, 0xfb, 0x52, 0xe1, 0xb6, 0x82, 0x7f, 0xee, 0x5f, 0x3e, 0x05, 0x00, 0x00, 0xff, 0xff,
0x18, 0x08, 0xc2, 0x0c, 0xf8, 0x07, 0x00, 0x00,
// 823 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x51, 0x6f, 0x1b, 0x45,
0x10, 0x3e, 0xc7, 0xbe, 0xd8, 0x9e, 0xb8, 0x29, 0x5d, 0xb5, 0xc5, 0x58, 0xa5, 0x35, 0x8b, 0x90,
0x2a, 0x84, 0xac, 0xa8, 0x14, 0xd1, 0x07, 0x5e, 0x9a, 0x04, 0xd2, 0x48, 0xa5, 0x2a, 0x6b, 0xf3,
0x52, 0x1e, 0xaa, 0xcd, 0xed, 0xd4, 0xbe, 0xc6, 0xde, 0x3b, 0xed, 0x6e, 0x5c, 0x97, 0x9f, 0xc0,
0x4f, 0x42, 0x42, 0xe2, 0xa7, 0xa1, 0x9d, 0xbd, 0x8b, 0x2f, 0x0a, 0x17, 0xbb, 0x6f, 0x37, 0xb3,
0xb3, 0xf3, 0xcd, 0x7e, 0xf3, 0xcd, 0xe8, 0xe0, 0x96, 0x45, 0xb3, 0x4c, 0x13, 0x1c, 0xe5, 0x26,
0x73, 0x19, 0xbb, 0x97, 0x48, 0x3b, 0x1b, 0xfd, 0x39, 0xfa, 0x20, 0xe7, 0x73, 0x74, 0x23, 0xab,
0xce, 0x47, 0x26, 0x4f, 0x06, 0xf7, 0x92, 0x6c, 0x91, 0xcb, 0xc4, 0xbd, 0x7d, 0x97, 0x99, 0x85,
0x74, 0x36, 0x44, 0xf3, 0x1f, 0xa0, 0x7d, 0x38, 0xcf, 0x92, 0xf3, 0xd3, 0x63, 0x76, 0x1f, 0x76,
0x67, 0x98, 0x4e, 0x67, 0xae, 0xdf, 0x18, 0x36, 0x1e, 0xb7, 0x44, 0x61, 0x31, 0x06, 0xad, 0x99,
0xb4, 0xb3, 0xfe, 0xce, 0xb0, 0xf1, 0xb8, 0x27, 0xe8, 0x9b, 0x3b, 0x00, 0xba, 0x26, 0xa4, 0x9e,
0x22, 0x7b, 0x0a, 0xb1, 0x75, 0xd2, 0x84, 0x8b, 0x7b, 0x4f, 0x1e, 0x8e, 0xfe, 0xb7, 0x84, 0x51,
0x01, 0x24, 0x42, 0x30, 0x3b, 0x80, 0x26, 0x6a, 0x45, 0x69, 0x37, 0xdf, 0xf1, 0xa1, 0xfc, 0x3d,
0x74, 0x26, 0xab, 0x5f, 0xd2, 0xb9, 0x43, 0xe3, 0x31, 0xcf, 0xfc, 0xd9, 0xb6, 0x98, 0x14, 0xcc,
0xee, 0x42, 0x9c, 0x6a, 0x85, 0x2b, 0x42, 0x6d, 0x89, 0x60, 0x5c, 0xbe, 0xb0, 0x59, 0x79, 0xe1,
0x4f, 0xb0, 0x2f, 0xe4, 0x87, 0x89, 0x91, 0xda, 0xca, 0xc4, 0xa5, 0x99, 0xf6, 0x51, 0x4a, 0x3a,
0x49, 0x80, 0x3d, 0x41, 0xdf, 0x15, 0xce, 0x76, 0xaa, 0x9c, 0xf1, 0xd7, 0xd0, 0x1b, 0xa3, 0x56,
0x02, 0x6d, 0x9e, 0x69, 0x8b, 0xec, 0x01, 0x74, 0xd1, 0x98, 0xcc, 0x1c, 0x65, 0x0a, 0x29, 0x41,
0x2c, 0xd6, 0x0e, 0xc6, 0xa1, 0x47, 0xc6, 0xaf, 0x68, 0xad, 0x9c, 0x22, 0xe5, 0xea, 0x8a, 0x2b,
0x3e, 0xbe, 0x07, 0xdd, 0xa3, 0x99, 0x4c, 0xf5, 0x38, 0xc7, 0x84, 0xb7, 0x21, 0xfe, 0x79, 0x91,
0xbb, 0x8f, 0xfc, 0xaf, 0x1d, 0x80, 0x97, 0x1e, 0x51, 0x9d, 0xea, 0x77, 0x19, 0xeb, 0x43, 0x7b,
0x89, 0xc6, 0xa6, 0x99, 0x26, 0x90, 0xae, 0x28, 0x4d, 0x5f, 0xe8, 0x12, 0xb5, 0xca, 0x4c, 0x91,
0xbc, 0xb0, 0x3c, 0xb4, 0x93, 0x4a, 0x99, 0xf1, 0x45, 0x9e, 0x67, 0xc6, 0x11, 0x05, 0x1d, 0x71,
0xc5, 0xe7, 0x8b, 0x4f, 0x3c, 0xf4, 0x2b, 0xb9, 0xc0, 0x7e, 0x8b, 0xae, 0xaf, 0x1d, 0xec, 0x19,
0x7c, 0x6e, 0x65, 0x3e, 0x4f, 0xf5, 0xf4, 0x79, 0xe2, 0xd2, 0xa5, 0xf4, 0x5c, 0xbd, 0x08, 0x9c,
0xc4, 0xc4, 0x49, 0xdd, 0x31, 0xfb, 0x0e, 0xee, 0x24, 0x9e, 0x1d, 0x6d, 0x2f, 0xec, 0xa1, 0x91,
0x3a, 0x99, 0x9d, 0xaa, 0xfe, 0x2e, 0xe5, 0xbf, 0x7e, 0xc0, 0x86, 0xb0, 0x47, 0x3d, 0x2c, 0x72,
0xb7, 0x29, 0x77, 0xd5, 0xc5, 0x0d, 0x7c, 0x49, 0xfd, 0xca, 0xa5, 0x41, 0xed, 0x9e, 0x2b, 0x65,
0xd0, 0x5a, 0x12, 0x40, 0xa1, 0x99, 0x3e, 0xb4, 0x65, 0xf0, 0x96, 0xf4, 0x14, 0x26, 0xfb, 0x11,
0x62, 0xe3, 0xa5, 0x5c, 0xa8, 0xf1, 0xab, 0x9b, 0xd4, 0x44, 0x9a, 0x17, 0x21, 0x9e, 0x7f, 0x0b,
0x9d, 0xe3, 0x0b, 0x43, 0xaf, 0x62, 0x0f, 0x01, 0x52, 0xed, 0xd0, 0x2c, 0xe5, 0xfc, 0xf7, 0x80,
0xd0, 0x14, 0x15, 0x0f, 0x7f, 0x06, 0xbd, 0xd7, 0xa9, 0x9e, 0x5e, 0x8a, 0xe2, 0x2e, 0xc4, 0xa8,
0x9d, 0xf9, 0x58, 0x84, 0x06, 0xc3, 0xcb, 0x0c, 0x57, 0x69, 0x10, 0x54, 0x53, 0xd0, 0x37, 0xff,
0xa7, 0x01, 0x5f, 0x1c, 0x4b, 0x73, 0x6e, 0x53, 0x85, 0xd4, 0xee, 0x50, 0x97, 0x1a, 0x3b, 0xe9,
0xd0, 0x33, 0x43, 0x13, 0xf5, 0x62, 0x3d, 0xbd, 0xb1, 0xa8, 0xba, 0x3c, 0xd3, 0xd7, 0x9a, 0x40,
0x00, 0xb1, 0xb8, 0x7e, 0xc0, 0x06, 0xd0, 0x39, 0x0b, 0xac, 0x1f, 0x93, 0x1e, 0xba, 0xe2, 0xd2,
0xde, 0xa0, 0x85, 0xfb, 0xb0, 0x4b, 0x0d, 0xb1, 0xfd, 0x78, 0xd8, 0xf4, 0x2a, 0x0b, 0xd6, 0x93,
0x7f, 0xdb, 0x70, 0xe7, 0x28, 0xec, 0x9f, 0xc9, 0x6a, 0xec, 0x0c, 0xca, 0x05, 0x1a, 0x36, 0x81,
0xfd, 0x13, 0x74, 0x2f, 0xa5, 0x43, 0xeb, 0x88, 0x59, 0x36, 0xac, 0xe1, 0xfd, 0x52, 0xf9, 0x83,
0x0d, 0x73, 0xce, 0x23, 0xf6, 0x1b, 0x74, 0x4e, 0xb0, 0xc8, 0xb7, 0x21, 0x7a, 0xf0, 0x75, 0x1d,
0x5e, 0xa8, 0x95, 0xc2, 0x78, 0xc4, 0xfe, 0x80, 0x5b, 0x65, 0xca, 0xb0, 0xf0, 0x36, 0xeb, 0x63,
0xcb, 0xd4, 0x07, 0x0d, 0xf6, 0x86, 0x58, 0xa8, 0x2e, 0x9a, 0x47, 0x35, 0x57, 0xcb, 0xdd, 0x37,
0xf8, 0xa6, 0x26, 0xe0, 0xea, 0xc2, 0xe2, 0x11, 0x7b, 0x0b, 0xb7, 0xfd, 0x1a, 0xaa, 0x26, 0xdf,
0xee, 0x6e, 0x6d, 0xf9, 0xd5, 0xad, 0xc6, 0x23, 0x66, 0xe0, 0xf6, 0x09, 0x96, 0xa3, 0x36, 0x59,
0xa5, 0xca, 0xb2, 0xa7, 0x75, 0xd5, 0xdf, 0x34, 0x9a, 0x5b, 0x3f, 0xe9, 0xa0, 0xc1, 0x04, 0x75,
0xa3, 0xb2, 0xf5, 0x1e, 0xd4, 0xdc, 0xa5, 0x15, 0x39, 0xa8, 0xeb, 0xd5, 0x3a, 0x01, 0x8f, 0xd8,
0x2b, 0x68, 0xf9, 0xd1, 0xac, 0xa5, 0xbe, 0x9c, 0xf1, 0x5a, 0x5e, 0xaa, 0x83, 0xcd, 0x23, 0xf6,
0x1e, 0x1e, 0x95, 0xf3, 0x7a, 0x82, 0xee, 0x54, 0x27, 0xd9, 0x22, 0xd5, 0xd3, 0xca, 0x4b, 0xec,
0x86, 0xaa, 0x3f, 0x81, 0x0f, 0x05, 0x9f, 0x95, 0x58, 0x63, 0x74, 0x61, 0x25, 0x1c, 0xd4, 0xbd,
0xa3, 0x6e, 0x89, 0x0c, 0x6e, 0x2c, 0x87, 0x47, 0x87, 0xfb, 0x6f, 0xba, 0xe1, 0xc4, 0xe4, 0xc9,
0xdf, 0x3b, 0xd1, 0xd9, 0x2e, 0xfd, 0x3f, 0x7c, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xed,
0x14, 0xda, 0xc7, 0x7e, 0x08, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -883,6 +872,12 @@ func (c *compactTxStreamerClient) GetLightdInfo(ctx context.Context, in *Empty,
func (c *compactTxStreamerClient) Ping(ctx context.Context, in *Duration, opts ...grpc.CallOption) (*PingResponse, error) {
out := new(PingResponse)
err := c.cc.Invoke(ctx, "/cash.z.wallet.sdk.rpc.CompactTxStreamer/Ping", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *compactTxStreamerClient) DarksideGetIncomingTransactions(ctx context.Context, in *Empty, opts ...grpc.CallOption) (CompactTxStreamer_DarksideGetIncomingTransactionsClient, error) {
stream, err := c.cc.NewStream(ctx, &_CompactTxStreamer_serviceDesc.Streams[2], "/cash.z.wallet.sdk.rpc.CompactTxStreamer/DarksideGetIncomingTransactions", opts...)
if err != nil {
@ -974,6 +969,7 @@ func (*UnimplementedCompactTxStreamerServer) GetLightdInfo(ctx context.Context,
}
func (*UnimplementedCompactTxStreamerServer) Ping(ctx context.Context, req *Duration) (*PingResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented")
}
func (*UnimplementedCompactTxStreamerServer) DarksideGetIncomingTransactions(req *Empty, srv CompactTxStreamer_DarksideGetIncomingTransactionsServer) error {
return status.Errorf(codes.Unimplemented, "method DarksideGetIncomingTransactions not implemented")
}
@ -1119,6 +1115,22 @@ func _CompactTxStreamer_GetLightdInfo_Handler(srv interface{}, ctx context.Conte
func _CompactTxStreamer_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Duration)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(CompactTxStreamerServer).Ping(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/cash.z.wallet.sdk.rpc.CompactTxStreamer/Ping",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CompactTxStreamerServer).Ping(ctx, req.(*Duration))
}
return interceptor(ctx, in, info, handler)
}
func _CompactTxStreamer_DarksideGetIncomingTransactions_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(Empty)
if err := stream.RecvMsg(m); err != nil {
@ -1146,16 +1158,13 @@ func _CompactTxStreamer_DarksideSetState_Handler(srv interface{}, ctx context.Co
return nil, err
}
if interceptor == nil {
return srv.(CompactTxStreamerServer).Ping(ctx, in)
return srv.(CompactTxStreamerServer).DarksideSetState(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/cash.z.wallet.sdk.rpc.CompactTxStreamer/Ping",
FullMethod: "/cash.z.wallet.sdk.rpc.CompactTxStreamer/DarksideSetState",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(CompactTxStreamerServer).Ping(ctx, req.(*Duration))
return srv.(CompactTxStreamerServer).DarksideSetState(ctx, req.(*DarksideLightwalletdState))
}
return interceptor(ctx, in, info, handler)
@ -1188,6 +1197,8 @@ var _CompactTxStreamer_serviceDesc = grpc.ServiceDesc{
{
MethodName: "Ping",
Handler: _CompactTxStreamer_Ping_Handler,
},
{
MethodName: "DarksideSetState",
Handler: _CompactTxStreamer_DarksideSetState_Handler,
},