Commit c07bc184 authored by xueqianLu's avatar xueqianLu

update protos.

parent 45ccf5c1
...@@ -4,5 +4,15 @@ Define base protocol-buffer. ...@@ -4,5 +4,15 @@ Define base protocol-buffer.
Please read [Guide](ProtobufStyle.md) first when you modify the *.proto* files. Please read [Guide](ProtobufStyle.md) first when you modify the *.proto* files.
# Add new module proto
1. install cloudstd
```go
go install github.com/slavovojacek/cloudstd@latest
```
2. add new module
```go
cloudstd proto --package "cmp.xxx.v1" --resource "shelf,shelves"
```
## Modules ## Modules
#!/bin/bash
modulename=${1:-""}
cloudstd proto --package "meta.$modulename.v1" --resource "shelf,shelves"
syntax = "proto3";
package meta.base.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/base/v1/resource.proto";
// The standard List request definition.
message ListShelvesRequest {
// Only retrieve shelves after this time.
google.protobuf.Timestamp after_time = 1;
// Only retrieve shelves before this time.
google.protobuf.Timestamp before_time = 2;
// The start index for pagination.
uint64 start = 3;
// The maximum number of shelves to return.
uint64 max_size = 4;
// The unique id of the parent example for which to list the shelves.
string example_id = 5;
}
// The standard List response definition.
message ListShelvesResponse {
// The retrieved list of shelves.
repeated Shelf shelves = 1;
// True if more shelves are available.
bool next = 2;
}
// The standard BatchGet request definition.
message BatchGetShelvesRequest {
// The ids of the requested shelves.
repeated string ids = 1;
}
// The standard BatchGet response definition.
message BatchGetShelvesResponse {
// The retrieved shelves.
repeated Shelf shelves = 1;
}
// The standard Get request definition.
message GetShelfRequest {
// The id of the requested shelf.
string id = 1;
}
// The standard Get response definition.
message GetShelfResponse {
// The retrieved shelf.
Shelf shelf = 1;
}
// The standard Create request definition.
message CreateShelfRequest {
// The shelf to create.
Shelf shelf = 1;
// The unique id of the parent example where the shelf is to be created.
string example_id = 2;
}
// The standard Create response definition.
message CreateShelfResponse {
// The created shelf.
Shelf shelf = 1;
}
// The standard Update request definition.
message UpdateShelfRequest {
// The id of the shelf to be updated.
string id = 1;
// The shelf which replaces the shelf on the server.
Shelf shelf = 2;
// The update mask applied to the shelf. See https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask.
google.protobuf.FieldMask update_mask = 3;
}
// The standard Update response definition.
message UpdateShelfResponse {
// The updated shelf.
Shelf shelf = 1;
}
// The standard Delete request definition.
message DeleteShelfRequest {
// The id of the shelf to be deleted.
string id = 1;
}
// The standard Delete response definition.
message DeleteShelfResponse {
// The deleted shelf.
Shelf shelf = 1;
}
syntax = "proto3";
package meta.base.v1;
import "google/protobuf/timestamp.proto";
// The default Shelf resource representation.
message Shelf {
// The unique shelf id.
string id = 1;
// Indicates when the shelf was created.
google.protobuf.Timestamp create_time = 2;
// Indicates when the shelf was last updated.
google.protobuf.Timestamp update_time = 3;
// The unique id of the parent example resource.
string example_id = 4;
// The display name for the shelf.
string display_name = 5;
}
syntax = "proto3";
package meta.base.v1;
import "meta/base/v1/request_response.proto";
// ShelfService defines methods for managing shelves.
service ShelfService {
// ListShelves retrieves a list of shelf resources from the server.
rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {}
// BatchGetShelves retrieves multiple shelf resources from the server.
rpc BatchGetShelves(BatchGetShelvesRequest) returns (BatchGetShelvesResponse) {}
// GetShelf retrieves a single shelf resource from the server.
rpc GetShelf(GetShelfRequest) returns (GetShelfResponse) {}
// CreateShelf creates a new shelf resource on the server.
rpc CreateShelf(CreateShelfRequest) returns (CreateShelfResponse) {}
// UpdateShelf updates the shelf resource on the server.
rpc UpdateShelf(UpdateShelfRequest) returns (UpdateShelfResponse) {}
// DeleteShelf deletes the shelf resource from the server.
rpc DeleteShelf(DeleteShelfRequest) returns (DeleteShelfResponse) {}
}
syntax = "proto3";
package meta.crypter.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/crypter/v1/resource.proto";
message SignRequest {
string id = 1;
bytes privk = 2;
bytes data = 3;
CryptType crypt_type = 4;
}
message SignResponse {
string id = 1;
bytes signature = 2;
}
message VerifyRequest {
string id = 1;
bytes pubkey = 2;
bytes signature = 3;
CryptType crypt_type = 4;
}
message VerifyResponse {
string id = 1;
bool verified = 2;
}
message RecoverRequest {
string id = 1;
bytes data = 2;
bytes signature = 3;
CryptType crypt_type = 4;
}
message RecoverResponse {
string id = 1;
bytes pubkey = 2;
}
message BatchSignRequest {
string id = 1;
repeated bytes privk = 2;
repeated bytes data = 3;
CryptType crypt_type = 4;
}
message BatchSignResponse {
string id = 1;
repeated bytes signature = 2;
}
message BatchVerifyRequest {
string id = 1;
repeated bytes pubkey = 2;
repeated bytes signature = 3;
CryptType crypt_type = 4;
}
message BatchVerifyResponse {
string id = 1;
repeated bool verified = 2;
}
message BatchRecoverRequest {
string id = 1;
repeated bytes data = 2;
repeated bytes signature = 3;
CryptType crypt_type = 4;
}
message BatchRecoverResponse {
string id = 1;
repeated bytes pubkey = 2;
}
syntax = "proto3";
package meta.crypter.v1;
import "google/protobuf/timestamp.proto";
enum CryptType {
CRYPT_TYPE_INVALID = 0;
CRYPT_TYPE_SECP256K1 = 1;
}
\ No newline at end of file
syntax = "proto3";
package meta.crypter.v1;
import "meta/crypter/v1/request_response.proto";
service CrypterService {
rpc Sign(SignRequest) returns (SignResponse) {}
rpc Verify(VerifyRequest) returns (VerifyResponse) {}
rpc Recover(RecoverRequest) returns (RecoverResponse) {}
rpc BatchSign(BatchSignRequest) returns (BatchSignResponse) {}
rpc BatchVerify(BatchVerifyRequest) returns (BatchVerifyResponse) {}
rpc BatchRecover(BatchRecoverRequest) returns (BatchRecoverResponse) {}
}
syntax = "proto3";
package meta.nebula.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/nebula/v1/resource.proto";
// The standard List request definition.
message ListShelvesRequest {
// Only retrieve shelves after this time.
google.protobuf.Timestamp after_time = 1;
// Only retrieve shelves before this time.
google.protobuf.Timestamp before_time = 2;
// The start index for pagination.
uint64 start = 3;
// The maximum number of shelves to return.
uint64 max_size = 4;
// The unique id of the parent example for which to list the shelves.
string example_id = 5;
}
// The standard List response definition.
message ListShelvesResponse {
// The retrieved list of shelves.
repeated Shelf shelves = 1;
// True if more shelves are available.
bool next = 2;
}
// The standard BatchGet request definition.
message BatchGetShelvesRequest {
// The ids of the requested shelves.
repeated string ids = 1;
}
// The standard BatchGet response definition.
message BatchGetShelvesResponse {
// The retrieved shelves.
repeated Shelf shelves = 1;
}
// The standard Get request definition.
message GetShelfRequest {
// The id of the requested shelf.
string id = 1;
}
// The standard Get response definition.
message GetShelfResponse {
// The retrieved shelf.
Shelf shelf = 1;
}
// The standard Create request definition.
message CreateShelfRequest {
// The shelf to create.
Shelf shelf = 1;
// The unique id of the parent example where the shelf is to be created.
string example_id = 2;
}
// The standard Create response definition.
message CreateShelfResponse {
// The created shelf.
Shelf shelf = 1;
}
// The standard Update request definition.
message UpdateShelfRequest {
// The id of the shelf to be updated.
string id = 1;
// The shelf which replaces the shelf on the server.
Shelf shelf = 2;
// The update mask applied to the shelf. See https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask.
google.protobuf.FieldMask update_mask = 3;
}
// The standard Update response definition.
message UpdateShelfResponse {
// The updated shelf.
Shelf shelf = 1;
}
// The standard Delete request definition.
message DeleteShelfRequest {
// The id of the shelf to be deleted.
string id = 1;
}
// The standard Delete response definition.
message DeleteShelfResponse {
// The deleted shelf.
Shelf shelf = 1;
}
syntax = "proto3";
package meta.nebula.v1;
import "google/protobuf/timestamp.proto";
// The default Shelf resource representation.
message Shelf {
// The unique shelf id.
string id = 1;
// Indicates when the shelf was created.
google.protobuf.Timestamp create_time = 2;
// Indicates when the shelf was last updated.
google.protobuf.Timestamp update_time = 3;
// The unique id of the parent example resource.
string example_id = 4;
// The display name for the shelf.
string display_name = 5;
}
syntax = "proto3";
package meta.nebula.v1;
import "meta/nebula/v1/request_response.proto";
// ShelfService defines methods for managing shelves.
service ShelfService {
// ListShelves retrieves a list of shelf resources from the server.
rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {}
// BatchGetShelves retrieves multiple shelf resources from the server.
rpc BatchGetShelves(BatchGetShelvesRequest) returns (BatchGetShelvesResponse) {}
// GetShelf retrieves a single shelf resource from the server.
rpc GetShelf(GetShelfRequest) returns (GetShelfResponse) {}
// CreateShelf creates a new shelf resource on the server.
rpc CreateShelf(CreateShelfRequest) returns (CreateShelfResponse) {}
// UpdateShelf updates the shelf resource on the server.
rpc UpdateShelf(UpdateShelfRequest) returns (UpdateShelfResponse) {}
// DeleteShelf deletes the shelf resource from the server.
rpc DeleteShelf(DeleteShelfRequest) returns (DeleteShelfResponse) {}
}
syntax = "proto3";
package meta.p2p.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/p2p/v1/resource.proto";
message BroadCastRequest {
MessageHeader header = 1;
bytes data = 2;
}
message BroadCastResponse {
bool success = 1;
}
message SendDataRequest {
MessageHeader header = 1;
bytes data = 2;
}
message SendDataResponse {
bool success = 1;
}
message SubscribeMessage {
MessageHeader header = 1;
repeated P2PMsgType msg_types = 2;
}
syntax = "proto3";
package meta.p2p.v1;
import "google/protobuf/timestamp.proto";
enum P2PMsgType {
P2P_MSG_TYPE_INVALID = 0;
P2P_MSG_TYPE_PING = 1;
P2P_MSG_TYPE_PONG = 2;
}
// shared between all p2p package
message MessageHeader {
// client protocol version
string client_version = 1;
// client type
int32 client_type = 2;
// allows requesters to use request data when processing a response
string id = 3;
// package create time.
google.protobuf.Timestamp create_time = 4;
// id of node that created the message (not the peer that may have sent it). =base58(multihash(nodePubKey))
string node_id = 5;
// Message type.
P2PMsgType msg_type = 6;
// Authoring node Secp256k1 public key (32bytes) - protobufs serielized
bytes node_pubkey = 7;
// signature of full message data.
bytes sign = 8;
}
syntax = "proto3";
package meta.p2p.v1;
import "meta/p2p/v1/request_response.proto";
service P2PService {
rpc BroadCastMsg(BroadCastRequest) returns (BroadCastResponse) {}
rpc SendData(SendDataRequest) returns (SendDataResponse) {}
rpc SubscribeMsg(SubscribeMsgRequest) returns (SubscribeMsgResponse) {}
}
syntax = "proto3";
package meta.ring.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/ring/v1/resource.proto";
// The standard List request definition.
message ListShelvesRequest {
// Only retrieve shelves after this time.
google.protobuf.Timestamp after_time = 1;
// Only retrieve shelves before this time.
google.protobuf.Timestamp before_time = 2;
// The start index for pagination.
uint64 start = 3;
// The maximum number of shelves to return.
uint64 max_size = 4;
// The unique id of the parent example for which to list the shelves.
string example_id = 5;
}
// The standard List response definition.
message ListShelvesResponse {
// The retrieved list of shelves.
repeated Shelf shelves = 1;
// True if more shelves are available.
bool next = 2;
}
// The standard BatchGet request definition.
message BatchGetShelvesRequest {
// The ids of the requested shelves.
repeated string ids = 1;
}
// The standard BatchGet response definition.
message BatchGetShelvesResponse {
// The retrieved shelves.
repeated Shelf shelves = 1;
}
// The standard Get request definition.
message GetShelfRequest {
// The id of the requested shelf.
string id = 1;
}
// The standard Get response definition.
message GetShelfResponse {
// The retrieved shelf.
Shelf shelf = 1;
}
// The standard Create request definition.
message CreateShelfRequest {
// The shelf to create.
Shelf shelf = 1;
// The unique id of the parent example where the shelf is to be created.
string example_id = 2;
}
// The standard Create response definition.
message CreateShelfResponse {
// The created shelf.
Shelf shelf = 1;
}
// The standard Update request definition.
message UpdateShelfRequest {
// The id of the shelf to be updated.
string id = 1;
// The shelf which replaces the shelf on the server.
Shelf shelf = 2;
// The update mask applied to the shelf. See https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask.
google.protobuf.FieldMask update_mask = 3;
}
// The standard Update response definition.
message UpdateShelfResponse {
// The updated shelf.
Shelf shelf = 1;
}
// The standard Delete request definition.
message DeleteShelfRequest {
// The id of the shelf to be deleted.
string id = 1;
}
// The standard Delete response definition.
message DeleteShelfResponse {
// The deleted shelf.
Shelf shelf = 1;
}
syntax = "proto3";
package meta.ring.v1;
import "google/protobuf/timestamp.proto";
// The default Shelf resource representation.
message Shelf {
// The unique shelf id.
string id = 1;
// Indicates when the shelf was created.
google.protobuf.Timestamp create_time = 2;
// Indicates when the shelf was last updated.
google.protobuf.Timestamp update_time = 3;
// The unique id of the parent example resource.
string example_id = 4;
// The display name for the shelf.
string display_name = 5;
}
syntax = "proto3";
package meta.ring.v1;
import "meta/ring/v1/request_response.proto";
// ShelfService defines methods for managing shelves.
service ShelfService {
// ListShelves retrieves a list of shelf resources from the server.
rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {}
// BatchGetShelves retrieves multiple shelf resources from the server.
rpc BatchGetShelves(BatchGetShelvesRequest) returns (BatchGetShelvesResponse) {}
// GetShelf retrieves a single shelf resource from the server.
rpc GetShelf(GetShelfRequest) returns (GetShelfResponse) {}
// CreateShelf creates a new shelf resource on the server.
rpc CreateShelf(CreateShelfRequest) returns (CreateShelfResponse) {}
// UpdateShelf updates the shelf resource on the server.
rpc UpdateShelf(UpdateShelfRequest) returns (UpdateShelfResponse) {}
// DeleteShelf deletes the shelf resource from the server.
rpc DeleteShelf(DeleteShelfRequest) returns (DeleteShelfResponse) {}
}
syntax = "proto3";
package meta.sentry.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/sentry/v1/resource.proto";
// The standard List request definition.
message ListShelvesRequest {
// Only retrieve shelves after this time.
google.protobuf.Timestamp after_time = 1;
// Only retrieve shelves before this time.
google.protobuf.Timestamp before_time = 2;
// The start index for pagination.
uint64 start = 3;
// The maximum number of shelves to return.
uint64 max_size = 4;
// The unique id of the parent example for which to list the shelves.
string example_id = 5;
}
// The standard List response definition.
message ListShelvesResponse {
// The retrieved list of shelves.
repeated Shelf shelves = 1;
// True if more shelves are available.
bool next = 2;
}
// The standard BatchGet request definition.
message BatchGetShelvesRequest {
// The ids of the requested shelves.
repeated string ids = 1;
}
// The standard BatchGet response definition.
message BatchGetShelvesResponse {
// The retrieved shelves.
repeated Shelf shelves = 1;
}
// The standard Get request definition.
message GetShelfRequest {
// The id of the requested shelf.
string id = 1;
}
// The standard Get response definition.
message GetShelfResponse {
// The retrieved shelf.
Shelf shelf = 1;
}
// The standard Create request definition.
message CreateShelfRequest {
// The shelf to create.
Shelf shelf = 1;
// The unique id of the parent example where the shelf is to be created.
string example_id = 2;
}
// The standard Create response definition.
message CreateShelfResponse {
// The created shelf.
Shelf shelf = 1;
}
// The standard Update request definition.
message UpdateShelfRequest {
// The id of the shelf to be updated.
string id = 1;
// The shelf which replaces the shelf on the server.
Shelf shelf = 2;
// The update mask applied to the shelf. See https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask.
google.protobuf.FieldMask update_mask = 3;
}
// The standard Update response definition.
message UpdateShelfResponse {
// The updated shelf.
Shelf shelf = 1;
}
// The standard Delete request definition.
message DeleteShelfRequest {
// The id of the shelf to be deleted.
string id = 1;
}
// The standard Delete response definition.
message DeleteShelfResponse {
// The deleted shelf.
Shelf shelf = 1;
}
syntax = "proto3";
package meta.sentry.v1;
import "google/protobuf/timestamp.proto";
// The default Shelf resource representation.
message Shelf {
// The unique shelf id.
string id = 1;
// Indicates when the shelf was created.
google.protobuf.Timestamp create_time = 2;
// Indicates when the shelf was last updated.
google.protobuf.Timestamp update_time = 3;
// The unique id of the parent example resource.
string example_id = 4;
// The display name for the shelf.
string display_name = 5;
}
message
syntax = "proto3";
package meta.sentry.v1;
import "meta/sentry/v1/request_response.proto";
// ShelfService defines methods for managing shelves.
service ShelfService {
// ListShelves retrieves a list of shelf resources from the server.
rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {}
// BatchGetShelves retrieves multiple shelf resources from the server.
rpc BatchGetShelves(BatchGetShelvesRequest) returns (BatchGetShelvesResponse) {}
// GetShelf retrieves a single shelf resource from the server.
rpc GetShelf(GetShelfRequest) returns (GetShelfResponse) {}
// CreateShelf creates a new shelf resource on the server.
rpc CreateShelf(CreateShelfRequest) returns (CreateShelfResponse) {}
// UpdateShelf updates the shelf resource on the server.
rpc UpdateShelf(UpdateShelfRequest) returns (UpdateShelfResponse) {}
// DeleteShelf deletes the shelf resource from the server.
rpc DeleteShelf(DeleteShelfRequest) returns (DeleteShelfResponse) {}
}
syntax = "proto3";
package meta.txchecker.v1;
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "meta/txchecker/v1/resource.proto";
// The standard List request definition.
message ListShelvesRequest {
// Only retrieve shelves after this time.
google.protobuf.Timestamp after_time = 1;
// Only retrieve shelves before this time.
google.protobuf.Timestamp before_time = 2;
// The start index for pagination.
uint64 start = 3;
// The maximum number of shelves to return.
uint64 max_size = 4;
// The unique id of the parent example for which to list the shelves.
string example_id = 5;
}
// The standard List response definition.
message ListShelvesResponse {
// The retrieved list of shelves.
repeated Shelf shelves = 1;
// True if more shelves are available.
bool next = 2;
}
// The standard BatchGet request definition.
message BatchGetShelvesRequest {
// The ids of the requested shelves.
repeated string ids = 1;
}
// The standard BatchGet response definition.
message BatchGetShelvesResponse {
// The retrieved shelves.
repeated Shelf shelves = 1;
}
// The standard Get request definition.
message GetShelfRequest {
// The id of the requested shelf.
string id = 1;
}
// The standard Get response definition.
message GetShelfResponse {
// The retrieved shelf.
Shelf shelf = 1;
}
// The standard Create request definition.
message CreateShelfRequest {
// The shelf to create.
Shelf shelf = 1;
// The unique id of the parent example where the shelf is to be created.
string example_id = 2;
}
// The standard Create response definition.
message CreateShelfResponse {
// The created shelf.
Shelf shelf = 1;
}
// The standard Update request definition.
message UpdateShelfRequest {
// The id of the shelf to be updated.
string id = 1;
// The shelf which replaces the shelf on the server.
Shelf shelf = 2;
// The update mask applied to the shelf. See https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask.
google.protobuf.FieldMask update_mask = 3;
}
// The standard Update response definition.
message UpdateShelfResponse {
// The updated shelf.
Shelf shelf = 1;
}
// The standard Delete request definition.
message DeleteShelfRequest {
// The id of the shelf to be deleted.
string id = 1;
}
// The standard Delete response definition.
message DeleteShelfResponse {
// The deleted shelf.
Shelf shelf = 1;
}
syntax = "proto3";
package meta.txchecker.v1;
import "google/protobuf/timestamp.proto";
// The default Shelf resource representation.
message Shelf {
// The unique shelf id.
string id = 1;
// Indicates when the shelf was created.
google.protobuf.Timestamp create_time = 2;
// Indicates when the shelf was last updated.
google.protobuf.Timestamp update_time = 3;
// The unique id of the parent example resource.
string example_id = 4;
// The display name for the shelf.
string display_name = 5;
}
syntax = "proto3";
package meta.txchecker.v1;
import "meta/txchecker/v1/request_response.proto";
// ShelfService defines methods for managing shelves.
service ShelfService {
// ListShelves retrieves a list of shelf resources from the server.
rpc ListShelves(ListShelvesRequest) returns (ListShelvesResponse) {}
// BatchGetShelves retrieves multiple shelf resources from the server.
rpc BatchGetShelves(BatchGetShelvesRequest) returns (BatchGetShelvesResponse) {}
// GetShelf retrieves a single shelf resource from the server.
rpc GetShelf(GetShelfRequest) returns (GetShelfResponse) {}
// CreateShelf creates a new shelf resource on the server.
rpc CreateShelf(CreateShelfRequest) returns (CreateShelfResponse) {}
// UpdateShelf updates the shelf resource on the server.
rpc UpdateShelf(UpdateShelfRequest) returns (UpdateShelfResponse) {}
// DeleteShelf deletes the shelf resource from the server.
rpc DeleteShelf(DeleteShelfRequest) returns (DeleteShelfResponse) {}
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* MetaP2P: 用于节点协议发现和连接,标识节点角色以及在网络中收发消息 * MetaP2P: 用于节点协议发现和连接,标识节点角色以及在网络中收发消息
* MetaRing: gateway给用户提供对外接口rpc/grpc,打包批量交易发送到v1网络和广播到v2网络 * MetaRing: gateway给用户提供对外接口rpc/grpc,打包批量交易发送到v1网络和广播到v2网络
* MetaSentry: 主要提供v1网络的交互. * MetaSentry: 主要提供v1网络的交互.
* 验签模块: 统一提供签名和验签接口. * MetaCrypter(验签模块): 统一提供签名和验签接口.
* 交易验证模块: 用于MetaRing验证交易,以及交易模拟执行. * 交易验证模块: 用于MetaRing验证交易,以及交易模拟执行.
* MetaNebula: 验证者模块,出块,执行交易,核心模块. * MetaNebula: 验证者模块,出块,执行交易,核心模块.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment