Merge branch 'master' into delete

This commit is contained in:
tgruben 2021-04-09 10:26:30 -05:00 committed by GitHub
commit a60c70b2a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 331 additions and 163 deletions

1
api.go
View file

@ -1590,7 +1590,6 @@ func (api *API) ImportValueWithTx(ctx context.Context, qcx *Qcx, req *ImportValu
// if we're importing into a specific shard
if req.Shard != math.MaxUint64 {
// Check that column IDs match the stated shard.
if s1, s2 := req.ColumnIDs[0]/ShardWidth, req.ColumnIDs[len(req.ColumnIDs)-1]/ShardWidth; s1 != s2 && s2 != req.Shard {
return errors.Errorf("shard %d specified, but import spans shards %d to %d", req.Shard, s1, s2)

View file

@ -17,6 +17,7 @@ package pilosa_test
import (
"context"
"crypto/rand"
"errors"
"fmt"
"math"
"reflect"
@ -461,11 +462,10 @@ func TestAPI_ImportValue(t *testing.T) {
}
// Generate some records.
t0 := time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC)
values := []time.Time{}
colIDs := []uint64{}
for i := 0; i < 10; i++ {
values = append(values, t0.AddDate(0, 1, 0))
values = append(values, pilosa.MinTimestamp.Add(time.Duration(i)*time.Second))
colIDs = append(colIDs, uint64(i))
}
@ -478,13 +478,13 @@ func TestAPI_ImportValue(t *testing.T) {
TimestampValues: values,
}
qcx := m1.API.Txf().NewQcx()
if err := m1.API.ImportValue(ctx, qcx, req); err != nil {
qcx := m2.API.Txf().NewQcx()
if err := m2.API.ImportValue(ctx, qcx, req); err != nil {
t.Fatal(err)
}
PanicOn(qcx.Finish())
query := fmt.Sprintf("Row(%s>6)", field)
query := fmt.Sprintf("Row(%s>'1833-11-24T17:31:50Z')", field)
// Query node0.
if res, err := m0.API.Query(ctx, &pilosa.QueryRequest{Index: index, Query: query}); err != nil {
@ -699,38 +699,116 @@ func TestAPI_IDAlloc(t *testing.T) {
primary := c.GetPrimary().API
key := pilosa.IDAllocKey{
Index: "index",
Key: "key",
}
var session [32]byte
_, err := rand.Read(session[:])
if err != nil {
t.Fatalf("obtaining random bytes: %v", err)
}
t.Run("Normal", func(t *testing.T) {
key := pilosa.IDAllocKey{
Index: "normal",
Key: "key",
}
var session [32]byte
_, err := rand.Read(session[:])
if err != nil {
t.Fatalf("obtaining random bytes: %v", err)
}
const toReserve = 2
const toReserve = 2
ids, err := primary.ReserveIDs(key, session, ^uint64(0), toReserve)
if err != nil {
t.Fatalf("reserving IDs: %v", err)
}
ids, err := primary.ReserveIDs(key, session, ^uint64(0), toReserve)
if err != nil {
t.Fatalf("reserving IDs: %v", err)
}
var numIds uint64
for _, idr := range ids {
numIds += (idr.Last - idr.First) + 1
}
if numIds != toReserve {
t.Errorf("expected %d ids but got %d: %v", toReserve, numIds, ids)
}
var numIds uint64
for _, idr := range ids {
numIds += (idr.Last - idr.First) + 1
}
if numIds != toReserve {
t.Errorf("expected %d ids but got %d: %v", toReserve, numIds, ids)
}
err = primary.CommitIDs(key, session, numIds)
if err != nil {
t.Fatalf("committing IDs: %v", err)
}
err = primary.CommitIDs(key, session, numIds)
if err != nil {
t.Fatalf("committing IDs: %v", err)
}
err = primary.ResetIDAlloc(key.Index)
if err != nil {
t.Fatalf("resetting ID alloc: %v", err)
}
err = primary.ResetIDAlloc(key.Index)
if err != nil {
t.Fatalf("resetting ID alloc: %v", err)
}
})
t.Run("Offset", func(t *testing.T) {
key := pilosa.IDAllocKey{
Index: "offset",
Key: "key",
}
var session [32]byte
_, err := rand.Read(session[:])
if err != nil {
t.Fatalf("obtaining random bytes: %v", err)
}
ids, err := primary.ReserveIDs(key, session, 0, 2)
if err != nil {
t.Fatalf("reserving IDs: %v", err)
}
{
var numIds uint64
for _, idr := range ids {
numIds += (idr.Last - idr.First) + 1
}
if numIds != 2 {
t.Errorf("expected %d ids but got %d: %v", 2, numIds, ids)
}
}
_, err = rand.Read(session[:])
if err != nil {
t.Fatalf("obtaining random bytes: %v", err)
}
ids2, err := primary.ReserveIDs(key, session, 1, 2)
if err != nil {
t.Fatalf("reserving IDs with partially increased offset: %v", err)
}
var numIds uint64
for _, idr := range ids2 {
numIds += (idr.Last - idr.First) + 1
}
if numIds != 2 {
t.Errorf("expected %d ids but got %d: %v", 2, numIds, ids2)
}
if prevEnd, newStart := ids[len(ids)-1].Last, ids2[0].First; prevEnd != newStart {
t.Errorf("expected reuse of last ID (%d), but started with %d", prevEnd, newStart)
}
err = primary.CommitIDs(key, session, numIds)
if err != nil {
t.Errorf("committing IDs: %v", err)
}
_, err = rand.Read(session[:])
if err != nil {
t.Fatalf("obtaining random bytes: %v", err)
}
ids3, err := primary.ReserveIDs(key, session, 0, 2)
var esync pilosa.ErrIDOffsetDesync
if errors.As(err, &esync) {
if esync.Requested != 0 {
t.Errorf("incorrect requested offset in error: provided %d but got %d", 0, esync.Requested)
}
if esync.Base != 3 {
t.Errorf("incorrect base offset: expected %d but got %d", 3, esync.Base)
}
} else if err == nil {
t.Errorf("successfully re-reserved at a committed offset: %v", ids3)
} else {
t.Fatalf("unexpected error when reserving committed IDs: %v", err)
}
err = primary.ResetIDAlloc(key.Index)
if err != nil {
t.Fatalf("resetting ID alloc: %v", err)
}
})
}

View file

@ -690,6 +690,7 @@ func (s Serializer) encodeFieldOptions(o *pilosa.FieldOptions) *pb.FieldOptions
Scale: o.Scale,
BitDepth: uint64(o.BitDepth),
TimeQuantum: string(o.TimeQuantum),
TimeUnit: string(o.TimeUnit),
Keys: o.Keys,
ForeignIndex: o.ForeignIndex,
}
@ -1050,6 +1051,7 @@ func (s Serializer) decodeFieldOptions(options *pb.FieldOptions, m *pilosa.Field
m.Scale = options.Scale
m.BitDepth = uint64(options.BitDepth)
m.TimeQuantum = pilosa.TimeQuantum(options.TimeQuantum)
m.TimeUnit = options.TimeUnit
m.Keys = options.Keys
m.ForeignIndex = options.ForeignIndex
}

View file

@ -8272,7 +8272,7 @@ func getScaledInt(f *Field, v interface{}) (int64, error) {
} else if opt.Type == FieldTypeTimestamp {
switch tv := v.(type) {
case time.Time:
value = tv.UnixNano()
value = tv.UnixNano() / TimeUnitNano(f.options.TimeUnit)
default:
return 0, errors.Errorf("unexpected timestamp value type %T, val %v", tv, tv)
}

View file

@ -1029,7 +1029,7 @@ func TestExecutor_Execute_SetValue(t *testing.T) {
t.Fatal(err)
} else if !exists {
t.Fatal("expected value to exist")
} else if value != time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC).UnixNano() {
} else if value != time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC).UnixNano()/int64(time.Second) {
t.Fatalf("unexpected value: %v", value)
}
@ -1037,7 +1037,7 @@ func TestExecutor_Execute_SetValue(t *testing.T) {
t.Fatal(err)
} else if !exists {
t.Fatal("expected value to exist")
} else if value != time.Date(2000, time.January, 2, 0, 0, 0, 0, time.UTC).UnixNano() {
} else if value != time.Date(2000, time.January, 2, 0, 0, 0, 0, time.UTC).UnixNano()/int64(time.Second) {
t.Fatalf("unexpected value: %v", value)
}
})

View file

@ -210,8 +210,8 @@ func OptFieldTypeInt(min, max int64) FieldOption {
// provide any respective configuration values.
func OptFieldTypeTimestamp(min, max time.Time, timeUnit string) FieldOption {
return func(fo *FieldOptions) error {
minNano := min.UnixNano()
maxNano := max.UnixNano()
minValue := min.UnixNano() / TimeUnitNano(timeUnit)
maxValue := max.UnixNano() / TimeUnitNano(timeUnit)
if fo.Type != "" {
return errors.Errorf("field type is already set to: %s", fo.Type)
}
@ -220,14 +220,18 @@ func OptFieldTypeTimestamp(min, max time.Time, timeUnit string) FieldOption {
} else if !IsValidTimeUnit(timeUnit) {
return errors.Errorf("invalid time unit: %q", fo.TimeUnit)
}
if min.After(max) {
if min.Before(MinTimestamp) {
return errors.New("timestamp field min is too low")
} else if max.After(MaxTimestamp) {
return errors.New("timestamp field max is too high")
} else if min.After(max) {
return errors.New("timestamp field min cannot be greater than max")
}
fo.Type = FieldTypeTimestamp
fo.TimeUnit = timeUnit
fo.Min = pql.NewDecimal(minNano, 0)
fo.Max = pql.NewDecimal(maxNano, 0)
fo.Base = bsiBase(minNano, maxNano)
fo.Min = pql.NewDecimal(minValue, 0)
fo.Max = pql.NewDecimal(maxValue, 0)
fo.Base = bsiBase(minValue, maxValue)
return nil
}
}
@ -1417,7 +1421,7 @@ func (f *Field) MaxForShard(tx Tx, shard uint64, filter *Row) (ValCount, error)
dec := pql.NewDecimal(max+bsig.Base, bsig.Scale)
valCount.DecimalVal = &dec
} else if f.Options().Type == FieldTypeTimestamp {
valCount.TimestampVal = time.Unix(0, (max + bsig.Base)).UTC()
valCount.TimestampVal = time.Unix(0, (max+bsig.Base)*TimeUnitNano(f.options.TimeUnit)).UTC()
} else {
valCount.Val = max + bsig.Base
}
@ -1463,7 +1467,7 @@ func (f *Field) MinForShard(tx Tx, shard uint64, filter *Row) (ValCount, error)
dec := pql.NewDecimal(min+bsig.Base, bsig.Scale)
valCount.DecimalVal = &dec
} else if f.Options().Type == FieldTypeTimestamp {
valCount.TimestampVal = time.Unix(0, (min + bsig.Base)).UTC()
valCount.TimestampVal = time.Unix(0, (min+bsig.Base)*TimeUnitNano(f.options.TimeUnit)).UTC()
} else {
valCount.Val = min + bsig.Base
}
@ -1907,20 +1911,20 @@ func (o *FieldOptions) MarshalJSON() ([]byte, error) {
})
case FieldTypeTimestamp:
return json.Marshal(struct {
Type string `json:"type"`
Base int64 `json:"base"`
BitDepth uint64 `json:"bitDepth"`
Min pql.Decimal `json:"min"`
Max pql.Decimal `json:"max"`
Keys bool `json:"keys"`
TimeUnit string `json:"timeUnit"`
ForeignIndex string `json:"foreignIndex"`
Type string `json:"type"`
BaseTimestamp time.Time `json:"baseTimestamp"`
BitDepth uint64 `json:"bitDepth"`
MinTimestamp time.Time `json:"minTimestamp"`
MaxTimestamp time.Time `json:"maxTimestamp"`
Keys bool `json:"keys"`
TimeUnit string `json:"timeUnit"`
ForeignIndex string `json:"foreignIndex"`
}{
o.Type,
o.Base,
time.Unix(0, o.Base*TimeUnitNano(o.TimeUnit)).UTC(),
o.BitDepth,
o.Min,
o.Max,
time.Unix(0, o.Min.Value*TimeUnitNano(o.TimeUnit)).UTC(),
time.Unix(0, o.Max.Value*TimeUnitNano(o.TimeUnit)).UTC(),
o.Keys,
o.TimeUnit,
o.ForeignIndex,
@ -2136,8 +2140,8 @@ func (f *Field) persistView(ctx context.Context, cvm *CreateViewMessage) error {
// Timestamp field range.
var (
MinTimestamp = time.Unix(-1<<42, 0).UTC()
MaxTimestamp = time.Unix(1<<42, 0).UTC()
MinTimestamp = time.Unix(-1<<32, 0).UTC() // 1833-11-24T17:31:44Z
MaxTimestamp = time.Unix(1<<32, 0).UTC() // 2106-02-07T06:28:16Z
)
// List of time units.

View file

@ -2372,8 +2372,8 @@ func (h *Handler) handlePostImportAtomicRecord(w http.ResponseWriter, r *http.Re
// handlePostImport handles /import requests.
func (h *Handler) handlePostImport(w http.ResponseWriter, r *http.Request) {
// Verify that request is only communicating over protobufs.
if error, code := validateProtobufHeader(r); error != "" {
http.Error(w, error, code)
if err, code := validateProtobufHeader(r); err != "" {
http.Error(w, err, code)
return
}
@ -2392,7 +2392,7 @@ func (h *Handler) handlePostImport(w http.ResponseWriter, r *http.Request) {
fieldName := mux.Vars(r)["field"]
field := index.Field(fieldName)
if field == nil {
http.Error(w, err.Error(), http.StatusNotFound)
http.Error(w, pilosa.ErrFieldNotFound.Error(), http.StatusNotFound)
return
}
@ -2921,10 +2921,27 @@ func (h *Handler) handleReserveIDs(w http.ResponseWriter, r *http.Request) {
ids, err := h.api.ReserveIDs(req.Key, req.Session, req.Offset, req.Count)
if err != nil {
var esync pilosa.ErrIDOffsetDesync
if errors.As(err, &esync) {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusConflict)
err = json.NewEncoder(w).Encode(struct {
pilosa.ErrIDOffsetDesync
Err string `json:"error"`
}{
ErrIDOffsetDesync: esync,
Err: err.Error(),
})
if err != nil {
h.logger.Debugf("failed to send desync error: %v", err)
}
return
}
http.Error(w, fmt.Sprintf("reserving IDs: %v", err.Error()), http.StatusBadRequest)
return
}
w.Header().Add("Content-Type", "application/json")
err = json.NewEncoder(w).Encode(ids)
if err != nil {
http.Error(w, "encoding result", http.StatusBadRequest)

View file

@ -16,6 +16,7 @@ package pilosa
import (
"encoding/binary"
"fmt"
"math/bits"
"sort"
"time"
@ -71,6 +72,21 @@ func (ida *idAllocator) Close() error {
return ida.db.Close()
}
// ErrIDOffsetDesync is an error generated when attempting to reserve IDs at a committed offset.
// This will typically happen when kafka partitions are moved between kafka ingesters - there may be a brief period in which 2 ingesters are processing the same messages at the same time.
// The ingester can resolve this by ignoring messages under base.
type ErrIDOffsetDesync struct {
// Requested is the offset that the client attempted to reserve.
Requested uint64 `json:"requested"`
// Base is the next uncommitted offset for which IDs may be reserved.
Base uint64 `json:"base"`
}
func (err ErrIDOffsetDesync) Error() string {
return fmt.Sprintf("attempted to reserve IDs at committed offset %d (base offset: %d)", err.Requested, err.Base)
}
func (ida *idAllocator) reserve(key IDAllocKey, session [32]byte, offset, count uint64) ([]IDRange, error) {
if session == [32]byte{} {
return nil, errors.New("detected a broken session key")
@ -94,9 +110,12 @@ func (ida *idAllocator) reserve(key IDAllocKey, session [32]byte, offset, count
if offset != ^uint64(0) && offset != res.offset {
// Offset control is in use and the offset differs.
if offset < res.offset {
// The client is confused.
// Abort before we break something.
return errors.New("unable to rewind ID generation")
// This probbably means that 2 clients are running at the same time.
// This is fine - just tell the client that is behind what had been dealt with.
return ErrIDOffsetDesync{
Requested: offset,
Base: res.offset,
}
}
// Roll the IDs forward.

View file

@ -12,9 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
// package ctl contains all pilosa subcommands other than 'server'. These are
// generally administration, testing, and debugging tools.
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: private.proto
@ -109,6 +106,7 @@ type FieldOptions struct {
ForeignIndex string `protobuf:"bytes,16,opt,name=ForeignIndex,proto3" json:"ForeignIndex,omitempty"`
Min *Decimal `protobuf:"bytes,17,opt,name=Min,proto3" json:"Min,omitempty"`
Max *Decimal `protobuf:"bytes,18,opt,name=Max,proto3" json:"Max,omitempty"`
TimeUnit string `protobuf:"bytes,19,opt,name=TimeUnit,proto3" json:"TimeUnit,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -245,6 +243,13 @@ func (m *FieldOptions) GetMax() *Decimal {
return nil
}
func (m *FieldOptions) GetTimeUnit() string {
if m != nil {
return m.TimeUnit
}
return ""
}
type ImportResponse struct {
Err string `protobuf:"bytes,1,opt,name=Err,proto3" json:"Err,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -2534,97 +2539,98 @@ func init() {
func init() { proto.RegisterFile("private.proto", fileDescriptor_d2a91b51c7bdc125) }
var fileDescriptor_d2a91b51c7bdc125 = []byte{
// 1436 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x6e, 0x1b, 0xc5,
0x17, 0xff, 0xef, 0x87, 0x63, 0xfb, 0x38, 0x4e, 0x9c, 0xf9, 0x47, 0x65, 0xfb, 0x41, 0xe4, 0x0e,
0x88, 0x86, 0x4a, 0x44, 0xa2, 0x5c, 0x14, 0xc1, 0x4d, 0x93, 0x38, 0x2d, 0xa6, 0xa4, 0x0d, 0xe3,
0xb4, 0xb7, 0x68, 0xbc, 0x1e, 0x35, 0xab, 0xac, 0x77, 0xcd, 0x7e, 0xa4, 0x76, 0x2f, 0x90, 0x40,
0x20, 0x78, 0x00, 0x2e, 0x78, 0x11, 0xde, 0x81, 0x1b, 0x24, 0x1e, 0x01, 0x95, 0x17, 0x41, 0x73,
0x66, 0x66, 0x77, 0xed, 0xba, 0x35, 0x44, 0xdc, 0xed, 0xf9, 0x9d, 0x99, 0x73, 0x7e, 0xe7, 0x63,
0xce, 0xcc, 0x42, 0x7b, 0x92, 0x04, 0x17, 0x3c, 0x13, 0x7b, 0x93, 0x24, 0xce, 0x62, 0x62, 0x4f,
0x86, 0xd7, 0xd6, 0x27, 0xf9, 0x30, 0x0c, 0x7c, 0x85, 0xd0, 0x07, 0xd0, 0xec, 0x47, 0x23, 0x31,
0x3d, 0x16, 0x19, 0x27, 0x04, 0xdc, 0x87, 0x62, 0x96, 0x7a, 0x4e, 0xd7, 0xda, 0x6d, 0x30, 0xfc,
0x26, 0xef, 0xc1, 0xc6, 0x69, 0xc2, 0xfd, 0xf3, 0xa3, 0x69, 0x90, 0x66, 0x22, 0xf2, 0x85, 0xe7,
0xa2, 0x76, 0x01, 0xa5, 0x3f, 0x3b, 0xb0, 0x7e, 0x3f, 0x10, 0xe1, 0xe8, 0xf1, 0x24, 0x0b, 0xe2,
0x28, 0x95, 0xc6, 0x4e, 0x67, 0x13, 0xe1, 0x35, 0xba, 0xd6, 0x6e, 0x93, 0xe1, 0x37, 0xb9, 0x01,
0xcd, 0x43, 0xee, 0x9f, 0x09, 0x54, 0x38, 0xa8, 0x28, 0x81, 0x42, 0x3b, 0x08, 0x5e, 0x28, 0x2f,
0x6d, 0x56, 0x02, 0xa4, 0x0b, 0xad, 0xd3, 0x60, 0x2c, 0xbe, 0xcc, 0x79, 0x94, 0xe5, 0x63, 0xaf,
0x86, 0xbb, 0xab, 0x10, 0xb9, 0x02, 0x6b, 0x8f, 0xc3, 0xd1, 0x71, 0x10, 0x79, 0xcd, 0xae, 0xb5,
0xeb, 0x30, 0x2d, 0x19, 0x9c, 0x4f, 0x3d, 0x28, 0x71, 0x3e, 0x2d, 0xc2, 0x6d, 0xcd, 0x87, 0xfb,
0x28, 0x1e, 0x64, 0x3c, 0x1a, 0xf1, 0x64, 0xf4, 0x34, 0x10, 0xcf, 0xbd, 0x75, 0x15, 0xee, 0x3c,
0x2a, 0xf7, 0x1e, 0xf0, 0x54, 0x78, 0x6d, 0xb4, 0x88, 0xdf, 0xe4, 0x1a, 0x34, 0x0e, 0x82, 0xac,
0x27, 0x26, 0xd9, 0x99, 0xb7, 0xd1, 0xb5, 0x76, 0x5d, 0x56, 0xc8, 0x64, 0x1b, 0x6a, 0x03, 0x9f,
0x87, 0xc2, 0xdb, 0xc4, 0x0d, 0x4a, 0x20, 0x14, 0xd6, 0xef, 0xc7, 0x89, 0x08, 0x9e, 0x45, 0x58,
0x04, 0xaf, 0x83, 0x41, 0xcd, 0x61, 0xe4, 0x6d, 0x70, 0x64, 0x48, 0x5b, 0x5d, 0x6b, 0xb7, 0x75,
0xa7, 0xb5, 0x37, 0x19, 0xee, 0xf5, 0x84, 0x1f, 0x8c, 0x79, 0xc8, 0x24, 0x8e, 0x6a, 0x3e, 0xf5,
0xc8, 0x32, 0x35, 0x9f, 0x52, 0x0a, 0x1b, 0xfd, 0xf1, 0x24, 0x4e, 0x32, 0x26, 0xd2, 0x49, 0x1c,
0xa5, 0x82, 0x74, 0xc0, 0x39, 0x4a, 0x12, 0xcf, 0x42, 0x57, 0xf2, 0x93, 0x7e, 0x03, 0x9d, 0x83,
0x30, 0xf6, 0xcf, 0x7b, 0x3c, 0xe3, 0x4c, 0x7c, 0x9d, 0x8b, 0x34, 0x93, 0x7c, 0x15, 0x25, 0xb5,
0x4e, 0x09, 0x12, 0xc5, 0x1a, 0x7b, 0xb6, 0x42, 0x51, 0x90, 0xb9, 0xc0, 0x4c, 0xa9, 0x92, 0xe0,
0x37, 0xc6, 0x7b, 0xc6, 0x93, 0x11, 0xd6, 0xd1, 0x65, 0x4a, 0x90, 0x28, 0x7a, 0xc2, 0xda, 0xbb,
0x4c, 0x09, 0xb4, 0x0f, 0x5b, 0x15, 0xff, 0x9a, 0xe6, 0x15, 0x58, 0x63, 0xf1, 0xf3, 0x7e, 0x2f,
0xf5, 0xac, 0xae, 0xb3, 0xeb, 0x32, 0x2d, 0x61, 0x93, 0xc4, 0x61, 0x3e, 0x8e, 0xa4, 0xca, 0x46,
0x55, 0x09, 0xd0, 0xab, 0x50, 0xc3, 0x8e, 0x91, 0x51, 0x96, 0x7b, 0xe5, 0x27, 0xfd, 0xd6, 0x82,
0xe6, 0x31, 0x9f, 0x22, 0x91, 0x94, 0xdc, 0x85, 0x86, 0xa9, 0x27, 0x2e, 0x6a, 0xdd, 0xb9, 0x2e,
0x73, 0x57, 0x2c, 0xd8, 0x33, 0xda, 0xa3, 0x28, 0x4b, 0x66, 0xac, 0x58, 0x7c, 0xed, 0x53, 0x68,
0xcf, 0xa9, 0xa4, 0xa7, 0x73, 0x31, 0x33, 0xf9, 0x3c, 0x17, 0x33, 0x19, 0xe5, 0x05, 0x0f, 0x73,
0x81, 0x59, 0x72, 0x99, 0x12, 0x3e, 0xb1, 0x3f, 0xb6, 0xe8, 0x53, 0x20, 0x87, 0x89, 0xe0, 0x99,
0x40, 0x27, 0xc7, 0x22, 0x4d, 0xf9, 0x33, 0xb1, 0x2a, 0xd7, 0x4e, 0x35, 0xd7, 0x45, 0x5e, 0xed,
0x4a, 0x5e, 0xe9, 0x6d, 0x20, 0x3d, 0x11, 0x8a, 0x4c, 0xe8, 0xb3, 0xfc, 0x06, 0xbb, 0xf4, 0xdc,
0x70, 0x58, 0xbd, 0x96, 0xdc, 0x04, 0x57, 0x0e, 0x06, 0x74, 0xd6, 0xba, 0xd3, 0x96, 0x19, 0x2a,
0xa6, 0x05, 0x43, 0x15, 0xd6, 0x03, 0xcd, 0x8d, 0xf6, 0x33, 0xa4, 0xea, 0xb0, 0x12, 0xa0, 0xdf,
0x5b, 0xc6, 0x1b, 0xd2, 0xff, 0x87, 0x11, 0xcf, 0x75, 0xd7, 0xbb, 0x9a, 0x83, 0x83, 0x1c, 0x3a,
0x92, 0x43, 0x75, 0xce, 0x2c, 0xa3, 0xe1, 0x2e, 0xd2, 0xb8, 0x67, 0xf2, 0x73, 0x59, 0x16, 0xd4,
0x87, 0xeb, 0xca, 0xc2, 0xfe, 0x05, 0x0f, 0x42, 0x3e, 0x0c, 0xff, 0x55, 0x09, 0xe7, 0x02, 0xf2,
0xa0, 0x8e, 0x7b, 0xfb, 0x3d, 0x7d, 0x0c, 0x8c, 0x48, 0x73, 0x28, 0x4f, 0xd4, 0x23, 0x3e, 0x16,
0xda, 0x1a, 0x7e, 0x17, 0x79, 0xb0, 0xdf, 0x98, 0x87, 0x6d, 0xa8, 0xc9, 0xf3, 0x27, 0x67, 0xb8,
0x23, 0x5d, 0xa2, 0xb0, 0x22, 0x3b, 0x1f, 0xc0, 0xda, 0xc0, 0x3f, 0x13, 0x63, 0x4e, 0xde, 0x81,
0x3a, 0x32, 0x17, 0xa9, 0x3e, 0x14, 0xcd, 0xa2, 0xe4, 0xcc, 0x68, 0xe8, 0x0f, 0x96, 0x0e, 0x76,
0x29, 0xcd, 0x39, 0x57, 0xf6, 0x82, 0x2b, 0x72, 0x0b, 0xea, 0x9a, 0x2f, 0x4e, 0x8b, 0x57, 0x7a,
0xca, 0x68, 0xc9, 0x4d, 0x58, 0xc3, 0xe8, 0x52, 0xcf, 0x2d, 0x89, 0x20, 0xc2, 0xb4, 0x82, 0x1e,
0x81, 0xf3, 0x84, 0xf5, 0xe5, 0xa0, 0x40, 0xf6, 0x86, 0x86, 0x96, 0x24, 0xb9, 0xcf, 0xe2, 0x34,
0xd3, 0xb9, 0xc7, 0x6f, 0x89, 0x9d, 0xc4, 0x89, 0xea, 0xd3, 0x36, 0xc3, 0x6f, 0xfa, 0x93, 0x05,
0xee, 0xa3, 0x78, 0x24, 0xc8, 0x06, 0xd8, 0xfd, 0x9e, 0x36, 0x62, 0xf7, 0x7b, 0xe4, 0x2a, 0xda,
0xd7, 0xf9, 0xae, 0x4b, 0xff, 0x4f, 0x58, 0x9f, 0xa1, 0xcf, 0x1b, 0xd0, 0xec, 0xa7, 0x27, 0x49,
0x30, 0xe6, 0xc9, 0x4c, 0xdf, 0x96, 0x25, 0x80, 0x67, 0x34, 0xe3, 0x99, 0xba, 0xc3, 0x9a, 0x4c,
0x09, 0xe4, 0x26, 0xd4, 0x1f, 0xb0, 0x93, 0x43, 0x69, 0xb2, 0x36, 0x6f, 0xd2, 0xe0, 0xf4, 0x1e,
0x74, 0x24, 0x13, 0x5c, 0x6f, 0x3a, 0xeb, 0x0a, 0xac, 0x49, 0xac, 0x60, 0xa6, 0xa5, 0xd2, 0x89,
0x5d, 0x71, 0x42, 0xef, 0x2b, 0x0b, 0x47, 0x17, 0x22, 0xca, 0x2a, 0xbd, 0x89, 0x32, 0x1a, 0x68,
0x33, 0x25, 0x90, 0x1b, 0x2a, 0x6a, 0x1d, 0x5e, 0x43, 0x72, 0x91, 0x32, 0x43, 0x94, 0xce, 0x00,
0x0c, 0x93, 0x3c, 0x2d, 0xd6, 0x5a, 0xcb, 0xd6, 0x12, 0x6a, 0xda, 0x47, 0x1f, 0x51, 0x90, 0x7a,
0x85, 0x30, 0xd3, 0x58, 0xef, 0x97, 0x8d, 0xa5, 0xea, 0xb9, 0x59, 0xd4, 0x5d, 0xf9, 0x28, 0xdb,
0xeb, 0x0c, 0x5a, 0x15, 0x7c, 0x69, 0x8f, 0xdd, 0x2a, 0x9a, 0xc3, 0x2e, 0x8d, 0x21, 0xa2, 0x8d,
0x69, 0xf5, 0x8a, 0xe1, 0x14, 0x40, 0xab, 0xb2, 0x69, 0xa9, 0xa7, 0x5d, 0xd8, 0x9c, 0x3f, 0xf0,
0xe6, 0xce, 0x59, 0x84, 0x57, 0xb8, 0xfa, 0xd1, 0x82, 0xf6, 0x61, 0x98, 0xa7, 0x99, 0x48, 0x8a,
0x9c, 0x36, 0x35, 0x50, 0x94, 0xb6, 0x04, 0x96, 0x57, 0x97, 0xec, 0x40, 0x4d, 0x66, 0x5c, 0x1d,
0xee, 0x6a, 0x21, 0x14, 0x5c, 0xa9, 0x84, 0xfb, 0xba, 0x4a, 0xd0, 0xa7, 0xd0, 0x38, 0x18, 0xf4,
0x1f, 0x24, 0x71, 0x3e, 0x59, 0x1a, 0xb1, 0x79, 0xb6, 0xd9, 0x95, 0x67, 0x5b, 0x47, 0x3d, 0x41,
0x54, 0x54, 0xf8, 0xea, 0xe8, 0xa8, 0x57, 0x87, 0xab, 0x11, 0x3e, 0xa5, 0x03, 0xd8, 0x52, 0xe1,
0xca, 0x89, 0x73, 0x99, 0xb1, 0x68, 0x5e, 0x11, 0x4e, 0xf9, 0x8a, 0x90, 0x46, 0xd5, 0xd4, 0xfd,
0x2f, 0x8d, 0xfe, 0x6e, 0xc3, 0x16, 0x13, 0x69, 0xf0, 0x42, 0xf4, 0xa3, 0x34, 0x4b, 0x72, 0x5f,
0x4e, 0x1c, 0xb9, 0xff, 0xf3, 0x78, 0xa8, 0x6b, 0xe1, 0x30, 0x25, 0xbc, 0xf9, 0x94, 0x10, 0x0a,
0xf5, 0xea, 0x10, 0xa8, 0x2e, 0x30, 0x0a, 0x72, 0x1b, 0xea, 0x83, 0x38, 0x4f, 0xfc, 0xa2, 0xf3,
0x71, 0x72, 0x2b, 0xff, 0x4a, 0xc1, 0xcc, 0x02, 0xf2, 0x10, 0xc8, 0x69, 0xc2, 0xa3, 0x34, 0xe4,
0x92, 0x92, 0xd9, 0xd6, 0x28, 0x9f, 0x27, 0x15, 0xed, 0x9c, 0x85, 0x25, 0xdb, 0xc8, 0x5e, 0xf5,
0x08, 0x7b, 0x75, 0xe4, 0xb7, 0x61, 0xf8, 0xe9, 0x73, 0x52, 0x3d, 0xe4, 0x77, 0x17, 0x3a, 0xd4,
0x5b, 0xc3, 0x2d, 0x5b, 0x72, 0xcb, 0x9c, 0x82, 0xcd, 0xaf, 0xa3, 0xdf, 0x59, 0xb0, 0x5e, 0x65,
0xb3, 0x62, 0x5c, 0x14, 0xe5, 0xb3, 0x57, 0xbf, 0x76, 0x4c, 0xf9, 0xdc, 0x65, 0x2f, 0xcb, 0x5a,
0xf5, 0x05, 0x14, 0xc3, 0x5b, 0xaf, 0x49, 0xce, 0xa5, 0xe8, 0x74, 0xa1, 0x75, 0xc2, 0x93, 0x2c,
0x90, 0xc6, 0xf4, 0x3d, 0x5d, 0x63, 0x55, 0x88, 0x0a, 0xb8, 0xfa, 0x4a, 0x13, 0x1d, 0xc6, 0xe3,
0x89, 0xec, 0xd6, 0x4b, 0x35, 0x93, 0x1c, 0xd3, 0x49, 0x12, 0x27, 0x26, 0x03, 0x28, 0xd0, 0x03,
0x68, 0x9c, 0xc6, 0x93, 0x38, 0x8c, 0x9f, 0xcd, 0x56, 0x8c, 0x0c, 0x0f, 0xea, 0xea, 0x6a, 0x50,
0x23, 0xaa, 0xc9, 0x8c, 0x48, 0xff, 0x2f, 0xfb, 0xdd, 0xe7, 0xa1, 0x9f, 0x87, 0x3c, 0x13, 0xf8,
0x3e, 0x46, 0xf0, 0x8b, 0x98, 0x8f, 0xd4, 0x54, 0xd0, 0x47, 0x8b, 0x7e, 0xa5, 0x1b, 0x90, 0x63,
0x38, 0x95, 0x2b, 0x68, 0x1f, 0x01, 0x73, 0x05, 0x29, 0x89, 0x7c, 0x08, 0xad, 0xca, 0x6a, 0x1d,
0xd6, 0x66, 0xd1, 0xa7, 0x0a, 0x66, 0xd5, 0x35, 0xf4, 0x57, 0x6b, 0x6e, 0xcf, 0x2b, 0x77, 0xae,
0x76, 0x75, 0xa1, 0x92, 0xd4, 0x60, 0x5a, 0x92, 0xa1, 0x1f, 0x4d, 0xfd, 0x30, 0x4f, 0xa5, 0x4a,
0x5f, 0xb8, 0x05, 0x20, 0x43, 0x97, 0xff, 0x81, 0x71, 0x6e, 0x1e, 0x37, 0x46, 0x94, 0xbf, 0x64,
0x3d, 0xc1, 0x47, 0x61, 0x10, 0x09, 0xec, 0x17, 0x87, 0x15, 0x32, 0xb9, 0xad, 0x66, 0xac, 0x69,
0xf4, 0xed, 0x05, 0xe2, 0xa8, 0x53, 0x93, 0x37, 0xa5, 0x04, 0x3a, 0x8b, 0x2a, 0xba, 0x0d, 0x44,
0x75, 0xc0, 0xfe, 0x30, 0x4e, 0xcc, 0x6d, 0x4b, 0x0f, 0xcd, 0x70, 0x91, 0xd9, 0x5f, 0x75, 0x89,
0x97, 0x99, 0xb5, 0xab, 0x99, 0x3d, 0xe8, 0xfc, 0xf6, 0x72, 0xc7, 0xfa, 0xe3, 0xe5, 0x8e, 0xf5,
0xe7, 0xcb, 0x1d, 0xeb, 0x97, 0xbf, 0x76, 0xfe, 0x37, 0x5c, 0xc3, 0xdf, 0xf5, 0x8f, 0xfe, 0x0e,
0x00, 0x00, 0xff, 0xff, 0x77, 0x8c, 0x9b, 0xf7, 0xd1, 0x0f, 0x00, 0x00,
// 1450 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x5d, 0x6f, 0x1b, 0x45,
0x17, 0x7e, 0xf7, 0xc3, 0xb1, 0x7d, 0x1c, 0x27, 0xce, 0x34, 0xea, 0xbb, 0xfd, 0x78, 0x23, 0x77,
0x5e, 0x44, 0x43, 0x25, 0x22, 0x51, 0x2e, 0x8a, 0xe0, 0xa6, 0x49, 0x9c, 0x16, 0x53, 0xd2, 0x86,
0x71, 0xda, 0x5b, 0x34, 0x5e, 0x8f, 0x9a, 0x55, 0xd6, 0xbb, 0x66, 0x3f, 0x52, 0xbb, 0x17, 0x48,
0x20, 0x10, 0xfc, 0x04, 0x7e, 0x06, 0x37, 0xfc, 0x07, 0x6e, 0x90, 0xf8, 0x09, 0xa8, 0xfc, 0x11,
0x34, 0x67, 0x66, 0x76, 0xd7, 0xae, 0x5b, 0x43, 0xc4, 0xdd, 0x9e, 0xe7, 0xcc, 0x9c, 0xf3, 0x9c,
0x8f, 0x39, 0x33, 0x0b, 0xed, 0x49, 0x12, 0x5c, 0xf0, 0x4c, 0xec, 0x4d, 0x92, 0x38, 0x8b, 0x89,
0x3d, 0x19, 0x5e, 0x5f, 0x9f, 0xe4, 0xc3, 0x30, 0xf0, 0x15, 0x42, 0x1f, 0x42, 0xb3, 0x1f, 0x8d,
0xc4, 0xf4, 0x58, 0x64, 0x9c, 0x10, 0x70, 0x1f, 0x89, 0x59, 0xea, 0x39, 0x5d, 0x6b, 0xb7, 0xc1,
0xf0, 0x9b, 0xbc, 0x0b, 0x1b, 0xa7, 0x09, 0xf7, 0xcf, 0x8f, 0xa6, 0x41, 0x9a, 0x89, 0xc8, 0x17,
0x9e, 0x8b, 0xda, 0x05, 0x94, 0xfe, 0xec, 0xc0, 0xfa, 0x83, 0x40, 0x84, 0xa3, 0x27, 0x93, 0x2c,
0x88, 0xa3, 0x54, 0x1a, 0x3b, 0x9d, 0x4d, 0x84, 0xd7, 0xe8, 0x5a, 0xbb, 0x4d, 0x86, 0xdf, 0xe4,
0x26, 0x34, 0x0f, 0xb9, 0x7f, 0x26, 0x50, 0xe1, 0xa0, 0xa2, 0x04, 0x0a, 0xed, 0x20, 0x78, 0xa9,
0xbc, 0xb4, 0x59, 0x09, 0x90, 0x2e, 0xb4, 0x4e, 0x83, 0xb1, 0xf8, 0x22, 0xe7, 0x51, 0x96, 0x8f,
0xbd, 0x1a, 0xee, 0xae, 0x42, 0xe4, 0x2a, 0xac, 0x3d, 0x09, 0x47, 0xc7, 0x41, 0xe4, 0x35, 0xbb,
0xd6, 0xae, 0xc3, 0xb4, 0x64, 0x70, 0x3e, 0xf5, 0xa0, 0xc4, 0xf9, 0xb4, 0x08, 0xb7, 0x35, 0x1f,
0xee, 0xe3, 0x78, 0x90, 0xf1, 0x68, 0xc4, 0x93, 0xd1, 0xb3, 0x40, 0xbc, 0xf0, 0xd6, 0x55, 0xb8,
0xf3, 0xa8, 0xdc, 0x7b, 0xc0, 0x53, 0xe1, 0xb5, 0xd1, 0x22, 0x7e, 0x93, 0xeb, 0xd0, 0x38, 0x08,
0xb2, 0x9e, 0x98, 0x64, 0x67, 0xde, 0x46, 0xd7, 0xda, 0x75, 0x59, 0x21, 0x93, 0x6d, 0xa8, 0x0d,
0x7c, 0x1e, 0x0a, 0x6f, 0x13, 0x37, 0x28, 0x81, 0x50, 0x58, 0x7f, 0x10, 0x27, 0x22, 0x78, 0x1e,
0x61, 0x11, 0xbc, 0x0e, 0x06, 0x35, 0x87, 0x91, 0xff, 0x81, 0x23, 0x43, 0xda, 0xea, 0x5a, 0xbb,
0xad, 0xbb, 0xad, 0xbd, 0xc9, 0x70, 0xaf, 0x27, 0xfc, 0x60, 0xcc, 0x43, 0x26, 0x71, 0x54, 0xf3,
0xa9, 0x47, 0x96, 0xa9, 0xf9, 0x54, 0x72, 0x92, 0x29, 0x7a, 0x1a, 0x05, 0x99, 0x77, 0x05, 0xad,
0x17, 0x32, 0xa5, 0xb0, 0xd1, 0x1f, 0x4f, 0xe2, 0x24, 0x63, 0x22, 0x9d, 0xc4, 0x51, 0x2a, 0x48,
0x07, 0x9c, 0xa3, 0x24, 0xf1, 0x2c, 0x5c, 0x28, 0x3f, 0xe9, 0xd7, 0xd0, 0x39, 0x08, 0x63, 0xff,
0xbc, 0xc7, 0x33, 0xce, 0xc4, 0x57, 0xb9, 0x48, 0x33, 0x19, 0x8b, 0xa2, 0xab, 0xd6, 0x29, 0x41,
0xa2, 0x58, 0x7f, 0xcf, 0x56, 0x28, 0x0a, 0x32, 0x4f, 0x98, 0x45, 0x55, 0x2e, 0xfc, 0xc6, 0x5c,
0x9c, 0xf1, 0x64, 0x84, 0x35, 0x76, 0x99, 0x12, 0x24, 0x8a, 0x9e, 0xb0, 0x2f, 0x5c, 0xa6, 0x04,
0xda, 0x87, 0xad, 0x8a, 0x7f, 0x4d, 0xf3, 0x2a, 0xac, 0xb1, 0xf8, 0x45, 0xbf, 0x97, 0x7a, 0x56,
0xd7, 0xd9, 0x75, 0x99, 0x96, 0xb0, 0x81, 0xe2, 0x30, 0x1f, 0x47, 0x52, 0x65, 0xa3, 0xaa, 0x04,
0xe8, 0x35, 0xa8, 0x61, 0x37, 0xc9, 0x28, 0xcb, 0xbd, 0xf2, 0x93, 0x7e, 0x63, 0x41, 0xf3, 0x98,
0x4f, 0x91, 0x48, 0x4a, 0xee, 0x41, 0xc3, 0xd4, 0x1a, 0x17, 0xb5, 0xee, 0xde, 0x90, 0x79, 0x2d,
0x16, 0xec, 0x19, 0xed, 0x51, 0x94, 0x25, 0x33, 0x56, 0x2c, 0xbe, 0xfe, 0x09, 0xb4, 0xe7, 0x54,
0xd2, 0xd3, 0xb9, 0x98, 0x99, 0x7c, 0x9e, 0x8b, 0x99, 0x8c, 0xf2, 0x82, 0x87, 0xb9, 0xc0, 0x2c,
0xb9, 0x4c, 0x09, 0x1f, 0xdb, 0x1f, 0x59, 0xf4, 0x19, 0x90, 0xc3, 0x44, 0xf0, 0x4c, 0xa0, 0x93,
0x63, 0x91, 0xa6, 0xfc, 0xb9, 0x58, 0x95, 0x6b, 0xa7, 0x9a, 0xeb, 0x22, 0xaf, 0x76, 0x25, 0xaf,
0xf4, 0x0e, 0x90, 0x9e, 0x08, 0x45, 0x26, 0xf4, 0x39, 0x7f, 0x8b, 0x5d, 0x7a, 0x6e, 0x38, 0xac,
0x5e, 0x4b, 0x6e, 0x81, 0x2b, 0x87, 0x06, 0x3a, 0x6b, 0xdd, 0x6d, 0xcb, 0x0c, 0x15, 0x93, 0x84,
0xa1, 0x0a, 0xeb, 0x81, 0xe6, 0x46, 0xfb, 0x19, 0x52, 0x75, 0x58, 0x09, 0xd0, 0xef, 0x2c, 0xe3,
0x0d, 0xe9, 0xff, 0xcd, 0x88, 0xe7, 0xba, 0xeb, 0x1d, 0xcd, 0xc1, 0x41, 0x0e, 0x1d, 0xc9, 0xa1,
0x3a, 0x83, 0x96, 0xd1, 0x70, 0x17, 0x69, 0xdc, 0x37, 0xf9, 0xb9, 0x2c, 0x0b, 0xea, 0xc3, 0x0d,
0x65, 0x61, 0xff, 0x82, 0x07, 0x21, 0x1f, 0x86, 0xff, 0xa8, 0x84, 0x73, 0x01, 0x79, 0x50, 0xc7,
0xbd, 0xfd, 0x9e, 0x3e, 0x06, 0x46, 0xa4, 0x39, 0x94, 0x27, 0xea, 0x31, 0x1f, 0x0b, 0x6d, 0x0d,
0xbf, 0x8b, 0x3c, 0xd8, 0x6f, 0xcd, 0xc3, 0x36, 0xd4, 0xe4, 0xf9, 0x93, 0xf3, 0xdd, 0x91, 0x2e,
0x51, 0x58, 0x91, 0x9d, 0xf7, 0x61, 0x6d, 0xe0, 0x9f, 0x89, 0x31, 0x27, 0xff, 0x87, 0x3a, 0x32,
0x17, 0xa9, 0x3e, 0x14, 0xcd, 0xa2, 0xe4, 0xcc, 0x68, 0xe8, 0xf7, 0x96, 0x0e, 0x76, 0x29, 0xcd,
0x39, 0x57, 0xf6, 0x82, 0x2b, 0x72, 0x1b, 0xea, 0x9a, 0x2f, 0x4e, 0x8b, 0xd7, 0x7a, 0xca, 0x68,
0xc9, 0x2d, 0x58, 0xc3, 0xe8, 0x52, 0xcf, 0x2d, 0x89, 0x20, 0xc2, 0xb4, 0x82, 0x1e, 0x81, 0xf3,
0x94, 0xf5, 0xe5, 0xa0, 0x40, 0xf6, 0x86, 0x86, 0x96, 0x24, 0xb9, 0x4f, 0xe3, 0x34, 0xd3, 0xb9,
0xc7, 0x6f, 0x89, 0x9d, 0xc4, 0x89, 0xea, 0xd3, 0x36, 0xc3, 0x6f, 0xfa, 0xa3, 0x05, 0xee, 0xe3,
0x78, 0x24, 0xc8, 0x06, 0xd8, 0xfd, 0x9e, 0x36, 0x62, 0xf7, 0x7b, 0xe4, 0x1a, 0xda, 0xd7, 0xf9,
0xae, 0x4b, 0xff, 0x4f, 0x59, 0x9f, 0xa1, 0xcf, 0x9b, 0xd0, 0xec, 0xa7, 0x27, 0x49, 0x30, 0xe6,
0xc9, 0x4c, 0xdf, 0xa4, 0x25, 0x80, 0x67, 0x34, 0xe3, 0x99, 0xba, 0xdf, 0x9a, 0x4c, 0x09, 0xe4,
0x16, 0xd4, 0x1f, 0xb2, 0x93, 0x43, 0x69, 0xb2, 0x36, 0x6f, 0xd2, 0xe0, 0xf4, 0x3e, 0x74, 0x24,
0x13, 0x5c, 0x6f, 0x3a, 0xeb, 0x2a, 0xac, 0x49, 0xac, 0x60, 0xa6, 0xa5, 0xd2, 0x89, 0x5d, 0x71,
0x42, 0x1f, 0x28, 0x0b, 0x47, 0x17, 0x22, 0xca, 0x2a, 0xbd, 0x89, 0x32, 0x1a, 0x68, 0x33, 0x25,
0x90, 0x9b, 0x2a, 0x6a, 0x1d, 0x5e, 0x43, 0x72, 0x91, 0x32, 0x43, 0x94, 0xce, 0x00, 0x0c, 0x93,
0x3c, 0x2d, 0xd6, 0x5a, 0xcb, 0xd6, 0x12, 0x6a, 0xda, 0x47, 0x1f, 0x51, 0x90, 0x7a, 0x85, 0x30,
0xd3, 0x58, 0xef, 0x95, 0x8d, 0xa5, 0xea, 0xb9, 0x59, 0xd4, 0x5d, 0xf9, 0x28, 0xdb, 0xeb, 0x0c,
0x5a, 0x15, 0x7c, 0x69, 0x8f, 0xdd, 0x2e, 0x9a, 0xc3, 0x2e, 0x8d, 0x21, 0xa2, 0x8d, 0x69, 0xf5,
0x8a, 0xe1, 0x14, 0x40, 0xab, 0xb2, 0x69, 0xa9, 0xa7, 0x5d, 0xd8, 0x9c, 0x3f, 0xf0, 0xe6, 0xce,
0x59, 0x84, 0x57, 0xb8, 0xfa, 0xc1, 0x82, 0xf6, 0x61, 0x98, 0xa7, 0x99, 0x48, 0x8a, 0x9c, 0x36,
0x35, 0x50, 0x94, 0xb6, 0x04, 0x96, 0x57, 0x97, 0xec, 0x40, 0x4d, 0x66, 0x5c, 0x1d, 0xee, 0x6a,
0x21, 0x14, 0x5c, 0xa9, 0x84, 0xfb, 0xa6, 0x4a, 0xd0, 0x67, 0xd0, 0x38, 0x18, 0xf4, 0x1f, 0x26,
0x71, 0x3e, 0x59, 0x1a, 0xb1, 0x79, 0xd2, 0xd9, 0x95, 0x27, 0x5d, 0x47, 0x3d, 0x4f, 0x54, 0x54,
0xf8, 0x22, 0xe9, 0xa8, 0x17, 0x89, 0xab, 0x11, 0x3e, 0xa5, 0x03, 0xd8, 0x52, 0xe1, 0xca, 0x89,
0x73, 0x99, 0xb1, 0x68, 0x5e, 0x11, 0x4e, 0xf9, 0x8a, 0x90, 0x46, 0xd5, 0xd4, 0xfd, 0x37, 0x8d,
0xfe, 0x66, 0xc3, 0x16, 0x13, 0x69, 0xf0, 0x52, 0xf4, 0xa3, 0x34, 0x4b, 0x72, 0x5f, 0x4e, 0x1c,
0xb9, 0xff, 0xb3, 0x78, 0xa8, 0x6b, 0xe1, 0x30, 0x25, 0xbc, 0xfd, 0x94, 0x10, 0x0a, 0xf5, 0xea,
0x10, 0xa8, 0x2e, 0x30, 0x0a, 0x72, 0x07, 0xea, 0x83, 0x38, 0x4f, 0xfc, 0xa2, 0xf3, 0x71, 0x72,
0x2b, 0xff, 0x4a, 0xc1, 0xcc, 0x02, 0xf2, 0x08, 0xc8, 0x69, 0xc2, 0xa3, 0x34, 0xe4, 0x92, 0x92,
0xd9, 0xd6, 0x28, 0x9f, 0x27, 0x15, 0xed, 0x9c, 0x85, 0x25, 0xdb, 0xc8, 0x5e, 0xf5, 0x08, 0x7b,
0x75, 0xe4, 0xb7, 0x61, 0xf8, 0xe9, 0x73, 0x52, 0x3d, 0xe4, 0xf7, 0x16, 0x3a, 0xd4, 0x5b, 0xc3,
0x2d, 0x5b, 0x72, 0xcb, 0x9c, 0x82, 0xcd, 0xaf, 0xa3, 0xdf, 0x5a, 0xb0, 0x5e, 0x65, 0xb3, 0x62,
0x5c, 0x14, 0xe5, 0xb3, 0x57, 0xbf, 0x76, 0x4c, 0xf9, 0xdc, 0x65, 0x2f, 0xcb, 0x5a, 0xf5, 0x05,
0x14, 0xc3, 0x7f, 0xdf, 0x90, 0x9c, 0x4b, 0xd1, 0xe9, 0x42, 0xeb, 0x84, 0x27, 0x59, 0x20, 0x8d,
0xe9, 0x7b, 0xba, 0xc6, 0xaa, 0x10, 0x15, 0x70, 0xed, 0xb5, 0x26, 0x3a, 0x8c, 0xc7, 0x13, 0xd9,
0xad, 0x97, 0x6a, 0x26, 0x39, 0xa6, 0x93, 0x24, 0x4e, 0x4c, 0x06, 0x50, 0xa0, 0x07, 0xd0, 0x38,
0x8d, 0x27, 0x71, 0x18, 0x3f, 0x9f, 0xad, 0x18, 0x19, 0x1e, 0xd4, 0xd5, 0xd5, 0xa0, 0x46, 0x54,
0x93, 0x19, 0x91, 0x5e, 0x91, 0xfd, 0xee, 0xf3, 0xd0, 0xcf, 0x43, 0x9e, 0x09, 0x7c, 0x1f, 0x23,
0xf8, 0x79, 0xcc, 0x47, 0x6a, 0x2a, 0xe8, 0xa3, 0x45, 0xbf, 0xd4, 0x0d, 0xc8, 0x31, 0x9c, 0xca,
0x15, 0xb4, 0x8f, 0x80, 0xb9, 0x82, 0x94, 0x44, 0x3e, 0x80, 0x56, 0x65, 0xb5, 0x0e, 0x6b, 0xb3,
0xe8, 0x53, 0x05, 0xb3, 0xea, 0x1a, 0xfa, 0x8b, 0x35, 0xb7, 0xe7, 0xb5, 0x3b, 0x57, 0xbb, 0xba,
0x50, 0x49, 0x6a, 0x30, 0x2d, 0xc9, 0xd0, 0x8f, 0xa6, 0x7e, 0x98, 0xa7, 0x52, 0xa5, 0x2f, 0xdc,
0x02, 0x90, 0xa1, 0xcb, 0x1f, 0x9e, 0x38, 0x37, 0x8f, 0x1b, 0x23, 0xca, 0x5f, 0xa3, 0x9e, 0xe0,
0xa3, 0x30, 0x88, 0x04, 0xf6, 0x8b, 0xc3, 0x0a, 0x99, 0xdc, 0x51, 0x33, 0xd6, 0x34, 0xfa, 0xf6,
0x02, 0x71, 0xd4, 0xa9, 0xc9, 0x9b, 0x52, 0x02, 0x9d, 0x45, 0x15, 0xdd, 0x06, 0xa2, 0x3a, 0x60,
0x7f, 0x18, 0x27, 0xe6, 0xb6, 0xa5, 0x87, 0x66, 0xb8, 0xc8, 0xec, 0xaf, 0xba, 0xc4, 0xcb, 0xcc,
0xda, 0xd5, 0xcc, 0x1e, 0x74, 0x7e, 0x7d, 0xb5, 0x63, 0xfd, 0xfe, 0x6a, 0xc7, 0xfa, 0xe3, 0xd5,
0x8e, 0xf5, 0xd3, 0x9f, 0x3b, 0xff, 0x19, 0xae, 0xe1, 0xaf, 0xfc, 0x87, 0x7f, 0x05, 0x00, 0x00,
0xff, 0xff, 0x6d, 0xf8, 0xe6, 0x6b, 0xed, 0x0f, 0x00, 0x00,
}
func (m *IndexMeta) Marshal() (dAtA []byte, err error) {
@ -2698,6 +2704,15 @@ func (m *FieldOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if len(m.TimeUnit) > 0 {
i -= len(m.TimeUnit)
copy(dAtA[i:], m.TimeUnit)
i = encodeVarintPrivate(dAtA, i, uint64(len(m.TimeUnit)))
i--
dAtA[i] = 0x1
i--
dAtA[i] = 0x9a
}
if m.Max != nil {
{
size, err := m.Max.MarshalToSizedBuffer(dAtA[:i])
@ -4762,6 +4777,10 @@ func (m *FieldOptions) Size() (n int) {
l = m.Max.Size()
n += 2 + l + sovPrivate(uint64(l))
}
l = len(m.TimeUnit)
if l > 0 {
n += 2 + l + sovPrivate(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@ -6106,6 +6125,38 @@ func (m *FieldOptions) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 19:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field TimeUnit", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowPrivate
}
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 ErrInvalidLengthPrivate
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthPrivate
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.TimeUnit = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipPrivate(dAtA[iNdEx:])

View file

@ -24,6 +24,7 @@ message FieldOptions {
string ForeignIndex = 16;
Decimal Min = 17;
Decimal Max = 18;
string TimeUnit = 19;
}
message ImportResponse {

View file

@ -1077,7 +1077,7 @@ func formatValue(v interface{}) string {
case []uint64:
return joinUint64Slice(v)
case time.Time:
return fmt.Sprintf("\"%s\"", v.Format(timeFormat))
return fmt.Sprintf("\"%s\"", v.Format(time.RFC3339Nano))
case *Condition:
return v.String()
default:

View file

@ -25,9 +25,6 @@ import (
"github.com/pkg/errors"
)
// timeFormat is the go-style time format used to parse string dates.
const timeFormat = "2006-01-02T15:04"
// error strings in the parser
const duplicateArgErrorMessage = "duplicate argument provided"
const intOutOfRangeError = "integer is not in signed 64-bit range"