diff --git a/app/app.go b/app/app.go index e621374099..d2603f4e91 100644 --- a/app/app.go +++ b/app/app.go @@ -152,12 +152,28 @@ func (app *app) Query(req tmtypes.RequestQuery) tmtypes.ResponseQuery { return tmtypes.ResponseQuery{Code: code.UNKNOWN_QUERY, Log: "unknown query"} } +func (app *app) checkNonce(address []byte, nonce uint64) apptypes.Error { + signer, err_ := app.state.Account().Get(address) + if err_ != nil { + return apptypes.NewError(code.INVALID_TRANSACTION, err_.Error()) + } + err := apptypes.NewError(code.INVALID_TRANSACTION, "invalid nonce") + if signer != nil && signer.Nonce >= nonce { + return err + } + return nil +} + func (app *app) CheckTx(buf []byte) tmtypes.ResponseCheckTx { ctx, app_, tx, err := app.appForTx(buf) if err != nil { return tmtypes.ResponseCheckTx{Code: err.Code(), Log: err.Error()} } app.traceTx("CheckTx", tx) + err = app.checkNonce(ctx.Signer().Address().Bytes(), tx.Payload.Nonce) + if err != nil { + return tmtypes.ResponseCheckTx{Code: err.Code(), Log: err.Error()} + } return app_.CheckTx(ctx, tx.Payload.Payload) } @@ -166,20 +182,18 @@ func (app *app) DeliverTx(buf []byte) tmtypes.ResponseDeliverTx { if err != nil { return tmtypes.ResponseDeliverTx{Code: err.Code(), Log: err.Error()} } - + app.traceTx("DeliverTx", tx) + err = app.checkNonce(ctx.Signer().Address().Bytes(), tx.Payload.Nonce) + if err != nil { + return tmtypes.ResponseDeliverTx{Code: err.Code(), Log: err.Error()} + } signer, err_ := app.state.Account().Get(ctx.Signer().Address().Bytes()) if err_ != nil { - return tmtypes.ResponseDeliverTx{ - Code: code.INVALID_TRANSACTION, - Log: err_.Error(), - } + return tmtypes.ResponseDeliverTx{Code: code.INVALID_TRANSACTION, Log: err_.Error()} } + // XXX: Accouts should be implicity created when tokens are sent to it if signer == nil { - // return tmtypes.ResponseDeliverTx{ - // Code: code.INVALID_TRANSACTION, - // Log: "unknown signer account", - // } signer = &types.Account{ Address: ctx.Signer().Address().Bytes(), Balance: 0, @@ -187,24 +201,25 @@ func (app *app) DeliverTx(buf []byte) tmtypes.ResponseDeliverTx { } } - if signer.Nonce >= tx.Payload.Nonce { - return tmtypes.ResponseDeliverTx{ - Code: code.INVALID_TRANSACTION, - Log: "invalid nonce", - } + if err_ := app.state.Account().Save(signer); err_ != nil { + return tmtypes.ResponseDeliverTx{Code: code.INVALID_TRANSACTION, Log: err_.Error()} } - signer.Nonce = tx.Payload.Nonce + resp := app_.DeliverTx(ctx, tx.Payload.Payload) - if err_ := app.state.Account().Save(signer); err_ != nil { - return tmtypes.ResponseDeliverTx{ - Code: code.INVALID_TRANSACTION, - Log: err_.Error(), + // set new account nonce + if resp.IsOK() { + signer, err_ = app.state.Account().Get(ctx.Signer().Address().Bytes()) + if err_ != nil { + return tmtypes.ResponseDeliverTx{Code: code.INVALID_TRANSACTION, Log: err_.Error()} + } + signer.Nonce = tx.Payload.Nonce + if err_ := app.state.Account().Save(signer); err_ != nil { + return tmtypes.ResponseDeliverTx{Code: code.INVALID_TRANSACTION, Log: err_.Error()} } } - app.traceTx("DeliverTx", tx) - return app_.DeliverTx(ctx, tx.Payload.Payload) + return resp } func (app *app) BeginBlock(req tmtypes.RequestBeginBlock) tmtypes.ResponseBeginBlock { diff --git a/app/app_test.go b/app/app_test.go index a54ebb8368..52613d7f77 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -75,7 +75,7 @@ func TestApp(t *testing.T) { } { - nonce := uint64(2) + nonce := uint64(3) tx, err := txutil.BuildTx(signer, nonce, &types.TxSend{ From: addrfrom, To: addrto, diff --git a/app/deployment/app.go b/app/deployment/app.go index d4b49db7b8..b54b581308 100644 --- a/app/deployment/app.go +++ b/app/deployment/app.go @@ -200,21 +200,21 @@ func (a *app) doDeploymentGroupQuery(key base.Bytes) tmtypes.ResponseQuery { func (a *app) doCheckCreateTx(ctx apptypes.Context, tx *types.TxCreateDeployment) tmtypes.ResponseCheckTx { - if !bytes.Equal(ctx.Signer().Address(), tx.Deployment.Tenant) { + if !bytes.Equal(ctx.Signer().Address(), tx.Tenant) { return tmtypes.ResponseCheckTx{ Code: code.INVALID_TRANSACTION, Log: "Not signed by sending address", } } - if len(tx.Groups.GetItems()) == 0 { + if len(tx.Groups) == 0 { return tmtypes.ResponseCheckTx{ Code: code.INVALID_TRANSACTION, Log: "No groups in deployment", } } - acct, err := a.State().Account().Get(tx.Deployment.Tenant) + acct, err := a.State().Account().Get(tx.Tenant) if err != nil { return tmtypes.ResponseCheckTx{ Code: code.INVALID_TRANSACTION, @@ -228,6 +228,13 @@ func (a *app) doCheckCreateTx(ctx apptypes.Context, tx *types.TxCreateDeployment } } + if acct.Nonce >= tx.Nonce { + return tmtypes.ResponseCheckTx{ + Code: code.INVALID_TRANSACTION, + Log: "invalid nonce", + } + } + return tmtypes.ResponseCheckTx{} } @@ -372,16 +379,26 @@ func (a *app) doDeliverCreateTx(ctx apptypes.Context, tx *types.TxCreateDeployme } } - deployment := tx.Deployment + deployment := &types.Deployment{ + Address: state.DeploymentAddress(tx.Tenant, tx.Nonce), + Tenant: tx.Tenant, + State: types.Deployment_ACTIVE, + } seq := a.State().Deployment().SequenceFor(deployment.Address) - groups := tx.Groups.GetItems() + groups := tx.Groups for _, group := range groups { - group.Deployment = deployment.Address - group.Seq = seq.Advance() - a.State().DeploymentGroup().Save(group) + g := &types.DeploymentGroup{ + Deployment: deployment.Address, + Seq: seq.Advance(), + State: types.DeploymentGroup_OPEN, + Requirements: group.Requirements, + Resources: group.Resources, + OrderTTL: tx.OrderTTL, + } + a.State().DeploymentGroup().Save(g) } if err := a.State().Deployment().Save(deployment); err != nil { @@ -393,6 +410,7 @@ func (a *app) doDeliverCreateTx(ctx apptypes.Context, tx *types.TxCreateDeployme return tmtypes.ResponseDeliverTx{ Tags: apptypes.NewTags(a.Name(), apptypes.TxTypeCreateDeployment), + Data: deployment.Address, } } diff --git a/app/fulfillment/app_test.go b/app/fulfillment/app_test.go index 7ce029408d..9bf12cbe97 100644 --- a/app/fulfillment/app_test.go +++ b/app/fulfillment/app_test.go @@ -47,7 +47,7 @@ func TestValidTx(t *testing.T) { papp, err := papp.NewApp(state, testutil.Logger()) require.NoError(t, err) paccount, pkey := testutil.CreateAccount(t, state) - pnonce := uint64(0) + pnonce := uint64(1) provider := testutil.CreateProvider(t, papp, paccount, &pkey, pnonce) // create tenant diff --git a/app/lease/app_test.go b/app/lease/app_test.go index c6b4b91909..962028e073 100644 --- a/app/lease/app_test.go +++ b/app/lease/app_test.go @@ -49,7 +49,7 @@ func TestValidTx(t *testing.T) { papp, err := papp.NewApp(state, testutil.Logger()) require.NoError(t, err) paccount, pkey := testutil.CreateAccount(t, state) - pnonce := uint64(0) + pnonce := uint64(1) provider := testutil.CreateProvider(t, papp, paccount, &pkey, pnonce) // create tenant @@ -116,7 +116,7 @@ func TestBilling(t *testing.T) { papp, err := papp.NewApp(state, testutil.Logger()) require.NoError(t, err) paccount, pkey := testutil.CreateAccount(t, state) - pnonce := uint64(0) + pnonce := uint64(1) provider := testutil.CreateProvider(t, papp, paccount, &pkey, pnonce) // create tenant diff --git a/app/provider/app.go b/app/provider/app.go index 499d4065c7..6e8a1e685b 100644 --- a/app/provider/app.go +++ b/app/provider/app.go @@ -149,14 +149,28 @@ func (a *app) doRangeQuery(key base.Bytes) tmtypes.ResponseQuery { } } -// todo: break each type of check out into a named global exported funtion for all trasaction types to utilize func (a *app) doCheckTx(ctx apptypes.Context, tx *types.TxCreateProvider) tmtypes.ResponseCheckTx { - if !bytes.Equal(ctx.Signer().Address(), tx.Provider.Owner) { + if !bytes.Equal(ctx.Signer().Address(), tx.Owner) { return tmtypes.ResponseCheckTx{ Code: code.INVALID_TRANSACTION, Log: "Not signed by owner", } } + + signer, err_ := a.State().Account().Get(tx.Owner) + if err_ != nil { + return tmtypes.ResponseCheckTx{ + Code: code.INVALID_TRANSACTION, + Log: "unknown source account", + } + } + + if signer == nil && tx.Nonce != 1 { + return tmtypes.ResponseCheckTx{Code: code.INVALID_TRANSACTION, Log: "invalid nonce"} + } else if signer != nil && signer.Nonce >= tx.Nonce { + return tmtypes.ResponseCheckTx{Code: code.INVALID_TRANSACTION, Log: "invalid nonce"} + } + return tmtypes.ResponseCheckTx{} } @@ -170,23 +184,13 @@ func (a *app) doDeliverTx(ctx apptypes.Context, tx *types.TxCreateProvider) tmty } } - acct, err := a.State().Account().Get(tx.Provider.Owner) - if err != nil { - return tmtypes.ResponseDeliverTx{ - Code: code.INVALID_TRANSACTION, - Log: err.Error(), - } - } - if acct == nil { - return tmtypes.ResponseDeliverTx{ - Code: code.INVALID_TRANSACTION, - Log: "unknown source account", - } + provider := &types.Provider{ + Address: state.ProviderAddress(tx.Owner, tx.Nonce), + Owner: tx.Owner, + Attributes: tx.Attributes, } - provider := tx.Provider - - if err := a.State().Provider().Save(&provider); err != nil { + if err := a.State().Provider().Save(provider); err != nil { return tmtypes.ResponseDeliverTx{ Code: code.INVALID_TRANSACTION, Log: err.Error(), @@ -195,5 +199,6 @@ func (a *app) doDeliverTx(ctx apptypes.Context, tx *types.TxCreateProvider) tmty return tmtypes.ResponseDeliverTx{ Tags: apptypes.NewTags(a.Name(), apptypes.TxTypeProviderCreate), + Data: provider.Address, } } diff --git a/cmd/akash/deployment.go b/cmd/akash/deployment.go index 9a92284f4d..c8d89e8b84 100644 --- a/cmd/akash/deployment.go +++ b/cmd/akash/deployment.go @@ -49,15 +49,27 @@ func createDeploymentCommand() *cobra.Command { return cmd } -func parseDeployment(file string, tenant []byte, nonce uint64) (*types.Deployment, *types.DeploymentGroups, error) { +func parseDeployment(file string, nonce uint64) ([]*types.GroupSpec, int64, error) { // todo: read and parse deployment yaml file + specs := []*types.GroupSpec{} + /* begin stub data */ - deployment := testutil.Deployment(tenant, nonce) - groups := testutil.DeploymentGroups(deployment.Address, nonce) + groups := testutil.DeploymentGroups(*new(base.Bytes), nonce) + + for _, group := range groups.GetItems() { + s := &types.GroupSpec{ + Resources: group.Resources, + Requirements: group.Requirements, + } + specs = append(specs, s) + } + + ttl := int64(5) + /* end stub data */ - return deployment, groups, nil + return specs, ttl, nil } func createDeployment(ctx context.Context, cmd *cobra.Command, args []string) error { @@ -71,14 +83,16 @@ func createDeployment(ctx context.Context, cmd *cobra.Command, args []string) er return err } - deployment, groups, err := parseDeployment(args[0], key.Address(), nonce) + groups, ttl, err := parseDeployment(args[0], nonce) if err != nil { return err } tx, err := txutil.BuildTx(signer, nonce, &types.TxCreateDeployment{ - Deployment: deployment, - Groups: groups, + Tenant: key.Address(), + Nonce: nonce, + OrderTTL: ttl, + Groups: groups, }) if err != nil { return err @@ -98,24 +112,26 @@ func createDeployment(ctx context.Context, cmd *cobra.Command, args []string) er return errors.New(res.DeliverTx.GetLog()) } - fmt.Println(X(deployment.Address)) + address := res.DeliverTx.Data + + fmt.Println(X(address)) if ctx.Wait() { fmt.Printf("Waiting...\n") - expected := len(groups.GetItems()) + expected := len(groups) handler := marketplace.NewBuilder(). OnTxCreateFulfillment(func(tx *types.TxCreateFulfillment) { - if bytes.Equal(tx.Fulfillment.Deployment, deployment.Address) { + if bytes.Equal(tx.Fulfillment.Deployment, address) { f := tx.Fulfillment - fmt.Printf("Group %v/%v Fulfillment: %X\n", f.Group, len(groups.GetItems()), - state.FulfillmentID(f.Deployment, f.Group, f.Order, f.Provider)) + fmt.Printf("Group %v/%v Fulfillment: %v\n", f.Group, len(groups), + X(state.FulfillmentID(f.Deployment, f.Group, f.Order, f.Provider))) } }). OnTxCreateLease(func(tx *types.TxCreateLease) { - if bytes.Equal(tx.Lease.Deployment, deployment.Address) { + if bytes.Equal(tx.Lease.Deployment, address) { l := tx.Lease - fmt.Printf("Group %v/%v Lease: %X\n", l.Group, len(groups.GetItems()), - state.FulfillmentID(l.Deployment, l.Group, l.Order, l.Provider)) + fmt.Printf("Group %v/%v Lease: %v\n", l.Group, len(groups), + X(state.FulfillmentID(l.Deployment, l.Group, l.Order, l.Provider))) expected-- } if expected == 0 { diff --git a/cmd/akash/marketplace.go b/cmd/akash/marketplace.go index f6e1c5f7f2..08f47d5b98 100644 --- a/cmd/akash/marketplace.go +++ b/cmd/akash/marketplace.go @@ -6,6 +6,7 @@ import ( "github.com/ovrclk/akash/cmd/akash/context" "github.com/ovrclk/akash/cmd/common" "github.com/ovrclk/akash/marketplace" + "github.com/ovrclk/akash/state" "github.com/ovrclk/akash/types" "github.com/spf13/cobra" @@ -37,10 +38,10 @@ func marketplaceMonitorHandler() marketplace.Handler { fmt.Printf("TRANSFER\t%v tokens from %v to %v\n", tx.GetAmount(), X(tx.From), X(tx.To)) }). OnTxCreateProvider(func(tx *types.TxCreateProvider) { - fmt.Printf("DATACENTER CREATED\t%v created by %v\n", X(tx.Provider.Address), X(tx.Provider.Owner)) + fmt.Printf("DATACENTER CREATED\t%v created by %v\n", X(state.ProviderAddress(tx.Owner, tx.Nonce)), X(tx.Owner)) }). OnTxCreateDeployment(func(tx *types.TxCreateDeployment) { - fmt.Printf("DEPLOYMENT CREATED\t%v created by %v\n", X(tx.Deployment.Address), X(tx.Deployment.Tenant)) + fmt.Printf("DEPLOYMENT CREATED\t%v created by %v\n", X(state.DeploymentAddress(tx.Tenant, tx.Nonce)), X(tx.Tenant)) }). OnTxCreateOrder(func(tx *types.TxCreateOrder) { fmt.Printf("ORDER CREATED\t%v/%v/%v\n", diff --git a/cmd/akash/provider.go b/cmd/akash/provider.go index 2b15245a26..fb17a05a60 100644 --- a/cmd/akash/provider.go +++ b/cmd/akash/provider.go @@ -90,13 +90,15 @@ func doCreateProviderCommand(ctx context.Context, cmd *cobra.Command, args []str return err } - provider, err := parseProvider(args[0], key.Address(), nonce) + attributes, err := parseProvider(args[0], nonce) if err != nil { return err } tx, err := txutil.BuildTx(signer, nonce, &types.TxCreateProvider{ - Provider: *provider, + Owner: key.Address(), + Attributes: attributes, + Nonce: nonce, }) if err != nil { return err @@ -115,19 +117,19 @@ func doCreateProviderCommand(ctx context.Context, cmd *cobra.Command, args []str return errors.New(result.DeliverTx.GetLog()) } - fmt.Println(X(provider.Address)) + fmt.Println(X(result.DeliverTx.Data)) return nil } -func parseProvider(file string, tenant []byte, nonce uint64) (*types.Provider, error) { +func parseProvider(file string, nonce uint64) ([]types.ProviderAttribute, error) { // todo: read and parse deployment yaml file /* begin stub data */ - provider := testutil.Provider(tenant, nonce) + provider := testutil.Provider(*new(base.Bytes), nonce) /* end stub data */ - return provider, nil + return provider.Attributes, nil } func runCommand() *cobra.Command { diff --git a/state/id.go b/state/id.go index c7304d4da7..42a345541b 100644 --- a/state/id.go +++ b/state/id.go @@ -61,8 +61,6 @@ func ProviderAddress(account []byte, nonce uint64) []byte { return NonceAddress(account, nonce) } -// TODO: these addresses are susceptible to DoS attacks because they -// are guessable and generated client side. func NonceAddress(account []byte, nonce uint64) []byte { buf := new(bytes.Buffer) buf.Write(account) diff --git a/testutil/deployment.go b/testutil/deployment.go index fd53cd8c4c..84e513183e 100644 --- a/testutil/deployment.go +++ b/testutil/deployment.go @@ -24,11 +24,23 @@ func RandUint64() uint64 { func CreateDeployment(t *testing.T, app apptypes.Application, account *types.Account, key *crypto.PrivKey, nonce uint64) (*types.Deployment, *types.DeploymentGroups) { deployment := Deployment(account.Address, nonce) groups := DeploymentGroups(deployment.Address, nonce) + ttl := int64(5) + specs := []*types.GroupSpec{} + + for _, group := range groups.GetItems() { + s := &types.GroupSpec{ + Resources: group.Resources, + Requirements: group.Requirements, + } + specs = append(specs, s) + } deploymenttx := &types.TxPayload_TxCreateDeployment{ TxCreateDeployment: &types.TxCreateDeployment{ - Deployment: deployment, - Groups: groups, + Tenant: account.Address, + Nonce: nonce, + OrderTTL: ttl, + Groups: specs, }, } diff --git a/testutil/provider.go b/testutil/provider.go index 9a57da4930..a8363cc801 100644 --- a/testutil/provider.go +++ b/testutil/provider.go @@ -21,7 +21,11 @@ func CreateProvider(t *testing.T, app apptypes.Application, account *types.Accou dresp := app.DeliverTx(ctx, tx.Payload.Payload) assert.Len(t, dresp.Log, 0, fmt.Sprint("Log should be empty but is: ", dresp.Log)) assert.True(t, dresp.IsOK()) - return &tx.Payload.GetTxCreateProvider().Provider + return &types.Provider{ + Address: state.ProviderAddress(account.Address, nonce), + Attributes: tx.Payload.GetTxCreateProvider().Attributes, + Owner: account.Address, + } } func ProviderTx(account *types.Account, key *crypto.PrivKey, nonce uint64) *types.Tx { @@ -31,7 +35,9 @@ func ProviderTx(account *types.Account, key *crypto.PrivKey, nonce uint64) *type Payload: types.TxPayload{ Payload: &types.TxPayload_TxCreateProvider{ TxCreateProvider: &types.TxCreateProvider{ - Provider: *provider, + Attributes: provider.Attributes, + Owner: provider.Owner, + Nonce: nonce, }, }, }, diff --git a/types/types.pb.go b/types/types.pb.go index 9ef6f33fe8..0d207b3320 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -19,6 +19,7 @@ ResourceUnit ResourceGroup ProviderAttribute + GroupSpec DeploymentGroup DeploymentGroups Deployment @@ -88,7 +89,7 @@ func (x DeploymentGroup_DeploymentGroupState) String() string { return proto.EnumName(DeploymentGroup_DeploymentGroupState_name, int32(x)) } func (DeploymentGroup_DeploymentGroupState) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{11, 0} + return fileDescriptorTypes, []int{12, 0} } type Deployment_DeploymentState int32 @@ -114,7 +115,7 @@ func (x Deployment_DeploymentState) String() string { return proto.EnumName(Deployment_DeploymentState_name, int32(x)) } func (Deployment_DeploymentState) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{13, 0} + return fileDescriptorTypes, []int{14, 0} } type Order_OrderState int32 @@ -142,7 +143,7 @@ var Order_OrderState_value = map[string]int32{ func (x Order_OrderState) String() string { return proto.EnumName(Order_OrderState_name, int32(x)) } -func (Order_OrderState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{16, 0} } +func (Order_OrderState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{17, 0} } type Fulfillment_FulfillmentState int32 @@ -170,7 +171,7 @@ func (x Fulfillment_FulfillmentState) String() string { return proto.EnumName(Fulfillment_FulfillmentState_name, int32(x)) } func (Fulfillment_FulfillmentState) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{19, 0} + return fileDescriptorTypes, []int{20, 0} } type Lease_LeaseState int32 @@ -195,7 +196,7 @@ var Lease_LeaseState_value = map[string]int32{ func (x Lease_LeaseState) String() string { return proto.EnumName(Lease_LeaseState_name, int32(x)) } -func (Lease_LeaseState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{21, 0} } +func (Lease_LeaseState) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{22, 0} } // BEGIN GLOBAL type Genesis struct { @@ -640,7 +641,9 @@ func (m *Providers) GetProviders() []Provider { } type TxCreateProvider struct { - Provider Provider `protobuf:"bytes,1,opt,name=provider" json:"provider"` + Owner github_com_ovrclk_akash_types_base.Bytes `protobuf:"bytes,1,opt,name=owner,proto3,customtype=github.com/ovrclk/akash/types/base.Bytes" json:"owner"` + Attributes []ProviderAttribute `protobuf:"bytes,2,rep,name=attributes" json:"attributes"` + Nonce uint64 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` } func (m *TxCreateProvider) Reset() { *m = TxCreateProvider{} } @@ -648,11 +651,18 @@ func (m *TxCreateProvider) String() string { return proto.CompactText func (*TxCreateProvider) ProtoMessage() {} func (*TxCreateProvider) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{7} } -func (m *TxCreateProvider) GetProvider() Provider { +func (m *TxCreateProvider) GetAttributes() []ProviderAttribute { if m != nil { - return m.Provider + return m.Attributes } - return Provider{} + return nil +} + +func (m *TxCreateProvider) GetNonce() uint64 { + if m != nil { + return m.Nonce + } + return 0 } // BEGIN EXCHANGE @@ -744,6 +754,30 @@ func (m *ProviderAttribute) GetValue() string { return "" } +type GroupSpec struct { + Requirements []ProviderAttribute `protobuf:"bytes,1,rep,name=requirements" json:"requirements"` + Resources []ResourceGroup `protobuf:"bytes,2,rep,name=resources" json:"resources"` +} + +func (m *GroupSpec) Reset() { *m = GroupSpec{} } +func (m *GroupSpec) String() string { return proto.CompactTextString(m) } +func (*GroupSpec) ProtoMessage() {} +func (*GroupSpec) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{11} } + +func (m *GroupSpec) GetRequirements() []ProviderAttribute { + if m != nil { + return m.Requirements + } + return nil +} + +func (m *GroupSpec) GetResources() []ResourceGroup { + if m != nil { + return m.Resources + } + return nil +} + type DeploymentGroup struct { // deployment address Deployment github_com_ovrclk_akash_types_base.Bytes `protobuf:"bytes,1,opt,name=deployment,proto3,customtype=github.com/ovrclk/akash/types/base.Bytes" json:"deployment"` @@ -759,7 +793,7 @@ type DeploymentGroup struct { func (m *DeploymentGroup) Reset() { *m = DeploymentGroup{} } func (m *DeploymentGroup) String() string { return proto.CompactTextString(m) } func (*DeploymentGroup) ProtoMessage() {} -func (*DeploymentGroup) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{11} } +func (*DeploymentGroup) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{12} } func (m *DeploymentGroup) GetSeq() uint64 { if m != nil { @@ -803,7 +837,7 @@ type DeploymentGroups struct { func (m *DeploymentGroups) Reset() { *m = DeploymentGroups{} } func (m *DeploymentGroups) String() string { return proto.CompactTextString(m) } func (*DeploymentGroups) ProtoMessage() {} -func (*DeploymentGroups) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{12} } +func (*DeploymentGroups) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{13} } func (m *DeploymentGroups) GetItems() []*DeploymentGroup { if m != nil { @@ -822,7 +856,7 @@ type Deployment struct { func (m *Deployment) Reset() { *m = Deployment{} } func (m *Deployment) String() string { return proto.CompactTextString(m) } func (*Deployment) ProtoMessage() {} -func (*Deployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{13} } +func (*Deployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{14} } func (m *Deployment) GetState() Deployment_DeploymentState { if m != nil { @@ -838,7 +872,7 @@ type Deployments struct { func (m *Deployments) Reset() { *m = Deployments{} } func (m *Deployments) String() string { return proto.CompactTextString(m) } func (*Deployments) ProtoMessage() {} -func (*Deployments) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{14} } +func (*Deployments) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{15} } func (m *Deployments) GetItems() []Deployment { if m != nil { @@ -848,23 +882,32 @@ func (m *Deployments) GetItems() []Deployment { } type TxCreateDeployment struct { - Deployment *Deployment `protobuf:"bytes,1,opt,name=deployment" json:"deployment,omitempty"` - Groups *DeploymentGroups `protobuf:"bytes,2,opt,name=groups" json:"groups,omitempty"` + Tenant github_com_ovrclk_akash_types_base.Bytes `protobuf:"bytes,1,opt,name=tenant,proto3,customtype=github.com/ovrclk/akash/types/base.Bytes" json:"tenant"` + Nonce uint64 `protobuf:"varint,2,opt,name=nonce,proto3" json:"nonce,omitempty"` + OrderTTL int64 `protobuf:"varint,3,opt,name=orderTTL,proto3" json:"orderTTL,omitempty"` + Groups []*GroupSpec `protobuf:"bytes,4,rep,name=groups" json:"groups,omitempty"` } func (m *TxCreateDeployment) Reset() { *m = TxCreateDeployment{} } func (m *TxCreateDeployment) String() string { return proto.CompactTextString(m) } func (*TxCreateDeployment) ProtoMessage() {} -func (*TxCreateDeployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{15} } +func (*TxCreateDeployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{16} } -func (m *TxCreateDeployment) GetDeployment() *Deployment { +func (m *TxCreateDeployment) GetNonce() uint64 { if m != nil { - return m.Deployment + return m.Nonce } - return nil + return 0 +} + +func (m *TxCreateDeployment) GetOrderTTL() int64 { + if m != nil { + return m.OrderTTL + } + return 0 } -func (m *TxCreateDeployment) GetGroups() *DeploymentGroups { +func (m *TxCreateDeployment) GetGroups() []*GroupSpec { if m != nil { return m.Groups } @@ -886,7 +929,7 @@ type Order struct { func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} -func (*Order) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{16} } +func (*Order) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{17} } func (m *Order) GetGroup() uint64 { if m != nil { @@ -923,7 +966,7 @@ type TxCreateOrder struct { func (m *TxCreateOrder) Reset() { *m = TxCreateOrder{} } func (m *TxCreateOrder) String() string { return proto.CompactTextString(m) } func (*TxCreateOrder) ProtoMessage() {} -func (*TxCreateOrder) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{17} } +func (*TxCreateOrder) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{18} } func (m *TxCreateOrder) GetOrder() *Order { if m != nil { @@ -939,7 +982,7 @@ type Orders struct { func (m *Orders) Reset() { *m = Orders{} } func (m *Orders) String() string { return proto.CompactTextString(m) } func (*Orders) ProtoMessage() {} -func (*Orders) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{18} } +func (*Orders) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{19} } func (m *Orders) GetItems() []*Order { if m != nil { @@ -964,7 +1007,7 @@ type Fulfillment struct { func (m *Fulfillment) Reset() { *m = Fulfillment{} } func (m *Fulfillment) String() string { return proto.CompactTextString(m) } func (*Fulfillment) ProtoMessage() {} -func (*Fulfillment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{19} } +func (*Fulfillment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20} } func (m *Fulfillment) GetGroup() uint64 { if m != nil { @@ -1001,7 +1044,7 @@ type TxCreateFulfillment struct { func (m *TxCreateFulfillment) Reset() { *m = TxCreateFulfillment{} } func (m *TxCreateFulfillment) String() string { return proto.CompactTextString(m) } func (*TxCreateFulfillment) ProtoMessage() {} -func (*TxCreateFulfillment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20} } +func (*TxCreateFulfillment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{21} } func (m *TxCreateFulfillment) GetFulfillment() *Fulfillment { if m != nil { @@ -1027,7 +1070,7 @@ type Lease struct { func (m *Lease) Reset() { *m = Lease{} } func (m *Lease) String() string { return proto.CompactTextString(m) } func (*Lease) ProtoMessage() {} -func (*Lease) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{21} } +func (*Lease) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{22} } func (m *Lease) GetGroup() uint64 { if m != nil { @@ -1064,7 +1107,7 @@ type TxCreateLease struct { func (m *TxCreateLease) Reset() { *m = TxCreateLease{} } func (m *TxCreateLease) String() string { return proto.CompactTextString(m) } func (*TxCreateLease) ProtoMessage() {} -func (*TxCreateLease) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{22} } +func (*TxCreateLease) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{23} } func (m *TxCreateLease) GetLease() *Lease { if m != nil { @@ -1080,7 +1123,7 @@ type Leases struct { func (m *Leases) Reset() { *m = Leases{} } func (m *Leases) String() string { return proto.CompactTextString(m) } func (*Leases) ProtoMessage() {} -func (*Leases) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{23} } +func (*Leases) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{24} } func (m *Leases) GetItems() []*Lease { if m != nil { @@ -1097,7 +1140,7 @@ type TxCloseDeployment struct { func (m *TxCloseDeployment) Reset() { *m = TxCloseDeployment{} } func (m *TxCloseDeployment) String() string { return proto.CompactTextString(m) } func (*TxCloseDeployment) ProtoMessage() {} -func (*TxCloseDeployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{24} } +func (*TxCloseDeployment) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{25} } type TxDeploymentClosed struct { // deployment address @@ -1107,7 +1150,7 @@ type TxDeploymentClosed struct { func (m *TxDeploymentClosed) Reset() { *m = TxDeploymentClosed{} } func (m *TxDeploymentClosed) String() string { return proto.CompactTextString(m) } func (*TxDeploymentClosed) ProtoMessage() {} -func (*TxDeploymentClosed) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{25} } +func (*TxDeploymentClosed) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{26} } type Bill struct { // lease address @@ -1117,7 +1160,7 @@ type Bill struct { func (m *Bill) Reset() { *m = Bill{} } func (m *Bill) String() string { return proto.CompactTextString(m) } func (*Bill) ProtoMessage() {} -func (*Bill) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{26} } +func (*Bill) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{27} } type TxBillTenant struct { Bill *Bill `protobuf:"bytes,1,opt,name=bill" json:"bill,omitempty"` @@ -1126,7 +1169,7 @@ type TxBillTenant struct { func (m *TxBillTenant) Reset() { *m = TxBillTenant{} } func (m *TxBillTenant) String() string { return proto.CompactTextString(m) } func (*TxBillTenant) ProtoMessage() {} -func (*TxBillTenant) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{27} } +func (*TxBillTenant) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{28} } func (m *TxBillTenant) GetBill() *Bill { if m != nil { @@ -1147,6 +1190,7 @@ func init() { proto.RegisterType((*ResourceUnit)(nil), "types.ResourceUnit") proto.RegisterType((*ResourceGroup)(nil), "types.ResourceGroup") proto.RegisterType((*ProviderAttribute)(nil), "types.ProviderAttribute") + proto.RegisterType((*GroupSpec)(nil), "types.GroupSpec") proto.RegisterType((*DeploymentGroup)(nil), "types.DeploymentGroup") proto.RegisterType((*DeploymentGroups)(nil), "types.DeploymentGroups") proto.RegisterType((*Deployment)(nil), "types.Deployment") @@ -1769,9 +1813,17 @@ func (this *TxCreateProvider) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 5) + s := make([]string, 0, 7) s = append(s, "&types.TxCreateProvider{") - s = append(s, "Provider: "+strings.Replace(this.Provider.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Owner: "+fmt.Sprintf("%#v", this.Owner)+",\n") + if this.Attributes != nil { + vs := make([]*ProviderAttribute, len(this.Attributes)) + for i := range vs { + vs[i] = &this.Attributes[i] + } + s = append(s, "Attributes: "+fmt.Sprintf("%#v", vs)+",\n") + } + s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -1810,6 +1862,29 @@ func (this *ProviderAttribute) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *GroupSpec) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&types.GroupSpec{") + if this.Requirements != nil { + vs := make([]*ProviderAttribute, len(this.Requirements)) + for i := range vs { + vs[i] = &this.Requirements[i] + } + s = append(s, "Requirements: "+fmt.Sprintf("%#v", vs)+",\n") + } + if this.Resources != nil { + vs := make([]*ResourceGroup, len(this.Resources)) + for i := range vs { + vs[i] = &this.Resources[i] + } + s = append(s, "Resources: "+fmt.Sprintf("%#v", vs)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} func (this *DeploymentGroup) GoString() string { if this == nil { return "nil" @@ -1881,11 +1956,11 @@ func (this *TxCreateDeployment) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 8) s = append(s, "&types.TxCreateDeployment{") - if this.Deployment != nil { - s = append(s, "Deployment: "+fmt.Sprintf("%#v", this.Deployment)+",\n") - } + s = append(s, "Tenant: "+fmt.Sprintf("%#v", this.Tenant)+",\n") + s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") + s = append(s, "OrderTTL: "+fmt.Sprintf("%#v", this.OrderTTL)+",\n") if this.Groups != nil { s = append(s, "Groups: "+fmt.Sprintf("%#v", this.Groups)+",\n") } @@ -3094,7 +3169,37 @@ func (m *TxCreateProvider) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Owner.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3118,10 +3223,30 @@ func (m *TxCreateProvider) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Provider.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Attributes = append(m.Attributes, ProviderAttribute{}) + if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -3476,6 +3601,118 @@ func (m *ProviderAttribute) Unmarshal(dAtA []byte) error { } return nil } +func (m *GroupSpec) 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 ErrIntOverflowTypes + } + 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: GroupSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GroupSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requirements", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requirements = append(m.Requirements, ProviderAttribute{}) + if err := m.Requirements[len(m.Requirements)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, ResourceGroup{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *DeploymentGroup) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3997,9 +4234,9 @@ func (m *TxCreateDeployment) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Deployment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Tenant", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -4009,26 +4246,61 @@ func (m *TxCreateDeployment) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + byteLen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex > l { return io.ErrUnexpectedEOF } - if m.Deployment == nil { - m.Deployment = &Deployment{} - } - if err := m.Deployment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Tenant.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OrderTTL", wireType) + } + m.OrderTTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.OrderTTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType) } @@ -4054,10 +4326,8 @@ func (m *TxCreateDeployment) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Groups == nil { - m.Groups = &DeploymentGroups{} - } - if err := m.Groups.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Groups = append(m.Groups, &GroupSpec{}) + if err := m.Groups[len(m.Groups)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -5452,87 +5722,89 @@ var ( func init() { proto.RegisterFile("types/types.proto", fileDescriptorTypes) } var fileDescriptorTypes = []byte{ - // 1303 bytes of a gzipped FileDescriptorProto + // 1342 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xda, 0x5e, 0x3b, 0x7e, 0x8e, 0x5b, 0x67, 0x1a, 0xb5, 0x4b, 0x85, 0x92, 0xb2, 0x1c, - 0x88, 0x44, 0x13, 0xb7, 0x29, 0xe2, 0x6f, 0x85, 0x1a, 0x27, 0x6e, 0x5d, 0x1a, 0x92, 0x68, 0x6a, - 0xb8, 0xaf, 0xed, 0x49, 0xba, 0xca, 0x7a, 0xd7, 0xdd, 0xd9, 0x2d, 0xf6, 0x67, 0x40, 0xe2, 0xce, - 0x0d, 0x6e, 0x7c, 0x14, 0x24, 0x38, 0x70, 0xac, 0x38, 0x54, 0x6a, 0xc5, 0x81, 0x23, 0x07, 0x3e, - 0x00, 0x9a, 0x37, 0xb3, 0xde, 0xd9, 0xb5, 0x2b, 0x55, 0x56, 0x10, 0x12, 0x17, 0x6b, 0xde, 0xdf, - 0x79, 0xfb, 0xfb, 0xbd, 0x37, 0x3b, 0x6b, 0x58, 0x8b, 0xa6, 0x63, 0xc6, 0x5b, 0xf8, 0xbb, 0x33, - 0x0e, 0x83, 0x28, 0x20, 0x26, 0x0a, 0xd7, 0xb7, 0xcf, 0xdc, 0xe8, 0x49, 0xdc, 0xdf, 0x19, 0x04, - 0xa3, 0xd6, 0x59, 0x70, 0x16, 0xb4, 0xd0, 0xda, 0x8f, 0x4f, 0x51, 0x42, 0x01, 0x57, 0x32, 0xca, - 0xfe, 0x0c, 0xaa, 0x0f, 0x98, 0xcf, 0xb8, 0xcb, 0xc9, 0x2d, 0x58, 0x71, 0x06, 0x83, 0x20, 0xf6, - 0x23, 0x6e, 0x19, 0x37, 0x4a, 0x5b, 0xf5, 0xdd, 0x4b, 0x3b, 0x72, 0x83, 0x3d, 0xa9, 0x6e, 0x97, - 0x7f, 0x7e, 0xb1, 0x59, 0xa0, 0x33, 0x2f, 0xfb, 0x14, 0x8a, 0xbd, 0x09, 0x69, 0x42, 0xe9, 0x9c, - 0x4d, 0x2d, 0xe3, 0x86, 0xb1, 0xb5, 0x4a, 0xc5, 0x92, 0xbc, 0x0d, 0x35, 0xee, 0x9e, 0xf9, 0x4e, - 0x14, 0x87, 0xcc, 0x2a, 0xa2, 0x3e, 0x55, 0x90, 0x5b, 0x50, 0x1d, 0x3b, 0x53, 0x2f, 0x70, 0x86, - 0x56, 0xe9, 0x86, 0xb1, 0x55, 0xdf, 0x6d, 0xaa, 0x6d, 0x7a, 0x93, 0x13, 0xa9, 0x57, 0x1b, 0x25, - 0x6e, 0xf6, 0xaf, 0x65, 0xa8, 0xcd, 0x8c, 0x64, 0x1d, 0x4c, 0x3f, 0xf0, 0x07, 0x0c, 0x77, 0x2c, - 0x53, 0x29, 0x90, 0xf7, 0xa0, 0x12, 0x4d, 0x1e, 0x33, 0x7f, 0x88, 0x1b, 0xd6, 0x77, 0x1b, 0xb3, - 0xa4, 0x42, 0xd9, 0x2d, 0x50, 0x65, 0x26, 0x8f, 0x80, 0x44, 0x93, 0xfd, 0x90, 0x39, 0x11, 0x3b, - 0x60, 0x63, 0x2f, 0x98, 0x8e, 0x98, 0x1f, 0xa9, 0x4a, 0xde, 0x9a, 0x05, 0xe5, 0x1d, 0xba, 0x05, - 0xba, 0x20, 0x8c, 0xdc, 0x85, 0x46, 0xa2, 0x3d, 0x0e, 0x87, 0x2c, 0xb4, 0xca, 0x98, 0x67, 0x3d, - 0x97, 0x07, 0x6d, 0xdd, 0x02, 0xcd, 0x3a, 0x93, 0x23, 0xb8, 0x92, 0x28, 0xee, 0xc7, 0xde, 0xa9, - 0xeb, 0x79, 0x58, 0x8b, 0x89, 0x39, 0xae, 0xe7, 0x72, 0x68, 0x1e, 0xdd, 0x02, 0x5d, 0x14, 0xa8, - 0x57, 0x73, 0xc8, 0x1c, 0xce, 0xac, 0xca, 0xc2, 0x6a, 0xd0, 0xa6, 0x57, 0x83, 0x0a, 0xd2, 0x81, - 0x66, 0xa2, 0x38, 0x09, 0x83, 0x67, 0xae, 0x78, 0x9c, 0x2a, 0x26, 0xb8, 0x96, 0x4b, 0x90, 0x98, - 0xbb, 0x05, 0x3a, 0x17, 0x42, 0xba, 0xb0, 0x16, 0x4d, 0xf6, 0xbd, 0x80, 0xeb, 0xf0, 0xae, 0x60, - 0x1e, 0x2b, 0xcd, 0x93, 0xb5, 0x77, 0x0b, 0x74, 0x3e, 0x48, 0x32, 0x95, 0xca, 0x68, 0x1e, 0x5a, - 0xb5, 0x1c, 0x53, 0x79, 0x07, 0xc9, 0x54, 0x5e, 0xdb, 0xae, 0xcd, 0xba, 0xce, 0xfe, 0xd6, 0x80, - 0xaa, 0x6a, 0x69, 0xf2, 0x05, 0x54, 0x9d, 0xe1, 0x30, 0x64, 0x9c, 0xcb, 0x06, 0x6e, 0xdf, 0x12, - 0xad, 0xf7, 0xfb, 0x8b, 0xcd, 0x2d, 0x6d, 0x8e, 0x82, 0x67, 0xe1, 0xc0, 0x3b, 0x6f, 0x39, 0xe7, - 0x0e, 0x7f, 0x22, 0x67, 0xae, 0xd5, 0x77, 0x38, 0xdb, 0x69, 0x4f, 0x23, 0xc6, 0x69, 0x92, 0x80, - 0x58, 0x50, 0xed, 0x3b, 0x9e, 0x23, 0x5a, 0xb3, 0x88, 0xad, 0x99, 0x88, 0x69, 0xcb, 0x96, 0xb4, - 0x96, 0xfd, 0xb4, 0xfc, 0xe7, 0x8f, 0x9b, 0x86, 0xfd, 0x93, 0x01, 0x15, 0xd9, 0xa4, 0xe4, 0x00, - 0xca, 0xa7, 0x61, 0x30, 0x5a, 0xba, 0x12, 0x8c, 0x26, 0xf7, 0xa0, 0x18, 0x05, 0x72, 0xec, 0x96, - 0xc8, 0x51, 0x8c, 0x02, 0x72, 0x15, 0x2a, 0xce, 0x48, 0xc0, 0xa3, 0xea, 0x55, 0x92, 0xfd, 0x87, - 0x01, 0x2b, 0x33, 0x9e, 0x2f, 0x12, 0xb9, 0xfb, 0x60, 0x06, 0xdf, 0xf8, 0x2c, 0x5c, 0xba, 0x6a, - 0x19, 0x4e, 0x3e, 0x07, 0x70, 0xa2, 0x28, 0x74, 0xfb, 0x71, 0xc4, 0xb8, 0x55, 0xc2, 0x43, 0x2c, - 0x69, 0xba, 0xa4, 0xf0, 0xbd, 0xc4, 0x41, 0x9d, 0x32, 0x5a, 0x84, 0x62, 0xe4, 0x1e, 0xd4, 0x12, - 0x67, 0x4e, 0xee, 0x40, 0x6d, 0x9c, 0x08, 0xea, 0x58, 0xbc, 0x9c, 0xcb, 0xa8, 0x12, 0xa5, 0x7e, - 0x76, 0x07, 0x9a, 0xf9, 0x59, 0x21, 0xb7, 0x61, 0x25, 0x71, 0x40, 0xc0, 0x5e, 0x9b, 0x67, 0xe6, - 0x66, 0x53, 0x58, 0xa5, 0x8c, 0x07, 0x71, 0x38, 0x60, 0x5f, 0xf9, 0x6e, 0x24, 0x4e, 0xda, 0xc1, - 0x38, 0xc6, 0xe8, 0x06, 0x15, 0x4b, 0xc1, 0xd4, 0x88, 0x8d, 0x82, 0x70, 0x8a, 0xc8, 0x35, 0xa8, - 0x92, 0x08, 0x81, 0xf2, 0xd0, 0xe5, 0xe7, 0x8a, 0x3f, 0x5c, 0xab, 0x87, 0x1b, 0x43, 0x23, 0xc9, - 0xf9, 0x20, 0x0c, 0xe2, 0x31, 0xd9, 0x86, 0x72, 0xec, 0xbb, 0x91, 0xaa, 0xe9, 0x8a, 0xaa, 0x49, - 0xdf, 0x57, 0xd5, 0x85, 0x6e, 0xa2, 0x95, 0x71, 0x72, 0xd4, 0x86, 0x52, 0x10, 0xda, 0x71, 0xe8, - 0xaa, 0x06, 0x6f, 0x50, 0x29, 0xa8, 0x1d, 0xf7, 0x61, 0x6d, 0x0e, 0x7b, 0x51, 0xa0, 0xef, 0x8c, - 0xe4, 0x19, 0x5e, 0xa3, 0xb8, 0x16, 0x49, 0x9e, 0x39, 0x5e, 0x2c, 0xa7, 0xa7, 0x46, 0xa5, 0xa0, - 0x92, 0xfc, 0x50, 0x82, 0xcb, 0xe9, 0x4c, 0xcb, 0xca, 0x4f, 0x00, 0x86, 0xe9, 0x11, 0xb3, 0x6c, - 0x13, 0x6a, 0x39, 0x04, 0xc0, 0x9c, 0x3d, 0x55, 0xd3, 0x2b, 0x96, 0xe4, 0x3a, 0xac, 0x04, 0xe2, - 0xac, 0xee, 0xf5, 0x0e, 0xf1, 0xd9, 0x4a, 0x74, 0x26, 0x93, 0x3d, 0x30, 0x79, 0xe4, 0x44, 0x0c, - 0x0f, 0xfd, 0x4b, 0xbb, 0xef, 0x2b, 0xe8, 0x72, 0x65, 0xe6, 0xe5, 0xc7, 0x22, 0x84, 0xca, 0x48, - 0xd2, 0x86, 0xd5, 0x90, 0x3d, 0x8d, 0xdd, 0x90, 0x09, 0x3b, 0xb7, 0xcc, 0x37, 0x6a, 0xd9, 0x4c, - 0x0c, 0xf9, 0x18, 0x6a, 0xa1, 0x62, 0x8b, 0x5b, 0x15, 0x4c, 0xb0, 0x9e, 0x63, 0x11, 0x37, 0x4e, - 0xda, 0x74, 0xe6, 0x6c, 0xdf, 0x87, 0xf5, 0x45, 0xc5, 0x91, 0x15, 0x28, 0x1f, 0x9f, 0x74, 0x8e, - 0x9a, 0x05, 0x52, 0x87, 0xea, 0x31, 0x3d, 0xe8, 0xd0, 0xce, 0x41, 0xd3, 0x10, 0xc2, 0xfe, 0xe1, - 0xf1, 0xe3, 0x87, 0x47, 0x0f, 0x9a, 0x45, 0x02, 0x50, 0x11, 0x42, 0xe7, 0xa0, 0x59, 0x9a, 0x8d, - 0x4d, 0x33, 0x97, 0x8d, 0x93, 0x9b, 0x60, 0xba, 0x11, 0x1b, 0x25, 0x93, 0x73, 0x75, 0x31, 0x44, - 0x54, 0x3a, 0xd9, 0xdf, 0x17, 0x01, 0xb4, 0xf3, 0xff, 0x22, 0x4f, 0x98, 0x2e, 0x54, 0x22, 0xe6, - 0x3b, 0xaa, 0x6f, 0x97, 0x49, 0xa5, 0xe2, 0xc9, 0x47, 0x09, 0xeb, 0x25, 0x64, 0xfd, 0x9d, 0xb9, - 0x47, 0xd2, 0x96, 0x3a, 0xd7, 0xf6, 0x87, 0x7a, 0x07, 0x4b, 0xa0, 0x01, 0x2a, 0x7b, 0xfb, 0xbd, - 0x87, 0x5f, 0x77, 0x24, 0xd4, 0x09, 0xba, 0x86, 0x86, 0x6e, 0x51, 0xa1, 0x7b, 0x17, 0xea, 0x69, - 0x34, 0x27, 0xdb, 0x59, 0x60, 0xd7, 0xe6, 0xaa, 0x50, 0x6c, 0x2b, 0x64, 0x27, 0x40, 0xe6, 0xef, - 0x34, 0xe4, 0xf6, 0xdc, 0x00, 0x2d, 0xca, 0x94, 0x99, 0x90, 0x16, 0x54, 0xce, 0x90, 0x5a, 0x75, - 0xcd, 0xba, 0xb6, 0x98, 0x51, 0x4e, 0x95, 0x9b, 0xfd, 0x5d, 0x11, 0x4c, 0x79, 0xdb, 0xb9, 0xf8, - 0x71, 0x5d, 0x07, 0x13, 0x77, 0x51, 0x03, 0x2b, 0x05, 0xa1, 0xc5, 0x11, 0x4d, 0x5e, 0xb6, 0x28, - 0x08, 0x2d, 0xf3, 0x87, 0x7b, 0x11, 0x0e, 0x6b, 0x89, 0x4a, 0x41, 0xc0, 0x28, 0xc9, 0x34, 0x91, - 0xcc, 0xe4, 0x69, 0xb0, 0x60, 0xf9, 0x9b, 0xa1, 0xf0, 0x2e, 0x40, 0xaa, 0xcc, 0x8e, 0xc9, 0x97, - 0x7b, 0xbd, 0xfd, 0xee, 0x9b, 0x8c, 0xc9, 0x1d, 0x68, 0x64, 0xae, 0x85, 0xc4, 0x4e, 0xea, 0x95, - 0x04, 0xac, 0xea, 0x35, 0xa8, 0xea, 0xed, 0x9b, 0x50, 0x41, 0x99, 0x0b, 0x6f, 0x9d, 0xf8, 0x9c, - 0xb7, 0x64, 0xfb, 0xef, 0x22, 0xd4, 0xf5, 0x7b, 0xe1, 0x7f, 0x8b, 0xfc, 0xa1, 0xf6, 0xe2, 0x2b, - 0x2f, 0xb9, 0xf7, 0x2c, 0x43, 0xfa, 0xa6, 0x31, 0xb5, 0x37, 0x0d, 0xf9, 0x24, 0xe1, 0xb1, 0x82, - 0x3c, 0xbe, 0xab, 0x50, 0xd1, 0x40, 0xd0, 0xd7, 0x19, 0x4e, 0xdb, 0xd0, 0xcc, 0x9b, 0x96, 0x64, - 0xf6, 0x11, 0x5c, 0x59, 0x70, 0x59, 0x27, 0x1f, 0x40, 0xfd, 0x54, 0xbb, 0xdd, 0x4b, 0x96, 0xc9, - 0x7c, 0x85, 0x54, 0x77, 0xb3, 0x7f, 0x29, 0x82, 0x29, 0xef, 0xe5, 0xff, 0x7f, 0xf6, 0xb6, 0xb3, - 0xec, 0x25, 0x53, 0x88, 0x8f, 0x2f, 0x7f, 0x33, 0x8c, 0xdd, 0x06, 0x48, 0x95, 0x6f, 0x74, 0x86, - 0xea, 0x43, 0x27, 0x41, 0xb5, 0xc1, 0xf4, 0xf0, 0x13, 0x29, 0x3b, 0x74, 0x68, 0xa4, 0xd2, 0x24, - 0x86, 0x0e, 0xe5, 0xd7, 0x0e, 0x9d, 0xf2, 0x96, 0x43, 0xc7, 0x60, 0x6d, 0xee, 0xbb, 0xe6, 0xe2, - 0xb9, 0xb3, 0x4f, 0xc5, 0x49, 0x9e, 0xff, 0xba, 0xf9, 0x17, 0xf6, 0x39, 0x82, 0x72, 0xdb, 0xf5, - 0x3c, 0x71, 0x35, 0x4f, 0x81, 0x5a, 0xea, 0x6a, 0x2e, 0xc1, 0x6c, 0xc1, 0x6a, 0x6f, 0x22, 0x32, - 0xf6, 0xe4, 0x6b, 0x74, 0x13, 0xca, 0x7d, 0xd7, 0xf3, 0x14, 0xfe, 0x75, 0x85, 0xa8, 0x70, 0xa0, - 0x68, 0x68, 0x37, 0x9f, 0xbf, 0xdc, 0x30, 0xfe, 0x7a, 0xb9, 0x61, 0xfc, 0xf6, 0x6a, 0xc3, 0x78, - 0xfe, 0x6a, 0xc3, 0xe8, 0x57, 0xf0, 0x2f, 0x8b, 0x3b, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x4f, - 0x8e, 0xb3, 0x5a, 0xfd, 0x10, 0x00, 0x00, + 0x14, 0xf7, 0xae, 0xbd, 0xeb, 0xf8, 0x39, 0x6e, 0x9d, 0x69, 0x54, 0x4c, 0x85, 0x92, 0xb2, 0x1c, + 0x88, 0x44, 0x93, 0x94, 0x14, 0xf1, 0xb7, 0x42, 0x8d, 0x93, 0xb4, 0x2e, 0x0d, 0x49, 0x34, 0x31, + 0xdc, 0xd7, 0xf6, 0x24, 0x5d, 0x65, 0xbd, 0xeb, 0xee, 0x9f, 0x92, 0x7c, 0x04, 0x84, 0xc4, 0x9d, + 0x1b, 0xdc, 0x38, 0x72, 0xe6, 0x13, 0x20, 0xc1, 0x81, 0x63, 0xc5, 0xa1, 0x52, 0x2b, 0x0e, 0x1c, + 0x39, 0xf0, 0x01, 0xd0, 0xbc, 0x99, 0xd9, 0x1d, 0xaf, 0x0d, 0xb4, 0x6e, 0x10, 0x12, 0x17, 0x6b, + 0xde, 0x9b, 0xf7, 0xde, 0xfc, 0xe6, 0xf7, 0xde, 0x9b, 0x99, 0x35, 0x2c, 0x24, 0x67, 0x23, 0x16, + 0xaf, 0xe3, 0xef, 0xda, 0x28, 0x0a, 0x93, 0x90, 0x58, 0x28, 0x5c, 0x59, 0x3d, 0xf6, 0x92, 0xfb, + 0x69, 0x6f, 0xad, 0x1f, 0x0e, 0xd7, 0x8f, 0xc3, 0xe3, 0x70, 0x1d, 0x67, 0x7b, 0xe9, 0x11, 0x4a, + 0x28, 0xe0, 0x48, 0x78, 0x39, 0x1f, 0x40, 0xf5, 0x0e, 0x0b, 0x58, 0xec, 0xc5, 0xe4, 0x3a, 0xcc, + 0xb9, 0xfd, 0x7e, 0x98, 0x06, 0x49, 0xdc, 0x32, 0xae, 0x96, 0x57, 0xea, 0x1b, 0x17, 0xd6, 0xc4, + 0x02, 0x9b, 0x42, 0xdd, 0xae, 0xfc, 0xf0, 0x78, 0xb9, 0x44, 0x33, 0x2b, 0xe7, 0x08, 0xcc, 0xee, + 0x29, 0x69, 0x42, 0xf9, 0x84, 0x9d, 0xb5, 0x8c, 0xab, 0xc6, 0xca, 0x3c, 0xe5, 0x43, 0xf2, 0x0a, + 0xd4, 0x62, 0xef, 0x38, 0x70, 0x93, 0x34, 0x62, 0x2d, 0x13, 0xf5, 0xb9, 0x82, 0x5c, 0x87, 0xea, + 0xc8, 0x3d, 0xf3, 0x43, 0x77, 0xd0, 0x2a, 0x5f, 0x35, 0x56, 0xea, 0x1b, 0x4d, 0xb9, 0x4c, 0xf7, + 0xf4, 0x40, 0xe8, 0xe5, 0x42, 0xca, 0xcc, 0xf9, 0xa9, 0x02, 0xb5, 0x6c, 0x92, 0x2c, 0x82, 0x15, + 0x84, 0x41, 0x9f, 0xe1, 0x8a, 0x15, 0x2a, 0x04, 0xf2, 0x3a, 0xd8, 0xc9, 0xe9, 0x21, 0x0b, 0x06, + 0xb8, 0x60, 0x7d, 0xa3, 0x91, 0x05, 0xe5, 0xca, 0x4e, 0x89, 0xca, 0x69, 0x72, 0x0f, 0x48, 0x72, + 0xba, 0x15, 0x31, 0x37, 0x61, 0xdb, 0x6c, 0xe4, 0x87, 0x67, 0x43, 0x16, 0x24, 0x12, 0xc9, 0xcb, + 0x99, 0x53, 0xd1, 0xa0, 0x53, 0xa2, 0x53, 0xdc, 0xc8, 0x4d, 0x68, 0x28, 0xed, 0x7e, 0x34, 0x60, + 0x51, 0xab, 0x82, 0x71, 0x16, 0x0b, 0x71, 0x70, 0xae, 0x53, 0xa2, 0xe3, 0xc6, 0x64, 0x0f, 0x2e, + 0x29, 0xc5, 0xed, 0xd4, 0x3f, 0xf2, 0x7c, 0x1f, 0xb1, 0x58, 0x18, 0xe3, 0x4a, 0x21, 0x86, 0x66, + 0xd1, 0x29, 0xd1, 0x69, 0x8e, 0x3a, 0x9a, 0x5d, 0xe6, 0xc6, 0xac, 0x65, 0x4f, 0x45, 0x83, 0x73, + 0x3a, 0x1a, 0x54, 0x90, 0x1d, 0x68, 0x2a, 0xc5, 0x41, 0x14, 0x3e, 0xf4, 0xf8, 0x76, 0xaa, 0x18, + 0xe0, 0xa5, 0x42, 0x00, 0x35, 0xdd, 0x29, 0xd1, 0x09, 0x17, 0xd2, 0x81, 0x85, 0xe4, 0x74, 0xcb, + 0x0f, 0x63, 0x9d, 0xde, 0x39, 0x8c, 0xd3, 0xca, 0xe3, 0x8c, 0xcf, 0x77, 0x4a, 0x74, 0xd2, 0x49, + 0x64, 0x2a, 0x97, 0x71, 0x7a, 0xd0, 0xaa, 0x15, 0x32, 0x55, 0x34, 0x10, 0x99, 0x2a, 0x6a, 0xdb, + 0xb5, 0xac, 0xea, 0x9c, 0x2f, 0x0c, 0xa8, 0xca, 0x92, 0x26, 0x1f, 0x41, 0xd5, 0x1d, 0x0c, 0x22, + 0x16, 0xc7, 0xa2, 0x80, 0xdb, 0xd7, 0x79, 0xe9, 0xfd, 0xf2, 0x78, 0x79, 0x45, 0xeb, 0xa3, 0xf0, + 0x61, 0xd4, 0xf7, 0x4f, 0xd6, 0xdd, 0x13, 0x37, 0xbe, 0x2f, 0x7a, 0x6e, 0xbd, 0xe7, 0xc6, 0x6c, + 0xad, 0x7d, 0x96, 0xb0, 0x98, 0xaa, 0x00, 0xa4, 0x05, 0xd5, 0x9e, 0xeb, 0xbb, 0xbc, 0x34, 0x4d, + 0x2c, 0x4d, 0x25, 0xe6, 0x25, 0x5b, 0xd6, 0x4a, 0xf6, 0xfd, 0xca, 0x6f, 0xdf, 0x2c, 0x1b, 0xce, + 0xb7, 0x06, 0xd8, 0xa2, 0x48, 0xc9, 0x36, 0x54, 0x8e, 0xa2, 0x70, 0x38, 0x33, 0x12, 0xf4, 0x26, + 0xb7, 0xc0, 0x4c, 0x42, 0xd1, 0x76, 0x33, 0xc4, 0x30, 0x93, 0x90, 0x5c, 0x06, 0xdb, 0x1d, 0x72, + 0x7a, 0x24, 0x5e, 0x29, 0x39, 0xbf, 0x1a, 0x30, 0x97, 0xe5, 0xf9, 0x3c, 0x99, 0xbb, 0x0d, 0x56, + 0xf8, 0x59, 0xc0, 0xa2, 0x99, 0x51, 0x0b, 0x77, 0xf2, 0x21, 0x80, 0x9b, 0x24, 0x91, 0xd7, 0x4b, + 0x13, 0x16, 0xb7, 0xca, 0x78, 0x88, 0xa9, 0xa2, 0x53, 0xc0, 0x37, 0x95, 0x81, 0x3c, 0x65, 0x34, + 0x0f, 0x99, 0x91, 0x5b, 0x50, 0x53, 0xc6, 0x31, 0xb9, 0x01, 0xb5, 0x91, 0x12, 0xe4, 0xb1, 0x78, + 0xb1, 0x10, 0x51, 0x06, 0xca, 0xed, 0x9c, 0xef, 0x0c, 0x68, 0x16, 0x9b, 0x25, 0xdf, 0xa4, 0x71, + 0x9e, 0x9b, 0x34, 0x9f, 0x77, 0x93, 0xd3, 0x8b, 0xd1, 0xa1, 0x30, 0x4f, 0x59, 0x1c, 0xa6, 0x51, + 0x9f, 0x7d, 0x12, 0x78, 0x09, 0x3f, 0xd5, 0xfb, 0xa3, 0x14, 0xb1, 0x36, 0x28, 0x1f, 0xf2, 0xaa, + 0x18, 0xb2, 0x61, 0x18, 0x9d, 0x61, 0x96, 0x1a, 0x54, 0x4a, 0x84, 0x40, 0x65, 0xe0, 0xc5, 0x27, + 0x32, 0x1c, 0x8e, 0x25, 0x91, 0x23, 0x68, 0xa8, 0x98, 0x77, 0xa2, 0x30, 0x1d, 0x91, 0x55, 0xa8, + 0xa4, 0x81, 0x97, 0x60, 0xd4, 0xfa, 0xc6, 0x25, 0x09, 0x5a, 0x5f, 0x57, 0xe2, 0x45, 0x33, 0x8e, + 0x14, 0xbb, 0x54, 0x2e, 0x28, 0x04, 0xae, 0x1d, 0x45, 0x9e, 0xc4, 0xdf, 0xa0, 0x42, 0x90, 0x2b, + 0x6e, 0xc1, 0xc2, 0x04, 0x05, 0x1c, 0x60, 0xe0, 0x0e, 0xc5, 0x7d, 0x51, 0xa3, 0x38, 0xe6, 0x41, + 0x1e, 0xba, 0x7e, 0x2a, 0x3a, 0xb5, 0x46, 0x85, 0x20, 0x83, 0x7c, 0x6e, 0x40, 0x0d, 0xf1, 0x1e, + 0x8e, 0x58, 0x9f, 0xb4, 0x61, 0x3e, 0x62, 0x0f, 0x52, 0x2f, 0x62, 0xfc, 0x34, 0x51, 0x35, 0xf0, + 0x4f, 0x84, 0x8f, 0xf9, 0x90, 0x77, 0xa1, 0x16, 0xc9, 0x4d, 0xaa, 0x8c, 0x2d, 0x16, 0x36, 0x8f, + 0x0b, 0xaa, 0x4a, 0xca, 0x8c, 0x9d, 0xaf, 0xcb, 0x70, 0x31, 0x3f, 0xcb, 0x04, 0x8b, 0x07, 0x00, + 0x83, 0xfc, 0x68, 0x9d, 0xb5, 0x9a, 0xb4, 0x18, 0x3c, 0xd9, 0x31, 0x7b, 0x20, 0x4f, 0x2d, 0x3e, + 0x24, 0x57, 0x60, 0x2e, 0xe4, 0x77, 0x54, 0xb7, 0xbb, 0x8b, 0x3c, 0x97, 0x69, 0x26, 0x93, 0x4d, + 0xb0, 0xe2, 0xc4, 0x4d, 0x18, 0x5e, 0x76, 0x17, 0x36, 0xde, 0x90, 0x3b, 0x29, 0xc0, 0x2c, 0xca, + 0x87, 0xdc, 0x85, 0x0a, 0xcf, 0x09, 0x52, 0xad, 0x17, 0x25, 0xd5, 0x7e, 0x1e, 0x52, 0x6f, 0xc3, + 0xe2, 0x34, 0x70, 0x64, 0x0e, 0x2a, 0xfb, 0x07, 0x3b, 0x7b, 0xcd, 0x12, 0xa9, 0x43, 0x75, 0x9f, + 0x6e, 0xef, 0xd0, 0x9d, 0xed, 0xa6, 0xc1, 0x85, 0xad, 0xdd, 0xfd, 0xc3, 0xbb, 0x7b, 0x77, 0x9a, + 0x26, 0x01, 0xb0, 0xb9, 0xb0, 0xb3, 0xdd, 0x2c, 0x67, 0xc7, 0x45, 0xb3, 0x10, 0x2d, 0x26, 0xd7, + 0xc0, 0xf2, 0x12, 0x36, 0x54, 0xd5, 0x72, 0x79, 0x3a, 0x45, 0x54, 0x18, 0x39, 0x5f, 0x99, 0x00, + 0xda, 0xbd, 0x77, 0x9e, 0x27, 0x6b, 0x07, 0xec, 0x84, 0x05, 0xae, 0xec, 0xa1, 0x59, 0x42, 0x49, + 0x7f, 0xf2, 0x8e, 0xca, 0x7a, 0x19, 0xb3, 0xfe, 0xea, 0xc4, 0x96, 0xb4, 0xa1, 0x9e, 0x6b, 0xe7, + 0x6d, 0xbd, 0x82, 0x05, 0xd1, 0x00, 0xf6, 0xe6, 0x56, 0xf7, 0xee, 0xa7, 0x3b, 0x82, 0x6a, 0xc5, + 0xae, 0xa1, 0xb1, 0x6b, 0x4a, 0x76, 0x6f, 0x42, 0x3d, 0xf7, 0x8e, 0xc9, 0xea, 0x38, 0xb1, 0x0b, + 0x13, 0x28, 0x64, 0xb6, 0x25, 0xb3, 0xdf, 0x1b, 0x40, 0x26, 0x1f, 0x73, 0x1a, 0x2b, 0xc6, 0x0b, + 0xb2, 0x92, 0x1d, 0xa6, 0xa6, 0xfe, 0x18, 0xfd, 0xbb, 0xee, 0x59, 0x01, 0xfb, 0x18, 0x8b, 0xa4, + 0x55, 0xc1, 0x2d, 0xa8, 0xd7, 0x6f, 0x76, 0xe2, 0x50, 0x39, 0xef, 0x7c, 0x69, 0x82, 0x25, 0x1e, + 0x8a, 0xe7, 0xdf, 0xf1, 0x8b, 0x60, 0xe1, 0x2a, 0x0a, 0x37, 0x0a, 0x5c, 0x8b, 0x38, 0xd5, 0xd5, + 0x80, 0x02, 0xd7, 0xb2, 0x60, 0xb0, 0x99, 0x60, 0xbf, 0x97, 0xa9, 0x10, 0x78, 0x26, 0x44, 0x3d, + 0x58, 0x58, 0x0f, 0xea, 0x8d, 0x88, 0x80, 0xc5, 0xef, 0x58, 0x15, 0xdc, 0x04, 0xc8, 0x95, 0xe3, + 0x9d, 0xf6, 0xf1, 0x66, 0x77, 0xab, 0xf3, 0x2c, 0x9d, 0x76, 0x03, 0x1a, 0x63, 0x2f, 0x6a, 0xe2, + 0x28, 0xbc, 0xe2, 0x42, 0x99, 0xd7, 0x31, 0x48, 0xf4, 0xce, 0x35, 0xb0, 0x51, 0x8e, 0xb9, 0xb5, + 0x5e, 0x3b, 0x05, 0x6b, 0x51, 0x30, 0x7f, 0x98, 0x50, 0xd7, 0x9f, 0xd4, 0xff, 0x2d, 0xf3, 0xbb, + 0x30, 0xa7, 0x1e, 0x15, 0x48, 0xfe, 0x2c, 0x6b, 0x67, 0x11, 0xf2, 0x8b, 0xd3, 0xd2, 0x2e, 0x4e, + 0xf2, 0x9e, 0xca, 0xa3, 0x8d, 0x79, 0x7c, 0x4d, 0xb2, 0xa2, 0x91, 0xa0, 0x8f, 0xc7, 0x72, 0xda, + 0x86, 0x66, 0x71, 0x6a, 0xc6, 0xcc, 0xde, 0x83, 0x4b, 0x53, 0xbe, 0x73, 0xc8, 0x5b, 0x50, 0x3f, + 0xd2, 0x3e, 0x8c, 0x44, 0x96, 0xc9, 0x24, 0x42, 0xaa, 0x9b, 0x39, 0x3f, 0x9a, 0x60, 0x89, 0x4f, + 0x9a, 0xff, 0x7f, 0xf6, 0x56, 0xc7, 0xb3, 0xa7, 0xba, 0x10, 0xb7, 0x2f, 0x7e, 0xc7, 0x32, 0xf6, + 0x26, 0x40, 0xae, 0x7c, 0xa6, 0x63, 0x58, 0x6f, 0x3a, 0x41, 0xaa, 0x03, 0x96, 0x8f, 0x5f, 0x97, + 0xe3, 0x4d, 0x87, 0x93, 0x54, 0x4c, 0xf1, 0xa6, 0x43, 0xf9, 0x2f, 0x9b, 0x4e, 0x5a, 0x8b, 0xa6, + 0x63, 0xb0, 0x30, 0xf1, 0x49, 0x78, 0xfe, 0xb9, 0x73, 0x8e, 0xf8, 0x5d, 0x50, 0xfc, 0x30, 0xfc, + 0x17, 0xd6, 0xd9, 0x83, 0x4a, 0xdb, 0xf3, 0x7d, 0xfe, 0xe0, 0xcf, 0x89, 0x9a, 0xe9, 0xc1, 0x2f, + 0xc8, 0x5c, 0x87, 0xf9, 0xee, 0x29, 0x8f, 0xd8, 0x15, 0x77, 0xce, 0x32, 0x54, 0x7a, 0x9e, 0xef, + 0x4b, 0xfe, 0xeb, 0x92, 0x51, 0x6e, 0x40, 0x71, 0xa2, 0xdd, 0x7c, 0xf4, 0x64, 0xc9, 0xf8, 0xfd, + 0xc9, 0x92, 0xf1, 0xf3, 0xd3, 0x25, 0xe3, 0xd1, 0xd3, 0x25, 0xa3, 0x67, 0xe3, 0xbf, 0x3d, 0x37, + 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xad, 0x14, 0xec, 0x93, 0x38, 0x12, 0x00, 0x00, } diff --git a/types/types.proto b/types/types.proto index 665301237e..f770cbd31b 100644 --- a/types/types.proto +++ b/types/types.proto @@ -68,7 +68,9 @@ message Providers { } message TxCreateProvider { - Provider provider = 1 [(gogoproto.nullable) = false]; + bytes owner = 1 [(gogoproto.customtype)="github.com/ovrclk/akash/types/base.Bytes",(gogoproto.nullable) = false]; + repeated ProviderAttribute attributes = 2 [(gogoproto.nullable) = false]; + uint64 nonce = 3; } /* END PROVIDER */ @@ -94,6 +96,11 @@ message ProviderAttribute { string value = 2; } +message GroupSpec { + repeated ProviderAttribute requirements = 1 [(gogoproto.nullable) = false]; + repeated ResourceGroup resources = 2 [(gogoproto.nullable) = false]; +} + message DeploymentGroup { option (gogoproto.compare) = true; @@ -148,8 +155,10 @@ message Deployments { } message TxCreateDeployment { - Deployment deployment = 1; - DeploymentGroups groups = 2; + bytes tenant = 1 [(gogoproto.customtype)="github.com/ovrclk/akash/types/base.Bytes",(gogoproto.nullable) = false]; + uint64 nonce = 2; + int64 orderTTL = 3; + repeated GroupSpec groups = 4; } message Order {