diff --git a/compose/compose.go b/compose/compose.go index 39ba865240f..1e566a02098 100644 --- a/compose/compose.go +++ b/compose/compose.go @@ -67,7 +67,6 @@ type options struct { NumAlphas int NumReplicas int LruSizeMB int - Enterprise bool AclSecret string DataDir string DataVol bool @@ -215,17 +214,14 @@ func getAlpha(idx int) service { if opts.WhiteList { svc.Command += " --whitelist=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" } - if opts.Enterprise { - svc.Command += " --enterprise_features" - if opts.AclSecret != "" { - svc.Command += " --acl_secret_file=/secret/hmac --acl_access_ttl 3s --acl_cache_ttl 5s" - svc.Volumes = append(svc.Volumes, volume{ - Type: "bind", - Source: opts.AclSecret, - Target: "/secret/hmac", - ReadOnly: true, - }) - } + if opts.AclSecret != "" { + svc.Command += " --acl_secret_file=/secret/hmac --acl_access_ttl 3s --acl_cache_ttl 5s" + svc.Volumes = append(svc.Volumes, volume{ + Type: "bind", + Source: opts.AclSecret, + Target: "/secret/hmac", + ReadOnly: true, + }) } return svc @@ -357,8 +353,6 @@ func main() { "mount a docker volume as /data in containers") cmd.PersistentFlags().StringVarP(&opts.DataDir, "data_dir", "d", "", "mount a host directory as /data in containers") - cmd.PersistentFlags().BoolVarP(&opts.Enterprise, "enterprise", "e", false, - "enable enterprise features in alphas") cmd.PersistentFlags().StringVar(&opts.AclSecret, "acl_secret", "", "enable ACL feature with specified HMAC secret file") cmd.PersistentFlags().BoolVarP(&opts.UserOwnership, "user", "u", false, @@ -408,10 +402,6 @@ func main() { if opts.LruSizeMB < 1024 { fatal(errors.Errorf("LRU cache size must be >= 1024 MB")) } - if opts.AclSecret != "" && !opts.Enterprise { - warning("adding --enterprise because it is required by ACL feature") - opts.Enterprise = true - } if opts.DataVol && opts.DataDir != "" { fatal(errors.Errorf("only one of --data_vol and --data_dir may be used at a time")) } diff --git a/dgraph/cmd/alpha/admin_backup.go b/dgraph/cmd/alpha/admin_backup.go index 7927f54c773..9cc8037b53e 100644 --- a/dgraph/cmd/alpha/admin_backup.go +++ b/dgraph/cmd/alpha/admin_backup.go @@ -42,10 +42,9 @@ func backupHandler(w http.ResponseWriter, r *http.Request) { if !handlerInit(w, r, http.MethodPost) { return } - if !Alpha.Conf.GetBool("enterprise_features") { - x.SetStatus(w, - "You must enable Dgraph enterprise features first. "+ - "Restart Dgraph Alpha with --enterprise_features", + if !worker.EnterpriseEnabled() { + x.SetStatus(w, "You must enable enterprise features first. "+ + "Supply the appropriate license file to Dgraph Zero using the HTTP endpoint.", "Backup failed.") return } diff --git a/dgraph/cmd/alpha/run.go b/dgraph/cmd/alpha/run.go index 7fc4a73cb6a..4aa2740c375 100644 --- a/dgraph/cmd/alpha/run.go +++ b/dgraph/cmd/alpha/run.go @@ -93,8 +93,6 @@ they form a Raft group and provide synchronous replication. // with the flag name so that the values are picked up by Cobra/Viper's various config inputs // (e.g, config file, env vars, cli flags, etc.) flag := Alpha.Cmd.Flags() - flag.Bool("enterprise_features", false, "Enable Dgraph enterprise features. "+ - "If you set this to true, you agree to the Dgraph Community License.") flag.StringP("postings", "p", "p", "Directory to store posting lists.") // Options around how to set up Badger. @@ -435,11 +433,6 @@ func run() { secretFile := Alpha.Conf.GetString("acl_secret_file") if secretFile != "" { - if !Alpha.Conf.GetBool("enterprise_features") { - glog.Fatalf("You must enable Dgraph enterprise features with the " + - "--enterprise_features option in order to use ACL.") - } - hmacSecret, err := ioutil.ReadFile(secretFile) if err != nil { glog.Fatalf("Unable to read HMAC secret from file: %v", secretFile) diff --git a/dgraph/cmd/zero/http.go b/dgraph/cmd/zero/http.go index 0c803181ddc..5b65966c1b3 100644 --- a/dgraph/cmd/zero/http.go +++ b/dgraph/cmd/zero/http.go @@ -17,8 +17,10 @@ package zero import ( + "bytes" "context" "fmt" + "io/ioutil" "net" "net/http" "strconv" @@ -232,6 +234,38 @@ func (st *state) getState(w http.ResponseWriter, r *http.Request) { } } +// applyEnterpriseLicense accepts a PGP message as a POST request body, verifies that it was +// signed using our private key and applies the license which has maxNodes and Expiry to the +// cluster. +func (st *state) applyEnterpriseLicense(w http.ResponseWriter, r *http.Request) { + x.AddCorsHeaders(w) + if r.Method == "OPTIONS" { + return + } + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidMethod, "Invalid method") + return + } + + w.Header().Set("Content-Type", "application/json") + b, err := ioutil.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidRequest, err.Error()) + return + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + if err := st.zero.applyEnterpriseLicense(ctx, bytes.NewReader(b)); err != nil { + w.WriteHeader(http.StatusBadRequest) + x.SetStatus(w, x.ErrorInvalidRequest, err.Error()) + return + } + x.SetStatus(w, x.Success, "Done") +} + func (st *state) serveHTTP(l net.Listener) { srv := &http.Server{ ReadTimeout: 10 * time.Second, diff --git a/dgraph/cmd/zero/pgp.go b/dgraph/cmd/zero/pgp.go new file mode 100644 index 00000000000..ba1f0a2bbab --- /dev/null +++ b/dgraph/cmd/zero/pgp.go @@ -0,0 +1,126 @@ +/* + * Copyright 2017-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 zero + +import ( + "encoding/json" + "io" + "io/ioutil" + + "github.com/pkg/errors" + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/armor" +) + +const publicKey = `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF1bQAwBEACe+uIPgsfTmgLVDlJhdfzUH+ff774fn/Lqf0kLactHR8I6yI3h +JO6i47IhM45VJLY0ZzXntCaItavm35NGdVuA3yPJv7YkSLTPkg5D2VHyZknb52lD +JQbtyuBQK+OZiRfekbZtAfKOljFyPxr1d9Vdw0H4jYRjNK1k3iGERUf8254Y0Wqx +wz+iMLXxlDcWnq0VBSjs+bQqr61iViIIC1S1vHKsl2Sk0QBMjYrTqyttJbGQOy00 +tCMy7ZFMIIEJz8Fg0XiY4d2cmIJlvRoxVpaTWE+W9wxssR4ZqOhLGUAnermScKDc +2aTERdDhG30oW/c8KLXpCKzcUc8IEETeMcBhWRzxgi1CcQEk9KhwfBQdezvY2PyE +EjhOoFZ8ryWCrOnlNgzSnFPtohbx8VD+HctJZ5foaq5ceH+YvH5zasBG/plQXO5A +hwAc8BhGdP4jvFUIBOUyjGHlj7UcqKSDDm2uIV9XjoRfCKPav62VQKRSJXvlBdZe +2uGxgZJ6TmgI2bHa0uQn5kDdQ7CYT9NYu+qXNVNxRZ8w5eTIeDxRIeAas8G5i7eO +dzEV47wN6CkK/8vVu9vXbfiGkH6Cz32zBr1py2kW+n/D8XR5ZlbsV7P2ne3VXOv9 +WTXSUFpkV1OrGY33j6Lg6OmcVhHTtCDDwCaB4iCHXDTVq9Yh2Er+ADIVtwARAQAB +tDtEZ3JhcGggTGFicyAoRGdyYXBoIExhYnMgTGljZW5zaW5nIEtleSkgPGNvbnRh +Y3RAZGdyYXBoLmlvPokCTgQTAQoAOBYhBA95WEve8LWjE9TFvnomeeH3SyppBQJd +W0AMAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEHomeeH3SyppWkEP/2ob +D9fMOSzHzs9B/sUVOBWZrA8YWb3NiB1o4oINxeAcuJ27VlejnMqA1ePYKzUoqRu+ +DkapdgQzLq9pBLhZoIQ8Q6rIww5cIfh4LaY5VSjH9fDTO3Kck85KjAWI6Q7sfcic +A4k3s6ay2zCfU2c3TX9uiLv0VehzJEDto/bKixvrUEfQdlEKFrgWQjipb1Et3wHW +kUAoDvpCLYVcQdmtNtWv1banGPUeYXhxou30w+vgbi3H+2bG61I8f0kWPz6YOavM +v3XM37Fdh6dg5zUH+Rq4vFBomqmGmdauuQ9HWCstJ8cQZF098s20VpU54bG38fvO +fzCXk5cMaG4U27CprvDskQbqlfB3ZCrbTzkvjWF4yvB2Ih6YzjT7lbZMD8CKMcBC +SN3AtJH8XfF8j2GSNMmlP9oU8lW0PANfqRGCBMM78mmAmBVDTvxvoxMyCKSr/buu +Ydyx56u1dvSdP8Wkkl4dpiIrdb0YzwvdVLxhPfNc2WaFJ6Awq95Y991iMwtU41Xu +uwDZ+GAV8f20NEtaw+qvxAN0eXbjFzvXYAqpevDfzzMTu48dEhfeu2Ykj0GixWQk +bGLJhKKRwcc/HJwDGeoSl8lN9RwdVRGg5v5LzUQswUx6Nk5CC+hU4UNZT6MS+asA +aAbA+Y9Is79grWnNQEuXunJOtwX8bojnWIPJec6/uQINBF1bQAwBEACdgeaYbJS7 +GLyelAvX7/Axj209biX5hT2s97Gv+TwNz0DpJh9ptOd5ThAoZJe7ggeMvEUEfV9+ +/W6STBrpuJzFRhUypCIB1lfYl3E3HyqvVOol7Xxm781QEEq1q9t/OaNQ+uT4IzCG +jR8Kae45pXPPfSba3Ma4NIWBTQyQgqy2FZSvTklA4Dvod7BkHoGsZIap6Pk/1Buc +VyeQ0aR8BIx9ROmPosuYWEwpNkahi+K5iM200Nw+PMaISI2SZN0vAgZHuoTd8pyu +xNidBGEQ4/9nJHPVPxr70j4MjN2U80rKEYO1cyTaR22t0QuIWDSJjuaLY++VHIA6 +cf63HFNgfUaOJhUQenJeZ46yk/C8gO96+0z5gtnIE1gl4h2k4M9MfzvJAotDa6Nx +5/4ehpwLWc+NGtC00DbTxfOhEMn2VbQfxELXUgZbLmq+k0zsE0xcxoA3YnO1KVpN +8TQ7pD5UTqNRCHzNmuvI6BYpf7tAfPuwDnCwYNZ0MYXJK8zg6UUORU61iF5Y6ap7 +3i0XzdXe9lxLJjBVgard5Onns+opBggP5rm7s5hXpF1RWYHpZWsLsZUSzwmAkv05 +dRKWfacVyH8/zeMfKQzF9jL+ibVytvkUHOjAvYRnFtUaFjvKpzEWMNyIIq2wlAA1 +oO+No8rldhjWKXG0ognvf43kBWlMSKcPgQARAQABiQI2BBgBCgAgFiEED3lYS97w +taMT1MW+eiZ54fdLKmkFAl1bQAwCGwwACgkQeiZ54fdLKmmTjhAAmODrhyGRYGs2 +GCEY76iQFCjfgYsssG6RwJvDuFZ7o4UbU6FPZ+ebuPtqCA4tys6tGd4tZVem9nnd +WoiaqMNetYXHNEXtZqw07b4fiAp8aVt1N5sVaRLTvZCOyH/EwlG/wNLA7wNko3I2 +n+js3ogE4dz1Ru9iR2OUKMtUUwytxbZSCPFq+/3IJI9O0EE1yYjLP8wLBGblL6Rf +Qa0VSFKegZD0WUy93JDR9Qnt3DJKh6YvjTJnwLe6Rl2rgMGryzZQa6EBo5D/MoS4 +pEyBEUMc2vB3RLLQsX39Ld3p/Pq2T69Mfytqw+crKImse1UavVQDskCTQDhBH/Jw +5+LfMUQEB5xhF7xHS0tpOlt/k/AjNCddnLZ00A34PhjY+sDftpWaC9uK0sikeN43 +R+lNMJ39xejsFUWSJM3HmnELs4JAg/DwZ0kiS6/ffKFoXi771PuOcJpNxcYG5y3I +k09Ao2v2RwWQayli/ysAENStfiWS/fVl5tlDaYGDqF0G9haMA1XPnptrgg4S3ADx +E4Hf9ymxdCLfuVsJ0dPkqv/nWsEMIVQmFVZvWs8iz8JR7Wh6/L1KJ+HpxekqoZgq +836PkLFlKGgKJw2nP5lDJIpst/qnf8hzyGQUJnjiVh3SWNpIvH8Zhrz2BQtgJhUF +43jJL0ZpKmjIPPYbx+4TjyF8T5cSCvE= +=wx6r +-----END PGP PUBLIC KEY BLOCK-----` + +// verifySignature verifies the signature given a public key. It also JSON unmarshals the details +// of the license and stores them in l. +func verifySignature(signedFile, publicKey io.Reader, l *license) error { + entityList, err := openpgp.ReadArmoredKeyRing(publicKey) + if err != nil { + return errors.Wrapf(err, "while reading public key") + } + + // The signed file is expected to be have ASCII encoding, so we have to decode it before + // reading. + b, err := armor.Decode(signedFile) + if err != nil { + return errors.Wrapf(err, "while decoding license file") + } + + md, err := openpgp.ReadMessage(b.Body, entityList, nil, nil) + if err != nil { + return errors.Wrapf(err, "while reading PGP message from license file") + } + + // We need to read the body for the signature verification check to happen. + // md.Signature would be non-nil after reading the body if the verification is successfull. + buf, err := ioutil.ReadAll(md.UnverifiedBody) + if err != nil { + return errors.Wrapf(err, "while reading body from signed license file") + } + // This could be nil even if signature verification failed, so we also check Signature == nil + // below. + if md.SignatureError != nil { + return errors.Wrapf(md.SignatureError, + "signature error while trying to verify license file") + } + if md.Signature == nil { + return errors.New("invalid signature while trying to verify license file") + } + + err = json.Unmarshal(buf, l) + if err != nil { + return errors.Wrapf(err, "while JSON unmarshaling body of license file") + } + if l.User == "" || l.MaxNodes == 0 || l.Expiry.IsZero() { + return errors.Errorf("invalid JSON data, fields shouldn't be zero: %+v\n", l) + } + return nil +} diff --git a/dgraph/cmd/zero/pgp_test.go b/dgraph/cmd/zero/pgp_test.go new file mode 100644 index 00000000000..e1750eaaa88 --- /dev/null +++ b/dgraph/cmd/zero/pgp_test.go @@ -0,0 +1,124 @@ +package zero + +import ( + "bytes" + "crypto" + "testing" + "time" + + "github.com/stretchr/testify/require" + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/armor" + "golang.org/x/crypto/openpgp/packet" +) + +func encodePublicKey(t *testing.T, e *openpgp.Entity) *bytes.Buffer { + b := new(bytes.Buffer) + encodedKeyBuf, err := armor.Encode(b, openpgp.PublicKeyType, nil) + require.NoError(t, err) + err = e.Serialize(encodedKeyBuf) + require.NoError(t, err) + err = encodedKeyBuf.Close() + require.NoError(t, err) + return b +} + +func signAndWriteMessage(t *testing.T, entity *openpgp.Entity, json string) *bytes.Buffer { + b := new(bytes.Buffer) + w, err := openpgp.Sign(b, entity, nil, &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + require.NoError(t, err) + + _, err = w.Write([]byte(json)) + require.NoError(t, err) + + err = w.Close() + require.NoError(t, err) + + // armor encode the message + abuf := new(bytes.Buffer) + w, err = armor.Encode(abuf, "PGP MESSAGE", nil) + _, err = w.Write(b.Bytes()) + require.NoError(t, err) + + err = w.Close() + require.NoError(t, err) + + return abuf +} + +func TestEnterpriseDetails(t *testing.T) { + correctEntity, err := openpgp.NewEntity("correct", "", "correct@correct.com", &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + + require.NoError(t, err) + incorrectEntity, err := openpgp.NewEntity("incorrect", "", "incorrect@incorrect.com", &packet.Config{ + RSABits: 4096, + DefaultHash: crypto.SHA512, + }) + require.NoError(t, err) + correctJSON := `{"user": "user", "max_nodes": 10, "expiry": "2019-08-16T19:09:06+10:00"}` + correctTime, err := time.Parse(time.RFC3339, "2019-08-16T19:09:06+10:00") + require.NoError(t, err) + + var tests = []struct { + name string + signingEntity *openpgp.Entity + json string + verifyingEntity *openpgp.Entity + expectError bool + expectedOutput license + }{ + { + "Signing JSON with empty data should return an error", + correctEntity, + `{}`, + correctEntity, + true, + license{}, + }, + { + "Signing JSON with incorrect private key should return an error", + incorrectEntity, + correctJSON, + correctEntity, + true, + license{}, + }, + { + "Verifying data with incorrect public key should return an error", + correctEntity, + correctJSON, + incorrectEntity, + true, + license{}, + }, + { + "Verifying data with correct public key should return correct data", + correctEntity, + correctJSON, + correctEntity, + false, + license{"user", 10, correctTime}, + }, + } + + for _, tt := range tests { + t.Logf("Running: %s\n", tt.name) + buf := signAndWriteMessage(t, tt.signingEntity, tt.json) + e := license{} + publicKey := encodePublicKey(t, tt.verifyingEntity) + err = verifySignature(buf, publicKey, &e) + if tt.expectError { + require.Error(t, err) + continue + } + + require.NoError(t, err) + require.Equal(t, tt.expectedOutput, e) + } +} diff --git a/dgraph/cmd/zero/raft.go b/dgraph/cmd/zero/raft.go index 299afb4367a..4beb9d81941 100644 --- a/dgraph/cmd/zero/raft.go +++ b/dgraph/cmd/zero/raft.go @@ -32,6 +32,7 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" farm "github.com/dgryski/go-farm" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" "github.com/google/uuid" "github.com/pkg/errors" @@ -75,6 +76,8 @@ func (n *node) uniqueKey() string { var errInternalRetry = errors.New("Retry Raft proposal internally") +// proposeAndWait makes a proposal to the quorum for Group Zero and waits for it to be accepted by +// the group before returning. It is safe to call concurrently. func (n *node) proposeAndWait(ctx context.Context, proposal *pb.ZeroProposal) error { switch { case n.Raft() == nil: @@ -356,6 +359,18 @@ func (n *node) applyProposal(e raftpb.Entry) (string, error) { return p.Key, err } } + if p.License != nil { + // Check that the number of nodes in the cluster should be less than MaxNodes, otherwise + // reject the proposal. + numNodes := len(state.GetZeros()) + for _, group := range state.GetGroups() { + numNodes += len(group.GetMembers()) + } + if uint64(numNodes) > p.GetLicense().GetMaxNodes() { + return p.Key, errInvalidProposal + } + state.License = p.License + } if p.MaxLeaseId > state.MaxLeaseId { state.MaxLeaseId = p.MaxLeaseId @@ -491,14 +506,36 @@ func (n *node) initAndStartNode() error { err := n.proposeAndWait(context.Background(), &pb.ZeroProposal{Cid: id}) if err == nil { glog.Infof("CID set for cluster: %v", id) - return + break } if err == errInvalidProposal { + glog.Errorf("invalid proposal error while proposing cluster id") return } glog.Errorf("While proposing CID: %v. Retrying...", err) time.Sleep(3 * time.Second) } + + // Apply enterprise license valid for 30 days from now. + proposal := &pb.ZeroProposal{ + License: &pb.License{ + MaxNodes: math.MaxUint64, + ExpiryTs: time.Now().Add(humanize.Month).Unix(), + }, + } + for { + err := n.proposeAndWait(context.Background(), proposal) + if err == nil { + glog.Infof("Enterprise state proposed to the cluster: %v", proposal) + return + } + if err == errInvalidProposal { + glog.Errorf("invalid proposal error while proposing enteprise state") + return + } + glog.Errorf("While proposing enterprise state: %v. Retrying...", err) + time.Sleep(3 * time.Second) + } }() } @@ -507,6 +544,29 @@ func (n *node) initAndStartNode() error { return nil } +// periodically checks the validity of the enterprise license and updates the membership state. +func (n *node) updateEnterpriseStatePeriodically(closer *y.Closer) { + defer closer.Done() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + dailyTicker := time.NewTicker(humanize.Day) + defer dailyTicker.Stop() + + n.server.updateEnterpriseState() + for { + select { + case <-ticker.C: + n.server.updateEnterpriseState() + case <-dailyTicker.C: + n.server.licenseExpiryWarning() + case <-closer.HasBeenClosed(): + return + } + } +} + func (n *node) updateZeroMembershipPeriodically(closer *y.Closer) { defer closer.Done() ticker := time.NewTicker(10 * time.Second) @@ -604,7 +664,7 @@ func (n *node) Run() { // snapshot can cause select loop to block while deleting entries, so run // it in goroutine readStateCh := make(chan raft.ReadState, 100) - closer := y.NewCloser(4) + closer := y.NewCloser(5) defer func() { closer.SignalAndWait() n.closer.Done() @@ -612,6 +672,7 @@ func (n *node) Run() { }() go n.snapshotPeriodically(closer) + go n.updateEnterpriseStatePeriodically(closer) go n.updateZeroMembershipPeriodically(closer) go n.checkQuorum(closer) go n.RunReadIndexLoop(closer, readStateCh) diff --git a/dgraph/cmd/zero/run.go b/dgraph/cmd/zero/run.go index 0c6f27a6c25..9ff3da09d50 100644 --- a/dgraph/cmd/zero/run.go +++ b/dgraph/cmd/zero/run.go @@ -219,6 +219,7 @@ func run() { http.HandleFunc("/removeNode", st.removeNode) http.HandleFunc("/moveTablet", st.moveTablet) http.HandleFunc("/assign", st.assign) + http.HandleFunc("/enterpriseLicense", st.applyEnterpriseLicense) zpages.Handle(http.DefaultServeMux, "/z") // This must be here. It does not work if placed before Grpc init. diff --git a/dgraph/cmd/zero/zero.go b/dgraph/cmd/zero/zero.go index 746c511e04c..436cb5c20b3 100644 --- a/dgraph/cmd/zero/zero.go +++ b/dgraph/cmd/zero/zero.go @@ -17,10 +17,14 @@ package zero import ( + "io" "math" + "strings" "sync" "time" + "github.com/dustin/go-humanize" + otrace "go.opencensus.io/trace" "golang.org/x/net/context" @@ -39,6 +43,12 @@ var ( errServerShutDown = errors.New("Server is being shut down") ) +type license struct { + User string `json:"user"` + MaxNodes uint64 `json:"max_nodes"` + Expiry time.Time `json:"expiry"` +} + // Server implements the zero server. type Server struct { x.SafeMutex @@ -81,6 +91,7 @@ func (s *Server) Init() { s.closer = y.NewCloser(2) // grpc and http s.blockCommitsOn = new(sync.Map) s.moveOngoing = make(chan struct{}, 1) + go s.rebalanceTablets() } @@ -264,6 +275,45 @@ func (s *Server) updateZeroLeader() { } } +// updateEnterpriseState periodically checks the validity of the enterprise license +// based on its expiry. +func (s *Server) updateEnterpriseState() { + s.Lock() + defer s.Unlock() + + // Return early if license is not enabled. This would happen when user didn't supply us a + // license file yet. + if s.state.GetLicense() == nil { + return + } + + enabled := s.state.GetLicense().GetEnabled() + expiry := time.Unix(s.state.License.ExpiryTs, 0) + s.state.License.Enabled = time.Now().Before(expiry) + if enabled && !s.state.License.Enabled { + // License was enabled earlier and has just now been disabled. + glog.Infof("Enterprise license has expired and enterprise features would be disabled now. " + + "Talk to us at contact@dgraph.io to get a new license.") + } +} + +// Prints out an info log about the expiry of the license if its about to expire in less than a +// week. +func (s *Server) licenseExpiryWarning() { + s.RLock() + defer s.RUnlock() + + if s.state.GetLicense() == nil { + return + } + enabled := s.state.GetLicense().GetEnabled() + expiry := time.Unix(s.state.License.ExpiryTs, 0) + timeToExpire := expiry.Sub(time.Now()) + if enabled && timeToExpire > 0 && timeToExpire < humanize.Week { + glog.Infof("Enterprise license is going to expire in %s.", humanize.Time(expiry)) + } +} + func (s *Server) removeZero(nodeId uint64) { s.Lock() defer s.Unlock() @@ -397,7 +447,7 @@ func (s *Server) removeNode(ctx context.Context, nodeId uint64, groupId uint32) return s.Node.proposeAndWait(ctx, zp) } -// Connect is used to connect the very first time with group zero. +// Connect is used by Alpha nodes to connect the very first time with group zero. func (s *Server) Connect(ctx context.Context, m *pb.Member) (resp *pb.ConnectionState, err error) { // Ensures that connect requests are always serialized @@ -435,6 +485,7 @@ func (s *Server) Connect(ctx context.Context, } } + numberOfNodes := len(ms.Zeros) for _, group := range ms.Groups { for _, member := range group.Members { switch { @@ -460,6 +511,7 @@ func (s *Server) Connect(ctx context.Context, " with same ID: %+v", member) } } + numberOfNodes++ } } @@ -521,10 +573,20 @@ func (s *Server) Connect(ctx context.Context, } proposal := createProposal() - if proposal != nil { - if err := s.Node.proposeAndWait(ctx, proposal); err != nil { - return &emptyConnectionState, err - } + if proposal == nil { + return &pb.ConnectionState{ + State: ms, Member: m, + }, nil + } + + maxNodes := s.state.GetLicense().GetMaxNodes() + if s.state.GetLicense().GetEnabled() && uint64(numberOfNodes) >= maxNodes { + return nil, errors.Errorf("ENTERPRISE_LIMIT_REACHED: You are already using the maximum "+ + "number of nodes: [%v] permitted for your enterprise license.", maxNodes) + } + + if err := s.Node.proposeAndWait(ctx, proposal); err != nil { + return &emptyConnectionState, err } resp = &pb.ConnectionState{ State: s.membershipState(), @@ -723,3 +785,34 @@ func (s *Server) latestMembershipState(ctx context.Context) (*pb.MembershipState } return ms, nil } + +func (s *Server) applyEnterpriseLicense(ctx context.Context, signedData io.Reader) error { + var l license + if err := verifySignature(signedData, strings.NewReader(publicKey), &l); err != nil { + return errors.Wrapf(err, "while extracting enterprise details from the license") + } + + numNodes := len(s.state.GetZeros()) + for _, group := range s.state.GetGroups() { + numNodes += len(group.GetMembers()) + } + if uint64(numNodes) > l.MaxNodes { + return errors.Errorf("Your license only allows [%v] (Alpha + Zero) nodes. You have: [%v].", + l.MaxNodes, numNodes) + } + + proposal := &pb.ZeroProposal{ + License: &pb.License{ + User: l.User, + MaxNodes: l.MaxNodes, + ExpiryTs: l.Expiry.Unix(), + }, + } + + err := s.Node.proposeAndWait(ctx, proposal) + if err != nil { + return errors.Wrapf(err, "while proposing enterprise license state to cluster") + } + glog.Infof("Enterprise license state proposed to the cluster") + return nil +} diff --git a/dgraph/docker-compose.yml b/dgraph/docker-compose.yml index dec8465afbe..ea274896c30 100644 --- a/dgraph/docker-compose.yml +++ b/dgraph/docker-compose.yml @@ -74,7 +74,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha2: image: dgraph/dgraph:latest @@ -97,7 +97,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha3: image: dgraph/dgraph:latest @@ -120,7 +120,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha4: image: dgraph/dgraph:latest @@ -143,7 +143,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha4:7184 --lru_mb=1024 --zero=zero1:5180 -o 104 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha4:7184 --lru_mb=1024 --zero=zero1:5180 -o 104 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha5: image: dgraph/dgraph:latest @@ -166,7 +166,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha5:7185 --lru_mb=1024 --zero=zero1:5180 -o 105 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha5:7185 --lru_mb=1024 --zero=zero1:5180 -o 105 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s alpha6: image: dgraph/dgraph:latest @@ -189,7 +189,7 @@ services: labels: cluster: test service: alpha - command: /gobin/dgraph alpha --my=alpha6:7186 --lru_mb=1024 --zero=zero1:5180 -o 106 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --enterprise_features --acl_access_ttl 3s --acl_cache_ttl 5s + command: /gobin/dgraph alpha --my=alpha6:7186 --lru_mb=1024 --zero=zero1:5180 -o 106 --expose_trace --trace 1.0 --profile_mode block --block_rate 10 --logtostderr -v=2 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 --acl_secret_file /dgraph-acl/hmac-secret --acl_access_ttl 3s --acl_cache_ttl 5s minio1: image: minio/minio:latest diff --git a/edgraph/access_ee.go b/edgraph/access_ee.go index 59a9587774d..e1f2fdad83f 100644 --- a/edgraph/access_ee.go +++ b/edgraph/access_ee.go @@ -27,6 +27,7 @@ import ( "github.com/dgraph-io/dgraph/ee/acl" "github.com/dgraph-io/dgraph/gql" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/worker" "github.com/dgraph-io/dgraph/x" jwt "github.com/dgrijalva/jwt-go" "github.com/golang/glog" @@ -40,6 +41,11 @@ import ( // Login handles login requests from clients. func (s *Server) Login(ctx context.Context, request *api.LoginRequest) (*api.Response, error) { + if !worker.EnterpriseEnabled() { + return nil, errors.New("Enterprise features are disabled. You can enable them by " + + "supplying the appropriate license file to Dgraph Zero uing the HTTP endpoint.") + } + ctx, span := otrace.StartSpan(ctx, "server.Login") defer span.End() diff --git a/ee/backup/tests/filesystem/docker-compose.yml b/ee/backup/tests/filesystem/docker-compose.yml index e818dcb655d..0ae68a242c2 100644 --- a/ee/backup/tests/filesystem/docker-compose.yml +++ b/ee/backup/tests/filesystem/docker-compose.yml @@ -34,7 +34,7 @@ services: ports: - 8180:8180 - 9180:9180 - command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha2: image: dgraph/dgraph:latest @@ -56,7 +56,7 @@ services: ports: - 8182:8182 - 9182:9182 - command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha3: image: dgraph/dgraph:latest @@ -78,4 +78,4 @@ services: ports: - 8183:8183 - 9183:9183 - command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 diff --git a/ee/backup/tests/minio/docker-compose.yml b/ee/backup/tests/minio/docker-compose.yml index 11a044c4d81..16459e49fe8 100644 --- a/ee/backup/tests/minio/docker-compose.yml +++ b/ee/backup/tests/minio/docker-compose.yml @@ -32,7 +32,7 @@ services: ports: - 8180:8180 - 9180:9180 - command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha1 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 -o 100 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha2: image: dgraph/dgraph:latest @@ -52,7 +52,7 @@ services: ports: - 8182:8182 - 9182:9182 - command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha2 --my=alpha2:7182 --lru_mb=1024 --zero=zero1:5180 -o 102 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 alpha3: image: dgraph/dgraph:latest @@ -72,7 +72,7 @@ services: ports: - 8183:8183 - 9183:9183 - command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --enterprise_features --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 + command: /gobin/dgraph alpha --cwd=/data/alpha3 --my=alpha3:7183 --lru_mb=1024 --zero=zero1:5180 -o 103 -v=0 --whitelist 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 minio1: image: minio/minio:latest diff --git a/protos/pb.proto b/protos/pb.proto index 8384015b049..f8aca055abe 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -137,6 +137,13 @@ message Group { uint64 checksum = 4; // Stores a checksum. } +message License { + string user = 1; + uint64 maxNodes = 2; + int64 expiryTs = 3; + bool enabled = 4; +} + message ZeroProposal { map snapshot_ts = 1; // Group ID -> Snapshot Ts. Member member = 2; @@ -147,6 +154,7 @@ message ZeroProposal { api.TxnContext txn = 7; string key = 8; // Used as unique identifier for proposal id. string cid = 9; // Used as unique identifier for the cluster. + License license = 10; } // MembershipState is used to pack together the current membership state of all the nodes @@ -161,6 +169,7 @@ message MembershipState { uint64 maxRaftId = 6; repeated Member removed = 7; string cid = 8; // Used to uniquely identify the Dgraph cluster. + License license = 9; } message ConnectionState { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index d17d4e54fd6..4556cdecd4b 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -51,7 +51,7 @@ func (x DirectedEdge_Op) String() string { } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{17, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{18, 0} } type Mutations_DropOp int32 @@ -82,7 +82,7 @@ func (x Mutations_DropOp) String() string { } func (Mutations_DropOp) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{18, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{19, 0} } type Posting_ValType int32 @@ -134,7 +134,7 @@ func (x Posting_ValType) String() string { } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{22, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{23, 0} } type Posting_PostingType int32 @@ -162,7 +162,7 @@ func (x Posting_PostingType) String() string { } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{22, 1} + return fileDescriptor_f80abaa17e25ccc8, []int{23, 1} } type SchemaUpdate_Directive int32 @@ -193,7 +193,7 @@ func (x SchemaUpdate_Directive) String() string { } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{34, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{35, 0} } type BackupKey_KeyType int32 @@ -236,7 +236,7 @@ func (x BackupKey_KeyType) String() string { } func (BackupKey_KeyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{49, 0} + return fileDescriptor_f80abaa17e25ccc8, []int{50, 0} } type List struct { @@ -1159,6 +1159,77 @@ func (m *Group) GetChecksum() uint64 { return 0 } +type License struct { + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + MaxNodes uint64 `protobuf:"varint,2,opt,name=maxNodes,proto3" json:"maxNodes,omitempty"` + ExpiryTs int64 `protobuf:"varint,3,opt,name=expiryTs,proto3" json:"expiryTs,omitempty"` + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *License) Reset() { *m = License{} } +func (m *License) String() string { return proto.CompactTextString(m) } +func (*License) ProtoMessage() {} +func (*License) Descriptor() ([]byte, []int) { + return fileDescriptor_f80abaa17e25ccc8, []int{13} +} +func (m *License) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *License) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_License.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *License) XXX_Merge(src proto.Message) { + xxx_messageInfo_License.Merge(m, src) +} +func (m *License) XXX_Size() int { + return m.Size() +} +func (m *License) XXX_DiscardUnknown() { + xxx_messageInfo_License.DiscardUnknown(m) +} + +var xxx_messageInfo_License proto.InternalMessageInfo + +func (m *License) GetUser() string { + if m != nil { + return m.User + } + return "" +} + +func (m *License) GetMaxNodes() uint64 { + if m != nil { + return m.MaxNodes + } + return 0 +} + +func (m *License) GetExpiryTs() int64 { + if m != nil { + return m.ExpiryTs + } + return 0 +} + +func (m *License) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + type ZeroProposal struct { SnapshotTs map[uint32]uint64 `protobuf:"bytes,1,rep,name=snapshot_ts,json=snapshotTs,proto3" json:"snapshot_ts,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` Member *Member `protobuf:"bytes,2,opt,name=member,proto3" json:"member,omitempty"` @@ -1169,6 +1240,7 @@ type ZeroProposal struct { Txn *api.TxnContext `protobuf:"bytes,7,opt,name=txn,proto3" json:"txn,omitempty"` Key string `protobuf:"bytes,8,opt,name=key,proto3" json:"key,omitempty"` Cid string `protobuf:"bytes,9,opt,name=cid,proto3" json:"cid,omitempty"` + License *License `protobuf:"bytes,10,opt,name=license,proto3" json:"license,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1178,7 +1250,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_f80abaa17e25ccc8, []int{13} + return fileDescriptor_f80abaa17e25ccc8, []int{14} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1270,6 +1342,13 @@ func (m *ZeroProposal) GetCid() string { return "" } +func (m *ZeroProposal) GetLicense() *License { + if m != nil { + return m.License + } + return nil +} + // MembershipState is used to pack together the current membership state of all the nodes // in the caller server; and the membership updates recorded by the callee server since // the provided lastUpdate. @@ -1282,6 +1361,7 @@ type MembershipState struct { MaxRaftId uint64 `protobuf:"varint,6,opt,name=maxRaftId,proto3" json:"maxRaftId,omitempty"` Removed []*Member `protobuf:"bytes,7,rep,name=removed,proto3" json:"removed,omitempty"` Cid string `protobuf:"bytes,8,opt,name=cid,proto3" json:"cid,omitempty"` + License *License `protobuf:"bytes,9,opt,name=license,proto3" json:"license,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1291,7 +1371,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_f80abaa17e25ccc8, []int{14} + return fileDescriptor_f80abaa17e25ccc8, []int{15} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1376,6 +1456,13 @@ func (m *MembershipState) GetCid() string { return "" } +func (m *MembershipState) GetLicense() *License { + if m != nil { + return m.License + } + return nil +} + type ConnectionState struct { Member *Member `protobuf:"bytes,1,opt,name=member,proto3" json:"member,omitempty"` State *MembershipState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` @@ -1389,7 +1476,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_f80abaa17e25ccc8, []int{15} + return fileDescriptor_f80abaa17e25ccc8, []int{16} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1455,7 +1542,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_f80abaa17e25ccc8, []int{16} + return fileDescriptor_f80abaa17e25ccc8, []int{17} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1632,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_f80abaa17e25ccc8, []int{17} + return fileDescriptor_f80abaa17e25ccc8, []int{18} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1655,7 +1742,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_f80abaa17e25ccc8, []int{18} + return fileDescriptor_f80abaa17e25ccc8, []int{19} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1757,7 +1844,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_f80abaa17e25ccc8, []int{19} + return fileDescriptor_f80abaa17e25ccc8, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1839,7 +1926,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_f80abaa17e25ccc8, []int{20} + return fileDescriptor_f80abaa17e25ccc8, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1937,7 +2024,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_f80abaa17e25ccc8, []int{21} + return fileDescriptor_f80abaa17e25ccc8, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2002,7 +2089,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_f80abaa17e25ccc8, []int{22} + return fileDescriptor_f80abaa17e25ccc8, []int{23} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2121,7 +2208,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_f80abaa17e25ccc8, []int{23} + return fileDescriptor_f80abaa17e25ccc8, []int{24} } func (m *UidBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2183,7 +2270,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_f80abaa17e25ccc8, []int{24} + return fileDescriptor_f80abaa17e25ccc8, []int{25} } func (m *UidPack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2240,7 +2327,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_f80abaa17e25ccc8, []int{25} + return fileDescriptor_f80abaa17e25ccc8, []int{26} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2309,7 +2396,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_f80abaa17e25ccc8, []int{26} + return fileDescriptor_f80abaa17e25ccc8, []int{27} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2364,7 +2451,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_f80abaa17e25ccc8, []int{27} + return fileDescriptor_f80abaa17e25ccc8, []int{28} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2418,7 +2505,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_f80abaa17e25ccc8, []int{28} + return fileDescriptor_f80abaa17e25ccc8, []int{29} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2465,7 +2552,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_f80abaa17e25ccc8, []int{29} + return fileDescriptor_f80abaa17e25ccc8, []int{30} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2514,7 +2601,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_f80abaa17e25ccc8, []int{30} + return fileDescriptor_f80abaa17e25ccc8, []int{31} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2578,7 +2665,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_f80abaa17e25ccc8, []int{31} + return fileDescriptor_f80abaa17e25ccc8, []int{32} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2644,7 +2731,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_f80abaa17e25ccc8, []int{32} + return fileDescriptor_f80abaa17e25ccc8, []int{33} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2712,7 +2799,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_f80abaa17e25ccc8, []int{33} + return fileDescriptor_f80abaa17e25ccc8, []int{34} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2773,7 +2860,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_f80abaa17e25ccc8, []int{34} + return fileDescriptor_f80abaa17e25ccc8, []int{35} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2891,7 +2978,7 @@ func (m *TypeUpdate) Reset() { *m = TypeUpdate{} } func (m *TypeUpdate) String() string { return proto.CompactTextString(m) } func (*TypeUpdate) ProtoMessage() {} func (*TypeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{35} + return fileDescriptor_f80abaa17e25ccc8, []int{36} } func (m *TypeUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,7 +3036,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_f80abaa17e25ccc8, []int{36} + return fileDescriptor_f80abaa17e25ccc8, []int{37} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3013,7 +3100,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_f80abaa17e25ccc8, []int{37} + return fileDescriptor_f80abaa17e25ccc8, []int{38} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3082,7 +3169,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_f80abaa17e25ccc8, []int{38} + return fileDescriptor_f80abaa17e25ccc8, []int{39} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3138,7 +3225,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_f80abaa17e25ccc8, []int{39} + return fileDescriptor_f80abaa17e25ccc8, []int{40} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3199,7 +3286,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_f80abaa17e25ccc8, []int{40} + return fileDescriptor_f80abaa17e25ccc8, []int{41} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3246,7 +3333,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_f80abaa17e25ccc8, []int{41} + return fileDescriptor_f80abaa17e25ccc8, []int{42} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3294,7 +3381,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_f80abaa17e25ccc8, []int{42} + return fileDescriptor_f80abaa17e25ccc8, []int{43} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3350,7 +3437,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_f80abaa17e25ccc8, []int{43} + return fileDescriptor_f80abaa17e25ccc8, []int{44} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3414,7 +3501,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_f80abaa17e25ccc8, []int{44} + return fileDescriptor_f80abaa17e25ccc8, []int{45} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3476,7 +3563,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_f80abaa17e25ccc8, []int{45} + return fileDescriptor_f80abaa17e25ccc8, []int{46} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3533,7 +3620,7 @@ 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_f80abaa17e25ccc8, []int{46} + return fileDescriptor_f80abaa17e25ccc8, []int{47} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3600,7 +3687,7 @@ 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_f80abaa17e25ccc8, []int{47} + return fileDescriptor_f80abaa17e25ccc8, []int{48} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3713,7 +3800,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} } func (m *ExportRequest) String() string { return proto.CompactTextString(m) } func (*ExportRequest) ProtoMessage() {} func (*ExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{48} + return fileDescriptor_f80abaa17e25ccc8, []int{49} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3787,7 +3874,7 @@ func (m *BackupKey) Reset() { *m = BackupKey{} } func (m *BackupKey) String() string { return proto.CompactTextString(m) } func (*BackupKey) ProtoMessage() {} func (*BackupKey) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{49} + return fileDescriptor_f80abaa17e25ccc8, []int{50} } func (m *BackupKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3873,7 +3960,7 @@ func (m *BackupPostingList) Reset() { *m = BackupPostingList{} } func (m *BackupPostingList) String() string { return proto.CompactTextString(m) } func (*BackupPostingList) ProtoMessage() {} func (*BackupPostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_f80abaa17e25ccc8, []int{50} + return fileDescriptor_f80abaa17e25ccc8, []int{51} } func (m *BackupPostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3952,6 +4039,7 @@ func init() { proto.RegisterType((*Group)(nil), "pb.Group") proto.RegisterMapType((map[uint64]*Member)(nil), "pb.Group.MembersEntry") proto.RegisterMapType((map[string]*Tablet)(nil), "pb.Group.TabletsEntry") + proto.RegisterType((*License)(nil), "pb.License") proto.RegisterType((*ZeroProposal)(nil), "pb.ZeroProposal") proto.RegisterMapType((map[uint32]uint64)(nil), "pb.ZeroProposal.SnapshotTsEntry") proto.RegisterType((*MembershipState)(nil), "pb.MembershipState") @@ -3999,239 +4087,243 @@ func init() { func init() { proto.RegisterFile("pb.proto", fileDescriptor_f80abaa17e25ccc8) } var fileDescriptor_f80abaa17e25ccc8 = []byte{ - // 3702 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x6f, 0xe3, 0x48, - 0x76, 0x6f, 0x52, 0x12, 0x45, 0x3e, 0xc9, 0x6e, 0x4d, 0xcd, 0x4c, 0x8f, 0xc6, 0xb3, 0xdb, 0xed, - 0xe1, 0x7c, 0x79, 0xba, 0xb7, 0xdd, 0x3d, 0x9e, 0x0d, 0xb2, 0xb3, 0x41, 0x0e, 0x6e, 0x5b, 0xdd, - 0xeb, 0x69, 0x5b, 0xf6, 0x96, 0xe4, 0x9e, 0xec, 0x1c, 0x22, 0xd0, 0x64, 0x59, 0xe6, 0x9a, 0x22, - 0x19, 0x16, 0xe5, 0xc8, 0x73, 0xcb, 0x21, 0x01, 0x02, 0x24, 0xa7, 0x5c, 0xf6, 0x10, 0xe4, 0x10, - 0x20, 0x97, 0x5c, 0x72, 0x5d, 0xe4, 0x18, 0x20, 0x40, 0x8e, 0x41, 0xfe, 0x82, 0x60, 0x92, 0x63, - 0xce, 0x01, 0x72, 0x0b, 0xde, 0xab, 0xa2, 0x48, 0xaa, 0xdd, 0x3d, 0x3b, 0x0b, 0xec, 0x49, 0xf5, - 0x3e, 0xea, 0xeb, 0x57, 0xaf, 0xde, 0x7b, 0xf5, 0x28, 0xb0, 0xd3, 0xb3, 0xed, 0x34, 0x4b, 0xf2, - 0x84, 0x99, 0xe9, 0xd9, 0x86, 0xe3, 0xa5, 0xa1, 0x22, 0x37, 0x3e, 0x99, 0x86, 0xf9, 0xc5, 0xfc, - 0x6c, 0xdb, 0x4f, 0x66, 0x8f, 0x82, 0x69, 0xe6, 0xa5, 0x17, 0x0f, 0xc3, 0xe4, 0xd1, 0x99, 0x17, - 0x4c, 0x45, 0xf6, 0x28, 0x3d, 0x7b, 0x54, 0xf4, 0x73, 0x37, 0xa0, 0x79, 0x18, 0xca, 0x9c, 0x31, - 0x68, 0xce, 0xc3, 0x40, 0xf6, 0x8d, 0xcd, 0xc6, 0x96, 0xc5, 0xa9, 0xed, 0x1e, 0x81, 0x33, 0xf6, - 0xe4, 0xe5, 0x0b, 0x2f, 0x9a, 0x0b, 0xd6, 0x83, 0xc6, 0x95, 0x17, 0xf5, 0x8d, 0x4d, 0x63, 0xab, - 0xcb, 0xb1, 0xc9, 0xb6, 0xc1, 0xbe, 0xf2, 0xa2, 0x49, 0x7e, 0x9d, 0x8a, 0xbe, 0xb9, 0x69, 0x6c, - 0xad, 0xef, 0xbc, 0xb9, 0x9d, 0x9e, 0x6d, 0x9f, 0x24, 0x32, 0x0f, 0xe3, 0xe9, 0xf6, 0x0b, 0x2f, - 0x1a, 0x5f, 0xa7, 0x82, 0xb7, 0xaf, 0x54, 0xc3, 0x3d, 0x86, 0xce, 0x28, 0xf3, 0x9f, 0xce, 0x63, - 0x3f, 0x0f, 0x93, 0x18, 0x67, 0x8c, 0xbd, 0x99, 0xa0, 0x11, 0x1d, 0x4e, 0x6d, 0xe4, 0x79, 0xd9, - 0x54, 0xf6, 0x1b, 0x9b, 0x0d, 0xe4, 0x61, 0x9b, 0xf5, 0xa1, 0x1d, 0xca, 0xbd, 0x64, 0x1e, 0xe7, - 0xfd, 0xe6, 0xa6, 0xb1, 0x65, 0xf3, 0x82, 0x74, 0xff, 0xb2, 0x01, 0xad, 0x9f, 0xcf, 0x45, 0x76, - 0x4d, 0xfd, 0xf2, 0x3c, 0x2b, 0xc6, 0xc2, 0x36, 0x7b, 0x0b, 0x5a, 0x91, 0x17, 0x4f, 0x65, 0xdf, - 0xa4, 0xc1, 0x14, 0xc1, 0xde, 0x03, 0xc7, 0x3b, 0xcf, 0x45, 0x36, 0x99, 0x87, 0x41, 0xbf, 0xb1, - 0x69, 0x6c, 0x59, 0xdc, 0x26, 0xc6, 0x69, 0x18, 0xb0, 0x77, 0xc1, 0x0e, 0x92, 0x89, 0x5f, 0x9d, - 0x2b, 0x48, 0x68, 0x2e, 0xf6, 0x01, 0xd8, 0xf3, 0x30, 0x98, 0x44, 0xa1, 0xcc, 0xfb, 0xad, 0x4d, - 0x63, 0xab, 0xb3, 0x63, 0xe3, 0x66, 0x11, 0x3b, 0xde, 0x9e, 0x87, 0x01, 0x81, 0x78, 0x1f, 0x6c, - 0x99, 0xf9, 0x93, 0xf3, 0x79, 0xec, 0xf7, 0x2d, 0x52, 0xba, 0x8d, 0x4a, 0x95, 0x5d, 0xf3, 0xb6, - 0x54, 0x04, 0x6e, 0x2b, 0x13, 0x57, 0x22, 0x93, 0xa2, 0xdf, 0x56, 0x53, 0x69, 0x92, 0x3d, 0x86, - 0xce, 0xb9, 0xe7, 0x8b, 0x7c, 0x92, 0x7a, 0x99, 0x37, 0xeb, 0xdb, 0xe5, 0x40, 0x4f, 0x91, 0x7d, - 0x82, 0x5c, 0xc9, 0xe1, 0x7c, 0x49, 0xb0, 0xcf, 0x61, 0x8d, 0x28, 0x39, 0x39, 0x0f, 0xa3, 0x5c, - 0x64, 0x7d, 0x87, 0xfa, 0xac, 0x53, 0x1f, 0xe2, 0x8c, 0x33, 0x21, 0x78, 0x57, 0x29, 0x29, 0x0e, - 0xfb, 0x21, 0x80, 0x58, 0xa4, 0x5e, 0x1c, 0x4c, 0xbc, 0x28, 0xea, 0x03, 0xad, 0xc1, 0x51, 0x9c, - 0xdd, 0x28, 0x62, 0xef, 0xe0, 0xfa, 0xbc, 0x60, 0x92, 0xcb, 0xfe, 0xda, 0xa6, 0xb1, 0xd5, 0xe4, - 0x16, 0x92, 0x63, 0x89, 0xb8, 0xfa, 0x9e, 0x7f, 0x21, 0xfa, 0xeb, 0x9b, 0xc6, 0x56, 0x8b, 0x2b, - 0xc2, 0xdd, 0x01, 0x87, 0xec, 0x84, 0x70, 0xf8, 0x08, 0xac, 0x2b, 0x24, 0x94, 0x39, 0x75, 0x76, - 0xd6, 0x70, 0x21, 0x4b, 0x53, 0xe2, 0x5a, 0xe8, 0xde, 0x05, 0xfb, 0xd0, 0x8b, 0xa7, 0x85, 0xfd, - 0xe1, 0x01, 0x51, 0x07, 0x87, 0x53, 0xdb, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x1e, 0xe5, 0xec, - 0x13, 0x00, 0x84, 0x7f, 0xe6, 0xe5, 0x59, 0xb8, 0xd0, 0xa3, 0x96, 0x07, 0xe0, 0xcc, 0xc3, 0xe0, - 0x88, 0x44, 0xec, 0x31, 0x74, 0x69, 0xf4, 0x42, 0xd5, 0x2c, 0x17, 0xb0, 0x5c, 0x1f, 0xef, 0x90, - 0x8a, 0xee, 0x71, 0x07, 0x2c, 0x3a, 0x71, 0x65, 0x75, 0x6b, 0x5c, 0x53, 0xec, 0x23, 0x58, 0x0f, - 0xe3, 0x1c, 0x4f, 0xc4, 0xcf, 0x27, 0x81, 0x90, 0x85, 0x49, 0xac, 0x2d, 0xb9, 0xfb, 0x42, 0xe6, - 0xec, 0x33, 0x50, 0xb0, 0x16, 0x13, 0xb6, 0x68, 0xc2, 0xf5, 0xe5, 0x71, 0x49, 0x35, 0x23, 0xe9, - 0xe8, 0x19, 0x1f, 0x42, 0x07, 0xf7, 0x57, 0xf4, 0xb0, 0xa8, 0x47, 0x97, 0x76, 0xa3, 0xe1, 0xe0, - 0x80, 0x0a, 0x5a, 0x1d, 0xa1, 0x41, 0xb3, 0x53, 0x66, 0x42, 0x6d, 0x77, 0x00, 0xad, 0xe3, 0x2c, - 0x10, 0xd9, 0x8d, 0x96, 0xcf, 0xa0, 0x19, 0x08, 0xe9, 0xd3, 0xa5, 0xb4, 0x39, 0xb5, 0xcb, 0xdb, - 0xd0, 0xa8, 0xdc, 0x06, 0xf7, 0xef, 0x0c, 0xe8, 0x8c, 0x92, 0x2c, 0x3f, 0x12, 0x52, 0x7a, 0x53, - 0xc1, 0xee, 0x41, 0x2b, 0xc1, 0x61, 0x35, 0xc2, 0x0e, 0xae, 0x89, 0xe6, 0xe1, 0x8a, 0xbf, 0x72, - 0x0e, 0xe6, 0xab, 0xcf, 0x01, 0xad, 0x84, 0xee, 0x51, 0x43, 0x5b, 0x09, 0xdd, 0xa2, 0x3b, 0x60, - 0x25, 0xe7, 0xe7, 0x52, 0x28, 0x2c, 0x5b, 0x5c, 0x53, 0xaf, 0x34, 0x36, 0xf7, 0xf7, 0x00, 0x70, - 0x7d, 0xdf, 0xd3, 0x0a, 0xdc, 0x0b, 0xe8, 0x70, 0xef, 0x3c, 0xdf, 0x4b, 0xe2, 0x5c, 0x2c, 0x72, - 0xb6, 0x0e, 0x66, 0x18, 0x10, 0x44, 0x16, 0x37, 0xc3, 0x00, 0x17, 0x37, 0xcd, 0x92, 0x79, 0x4a, - 0x08, 0xad, 0x71, 0x45, 0x10, 0x94, 0x41, 0x90, 0xd1, 0x8a, 0x11, 0xca, 0x20, 0xc8, 0xd8, 0x3d, - 0xe8, 0xc8, 0xd8, 0x4b, 0xe5, 0x45, 0x92, 0xe3, 0xe2, 0x9a, 0xb4, 0x38, 0x28, 0x58, 0x63, 0xe9, - 0xfe, 0xab, 0x01, 0xd6, 0x91, 0x98, 0x9d, 0x89, 0xec, 0xa5, 0x59, 0xde, 0x05, 0x9b, 0x06, 0x9e, - 0x84, 0x81, 0x9e, 0xa8, 0x4d, 0xf4, 0x41, 0x70, 0xe3, 0x54, 0x77, 0xc0, 0x8a, 0x84, 0x87, 0xe0, - 0x2b, 0x3b, 0xd3, 0x14, 0x62, 0xe3, 0xcd, 0x26, 0x81, 0xf0, 0x02, 0x72, 0x3c, 0x36, 0xb7, 0xbc, - 0xd9, 0xbe, 0xf0, 0x02, 0x5c, 0x5b, 0xe4, 0xc9, 0x7c, 0x32, 0x4f, 0x03, 0x2f, 0x17, 0xe4, 0x70, - 0x9a, 0x68, 0x38, 0x32, 0x3f, 0x25, 0x0e, 0xbb, 0x0f, 0x6f, 0xf8, 0xd1, 0x5c, 0xa2, 0xb7, 0x0b, - 0xe3, 0xf3, 0x64, 0x92, 0xc4, 0xd1, 0x35, 0xe1, 0x6b, 0xf3, 0xdb, 0x5a, 0x70, 0x10, 0x9f, 0x27, - 0xc7, 0x71, 0x74, 0xed, 0xfe, 0xda, 0x84, 0xd6, 0x33, 0x82, 0xe1, 0x31, 0xb4, 0x67, 0xb4, 0xa1, - 0xe2, 0xf6, 0xde, 0x41, 0x84, 0x49, 0xb6, 0xad, 0x76, 0x2a, 0x07, 0x71, 0x9e, 0x5d, 0xf3, 0x42, - 0x0d, 0x7b, 0xe4, 0xde, 0x59, 0x24, 0x72, 0xa9, 0x2d, 0xa2, 0xd2, 0x63, 0xac, 0x04, 0xba, 0x87, - 0x56, 0x5b, 0x85, 0xb5, 0xb1, 0x0a, 0x2b, 0xdb, 0x00, 0xdb, 0xbf, 0x10, 0xfe, 0xa5, 0x9c, 0xcf, - 0x34, 0xe8, 0x4b, 0x7a, 0xe3, 0x29, 0x74, 0xab, 0xeb, 0xc0, 0xc8, 0x74, 0x29, 0xae, 0x09, 0xf8, - 0x26, 0xc7, 0x26, 0xdb, 0x84, 0x16, 0xdd, 0x70, 0x82, 0xbd, 0xb3, 0x03, 0xb8, 0x1c, 0xd5, 0x85, - 0x2b, 0xc1, 0x4f, 0xcd, 0x9f, 0x18, 0x38, 0x4e, 0x75, 0x75, 0xd5, 0x71, 0x9c, 0x57, 0x8f, 0xa3, - 0xba, 0x54, 0xc6, 0x71, 0xff, 0xcf, 0x84, 0xee, 0xd7, 0x22, 0x4b, 0x4e, 0xb2, 0x24, 0x4d, 0xa4, - 0x17, 0xb1, 0xdd, 0xfa, 0xee, 0x14, 0x8a, 0x9b, 0xd8, 0xb9, 0xaa, 0xb6, 0x3d, 0x5a, 0x6e, 0x57, - 0xa1, 0x53, 0xdd, 0xbf, 0x0b, 0x96, 0x42, 0xf7, 0x86, 0x2d, 0x68, 0x09, 0xea, 0x28, 0x3c, 0x09, - 0xbf, 0xfa, 0xf2, 0xb4, 0x84, 0xdd, 0x05, 0x98, 0x79, 0x8b, 0x43, 0xe1, 0x49, 0x71, 0x10, 0x14, - 0xe6, 0x5b, 0x72, 0x10, 0xe7, 0x99, 0xb7, 0x18, 0x2f, 0xe2, 0xb1, 0x24, 0xeb, 0x6a, 0xf2, 0x25, - 0xcd, 0x7e, 0x00, 0xce, 0xcc, 0x5b, 0xe0, 0x3d, 0x3a, 0x08, 0xb4, 0x75, 0x95, 0x0c, 0xf6, 0x3e, - 0x34, 0xf2, 0x45, 0x4c, 0x4e, 0x09, 0xa3, 0x13, 0xa6, 0x1e, 0xe3, 0x45, 0xac, 0x6f, 0x1c, 0x47, - 0x59, 0x01, 0xa8, 0x5d, 0x02, 0xda, 0x83, 0x86, 0x1f, 0x06, 0x14, 0x9e, 0x1c, 0x8e, 0xcd, 0x8d, - 0x3f, 0x84, 0xdb, 0x2b, 0x38, 0x54, 0xcf, 0x61, 0x4d, 0x75, 0x7b, 0xab, 0x7a, 0x0e, 0xcd, 0x2a, - 0xf6, 0xbf, 0x6e, 0xc0, 0x6d, 0x6d, 0x0c, 0x17, 0x61, 0x3a, 0xca, 0xd1, 0xec, 0xfb, 0xd0, 0x26, - 0x6f, 0x23, 0x32, 0x6d, 0x13, 0x05, 0xc9, 0x7e, 0x1f, 0x2c, 0xba, 0x81, 0x85, 0x9d, 0xde, 0x2b, - 0x51, 0x5d, 0x76, 0x57, 0x76, 0xab, 0x8f, 0x44, 0xab, 0xb3, 0x1f, 0x43, 0xeb, 0x1b, 0x91, 0x25, - 0xca, 0x7b, 0x76, 0x76, 0xee, 0xde, 0xd4, 0x0f, 0xcf, 0x56, 0x77, 0x53, 0xca, 0xbf, 0x43, 0xf0, - 0x3f, 0x44, 0x7f, 0x39, 0x4b, 0xae, 0x44, 0xd0, 0x6f, 0xd3, 0x8a, 0xaa, 0xf6, 0x51, 0x88, 0x0a, - 0xb4, 0xed, 0x12, 0xed, 0x7d, 0xe8, 0x54, 0xb6, 0x77, 0x03, 0xd2, 0xf7, 0xea, 0x16, 0xef, 0x2c, - 0x2f, 0x72, 0xf5, 0xe2, 0xec, 0x03, 0x94, 0x9b, 0xfd, 0x6d, 0xaf, 0x9f, 0xfb, 0x67, 0x06, 0xdc, - 0xde, 0x4b, 0xe2, 0x58, 0x50, 0x62, 0xa4, 0x8e, 0xae, 0x34, 0x7b, 0xe3, 0x95, 0x66, 0xff, 0x29, - 0xb4, 0x24, 0x2a, 0xeb, 0xd1, 0xdf, 0xbc, 0xe1, 0x2c, 0xb8, 0xd2, 0x40, 0x37, 0x33, 0xf3, 0x16, - 0x93, 0x54, 0xc4, 0x41, 0x18, 0x4f, 0x0b, 0x37, 0x33, 0xf3, 0x16, 0x27, 0x8a, 0xe3, 0xfe, 0xbd, - 0x01, 0x96, 0xba, 0x31, 0x35, 0x6f, 0x6d, 0xd4, 0xbd, 0xf5, 0x0f, 0xc0, 0x49, 0x33, 0x11, 0x84, - 0x7e, 0x31, 0xab, 0xc3, 0x4b, 0x06, 0x1a, 0xe7, 0x79, 0x92, 0xf9, 0x82, 0x86, 0xb7, 0xb9, 0x22, - 0x90, 0x2b, 0x53, 0xcf, 0x57, 0xc9, 0x5d, 0x83, 0x2b, 0x02, 0x7d, 0xbc, 0x3a, 0x1c, 0x3a, 0x14, - 0x9b, 0x6b, 0x0a, 0xb3, 0x52, 0x8a, 0x7f, 0xe4, 0xa1, 0x1d, 0x12, 0xd9, 0xc8, 0x20, 0xd7, 0xfc, - 0x8f, 0x26, 0x74, 0xf7, 0xc3, 0x4c, 0xf8, 0xb9, 0x08, 0x06, 0xc1, 0x94, 0x46, 0x11, 0x71, 0x1e, - 0xe6, 0xd7, 0x3a, 0xd8, 0x68, 0x6a, 0x99, 0x0b, 0x98, 0xf5, 0x2c, 0x58, 0x9d, 0x45, 0x83, 0x12, - 0x77, 0x45, 0xb0, 0x1d, 0x00, 0x95, 0x25, 0x51, 0xf2, 0xde, 0x7c, 0x75, 0xf2, 0xee, 0x90, 0x1a, - 0x36, 0x11, 0x20, 0xd5, 0x27, 0x54, 0x81, 0xc8, 0xa2, 0xcc, 0x7e, 0x8e, 0x86, 0x4c, 0xc9, 0xc5, - 0x99, 0x88, 0xc8, 0x50, 0x29, 0xb9, 0x38, 0x13, 0xd1, 0x32, 0xa5, 0x6b, 0xab, 0xe5, 0x60, 0x9b, - 0x7d, 0x00, 0x66, 0x92, 0xd2, 0xe6, 0xf5, 0x84, 0xd5, 0x8d, 0x6d, 0x1f, 0xa7, 0xdc, 0x4c, 0x52, - 0xb4, 0x02, 0x95, 0xa9, 0xf6, 0x1d, 0x6d, 0xdc, 0xe8, 0x5d, 0x28, 0x9b, 0xe2, 0x5a, 0xe2, 0xde, - 0x01, 0xf3, 0x38, 0x65, 0x6d, 0x68, 0x8c, 0x06, 0xe3, 0xde, 0x2d, 0x6c, 0xec, 0x0f, 0x0e, 0x7b, - 0x86, 0xfb, 0x3f, 0x26, 0x38, 0x47, 0xf3, 0xdc, 0x43, 0x9b, 0x92, 0xaf, 0x3b, 0xd4, 0x77, 0xc1, - 0x96, 0xb9, 0x97, 0x91, 0x87, 0x56, 0x6e, 0xa5, 0x4d, 0xf4, 0x58, 0xb2, 0x8f, 0xa1, 0x25, 0x82, - 0xa9, 0x28, 0x6e, 0x7b, 0x6f, 0x75, 0x9d, 0x5c, 0x89, 0xd9, 0x16, 0x58, 0xd2, 0xbf, 0x10, 0x33, - 0xaf, 0xdf, 0x2c, 0x15, 0x47, 0xc4, 0x51, 0x11, 0x98, 0x6b, 0x39, 0xdb, 0x81, 0xb7, 0xc3, 0x69, - 0x9c, 0x64, 0x62, 0x12, 0xc6, 0x81, 0x58, 0x4c, 0xfc, 0x24, 0x3e, 0x8f, 0x42, 0x3f, 0xd7, 0x11, - 0xfd, 0x4d, 0x25, 0x3c, 0x40, 0xd9, 0x9e, 0x16, 0xb1, 0x0f, 0xa1, 0x85, 0xa7, 0x23, 0x75, 0x7e, - 0x48, 0x19, 0x25, 0x1e, 0x84, 0x1e, 0x5a, 0x09, 0xd9, 0x43, 0x68, 0x07, 0x59, 0x92, 0x4e, 0x92, - 0x94, 0x70, 0x5e, 0xdf, 0x79, 0x8b, 0xee, 0x43, 0x81, 0xc0, 0xf6, 0x7e, 0x96, 0xa4, 0xc7, 0x29, - 0xb7, 0x02, 0xfa, 0xc5, 0xa4, 0x9f, 0xd4, 0x95, 0x4d, 0x28, 0xcf, 0xe0, 0x20, 0x87, 0x92, 0x63, - 0xf7, 0x11, 0x58, 0xaa, 0x03, 0xb3, 0xa1, 0x39, 0x3c, 0x1e, 0x0e, 0x14, 0xb4, 0xbb, 0x87, 0x87, - 0x3d, 0x03, 0x59, 0xfb, 0xbb, 0xe3, 0xdd, 0x9e, 0x89, 0xad, 0xf1, 0x2f, 0x4e, 0x06, 0xbd, 0x86, - 0xfb, 0x37, 0x06, 0xd8, 0x85, 0xff, 0x66, 0x9f, 0xa2, 0xe3, 0x25, 0xff, 0xaf, 0xaf, 0x2f, 0x3d, - 0x5a, 0x2a, 0x89, 0x18, 0x2f, 0xe4, 0x68, 0x31, 0x84, 0x44, 0xe1, 0xd1, 0x89, 0xa8, 0xa6, 0x81, - 0x8d, 0xda, 0x9b, 0x03, 0x33, 0xda, 0x24, 0x16, 0x3a, 0x33, 0xa2, 0x36, 0x1d, 0x60, 0x18, 0xfb, - 0x02, 0xb5, 0x5b, 0xfa, 0x00, 0x91, 0x1e, 0x4b, 0xf7, 0x6f, 0x4d, 0xb0, 0x97, 0xd1, 0xf8, 0x01, - 0x38, 0xb3, 0x02, 0x0e, 0xed, 0x33, 0xd6, 0x6a, 0x18, 0xf1, 0x52, 0xce, 0xee, 0x80, 0x79, 0x79, - 0xa5, 0x8f, 0xd3, 0x42, 0xad, 0xe7, 0x2f, 0xb8, 0x79, 0x79, 0x55, 0x3a, 0x9d, 0xd6, 0x77, 0x3a, - 0x9d, 0x4f, 0xe0, 0xb6, 0x1f, 0x09, 0x2f, 0x9e, 0x94, 0x3e, 0x43, 0x5d, 0x8b, 0x75, 0x62, 0x9f, - 0x2c, 0x1d, 0x87, 0x76, 0x9c, 0xed, 0x32, 0x3c, 0x7e, 0x04, 0xad, 0x40, 0x44, 0xb9, 0x57, 0x7d, - 0xf3, 0x1d, 0x67, 0x9e, 0x1f, 0x89, 0x7d, 0x64, 0x73, 0x25, 0x65, 0x5b, 0x60, 0x17, 0xa9, 0x82, - 0x7e, 0xe9, 0xd1, 0xe3, 0xa1, 0x38, 0x07, 0xbe, 0x94, 0x96, 0x30, 0x43, 0x05, 0x66, 0xf7, 0x33, - 0x68, 0x3c, 0x7f, 0x31, 0xd2, 0x7b, 0x35, 0x5e, 0xda, 0x6b, 0x01, 0xb6, 0x59, 0x82, 0xed, 0xfe, - 0x6f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xba, 0xe7, 0xcb, 0x44, 0x17, 0x9b, 0xf5, 0xf8, 0xbc, 0x74, - 0x32, 0xd5, 0xfa, 0x40, 0xe3, 0xbb, 0xeb, 0x03, 0xec, 0xa7, 0xd0, 0x4d, 0x95, 0xac, 0xea, 0x96, - 0xde, 0xa9, 0xf6, 0xd1, 0xbf, 0xd4, 0xaf, 0x93, 0x96, 0x04, 0x1a, 0x03, 0x3d, 0xa9, 0x72, 0x6f, - 0x4a, 0x47, 0xd4, 0xe5, 0x6d, 0xa4, 0xc7, 0xde, 0xf4, 0x15, 0xce, 0xe9, 0x37, 0xf0, 0x31, 0x98, - 0xd0, 0x27, 0x69, 0xbf, 0x4b, 0x7e, 0x03, 0xfd, 0x52, 0xd5, 0x65, 0xac, 0xd5, 0x5d, 0xc6, 0x7b, - 0xe0, 0xf8, 0xc9, 0x6c, 0x16, 0x92, 0x6c, 0x5d, 0x27, 0xac, 0xc4, 0x18, 0x4b, 0xf7, 0x2f, 0x0c, - 0x68, 0xeb, 0xdd, 0xb2, 0x0e, 0xb4, 0xf7, 0x07, 0x4f, 0x77, 0x4f, 0x0f, 0xd1, 0x6b, 0x01, 0x58, - 0x4f, 0x0e, 0x86, 0xbb, 0xfc, 0x17, 0x3d, 0x03, 0xaf, 0xd9, 0xc1, 0x70, 0xdc, 0x33, 0x99, 0x03, - 0xad, 0xa7, 0x87, 0xc7, 0xbb, 0xe3, 0x5e, 0x03, 0xef, 0xd9, 0x93, 0xe3, 0xe3, 0xc3, 0x5e, 0x93, - 0x75, 0xc1, 0xde, 0xdf, 0x1d, 0x0f, 0xc6, 0x07, 0x47, 0x83, 0x5e, 0x0b, 0x75, 0x9f, 0x0d, 0x8e, - 0x7b, 0x16, 0x36, 0x4e, 0x0f, 0xf6, 0x7b, 0x6d, 0x94, 0x9f, 0xec, 0x8e, 0x46, 0x5f, 0x1d, 0xf3, - 0xfd, 0x9e, 0x8d, 0xe3, 0x8e, 0xc6, 0xfc, 0x60, 0xf8, 0xac, 0xe7, 0x60, 0xfb, 0xf8, 0xc9, 0x97, - 0x83, 0xbd, 0x71, 0x0f, 0xdc, 0xcf, 0xa0, 0x53, 0x41, 0x10, 0x7b, 0xf3, 0xc1, 0xd3, 0xde, 0x2d, - 0x9c, 0xf2, 0xc5, 0xee, 0xe1, 0xe9, 0xa0, 0x67, 0xb0, 0x75, 0x00, 0x6a, 0x4e, 0x0e, 0x77, 0x87, - 0xcf, 0x7a, 0xa6, 0xfb, 0x73, 0xb0, 0x4f, 0xc3, 0xe0, 0x49, 0x94, 0xf8, 0x97, 0x68, 0x18, 0x67, - 0x9e, 0x14, 0x3a, 0xd4, 0x53, 0x1b, 0x63, 0x11, 0x19, 0xa5, 0xd4, 0x67, 0xaf, 0x29, 0xc4, 0x2a, - 0x9e, 0xcf, 0x26, 0x54, 0x53, 0x6a, 0x28, 0xcf, 0x1b, 0xcf, 0x67, 0xa7, 0x61, 0x20, 0xdd, 0x21, - 0xb4, 0x4f, 0xc3, 0xe0, 0xc4, 0xf3, 0x2f, 0xd1, 0x1d, 0x9d, 0xe1, 0xd0, 0x13, 0x19, 0x7e, 0x23, - 0xb4, 0x87, 0x76, 0x88, 0x33, 0x0a, 0xbf, 0x11, 0xec, 0x43, 0xb0, 0x88, 0x28, 0xf2, 0x35, 0x32, - 0xf3, 0x62, 0x39, 0x5c, 0xcb, 0xdc, 0xbf, 0x32, 0x96, 0xdb, 0xa2, 0x52, 0xc2, 0x3d, 0x68, 0xa6, - 0x9e, 0x7f, 0xa9, 0x7d, 0x50, 0x47, 0xf7, 0xc1, 0xf9, 0x38, 0x09, 0xd8, 0x27, 0x60, 0x6b, 0xdb, - 0x29, 0x06, 0xee, 0x54, 0x8c, 0x8c, 0x2f, 0x85, 0xf5, 0x53, 0x6d, 0xd4, 0x4f, 0x15, 0x77, 0x2e, - 0xd3, 0x28, 0xa4, 0x57, 0x61, 0x03, 0x7d, 0x95, 0xa2, 0xdc, 0x1f, 0x03, 0x94, 0x75, 0x9a, 0x1b, - 0x1e, 0x15, 0x6f, 0x41, 0xcb, 0x8b, 0x42, 0x0d, 0x98, 0xc3, 0x15, 0xe1, 0x0e, 0xa1, 0x53, 0xa9, - 0xee, 0x20, 0x7c, 0x5e, 0x14, 0x4d, 0x2e, 0xc5, 0xb5, 0xa4, 0xbe, 0x36, 0x6f, 0x7b, 0x51, 0xf4, - 0x5c, 0x5c, 0x4b, 0x8c, 0x0b, 0xaa, 0x30, 0x64, 0xae, 0x54, 0x1a, 0xa8, 0x2b, 0x57, 0x42, 0xf7, - 0x47, 0x60, 0xa9, 0xf2, 0x43, 0xc5, 0xd2, 0x8d, 0x57, 0x46, 0xd3, 0x2f, 0xf4, 0x9a, 0xa9, 0x58, - 0xc1, 0x1e, 0xe8, 0x02, 0x94, 0x54, 0xe5, 0x2e, 0xa3, 0xcc, 0x30, 0x95, 0x92, 0xae, 0x3d, 0x91, - 0xb2, 0xbb, 0x0f, 0xf6, 0x6b, 0x4b, 0x7a, 0x1a, 0x00, 0xb3, 0x04, 0xe0, 0x86, 0x22, 0x9f, 0xfb, - 0x4b, 0x80, 0xb2, 0x50, 0xa5, 0x2f, 0x9e, 0x1a, 0x05, 0x2f, 0xde, 0x7d, 0x7c, 0x0d, 0x86, 0x51, - 0x90, 0x89, 0xb8, 0xb6, 0xeb, 0xb2, 0xb4, 0xb5, 0x94, 0xb3, 0x4d, 0x68, 0x52, 0xfd, 0xad, 0x51, - 0x3a, 0xc6, 0x65, 0xf1, 0x8d, 0x24, 0xee, 0x02, 0xd6, 0x54, 0x90, 0xe6, 0xe2, 0x4f, 0xe6, 0x42, - 0xbe, 0x36, 0xf5, 0xbb, 0x0b, 0xb0, 0x74, 0xe3, 0x45, 0x25, 0xb1, 0xc2, 0x41, 0x23, 0x38, 0x0f, - 0x45, 0x14, 0x14, 0xbb, 0xd1, 0x14, 0x1e, 0xb2, 0x0a, 0xde, 0x4d, 0x55, 0x6e, 0x21, 0xc2, 0xfd, - 0x03, 0xe8, 0x16, 0x33, 0x53, 0x3d, 0xe3, 0xc1, 0x32, 0x81, 0x50, 0x18, 0xab, 0x67, 0x94, 0x52, - 0x19, 0x26, 0x81, 0x78, 0x62, 0xf6, 0x8d, 0x22, 0x87, 0x70, 0xff, 0xa3, 0x51, 0xf4, 0xd6, 0xcf, - 0xfb, 0x5a, 0x5a, 0x6a, 0xac, 0xa6, 0xa5, 0xf5, 0x14, 0xcf, 0xfc, 0x8d, 0x52, 0xbc, 0x9f, 0x80, - 0x13, 0x50, 0x9e, 0x13, 0x5e, 0x15, 0x2e, 0x7b, 0x63, 0x35, 0xa7, 0xd1, 0x99, 0x50, 0x78, 0x25, - 0x78, 0xa9, 0x8c, 0x6b, 0xc9, 0x93, 0x4b, 0x11, 0x87, 0xdf, 0x50, 0xfd, 0x02, 0xf7, 0x5c, 0x32, - 0xca, 0x62, 0x90, 0x4a, 0x77, 0x74, 0x31, 0xa8, 0xa8, 0x6b, 0x59, 0x65, 0x5d, 0x0b, 0xf1, 0x9c, - 0xa7, 0x52, 0x64, 0x79, 0x91, 0x20, 0x2b, 0x6a, 0x99, 0x4b, 0x3a, 0x5a, 0x17, 0x73, 0xc9, 0xf7, - 0xa1, 0x1b, 0x27, 0xf1, 0x24, 0x9e, 0x47, 0x11, 0xa6, 0xf0, 0xba, 0x84, 0xd9, 0x89, 0x93, 0x78, - 0xa8, 0x59, 0xec, 0x3e, 0xbc, 0x51, 0x55, 0x51, 0xf6, 0xdc, 0x51, 0x15, 0x90, 0x8a, 0x1e, 0x59, - 0xfd, 0x16, 0xf4, 0x92, 0xb3, 0x5f, 0x0a, 0x3f, 0x27, 0xc4, 0x26, 0x64, 0xc8, 0x5d, 0x15, 0xb8, - 0x15, 0x1f, 0x21, 0x1a, 0x7a, 0x33, 0xe1, 0x7e, 0x01, 0xce, 0x12, 0x84, 0x4a, 0xa2, 0xe4, 0x40, - 0xeb, 0x60, 0xb8, 0x3f, 0xf8, 0xa3, 0x9e, 0x81, 0x5e, 0x9e, 0x0f, 0x5e, 0x0c, 0xf8, 0x68, 0xd0, - 0x33, 0xd1, 0x03, 0xef, 0x0f, 0x0e, 0x07, 0xe3, 0x41, 0xaf, 0xf1, 0x65, 0xd3, 0x6e, 0xf7, 0x6c, - 0x6e, 0x8b, 0x45, 0x1a, 0x85, 0x7e, 0x98, 0xbb, 0x23, 0x80, 0x32, 0xa7, 0x43, 0x7f, 0x53, 0xce, - 0xad, 0x4e, 0xd4, 0xce, 0xf5, 0xac, 0x98, 0x6d, 0x6a, 0x53, 0x33, 0x5f, 0x95, 0x6d, 0x2a, 0xb9, - 0x7b, 0x0a, 0xf6, 0x91, 0x97, 0xbe, 0xf4, 0x3a, 0xeb, 0x2e, 0xdf, 0xe0, 0x73, 0x5d, 0x91, 0xd2, - 0xe1, 0xfb, 0x23, 0x68, 0x6b, 0x97, 0xa7, 0x6f, 0x4d, 0xcd, 0x1d, 0x16, 0x32, 0xf7, 0xcf, 0x0d, - 0x78, 0xeb, 0x28, 0xb9, 0x12, 0xcb, 0x0c, 0xe6, 0xc4, 0xbb, 0x8e, 0x12, 0x2f, 0xf8, 0x0e, 0x43, - 0xfc, 0x21, 0x80, 0x4c, 0xe6, 0x99, 0x2f, 0x26, 0xd3, 0x65, 0x21, 0xcc, 0x51, 0x9c, 0x67, 0xba, - 0xe6, 0x2e, 0x64, 0x4e, 0x42, 0x1d, 0x28, 0x90, 0x46, 0xd1, 0xdb, 0x60, 0xe5, 0x8b, 0xb8, 0xac, - 0xbb, 0xb5, 0x72, 0x7c, 0x1a, 0xbb, 0x7b, 0xe0, 0x8c, 0x17, 0xf4, 0x60, 0x9c, 0xcb, 0x5a, 0x4c, - 0x36, 0x5e, 0x13, 0x93, 0xcd, 0x95, 0x98, 0xfc, 0xdf, 0x06, 0x74, 0x2a, 0xa9, 0x15, 0x7b, 0x1f, - 0x9a, 0xf9, 0x22, 0xae, 0x17, 0xac, 0x8b, 0x49, 0x38, 0x89, 0xd0, 0xde, 0xf0, 0x35, 0xe9, 0x49, - 0x19, 0x4e, 0x63, 0x11, 0xe8, 0x21, 0xf1, 0x85, 0xb9, 0xab, 0x59, 0xec, 0x10, 0x6e, 0x2b, 0x4f, - 0x52, 0x14, 0xab, 0x8a, 0x37, 0xc4, 0x07, 0x2b, 0xa9, 0x9c, 0x7a, 0x54, 0xef, 0x15, 0x5a, 0xaa, - 0x6c, 0xb0, 0x3e, 0xad, 0x31, 0x37, 0x76, 0xe1, 0xcd, 0x1b, 0xd4, 0xbe, 0x57, 0x7d, 0xe4, 0x1e, - 0xac, 0x8d, 0x17, 0xf1, 0x38, 0x9c, 0x09, 0x99, 0x7b, 0xb3, 0x94, 0x72, 0x1a, 0x1d, 0x09, 0x9a, - 0xdc, 0xcc, 0xa5, 0xfb, 0x31, 0x74, 0x4f, 0x84, 0xc8, 0xb8, 0x90, 0x69, 0x12, 0xab, 0x78, 0x2e, - 0x69, 0xd3, 0x3a, 0xec, 0x68, 0xca, 0xfd, 0x63, 0x70, 0x30, 0x91, 0x7f, 0xe2, 0xe5, 0xfe, 0xc5, - 0xf7, 0x49, 0xf4, 0x3f, 0x86, 0x76, 0xaa, 0xcc, 0x44, 0xe7, 0xde, 0x5d, 0xf2, 0x71, 0xda, 0x74, - 0x78, 0x21, 0x74, 0x39, 0x34, 0x86, 0xf3, 0x59, 0xf5, 0x2b, 0x53, 0x53, 0x7d, 0x65, 0xaa, 0x3d, - 0x8d, 0xcd, 0xfa, 0xd3, 0x18, 0x2d, 0xef, 0x3c, 0xc9, 0xfe, 0xd4, 0xcb, 0x02, 0x11, 0xe8, 0xf7, - 0x77, 0xc9, 0x70, 0xbf, 0x86, 0x4e, 0x71, 0x32, 0x07, 0x01, 0x7d, 0x48, 0x22, 0xd3, 0x38, 0x08, - 0x6a, 0x96, 0xa2, 0xde, 0xaf, 0x22, 0x0e, 0x0e, 0x8a, 0x23, 0x55, 0x44, 0x7d, 0x66, 0x5d, 0x9f, - 0x59, 0x3e, 0xca, 0x9f, 0x42, 0xb7, 0xc8, 0xb7, 0x8f, 0x44, 0xee, 0x91, 0xb1, 0x45, 0xa1, 0x88, - 0x2b, 0x86, 0x68, 0x2b, 0xc6, 0x58, 0xbe, 0xa6, 0x12, 0xec, 0x6e, 0x83, 0xa5, 0x2d, 0x99, 0x41, - 0xd3, 0x4f, 0x02, 0x75, 0x81, 0x5a, 0x9c, 0xda, 0x08, 0xc7, 0x4c, 0x4e, 0x8b, 0xe0, 0x39, 0x93, - 0x53, 0xf7, 0x9f, 0x4d, 0x58, 0x7b, 0xe2, 0xf9, 0x97, 0xf3, 0xb4, 0x88, 0x5e, 0x95, 0x47, 0x93, - 0x51, 0x7b, 0x34, 0x55, 0x1f, 0x48, 0x66, 0xed, 0x81, 0x54, 0x5b, 0x50, 0xa3, 0x1e, 0xf1, 0xde, - 0x81, 0xf6, 0x3c, 0x0e, 0x17, 0xc5, 0xad, 0x73, 0xb8, 0x85, 0xe4, 0x58, 0xb2, 0x4d, 0xe8, 0xe0, - 0xc5, 0x0c, 0x63, 0x7a, 0x2a, 0x11, 0x20, 0x0e, 0xaf, 0xb2, 0xf0, 0xa6, 0x7b, 0xbe, 0x2f, 0xa4, - 0xc4, 0xbc, 0x45, 0xa7, 0xdb, 0x8e, 0xe2, 0x3c, 0x17, 0xd7, 0xe4, 0x08, 0x84, 0x9f, 0x89, 0x7c, - 0x52, 0x3e, 0x7b, 0x1c, 0xc5, 0x41, 0xf1, 0x07, 0xb0, 0x26, 0x85, 0x94, 0x61, 0x12, 0x4f, 0x28, - 0x72, 0xe8, 0xd7, 0x69, 0x57, 0x33, 0xc7, 0xc8, 0xc3, 0x03, 0xf7, 0xe2, 0x24, 0xbe, 0x9e, 0x25, - 0x73, 0xa9, 0x83, 0x41, 0xc9, 0x58, 0x89, 0xd6, 0xb0, 0x1a, 0xad, 0xdd, 0x1c, 0xd6, 0x06, 0x8b, - 0x94, 0xbe, 0x27, 0x7c, 0x67, 0xe4, 0xaf, 0xc0, 0x6a, 0xd6, 0x60, 0xad, 0x00, 0xd4, 0xa0, 0xda, - 0x4e, 0x01, 0x10, 0xe6, 0x02, 0x49, 0x36, 0xf3, 0xf2, 0x02, 0x38, 0x45, 0xb9, 0x7f, 0x6d, 0x82, - 0xa3, 0x8e, 0x0c, 0xb7, 0xf9, 0x29, 0x34, 0x29, 0x22, 0x1b, 0x14, 0x5e, 0xdf, 0xc6, 0x8b, 0xb3, - 0x14, 0x6e, 0x3f, 0x17, 0xd7, 0x14, 0x93, 0x49, 0xe5, 0xc6, 0x7a, 0x8e, 0xf6, 0xde, 0x2a, 0x19, - 0x25, 0xef, 0xfd, 0x1e, 0x38, 0xca, 0x03, 0x22, 0x5f, 0xd7, 0xca, 0x89, 0x71, 0x1a, 0xd2, 0x87, - 0x86, 0x5c, 0x64, 0x33, 0x7d, 0x5a, 0xd4, 0x2e, 0xa3, 0xb1, 0xa5, 0xbe, 0x7e, 0x10, 0xe1, 0x5e, - 0x40, 0x5b, 0xcf, 0x8e, 0xd1, 0xeb, 0x74, 0xf8, 0x7c, 0x78, 0xfc, 0xd5, 0xb0, 0x77, 0x6b, 0xf9, - 0xea, 0x37, 0xca, 0xf8, 0x66, 0x56, 0xe3, 0x5b, 0x03, 0xf9, 0x7b, 0xc7, 0xa7, 0xc3, 0x71, 0xaf, - 0xc9, 0xd6, 0xc0, 0xa1, 0xe6, 0x84, 0x0f, 0x5e, 0xf4, 0x5a, 0xf4, 0x0e, 0xd9, 0xfb, 0xd9, 0xe0, - 0x68, 0xb7, 0x67, 0x2d, 0x6b, 0x06, 0x6d, 0x8c, 0x23, 0x6f, 0xa8, 0x2d, 0x57, 0xb3, 0xf6, 0xea, - 0x07, 0xe8, 0xa6, 0xfa, 0x00, 0xfd, 0xbb, 0x4d, 0xd4, 0x77, 0xfe, 0xc5, 0x80, 0x26, 0xfa, 0x2c, - 0xf6, 0x00, 0x9c, 0x9f, 0x09, 0x2f, 0xcb, 0xcf, 0x84, 0x97, 0xb3, 0x9a, 0x7f, 0xda, 0xa8, 0x51, - 0xee, 0xad, 0xc7, 0x06, 0xdb, 0x56, 0x9f, 0x96, 0x8a, 0x2f, 0x66, 0x6b, 0x85, 0xe7, 0x23, 0xcf, - 0xb8, 0xaa, 0xbf, 0x45, 0xfa, 0x5f, 0x26, 0x61, 0xbc, 0xa7, 0xbe, 0xb7, 0xb0, 0x55, 0x4f, 0xb9, - 0xda, 0x83, 0x3d, 0x04, 0xeb, 0x40, 0xa2, 0x4b, 0x7e, 0x59, 0x95, 0x22, 0x7e, 0xd5, 0x5b, 0xbb, - 0xb7, 0x76, 0xfe, 0xa9, 0x01, 0xcd, 0xaf, 0x45, 0x96, 0xb0, 0x1f, 0x41, 0x5b, 0x57, 0x53, 0x59, - 0xa5, 0x6a, 0xba, 0x41, 0x29, 0xdf, 0x4a, 0x99, 0x95, 0x66, 0xe9, 0xa9, 0xa4, 0xa1, 0x2c, 0x62, - 0xb0, 0xb2, 0xd8, 0xfb, 0xd2, 0xa2, 0xbe, 0x80, 0xde, 0x28, 0xcf, 0x84, 0x37, 0xab, 0xa8, 0xd7, - 0x81, 0xba, 0xa9, 0x22, 0x42, 0x78, 0x3d, 0x00, 0x4b, 0xc5, 0xbd, 0x95, 0x0e, 0xab, 0xc5, 0x0d, - 0x52, 0xfe, 0x04, 0x3a, 0xa3, 0x8b, 0x64, 0x1e, 0x05, 0x23, 0x91, 0x5d, 0x09, 0x56, 0xf9, 0xa2, - 0xb1, 0x51, 0x69, 0xbb, 0xb7, 0xd8, 0x16, 0x80, 0x72, 0xed, 0xf8, 0xa2, 0x64, 0x6d, 0x94, 0x0d, - 0xe7, 0x33, 0x35, 0x68, 0xc5, 0xe7, 0x2b, 0xcd, 0x4a, 0xf8, 0x7b, 0x9d, 0xe6, 0xe7, 0xb0, 0xb6, - 0x47, 0x36, 0x73, 0x9c, 0xed, 0x9e, 0x25, 0x59, 0xce, 0x56, 0xbf, 0x6a, 0x6c, 0xac, 0x32, 0xdc, - 0x5b, 0xec, 0x31, 0xd8, 0xe3, 0xec, 0x5a, 0xe9, 0xbf, 0xa1, 0xb3, 0x86, 0x72, 0xbe, 0x1b, 0x76, - 0xb9, 0xf3, 0x0f, 0x0d, 0xb0, 0xbe, 0x4a, 0xb2, 0x4b, 0x91, 0xb1, 0xfb, 0x60, 0x51, 0x15, 0x4a, - 0x9b, 0xd1, 0xb2, 0x22, 0x75, 0xd3, 0x44, 0x1f, 0x82, 0x43, 0xa0, 0x8c, 0x3d, 0x79, 0xa9, 0x8e, - 0x8a, 0xfe, 0xfa, 0xa0, 0x70, 0x51, 0xef, 0x09, 0x3a, 0xd7, 0x75, 0x75, 0x50, 0xcb, 0xa2, 0x5c, - 0xad, 0x34, 0xb4, 0xd1, 0x56, 0x75, 0x9e, 0x11, 0x9a, 0xe6, 0x63, 0x03, 0x9d, 0xd1, 0x48, 0xed, - 0x14, 0x95, 0xca, 0x0f, 0xc1, 0x1b, 0xeb, 0x05, 0x63, 0x39, 0xf2, 0x23, 0xb0, 0x54, 0xb2, 0xa9, - 0xb6, 0x59, 0x7b, 0x41, 0x6d, 0xf4, 0xaa, 0x2c, 0xdd, 0xe1, 0x53, 0xb0, 0xd4, 0x2d, 0x57, 0x1d, - 0x6a, 0x41, 0x4b, 0xad, 0x5a, 0x05, 0x3e, 0xa5, 0xaa, 0xfc, 0xb2, 0x52, 0xad, 0xf9, 0xe8, 0x15, - 0xd5, 0x87, 0xd0, 0xe3, 0xc2, 0x17, 0x61, 0x25, 0x0d, 0x65, 0xc5, 0xa6, 0x6e, 0xb8, 0x7d, 0x5f, - 0xc0, 0x5a, 0x2d, 0x65, 0x65, 0x7d, 0x02, 0xfa, 0x86, 0x2c, 0x76, 0xb5, 0xf3, 0x93, 0xde, 0xbf, - 0x7d, 0x7b, 0xd7, 0xf8, 0xf7, 0x6f, 0xef, 0x1a, 0xff, 0xf9, 0xed, 0x5d, 0xe3, 0x57, 0xff, 0x75, - 0xf7, 0xd6, 0x99, 0x45, 0x7f, 0x99, 0xf9, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x86, - 0x2f, 0xa5, 0x76, 0x23, 0x00, 0x00, + // 3767 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3a, 0x4d, 0x6f, 0x1c, 0x47, + 0x76, 0xea, 0x9e, 0x99, 0x9e, 0xee, 0x37, 0x43, 0x6a, 0x5c, 0x96, 0xe5, 0x31, 0xbd, 0x2b, 0xd1, + 0x6d, 0xcb, 0xa2, 0xa5, 0x15, 0x25, 0xd3, 0x1b, 0x64, 0xbd, 0x41, 0x0e, 0x14, 0x39, 0xd2, 0xd2, + 0xe2, 0xd7, 0xd6, 0x0c, 0xe5, 0xac, 0x0f, 0x19, 0x34, 0xbb, 0x8b, 0xc3, 0x5e, 0xf6, 0x74, 0x77, + 0xba, 0x7a, 0x98, 0xa1, 0x6f, 0x39, 0x24, 0x40, 0x80, 0xe4, 0x94, 0xcb, 0x1e, 0x82, 0x20, 0x08, + 0x90, 0x4b, 0x2e, 0xb9, 0x06, 0x39, 0x06, 0x08, 0x90, 0x63, 0x90, 0x3f, 0x90, 0xc0, 0xc9, 0x31, + 0xe7, 0x9c, 0x83, 0xf7, 0xaa, 0xfa, 0x63, 0x46, 0x94, 0xb4, 0x5e, 0x60, 0x4f, 0x53, 0xef, 0xa3, + 0xbe, 0xde, 0x7b, 0xf5, 0xbe, 0x7a, 0xc0, 0x4e, 0x4f, 0x37, 0xd3, 0x2c, 0xc9, 0x13, 0x66, 0xa6, + 0xa7, 0x6b, 0x8e, 0x97, 0x86, 0x0a, 0x5c, 0xbb, 0x3f, 0x09, 0xf3, 0xf3, 0xd9, 0xe9, 0xa6, 0x9f, + 0x4c, 0x1f, 0x07, 0x93, 0xcc, 0x4b, 0xcf, 0x1f, 0x85, 0xc9, 0xe3, 0x53, 0x2f, 0x98, 0x88, 0xec, + 0x71, 0x7a, 0xfa, 0xb8, 0x98, 0xe7, 0xae, 0x41, 0x73, 0x3f, 0x94, 0x39, 0x63, 0xd0, 0x9c, 0x85, + 0x81, 0xec, 0x1b, 0xeb, 0x8d, 0x0d, 0x8b, 0xd3, 0xd8, 0x3d, 0x00, 0x67, 0xe4, 0xc9, 0x8b, 0x97, + 0x5e, 0x34, 0x13, 0xac, 0x07, 0x8d, 0x4b, 0x2f, 0xea, 0x1b, 0xeb, 0xc6, 0x46, 0x97, 0xe3, 0x90, + 0x6d, 0x82, 0x7d, 0xe9, 0x45, 0xe3, 0xfc, 0x2a, 0x15, 0x7d, 0x73, 0xdd, 0xd8, 0x58, 0xdd, 0x7a, + 0x77, 0x33, 0x3d, 0xdd, 0x3c, 0x4e, 0x64, 0x1e, 0xc6, 0x93, 0xcd, 0x97, 0x5e, 0x34, 0xba, 0x4a, + 0x05, 0x6f, 0x5f, 0xaa, 0x81, 0x7b, 0x04, 0x9d, 0x61, 0xe6, 0x3f, 0x9b, 0xc5, 0x7e, 0x1e, 0x26, + 0x31, 0xee, 0x18, 0x7b, 0x53, 0x41, 0x2b, 0x3a, 0x9c, 0xc6, 0x88, 0xf3, 0xb2, 0x89, 0xec, 0x37, + 0xd6, 0x1b, 0x88, 0xc3, 0x31, 0xeb, 0x43, 0x3b, 0x94, 0x3b, 0xc9, 0x2c, 0xce, 0xfb, 0xcd, 0x75, + 0x63, 0xc3, 0xe6, 0x05, 0xe8, 0xfe, 0x79, 0x03, 0x5a, 0x3f, 0x9f, 0x89, 0xec, 0x8a, 0xe6, 0xe5, + 0x79, 0x56, 0xac, 0x85, 0x63, 0x76, 0x0b, 0x5a, 0x91, 0x17, 0x4f, 0x64, 0xdf, 0xa4, 0xc5, 0x14, + 0xc0, 0x3e, 0x04, 0xc7, 0x3b, 0xcb, 0x45, 0x36, 0x9e, 0x85, 0x41, 0xbf, 0xb1, 0x6e, 0x6c, 0x58, + 0xdc, 0x26, 0xc4, 0x49, 0x18, 0xb0, 0x0f, 0xc0, 0x0e, 0x92, 0xb1, 0x5f, 0xdf, 0x2b, 0x48, 0x68, + 0x2f, 0xf6, 0x31, 0xd8, 0xb3, 0x30, 0x18, 0x47, 0xa1, 0xcc, 0xfb, 0xad, 0x75, 0x63, 0xa3, 0xb3, + 0x65, 0xe3, 0x65, 0x51, 0x76, 0xbc, 0x3d, 0x0b, 0x03, 0x12, 0xe2, 0x03, 0xb0, 0x65, 0xe6, 0x8f, + 0xcf, 0x66, 0xb1, 0xdf, 0xb7, 0x88, 0xe9, 0x26, 0x32, 0xd5, 0x6e, 0xcd, 0xdb, 0x52, 0x01, 0x78, + 0xad, 0x4c, 0x5c, 0x8a, 0x4c, 0x8a, 0x7e, 0x5b, 0x6d, 0xa5, 0x41, 0xf6, 0x04, 0x3a, 0x67, 0x9e, + 0x2f, 0xf2, 0x71, 0xea, 0x65, 0xde, 0xb4, 0x6f, 0x57, 0x0b, 0x3d, 0x43, 0xf4, 0x31, 0x62, 0x25, + 0x87, 0xb3, 0x12, 0x60, 0x5f, 0xc0, 0x0a, 0x41, 0x72, 0x7c, 0x16, 0x46, 0xb9, 0xc8, 0xfa, 0x0e, + 0xcd, 0x59, 0xa5, 0x39, 0x84, 0x19, 0x65, 0x42, 0xf0, 0xae, 0x62, 0x52, 0x18, 0xf6, 0x43, 0x00, + 0x31, 0x4f, 0xbd, 0x38, 0x18, 0x7b, 0x51, 0xd4, 0x07, 0x3a, 0x83, 0xa3, 0x30, 0xdb, 0x51, 0xc4, + 0xde, 0xc7, 0xf3, 0x79, 0xc1, 0x38, 0x97, 0xfd, 0x95, 0x75, 0x63, 0xa3, 0xc9, 0x2d, 0x04, 0x47, + 0x12, 0xe5, 0xea, 0x7b, 0xfe, 0xb9, 0xe8, 0xaf, 0xae, 0x1b, 0x1b, 0x2d, 0xae, 0x00, 0x77, 0x0b, + 0x1c, 0xb2, 0x13, 0x92, 0xc3, 0x3d, 0xb0, 0x2e, 0x11, 0x50, 0xe6, 0xd4, 0xd9, 0x5a, 0xc1, 0x83, + 0x94, 0xa6, 0xc4, 0x35, 0xd1, 0xbd, 0x03, 0xf6, 0xbe, 0x17, 0x4f, 0x0a, 0xfb, 0x43, 0x05, 0xd1, + 0x04, 0x87, 0xd3, 0xd8, 0xfd, 0x95, 0x09, 0x16, 0x17, 0x72, 0x16, 0xe5, 0xec, 0x3e, 0x00, 0x8a, + 0x7f, 0xea, 0xe5, 0x59, 0x38, 0xd7, 0xab, 0x56, 0x0a, 0x70, 0x66, 0x61, 0x70, 0x40, 0x24, 0xf6, + 0x04, 0xba, 0xb4, 0x7a, 0xc1, 0x6a, 0x56, 0x07, 0x28, 0xcf, 0xc7, 0x3b, 0xc4, 0xa2, 0x67, 0xdc, + 0x06, 0x8b, 0x34, 0xae, 0xac, 0x6e, 0x85, 0x6b, 0x88, 0xdd, 0x83, 0xd5, 0x30, 0xce, 0x51, 0x23, + 0x7e, 0x3e, 0x0e, 0x84, 0x2c, 0x4c, 0x62, 0xa5, 0xc4, 0xee, 0x0a, 0x99, 0xb3, 0xcf, 0x41, 0x89, + 0xb5, 0xd8, 0xb0, 0x45, 0x1b, 0xae, 0x96, 0xea, 0x92, 0x6a, 0x47, 0xe2, 0xd1, 0x3b, 0x3e, 0x82, + 0x0e, 0xde, 0xaf, 0x98, 0x61, 0xd1, 0x8c, 0x2e, 0xdd, 0x46, 0x8b, 0x83, 0x03, 0x32, 0x68, 0x76, + 0x14, 0x0d, 0x9a, 0x9d, 0x32, 0x13, 0x1a, 0xbb, 0x03, 0x68, 0x1d, 0x65, 0x81, 0xc8, 0xae, 0xb5, + 0x7c, 0x06, 0xcd, 0x40, 0x48, 0x9f, 0x1e, 0xa5, 0xcd, 0x69, 0x5c, 0xbd, 0x86, 0x46, 0xed, 0x35, + 0xb8, 0x7f, 0x63, 0x40, 0x67, 0x98, 0x64, 0xf9, 0x81, 0x90, 0xd2, 0x9b, 0x08, 0x76, 0x17, 0x5a, + 0x09, 0x2e, 0xab, 0x25, 0xec, 0xe0, 0x99, 0x68, 0x1f, 0xae, 0xf0, 0x4b, 0x7a, 0x30, 0x5f, 0xaf, + 0x07, 0xb4, 0x12, 0x7a, 0x47, 0x0d, 0x6d, 0x25, 0xf4, 0x8a, 0x6e, 0x83, 0x95, 0x9c, 0x9d, 0x49, + 0xa1, 0x64, 0xd9, 0xe2, 0x1a, 0x7a, 0xad, 0xb1, 0xb9, 0xbf, 0x03, 0x80, 0xe7, 0xfb, 0x9e, 0x56, + 0xe0, 0x9e, 0x43, 0x87, 0x7b, 0x67, 0xf9, 0x4e, 0x12, 0xe7, 0x62, 0x9e, 0xb3, 0x55, 0x30, 0xc3, + 0x80, 0x44, 0x64, 0x71, 0x33, 0x0c, 0xf0, 0x70, 0x93, 0x2c, 0x99, 0xa5, 0x24, 0xa1, 0x15, 0xae, + 0x00, 0x12, 0x65, 0x10, 0x64, 0x74, 0x62, 0x14, 0x65, 0x10, 0x64, 0xec, 0x2e, 0x74, 0x64, 0xec, + 0xa5, 0xf2, 0x3c, 0xc9, 0xf1, 0x70, 0x4d, 0x3a, 0x1c, 0x14, 0xa8, 0x91, 0x74, 0xff, 0xd5, 0x00, + 0xeb, 0x40, 0x4c, 0x4f, 0x45, 0xf6, 0xca, 0x2e, 0x1f, 0x80, 0x4d, 0x0b, 0x8f, 0xc3, 0x40, 0x6f, + 0xd4, 0x26, 0x78, 0x2f, 0xb8, 0x76, 0xab, 0xdb, 0x60, 0x45, 0xc2, 0x43, 0xe1, 0x2b, 0x3b, 0xd3, + 0x10, 0xca, 0xc6, 0x9b, 0x8e, 0x03, 0xe1, 0x05, 0xe4, 0x78, 0x6c, 0x6e, 0x79, 0xd3, 0x5d, 0xe1, + 0x05, 0x78, 0xb6, 0xc8, 0x93, 0xf9, 0x78, 0x96, 0x06, 0x5e, 0x2e, 0xc8, 0xe1, 0x34, 0xd1, 0x70, + 0x64, 0x7e, 0x42, 0x18, 0xf6, 0x00, 0xde, 0xf1, 0xa3, 0x99, 0x44, 0x6f, 0x17, 0xc6, 0x67, 0xc9, + 0x38, 0x89, 0xa3, 0x2b, 0x92, 0xaf, 0xcd, 0x6f, 0x6a, 0xc2, 0x5e, 0x7c, 0x96, 0x1c, 0xc5, 0xd1, + 0x95, 0xfb, 0x4f, 0x26, 0xb4, 0x9e, 0x93, 0x18, 0x9e, 0x40, 0x7b, 0x4a, 0x17, 0x2a, 0x5e, 0xef, + 0x6d, 0x94, 0x30, 0xd1, 0x36, 0xd5, 0x4d, 0xe5, 0x20, 0xce, 0xb3, 0x2b, 0x5e, 0xb0, 0xe1, 0x8c, + 0xdc, 0x3b, 0x8d, 0x44, 0x2e, 0xb5, 0x45, 0xd4, 0x66, 0x8c, 0x14, 0x41, 0xcf, 0xd0, 0x6c, 0xcb, + 0x62, 0x6d, 0x2c, 0x8b, 0x95, 0xad, 0x81, 0xed, 0x9f, 0x0b, 0xff, 0x42, 0xce, 0xa6, 0x5a, 0xe8, + 0x25, 0xbc, 0xf6, 0x0c, 0xba, 0xf5, 0x73, 0x60, 0x64, 0xba, 0x10, 0x57, 0x24, 0xf8, 0x26, 0xc7, + 0x21, 0x5b, 0x87, 0x16, 0xbd, 0x70, 0x12, 0x7b, 0x67, 0x0b, 0xf0, 0x38, 0x6a, 0x0a, 0x57, 0x84, + 0x9f, 0x9a, 0x3f, 0x31, 0x70, 0x9d, 0xfa, 0xe9, 0xea, 0xeb, 0x38, 0xaf, 0x5f, 0x47, 0x4d, 0xa9, + 0xad, 0xe3, 0x26, 0xd0, 0xde, 0x0f, 0x7d, 0x11, 0x4b, 0x8a, 0x5f, 0x33, 0x29, 0xca, 0xd7, 0x88, + 0x63, 0xbc, 0xca, 0xd4, 0x9b, 0x1f, 0x26, 0x81, 0x90, 0xb4, 0x4e, 0x93, 0x97, 0x30, 0xd2, 0xc4, + 0x3c, 0x0d, 0xb3, 0xab, 0x91, 0x12, 0x42, 0x83, 0x97, 0x30, 0x06, 0x08, 0x11, 0xe3, 0x66, 0x41, + 0x11, 0x8b, 0x34, 0xe8, 0xfe, 0x6d, 0x03, 0xba, 0xdf, 0x88, 0x2c, 0x39, 0xce, 0x92, 0x34, 0x91, + 0x5e, 0xc4, 0xb6, 0x17, 0xc5, 0xa9, 0xd4, 0xb6, 0x8e, 0xa7, 0xad, 0xb3, 0x6d, 0x0e, 0x4b, 0xf9, + 0x2a, 0x75, 0xd4, 0x05, 0xee, 0x82, 0xa5, 0xd4, 0x79, 0x8d, 0xcc, 0x34, 0x05, 0x79, 0x94, 0x02, + 0xe9, 0xac, 0x8b, 0xf2, 0xd0, 0x14, 0x76, 0x07, 0x60, 0xea, 0xcd, 0xf7, 0x85, 0x27, 0xc5, 0x5e, + 0x50, 0xbc, 0x97, 0x0a, 0xa3, 0xa5, 0x31, 0x9a, 0xc7, 0x23, 0x49, 0xe6, 0xac, 0xa4, 0x41, 0x30, + 0xfb, 0x01, 0x38, 0x53, 0x6f, 0x8e, 0x0f, 0x77, 0x2f, 0xd0, 0xe6, 0x5c, 0x21, 0xd8, 0x47, 0xd0, + 0xc8, 0xe7, 0x31, 0x79, 0x41, 0x0c, 0x87, 0x98, 0xeb, 0x8c, 0xe6, 0xb1, 0x7e, 0xe2, 0x1c, 0x69, + 0x85, 0x06, 0xed, 0x4a, 0x83, 0x3d, 0x68, 0xf8, 0x61, 0x40, 0xf1, 0xd0, 0xe1, 0x38, 0x64, 0xf7, + 0xa0, 0x1d, 0x29, 0x6d, 0x51, 0xcc, 0xeb, 0x6c, 0x75, 0x94, 0x03, 0x21, 0x14, 0x2f, 0x68, 0x6b, + 0xbf, 0x0f, 0x37, 0x97, 0xc4, 0x55, 0xb7, 0x8f, 0x15, 0xb5, 0xfa, 0xad, 0xba, 0x7d, 0x34, 0xeb, + 0x36, 0xf1, 0x9f, 0x0d, 0xb8, 0xa9, 0x8d, 0xf4, 0x3c, 0x4c, 0x87, 0x39, 0x3e, 0xc7, 0x3e, 0xb4, + 0xc9, 0x0b, 0x6a, 0xfb, 0x68, 0xf2, 0x02, 0x64, 0xbf, 0x0b, 0x16, 0x79, 0x86, 0xe2, 0xfd, 0xdc, + 0xad, 0x84, 0x5f, 0x4e, 0x57, 0xef, 0x49, 0x6b, 0x4e, 0xb3, 0xb3, 0x1f, 0x43, 0xeb, 0x5b, 0x91, + 0x25, 0xca, 0xab, 0x77, 0xb6, 0xee, 0x5c, 0x37, 0x0f, 0x4d, 0x40, 0x4f, 0x53, 0xcc, 0xbf, 0x45, + 0x1d, 0x7d, 0x82, 0x7e, 0x7c, 0x9a, 0x5c, 0x8a, 0xa0, 0xdf, 0xa6, 0x13, 0xd5, 0xcd, 0xa8, 0x20, + 0x15, 0x4a, 0xb1, 0xaf, 0x55, 0x8a, 0xf3, 0x06, 0xa5, 0xec, 0x42, 0xa7, 0x26, 0x85, 0x6b, 0x14, + 0x72, 0x77, 0xf1, 0xc1, 0x3a, 0xa5, 0x1f, 0xaa, 0xbf, 0xfb, 0x5d, 0x80, 0x4a, 0x26, 0xbf, 0xa9, + 0xf7, 0x70, 0xff, 0xc4, 0x80, 0x9b, 0x3b, 0x49, 0x1c, 0x0b, 0xca, 0xeb, 0x94, 0x86, 0xab, 0x47, + 0x64, 0xbc, 0xf6, 0x11, 0x7d, 0x06, 0x2d, 0x89, 0xcc, 0x7a, 0xf5, 0x77, 0xaf, 0x51, 0x19, 0x57, + 0x1c, 0xe8, 0x25, 0xa7, 0xde, 0x7c, 0x9c, 0x8a, 0x38, 0x08, 0xe3, 0x49, 0xe1, 0x25, 0xa7, 0xde, + 0xfc, 0x58, 0x61, 0xdc, 0xbf, 0x33, 0xc0, 0x52, 0xef, 0x6f, 0x21, 0xd8, 0x18, 0x8b, 0xc1, 0xe6, + 0x07, 0xe0, 0xa4, 0x99, 0x08, 0x42, 0xbf, 0xd8, 0xd5, 0xe1, 0x15, 0x02, 0x6d, 0xf8, 0x2c, 0xc9, + 0x7c, 0x41, 0xcb, 0xdb, 0x5c, 0x01, 0x88, 0x95, 0xa9, 0xe7, 0xab, 0xdc, 0xb4, 0xc1, 0x15, 0x80, + 0x21, 0x4a, 0xe9, 0x90, 0x74, 0x67, 0x73, 0x0d, 0x61, 0x52, 0x4d, 0xe1, 0x9b, 0x02, 0x8c, 0x43, + 0x24, 0x1b, 0x11, 0x14, 0x59, 0xfe, 0xc1, 0x84, 0xee, 0x6e, 0x98, 0x09, 0x3f, 0x17, 0xc1, 0x20, + 0x98, 0xd0, 0x2a, 0x22, 0xce, 0xc3, 0xfc, 0x4a, 0xc7, 0x4a, 0x0d, 0x95, 0xa9, 0x8c, 0xb9, 0x98, + 0xc4, 0x2b, 0x5d, 0x34, 0xa8, 0xee, 0x50, 0x00, 0xdb, 0x02, 0x50, 0x49, 0x1e, 0xd5, 0x1e, 0xcd, + 0xd7, 0xd7, 0x1e, 0x0e, 0xb1, 0xe1, 0x10, 0x05, 0xa4, 0xe6, 0x84, 0x2a, 0x8e, 0x5a, 0x54, 0x98, + 0xcc, 0xd0, 0xde, 0x29, 0x37, 0x3a, 0x15, 0x11, 0xd9, 0x33, 0xe5, 0x46, 0xa7, 0x22, 0x2a, 0x33, + 0xd2, 0xb6, 0x3a, 0x0e, 0x8e, 0xd9, 0xc7, 0x60, 0x26, 0x29, 0x5d, 0x5e, 0x6f, 0x58, 0xbf, 0xd8, + 0xe6, 0x51, 0xca, 0xcd, 0x24, 0x45, 0x2b, 0x50, 0x89, 0x76, 0xdf, 0xd1, 0x6f, 0x00, 0x7d, 0x15, + 0x25, 0x83, 0x5c, 0x53, 0xdc, 0xdb, 0x60, 0x1e, 0xa5, 0xac, 0x0d, 0x8d, 0xe1, 0x60, 0xd4, 0xbb, + 0x81, 0x83, 0xdd, 0xc1, 0x7e, 0xcf, 0x70, 0xff, 0xd7, 0x04, 0xe7, 0x60, 0x96, 0x7b, 0x68, 0x53, + 0xf2, 0x4d, 0x4a, 0xfd, 0x00, 0x6c, 0x99, 0x7b, 0x19, 0xf9, 0x7b, 0xe5, 0x7d, 0xda, 0x04, 0x8f, + 0x24, 0xfb, 0x14, 0x5a, 0x22, 0x98, 0x88, 0xc2, 0x29, 0xf4, 0x96, 0xcf, 0xc9, 0x15, 0x99, 0x6d, + 0x80, 0x25, 0xfd, 0x73, 0x31, 0xf5, 0xfa, 0xcd, 0x8a, 0x71, 0x48, 0x18, 0x95, 0x40, 0x70, 0x4d, + 0x67, 0x5b, 0xf0, 0x5e, 0x38, 0x89, 0x93, 0x4c, 0x8c, 0xc3, 0x38, 0x10, 0xf3, 0xb1, 0x9f, 0xc4, + 0x67, 0x51, 0xe8, 0xe7, 0x3a, 0x21, 0x79, 0x57, 0x11, 0xf7, 0x90, 0xb6, 0xa3, 0x49, 0xec, 0x13, + 0x68, 0xa1, 0x76, 0xa4, 0x4e, 0x6f, 0x29, 0x21, 0x46, 0x45, 0xe8, 0xa5, 0x15, 0x91, 0x3d, 0x82, + 0x76, 0x90, 0x25, 0xe9, 0x38, 0x49, 0x49, 0xce, 0xab, 0x5b, 0xb7, 0xe8, 0x3d, 0x14, 0x12, 0xd8, + 0xdc, 0xcd, 0x92, 0xf4, 0x28, 0xe5, 0x56, 0x40, 0xbf, 0x58, 0xb3, 0x10, 0xbb, 0xb2, 0x09, 0xe5, + 0x40, 0x1c, 0xc4, 0x50, 0x6e, 0xef, 0x3e, 0x06, 0x4b, 0x4d, 0x60, 0x36, 0x34, 0x0f, 0x8f, 0x0e, + 0x07, 0x4a, 0xb4, 0xdb, 0xfb, 0xfb, 0x3d, 0x03, 0x51, 0xbb, 0xdb, 0xa3, 0xed, 0x9e, 0x89, 0xa3, + 0xd1, 0x2f, 0x8e, 0x07, 0xbd, 0x86, 0xfb, 0x57, 0x06, 0xd8, 0x85, 0x9b, 0x67, 0x9f, 0xa1, 0x7f, + 0xa6, 0x68, 0xa2, 0x9f, 0x2f, 0xd5, 0x5c, 0xb5, 0x3c, 0x92, 0x17, 0x74, 0xb4, 0x18, 0x92, 0x44, + 0xe1, 0xf8, 0x09, 0xa8, 0x67, 0xb1, 0x8d, 0x85, 0x92, 0x09, 0x13, 0xf2, 0x24, 0x16, 0x3a, 0x8e, + 0xd3, 0x98, 0x14, 0x18, 0xc6, 0xbe, 0x40, 0xee, 0x96, 0x56, 0x20, 0xc2, 0x23, 0xe9, 0xfe, 0xb5, + 0x09, 0x76, 0x19, 0xdb, 0x1f, 0x82, 0x33, 0x2d, 0xc4, 0xa1, 0x7d, 0xc6, 0xca, 0x82, 0x8c, 0x78, + 0x45, 0x67, 0xb7, 0xc1, 0xbc, 0xb8, 0xd4, 0xea, 0xb4, 0x90, 0xeb, 0xc5, 0x4b, 0x6e, 0x5e, 0x5c, + 0x56, 0x4e, 0xa7, 0xf5, 0x56, 0xa7, 0x73, 0x1f, 0x6e, 0xfa, 0x91, 0xf0, 0xe2, 0x71, 0xe5, 0x33, + 0xd4, 0xb3, 0x58, 0x25, 0xf4, 0x71, 0xe9, 0x38, 0xb4, 0xe3, 0x6c, 0x57, 0xc1, 0xf6, 0x1e, 0xb4, + 0x02, 0x11, 0xe5, 0x5e, 0xbd, 0x64, 0x3d, 0xca, 0x3c, 0x3f, 0x12, 0xbb, 0x88, 0xe6, 0x8a, 0xca, + 0x36, 0xc0, 0x2e, 0x12, 0x0f, 0xed, 0xed, 0xa9, 0xf6, 0x29, 0xf4, 0xc0, 0x4b, 0x6a, 0x25, 0x66, + 0xa8, 0x89, 0xd9, 0xfd, 0x1c, 0x1a, 0x2f, 0x5e, 0x0e, 0xf5, 0x5d, 0x8d, 0x57, 0xee, 0x5a, 0x08, + 0xdb, 0xac, 0x84, 0xed, 0xfe, 0x5f, 0x03, 0xda, 0xda, 0x37, 0xe0, 0xb9, 0x67, 0x65, 0x9e, 0x8e, + 0xc3, 0xc5, 0x30, 0x5e, 0x3a, 0x99, 0x7a, 0x7b, 0xa3, 0xf1, 0xf6, 0xf6, 0x06, 0xfb, 0x29, 0x74, + 0x53, 0x45, 0xab, 0xbb, 0xa5, 0xf7, 0xeb, 0x73, 0xf4, 0x2f, 0xcd, 0xeb, 0xa4, 0x15, 0x80, 0xc6, + 0x40, 0x15, 0x61, 0xee, 0x4d, 0x48, 0x45, 0x5d, 0xde, 0x46, 0x78, 0xe4, 0x4d, 0x5e, 0xe3, 0x9c, + 0x7e, 0x0d, 0x1f, 0x83, 0xf5, 0x48, 0x92, 0xf6, 0xbb, 0xe4, 0x37, 0xd0, 0x2f, 0xd5, 0x5d, 0xc6, + 0xca, 0xa2, 0xcb, 0xf8, 0x10, 0x1c, 0x3f, 0x99, 0x4e, 0x43, 0xa2, 0xad, 0xea, 0x7c, 0x9b, 0x10, + 0x23, 0xe9, 0xfe, 0x99, 0x01, 0x6d, 0x7d, 0x5b, 0xd6, 0x81, 0xf6, 0xee, 0xe0, 0xd9, 0xf6, 0xc9, + 0x3e, 0x7a, 0x2d, 0x00, 0xeb, 0xe9, 0xde, 0xe1, 0x36, 0xff, 0x45, 0xcf, 0xc0, 0x67, 0xb6, 0x77, + 0x38, 0xea, 0x99, 0xcc, 0x81, 0xd6, 0xb3, 0xfd, 0xa3, 0xed, 0x51, 0xaf, 0x81, 0xef, 0xec, 0xe9, + 0xd1, 0xd1, 0x7e, 0xaf, 0xc9, 0xba, 0x60, 0xef, 0x6e, 0x8f, 0x06, 0xa3, 0xbd, 0x83, 0x41, 0xaf, + 0x85, 0xbc, 0xcf, 0x07, 0x47, 0x3d, 0x0b, 0x07, 0x27, 0x7b, 0xbb, 0xbd, 0x36, 0xd2, 0x8f, 0xb7, + 0x87, 0xc3, 0xaf, 0x8f, 0xf8, 0x6e, 0xcf, 0xc6, 0x75, 0x87, 0x23, 0xbe, 0x77, 0xf8, 0xbc, 0xe7, + 0xe0, 0xf8, 0xe8, 0xe9, 0x57, 0x83, 0x9d, 0x51, 0x0f, 0xdc, 0xcf, 0xa1, 0x53, 0x93, 0x20, 0xce, + 0xe6, 0x83, 0x67, 0xbd, 0x1b, 0xb8, 0xe5, 0xcb, 0xed, 0xfd, 0x93, 0x41, 0xcf, 0x60, 0xab, 0x00, + 0x34, 0x1c, 0xef, 0x6f, 0x1f, 0x3e, 0xef, 0x99, 0xee, 0xcf, 0xc1, 0x3e, 0x09, 0x83, 0xa7, 0x51, + 0xe2, 0x5f, 0xa0, 0x61, 0x9c, 0x7a, 0x52, 0xe8, 0x50, 0x4f, 0x63, 0x8c, 0x45, 0x64, 0x94, 0x52, + 0xeb, 0x5e, 0x43, 0x28, 0xab, 0x78, 0x36, 0x1d, 0x53, 0x4b, 0xac, 0xa1, 0x3c, 0x6f, 0x3c, 0x9b, + 0x9e, 0x84, 0x81, 0x74, 0x0f, 0xa1, 0x7d, 0x12, 0x06, 0xc7, 0x9e, 0x7f, 0x81, 0xee, 0xe8, 0x14, + 0x97, 0x1e, 0xcb, 0xf0, 0x5b, 0xa1, 0x3d, 0xb4, 0x43, 0x98, 0x61, 0xf8, 0xad, 0x60, 0x9f, 0x80, + 0x45, 0x40, 0x91, 0xd6, 0x91, 0x99, 0x17, 0xc7, 0xe1, 0x9a, 0xe6, 0xfe, 0x85, 0x51, 0x5e, 0x8b, + 0x3a, 0x21, 0x77, 0xa1, 0x99, 0x7a, 0xfe, 0x85, 0xf6, 0x41, 0x1d, 0x3d, 0x07, 0xf7, 0xe3, 0x44, + 0x60, 0xf7, 0xc1, 0xd6, 0xb6, 0x53, 0x2c, 0xdc, 0xa9, 0x19, 0x19, 0x2f, 0x89, 0x8b, 0x5a, 0x6d, + 0x2c, 0x6a, 0x15, 0x6f, 0x2e, 0xd3, 0x28, 0xa4, 0xa2, 0xb6, 0x81, 0xbe, 0x4a, 0x41, 0xee, 0x8f, + 0x01, 0xaa, 0x36, 0xd3, 0x35, 0x35, 0xd1, 0x2d, 0x68, 0x79, 0x51, 0xa8, 0x05, 0xe6, 0x70, 0x05, + 0xb8, 0x87, 0xd0, 0xa9, 0x35, 0xa7, 0x50, 0x7c, 0x5e, 0x14, 0x8d, 0x2f, 0xc4, 0x95, 0xa4, 0xb9, + 0x36, 0x6f, 0x7b, 0x51, 0xf4, 0x42, 0x5c, 0x49, 0x8c, 0x0b, 0xaa, 0xaf, 0x65, 0x2e, 0x35, 0x4a, + 0x68, 0x2a, 0x57, 0x44, 0xf7, 0x47, 0x60, 0xa9, 0xee, 0x49, 0xcd, 0xd2, 0x8d, 0xd7, 0x46, 0xd3, + 0x2f, 0xf5, 0x99, 0xa9, 0xd7, 0xc2, 0x1e, 0xea, 0xfe, 0x99, 0x54, 0xdd, 0x3a, 0xa3, 0x4a, 0x44, + 0x15, 0x93, 0x6e, 0x9d, 0x11, 0xb3, 0xbb, 0x0b, 0xf6, 0x1b, 0x3b, 0x92, 0x5a, 0x00, 0x66, 0x25, + 0x80, 0x6b, 0x7a, 0x94, 0xee, 0x2f, 0x01, 0xaa, 0x3e, 0x9b, 0x7e, 0x78, 0x6a, 0x15, 0x7c, 0x78, + 0x0f, 0xb0, 0x98, 0x0d, 0xa3, 0x20, 0x13, 0xf1, 0xc2, 0xad, 0xab, 0xce, 0x5c, 0x49, 0x67, 0xeb, + 0xd0, 0xa4, 0xf6, 0x61, 0xa3, 0x72, 0x8c, 0x65, 0xef, 0x90, 0x28, 0xee, 0x1c, 0x56, 0x54, 0x90, + 0xe6, 0xe2, 0x8f, 0x66, 0x42, 0xbe, 0x31, 0xf5, 0xbb, 0x03, 0x50, 0xba, 0xf1, 0xa2, 0x11, 0x5a, + 0xc3, 0xa0, 0x11, 0x9c, 0x85, 0x22, 0x0a, 0x8a, 0xdb, 0x68, 0x08, 0x95, 0xac, 0x82, 0x77, 0x53, + 0x75, 0x8b, 0x08, 0x70, 0x7f, 0x0f, 0xba, 0xc5, 0xce, 0xd4, 0x8e, 0x79, 0x58, 0x26, 0x10, 0x4a, + 0xc6, 0xaa, 0x28, 0x53, 0x2c, 0x58, 0xdf, 0x3e, 0x35, 0xfb, 0x46, 0x91, 0x43, 0xb8, 0xff, 0xd1, + 0x28, 0x66, 0xeb, 0xee, 0xc4, 0x42, 0x5a, 0x6a, 0x2c, 0xa7, 0xa5, 0x8b, 0x29, 0x9e, 0xf9, 0x6b, + 0xa5, 0x78, 0x3f, 0x01, 0x27, 0xa0, 0x3c, 0x27, 0xbc, 0x2c, 0x5c, 0xf6, 0xda, 0x72, 0x4e, 0xa3, + 0x33, 0xa1, 0xf0, 0x52, 0xf0, 0x8a, 0x19, 0xcf, 0x92, 0x27, 0x17, 0x22, 0x0e, 0xbf, 0xa5, 0xf6, + 0x0b, 0xde, 0xb9, 0x42, 0x54, 0xbd, 0x2c, 0x95, 0xee, 0xe8, 0x5e, 0x56, 0xd1, 0x96, 0xb3, 0xaa, + 0xb6, 0x1c, 0xca, 0x73, 0x96, 0x4a, 0x91, 0xe5, 0x45, 0x82, 0xac, 0xa0, 0x32, 0x97, 0x74, 0x34, + 0x2f, 0xe6, 0x92, 0x1f, 0x41, 0x37, 0x4e, 0xe2, 0x71, 0x3c, 0x8b, 0x22, 0x4c, 0xe1, 0x75, 0x07, + 0xb6, 0x13, 0x27, 0xf1, 0xa1, 0x46, 0xb1, 0x07, 0xf0, 0x4e, 0x9d, 0x45, 0xd9, 0x73, 0x47, 0x35, + 0x70, 0x6a, 0x7c, 0x64, 0xf5, 0x1b, 0xd0, 0x4b, 0x4e, 0x7f, 0x29, 0xfc, 0x9c, 0x24, 0x36, 0x26, + 0x43, 0xee, 0xaa, 0xc0, 0xad, 0xf0, 0x28, 0xa2, 0x43, 0x6f, 0x2a, 0xdc, 0x2f, 0xc1, 0x29, 0x85, + 0x50, 0x4b, 0x94, 0x1c, 0x68, 0xed, 0x1d, 0xee, 0x0e, 0xfe, 0xa0, 0x67, 0xa0, 0x97, 0xe7, 0x83, + 0x97, 0x03, 0x3e, 0x1c, 0xf4, 0x4c, 0xf4, 0xc0, 0xbb, 0x83, 0xfd, 0xc1, 0x68, 0xd0, 0x6b, 0x7c, + 0xd5, 0xb4, 0xdb, 0x3d, 0x9b, 0x7a, 0x14, 0x51, 0xe8, 0x87, 0xb9, 0x3b, 0x04, 0xa8, 0x72, 0x3a, + 0xf4, 0x37, 0xd5, 0xde, 0x4a, 0xa3, 0x76, 0xae, 0x77, 0xc5, 0x6c, 0x53, 0x9b, 0x9a, 0xf9, 0xba, + 0x6c, 0x53, 0xd1, 0xdd, 0x13, 0xb0, 0x0f, 0xbc, 0xf4, 0x95, 0xea, 0xac, 0x5b, 0x56, 0xf4, 0x33, + 0xdd, 0x50, 0xd3, 0xe1, 0xfb, 0x1e, 0xb4, 0xb5, 0xcb, 0xd3, 0xaf, 0x66, 0xc1, 0x1d, 0x16, 0x34, + 0xf7, 0x4f, 0x0d, 0xb8, 0x75, 0x90, 0x5c, 0x8a, 0x32, 0x83, 0x39, 0xf6, 0xae, 0xa2, 0xc4, 0x0b, + 0xde, 0x62, 0x88, 0x3f, 0x04, 0x90, 0xc9, 0x2c, 0xf3, 0xc5, 0x78, 0x52, 0xf6, 0xf1, 0x1c, 0x85, + 0x79, 0xae, 0x3f, 0x19, 0x08, 0x99, 0x13, 0x51, 0x07, 0x0a, 0x84, 0x91, 0xf4, 0x1e, 0x58, 0xf9, + 0x3c, 0xae, 0xda, 0x86, 0xad, 0x1c, 0x2b, 0x68, 0x77, 0x07, 0x9c, 0xd1, 0x9c, 0x0a, 0xc6, 0x99, + 0x5c, 0x88, 0xc9, 0xc6, 0x1b, 0x62, 0xb2, 0xb9, 0x14, 0x93, 0xff, 0xc7, 0x80, 0x4e, 0x2d, 0xb5, + 0x62, 0x1f, 0x41, 0x33, 0x9f, 0xc7, 0x8b, 0xfd, 0xf6, 0x62, 0x13, 0x4e, 0x24, 0xb4, 0x37, 0xac, + 0x26, 0x3d, 0x29, 0xc3, 0x49, 0x2c, 0x02, 0xbd, 0x24, 0x56, 0x98, 0xdb, 0x1a, 0xc5, 0xf6, 0xe1, + 0xa6, 0xf2, 0x24, 0x45, 0xaf, 0xad, 0xa8, 0x21, 0x3e, 0x5e, 0x4a, 0xe5, 0x54, 0x51, 0xbd, 0x53, + 0x70, 0xa9, 0xee, 0xc2, 0xea, 0x64, 0x01, 0xb9, 0xb6, 0x0d, 0xef, 0x5e, 0xc3, 0xf6, 0xbd, 0xda, + 0x28, 0x77, 0x61, 0x65, 0x34, 0x8f, 0x47, 0xe1, 0x54, 0xc8, 0xdc, 0x9b, 0xa6, 0x94, 0xd3, 0xe8, + 0x48, 0xd0, 0xe4, 0x66, 0x2e, 0xdd, 0x4f, 0xa1, 0x7b, 0x2c, 0x44, 0xc6, 0x85, 0x4c, 0x93, 0x58, + 0xc5, 0x73, 0x49, 0x97, 0xd6, 0x61, 0x47, 0x43, 0xee, 0x1f, 0x82, 0x83, 0x89, 0xfc, 0x53, 0x2f, + 0xf7, 0xcf, 0xbf, 0x4f, 0xa2, 0xff, 0x29, 0xb4, 0x53, 0x65, 0x26, 0x3a, 0xf7, 0xee, 0x92, 0x8f, + 0xd3, 0xa6, 0xc3, 0x0b, 0xa2, 0xcb, 0xa1, 0x71, 0x38, 0x9b, 0xd6, 0x3f, 0x92, 0x35, 0xd5, 0x47, + 0xb2, 0x85, 0xd2, 0xd8, 0x5c, 0x2c, 0x8d, 0xd1, 0xf2, 0xce, 0x92, 0xec, 0x8f, 0xbd, 0x2c, 0x10, + 0x81, 0xae, 0xbf, 0x2b, 0x84, 0xfb, 0x0d, 0x74, 0x0a, 0xcd, 0xec, 0x05, 0xd4, 0x0f, 0x24, 0xd3, + 0xd8, 0x0b, 0x16, 0x2c, 0x45, 0xd5, 0xaf, 0x22, 0x0e, 0xf6, 0x0a, 0x95, 0x2a, 0x60, 0x71, 0x67, + 0xdd, 0xc6, 0x29, 0x8b, 0xf2, 0x67, 0xd0, 0x2d, 0xf2, 0xed, 0x03, 0x91, 0x7b, 0x64, 0x6c, 0x51, + 0x28, 0xe2, 0x9a, 0x21, 0xda, 0x0a, 0x31, 0x92, 0x6f, 0x68, 0x64, 0xbb, 0x9b, 0x60, 0x69, 0x4b, + 0x66, 0xd0, 0xf4, 0x93, 0x40, 0x3d, 0xa0, 0x16, 0xa7, 0x31, 0x8a, 0x63, 0x2a, 0x27, 0x45, 0xf0, + 0x9c, 0xca, 0x89, 0xfb, 0xcf, 0x26, 0xac, 0x3c, 0xf5, 0xfc, 0x8b, 0x59, 0x5a, 0x44, 0xaf, 0x5a, + 0xd1, 0x64, 0x2c, 0x14, 0x4d, 0xf5, 0x02, 0xc9, 0x5c, 0x28, 0x90, 0x16, 0x0e, 0xd4, 0x58, 0x8c, + 0x78, 0xef, 0x43, 0x7b, 0x16, 0x87, 0xf3, 0xe2, 0xd5, 0x39, 0xdc, 0x42, 0x70, 0x24, 0xd9, 0x3a, + 0x74, 0xf0, 0x61, 0x86, 0x31, 0x95, 0x4a, 0x24, 0x10, 0x87, 0xd7, 0x51, 0xf8, 0xd2, 0x3d, 0xdf, + 0x17, 0x52, 0x62, 0xde, 0xa2, 0xd3, 0x6d, 0x47, 0x61, 0x5e, 0x88, 0x2b, 0x72, 0x04, 0xc2, 0xcf, + 0x44, 0x3e, 0xae, 0xca, 0x1e, 0x47, 0x61, 0x90, 0xfc, 0x31, 0xac, 0x48, 0x21, 0x65, 0x98, 0xc4, + 0x63, 0x8a, 0x1c, 0xba, 0x3a, 0xed, 0x6a, 0xe4, 0x08, 0x71, 0xa8, 0x70, 0x2f, 0x4e, 0xe2, 0xab, + 0x69, 0x32, 0x93, 0x3a, 0x18, 0x54, 0x88, 0xa5, 0x68, 0x0d, 0xcb, 0xd1, 0xda, 0xcd, 0x61, 0x65, + 0x30, 0x4f, 0xe9, 0x73, 0xc8, 0x5b, 0x23, 0x7f, 0x4d, 0xac, 0xe6, 0x82, 0x58, 0x6b, 0x02, 0x52, + 0x1d, 0xe7, 0x42, 0x40, 0x98, 0x0b, 0x24, 0xd9, 0xd4, 0xcb, 0x0b, 0xc1, 0x29, 0xc8, 0xfd, 0x4b, + 0x13, 0x1c, 0xa5, 0x32, 0xbc, 0xe6, 0x67, 0xd0, 0xa4, 0x88, 0x6c, 0x50, 0x78, 0x7d, 0x0f, 0x1f, + 0x4e, 0x49, 0xdc, 0x7c, 0x21, 0xae, 0x28, 0x26, 0x13, 0xcb, 0xb5, 0xfd, 0x1c, 0xed, 0xbd, 0x55, + 0x32, 0x4a, 0xde, 0xfb, 0x43, 0x70, 0x94, 0x07, 0x44, 0xbc, 0x6e, 0xf5, 0x13, 0xe2, 0x24, 0xa4, + 0xef, 0x24, 0xb9, 0xc8, 0xa6, 0x5a, 0x5b, 0x34, 0xae, 0xa2, 0xb1, 0xa5, 0x3e, 0xde, 0x10, 0xe0, + 0x9e, 0x43, 0x5b, 0xef, 0x8e, 0xd1, 0xeb, 0xe4, 0xf0, 0xc5, 0xe1, 0xd1, 0xd7, 0x87, 0xbd, 0x1b, + 0x65, 0xd5, 0x6f, 0x54, 0xf1, 0xcd, 0xac, 0xc7, 0xb7, 0x06, 0xe2, 0x77, 0x8e, 0x4e, 0x0e, 0x47, + 0xbd, 0x26, 0x5b, 0x01, 0x87, 0x86, 0x63, 0x3e, 0x78, 0xd9, 0x6b, 0x51, 0x1d, 0xb2, 0xf3, 0xb3, + 0xc1, 0xc1, 0x76, 0xcf, 0x2a, 0x7b, 0x06, 0x6d, 0x8c, 0x23, 0xef, 0xa8, 0x2b, 0xd7, 0xb3, 0xf6, + 0xfa, 0xf7, 0xf3, 0xa6, 0xfa, 0x7e, 0xfe, 0xdb, 0x4d, 0xd4, 0xb7, 0xfe, 0xc5, 0x80, 0x26, 0xfa, + 0x2c, 0xf6, 0x10, 0x9c, 0x9f, 0x09, 0x2f, 0xcb, 0x4f, 0x85, 0x97, 0xb3, 0x05, 0xff, 0xb4, 0xb6, + 0x00, 0xb9, 0x37, 0x9e, 0x18, 0x6c, 0x53, 0x7d, 0x19, 0x2b, 0x3e, 0xf8, 0xad, 0x14, 0x9e, 0x8f, + 0x3c, 0xe3, 0x32, 0xff, 0x06, 0xf1, 0x7f, 0x95, 0x84, 0xf1, 0x8e, 0xfa, 0x5c, 0xc4, 0x96, 0x3d, + 0xe5, 0xf2, 0x0c, 0xf6, 0x08, 0xac, 0x3d, 0x89, 0x2e, 0xf9, 0x55, 0x56, 0x8a, 0xf8, 0x75, 0x6f, + 0xed, 0xde, 0xd8, 0xfa, 0xc7, 0x06, 0x34, 0xbf, 0x11, 0x59, 0xc2, 0x7e, 0x04, 0x6d, 0xdd, 0x4d, + 0x65, 0xb5, 0xae, 0xe9, 0x1a, 0xa5, 0x7c, 0x4b, 0x6d, 0x56, 0xda, 0xa5, 0xa7, 0x92, 0x86, 0xaa, + 0x89, 0xc1, 0xaa, 0x66, 0xef, 0x2b, 0x87, 0xfa, 0x12, 0x7a, 0xc3, 0x3c, 0x13, 0xde, 0xb4, 0xc6, + 0xbe, 0x28, 0xa8, 0xeb, 0x3a, 0x22, 0x24, 0xaf, 0x87, 0x60, 0xa9, 0xb8, 0xb7, 0x34, 0x61, 0xb9, + 0xb9, 0x41, 0xcc, 0xf7, 0xa1, 0x33, 0x3c, 0x4f, 0x66, 0x51, 0x30, 0x14, 0xd9, 0xa5, 0x60, 0xb5, + 0xef, 0x23, 0x6b, 0xb5, 0xb1, 0x7b, 0x83, 0x6d, 0x00, 0x28, 0xd7, 0x8e, 0x15, 0x25, 0x6b, 0x23, + 0xed, 0x70, 0x36, 0x55, 0x8b, 0xd6, 0x7c, 0xbe, 0xe2, 0xac, 0x85, 0xbf, 0x37, 0x71, 0x7e, 0x01, + 0x2b, 0x3b, 0x64, 0x33, 0x47, 0xd9, 0xf6, 0x69, 0x92, 0xe5, 0x6c, 0xf9, 0x1b, 0xc9, 0xda, 0x32, + 0xc2, 0xbd, 0xc1, 0x9e, 0x80, 0x3d, 0xca, 0xae, 0x14, 0xff, 0x3b, 0x3a, 0x6b, 0xa8, 0xf6, 0xbb, + 0xe6, 0x96, 0x5b, 0x7f, 0xdf, 0x00, 0xeb, 0xeb, 0x24, 0xbb, 0x10, 0x19, 0x7b, 0x00, 0x16, 0x75, + 0xa1, 0xb4, 0x19, 0x95, 0x1d, 0xa9, 0xeb, 0x36, 0xfa, 0x04, 0x1c, 0x12, 0xca, 0xc8, 0x93, 0x17, + 0x4a, 0x55, 0xf4, 0xcf, 0x0d, 0x25, 0x17, 0x55, 0x4f, 0x90, 0x5e, 0x57, 0x95, 0xa2, 0xca, 0xa6, + 0xdc, 0x42, 0x6b, 0x68, 0xad, 0xad, 0xfa, 0x3c, 0x43, 0x34, 0xcd, 0x27, 0x06, 0x3a, 0xa3, 0xa1, + 0xba, 0x29, 0x32, 0x55, 0xdf, 0xb1, 0xd7, 0x56, 0x0b, 0x44, 0xb9, 0xf2, 0x63, 0xb0, 0x54, 0xb2, + 0xa9, 0xae, 0xb9, 0x50, 0x41, 0xad, 0xf5, 0xea, 0x28, 0x3d, 0xe1, 0x33, 0xb0, 0xd4, 0x2b, 0x57, + 0x13, 0x16, 0x82, 0x96, 0x3a, 0xb5, 0x0a, 0x7c, 0x8a, 0x55, 0xf9, 0x65, 0xc5, 0xba, 0xe0, 0xa3, + 0x97, 0x58, 0x1f, 0x41, 0x8f, 0x0b, 0x5f, 0x84, 0xb5, 0x34, 0x94, 0x15, 0x97, 0xba, 0xe6, 0xf5, + 0x7d, 0x09, 0x2b, 0x0b, 0x29, 0x2b, 0xeb, 0x93, 0xa0, 0xaf, 0xc9, 0x62, 0x97, 0x27, 0x3f, 0xed, + 0xfd, 0xdb, 0x77, 0x77, 0x8c, 0x7f, 0xff, 0xee, 0x8e, 0xf1, 0x5f, 0xdf, 0xdd, 0x31, 0x7e, 0xf5, + 0xdf, 0x77, 0x6e, 0x9c, 0x5a, 0xf4, 0x8f, 0x9f, 0x2f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x5a, + 0xd1, 0x07, 0x79, 0x35, 0x24, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6174,6 +6266,60 @@ func (m *Group) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *License) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *License) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *License) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if m.ExpiryTs != 0 { + i = encodeVarintPb(dAtA, i, uint64(m.ExpiryTs)) + i-- + dAtA[i] = 0x18 + } + if m.MaxNodes != 0 { + i = encodeVarintPb(dAtA, i, uint64(m.MaxNodes)) + i-- + dAtA[i] = 0x10 + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintPb(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ZeroProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6198,6 +6344,18 @@ func (m *ZeroProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.License != nil { + { + size, err := m.License.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if len(m.Cid) > 0 { i -= len(m.Cid) copy(dAtA[i:], m.Cid) @@ -6305,6 +6463,18 @@ func (m *MembershipState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.License != nil { + { + size, err := m.License.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPb(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } if len(m.Cid) > 0 { i -= len(m.Cid) copy(dAtA[i:], m.Cid) @@ -7150,20 +7320,20 @@ func (m *PostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Splits) > 0 { - dAtA22 := make([]byte, len(m.Splits)*10) - var j21 int + dAtA24 := make([]byte, len(m.Splits)*10) + var j23 int for _, num := range m.Splits { for num >= 1<<7 { - dAtA22[j21] = uint8(uint64(num)&0x7f | 0x80) + dAtA24[j23] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j21++ + j23++ } - dAtA22[j21] = uint8(num) - j21++ + dAtA24[j23] = uint8(num) + j23++ } - i -= j21 - copy(dAtA[i:], dAtA22[:j21]) - i = encodeVarintPb(dAtA, i, uint64(j21)) + i -= j23 + copy(dAtA[i:], dAtA24[:j23]) + i = encodeVarintPb(dAtA, i, uint64(j23)) i-- dAtA[i] = 0x22 } @@ -7977,20 +8147,20 @@ func (m *TxnTimestamps) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Ts) > 0 { - dAtA27 := make([]byte, len(m.Ts)*10) - var j26 int + dAtA29 := make([]byte, len(m.Ts)*10) + var j28 int for _, num := range m.Ts { for num >= 1<<7 { - dAtA27[j26] = uint8(uint64(num)&0x7f | 0x80) + dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j26++ + j28++ } - dAtA27[j26] = uint8(num) - j26++ + dAtA29[j28] = uint8(num) + j28++ } - i -= j26 - copy(dAtA[i:], dAtA27[:j26]) - i = encodeVarintPb(dAtA, i, uint64(j26)) + i -= j28 + copy(dAtA[i:], dAtA29[:j28]) + i = encodeVarintPb(dAtA, i, uint64(j28)) i-- dAtA[i] = 0xa } @@ -8486,20 +8656,20 @@ func (m *BackupPostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Splits) > 0 { - dAtA31 := make([]byte, len(m.Splits)*10) - var j30 int + dAtA33 := make([]byte, len(m.Splits)*10) + var j32 int for _, num := range m.Splits { for num >= 1<<7 { - dAtA31[j30] = uint8(uint64(num)&0x7f | 0x80) + dAtA33[j32] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j30++ + j32++ } - dAtA31[j30] = uint8(num) - j30++ + dAtA33[j32] = uint8(num) + j32++ } - i -= j30 - copy(dAtA[i:], dAtA31[:j30]) - i = encodeVarintPb(dAtA, i, uint64(j30)) + i -= j32 + copy(dAtA[i:], dAtA33[:j32]) + i = encodeVarintPb(dAtA, i, uint64(j32)) i-- dAtA[i] = 0x22 } @@ -8523,20 +8693,20 @@ func (m *BackupPostingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.Uids) > 0 { - dAtA33 := make([]byte, len(m.Uids)*10) - var j32 int + dAtA35 := make([]byte, len(m.Uids)*10) + var j34 int for _, num := range m.Uids { for num >= 1<<7 { - dAtA33[j32] = uint8(uint64(num)&0x7f | 0x80) + dAtA35[j34] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j32++ + j34++ } - dAtA33[j32] = uint8(num) - j32++ + dAtA35[j34] = uint8(num) + j34++ } - i -= j32 - copy(dAtA[i:], dAtA33[:j32]) - i = encodeVarintPb(dAtA, i, uint64(j32)) + i -= j34 + copy(dAtA[i:], dAtA35[:j34]) + i = encodeVarintPb(dAtA, i, uint64(j34)) i-- dAtA[i] = 0xa } @@ -8933,6 +9103,31 @@ func (m *Group) Size() (n int) { return n } +func (m *License) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.User) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.MaxNodes != 0 { + n += 1 + sovPb(uint64(m.MaxNodes)) + } + if m.ExpiryTs != 0 { + n += 1 + sovPb(uint64(m.ExpiryTs)) + } + if m.Enabled { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ZeroProposal) Size() (n int) { if m == nil { return 0 @@ -8976,6 +9171,10 @@ func (m *ZeroProposal) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } + if m.License != nil { + l = m.License.Size() + n += 1 + l + sovPb(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9036,6 +9235,10 @@ func (m *MembershipState) Size() (n int) { if l > 0 { n += 1 + l + sovPb(uint64(l)) } + if m.License != nil { + l = m.License.Size() + n += 1 + l + sovPb(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12303,6 +12506,150 @@ func (m *Group) Unmarshal(dAtA []byte) error { } return nil } +func (m *License) 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: License: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: License: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", 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 < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxNodes", wireType) + } + m.MaxNodes = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxNodes |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpiryTs", wireType) + } + m.ExpiryTs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExpiryTs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + 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 *ZeroProposal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -12660,6 +13007,42 @@ func (m *ZeroProposal) Unmarshal(dAtA []byte) error { } m.Cid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field License", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.License == nil { + m.License = &License{} + } + if err := m.License.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -13086,6 +13469,42 @@ func (m *MembershipState) Unmarshal(dAtA []byte) error { } m.Cid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field License", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPb + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.License == nil { + m.License = &License{} + } + if err := m.License.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) diff --git a/tlstest/acl/docker-compose.yml b/tlstest/acl/docker-compose.yml index 9f5d4976ccd..d007946de78 100644 --- a/tlstest/acl/docker-compose.yml +++ b/tlstest/acl/docker-compose.yml @@ -22,7 +22,7 @@ services: source: $GOPATH/src/github.com/dgraph-io/dgraph/tlstest/tls target: /dgraph-tls read_only: true - command: /gobin/dgraph alpha -o 100 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 --logtostderr -v=2 --tls_dir /dgraph-tls --tls_client_auth VERIFYIFGIVEN --enterprise_features --acl_secret_file /dgraph-acl/hmac-secret + command: /gobin/dgraph alpha -o 100 --my=alpha1:7180 --lru_mb=1024 --zero=zero1:5180 --logtostderr -v=2 --tls_dir /dgraph-tls --tls_client_auth VERIFYIFGIVEN --acl_secret_file /dgraph-acl/hmac-secret zero1: image: dgraph/dgraph:latest container_name: zero1 diff --git a/worker/groups.go b/worker/groups.go index e41f1102ad1..32cc48a297c 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -953,3 +953,11 @@ func (g *groupi) processOracleDeltaStream() { } } } + +// EnterpriseEnabled returns whether enterprise features can be used or not. +func EnterpriseEnabled() bool { + g := groups() + g.RLock() + defer g.RUnlock() + return g.state.GetLicense().GetEnabled() +} diff --git a/x/x.go b/x/x.go index 9484b393ceb..661c39fc587 100644 --- a/x/x.go +++ b/x/x.go @@ -124,7 +124,8 @@ func ShouldCrash(err error) bool { errStr := grpc.ErrorDesc(err) return strings.Contains(errStr, "REUSE_RAFTID") || strings.Contains(errStr, "REUSE_ADDR") || - strings.Contains(errStr, "NO_ADDR") + strings.Contains(errStr, "NO_ADDR") || + strings.Contains(errStr, "ENTERPRISE_LIMIT_REACHED") } // WhiteSpace Replacer removes spaces and tabs from a string.