From edcecbd003fd329821a6e3060e1d2b255fc64eb1 Mon Sep 17 00:00:00 2001 From: Gus <8219721+srfrog@users.noreply.github.com> Date: Thu, 8 Nov 2018 11:47:20 -0700 Subject: [PATCH] Feature: full backups (#2710) * moved orchestrate to its own pkg within worker. adding backup to worker and alpha. * trying to get the handler and file writers working. * added destination parameter. handler support to destination URI scheme. additional logging. * file handler rename on same volume. added more comments and logging. * changed worker to use stream pkg. updated protos for backup. fixed mislabelled request field. * logging changes for debugging * added some error checks, tweaked comments. * moved stream pkg out of worker. removed binary encoding package, using encode/binary with size delimiter. fixed race and added posting list values to backup. fixed issue with file handler that was breaking badger. refactored backup process to be simpler. added generic Status proto for any service response. added minio and used it for S3 backup uploads. * removed unused const. format fixes. * Initial pass at simplifying things. * cleaned up redundant code. renamed s3handler.send to s3handler.upload and removed all buffering. s3handler tests that bucket exists before working, we cant assume a region. s3handler.Close blocks until the upload is complete. * unused const * missing space * added progress monitoring. fixed issues found by CI * Small fixes here and there. * Rename handler files. * Both S3 uploads and file writes are tested to work. * renamed writer.cleapup to writer.close * regenerated protos * removed unneeded fallthrough --- dgraph/cmd/alpha/admin.go | 34 +- dgraph/cmd/alpha/run.go | 1 + ee/README.md | 4 + ee/backup/backup.go | 72 ++ ee/backup/file_handler.go | 69 ++ ee/backup/s3_handler.go | 134 +++ ee/backup/writer.go | 117 ++ protos/Makefile | 2 +- protos/pb.proto | 20 +- protos/pb/pb.pb.go | 1040 +++++++++++++---- stream/doc.go | 19 + worker/stream_lists.go => stream/stream.go | 50 +- .../stream_test.go | 20 +- worker/backup.go | 141 +++ worker/draft.go | 9 +- worker/export.go | 9 +- worker/groups.go | 1 - worker/predicate.go | 9 +- worker/predicate_move.go | 13 +- worker/worker.go | 2 +- 20 files changed, 1447 insertions(+), 319 deletions(-) create mode 100644 ee/README.md create mode 100644 ee/backup/backup.go create mode 100644 ee/backup/file_handler.go create mode 100644 ee/backup/s3_handler.go create mode 100644 ee/backup/writer.go create mode 100644 stream/doc.go rename worker/stream_lists.go => stream/stream.go (81%) rename worker/stream_lists_test.go => stream/stream_test.go (89%) create mode 100644 worker/backup.go diff --git a/dgraph/cmd/alpha/admin.go b/dgraph/cmd/alpha/admin.go index 27e94a8fc85..2329629aabd 100644 --- a/dgraph/cmd/alpha/admin.go +++ b/dgraph/cmd/alpha/admin.go @@ -32,8 +32,8 @@ import ( ) // handlerInit does some standard checks. Returns false if something is wrong. -func handlerInit(w http.ResponseWriter, r *http.Request) bool { - if r.Method != http.MethodGet { +func handlerInit(w http.ResponseWriter, r *http.Request, method string) bool { + if r.Method != method { x.SetStatus(w, x.ErrorInvalidMethod, "Invalid method") return false } @@ -47,27 +47,45 @@ func handlerInit(w http.ResponseWriter, r *http.Request) bool { } func shutDownHandler(w http.ResponseWriter, r *http.Request) { - if !handlerInit(w, r) { + if !handlerInit(w, r, http.MethodGet) { return } close(shutdownCh) w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"code": "Success", "message": "Server is shutting down"}`)) + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Server is shutting down"}`))) } func exportHandler(w http.ResponseWriter, r *http.Request) { - if !handlerInit(w, r) { + if !handlerInit(w, r, http.MethodGet) { return } - ctx := context.Background() // Export logic can be moved to dgraphzero. - if err := worker.ExportOverNetwork(ctx); err != nil { + if err := worker.ExportOverNetwork(context.Background()); err != nil { x.SetStatus(w, err.Error(), "Export failed.") return } w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"code": "Success", "message": "Export completed."}`)) + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Export completed."}`))) +} + +func backupHandler(w http.ResponseWriter, r *http.Request) { + if !handlerInit(w, r, http.MethodPost) { + return + } + target := r.FormValue("destination") + if target == "" { + err := x.Errorf("You must specify a 'destination' value") + x.SetStatus(w, err.Error(), "Backup failed.") + return + } + if err := worker.BackupOverNetwork(context.Background(), target); err != nil { + x.SetStatus(w, err.Error(), "Backup failed.") + return + } + w.Header().Set("Content-Type", "application/json") + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Backup completed."}`))) + } func memoryLimitHandler(w http.ResponseWriter, r *http.Request) { diff --git a/dgraph/cmd/alpha/run.go b/dgraph/cmd/alpha/run.go index 784c30b898e..b604998fd86 100644 --- a/dgraph/cmd/alpha/run.go +++ b/dgraph/cmd/alpha/run.go @@ -352,6 +352,7 @@ func setupServer() { http.HandleFunc("/share", shareHandler) http.HandleFunc("/debug/store", storeStatsHandler) http.HandleFunc("/admin/shutdown", shutDownHandler) + http.HandleFunc("/admin/backup", backupHandler) http.HandleFunc("/admin/export", exportHandler) http.HandleFunc("/admin/config/lru_mb", memoryLimitHandler) diff --git a/ee/README.md b/ee/README.md new file mode 100644 index 00000000000..a41c42f2c1c --- /dev/null +++ b/ee/README.md @@ -0,0 +1,4 @@ +# Dgraph Enterprise Edition (EE) + +The files stored here correspond to the Dgraph Enterprise Edition features, which are _not_ under the Apache 2 License. + diff --git a/ee/backup/backup.go b/ee/backup/backup.go new file mode 100644 index 00000000000..7fb178888c2 --- /dev/null +++ b/ee/backup/backup.go @@ -0,0 +1,72 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "context" + + "github.com/dgraph-io/badger" + "github.com/dgraph-io/dgraph/posting" + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/stream" + "github.com/dgraph-io/dgraph/x" + + "github.com/golang/glog" +) + +// Request has all the information needed to perform a backup. +type Request struct { + DB *badger.DB // Badger pstore managed by this node. + Sizex uint64 // approximate upload size + Backup *pb.BackupRequest +} + +// Process uses the request values to create a stream writer then hand off the data +// retrieval to stream.Orchestrate. The writer will create all the fd's needed to +// collect the data and later move to the target. +// Returns errors on failure, nil on success. +func (r *Request) Process(ctx context.Context) error { + w, err := r.newWriter() + if err != nil { + return err + } + + sl := stream.Lists{Stream: w, DB: r.DB} + sl.ChooseKeyFunc = nil + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + item := itr.Item() + pk := x.Parse(key) + if pk.IsSchema() { + val, err := item.ValueCopy(nil) + if err != nil { + return nil, err + } + kv := &pb.KV{ + Key: key, + Val: val, + UserMeta: []byte{item.UserMeta()}, + Version: item.Version(), + } + return kv, nil + } + l, err := posting.ReadPostingList(key, itr) + if err != nil { + return nil, err + } + return l.MarshalToKv() + } + + glog.V(2).Infof("Backup started ...") + if err = sl.Orchestrate(ctx, "Backup:", r.Backup.ReadTs); err != nil { + return err + } + if err = w.flush(); err != nil { + return err + } + glog.Infof("Backup complete: group %d at %d", r.Backup.GroupId, r.Backup.ReadTs) + + return nil +} diff --git a/ee/backup/file_handler.go b/ee/backup/file_handler.go new file mode 100644 index 00000000000..34c0d9f2eb7 --- /dev/null +++ b/ee/backup/file_handler.go @@ -0,0 +1,69 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "fmt" + "net/url" + "os" + "path/filepath" + + "github.com/dgraph-io/dgraph/x" + + "github.com/golang/glog" +) + +// fileHandler is used for 'file:' URI scheme. +type fileHandler struct { + fp *os.File +} + +// Open authenticates or prepares a handler session. +// Returns error on failure, nil on success. +func (h *fileHandler) Open(uri *url.URL, req *Request) error { + // check that this path exists and we can access it. + if !h.exists(uri.Path) { + return x.Errorf("The path %q does not exist or it is inaccessible.", uri.Path) + } + + dir := filepath.Join(uri.Path, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs)) + if err := os.Mkdir(dir, 0700); err != nil { + return err + } + + path := filepath.Join(dir, + fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) + fp, err := os.Create(path) + if err != nil { + return err + } + glog.V(2).Infof("Using file path: %q", path) + h.fp = fp + return nil +} + +func (h *fileHandler) Close() error { + if err := h.fp.Sync(); err != nil { + glog.Errorf("While closing file: %s. Error: %v", h.fp.Name(), err) + x.Ignore(h.fp.Close()) + return err + } + return h.fp.Close() +} + +func (h *fileHandler) Write(b []byte) (int, error) { + return h.fp.Write(b) +} + +// Exists checks if a path (file or dir) is found at target. +// Returns true if found, false otherwise. +func (h *fileHandler) exists(path string) bool { + _, err := os.Stat(path) + if err == nil { + return true + } + return !os.IsNotExist(err) && !os.IsPermission(err) +} diff --git a/ee/backup/s3_handler.go b/ee/backup/s3_handler.go new file mode 100644 index 00000000000..0b29073e491 --- /dev/null +++ b/ee/backup/s3_handler.go @@ -0,0 +1,134 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "fmt" + "io" + "net/url" + "os" + "path/filepath" + "strings" + "time" + + "github.com/dgraph-io/dgraph/x" + + humanize "github.com/dustin/go-humanize" + + "github.com/golang/glog" + minio "github.com/minio/minio-go" +) + +const ( + s3DefaultEndpoint = "s3.amazonaws.com" + s3AccelerateHost = "s3-accelerate" +) + +// s3Handler is used for 's3:' URI scheme. +type s3Handler struct { + bucket string + object string + pwriter *io.PipeWriter + preader *io.PipeReader + cerr chan error +} + +// Open creates an AWS session and sends our data stream to an S3 blob. +// URI formats: +// s3:///bucket/folder1.../folderN?secure=true|false +// s3:///bucket/folder1.../folderN?secure=true|false (use default S3 endpoint) +func (h *s3Handler) Open(uri *url.URL, req *Request) error { + accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") + secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") + if accessKeyID == "" || secretAccessKey == "" { + return x.Errorf("Env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not set.") + } + + glog.V(2).Infof("S3Handler got uri: %+v. Host: %s. Path: %s\n", uri, uri.Host, uri.Path) + // s3:///bucket/folder + if !strings.Contains(uri.Host, ".") { + uri.Host = s3DefaultEndpoint + } + glog.V(2).Infof("Backup using S3 host: %s, path: %s", uri.Host, uri.Path) + + if len(uri.Path) < 1 { + return x.Errorf("The S3 bucket %q is invalid", uri.Path) + } + + // split path into bucket and blob + parts := strings.Split(uri.Path[1:], "/") + h.bucket = parts[0] // bucket + // The location is: /bucket/folder1...folderN/dgraph.20181106.0113/r110001-g1.backup + parts = append(parts, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs)) + parts = append(parts, fmt.Sprintf("r%d.g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) + h.object = filepath.Join(parts[1:]...) + glog.V(2).Infof("Sending data to S3 blob %q ...", h.object) + + // secure by default + secure := uri.Query().Get("secure") != "false" + + mc, err := minio.New(uri.Host, accessKeyID, secretAccessKey, secure) + if err != nil { + return err + } + // S3 transfer acceleration support. + if strings.Contains(uri.Host, s3AccelerateHost) { + mc.SetS3TransferAccelerate(uri.Host) + } + // mc.TraceOn(os.Stderr) + + found, err := mc.BucketExists(h.bucket) + if err != nil { + return x.Errorf("Error while looking for bucket: %s at host: %s. Error: %v", + h.bucket, uri.Host, err) + } + if !found { + return x.Errorf("S3 bucket %s not found.", h.bucket) + } + + h.cerr = make(chan error, 1) + go func() { + h.cerr <- h.upload(mc) + }() + + glog.Infof("Uploading data, estimated size %s", humanize.Bytes(req.Sizex)) + return nil +} + +// upload will block until it's done or an error occurs. +func (h *s3Handler) upload(mc *minio.Client) error { + start := time.Now() + h.preader, h.pwriter = io.Pipe() + + // We don't need to have a progress object, because we're using a Pipe. A write to Pipe would + // block until it can be fully read. So, the rate of the writes here would be equal to the rate + // of upload. We're already tracking progress of the writes in stream.Lists, so no need to track + // the progress of read. By definition, it must be the same. + n, err := mc.PutObject(h.bucket, h.object, h.preader, -1, minio.PutObjectOptions{}) + glog.V(2).Infof("Backup sent %d bytes. Time elapsed: %s", + n, time.Since(start).Round(time.Second)) + + if err != nil { + // This should cause Write to fail as well. + glog.Errorf("Backup: Closing RW pipe due to error: %v", err) + h.pwriter.Close() + h.preader.Close() + } + return err +} + +func (h *s3Handler) Close() error { + // we are done buffering, send EOF. + if err := h.pwriter.CloseWithError(nil); err != nil && err != io.EOF { + glog.Errorf("Unexpected error while uploading: %v", err) + } + glog.V(2).Infof("Backup waiting for upload to complete.") + return <-h.cerr +} + +func (h *s3Handler) Write(b []byte) (int, error) { + return h.pwriter.Write(b) +} diff --git a/ee/backup/writer.go b/ee/backup/writer.go new file mode 100644 index 00000000000..886d2b54a93 --- /dev/null +++ b/ee/backup/writer.go @@ -0,0 +1,117 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "encoding/binary" + "io" + "net/url" + "strings" + + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" + + "github.com/golang/glog" +) + +// handler interface is implemented by URI scheme handlers. +type handler interface { + // Handlers know how to Write and Close to their target. + io.WriteCloser + // Session receives the host and path of the target. It should get all its configuration + // from the environment. + Open(*url.URL, *Request) error +} + +// writer handles the writes from stream.Orchestrate. It implements the kvStream interface. +type writer struct { + h handler +} + +// newWriter parses the requested target URI, finds a handler and then tries to create a session. +// Target URI formats: +// [scheme]://[host]/[path]?[args] +// [scheme]:///[path]?[args] +// /[path]?[args] (only for local or NFS) +// +// Target URI parts: +// scheme - service handler, one of: "s3", "gs", "az", "http", "file" +// host - remote address. ex: "dgraph.s3.amazonaws.com" +// path - directory, bucket or container at target. ex: "/dgraph/backups/" +// args - specific arguments that are ok to appear in logs. +// +// Global args (might not be support by all handlers): +// secure - true|false turn on/off TLS. +// compress - true|false turn on/off data compression. +// +// Examples: +// s3://dgraph.s3.amazonaws.com/dgraph/backups?secure=true +// gs://dgraph/backups/ +// as://dgraph-container/backups/ +// http://backups.dgraph.io/upload +// file:///tmp/dgraph/backups or /tmp/dgraph/backups?compress=gzip +func (r *Request) newWriter() (*writer, error) { + uri, err := url.Parse(r.Backup.Target) + if err != nil { + return nil, err + } + + // find handler for this URI scheme + var h handler + switch uri.Scheme { + case "file": + h = &fileHandler{} + case "s3": + h = &s3Handler{} + case "http", "https": + if strings.HasPrefix(uri.Host, "s3") && + strings.HasSuffix(uri.Host, ".amazonaws.com") { + h = &s3Handler{} + } + } + if h == nil { + return nil, x.Errorf("Unable to handle url: %v", uri) + } + + if err := h.Open(uri, r); err != nil { + return nil, err + } + + return &writer{h: h}, nil +} + +func (w *writer) flush() error { + glog.V(2).Infof("Backup closing handler.") + return w.h.Close() +} + +// write uses the data length as delimiter. +// XXX: we could use CRC for restore. +func (w *writer) write(kv *pb.KV) error { + if err := binary.Write(w.h, binary.LittleEndian, uint64(kv.Size())); err != nil { + return err + } + b, err := kv.Marshal() + if err != nil { + return err + } + _, err = w.h.Write(b) + return err +} + +// Send implements the stream.kvStream interface. +// It writes the received KV to the target as a delimited binary chain. +// Returns error if the writing fails, nil on success. +func (w *writer) Send(kvs *pb.KVS) error { + var err error + for _, kv := range kvs.Kv { + err = w.write(kv) + if err != nil { + return err + } + } + return nil +} diff --git a/protos/Makefile b/protos/Makefile index 3bca3d113fb..fc814de76fa 100644 --- a/protos/Makefile +++ b/protos/Makefile @@ -15,7 +15,7 @@ # PROTO_PATH := ${GOPATH}/src:. -PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/gogo/protobuf +PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/dgraph-io/dgraph PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/dgraph-io/dgo/protos .PHONY: help diff --git a/protos/pb.proto b/protos/pb.proto index 79a88d4bc54..bec54f12bc1 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -366,7 +366,7 @@ message MovePredicatePayload { MembershipState state = 4; } -// BackupPayload is used both as a request and a response. +// ExportPayload is used both as a request and a response. // When used in request, groups represents the list of groups that need to be backed up. // When used in response, groups represent the list of groups that were backed up. message ExportPayload { @@ -432,9 +432,9 @@ service Worker { rpc Sort (SortMessage) returns (SortResult) {} rpc Schema (SchemaRequest) returns (SchemaResult) {} rpc PurgeTs (api.Payload) returns (Num) {} - + rpc Backup (BackupRequest) returns (Status) {} rpc Export (ExportPayload) returns (ExportPayload) {} - rpc ReceivePredicate(stream KVS) returns (api.Payload) {} + rpc ReceivePredicate(stream KVS) returns (api.Payload) {} rpc MovePredicate(MovePredicatePayload) returns (api.Payload) {} } @@ -456,4 +456,18 @@ message SnapshotMeta { uint32 group_id = 2; } +// Status describes a general status response. +// code: 0 = success, -1 = unknown failure +message Status { + int32 code = 1; + string msg = 2; +} + +message BackupRequest { + uint64 read_ts = 1; + uint32 group_id = 2; + string unix_ts = 3; + string target = 4; +} + // vim: noexpandtab sw=2 ts=2 diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 977c7ff8fc7..43ced2c8d3b 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{17, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24, 1} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{36, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{36, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{39, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{39, 0} } type List struct { @@ -193,7 +193,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +241,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{1} + return fileDescriptor_pb_d366d8792d76fc2b, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +297,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{2} + return fileDescriptor_pb_d366d8792d76fc2b, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +370,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{3} + return fileDescriptor_pb_d366d8792d76fc2b, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +487,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{4} + return fileDescriptor_pb_d366d8792d76fc2b, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +534,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{5} + return fileDescriptor_pb_d366d8792d76fc2b, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +587,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{6} + return fileDescriptor_pb_d366d8792d76fc2b, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{7} + return fileDescriptor_pb_d366d8792d76fc2b, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +743,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{8} + return fileDescriptor_pb_d366d8792d76fc2b, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +818,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{9} + return fileDescriptor_pb_d366d8792d76fc2b, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +868,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{10} + return fileDescriptor_pb_d366d8792d76fc2b, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +945,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{11} + return fileDescriptor_pb_d366d8792d76fc2b, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1035,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{12} + return fileDescriptor_pb_d366d8792d76fc2b, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1096,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{13} + return fileDescriptor_pb_d366d8792d76fc2b, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1202,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{14} + return fileDescriptor_pb_d366d8792d76fc2b, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1300,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{15} + return fileDescriptor_pb_d366d8792d76fc2b, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1366,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{16} + return fileDescriptor_pb_d366d8792d76fc2b, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1456,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{17} + return fileDescriptor_pb_d366d8792d76fc2b, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1564,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{18} + return fileDescriptor_pb_d366d8792d76fc2b, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1646,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{19} + return fileDescriptor_pb_d366d8792d76fc2b, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1697,7 +1697,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{20} + return fileDescriptor_pb_d366d8792d76fc2b, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1771,7 +1771,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{21} + return fileDescriptor_pb_d366d8792d76fc2b, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,7 +1862,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{22} + return fileDescriptor_pb_d366d8792d76fc2b, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1919,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{23} + return fileDescriptor_pb_d366d8792d76fc2b, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1998,7 +1998,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2112,7 +2112,7 @@ func (m *UidBlock) Reset() { *m = UidBlock{} } func (m *UidBlock) String() string { return proto.CompactTextString(m) } func (*UidBlock) ProtoMessage() {} func (*UidBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{25} + return fileDescriptor_pb_d366d8792d76fc2b, []int{25} } func (m *UidBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2167,7 +2167,7 @@ func (m *UidPack) Reset() { *m = UidPack{} } func (m *UidPack) String() string { return proto.CompactTextString(m) } func (*UidPack) ProtoMessage() {} func (*UidPack) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{26} + return fileDescriptor_pb_d366d8792d76fc2b, []int{26} } func (m *UidPack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2223,7 +2223,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{27} + return fileDescriptor_pb_d366d8792d76fc2b, []int{27} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2285,7 +2285,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{28} + return fileDescriptor_pb_d366d8792d76fc2b, []int{28} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2340,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{29} + return fileDescriptor_pb_d366d8792d76fc2b, []int{29} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2394,7 +2394,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{30} + return fileDescriptor_pb_d366d8792d76fc2b, []int{30} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2441,7 +2441,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{31} + return fileDescriptor_pb_d366d8792d76fc2b, []int{31} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2490,7 +2490,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{32} + return fileDescriptor_pb_d366d8792d76fc2b, []int{32} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2554,7 +2554,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{33} + return fileDescriptor_pb_d366d8792d76fc2b, []int{33} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2619,7 +2619,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{34} + return fileDescriptor_pb_d366d8792d76fc2b, []int{34} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2680,7 +2680,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{35} + return fileDescriptor_pb_d366d8792d76fc2b, []int{35} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2734,7 +2734,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{36} + return fileDescriptor_pb_d366d8792d76fc2b, []int{36} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2834,7 +2834,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{37} + return fileDescriptor_pb_d366d8792d76fc2b, []int{37} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2898,7 +2898,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{38} + return fileDescriptor_pb_d366d8792d76fc2b, []int{38} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2955,7 +2955,7 @@ func (m *MovePredicatePayload) GetState() *MembershipState { return nil } -// BackupPayload is used both as a request and a response. +// ExportPayload is used both as a request and a response. // When used in request, groups represents the list of groups that need to be backed up. // When used in response, groups represent the list of groups that were backed up. type ExportPayload struct { @@ -2972,7 +2972,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{39} + return fileDescriptor_pb_d366d8792d76fc2b, []int{39} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3041,7 +3041,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{40} + return fileDescriptor_pb_d366d8792d76fc2b, []int{40} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3096,7 +3096,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{41} + return fileDescriptor_pb_d366d8792d76fc2b, []int{41} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,7 +3150,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{42} + return fileDescriptor_pb_d366d8792d76fc2b, []int{42} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3197,7 +3197,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{43} + return fileDescriptor_pb_d366d8792d76fc2b, []int{43} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3245,7 +3245,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{44} + return fileDescriptor_pb_d366d8792d76fc2b, []int{44} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3300,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{45} + return fileDescriptor_pb_d366d8792d76fc2b, []int{45} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3357,7 +3357,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{46} + return fileDescriptor_pb_d366d8792d76fc2b, []int{46} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3419,7 +3419,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{47} + return fileDescriptor_pb_d366d8792d76fc2b, []int{47} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3462,6 +3462,134 @@ func (m *SnapshotMeta) GetGroupId() uint32 { return 0 } +// Status describes a general status response. +// code: 0 = success, -1 = unknown failure +type Status struct { + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_d366d8792d76fc2b, []int{48} +} +func (m *Status) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Status.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *Status) XXX_Merge(src proto.Message) { + xxx_messageInfo_Status.Merge(dst, src) +} +func (m *Status) XXX_Size() int { + return m.Size() +} +func (m *Status) XXX_DiscardUnknown() { + xxx_messageInfo_Status.DiscardUnknown(m) +} + +var xxx_messageInfo_Status proto.InternalMessageInfo + +func (m *Status) GetCode() int32 { + if m != nil { + return m.Code + } + return 0 +} + +func (m *Status) GetMsg() string { + if m != nil { + return m.Msg + } + return "" +} + +type BackupRequest struct { + ReadTs uint64 `protobuf:"varint,1,opt,name=read_ts,json=readTs,proto3" json:"read_ts,omitempty"` + GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + UnixTs string `protobuf:"bytes,3,opt,name=unix_ts,json=unixTs,proto3" json:"unix_ts,omitempty"` + Target string `protobuf:"bytes,4,opt,name=target,proto3" json:"target,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BackupRequest) Reset() { *m = BackupRequest{} } +func (m *BackupRequest) String() string { return proto.CompactTextString(m) } +func (*BackupRequest) ProtoMessage() {} +func (*BackupRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_d366d8792d76fc2b, []int{49} +} +func (m *BackupRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BackupRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *BackupRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupRequest.Merge(dst, src) +} +func (m *BackupRequest) XXX_Size() int { + return m.Size() +} +func (m *BackupRequest) XXX_DiscardUnknown() { + xxx_messageInfo_BackupRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupRequest proto.InternalMessageInfo + +func (m *BackupRequest) GetReadTs() uint64 { + if m != nil { + return m.ReadTs + } + return 0 +} + +func (m *BackupRequest) GetGroupId() uint32 { + if m != nil { + return m.GroupId + } + return 0 +} + +func (m *BackupRequest) GetUnixTs() string { + if m != nil { + return m.UnixTs + } + return "" +} + +func (m *BackupRequest) GetTarget() string { + if m != nil { + return m.Target + } + return "" +} + func init() { proto.RegisterType((*List)(nil), "pb.List") proto.RegisterType((*TaskValue)(nil), "pb.TaskValue") @@ -3515,6 +3643,8 @@ func init() { proto.RegisterType((*Num)(nil), "pb.Num") proto.RegisterType((*AssignedIds)(nil), "pb.AssignedIds") proto.RegisterType((*SnapshotMeta)(nil), "pb.SnapshotMeta") + proto.RegisterType((*Status)(nil), "pb.Status") + proto.RegisterType((*BackupRequest)(nil), "pb.BackupRequest") proto.RegisterEnum("pb.DirectedEdge_Op", DirectedEdge_Op_name, DirectedEdge_Op_value) proto.RegisterEnum("pb.Posting_ValType", Posting_ValType_name, Posting_ValType_value) proto.RegisterEnum("pb.Posting_PostingType", Posting_PostingType_name, Posting_PostingType_value) @@ -4059,6 +4189,7 @@ type WorkerClient interface { Sort(ctx context.Context, in *SortMessage, opts ...grpc.CallOption) (*SortResult, error) Schema(ctx context.Context, in *SchemaRequest, opts ...grpc.CallOption) (*SchemaResult, error) PurgeTs(ctx context.Context, in *api.Payload, opts ...grpc.CallOption) (*Num, error) + Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*Status, error) Export(ctx context.Context, in *ExportPayload, opts ...grpc.CallOption) (*ExportPayload, error) ReceivePredicate(ctx context.Context, opts ...grpc.CallOption) (Worker_ReceivePredicateClient, error) MovePredicate(ctx context.Context, in *MovePredicatePayload, opts ...grpc.CallOption) (*api.Payload, error) @@ -4148,6 +4279,15 @@ func (c *workerClient) PurgeTs(ctx context.Context, in *api.Payload, opts ...grp return out, nil } +func (c *workerClient) Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*Status, error) { + out := new(Status) + err := c.cc.Invoke(ctx, "/pb.Worker/Backup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *workerClient) Export(ctx context.Context, in *ExportPayload, opts ...grpc.CallOption) (*ExportPayload, error) { out := new(ExportPayload) err := c.cc.Invoke(ctx, "/pb.Worker/Export", in, out, opts...) @@ -4209,6 +4349,7 @@ type WorkerServer interface { Sort(context.Context, *SortMessage) (*SortResult, error) Schema(context.Context, *SchemaRequest) (*SchemaResult, error) PurgeTs(context.Context, *api.Payload) (*Num, error) + Backup(context.Context, *BackupRequest) (*Status, error) Export(context.Context, *ExportPayload) (*ExportPayload, error) ReceivePredicate(Worker_ReceivePredicateServer) error MovePredicate(context.Context, *MovePredicatePayload) (*api.Payload, error) @@ -4334,6 +4475,24 @@ func _Worker_PurgeTs_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Worker_Backup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BackupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkerServer).Backup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.Worker/Backup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkerServer).Backup(ctx, req.(*BackupRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Worker_Export_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ExportPayload) if err := dec(in); err != nil { @@ -4420,6 +4579,10 @@ var _Worker_serviceDesc = grpc.ServiceDesc{ MethodName: "PurgeTs", Handler: _Worker_PurgeTs_Handler, }, + { + MethodName: "Backup", + Handler: _Worker_Backup_Handler, + }, { MethodName: "Export", Handler: _Worker_Export_Handler, @@ -6941,6 +7104,81 @@ func (m *SnapshotMeta) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *Status) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Status) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Code != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.Code)) + } + if len(m.Msg) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.Msg))) + i += copy(dAtA[i:], m.Msg) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *BackupRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ReadTs != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.ReadTs)) + } + if m.GroupId != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) + } + if len(m.UnixTs) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.UnixTs))) + i += copy(dAtA[i:], m.UnixTs) + } + if len(m.Target) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + func encodeVarintPb(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -8240,6 +8478,51 @@ func (m *SnapshotMeta) Size() (n int) { return n } +func (m *Status) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovPb(uint64(m.Code)) + } + l = len(m.Msg) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BackupRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ReadTs != 0 { + n += 1 + sovPb(uint64(m.ReadTs)) + } + if m.GroupId != 0 { + n += 1 + sovPb(uint64(m.GroupId)) + } + l = len(m.UnixTs) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + l = len(m.Target) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovPb(x uint64) (n int) { for { n++ @@ -15446,6 +15729,252 @@ func (m *SnapshotMeta) Unmarshal(dAtA []byte) error { } return nil } +func (m *Status) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Status: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Status: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Msg = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BackupRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BackupRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BackupRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadTs", wireType) + } + m.ReadTs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReadTs |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupId", wireType) + } + m.GroupId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GroupId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnixTs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnixTs = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Target = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipPb(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 @@ -15551,203 +16080,208 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_e185fe8dfa5a123b) } - -var fileDescriptor_pb_e185fe8dfa5a123b = []byte{ - // 3120 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xc9, 0x72, 0x23, 0x47, - 0x76, 0xac, 0x02, 0x50, 0xa8, 0x7a, 0x00, 0xd8, 0x50, 0xaa, 0xdd, 0x82, 0x20, 0x99, 0x4d, 0x95, - 0x7a, 0xa1, 0x5a, 0x12, 0xdd, 0xa2, 0x64, 0x6b, 0xb9, 0xb1, 0x09, 0xb0, 0x03, 0x6a, 0x6e, 0x4e, - 0x80, 0x2d, 0x5b, 0x07, 0x21, 0x92, 0xa8, 0x24, 0x59, 0x66, 0xa1, 0xaa, 0x5c, 0x59, 0x60, 0x80, - 0x7d, 0xf3, 0xc5, 0xdf, 0xa0, 0x93, 0x0f, 0x8e, 0xf0, 0xc5, 0xfe, 0x01, 0xfb, 0x03, 0x1c, 0x31, - 0x31, 0xa7, 0xb9, 0xce, 0x6d, 0xa2, 0xe7, 0x34, 0xe7, 0x89, 0x89, 0x39, 0xcc, 0x65, 0x22, 0x5f, - 0x66, 0x2d, 0x40, 0x93, 0xdd, 0xd2, 0x44, 0xcc, 0x09, 0xf5, 0xb6, 0x5c, 0xde, 0x7b, 0xf9, 0x36, - 0x80, 0x1d, 0x9f, 0x6c, 0xc6, 0x49, 0x94, 0x46, 0xc4, 0x8c, 0x4f, 0xba, 0x0e, 0x8b, 0x7d, 0x05, - 0xba, 0x5d, 0xa8, 0xee, 0xf9, 0x22, 0x25, 0x04, 0xaa, 0x33, 0xdf, 0x13, 0x1d, 0x63, 0xbd, 0xb2, - 0x61, 0x51, 0xfc, 0x76, 0xf7, 0xc1, 0x19, 0x31, 0x71, 0xf1, 0x9c, 0x05, 0x33, 0x4e, 0xda, 0x50, - 0xb9, 0x64, 0x41, 0xc7, 0x58, 0x37, 0x36, 0x9a, 0x54, 0x7e, 0x92, 0x4d, 0xb0, 0x2f, 0x59, 0x30, - 0x4e, 0xaf, 0x62, 0xde, 0x31, 0xd7, 0x8d, 0x8d, 0xd5, 0xad, 0xb7, 0x37, 0xe3, 0x93, 0xcd, 0xa3, - 0x48, 0xa4, 0x7e, 0x78, 0xb6, 0xf9, 0x9c, 0x05, 0xa3, 0xab, 0x98, 0xd3, 0xfa, 0xa5, 0xfa, 0x70, - 0x0f, 0xa1, 0x31, 0x4c, 0x26, 0xbb, 0xb3, 0x70, 0x92, 0xfa, 0x51, 0x28, 0x77, 0x0c, 0xd9, 0x94, - 0xe3, 0x8a, 0x0e, 0xc5, 0x6f, 0x89, 0x63, 0xc9, 0x99, 0xe8, 0x54, 0xd6, 0x2b, 0x12, 0x27, 0xbf, - 0x49, 0x07, 0xea, 0xbe, 0xd8, 0x89, 0x66, 0x61, 0xda, 0xa9, 0xae, 0x1b, 0x1b, 0x36, 0xcd, 0x40, - 0xf7, 0xf7, 0x26, 0xd4, 0xfe, 0x71, 0xc6, 0x93, 0x2b, 0x94, 0x4b, 0xd3, 0x24, 0x5b, 0x4b, 0x7e, - 0x93, 0xdb, 0x50, 0x0b, 0x58, 0x78, 0x26, 0x3a, 0x26, 0x2e, 0xa6, 0x00, 0xf2, 0x1e, 0x38, 0xec, - 0x34, 0xe5, 0xc9, 0x78, 0xe6, 0x7b, 0x9d, 0xca, 0xba, 0xb1, 0x61, 0x51, 0x1b, 0x11, 0xc7, 0xbe, - 0x47, 0xde, 0x05, 0xdb, 0x8b, 0xc6, 0x93, 0xf2, 0x5e, 0x5e, 0x84, 0x7b, 0x91, 0x0f, 0xc1, 0x9e, - 0xf9, 0xde, 0x38, 0xf0, 0x45, 0xda, 0xa9, 0xad, 0x1b, 0x1b, 0x8d, 0x2d, 0x5b, 0x5e, 0x56, 0xea, - 0x8e, 0xd6, 0x67, 0xbe, 0x87, 0x4a, 0x7c, 0x04, 0xb6, 0x48, 0x26, 0xe3, 0xd3, 0x59, 0x38, 0xe9, - 0x58, 0xc8, 0x74, 0x4b, 0x32, 0x95, 0x6e, 0x4d, 0xeb, 0x42, 0x01, 0xf2, 0x5a, 0x09, 0xbf, 0xe4, - 0x89, 0xe0, 0x9d, 0xba, 0xda, 0x4a, 0x83, 0xe4, 0x31, 0x34, 0x4e, 0xd9, 0x84, 0xa7, 0xe3, 0x98, - 0x25, 0x6c, 0xda, 0xb1, 0x8b, 0x85, 0x76, 0x25, 0xfa, 0x48, 0x62, 0x05, 0x85, 0xd3, 0x1c, 0x20, - 0x9f, 0x43, 0x0b, 0x21, 0x31, 0x3e, 0xf5, 0x83, 0x94, 0x27, 0x1d, 0x07, 0x65, 0x56, 0x51, 0x06, - 0x31, 0xa3, 0x84, 0x73, 0xda, 0x54, 0x4c, 0x0a, 0x43, 0xfe, 0x16, 0x80, 0xcf, 0x63, 0x16, 0x7a, - 0x63, 0x16, 0x04, 0x1d, 0xc0, 0x33, 0x38, 0x0a, 0xb3, 0x1d, 0x04, 0xe4, 0x1d, 0x79, 0x3e, 0xe6, - 0x8d, 0x53, 0xd1, 0x69, 0xad, 0x1b, 0x1b, 0x55, 0x6a, 0x49, 0x70, 0x24, 0xdc, 0x2d, 0x70, 0xd0, - 0x23, 0xf0, 0xc6, 0xf7, 0xc1, 0xba, 0x94, 0x80, 0x72, 0x9c, 0xc6, 0x56, 0x4b, 0x6e, 0x99, 0x3b, - 0x0d, 0xd5, 0x44, 0x77, 0x0d, 0xec, 0x3d, 0x16, 0x9e, 0x65, 0x9e, 0x26, 0x4d, 0x81, 0x02, 0x0e, - 0xc5, 0x6f, 0xf7, 0x47, 0x13, 0x2c, 0xca, 0xc5, 0x2c, 0x48, 0xc9, 0x43, 0x00, 0xa9, 0xe8, 0x29, - 0x4b, 0x13, 0x7f, 0xae, 0x57, 0x2d, 0x54, 0xed, 0xcc, 0x7c, 0x6f, 0x1f, 0x49, 0xe4, 0x31, 0x34, - 0x71, 0xf5, 0x8c, 0xd5, 0x2c, 0x0e, 0x90, 0x9f, 0x8f, 0x36, 0x90, 0x45, 0x4b, 0xdc, 0x01, 0x0b, - 0x6d, 0xab, 0xfc, 0xab, 0x45, 0x35, 0x44, 0xee, 0xc3, 0xaa, 0x1f, 0xa6, 0x52, 0xf7, 0x93, 0x74, - 0xec, 0x71, 0x91, 0x19, 0xbf, 0x95, 0x63, 0x7b, 0x5c, 0xa4, 0xe4, 0x33, 0x50, 0x0a, 0xcc, 0x36, - 0xac, 0xe1, 0x86, 0xab, 0xb9, 0x61, 0x84, 0xda, 0x11, 0x79, 0xf4, 0x8e, 0x9f, 0x42, 0x43, 0xde, - 0x2f, 0x93, 0xb0, 0x50, 0xa2, 0x89, 0xb7, 0xd1, 0xea, 0xa0, 0x20, 0x19, 0x34, 0xbb, 0x54, 0x8d, - 0x74, 0x30, 0xe5, 0x10, 0xf8, 0xed, 0xf6, 0xa1, 0x76, 0x98, 0x78, 0x3c, 0xb9, 0xd6, 0xc7, 0x09, - 0x54, 0x3d, 0x2e, 0x26, 0xf8, 0xfc, 0x6c, 0x8a, 0xdf, 0x85, 0xdf, 0x57, 0x4a, 0x7e, 0xef, 0xfe, - 0x87, 0x01, 0x8d, 0x61, 0x94, 0xa4, 0xfb, 0x5c, 0x08, 0x76, 0xc6, 0xc9, 0x5d, 0xa8, 0x45, 0x72, - 0x59, 0xad, 0x61, 0x47, 0x9e, 0x09, 0xf7, 0xa1, 0x0a, 0xbf, 0x64, 0x07, 0xf3, 0x66, 0x3b, 0xdc, - 0x86, 0x9a, 0x7a, 0x31, 0xf2, 0x35, 0xd5, 0xa8, 0x02, 0xa4, 0xae, 0xa3, 0xd3, 0x53, 0xc1, 0x95, - 0x2e, 0x6b, 0x54, 0x43, 0x37, 0xbb, 0xd5, 0xdf, 0x03, 0xc8, 0xf3, 0xfd, 0x4c, 0x2f, 0x70, 0xcf, - 0xa1, 0x41, 0xd9, 0x69, 0xba, 0x13, 0x85, 0x29, 0x9f, 0xa7, 0x64, 0x15, 0x4c, 0xdf, 0x43, 0x15, - 0x59, 0xd4, 0xf4, 0x3d, 0x79, 0xb8, 0xb3, 0x24, 0x9a, 0xc5, 0xa8, 0xa1, 0x16, 0x55, 0x00, 0xaa, - 0xd2, 0xf3, 0x12, 0x3c, 0xb1, 0x54, 0xa5, 0xe7, 0x25, 0xe4, 0x2e, 0x34, 0x44, 0xc8, 0x62, 0x71, - 0x1e, 0xa5, 0xf2, 0x70, 0x55, 0x3c, 0x1c, 0x64, 0xa8, 0x91, 0x70, 0xff, 0xdf, 0x00, 0x6b, 0x9f, - 0x4f, 0x4f, 0x78, 0xf2, 0xca, 0x2e, 0xef, 0x82, 0x8d, 0x0b, 0x8f, 0x7d, 0x4f, 0x6f, 0x54, 0x47, - 0x78, 0xe0, 0x5d, 0xbb, 0xd5, 0x1d, 0xb0, 0x02, 0xce, 0xa4, 0xf2, 0x95, 0x9f, 0x69, 0x48, 0xea, - 0x86, 0x4d, 0xc7, 0x1e, 0x67, 0x1e, 0x86, 0x18, 0x9b, 0x5a, 0x6c, 0xda, 0xe3, 0xcc, 0x93, 0x67, - 0x0b, 0x98, 0x48, 0xc7, 0xb3, 0xd8, 0x63, 0x29, 0xc7, 0xd0, 0x52, 0x95, 0x8e, 0x23, 0xd2, 0x63, - 0xc4, 0x90, 0x47, 0xf0, 0xd6, 0x24, 0x98, 0x09, 0x19, 0xd7, 0xfc, 0xf0, 0x34, 0x1a, 0x47, 0x61, - 0x70, 0x85, 0xfa, 0xb5, 0xe9, 0x2d, 0x4d, 0x18, 0x84, 0xa7, 0xd1, 0x61, 0x18, 0x5c, 0xb9, 0x7f, - 0x32, 0xa0, 0xf6, 0x14, 0xd5, 0xf0, 0x18, 0xea, 0x53, 0xbc, 0x50, 0xf6, 0x7a, 0xef, 0x48, 0x0d, - 0x23, 0x6d, 0x53, 0xdd, 0x54, 0xf4, 0xc3, 0x34, 0xb9, 0xa2, 0x19, 0x9b, 0x94, 0x48, 0xd9, 0x49, - 0xc0, 0x53, 0xa1, 0x3d, 0xa2, 0x24, 0x31, 0x52, 0x04, 0x2d, 0xa1, 0xd9, 0xba, 0xbb, 0xd0, 0x2c, - 0x2f, 0x25, 0xd3, 0xc8, 0x05, 0xbf, 0x42, 0xdd, 0x55, 0xa9, 0xfc, 0x24, 0xeb, 0x50, 0xc3, 0x47, - 0x8a, 0x9a, 0x6b, 0x6c, 0x81, 0x5c, 0x51, 0x89, 0x50, 0x45, 0xf8, 0xc6, 0xfc, 0xca, 0x90, 0xeb, - 0x94, 0x37, 0x28, 0xaf, 0xe3, 0xdc, 0xbc, 0x8e, 0x12, 0x29, 0xad, 0xe3, 0xfe, 0xd1, 0x80, 0xe6, - 0xf7, 0x3c, 0x89, 0x8e, 0x92, 0x28, 0x8e, 0x04, 0x0b, 0x88, 0x0b, 0x96, 0xba, 0xdd, 0x35, 0xfb, - 0x6b, 0x8a, 0xe4, 0x51, 0xf7, 0x41, 0x33, 0x2e, 0xae, 0xad, 0x29, 0x64, 0x0d, 0x60, 0xca, 0xe6, - 0x7b, 0x9c, 0x09, 0x3e, 0xf0, 0x32, 0xf7, 0x29, 0x30, 0xa4, 0x0b, 0xf6, 0x94, 0xcd, 0x47, 0xf3, - 0x70, 0x24, 0xd0, 0xba, 0x55, 0x9a, 0xc3, 0xe4, 0x7d, 0x70, 0xa6, 0x6c, 0x2e, 0xfd, 0x78, 0xe0, - 0x69, 0xeb, 0x16, 0x08, 0xf2, 0x01, 0x54, 0xd2, 0x79, 0x88, 0x41, 0x41, 0xe6, 0x01, 0x99, 0xbb, - 0x47, 0xf3, 0x50, 0x7b, 0x3c, 0x95, 0xb4, 0x4c, 0x1b, 0x76, 0xa1, 0x8d, 0x36, 0x54, 0x26, 0xbe, - 0x87, 0x89, 0xc0, 0xa1, 0xf2, 0xd3, 0xfd, 0xdf, 0x0a, 0xdc, 0xd2, 0xa6, 0x38, 0xf7, 0xe3, 0x61, - 0x2a, 0xfd, 0xa6, 0x03, 0x75, 0x7c, 0xae, 0x3c, 0xd1, 0x16, 0xc9, 0x40, 0xf2, 0x25, 0x58, 0xe8, - 0xc2, 0x99, 0xa1, 0xef, 0x16, 0x6a, 0xc9, 0xc5, 0x95, 0xe1, 0xb5, 0xc5, 0x35, 0x3b, 0xf9, 0x02, - 0x6a, 0x2f, 0x78, 0x12, 0xa9, 0xf0, 0xd3, 0xd8, 0x5a, 0xbb, 0x4e, 0x4e, 0x1a, 0x40, 0x8b, 0x29, - 0xe6, 0xbf, 0xa2, 0xf6, 0xee, 0xc9, 0x80, 0x33, 0x8d, 0x2e, 0xb9, 0xd7, 0xa9, 0xe3, 0x89, 0xca, - 0x06, 0xce, 0x48, 0x99, 0xba, 0xec, 0x5c, 0x5d, 0xdd, 0x1e, 0x34, 0x4a, 0xd7, 0x2b, 0xfb, 0x5b, - 0x4b, 0x69, 0xf8, 0xee, 0xa2, 0xbf, 0x39, 0xf9, 0x4b, 0x28, 0xbb, 0x6d, 0x0f, 0xa0, 0xb8, 0xec, - 0x5f, 0xea, 0xfc, 0xee, 0xbf, 0x19, 0x70, 0x6b, 0x27, 0x0a, 0x43, 0x8e, 0x35, 0x84, 0x32, 0x5d, - 0xe1, 0xb7, 0xc6, 0x8d, 0x7e, 0xfb, 0x11, 0xd4, 0x84, 0x64, 0xd6, 0xab, 0xbf, 0x7d, 0x8d, 0x2d, - 0xa8, 0xe2, 0x90, 0x21, 0x66, 0xca, 0xe6, 0xe3, 0x98, 0x87, 0x9e, 0x1f, 0x9e, 0xa1, 0x9f, 0x2b, - 0x0b, 0x1c, 0x29, 0x8c, 0xfb, 0x9f, 0x06, 0x58, 0xca, 0xe5, 0x17, 0xc2, 0x9d, 0xb1, 0x18, 0xee, - 0xde, 0x07, 0x27, 0x4e, 0xb8, 0xe7, 0x4f, 0xb2, 0x5d, 0x1d, 0x5a, 0x20, 0x64, 0x34, 0x3e, 0x8d, - 0x92, 0x09, 0xc7, 0xe5, 0x6d, 0xaa, 0x00, 0x59, 0x92, 0x61, 0x4a, 0xc0, 0xa0, 0xa5, 0x22, 0xa2, - 0x2d, 0x11, 0x32, 0x5a, 0x49, 0x11, 0x11, 0xb3, 0x89, 0x2a, 0x92, 0x2a, 0x54, 0x01, 0x32, 0x82, - 0x2a, 0xcb, 0xa1, 0xc5, 0x6c, 0xaa, 0x21, 0xf7, 0xbf, 0x4d, 0x68, 0xf6, 0xfc, 0x84, 0x4f, 0x52, - 0xee, 0xf5, 0xbd, 0x33, 0x64, 0xe4, 0x61, 0xea, 0xa7, 0x57, 0x3a, 0x5a, 0x6b, 0x28, 0x4f, 0xa6, - 0xe6, 0x62, 0xc1, 0xa8, 0x6c, 0x51, 0xc1, 0x1a, 0x57, 0x01, 0x64, 0x0b, 0x40, 0x95, 0x19, 0x58, - 0xe7, 0x56, 0x6f, 0xae, 0x73, 0x1d, 0x64, 0x93, 0x9f, 0x52, 0x41, 0x4a, 0xc6, 0x57, 0x91, 0xdc, - 0xc2, 0x22, 0x78, 0x26, 0x1d, 0x19, 0xb3, 0xf3, 0x09, 0x0f, 0xd0, 0x51, 0x31, 0x3b, 0x9f, 0xf0, - 0x20, 0xaf, 0x89, 0xea, 0xea, 0x38, 0xf2, 0x9b, 0x7c, 0x08, 0x66, 0x14, 0xe3, 0xfd, 0xf4, 0x86, - 0xe5, 0x8b, 0x6d, 0x1e, 0xc6, 0xd4, 0x8c, 0x62, 0xe9, 0x05, 0xaa, 0xa8, 0xeb, 0x38, 0xda, 0xb9, - 0x65, 0x78, 0xc0, 0x72, 0x84, 0x6a, 0x8a, 0x7b, 0x07, 0xcc, 0xc3, 0x98, 0xd4, 0xa1, 0x32, 0xec, - 0x8f, 0xda, 0x2b, 0xf2, 0xa3, 0xd7, 0xdf, 0x6b, 0x1b, 0xee, 0x4b, 0x03, 0x9c, 0xfd, 0x59, 0xca, - 0xa4, 0x4f, 0x89, 0xd7, 0x19, 0xf5, 0x5d, 0xb0, 0x45, 0xca, 0x12, 0xcc, 0x8b, 0xa6, 0x0a, 0x13, - 0x08, 0x8f, 0x04, 0x79, 0x00, 0x35, 0xee, 0x9d, 0xf1, 0xec, 0xb5, 0xb7, 0x97, 0xcf, 0x49, 0x15, - 0x99, 0x6c, 0x80, 0x25, 0x26, 0xe7, 0x7c, 0xca, 0x3a, 0xd5, 0x82, 0x71, 0x88, 0x18, 0x95, 0xc2, - 0xa8, 0xa6, 0x63, 0x0d, 0x9e, 0x44, 0x31, 0x16, 0xa5, 0x35, 0x5d, 0x83, 0x27, 0x51, 0x2c, 0x4b, - 0xd2, 0x2d, 0xf8, 0x1b, 0xff, 0x2c, 0x8c, 0x12, 0x3e, 0xf6, 0x43, 0x8f, 0xcf, 0xc7, 0x93, 0x28, - 0x3c, 0x0d, 0xfc, 0x49, 0x8a, 0xba, 0xb4, 0xe9, 0xdb, 0x8a, 0x38, 0x90, 0xb4, 0x1d, 0x4d, 0x72, - 0x3f, 0x04, 0xe7, 0x19, 0xbf, 0xc2, 0x82, 0x50, 0x90, 0x3b, 0x60, 0x5e, 0x5c, 0xea, 0x5c, 0x67, - 0xc9, 0x13, 0x3c, 0x7b, 0x4e, 0xcd, 0x8b, 0x4b, 0x77, 0x0e, 0xf6, 0x50, 0x27, 0x7a, 0xf2, 0x91, - 0x0c, 0x89, 0x18, 0x5a, 0xf5, 0xc3, 0xc2, 0xca, 0xbb, 0x54, 0x63, 0xd0, 0x8c, 0x2e, 0x6d, 0x89, - 0x07, 0xd1, 0x4a, 0x51, 0x40, 0xb9, 0xc2, 0xa9, 0x94, 0x2b, 0x1c, 0x2c, 0xd6, 0xa2, 0x90, 0x6b, - 0x17, 0xc7, 0x6f, 0xf7, 0xdf, 0x4d, 0xb0, 0xf3, 0x54, 0xf4, 0x31, 0x38, 0xd3, 0xcc, 0x1e, 0xfa, - 0xc9, 0x62, 0x39, 0x9b, 0x1b, 0x89, 0x16, 0x74, 0x7d, 0x97, 0xea, 0xf2, 0x5d, 0x8a, 0x37, 0x5f, - 0x7b, 0xe3, 0x9b, 0x7f, 0x08, 0xb7, 0x26, 0x01, 0x67, 0xe1, 0xb8, 0x78, 0xb2, 0xca, 0x2b, 0x57, - 0x11, 0x7d, 0x94, 0xbf, 0x5b, 0x1d, 0xb7, 0xea, 0x45, 0x7a, 0xb9, 0x0f, 0x35, 0x8f, 0x07, 0x29, - 0x2b, 0x77, 0x27, 0x87, 0x09, 0x9b, 0x04, 0xbc, 0x27, 0xd1, 0x54, 0x51, 0xc9, 0x06, 0xd8, 0x59, - 0x05, 0xa5, 0x7b, 0x12, 0x2c, 0x7e, 0x33, 0x65, 0xd3, 0x9c, 0xea, 0x7e, 0x06, 0x95, 0x67, 0xcf, - 0x87, 0x37, 0x59, 0x28, 0xd7, 0x9d, 0x59, 0xd2, 0xdd, 0x0f, 0x60, 0x3e, 0x7b, 0x5e, 0x8e, 0xa9, - 0xcd, 0x3c, 0xf5, 0xc9, 0x4e, 0xd5, 0x2c, 0x3a, 0xd5, 0x2e, 0xd8, 0x33, 0xc1, 0x93, 0x7d, 0x9e, - 0x32, 0xfd, 0xb8, 0x73, 0x58, 0xa6, 0x40, 0xd9, 0x76, 0xf9, 0x51, 0xa8, 0xd3, 0x4e, 0x06, 0xba, - 0xbf, 0xab, 0x40, 0x5d, 0x3f, 0x72, 0xb9, 0xe6, 0x2c, 0x2f, 0xf9, 0xe4, 0x67, 0x11, 0x2d, 0xcc, - 0x72, 0xb4, 0x28, 0xf7, 0xc4, 0x95, 0x37, 0xf7, 0xc4, 0xe4, 0x1b, 0x68, 0xc6, 0x8a, 0x56, 0x8e, - 0x2f, 0xef, 0x94, 0x65, 0xf4, 0x2f, 0xca, 0x35, 0xe2, 0x02, 0x90, 0x2f, 0x05, 0x9b, 0x8b, 0x94, - 0x9d, 0xa1, 0xb1, 0x9b, 0xb4, 0x2e, 0xe1, 0x11, 0x3b, 0xbb, 0x21, 0xca, 0xfc, 0x84, 0x60, 0x21, - 0x4b, 0xdb, 0x28, 0xee, 0x34, 0x31, 0x00, 0xc8, 0x00, 0x53, 0x7e, 0xfb, 0xad, 0xc5, 0xb7, 0xff, - 0x1e, 0x38, 0x93, 0x68, 0x3a, 0xf5, 0x91, 0xb6, 0xaa, 0x92, 0xb2, 0x42, 0x8c, 0x84, 0xfb, 0x02, - 0xea, 0xfa, 0xb2, 0xa4, 0x01, 0xf5, 0x5e, 0x7f, 0x77, 0xfb, 0x78, 0x4f, 0x46, 0x1f, 0x00, 0xeb, - 0xc9, 0xe0, 0x60, 0x9b, 0xfe, 0x73, 0xdb, 0x90, 0x91, 0x68, 0x70, 0x30, 0x6a, 0x9b, 0xc4, 0x81, - 0xda, 0xee, 0xde, 0xe1, 0xf6, 0xa8, 0x5d, 0x21, 0x36, 0x54, 0x9f, 0x1c, 0x1e, 0xee, 0xb5, 0xab, - 0xa4, 0x09, 0x76, 0x6f, 0x7b, 0xd4, 0x1f, 0x0d, 0xf6, 0xfb, 0xed, 0x9a, 0xe4, 0x7d, 0xda, 0x3f, - 0x6c, 0x5b, 0xf2, 0xe3, 0x78, 0xd0, 0x6b, 0xd7, 0x25, 0xfd, 0x68, 0x7b, 0x38, 0xfc, 0xee, 0x90, - 0xf6, 0xda, 0xb6, 0x5c, 0x77, 0x38, 0xa2, 0x83, 0x83, 0xa7, 0x6d, 0xc7, 0xfd, 0x0c, 0x1a, 0x25, - 0xa5, 0x49, 0x09, 0xda, 0xdf, 0x6d, 0xaf, 0xc8, 0x6d, 0x9e, 0x6f, 0xef, 0x1d, 0xf7, 0xdb, 0x06, - 0x59, 0x05, 0xc0, 0xcf, 0xf1, 0xde, 0xf6, 0xc1, 0xd3, 0xb6, 0xe9, 0xfe, 0x03, 0xd8, 0xc7, 0xbe, - 0xf7, 0x24, 0x88, 0x26, 0x17, 0xd2, 0xd7, 0x4e, 0x98, 0xe0, 0x3a, 0x4d, 0xe3, 0xb7, 0xcc, 0x23, - 0xe8, 0xd1, 0x42, 0x9b, 0x5b, 0x43, 0xee, 0x01, 0xd4, 0x8f, 0x7d, 0xef, 0x88, 0x4d, 0x2e, 0x64, - 0x3f, 0x7d, 0x22, 0xe5, 0xc7, 0xc2, 0x7f, 0xc1, 0x75, 0x08, 0x75, 0x10, 0x33, 0xf4, 0x5f, 0x70, - 0x72, 0x0f, 0x2c, 0x04, 0xb2, 0x82, 0x0a, 0x1f, 0x42, 0xb6, 0x27, 0xd5, 0x34, 0x37, 0xcd, 0x8f, - 0x8e, 0xbd, 0xf2, 0x5d, 0xa8, 0xc6, 0x6c, 0x72, 0xa1, 0x23, 0x51, 0x43, 0x8b, 0xc8, 0xed, 0x28, - 0x12, 0xc8, 0x43, 0xb0, 0xb5, 0x4b, 0x64, 0xeb, 0x36, 0x4a, 0xbe, 0x43, 0x73, 0xe2, 0xa2, 0xb1, - 0x2a, 0x4b, 0xc6, 0xfa, 0x02, 0xa0, 0x18, 0x2d, 0x5c, 0x53, 0x5a, 0xdf, 0x86, 0x1a, 0x0b, 0x7c, - 0x7d, 0x79, 0x87, 0x2a, 0xc0, 0x3d, 0x80, 0x46, 0x69, 0x20, 0x21, 0x3d, 0x85, 0x05, 0xc1, 0xf8, - 0x82, 0x5f, 0x09, 0x94, 0xb5, 0x69, 0x9d, 0x05, 0xc1, 0x33, 0x7e, 0x25, 0xc8, 0x3d, 0xa8, 0xa9, - 0x59, 0x86, 0xb9, 0xd4, 0x32, 0xa3, 0x28, 0x55, 0x44, 0xf7, 0x13, 0xb0, 0x54, 0x1f, 0x5d, 0x72, - 0x54, 0xe3, 0xc6, 0xac, 0xf6, 0xb5, 0x3e, 0x33, 0x76, 0xdd, 0xe4, 0x63, 0x3d, 0x33, 0x11, 0x6a, - 0x42, 0x63, 0x14, 0x95, 0x9e, 0x62, 0xd2, 0xe3, 0x12, 0x64, 0x76, 0x7b, 0x60, 0xbf, 0x76, 0x0a, - 0xa5, 0x15, 0x60, 0x16, 0x0a, 0xb8, 0x66, 0x2e, 0xe5, 0xfe, 0x0b, 0x40, 0x31, 0x5b, 0xd1, 0xef, - 0x46, 0xad, 0x22, 0xdf, 0xcd, 0x23, 0xb0, 0x27, 0xe7, 0x7e, 0xe0, 0x25, 0x3c, 0x5c, 0xb8, 0x75, - 0x31, 0x8d, 0xc9, 0xe9, 0x64, 0x1d, 0xaa, 0x38, 0x32, 0xaa, 0x14, 0x11, 0x32, 0x9f, 0x17, 0x21, - 0xc5, 0x3d, 0x81, 0x96, 0x4a, 0x96, 0x94, 0xff, 0xeb, 0x8c, 0x8b, 0xd7, 0x96, 0x60, 0x6b, 0x00, - 0x79, 0x3c, 0xcf, 0x86, 0x5f, 0x25, 0x8c, 0x74, 0xe5, 0x53, 0x9f, 0x07, 0x5e, 0x76, 0x1b, 0x0d, - 0xb9, 0x5f, 0x42, 0x33, 0xdb, 0x43, 0xb7, 0xe0, 0x59, 0xca, 0x56, 0xda, 0x54, 0x9d, 0x87, 0x62, - 0x39, 0x88, 0xbc, 0x3c, 0x63, 0xbb, 0xbf, 0x36, 0x33, 0x49, 0xdd, 0x8d, 0x2e, 0x14, 0x81, 0xc6, - 0x72, 0x11, 0xb8, 0x58, 0x50, 0x99, 0x3f, 0xa9, 0xa0, 0xfa, 0x0a, 0x1c, 0x0f, 0xab, 0x0a, 0xff, - 0x32, 0x8b, 0xab, 0xdd, 0xe5, 0x0a, 0x42, 0xd7, 0x1d, 0xfe, 0x25, 0xa7, 0x05, 0xb3, 0x3c, 0x4b, - 0x1a, 0x5d, 0xf0, 0xd0, 0x7f, 0x81, 0xed, 0xb6, 0xbc, 0x70, 0x81, 0x28, 0x66, 0x17, 0xaa, 0xd2, - 0xd0, 0xb3, 0x8b, 0x6c, 0x0c, 0x63, 0x15, 0x63, 0x18, 0xa9, 0xb5, 0x59, 0x2c, 0x78, 0x92, 0x66, - 0x15, 0xa7, 0x82, 0xf2, 0xca, 0xcd, 0xd1, 0xbc, 0x2c, 0x3c, 0x73, 0xbf, 0x06, 0x27, 0x3f, 0x8b, - 0x0c, 0x68, 0x07, 0x87, 0x07, 0x7d, 0x15, 0x7e, 0x06, 0x07, 0xbd, 0xfe, 0x3f, 0xb5, 0x0d, 0x19, - 0x12, 0x69, 0xff, 0x79, 0x9f, 0x0e, 0xfb, 0x6d, 0x53, 0x86, 0xae, 0x5e, 0x7f, 0xaf, 0x3f, 0xea, - 0xb7, 0x2b, 0xdf, 0x56, 0xed, 0x7a, 0xdb, 0xa6, 0x36, 0x9f, 0xc7, 0x81, 0x3f, 0xf1, 0x53, 0xf7, - 0x18, 0xec, 0x7d, 0x16, 0xbf, 0xd2, 0x3d, 0x14, 0x99, 0x6e, 0xa6, 0x47, 0x0e, 0x3a, 0x2b, 0xdd, - 0x87, 0xba, 0x7e, 0xf2, 0xda, 0x9b, 0x16, 0xc2, 0x41, 0x46, 0x73, 0xff, 0xc7, 0x80, 0xdb, 0xfb, - 0xd1, 0x25, 0xcf, 0x53, 0xfc, 0x11, 0xbb, 0x0a, 0x22, 0xe6, 0xbd, 0xc1, 0x74, 0x0f, 0xe0, 0x96, - 0x88, 0x66, 0xc9, 0x84, 0x8f, 0x97, 0xc6, 0x1d, 0x2d, 0x85, 0x7e, 0xaa, 0x5d, 0xd0, 0x85, 0x96, - 0xc7, 0x45, 0x5a, 0x70, 0x55, 0x90, 0xab, 0x21, 0x91, 0x19, 0x4f, 0x5e, 0xa7, 0x54, 0xdf, 0x54, - 0xa7, 0xb8, 0xbf, 0x34, 0xa0, 0xd5, 0x9f, 0xc7, 0x51, 0x92, 0x66, 0xc7, 0x7c, 0x8d, 0xfb, 0x3f, - 0x06, 0x4b, 0x4a, 0xcd, 0x84, 0x76, 0xad, 0x8e, 0x5c, 0x78, 0x41, 0x7a, 0x73, 0x88, 0x74, 0xaa, - 0xf9, 0x6e, 0x2e, 0xd8, 0xde, 0x81, 0xfa, 0x2c, 0xf4, 0xe7, 0xd9, 0x38, 0xa8, 0x42, 0x2d, 0x09, - 0x8e, 0x84, 0xfb, 0x0d, 0x58, 0x6a, 0x8d, 0x92, 0x75, 0x1b, 0x50, 0x1f, 0x1e, 0xef, 0xec, 0xf4, - 0x87, 0xc3, 0xb6, 0x41, 0x5a, 0xe0, 0xf4, 0x8e, 0x8f, 0xf6, 0x06, 0x3b, 0xdb, 0x23, 0x6d, 0xe1, - 0xdd, 0xed, 0xc1, 0x5e, 0xbf, 0xd7, 0xae, 0xb8, 0x3b, 0xe0, 0x8c, 0xe6, 0xa1, 0x16, 0x2f, 0x67, - 0x57, 0xe3, 0x35, 0xd9, 0xd5, 0x5c, 0x0a, 0xd8, 0x43, 0x68, 0x94, 0xaa, 0x2d, 0xf2, 0x01, 0x54, - 0xd3, 0x79, 0xb8, 0x38, 0x83, 0xcd, 0xf6, 0xa0, 0x48, 0x22, 0x1f, 0x40, 0x53, 0xf6, 0x77, 0x4c, - 0x08, 0xff, 0x2c, 0xe4, 0x9e, 0x5e, 0x51, 0xf6, 0x7c, 0xdb, 0x1a, 0xe5, 0xde, 0x85, 0x96, 0x6c, - 0xa8, 0xfd, 0x29, 0x17, 0x29, 0x9b, 0xc6, 0x58, 0x0b, 0xe8, 0x10, 0x5c, 0xa5, 0x66, 0x2a, 0xdc, - 0x07, 0xd0, 0x3c, 0xe2, 0x3c, 0xa1, 0x5c, 0xc4, 0x51, 0xa8, 0x92, 0xa2, 0x56, 0xb5, 0x8a, 0xf7, - 0x1a, 0x72, 0x7f, 0x00, 0x47, 0xd6, 0xcb, 0x4f, 0x58, 0x3a, 0x39, 0xff, 0x39, 0xf5, 0xf4, 0x03, - 0xa8, 0xc7, 0xca, 0x44, 0xba, 0xfa, 0x6d, 0x62, 0xc8, 0xd1, 0x66, 0xa3, 0x19, 0xd1, 0xfd, 0x02, - 0x2a, 0x07, 0xb3, 0x69, 0xf9, 0x1f, 0x89, 0xaa, 0xaa, 0xf3, 0x16, 0x3a, 0x49, 0x73, 0xb1, 0x93, - 0x74, 0xbf, 0x87, 0x46, 0x76, 0xd5, 0x81, 0x87, 0x7f, 0x2b, 0xa0, 0xaa, 0x07, 0xde, 0x82, 0xe6, - 0x55, 0x8b, 0xc6, 0x43, 0x6f, 0x90, 0xe9, 0x48, 0x01, 0x8b, 0x6b, 0xeb, 0x11, 0x44, 0xbe, 0xf6, - 0x2e, 0x34, 0xb3, 0x9a, 0x16, 0x8b, 0x4a, 0x69, 0xbc, 0xc0, 0xe7, 0x61, 0xc9, 0xb0, 0xb6, 0x42, - 0x8c, 0xc4, 0x6b, 0xa6, 0x85, 0x5b, 0xff, 0x67, 0x40, 0x55, 0xaa, 0x86, 0xdc, 0x83, 0x6a, 0x7f, - 0x72, 0x1e, 0x91, 0x05, 0x0d, 0x74, 0x17, 0x20, 0x77, 0x85, 0x7c, 0xa2, 0x86, 0x9f, 0xd9, 0x4c, - 0xb7, 0x95, 0x69, 0x16, 0x35, 0xff, 0x0a, 0xf7, 0x26, 0x34, 0xbe, 0x8d, 0xfc, 0x70, 0x47, 0xcd, - 0x03, 0xc9, 0xb2, 0x1d, 0x5e, 0xe1, 0xff, 0x14, 0xac, 0x81, 0x90, 0x06, 0x7f, 0x95, 0x15, 0xdb, - 0xb7, 0xb2, 0x2f, 0xb8, 0x2b, 0x5b, 0x7f, 0x30, 0xa1, 0xfa, 0x3d, 0x4f, 0x22, 0xf2, 0x09, 0xd4, - 0xf5, 0xb0, 0x82, 0x94, 0x86, 0x12, 0x5d, 0x7c, 0xe1, 0x4b, 0x53, 0x0c, 0x3c, 0x95, 0xa5, 0xd3, - 0x46, 0x31, 0x41, 0xe9, 0x5e, 0x17, 0x0d, 0xdc, 0x95, 0x0d, 0xe3, 0xb1, 0x41, 0x3e, 0x06, 0x4b, - 0xb9, 0xfe, 0x92, 0x6e, 0x96, 0x5b, 0x10, 0x77, 0xe5, 0xb1, 0x41, 0x1e, 0x42, 0x63, 0x78, 0x1e, - 0xcd, 0x02, 0x6f, 0xc8, 0x93, 0x4b, 0x4e, 0x4a, 0x73, 0xbb, 0x6e, 0xe9, 0xdb, 0x5d, 0x21, 0x1b, - 0x00, 0xca, 0x39, 0x8e, 0x7d, 0x4f, 0x90, 0xba, 0xa4, 0x1d, 0xcc, 0xa6, 0x6a, 0xd1, 0x92, 0xd7, - 0x28, 0xce, 0xd2, 0x13, 0x79, 0x1d, 0xe7, 0xe7, 0xd0, 0xda, 0xc1, 0x07, 0x7b, 0x98, 0x6c, 0x9f, - 0x44, 0x49, 0x4a, 0x96, 0x67, 0x77, 0xdd, 0x65, 0x84, 0xbb, 0x42, 0x1e, 0x83, 0x3d, 0x4a, 0xae, - 0x14, 0xff, 0x5b, 0xfa, 0x21, 0x17, 0xfb, 0x5d, 0x73, 0xcb, 0xad, 0xff, 0xaa, 0x80, 0xf5, 0x5d, - 0x94, 0x5c, 0xf0, 0x84, 0x3c, 0x02, 0x0b, 0x7b, 0x45, 0xed, 0x0a, 0x79, 0xdf, 0x78, 0xdd, 0x46, - 0xf7, 0xc0, 0x41, 0xa5, 0x8c, 0x98, 0xb8, 0x50, 0xaa, 0xc7, 0xbf, 0xd2, 0x94, 0x5e, 0x54, 0x09, - 0x80, 0x3e, 0xb0, 0x3a, 0x4c, 0x13, 0xce, 0xa6, 0x79, 0x7f, 0xbc, 0xd0, 0xc0, 0x75, 0xeb, 0xaa, - 0x47, 0x1b, 0x6a, 0xe3, 0x7c, 0x04, 0xd5, 0xa1, 0xba, 0xa9, 0x64, 0x2a, 0xfe, 0x6e, 0xe8, 0xae, - 0x66, 0x88, 0x7c, 0xe5, 0xbf, 0x03, 0x4b, 0x65, 0x6f, 0x75, 0xcd, 0x85, 0xf2, 0xa6, 0xdb, 0x2e, - 0xa3, 0xb4, 0x80, 0x0b, 0xf5, 0xa3, 0x59, 0x72, 0xc6, 0x47, 0x62, 0xc9, 0xf2, 0x99, 0x0d, 0x50, - 0x7b, 0x96, 0x0a, 0xf5, 0x6a, 0xd1, 0x85, 0xb0, 0xdf, 0x7d, 0x15, 0x85, 0x17, 0x6c, 0x53, 0x3e, - 0xe1, 0x7e, 0x29, 0x17, 0x92, 0xec, 0x52, 0xcb, 0x2f, 0x62, 0xc3, 0x20, 0x5f, 0x43, 0x6b, 0x21, - 0x6f, 0x12, 0x4c, 0x2f, 0xd7, 0xa5, 0xd2, 0x65, 0xe1, 0x27, 0xed, 0x5f, 0xbc, 0x5c, 0x33, 0x7e, - 0xf5, 0x72, 0xcd, 0xf8, 0xcd, 0xcb, 0x35, 0xe3, 0xc7, 0xdf, 0xae, 0xad, 0x9c, 0x58, 0xf8, 0x17, - 0xec, 0xe7, 0x7f, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xbe, 0x30, 0x0e, 0x9d, 0x1d, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_d366d8792d76fc2b) } + +var fileDescriptor_pb_d366d8792d76fc2b = []byte{ + // 3195 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x72, 0xe3, 0x56, + 0x76, 0x02, 0x48, 0x82, 0xc0, 0x21, 0xa9, 0xa6, 0xaf, 0x3b, 0x6d, 0x9a, 0x76, 0xd4, 0x32, 0xdc, + 0x0f, 0x75, 0xdb, 0x56, 0xda, 0xb2, 0x13, 0x3f, 0x76, 0x6a, 0x91, 0xea, 0xa2, 0x5b, 0xaf, 0x5c, + 0x52, 0xed, 0xc4, 0x0b, 0xb3, 0x20, 0xe0, 0x8a, 0x42, 0x04, 0x02, 0x08, 0x2e, 0xa8, 0xa2, 0x7a, + 0x97, 0x4d, 0xbe, 0xc1, 0xab, 0x2c, 0xb2, 0x4c, 0x7e, 0x60, 0xe6, 0x03, 0xa6, 0x6a, 0x6a, 0x56, + 0xde, 0xce, 0x6e, 0xaa, 0x67, 0x35, 0xeb, 0xa9, 0xa9, 0x59, 0xcc, 0x66, 0xea, 0x9e, 0x7b, 0xf1, + 0x20, 0x5b, 0x52, 0xdb, 0x53, 0x35, 0x2b, 0xe2, 0xbc, 0xee, 0xe3, 0x9c, 0x73, 0xcf, 0x8b, 0x60, + 0xc6, 0x27, 0x9b, 0x71, 0x12, 0xa5, 0x11, 0xd1, 0xe3, 0x93, 0xae, 0xe5, 0xc4, 0xbe, 0x04, 0xed, + 0x2e, 0x54, 0xf7, 0x7c, 0x9e, 0x12, 0x02, 0xd5, 0x99, 0xef, 0xf1, 0x8e, 0xb6, 0x5e, 0xd9, 0x30, + 0x28, 0x7e, 0xdb, 0xfb, 0x60, 0x8d, 0x1c, 0x7e, 0xfe, 0xc2, 0x09, 0x66, 0x8c, 0xb4, 0xa1, 0x72, + 0xe1, 0x04, 0x1d, 0x6d, 0x5d, 0xdb, 0x68, 0x52, 0xf1, 0x49, 0x36, 0xc1, 0xbc, 0x70, 0x82, 0x71, + 0x7a, 0x19, 0xb3, 0x8e, 0xbe, 0xae, 0x6d, 0xac, 0x6e, 0xbd, 0xbd, 0x19, 0x9f, 0x6c, 0x1e, 0x45, + 0x3c, 0xf5, 0xc3, 0xc9, 0xe6, 0x0b, 0x27, 0x18, 0x5d, 0xc6, 0x8c, 0xd6, 0x2f, 0xe4, 0x87, 0x7d, + 0x08, 0x8d, 0x61, 0xe2, 0xee, 0xce, 0x42, 0x37, 0xf5, 0xa3, 0x50, 0xec, 0x18, 0x3a, 0x53, 0x86, + 0x2b, 0x5a, 0x14, 0xbf, 0x05, 0xce, 0x49, 0x26, 0xbc, 0x53, 0x59, 0xaf, 0x08, 0x9c, 0xf8, 0x26, + 0x1d, 0xa8, 0xfb, 0x7c, 0x27, 0x9a, 0x85, 0x69, 0xa7, 0xba, 0xae, 0x6d, 0x98, 0x34, 0x03, 0xed, + 0x3f, 0xea, 0x50, 0xfb, 0xd7, 0x19, 0x4b, 0x2e, 0x51, 0x2e, 0x4d, 0x93, 0x6c, 0x2d, 0xf1, 0x4d, + 0x6e, 0x43, 0x2d, 0x70, 0xc2, 0x09, 0xef, 0xe8, 0xb8, 0x98, 0x04, 0xc8, 0x7b, 0x60, 0x39, 0xa7, + 0x29, 0x4b, 0xc6, 0x33, 0xdf, 0xeb, 0x54, 0xd6, 0xb5, 0x0d, 0x83, 0x9a, 0x88, 0x38, 0xf6, 0x3d, + 0xf2, 0x2e, 0x98, 0x5e, 0x34, 0x76, 0xcb, 0x7b, 0x79, 0x11, 0xee, 0x45, 0x3e, 0x04, 0x73, 0xe6, + 0x7b, 0xe3, 0xc0, 0xe7, 0x69, 0xa7, 0xb6, 0xae, 0x6d, 0x34, 0xb6, 0x4c, 0x71, 0x59, 0xa1, 0x3b, + 0x5a, 0x9f, 0xf9, 0x1e, 0x2a, 0xf1, 0x31, 0x98, 0x3c, 0x71, 0xc7, 0xa7, 0xb3, 0xd0, 0xed, 0x18, + 0xc8, 0x74, 0x4b, 0x30, 0x95, 0x6e, 0x4d, 0xeb, 0x5c, 0x02, 0xe2, 0x5a, 0x09, 0xbb, 0x60, 0x09, + 0x67, 0x9d, 0xba, 0xdc, 0x4a, 0x81, 0xe4, 0x09, 0x34, 0x4e, 0x1d, 0x97, 0xa5, 0xe3, 0xd8, 0x49, + 0x9c, 0x69, 0xc7, 0x2c, 0x16, 0xda, 0x15, 0xe8, 0x23, 0x81, 0xe5, 0x14, 0x4e, 0x73, 0x80, 0x7c, + 0x06, 0x2d, 0x84, 0xf8, 0xf8, 0xd4, 0x0f, 0x52, 0x96, 0x74, 0x2c, 0x94, 0x59, 0x45, 0x19, 0xc4, + 0x8c, 0x12, 0xc6, 0x68, 0x53, 0x32, 0x49, 0x0c, 0xf9, 0x47, 0x00, 0x36, 0x8f, 0x9d, 0xd0, 0x1b, + 0x3b, 0x41, 0xd0, 0x01, 0x3c, 0x83, 0x25, 0x31, 0xdb, 0x41, 0x40, 0xde, 0x11, 0xe7, 0x73, 0xbc, + 0x71, 0xca, 0x3b, 0xad, 0x75, 0x6d, 0xa3, 0x4a, 0x0d, 0x01, 0x8e, 0xb8, 0xbd, 0x05, 0x16, 0x7a, + 0x04, 0xde, 0xf8, 0x3e, 0x18, 0x17, 0x02, 0x90, 0x8e, 0xd3, 0xd8, 0x6a, 0x89, 0x2d, 0x73, 0xa7, + 0xa1, 0x8a, 0x68, 0xaf, 0x81, 0xb9, 0xe7, 0x84, 0x93, 0xcc, 0xd3, 0x84, 0x29, 0x50, 0xc0, 0xa2, + 0xf8, 0x6d, 0xff, 0xa0, 0x83, 0x41, 0x19, 0x9f, 0x05, 0x29, 0x79, 0x08, 0x20, 0x14, 0x3d, 0x75, + 0xd2, 0xc4, 0x9f, 0xab, 0x55, 0x0b, 0x55, 0x5b, 0x33, 0xdf, 0xdb, 0x47, 0x12, 0x79, 0x02, 0x4d, + 0x5c, 0x3d, 0x63, 0xd5, 0x8b, 0x03, 0xe4, 0xe7, 0xa3, 0x0d, 0x64, 0x51, 0x12, 0x77, 0xc0, 0x40, + 0xdb, 0x4a, 0xff, 0x6a, 0x51, 0x05, 0x91, 0xfb, 0xb0, 0xea, 0x87, 0xa9, 0xd0, 0xbd, 0x9b, 0x8e, + 0x3d, 0xc6, 0x33, 0xe3, 0xb7, 0x72, 0x6c, 0x8f, 0xf1, 0x94, 0x7c, 0x0a, 0x52, 0x81, 0xd9, 0x86, + 0x35, 0xdc, 0x70, 0x35, 0x37, 0x0c, 0x97, 0x3b, 0x22, 0x8f, 0xda, 0xf1, 0x13, 0x68, 0x88, 0xfb, + 0x65, 0x12, 0x06, 0x4a, 0x34, 0xf1, 0x36, 0x4a, 0x1d, 0x14, 0x04, 0x83, 0x62, 0x17, 0xaa, 0x11, + 0x0e, 0x26, 0x1d, 0x02, 0xbf, 0xed, 0x3e, 0xd4, 0x0e, 0x13, 0x8f, 0x25, 0x57, 0xfa, 0x38, 0x81, + 0xaa, 0xc7, 0xb8, 0x8b, 0xcf, 0xcf, 0xa4, 0xf8, 0x5d, 0xf8, 0x7d, 0xa5, 0xe4, 0xf7, 0xf6, 0xff, + 0x68, 0xd0, 0x18, 0x46, 0x49, 0xba, 0xcf, 0x38, 0x77, 0x26, 0x8c, 0xdc, 0x85, 0x5a, 0x24, 0x96, + 0x55, 0x1a, 0xb6, 0xc4, 0x99, 0x70, 0x1f, 0x2a, 0xf1, 0x4b, 0x76, 0xd0, 0xaf, 0xb7, 0xc3, 0x6d, + 0xa8, 0xc9, 0x17, 0x23, 0x5e, 0x53, 0x8d, 0x4a, 0x40, 0xe8, 0x3a, 0x3a, 0x3d, 0xe5, 0x4c, 0xea, + 0xb2, 0x46, 0x15, 0x74, 0xbd, 0x5b, 0xfd, 0x33, 0x80, 0x38, 0xdf, 0xcf, 0xf4, 0x02, 0xfb, 0x0c, + 0x1a, 0xd4, 0x39, 0x4d, 0x77, 0xa2, 0x30, 0x65, 0xf3, 0x94, 0xac, 0x82, 0xee, 0x7b, 0xa8, 0x22, + 0x83, 0xea, 0xbe, 0x27, 0x0e, 0x37, 0x49, 0xa2, 0x59, 0x8c, 0x1a, 0x6a, 0x51, 0x09, 0xa0, 0x2a, + 0x3d, 0x2f, 0xc1, 0x13, 0x0b, 0x55, 0x7a, 0x5e, 0x42, 0xee, 0x42, 0x83, 0x87, 0x4e, 0xcc, 0xcf, + 0xa2, 0x54, 0x1c, 0xae, 0x8a, 0x87, 0x83, 0x0c, 0x35, 0xe2, 0xf6, 0xaf, 0x34, 0x30, 0xf6, 0xd9, + 0xf4, 0x84, 0x25, 0xaf, 0xed, 0xf2, 0x2e, 0x98, 0xb8, 0xf0, 0xd8, 0xf7, 0xd4, 0x46, 0x75, 0x84, + 0x07, 0xde, 0x95, 0x5b, 0xdd, 0x01, 0x23, 0x60, 0x8e, 0x50, 0xbe, 0xf4, 0x33, 0x05, 0x09, 0xdd, + 0x38, 0xd3, 0xb1, 0xc7, 0x1c, 0x0f, 0x43, 0x8c, 0x49, 0x0d, 0x67, 0xda, 0x63, 0x8e, 0x27, 0xce, + 0x16, 0x38, 0x3c, 0x1d, 0xcf, 0x62, 0xcf, 0x49, 0x19, 0x86, 0x96, 0xaa, 0x70, 0x1c, 0x9e, 0x1e, + 0x23, 0x86, 0x3c, 0x86, 0xb7, 0xdc, 0x60, 0xc6, 0x45, 0x5c, 0xf3, 0xc3, 0xd3, 0x68, 0x1c, 0x85, + 0xc1, 0x25, 0xea, 0xd7, 0xa4, 0xb7, 0x14, 0x61, 0x10, 0x9e, 0x46, 0x87, 0x61, 0x70, 0x69, 0xff, + 0x45, 0x83, 0xda, 0x33, 0x54, 0xc3, 0x13, 0xa8, 0x4f, 0xf1, 0x42, 0xd9, 0xeb, 0xbd, 0x23, 0x34, + 0x8c, 0xb4, 0x4d, 0x79, 0x53, 0xde, 0x0f, 0xd3, 0xe4, 0x92, 0x66, 0x6c, 0x42, 0x22, 0x75, 0x4e, + 0x02, 0x96, 0x72, 0xe5, 0x11, 0x25, 0x89, 0x91, 0x24, 0x28, 0x09, 0xc5, 0xd6, 0xdd, 0x85, 0x66, + 0x79, 0x29, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4a, 0xc5, 0x27, 0x59, 0x87, 0x1a, 0x3e, + 0x52, 0xd4, 0x5c, 0x63, 0x0b, 0xc4, 0x8a, 0x52, 0x84, 0x4a, 0xc2, 0xd7, 0xfa, 0x97, 0x9a, 0x58, + 0xa7, 0xbc, 0x41, 0x79, 0x1d, 0xeb, 0xfa, 0x75, 0xa4, 0x48, 0x69, 0x1d, 0xfb, 0xcf, 0x1a, 0x34, + 0xbf, 0x63, 0x49, 0x74, 0x94, 0x44, 0x71, 0xc4, 0x9d, 0x80, 0xd8, 0x60, 0xc8, 0xdb, 0x5d, 0xb1, + 0xbf, 0xa2, 0x08, 0x1e, 0x79, 0x1f, 0x34, 0xe3, 0xe2, 0xda, 0x8a, 0x42, 0xd6, 0x00, 0xa6, 0xce, + 0x7c, 0x8f, 0x39, 0x9c, 0x0d, 0xbc, 0xcc, 0x7d, 0x0a, 0x0c, 0xe9, 0x82, 0x39, 0x75, 0xe6, 0xa3, + 0x79, 0x38, 0xe2, 0x68, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x3e, 0x58, 0x53, 0x67, 0x2e, 0xfc, 0x78, + 0xe0, 0x29, 0xeb, 0x16, 0x08, 0xf2, 0x01, 0x54, 0xd2, 0x79, 0x88, 0x41, 0x41, 0xe4, 0x01, 0x91, + 0xbb, 0x47, 0xf3, 0x50, 0x79, 0x3c, 0x15, 0xb4, 0x4c, 0x1b, 0x66, 0xa1, 0x8d, 0x36, 0x54, 0x5c, + 0xdf, 0xc3, 0x44, 0x60, 0x51, 0xf1, 0x69, 0xff, 0xa2, 0x02, 0xb7, 0x94, 0x29, 0xce, 0xfc, 0x78, + 0x98, 0x0a, 0xbf, 0xe9, 0x40, 0x1d, 0x9f, 0x2b, 0x4b, 0x94, 0x45, 0x32, 0x90, 0x7c, 0x01, 0x06, + 0xba, 0x70, 0x66, 0xe8, 0xbb, 0x85, 0x5a, 0x72, 0x71, 0x69, 0x78, 0x65, 0x71, 0xc5, 0x4e, 0x3e, + 0x87, 0xda, 0x4b, 0x96, 0x44, 0x32, 0xfc, 0x34, 0xb6, 0xd6, 0xae, 0x92, 0x13, 0x06, 0x50, 0x62, + 0x92, 0xf9, 0xef, 0xa8, 0xbd, 0x7b, 0x22, 0xe0, 0x4c, 0xa3, 0x0b, 0xe6, 0x75, 0xea, 0x78, 0xa2, + 0xb2, 0x81, 0x33, 0x52, 0xa6, 0x2e, 0x33, 0x57, 0x57, 0xb7, 0x07, 0x8d, 0xd2, 0xf5, 0xca, 0xfe, + 0xd6, 0x92, 0x1a, 0xbe, 0xbb, 0xe8, 0x6f, 0x56, 0xfe, 0x12, 0xca, 0x6e, 0xdb, 0x03, 0x28, 0x2e, + 0xfb, 0xb7, 0x3a, 0xbf, 0xfd, 0x5f, 0x1a, 0xdc, 0xda, 0x89, 0xc2, 0x90, 0x61, 0x0d, 0x21, 0x4d, + 0x57, 0xf8, 0xad, 0x76, 0xad, 0xdf, 0x3e, 0x82, 0x1a, 0x17, 0xcc, 0x6a, 0xf5, 0xb7, 0xaf, 0xb0, + 0x05, 0x95, 0x1c, 0x22, 0xc4, 0x4c, 0x9d, 0xf9, 0x38, 0x66, 0xa1, 0xe7, 0x87, 0x13, 0xf4, 0x73, + 0x69, 0x81, 0x23, 0x89, 0xb1, 0xff, 0x57, 0x03, 0x43, 0xba, 0xfc, 0x42, 0xb8, 0xd3, 0x16, 0xc3, + 0xdd, 0xfb, 0x60, 0xc5, 0x09, 0xf3, 0x7c, 0x37, 0xdb, 0xd5, 0xa2, 0x05, 0x42, 0x44, 0xe3, 0xd3, + 0x28, 0x71, 0x19, 0x2e, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, + 0x4d, 0x81, 0x10, 0xd1, 0x4a, 0x88, 0xf0, 0xd8, 0x71, 0x65, 0x91, 0x54, 0xa1, 0x12, 0x10, 0x11, + 0x54, 0x5a, 0x0e, 0x2d, 0x66, 0x52, 0x05, 0xd9, 0xff, 0xa7, 0x43, 0xb3, 0xe7, 0x27, 0xcc, 0x4d, + 0x99, 0xd7, 0xf7, 0x26, 0xc8, 0xc8, 0xc2, 0xd4, 0x4f, 0x2f, 0x55, 0xb4, 0x56, 0x50, 0x9e, 0x4c, + 0xf5, 0xc5, 0x82, 0x51, 0xda, 0xa2, 0x82, 0x35, 0xae, 0x04, 0xc8, 0x16, 0x80, 0x2c, 0x33, 0xb0, + 0xce, 0xad, 0x5e, 0x5f, 0xe7, 0x5a, 0xc8, 0x26, 0x3e, 0x85, 0x82, 0xa4, 0x8c, 0x2f, 0x23, 0xb9, + 0x81, 0x45, 0xf0, 0x4c, 0x38, 0x32, 0x66, 0xe7, 0x13, 0x16, 0xa0, 0xa3, 0x62, 0x76, 0x3e, 0x61, + 0x41, 0x5e, 0x13, 0xd5, 0xe5, 0x71, 0xc4, 0x37, 0xf9, 0x10, 0xf4, 0x28, 0xc6, 0xfb, 0xa9, 0x0d, + 0xcb, 0x17, 0xdb, 0x3c, 0x8c, 0xa9, 0x1e, 0xc5, 0xc2, 0x0b, 0x64, 0x51, 0xd7, 0xb1, 0x94, 0x73, + 0x8b, 0xf0, 0x80, 0xe5, 0x08, 0x55, 0x14, 0xfb, 0x0e, 0xe8, 0x87, 0x31, 0xa9, 0x43, 0x65, 0xd8, + 0x1f, 0xb5, 0x57, 0xc4, 0x47, 0xaf, 0xbf, 0xd7, 0xd6, 0xec, 0x57, 0x1a, 0x58, 0xfb, 0xb3, 0xd4, + 0x11, 0x3e, 0xc5, 0x6f, 0x32, 0xea, 0xbb, 0x60, 0xf2, 0xd4, 0x49, 0x30, 0x2f, 0xea, 0x32, 0x4c, + 0x20, 0x3c, 0xe2, 0xe4, 0x01, 0xd4, 0x98, 0x37, 0x61, 0xd9, 0x6b, 0x6f, 0x2f, 0x9f, 0x93, 0x4a, + 0x32, 0xd9, 0x00, 0x83, 0xbb, 0x67, 0x6c, 0xea, 0x74, 0xaa, 0x05, 0xe3, 0x10, 0x31, 0x32, 0x85, + 0x51, 0x45, 0xc7, 0x1a, 0x3c, 0x89, 0x62, 0x2c, 0x4a, 0x6b, 0xaa, 0x06, 0x4f, 0xa2, 0x58, 0x94, + 0xa4, 0x5b, 0xf0, 0x0f, 0xfe, 0x24, 0x8c, 0x12, 0x36, 0xf6, 0x43, 0x8f, 0xcd, 0xc7, 0x6e, 0x14, + 0x9e, 0x06, 0xbe, 0x9b, 0xa2, 0x2e, 0x4d, 0xfa, 0xb6, 0x24, 0x0e, 0x04, 0x6d, 0x47, 0x91, 0xec, + 0x0f, 0xc1, 0x7a, 0xce, 0x2e, 0xb1, 0x20, 0xe4, 0xe4, 0x0e, 0xe8, 0xe7, 0x17, 0x2a, 0xd7, 0x19, + 0xe2, 0x04, 0xcf, 0x5f, 0x50, 0xfd, 0xfc, 0xc2, 0x9e, 0x83, 0x39, 0x54, 0x89, 0x9e, 0x3c, 0x12, + 0x21, 0x11, 0x43, 0xab, 0x7a, 0x58, 0x58, 0x79, 0x97, 0x6a, 0x0c, 0x9a, 0xd1, 0x85, 0x2d, 0xf1, + 0x20, 0x4a, 0x29, 0x12, 0x28, 0x57, 0x38, 0x95, 0x72, 0x85, 0x83, 0xc5, 0x5a, 0x14, 0x32, 0xe5, + 0xe2, 0xf8, 0x6d, 0xff, 0xb7, 0x0e, 0x66, 0x9e, 0x8a, 0x3e, 0x02, 0x6b, 0x9a, 0xd9, 0x43, 0x3d, + 0x59, 0x2c, 0x67, 0x73, 0x23, 0xd1, 0x82, 0xae, 0xee, 0x52, 0x5d, 0xbe, 0x4b, 0xf1, 0xe6, 0x6b, + 0x6f, 0x7c, 0xf3, 0x0f, 0xe1, 0x96, 0x1b, 0x30, 0x27, 0x1c, 0x17, 0x4f, 0x56, 0x7a, 0xe5, 0x2a, + 0xa2, 0x8f, 0xf2, 0x77, 0xab, 0xe2, 0x56, 0xbd, 0x48, 0x2f, 0xf7, 0xa1, 0xe6, 0xb1, 0x20, 0x75, + 0xca, 0xdd, 0xc9, 0x61, 0xe2, 0xb8, 0x01, 0xeb, 0x09, 0x34, 0x95, 0x54, 0xb2, 0x01, 0x66, 0x56, + 0x41, 0xa9, 0x9e, 0x04, 0x8b, 0xdf, 0x4c, 0xd9, 0x34, 0xa7, 0xda, 0x9f, 0x42, 0xe5, 0xf9, 0x8b, + 0xe1, 0x75, 0x16, 0xca, 0x75, 0xa7, 0x97, 0x74, 0xf7, 0x3d, 0xe8, 0xcf, 0x5f, 0x94, 0x63, 0x6a, + 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0xe6, 0x8c, 0xb3, 0x64, 0x9f, 0xa5, + 0x8e, 0x7a, 0xdc, 0x39, 0x2c, 0x52, 0xa0, 0x68, 0xbb, 0xfc, 0x28, 0x54, 0x69, 0x27, 0x03, 0xed, + 0x3f, 0x54, 0xa0, 0xae, 0x1e, 0xb9, 0x58, 0x73, 0x96, 0x97, 0x7c, 0xe2, 0xb3, 0x88, 0x16, 0x7a, + 0x39, 0x5a, 0x94, 0x7b, 0xe2, 0xca, 0x9b, 0x7b, 0x62, 0xf2, 0x35, 0x34, 0x63, 0x49, 0x2b, 0xc7, + 0x97, 0x77, 0xca, 0x32, 0xea, 0x17, 0xe5, 0x1a, 0x71, 0x01, 0x88, 0x97, 0x82, 0xcd, 0x45, 0xea, + 0x4c, 0xd0, 0xd8, 0x4d, 0x5a, 0x17, 0xf0, 0xc8, 0x99, 0x5c, 0x13, 0x65, 0x7e, 0x42, 0xb0, 0x10, + 0xa5, 0x6d, 0x14, 0x77, 0x9a, 0x18, 0x00, 0x44, 0x80, 0x29, 0xbf, 0xfd, 0xd6, 0xe2, 0xdb, 0x7f, + 0x0f, 0x2c, 0x37, 0x9a, 0x4e, 0x7d, 0xa4, 0xad, 0xca, 0xa4, 0x2c, 0x11, 0x23, 0x6e, 0xbf, 0x84, + 0xba, 0xba, 0x2c, 0x69, 0x40, 0xbd, 0xd7, 0xdf, 0xdd, 0x3e, 0xde, 0x13, 0xd1, 0x07, 0xc0, 0x78, + 0x3a, 0x38, 0xd8, 0xa6, 0xff, 0xde, 0xd6, 0x44, 0x24, 0x1a, 0x1c, 0x8c, 0xda, 0x3a, 0xb1, 0xa0, + 0xb6, 0xbb, 0x77, 0xb8, 0x3d, 0x6a, 0x57, 0x88, 0x09, 0xd5, 0xa7, 0x87, 0x87, 0x7b, 0xed, 0x2a, + 0x69, 0x82, 0xd9, 0xdb, 0x1e, 0xf5, 0x47, 0x83, 0xfd, 0x7e, 0xbb, 0x26, 0x78, 0x9f, 0xf5, 0x0f, + 0xdb, 0x86, 0xf8, 0x38, 0x1e, 0xf4, 0xda, 0x75, 0x41, 0x3f, 0xda, 0x1e, 0x0e, 0xbf, 0x3d, 0xa4, + 0xbd, 0xb6, 0x29, 0xd6, 0x1d, 0x8e, 0xe8, 0xe0, 0xe0, 0x59, 0xdb, 0xb2, 0x3f, 0x85, 0x46, 0x49, + 0x69, 0x42, 0x82, 0xf6, 0x77, 0xdb, 0x2b, 0x62, 0x9b, 0x17, 0xdb, 0x7b, 0xc7, 0xfd, 0xb6, 0x46, + 0x56, 0x01, 0xf0, 0x73, 0xbc, 0xb7, 0x7d, 0xf0, 0xac, 0xad, 0xdb, 0xff, 0x02, 0xe6, 0xb1, 0xef, + 0x3d, 0x0d, 0x22, 0xf7, 0x5c, 0xf8, 0xda, 0x89, 0xc3, 0x99, 0x4a, 0xd3, 0xf8, 0x2d, 0xf2, 0x08, + 0x7a, 0x34, 0x57, 0xe6, 0x56, 0x90, 0x7d, 0x00, 0xf5, 0x63, 0xdf, 0x3b, 0x72, 0xdc, 0x73, 0xd1, + 0x4f, 0x9f, 0x08, 0xf9, 0x31, 0xf7, 0x5f, 0x32, 0x15, 0x42, 0x2d, 0xc4, 0x0c, 0xfd, 0x97, 0x8c, + 0xdc, 0x03, 0x03, 0x81, 0xac, 0xa0, 0xc2, 0x87, 0x90, 0xed, 0x49, 0x15, 0xcd, 0x4e, 0xf3, 0xa3, + 0x63, 0xaf, 0x7c, 0x17, 0xaa, 0xb1, 0xe3, 0x9e, 0xab, 0x48, 0xd4, 0x50, 0x22, 0x62, 0x3b, 0x8a, + 0x04, 0xf2, 0x10, 0x4c, 0xe5, 0x12, 0xd9, 0xba, 0x8d, 0x92, 0xef, 0xd0, 0x9c, 0xb8, 0x68, 0xac, + 0xca, 0x92, 0xb1, 0x3e, 0x07, 0x28, 0x46, 0x0b, 0x57, 0x94, 0xd6, 0xb7, 0xa1, 0xe6, 0x04, 0xbe, + 0xba, 0xbc, 0x45, 0x25, 0x60, 0x1f, 0x40, 0xa3, 0x34, 0x90, 0x10, 0x9e, 0xe2, 0x04, 0xc1, 0xf8, + 0x9c, 0x5d, 0x72, 0x94, 0x35, 0x69, 0xdd, 0x09, 0x82, 0xe7, 0xec, 0x92, 0x93, 0x7b, 0x50, 0x93, + 0xb3, 0x0c, 0x7d, 0xa9, 0x65, 0x46, 0x51, 0x2a, 0x89, 0xf6, 0xc7, 0x60, 0xc8, 0x3e, 0xba, 0xe4, + 0xa8, 0xda, 0xb5, 0x59, 0xed, 0x2b, 0x75, 0x66, 0xec, 0xba, 0xc9, 0x47, 0x6a, 0x66, 0xc2, 0xe5, + 0x84, 0x46, 0x2b, 0x2a, 0x3d, 0xc9, 0xa4, 0xc6, 0x25, 0xc8, 0x6c, 0xf7, 0xc0, 0xbc, 0x71, 0x0a, + 0xa5, 0x14, 0xa0, 0x17, 0x0a, 0xb8, 0x62, 0x2e, 0x65, 0xff, 0x07, 0x40, 0x31, 0x5b, 0x51, 0xef, + 0x46, 0xae, 0x22, 0xde, 0xcd, 0x63, 0x30, 0xdd, 0x33, 0x3f, 0xf0, 0x12, 0x16, 0x2e, 0xdc, 0xba, + 0x98, 0xc6, 0xe4, 0x74, 0xb2, 0x0e, 0x55, 0x1c, 0x19, 0x55, 0x8a, 0x08, 0x99, 0xcf, 0x8b, 0x90, + 0x62, 0x9f, 0x40, 0x4b, 0x26, 0x4b, 0xca, 0xfe, 0x73, 0xc6, 0xf8, 0x8d, 0x25, 0xd8, 0x1a, 0x40, + 0x1e, 0xcf, 0xb3, 0xe1, 0x57, 0x09, 0x23, 0x5c, 0xf9, 0xd4, 0x67, 0x81, 0x97, 0xdd, 0x46, 0x41, + 0xf6, 0x17, 0xd0, 0xcc, 0xf6, 0x50, 0x2d, 0x78, 0x96, 0xb2, 0xa5, 0x36, 0x65, 0xe7, 0x21, 0x59, + 0x0e, 0x22, 0x2f, 0xcf, 0xd8, 0xf6, 0x6f, 0xf5, 0x4c, 0x52, 0x75, 0xa3, 0x0b, 0x45, 0xa0, 0xb6, + 0x5c, 0x04, 0x2e, 0x16, 0x54, 0xfa, 0x4f, 0x2a, 0xa8, 0xbe, 0x04, 0xcb, 0xc3, 0xaa, 0xc2, 0xbf, + 0xc8, 0xe2, 0x6a, 0x77, 0xb9, 0x82, 0x50, 0x75, 0x87, 0x7f, 0xc1, 0x68, 0xc1, 0x2c, 0xce, 0x92, + 0x46, 0xe7, 0x2c, 0xf4, 0x5f, 0x62, 0xbb, 0x2d, 0x2e, 0x5c, 0x20, 0x8a, 0xd9, 0x85, 0xac, 0x34, + 0xd4, 0xec, 0x22, 0x1b, 0xc3, 0x18, 0xc5, 0x18, 0x46, 0x68, 0x6d, 0x16, 0x73, 0x96, 0xa4, 0x59, + 0xc5, 0x29, 0xa1, 0xbc, 0x72, 0xb3, 0x14, 0xaf, 0x13, 0x4e, 0xec, 0xaf, 0xc0, 0xca, 0xcf, 0x22, + 0x02, 0xda, 0xc1, 0xe1, 0x41, 0x5f, 0x86, 0x9f, 0xc1, 0x41, 0xaf, 0xff, 0x6f, 0x6d, 0x4d, 0x84, + 0x44, 0xda, 0x7f, 0xd1, 0xa7, 0xc3, 0x7e, 0x5b, 0x17, 0xa1, 0xab, 0xd7, 0xdf, 0xeb, 0x8f, 0xfa, + 0xed, 0xca, 0x37, 0x55, 0xb3, 0xde, 0x36, 0xa9, 0xc9, 0xe6, 0x71, 0xe0, 0xbb, 0x7e, 0x6a, 0x1f, + 0x83, 0xb9, 0xef, 0xc4, 0xaf, 0x75, 0x0f, 0x45, 0xa6, 0x9b, 0xa9, 0x91, 0x83, 0xca, 0x4a, 0xf7, + 0xa1, 0xae, 0x9e, 0xbc, 0xf2, 0xa6, 0x85, 0x70, 0x90, 0xd1, 0xec, 0xff, 0xd7, 0xe0, 0xf6, 0x7e, + 0x74, 0xc1, 0xf2, 0x14, 0x7f, 0xe4, 0x5c, 0x06, 0x91, 0xe3, 0xbd, 0xc1, 0x74, 0x0f, 0xe0, 0x16, + 0x8f, 0x66, 0x89, 0xcb, 0xc6, 0x4b, 0xe3, 0x8e, 0x96, 0x44, 0x3f, 0x53, 0x2e, 0x68, 0x43, 0xcb, + 0x63, 0x3c, 0x2d, 0xb8, 0x2a, 0xc8, 0xd5, 0x10, 0xc8, 0x8c, 0x27, 0xaf, 0x53, 0xaa, 0x6f, 0xaa, + 0x53, 0xec, 0xdf, 0x68, 0xd0, 0xea, 0xcf, 0xe3, 0x28, 0x49, 0xb3, 0x63, 0xde, 0xe0, 0xfe, 0x4f, + 0xc0, 0x10, 0x52, 0x33, 0xae, 0x5c, 0xab, 0x23, 0x16, 0x5e, 0x90, 0xde, 0x1c, 0x22, 0x9d, 0x2a, + 0xbe, 0xeb, 0x0b, 0xb6, 0x77, 0xa0, 0x3e, 0x0b, 0xfd, 0x79, 0x36, 0x0e, 0xaa, 0x50, 0x43, 0x80, + 0x23, 0x6e, 0x7f, 0x0d, 0x86, 0x5c, 0xa3, 0x64, 0xdd, 0x06, 0xd4, 0x87, 0xc7, 0x3b, 0x3b, 0xfd, + 0xe1, 0xb0, 0xad, 0x91, 0x16, 0x58, 0xbd, 0xe3, 0xa3, 0xbd, 0xc1, 0xce, 0xf6, 0x48, 0x59, 0x78, + 0x77, 0x7b, 0xb0, 0xd7, 0xef, 0xb5, 0x2b, 0xf6, 0x0e, 0x58, 0xa3, 0x79, 0xa8, 0xc4, 0xcb, 0xd9, + 0x55, 0xbb, 0x21, 0xbb, 0xea, 0x4b, 0x01, 0x7b, 0x08, 0x8d, 0x52, 0xb5, 0x45, 0x3e, 0x80, 0x6a, + 0x3a, 0x0f, 0x17, 0x67, 0xb0, 0xd9, 0x1e, 0x14, 0x49, 0xe4, 0x03, 0x68, 0x8a, 0xfe, 0xce, 0xe1, + 0xdc, 0x9f, 0x84, 0xcc, 0x53, 0x2b, 0x8a, 0x9e, 0x6f, 0x5b, 0xa1, 0xec, 0xbb, 0xd0, 0x12, 0x0d, + 0xb5, 0x3f, 0x65, 0x3c, 0x75, 0xa6, 0x31, 0xd6, 0x02, 0x2a, 0x04, 0x57, 0xa9, 0x9e, 0x72, 0xfb, + 0x01, 0x34, 0x8f, 0x18, 0x4b, 0x28, 0xe3, 0x71, 0x14, 0xca, 0xa4, 0xa8, 0x54, 0x2d, 0xe3, 0xbd, + 0x82, 0xec, 0xef, 0xc1, 0x12, 0xf5, 0xf2, 0x53, 0x27, 0x75, 0xcf, 0x7e, 0x4e, 0x3d, 0xfd, 0x00, + 0xea, 0xb1, 0x34, 0x91, 0xaa, 0x7e, 0x9b, 0x18, 0x72, 0x94, 0xd9, 0x68, 0x46, 0xb4, 0x3f, 0x87, + 0xca, 0xc1, 0x6c, 0x5a, 0xfe, 0x47, 0xa2, 0x2a, 0xeb, 0xbc, 0x85, 0x4e, 0x52, 0x5f, 0xec, 0x24, + 0xed, 0xef, 0xa0, 0x91, 0x5d, 0x75, 0xe0, 0xe1, 0xdf, 0x0a, 0xa8, 0xea, 0x81, 0xb7, 0xa0, 0x79, + 0xd9, 0xa2, 0xb1, 0xd0, 0x1b, 0x64, 0x3a, 0x92, 0xc0, 0xe2, 0xda, 0x6a, 0x04, 0x91, 0xaf, 0xbd, + 0x0b, 0xcd, 0xac, 0xa6, 0xc5, 0xa2, 0x52, 0x18, 0x2f, 0xf0, 0x59, 0x58, 0x32, 0xac, 0x29, 0x11, + 0x23, 0x7e, 0xc3, 0xb4, 0xd0, 0xde, 0xcc, 0x1d, 0x8b, 0x40, 0xd5, 0x8d, 0x3c, 0xf9, 0x06, 0x6b, + 0x14, 0xbf, 0xc5, 0x85, 0xa7, 0x7c, 0x92, 0xe5, 0xa5, 0x29, 0x9f, 0xd8, 0x29, 0xb4, 0x9e, 0x3a, + 0xee, 0xf9, 0x2c, 0xce, 0xf2, 0x42, 0xc9, 0x97, 0xb5, 0x05, 0x5f, 0xbe, 0x61, 0x44, 0x59, 0x72, + 0x73, 0x39, 0xa5, 0x54, 0x6e, 0x2e, 0xec, 0x9b, 0x3a, 0xc9, 0x44, 0xcd, 0x70, 0x2d, 0xaa, 0xa0, + 0xad, 0x5f, 0x6a, 0x50, 0x15, 0x06, 0x24, 0xf7, 0xa0, 0xda, 0x77, 0xcf, 0x22, 0xb2, 0x60, 0xa7, + 0xee, 0x02, 0x64, 0xaf, 0x90, 0x8f, 0xe5, 0x88, 0x36, 0x9b, 0x3c, 0xb7, 0x32, 0xfb, 0xa3, 0x7f, + 0xbc, 0xc6, 0xbd, 0x09, 0x8d, 0x6f, 0x22, 0x3f, 0xdc, 0x91, 0x53, 0x4b, 0xb2, 0xec, 0x2d, 0xaf, + 0xf1, 0x7f, 0x02, 0xc6, 0x80, 0x0b, 0xb7, 0x7c, 0x9d, 0x15, 0x9b, 0xcc, 0xb2, 0xc7, 0xda, 0x2b, + 0x5b, 0x7f, 0xd2, 0xa1, 0xfa, 0x1d, 0x4b, 0x22, 0xf2, 0x31, 0xd4, 0xd5, 0x48, 0x85, 0x94, 0x46, + 0x27, 0x5d, 0x8c, 0x43, 0x4b, 0xb3, 0x16, 0x3c, 0x95, 0xa1, 0x92, 0x5b, 0x31, 0xe7, 0xe9, 0x5e, + 0x15, 0xb3, 0xec, 0x95, 0x0d, 0xed, 0x89, 0x46, 0x3e, 0x02, 0x43, 0x3e, 0xd0, 0x25, 0xdd, 0x2c, + 0x37, 0x4a, 0xf6, 0xca, 0x13, 0x8d, 0x3c, 0x84, 0xc6, 0xf0, 0x2c, 0x9a, 0x05, 0xde, 0x90, 0x25, + 0x17, 0x8c, 0x94, 0xa6, 0x8b, 0xdd, 0xd2, 0xb7, 0xbd, 0x42, 0x36, 0x00, 0xa4, 0x0b, 0x1f, 0xfb, + 0x1e, 0x27, 0x75, 0x41, 0x3b, 0x98, 0x4d, 0xe5, 0xa2, 0x25, 0xdf, 0x96, 0x9c, 0xa5, 0x87, 0x7c, + 0x13, 0xe7, 0x67, 0xd0, 0xda, 0xc1, 0xb0, 0x72, 0x98, 0x6c, 0x9f, 0x44, 0x49, 0x4a, 0x96, 0x27, + 0x8c, 0xdd, 0x65, 0x84, 0xbd, 0x42, 0x9e, 0x80, 0x39, 0x4a, 0x2e, 0x25, 0xff, 0x5b, 0x2a, 0xdc, + 0x14, 0xfb, 0x5d, 0x71, 0xcb, 0xad, 0x1f, 0x2b, 0x60, 0x7c, 0x1b, 0x25, 0xe7, 0x2c, 0x21, 0x8f, + 0xc1, 0xc0, 0x8e, 0x56, 0xb9, 0x42, 0xde, 0xdd, 0x5e, 0xb5, 0xd1, 0x3d, 0xb0, 0x50, 0x29, 0x23, + 0x87, 0x9f, 0x4b, 0xd5, 0xe3, 0x1f, 0x7e, 0x52, 0x2f, 0xb2, 0x50, 0x41, 0x1f, 0x58, 0x1d, 0xa6, + 0x09, 0x73, 0xa6, 0x79, 0x17, 0xbf, 0xd0, 0x66, 0x76, 0xeb, 0xb2, 0x93, 0x1c, 0x2a, 0xe3, 0x3c, + 0x82, 0xea, 0x50, 0xde, 0x54, 0x30, 0x15, 0x7f, 0x8a, 0x74, 0x57, 0x33, 0x44, 0xbe, 0xf2, 0x3f, + 0x81, 0x21, 0x6b, 0x0c, 0x79, 0xcd, 0x85, 0x22, 0xac, 0xdb, 0x2e, 0xa3, 0x94, 0x80, 0x0d, 0xf5, + 0xa3, 0x59, 0x32, 0x61, 0x23, 0xbe, 0x64, 0xf9, 0xcc, 0x06, 0xf6, 0x0a, 0x79, 0x04, 0x86, 0x7c, + 0xb5, 0x72, 0xd1, 0x85, 0x17, 0x2c, 0x6f, 0x26, 0x83, 0x00, 0x2a, 0xda, 0x90, 0xb9, 0x4b, 0xb2, + 0x2e, 0xe4, 0xb1, 0xee, 0xeb, 0x28, 0xd4, 0x45, 0x9b, 0x32, 0x97, 0xf9, 0xa5, 0xe4, 0x4e, 0xb2, + 0xfb, 0x2f, 0x3f, 0x9e, 0x0d, 0x8d, 0x7c, 0x05, 0xad, 0x85, 0x42, 0x80, 0x60, 0xbe, 0xbc, 0xaa, + 0x36, 0x58, 0x16, 0x7e, 0xda, 0xfe, 0xf5, 0xab, 0x35, 0xed, 0xc7, 0x57, 0x6b, 0xda, 0xef, 0x5e, + 0xad, 0x69, 0x3f, 0xfc, 0x7e, 0x6d, 0xe5, 0xc4, 0xc0, 0xff, 0x94, 0x3f, 0xfb, 0x6b, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x8a, 0x43, 0x8b, 0x5f, 0x6e, 0x1e, 0x00, 0x00, } diff --git a/stream/doc.go b/stream/doc.go new file mode 100644 index 00000000000..e79d51a5904 --- /dev/null +++ b/stream/doc.go @@ -0,0 +1,19 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Package stream +// TODO: Write a in-depth explanation of what this does, with examples. +package stream diff --git a/worker/stream_lists.go b/stream/stream.go similarity index 81% rename from worker/stream_lists.go rename to stream/stream.go index a164173202e..f51e9b0f7b3 100644 --- a/worker/stream_lists.go +++ b/stream/stream.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package worker +package stream import ( "bytes" @@ -24,21 +24,24 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" "golang.org/x/net/context" ) +const pageSize = 4 << 20 // 4MB + type kvStream interface { Send(*pb.KVS) error } -type streamLists struct { - stream kvStream - predicate string - db *badger.DB - chooseKey func(item *badger.Item) bool - itemToKv func(key []byte, itr *badger.Iterator) (*pb.KV, error) +type Lists struct { + Stream kvStream + Predicate string + DB *badger.DB + ChooseKeyFunc func(item *badger.Item) bool + ItemToKVFunc func(key []byte, itr *badger.Iterator) (*pb.KV, error) } // keyRange is [start, end), including start, excluding end. Do ensure that the start, @@ -48,7 +51,7 @@ type keyRange struct { end []byte } -func (sl *streamLists) orchestrate(ctx context.Context, prefix string, ts uint64) error { +func (sl *Lists) Orchestrate(ctx context.Context, prefix string, ts uint64) error { keyCh := make(chan keyRange, 100) // Contains keys for posting lists. kvChan := make(chan *pb.KVS, 100) // Contains marshaled posting lists. errCh := make(chan error, 1) // Stores error by consumeKeys. @@ -92,12 +95,12 @@ func (sl *streamLists) orchestrate(ctx context.Context, prefix string, ts uint64 return nil } -func (sl *streamLists) produceRanges(ctx context.Context, ts uint64, keyCh chan keyRange) { +func (sl *Lists) produceRanges(ctx context.Context, ts uint64, keyCh chan keyRange) { var prefix []byte - if len(sl.predicate) > 0 { - prefix = x.PredicatePrefix(sl.predicate) + if len(sl.Predicate) > 0 { + prefix = x.PredicatePrefix(sl.Predicate) } - txn := sl.db.NewTransactionAt(ts, false) + txn := sl.DB.NewTransactionAt(ts, false) defer txn.Discard() iterOpts := badger.DefaultIteratorOptions iterOpts.PrefetchValues = false @@ -113,7 +116,7 @@ func (sl *streamLists) produceRanges(ctx context.Context, ts uint64, keyCh chan } size += item.EstimatedSize() - if size > 4*MB { + if size > pageSize { kr := keyRange{start: start, end: item.KeyCopy(nil)} keyCh <- kr start = item.KeyCopy(nil) @@ -126,14 +129,14 @@ func (sl *streamLists) produceRanges(ctx context.Context, ts uint64, keyCh chan close(keyCh) } -func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, +func (sl *Lists) produceKVs(ctx context.Context, ts uint64, keyCh chan keyRange, kvChan chan *pb.KVS) error { var prefix []byte - if len(sl.predicate) > 0 { - prefix = x.PredicatePrefix(sl.predicate) + if len(sl.Predicate) > 0 { + prefix = x.PredicatePrefix(sl.Predicate) } - txn := sl.db.NewTransactionAt(ts, false) + txn := sl.DB.NewTransactionAt(ts, false) defer txn.Discard() iterate := func(kr keyRange) error { iterOpts := badger.DefaultIteratorOptions @@ -157,12 +160,12 @@ func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, break } // Check if we should pick this key. - if sl.chooseKey != nil && !sl.chooseKey(item) { + if sl.ChooseKeyFunc != nil && !sl.ChooseKeyFunc(item) { continue } // Now convert to key value. - kv, err := sl.itemToKv(item.KeyCopy(nil), it) + kv, err := sl.ItemToKVFunc(item.KeyCopy(nil), it) if err != nil { return err } @@ -192,8 +195,7 @@ func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, } } -func (sl *streamLists) streamKVs(ctx context.Context, prefix string, - kvChan chan *pb.KVS) error { +func (sl *Lists) streamKVs(ctx context.Context, prefix string, kvChan chan *pb.KVS) error { var count int var bytesSent uint64 t := time.NewTicker(time.Second) @@ -218,10 +220,10 @@ func (sl *streamLists) streamKVs(ctx context.Context, prefix string, bytesSent += sz count += len(batch.Kv) t := time.Now() - if err := sl.stream.Send(batch); err != nil { + if err := sl.Stream.Send(batch); err != nil { return err } - glog.V(2).Infof("%s Created batch of size: %s in %v.\n", + glog.V(2).Infof("%s Created batch of size: %s in %s.\n", prefix, humanize.Bytes(sz), time.Since(t)) return nil } @@ -240,7 +242,7 @@ outer: continue } speed := bytesSent / durSec - glog.Infof("%s Time elapsed: %v, bytes sent: %s, speed: %v/sec\n", + glog.Infof("%s Time elapsed: %s, bytes sent: %s, speed: %s/sec\n", prefix, x.FixedDuration(dur), humanize.Bytes(bytesSent), humanize.Bytes(speed)) case kvs, ok := <-kvChan: diff --git a/worker/stream_lists_test.go b/stream/stream_test.go similarity index 89% rename from worker/stream_lists_test.go rename to stream/stream_test.go index 77c56d134fb..38b8eea59f1 100644 --- a/worker/stream_lists_test.go +++ b/stream/stream_test.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package worker +package stream import ( "context" @@ -71,8 +71,8 @@ func TestOrchestrate(t *testing.T) { } c := &collector{kv: make([]*pb.KV, 0, 100)} - sl := streamLists{stream: c, db: db} - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl := Lists{Stream: c, DB: db} + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() val, err := item.ValueCopy(nil) require.NoError(t, err) @@ -82,7 +82,7 @@ func TestOrchestrate(t *testing.T) { } // Test case 1. Retrieve everything. - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 300, len(c.kv), "Expected 300. Got: %d", len(c.kv)) @@ -99,9 +99,9 @@ func TestOrchestrate(t *testing.T) { } // Test case 2. Retrieve only 1 predicate. - sl.predicate = "p1" + sl.Predicate = "p1" c.kv = c.kv[:0] - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 100, len(c.kv), "Expected 100. Got: %d", len(c.kv)) @@ -119,11 +119,11 @@ func TestOrchestrate(t *testing.T) { // Test case 3. Retrieve select keys within the predicate. c.kv = c.kv[:0] - sl.chooseKey = func(item *badger.Item) bool { + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) return pk.Uid%2 == 0 } - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 50, len(c.kv), "Expected 50. Got: %d", len(c.kv)) @@ -141,8 +141,8 @@ func TestOrchestrate(t *testing.T) { // Test case 4. Retrieve select keys from all predicates. c.kv = c.kv[:0] - sl.predicate = "" - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + sl.Predicate = "" + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 150, len(c.kv), "Expected 150. Got: %d", len(c.kv)) diff --git a/worker/backup.go b/worker/backup.go new file mode 100644 index 00000000000..e6345710338 --- /dev/null +++ b/worker/backup.go @@ -0,0 +1,141 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package worker + +import ( + "time" + + "github.com/dgraph-io/dgraph/ee/backup" + "github.com/dgraph-io/dgraph/posting" + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" + + "github.com/golang/glog" + "golang.org/x/net/context" +) + +func backupProcess(ctx context.Context, req *pb.BackupRequest) error { + glog.Infof("Backup request: group %d at %d", req.GroupId, req.ReadTs) + if err := ctx.Err(); err != nil { + glog.Errorf("Context error during backup: %v\n", err) + return err + } + // sanity, make sure this is our group. + if groups().groupId() != req.GroupId { + return x.Errorf("Backup request group mismatch. Mine: %d. Requested: %d\n", + groups().groupId(), req.GroupId) + } + // wait for this node to catch-up. + if err := posting.Oracle().WaitForTs(ctx, req.ReadTs); err != nil { + return err + } + // create backup request and process it. + br := &backup.Request{DB: pstore, Backup: req} + // calculate estimated upload size + for _, t := range groups().tablets { + if t.GroupId == req.GroupId { + br.Sizex += uint64(float64(t.Space) * 1.2) + } + } + return br.Process(ctx) +} + +// Backup handles a request coming from another node. +func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.Status, error) { + var resp pb.Status + glog.V(2).Infof("Received backup request via Grpc: %+v", req) + if err := backupProcess(ctx, req); err != nil { + resp.Code = -1 + resp.Msg = err.Error() + return &resp, err + } + return &resp, nil +} + +func backupGroup(ctx context.Context, in pb.BackupRequest) error { + glog.V(2).Infof("Sending backup request: %+v\n", in) + // this node is part of the group, process backup. + if groups().groupId() == in.GroupId { + return backupProcess(ctx, &in) + } + + // send request to any node in the group. + pl := groups().AnyServer(in.GroupId) + if pl == nil { + return x.Errorf("Couldn't find a server in group %d", in.GroupId) + } + status, err := pb.NewWorkerClient(pl.Get()).Backup(ctx, &in) + if err != nil { + glog.Errorf("Backup error group %d: %s", in.GroupId, err) + return err + } + if status.Code != 0 { + err := x.Errorf("Backup error group %d: %s", in.GroupId, status.Msg) + glog.Errorln(err) + return err + } + glog.V(2).Infof("Backup request to gid=%d. OK\n", in.GroupId) + return nil +} + +// BackupOverNetwork handles a request coming from an HTTP client. +func BackupOverNetwork(pctx context.Context, target string) error { + ctx, cancel := context.WithCancel(pctx) + defer cancel() + + // Check that this node can accept requests. + if err := x.HealthCheck(); err != nil { + glog.Errorf("Backup canceled, not ready to accept requests: %s", err) + return err + } + + // Get ReadTs from zero and wait for stream to catch up. + ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) + if err != nil { + glog.Errorf("Unable to retrieve readonly timestamp for backup: %s", err) + return err + } + + gids := groups().KnownGroups() + req := pb.BackupRequest{ + ReadTs: ts.ReadOnly, + Target: target, + UnixTs: time.Now().UTC().Format("20060102.1504"), + } + glog.Infof("Created backup request: %+v. Groups=%v\n", req, gids) + + // This will dispatch the request to all groups and wait for their response. + // If we receive any failures, we cancel the process. + errCh := make(chan error, 1) + for _, gid := range gids { + req.GroupId = gid + go func() { + errCh <- backupGroup(ctx, req) + }() + } + + for i := 0; i < len(gids); i++ { + err := <-errCh + if err != nil { + glog.Errorf("Error received during backup: %v", err) + return err + } + } + req.GroupId = 0 + glog.Infof("Backup for req: %+v. OK.\n", req) + return nil +} diff --git a/worker/draft.go b/worker/draft.go index 79c6445502c..8a3b45aaad3 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -38,6 +38,7 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/raftwal" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/types" "github.com/dgraph-io/dgraph/x" @@ -791,8 +792,8 @@ func (n *node) rollupLists(readTs uint64) error { mu.Unlock() } - sl := streamLists{stream: writer, db: pstore} - sl.chooseKey = func(item *badger.Item) bool { + sl := stream.Lists{Stream: writer, DB: pstore} + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) if pk.IsSchema() { // Skip if schema. @@ -801,7 +802,7 @@ func (n *node) rollupLists(readTs uint64) error { // Return true if we don't find the BitCompletePosting bit. return item.UserMeta()&posting.BitCompletePosting == 0 } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { l, err := posting.ReadPostingList(key, itr) if err != nil { return nil, err @@ -809,7 +810,7 @@ func (n *node) rollupLists(readTs uint64) error { addKey(key) return l.MarshalToKv() } - if err := sl.orchestrate(context.Background(), "Rolling up", readTs); err != nil { + if err := sl.Orchestrate(context.Background(), "Rolling up", readTs); err != nil { return err } if err := writer.Flush(); err != nil { diff --git a/worker/export.go b/worker/export.go index 877909b2698..e61b0982e25 100644 --- a/worker/export.go +++ b/worker/export.go @@ -34,6 +34,7 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/types" "github.com/dgraph-io/dgraph/types/facets" "github.com/dgraph-io/dgraph/x" @@ -269,8 +270,8 @@ func export(ctx context.Context, in *pb.ExportPayload) error { } mux := writerMux{data: dataWriter, schema: schemaWriter} - sl := streamLists{stream: &mux, db: pstore} - sl.chooseKey = func(item *badger.Item) bool { + sl := stream.Lists{Stream: &mux, DB: pstore} + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) if pk.Attr == "_predicate_" { return false @@ -282,7 +283,7 @@ func export(ctx context.Context, in *pb.ExportPayload) error { // written to a different file. return pk.IsData() || pk.IsSchema() } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() pk := x.Parse(item.Key()) @@ -315,7 +316,7 @@ func export(ctx context.Context, in *pb.ExportPayload) error { } // All prepwork done. Time to roll. - if err := sl.orchestrate(ctx, "Export", in.ReadTs); err != nil { + if err := sl.Orchestrate(ctx, "Export", in.ReadTs); err != nil { return err } if err := mux.data.Close(); err != nil { diff --git a/worker/groups.go b/worker/groups.go index 779a9110807..fcc4cc5b845 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -301,7 +301,6 @@ func (g *groupi) applyState(state *pb.MembershipState) { conn.Get().Connect(member.Addr) } } - } func (g *groupi) ServesGroup(gid uint32) bool { diff --git a/worker/predicate.go b/worker/predicate.go index fdb8d9224f6..6aea9261070 100644 --- a/worker/predicate.go +++ b/worker/predicate.go @@ -26,6 +26,7 @@ import ( "github.com/dgraph-io/dgraph/conn" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + ws "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/x" ) @@ -105,12 +106,12 @@ func doStreamSnapshot(snap *pb.Snapshot, stream pb.Worker_StreamSnapshotServer) // at timestamp=1. var numKeys uint64 - sl := streamLists{stream: stream, db: pstore} - sl.chooseKey = func(_ *badger.Item) bool { + sl := ws.Lists{Stream: stream, DB: pstore} + sl.ChooseKeyFunc = func(_ *badger.Item) bool { // Pick all keys. return true } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { atomic.AddUint64(&numKeys, 1) item := itr.Item() pk := x.Parse(key) @@ -138,7 +139,7 @@ func doStreamSnapshot(snap *pb.Snapshot, stream pb.Worker_StreamSnapshotServer) return l.MarshalToKv() } - if err := sl.orchestrate(stream.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { + if err := sl.Orchestrate(stream.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { return err } // Indicate that sending is done. diff --git a/worker/predicate_move.go b/worker/predicate_move.go index a451c016f0d..58c50f7f6da 100644 --- a/worker/predicate_move.go +++ b/worker/predicate_move.go @@ -32,6 +32,7 @@ import ( "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/x" ) @@ -89,15 +90,15 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro return x.Errorf("Unable to find a connection for group: %d\n", gid) } c := pb.NewWorkerClient(pl.Get()) - stream, err := c.ReceivePredicate(ctx) + s, err := c.ReceivePredicate(ctx) if err != nil { return fmt.Errorf("While calling ReceivePredicate: %+v", err) } // sends all data except schema, schema key has different prefix // Read the predicate keys and stream to keysCh. - sl := streamLists{stream: stream, predicate: predicate, db: pstore} - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl := stream.Lists{Stream: s, Predicate: predicate, DB: pstore} + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { l, err := posting.ReadPostingList(key, itr) if err != nil { return nil, err @@ -106,7 +107,7 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro } prefix := fmt.Sprintf("Sending predicate: [%s]", predicate) - if err := sl.orchestrate(ctx, prefix, math.MaxUint64); err != nil { + if err := sl.Orchestrate(ctx, prefix, math.MaxUint64); err != nil { return err } @@ -132,12 +133,12 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro kv.Version = 1 kv.UserMeta = []byte{item.UserMeta()} kvs.Kv = append(kvs.Kv, kv) - if err := stream.Send(kvs); err != nil { + if err := s.Send(kvs); err != nil { return err } } - payload, err := stream.CloseAndRecv() + payload, err := s.CloseAndRecv() if err != nil { return err } diff --git a/worker/worker.go b/worker/worker.go index ba1c8c39906..dfbfaf441c8 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -30,8 +30,8 @@ import ( "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" - "github.com/golang/glog" + "github.com/golang/glog" "google.golang.org/grpc" )