Browse Source

创建项目

yjp 11 months ago
parent
commit
d742504e62

+ 18 - 0
.gitignore

@@ -0,0 +1,18 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+.idea/
+.DS_Store
+**/bin
+
+/vendorlogs

+ 126 - 0
client/client.go

@@ -0,0 +1,126 @@
+package client
+
+import (
+	"git.sxidc.com/go-tools/utils/http_client"
+	"time"
+)
+
+const (
+	defaultTimeoutSec = 30
+)
+
+var instance *Client
+
+func InitInstance(timeout time.Duration) {
+	if instance == nil {
+		if timeout == 0 {
+			timeout = defaultTimeoutSec * time.Second
+		}
+
+		instance = New(timeout)
+	}
+}
+
+func GetInstance() *Client {
+	if instance == nil {
+		panic("还没有调用InitInstance")
+	}
+
+	return instance
+}
+
+type Client struct {
+	client  *http_client.Client
+	timeout time.Duration
+}
+
+func New(timeout time.Duration) *Client {
+	client := http_client.New()
+
+	return &Client{
+		client:  client,
+		timeout: timeout,
+	}
+}
+
+func (c *Client) post(token string, url string, request interface{}, result interface{}) error {
+	req := c.client.NewRequest(http_client.WithNewRequestTimeout(c.timeout))
+
+	resp, err := req.Post(url, request,
+		http_client.WithRequestHeaders(map[string]string{
+			"Content-Type":  "application/json",
+			"Authorization": token,
+		}))
+	if err != nil {
+		return err
+	}
+
+	err = resp.Json(result)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (c *Client) delete(token string, url string, queryMap map[string]string, result interface{}) error {
+	req := c.client.NewRequest(http_client.WithNewRequestTimeout(c.timeout))
+
+	resp, err := req.Delete(url,
+		http_client.WithRequestHeaders(map[string]string{
+			"Content-Type":  "application/json",
+			"Authorization": token,
+		}),
+		http_client.WithRequestQueryParams(queryMap))
+	if err != nil {
+		return err
+	}
+
+	err = resp.Json(result)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (c *Client) put(token string, url string, request interface{}, result interface{}) error {
+	req := c.client.NewRequest(http_client.WithNewRequestTimeout(c.timeout))
+
+	resp, err := req.Put(url, request,
+		http_client.WithRequestHeaders(map[string]string{
+			"Content-Type":  "application/json",
+			"Authorization": token,
+		}))
+	if err != nil {
+		return err
+	}
+
+	err = resp.Json(result)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (c *Client) get(token string, url string, queryMap map[string]string, result interface{}) error {
+	req := c.client.NewRequest(http_client.WithNewRequestTimeout(c.timeout))
+
+	resp, err := req.Get(url,
+		http_client.WithRequestHeaders(map[string]string{
+			"Content-Type":  "application/json",
+			"Authorization": token,
+		}),
+		http_client.WithRequestQueryParams(queryMap))
+	if err != nil {
+		return err
+	}
+
+	err = resp.Json(result)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 87 - 0
client/data_container.go

@@ -0,0 +1,87 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"git.sxidc.com/service-supports/ds-sdk/client/request"
+	"net/url"
+)
+
+const (
+	createDataContainerUrl = "/ds/api/v1/dataContainer/create"
+	deleteDataContainerUrl = "/ds/api/v1/dataContainer/delete"
+	getDataContainersUrl   = "/ds/api/v1/dataContainer/query"
+)
+
+func (c *Client) CreateDataContainer(token string, baseUrl string, namespace string, dataSource string, name string, spec string) error {
+	fullUrl, err := url.JoinPath(baseUrl, createDataContainerUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.CreateDataContainerRequest{
+		Namespace:  namespace,
+		DataSource: dataSource,
+		Name:       name,
+		Spec:       spec,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) DeleteDataContainer(token string, baseUrl string, namespace string, dataSource string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, deleteDataContainerUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.DeleteDataContainerRequest{
+		Namespace:  namespace,
+		DataSource: dataSource,
+		Name:       name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetDataContainers(token string, baseUrl string, namespace string, dataSource string, name string) ([]DataContainerInfo, error) {
+	fullUrl, err := url.JoinPath(baseUrl, getDataContainersUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(response.InfosResponse[DataContainerInfo])
+
+	err = c.get(token, fullUrl, map[string]string{
+		"namespace":  namespace,
+		"dataSource": dataSource,
+		"name":       name,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Infos, nil
+}

+ 86 - 0
client/data_source.go

@@ -0,0 +1,86 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"git.sxidc.com/service-supports/ds-sdk/client/request"
+	"net/url"
+)
+
+const (
+	createDataSourceUrl = "/ds/api/v1/dataSource/create"
+	deleteDataSourceUrl = "/ds/api/v1/dataSource/delete"
+	getDataSourcesUrl   = "/ds/api/v1/dataSource/query"
+)
+
+func (c *Client) CreateDataSource(token string, baseUrl string, namespace string, name string, typeStr string, spec string) error {
+	fullUrl, err := url.JoinPath(baseUrl, createDataSourceUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.CreateDataSourceRequest{
+		Namespace: namespace,
+		Name:      name,
+		Type:      typeStr,
+		Spec:      spec,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) DeleteDataSource(token string, baseUrl string, namespace string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, deleteDataSourceUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.DeleteDataSourceRequest{
+		Namespace: namespace,
+		Name:      name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetDataSources(token string, baseUrl string, namespace string, name string, typeStr string) ([]DataSourceInfo, error) {
+	fullUrl, err := url.JoinPath(baseUrl, getDataSourcesUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(response.InfosResponse[DataSourceInfo])
+
+	err = c.get(token, fullUrl, map[string]string{
+		"namespace": namespace,
+		"name":      name,
+		"type":      typeStr,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Infos, nil
+}

+ 39 - 0
client/infos.go

@@ -0,0 +1,39 @@
+package client
+
+type TokenInfo struct {
+	Name string `json:"name"`
+}
+
+type NamespaceInfo struct {
+	ID          string `json:"id"`
+	Name        string `json:"name"`
+	Creator     string `json:"creator"`
+	CreatedTime string `json:"createdTime"`
+}
+
+type DataSourceInfo struct {
+	Namespace   string `json:"namespace"`
+	Name        string `json:"name"`
+	Type        string `json:"type"`
+	Spec        string `json:"spec"`
+	Creator     string `json:"creator"`
+	CreatedTime string `json:"createdTime"`
+}
+
+type DataContainerInfo struct {
+	Namespace   string `json:"namespace"`
+	DataSource  string `json:"dataSource"`
+	Name        string `json:"name"`
+	Spec        string `json:"spec"`
+	Creator     string `json:"creator"`
+	CreatedTime string `json:"createdTime"`
+}
+
+type SqlInfo struct {
+	Namespace   string `json:"namespace"`
+	DataSource  string `json:"dataSource"`
+	Name        string `json:"name"`
+	Spec        string `json:"spec"`
+	Creator     string `json:"creator"`
+	CreatedTime string `json:"createdTime"`
+}

+ 80 - 0
client/namespace.go

@@ -0,0 +1,80 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"git.sxidc.com/service-supports/ds-sdk/client/request"
+	"net/url"
+)
+
+const (
+	createNamespaceUrl = "/ds/api/v1/namespace/create"
+	deleteNamespaceUrl = "/ds/api/v1/namespace/delete"
+	getNamespacesUrl   = "/ds/api/v1/namespace/query"
+)
+
+func (c *Client) CreateNamespace(token string, baseUrl string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, createNamespaceUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.CreateNamespaceRequest{
+		Name: name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) DeleteNamespace(token string, baseUrl string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, deleteNamespaceUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.DeleteNamespaceRequest{
+		Name: name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetNamespaces(token string, baseUrl string, name string) ([]NamespaceInfo, error) {
+	fullUrl, err := url.JoinPath(baseUrl, getNamespacesUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(response.InfosResponse[NamespaceInfo])
+
+	err = c.get(token, fullUrl, map[string]string{
+		"name": name,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Infos, nil
+}

+ 16 - 0
client/request/data_container.go

@@ -0,0 +1,16 @@
+package request
+
+type (
+	CreateDataContainerRequest struct {
+		Namespace  string `json:"namespace"`
+		DataSource string `json:"dataSource"`
+		Name       string `json:"name"`
+		Spec       string `json:"spec"`
+	}
+
+	DeleteDataContainerRequest struct {
+		Namespace  string `json:"namespace"`
+		DataSource string `json:"dataSource"`
+		Name       string `json:"name"`
+	}
+)

+ 15 - 0
client/request/data_source.go

@@ -0,0 +1,15 @@
+package request
+
+type (
+	CreateDataSourceRequest struct {
+		Namespace string `json:"namespace"`
+		Name      string `json:"name"`
+		Type      string `json:"type"`
+		Spec      string `json:"spec"`
+	}
+
+	DeleteDataSourceRequest struct {
+		Namespace string `json:"namespace"`
+		Name      string `json:"name"`
+	}
+)

+ 11 - 0
client/request/namespace.go

@@ -0,0 +1,11 @@
+package request
+
+type (
+	CreateNamespaceRequest struct {
+		Name string `json:"name"`
+	}
+
+	DeleteNamespaceRequest struct {
+		Name string `json:"name"`
+	}
+)

+ 34 - 0
client/request/sql.go

@@ -0,0 +1,34 @@
+package request
+
+type (
+	ExecuteRawSqlRequest struct {
+		Namespace  string `json:"namespace"`
+		DataSource string `json:"dataSource"`
+		Sql        string `json:"sql"`
+	}
+
+	ParseSqlSpecRequest struct {
+		Spec          string         `json:"sql"`
+		ExecuteParams map[string]any `json:"executeParams"`
+	}
+
+	CreateSqlRequest struct {
+		Namespace  string `json:"namespace"`
+		DataSource string `json:"dataSource"`
+		Name       string `json:"name"`
+		Spec       string `json:"sql"`
+	}
+
+	DeleteSqlRequest struct {
+		Namespace  string `json:"namespace"`
+		DataSource string `json:"dataSource"`
+		Name       string `json:"name"`
+	}
+
+	ExecuteSqlRequest struct {
+		Namespace     string         `json:"namespace"`
+		DataSource    string         `json:"dataSource"`
+		Name          string         `json:"name"`
+		ExecuteParams map[string]any `json:"executeParams"`
+	}
+)

+ 11 - 0
client/request/token.go

@@ -0,0 +1,11 @@
+package request
+
+type (
+	GenerateTokenRequest struct {
+		Name string `json:"name"`
+	}
+
+	DeleteTokenRequest struct {
+		Name string `json:"name"`
+	}
+)

+ 173 - 0
client/sql.go

@@ -0,0 +1,173 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"git.sxidc.com/service-supports/ds-sdk/client/request"
+	"net/url"
+)
+
+const (
+	executeRawSqlUrl = "/ds/api/v1/sql/rawSql/execute"
+	parseSqlSpecUrl  = "/ds/api/v1/sql/spec/parse"
+	createSqlUrl     = "/ds/api/v1/sql/create"
+	deleteSqlUrl     = "/ds/api/v1/sql/delete"
+	getSqlsUrl       = "/ds/api/v1/sql/query"
+	executeSqlUrl    = "/ds/api/v1/sql/execute"
+)
+
+func (c *Client) ExecuteRawSql(token string, baseUrl string,
+	namespace string, dataSource string, sql string) ([]map[string]any, error) {
+	fullUrl, err := url.JoinPath(baseUrl, executeRawSqlUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(struct {
+		response.MsgResponse
+		Results []map[string]any `json:"results"`
+	})
+
+	err = c.post(token, fullUrl, &request.ExecuteRawSqlRequest{
+		Namespace:  namespace,
+		DataSource: dataSource,
+		Sql:        sql,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Results, nil
+}
+
+func (c *Client) ParseSqlSpec(token string, baseUrl string, specJson string, executeParams map[string]any) (string, error) {
+	fullUrl, err := url.JoinPath(baseUrl, parseSqlSpecUrl)
+	if err != nil {
+		return "", err
+	}
+
+	resp := new(struct {
+		response.MsgResponse
+		Parsed string `json:"parsed"`
+	})
+
+	err = c.post(token, fullUrl, &request.ParseSqlSpecRequest{
+		Spec:          specJson,
+		ExecuteParams: executeParams,
+	}, resp)
+	if err != nil {
+		return "", err
+	}
+
+	if !resp.Success {
+		return "", fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Parsed, nil
+}
+
+func (c *Client) CreateSql(token string, baseUrl string, namespace string, dataSource string, name string, spec string) error {
+	fullUrl, err := url.JoinPath(baseUrl, createSqlUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.CreateSqlRequest{
+		Namespace:  namespace,
+		DataSource: dataSource,
+		Name:       name,
+		Spec:       spec,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) DeleteSql(token string, baseUrl string, namespace string, dataSource string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, deleteSqlUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.DeleteSqlRequest{
+		Namespace:  namespace,
+		DataSource: dataSource,
+		Name:       name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetSqls(token string, baseUrl string, namespace string, dataSource string, name string) ([]SqlInfo, error) {
+	fullUrl, err := url.JoinPath(baseUrl, getSqlsUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(response.InfosResponse[SqlInfo])
+
+	err = c.get(token, fullUrl, map[string]string{
+		"namespace":  namespace,
+		"dataSource": dataSource,
+		"name":       name,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Infos, nil
+}
+
+func (c *Client) ExecuteSql(token string, baseUrl string,
+	namespace string, dataSource string, name string, executeParams map[string]any) ([]map[string]any, error) {
+	fullUrl, err := url.JoinPath(baseUrl, executeSqlUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(struct {
+		response.MsgResponse
+		Results []map[string]any `json:"results"`
+	})
+
+	err = c.post(token, fullUrl, &request.ExecuteSqlRequest{
+		Namespace:     namespace,
+		DataSource:    dataSource,
+		Name:          name,
+		ExecuteParams: executeParams,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Results, nil
+}

+ 83 - 0
client/token.go

@@ -0,0 +1,83 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"git.sxidc.com/service-supports/ds-sdk/client/request"
+	"net/url"
+)
+
+const (
+	generateTokenUrl = "/ds/api/admin/token/generate"
+	deleteTokenUrl   = "/ds/api/admin/token/delete"
+	getTokensUrl     = "/ds/api/admin/token/query"
+)
+
+func (c *Client) GenerateToken(token string, baseUrl string, name string) (string, error) {
+	fullUrl, err := url.JoinPath(baseUrl, generateTokenUrl)
+	if err != nil {
+		return "", err
+	}
+
+	resp := new(struct {
+		response.MsgResponse
+		Token string `json:"token"`
+	})
+
+	err = c.post(token, fullUrl, &request.GenerateTokenRequest{
+		Name: name,
+	}, resp)
+	if err != nil {
+		return "", err
+	}
+
+	if !resp.Success {
+		return "", fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Token, nil
+}
+
+func (c *Client) DeleteToken(token string, baseUrl string, name string) error {
+	fullUrl, err := url.JoinPath(baseUrl, deleteTokenUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.post(token, fullUrl, &request.DeleteTokenRequest{
+		Name: name,
+	}, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf(resp.Msg)
+	}
+
+	return nil
+}
+
+func (c *Client) GetTokens(token string, baseUrl string, name string) ([]TokenInfo, error) {
+	fullUrl, err := url.JoinPath(baseUrl, getTokensUrl)
+	if err != nil {
+		return nil, err
+	}
+
+	resp := new(response.InfosResponse[TokenInfo])
+
+	err = c.get(token, fullUrl, map[string]string{
+		"name": name,
+	}, resp)
+	if err != nil {
+		return nil, err
+	}
+
+	if !resp.Success {
+		return nil, fmt.Errorf(resp.Msg)
+	}
+
+	return resp.Infos, nil
+}

+ 31 - 0
client/version.go

@@ -0,0 +1,31 @@
+package client
+
+import (
+	"fmt"
+	"git.sxidc.com/go-tools/api_binding/http_binding/response"
+	"net/url"
+)
+
+const (
+	versionUrl = "/ds/api/version"
+)
+
+func (c *Client) Version(baseUrl string) error {
+	fullUrl, err := url.JoinPath(baseUrl, versionUrl)
+	if err != nil {
+		return err
+	}
+
+	resp := new(response.MsgResponse)
+
+	err = c.get("", fullUrl, nil, resp)
+	if err != nil {
+		return err
+	}
+
+	if !resp.Success {
+		return fmt.Errorf("version: %s", resp.Msg)
+	}
+
+	return nil
+}

+ 48 - 0
go.mod

@@ -0,0 +1,48 @@
+module git.sxidc.com/service-supports/ds-sdk
+
+go 1.22.0
+
+require (
+	git.sxidc.com/go-tools/api_binding v1.3.23
+	git.sxidc.com/go-tools/utils v1.5.1
+)
+
+require (
+	git.sxidc.com/service-supports/fserr v0.3.2 // indirect
+	git.sxidc.com/service-supports/fslog v0.5.9 // indirect
+	git.sxidc.com/service-supports/websocket v1.3.1 // indirect
+	github.com/bytedance/sonic v1.10.0 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
+	github.com/chenzhuoyu/iasm v0.9.0 // indirect
+	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/gin-gonic/gin v1.9.1 // indirect
+	github.com/go-playground/locales v0.14.1 // indirect
+	github.com/go-playground/universal-translator v0.18.1 // indirect
+	github.com/go-playground/validator/v10 v10.15.3 // indirect
+	github.com/go-resty/resty/v2 v2.11.0 // indirect
+	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.5 // indirect
+	github.com/leodido/go-urn v1.2.4 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/olahol/melody v1.1.1 // indirect
+	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/satori/go.uuid v1.2.0 // indirect
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+	github.com/ugorji/go/codec v1.2.11 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
+	go.uber.org/zap v1.25.0 // indirect
+	golang.org/x/arch v0.5.0 // indirect
+	golang.org/x/crypto v0.19.0 // indirect
+	golang.org/x/net v0.21.0 // indirect
+	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	google.golang.org/protobuf v1.31.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

+ 162 - 0
go.sum

@@ -0,0 +1,162 @@
+git.sxidc.com/go-tools/api_binding v1.3.23 h1:vgCdYq09aiw7Vs9JeOR0OZLOjezbHugQ/3ABeakvD4g=
+git.sxidc.com/go-tools/api_binding v1.3.23/go.mod h1:SmUnRrMtODonLzWmWCGQN9uAB2TjH8g5yEKFnp4rEgU=
+git.sxidc.com/go-tools/utils v1.5.1 h1:ZieAG9u9jRSPS4mndefmJYmSxN41IWZhl6Y/VeMgFw4=
+git.sxidc.com/go-tools/utils v1.5.1/go.mod h1:d8cjo9Wz5Vm/79pg3H43woycgZ74brPO0RysPDOBh2k=
+git.sxidc.com/service-supports/fserr v0.3.2 h1:5/FCr8o2jd1kNsp5tH/ADjB9fr091JZXMMZ15ZvNZzs=
+git.sxidc.com/service-supports/fserr v0.3.2/go.mod h1:W54RoA71mfex+zARuH/iMnQPMnBXQ23qXXOkwUh2sVQ=
+git.sxidc.com/service-supports/fslog v0.5.9 h1:q2XIK2o/fk/qmByy4x5kKLC+k7kolT5LrXHcWRSffXQ=
+git.sxidc.com/service-supports/fslog v0.5.9/go.mod h1:/m03ATmmOle75qtEgvEw8a1+Dcg6iHp08M1bGFXJTBU=
+git.sxidc.com/service-supports/websocket v1.3.1 h1:1mRfUwvpg0QA2JVKVMK8YJ/B33HFpDhY9srqroIuNGc=
+git.sxidc.com/service-supports/websocket v1.3.1/go.mod h1:YqEZXkN8ZFzUp01tDlekgIJJ0Yz+67d6eTXyA0ZIkgM=
+github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
+github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
+github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk=
+github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
+github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
+github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo=
+github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.15.3 h1:S+sSpunYjNPDuXkWbK+x+bA7iXiW296KG4dL3X7xUZo=
+github.com/go-playground/validator/v10 v10.15.3/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8=
+github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
+github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/olahol/melody v1.1.1 h1:amgBhR7pDY0rA0JHWprgLF0LnVztognAwEQgf/WYLVM=
+github.com/olahol/melody v1.1.1/go.mod h1:GgkTl6Y7yWj/HtfD48Q5vLKPVoZOH+Qqgfa7CvJgJM4=
+github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
+github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
+go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
+go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y=
+golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=