From 139749db756fea34256e49bedf1de93dfc626b90 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 09:14:04 -0500 Subject: [PATCH 01/14] Initial commit, issue-13 Move logic verbatum from main to function --- assets/examples/independent/file.dot | 2 +- cmd/goimportcycle/main.go | 159 +------------------- internal/ast/build_primitives_for_module.go | 141 +++++++++++++++++ 3 files changed, 144 insertions(+), 158 deletions(-) create mode 100644 internal/ast/build_primitives_for_module.go diff --git a/assets/examples/independent/file.dot b/assets/examples/independent/file.dot index c06aa9d..d67f2ba 100644 --- a/assets/examples/independent/file.dot +++ b/assets/examples/independent/file.dot @@ -40,8 +40,8 @@ digraph { "pkg_main_file_main" [label="main.go", style="filled", fontcolor="#000000", fillcolor="#ffffff"]; }; - "pkg_a_file_a" -> "pkg_c_file_c" [color="#ff0000"]; "pkg_a_file_a" -> "pkg_b_file_b" [color="#ff0000"]; + "pkg_a_file_a" -> "pkg_c_file_c" [color="#ff0000"]; "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_c_file_c" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_main_file_main" -> "pkg_a_file_a" [color="#000000"]; diff --git a/cmd/goimportcycle/main.go b/cmd/goimportcycle/main.go index 244f628..c74d583 100644 --- a/cmd/goimportcycle/main.go +++ b/cmd/goimportcycle/main.go @@ -1,16 +1,10 @@ package main import ( - "context" "flag" - "go/ast" - "go/parser" - "go/token" - "io/fs" "log" "os" "path/filepath" - "strings" "github.com/samlitowitz/goimportcycle/internal/config" @@ -21,106 +15,6 @@ import ( "github.com/samlitowitz/goimportcycle/internal/modfile" ) -func walkDirectories(path string, errChan chan<- error) <-chan string { - dirOut := make(chan string) - - go func() { - defer close(dirOut) - err := filepath.WalkDir( - path, - func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if !d.IsDir() { - return nil - } - if strings.HasPrefix(d.Name(), ".") { - return fs.SkipDir - } - if strings.HasPrefix(d.Name(), "_") { - return fs.SkipDir - } - path, err = filepath.Abs(path) - if err != nil { - return err - } - dirOut <- path - return nil - }, - ) - if err != nil { - errChan <- err - } - }() - - return dirOut -} - -func parseFiles( - dirOut <-chan string, - errChan chan<- error, - done <-chan struct{}, -) <-chan ast.Node { - depVis, nodeOut := internalAST.NewDependencyVisitor() - - go func() { - for { - select { - case dirPath, ok := <-dirOut: - if !ok { - depVis.Close() - return - } - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, dirPath, nil, 0) - if err != nil { - errChan <- err - } - - for _, pkg := range pkgs { - ast.Walk(depVis, pkg) - } - - case <-done: - depVis.Close() - return - } - } - }() - return nodeOut -} - -func detectInputCycles( - builder *internalAST.PrimitiveBuilder, - cancel context.CancelFunc, - nodeOut <-chan ast.Node, - errChan chan<- error, - done <-chan struct{}, -) error { - go func() { - for { - select { - case node, ok := <-nodeOut: - if !ok { - cancel() - return - } - err := builder.AddNode(node) - if err != nil { - errChan <- err - return - } - - case <-done: - return - } - } - }() - <-done - return builder.MarkupImportCycles() -} - func main() { var configFile, dotFile, path, resolution string var debug bool @@ -181,31 +75,12 @@ func main() { log.Fatal("resolution must be 'file' or 'package'") } - builder := internalAST.NewPrimitiveBuilder(modulePath, moduleRootDir) - ctx, cancel := context.WithCancel(context.Background()) - errChan := make(chan error) - - go func() { - for { - select { - case err := <-errChan: - cancel() - log.Fatal(err) - case <-ctx.Done(): - return - } - } - }() - - dirOut := walkDirectories(moduleRootDir, errChan) - nodeOut := parseFiles(dirOut, errChan, ctx.Done()) - err = detectInputCycles(builder, cancel, nodeOut, errChan, ctx.Done()) - close(errChan) + packages, err := internalAST.BuildPrimitivesForModule(modulePath, moduleRootDir) if err != nil { log.Fatal(err) } - output, err := dot.Marshal(cfg, modulePath, builder.Packages()) + output, err := dot.Marshal(cfg, modulePath, packages) if err != nil { log.Fatal(err) } @@ -220,34 +95,4 @@ func main() { if err != nil { log.Fatal(err) } - - //v := tmp.NewVisitor(modulePath) - //err = filepath.WalkDir(path, v.WalkDirFn) - //if err != nil { - // log.Fatal(err) - //} - // - //cfg := internal.True - //var output []byte - // - //switch resolution { - //case "file": - // output, err = file.Marshal(cfg, modulePath, v.Packages()) - // if err != nil { - // log.Fatal(err) - // } - //case "package": - // output, err = pkg.Marshal(internal.True, modulePath, v.Packages()) - // if err != nil { - // log.Fatal(err) - // } - //default: - // log.Fatal("resolution must be 'file' or 'package'") - //} - // - //if dotFile == "" { - // os.Stdout.Write(output) - // return - //} - //ioutil.WriteFile(dotFile, output, 0644) } diff --git a/internal/ast/build_primitives_for_module.go b/internal/ast/build_primitives_for_module.go new file mode 100644 index 0000000..e3d23e0 --- /dev/null +++ b/internal/ast/build_primitives_for_module.go @@ -0,0 +1,141 @@ +package ast + +import ( + "context" + "go/ast" + "go/parser" + "go/token" + "io/fs" + "log" + "path/filepath" + "strings" + + "github.com/samlitowitz/goimportcycle/internal" +) + +func BuildPrimitivesForModule(modulePath string, moduleRootDir string) ([]*internal.Package, error) { + builder := NewPrimitiveBuilder(modulePath, moduleRootDir) + ctx, cancel := context.WithCancel(context.Background()) + errChan := make(chan error) + + go func() { + for { + select { + case err := <-errChan: + cancel() + log.Fatal(err) + case <-ctx.Done(): + return + } + } + }() + + dirOut := walkDirectories(moduleRootDir, errChan) + nodeOut := parseFiles(dirOut, errChan, ctx.Done()) + err := detectInputCycles(builder, cancel, nodeOut, errChan, ctx.Done()) + close(errChan) + if err != nil { + log.Fatal(err) + } + return builder.Packages(), nil +} + +func walkDirectories(path string, errChan chan<- error) <-chan string { + dirOut := make(chan string) + + go func() { + defer close(dirOut) + err := filepath.WalkDir( + path, + func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if !d.IsDir() { + return nil + } + if strings.HasPrefix(d.Name(), ".") { + return fs.SkipDir + } + if strings.HasPrefix(d.Name(), "_") { + return fs.SkipDir + } + path, err = filepath.Abs(path) + if err != nil { + return err + } + dirOut <- path + return nil + }, + ) + if err != nil { + errChan <- err + } + }() + + return dirOut +} + +func parseFiles( + dirOut <-chan string, + errChan chan<- error, + done <-chan struct{}, +) <-chan ast.Node { + depVis, nodeOut := NewDependencyVisitor() + + go func() { + for { + select { + case dirPath, ok := <-dirOut: + if !ok { + depVis.Close() + return + } + fset := token.NewFileSet() + pkgs, err := parser.ParseDir(fset, dirPath, nil, 0) + if err != nil { + errChan <- err + } + + for _, pkg := range pkgs { + ast.Walk(depVis, pkg) + } + + case <-done: + depVis.Close() + return + } + } + }() + return nodeOut +} + +func detectInputCycles( + builder *PrimitiveBuilder, + cancel context.CancelFunc, + nodeOut <-chan ast.Node, + errChan chan<- error, + done <-chan struct{}, +) error { + go func() { + for { + select { + case node, ok := <-nodeOut: + if !ok { + cancel() + return + } + err := builder.AddNode(node) + if err != nil { + errChan <- err + return + } + + case <-done: + return + } + } + }() + <-done + return builder.MarkupImportCycles() +} From 854e6c315eb01781ad9b8b17daf4c77a42c4921c Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 10:40:06 -0500 Subject: [PATCH 02/14] Simplify primitive parsing and building logic --- assets/examples/interlinked/file.dot | 2 +- cmd/goimportcycle/main.go | 5 +- internal/ast/build_primitives_for_module.go | 177 +++++++++----------- 3 files changed, 79 insertions(+), 105 deletions(-) diff --git a/assets/examples/interlinked/file.dot b/assets/examples/interlinked/file.dot index 0e04f69..8beaede 100644 --- a/assets/examples/interlinked/file.dot +++ b/assets/examples/interlinked/file.dot @@ -41,8 +41,8 @@ digraph { }; "pkg_a_file_a" -> "pkg_b_file_b" [color="#ff0000"]; - "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_b_file_b" -> "pkg_c_file_c" [color="#ff0000"]; + "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_c_file_c" -> "pkg_b_file_b" [color="#ff0000"]; "pkg_main_file_main" -> "pkg_a_file_a" [color="#000000"]; } diff --git a/cmd/goimportcycle/main.go b/cmd/goimportcycle/main.go index c74d583..a3877b3 100644 --- a/cmd/goimportcycle/main.go +++ b/cmd/goimportcycle/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "log" "os" "path/filepath" @@ -77,12 +78,12 @@ func main() { packages, err := internalAST.BuildPrimitivesForModule(modulePath, moduleRootDir) if err != nil { - log.Fatal(err) + log.Fatal(fmt.Errorf("build primitives for module: %w", err)) } output, err := dot.Marshal(cfg, modulePath, packages) if err != nil { - log.Fatal(err) + log.Fatal(fmt.Errorf("marshal dependency graph: %w", err)) } if dotFile == "" { _, err := os.Stdout.Write(output) diff --git a/internal/ast/build_primitives_for_module.go b/internal/ast/build_primitives_for_module.go index e3d23e0..3425125 100644 --- a/internal/ast/build_primitives_for_module.go +++ b/internal/ast/build_primitives_for_module.go @@ -2,140 +2,113 @@ package ast import ( "context" + "errors" + "fmt" "go/ast" "go/parser" "go/token" "io/fs" - "log" "path/filepath" "strings" + "sync" "github.com/samlitowitz/goimportcycle/internal" ) func BuildPrimitivesForModule(modulePath string, moduleRootDir string) ([]*internal.Package, error) { - builder := NewPrimitiveBuilder(modulePath, moduleRootDir) - ctx, cancel := context.WithCancel(context.Background()) - errChan := make(chan error) - - go func() { - for { - select { - case err := <-errChan: - cancel() - log.Fatal(err) - case <-ctx.Done(): - return + var filesToParse []string + err := filepath.WalkDir( + moduleRootDir, + func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err } - } - }() - - dirOut := walkDirectories(moduleRootDir, errChan) - nodeOut := parseFiles(dirOut, errChan, ctx.Done()) - err := detectInputCycles(builder, cancel, nodeOut, errChan, ctx.Done()) - close(errChan) + if !d.IsDir() { + return nil + } + if strings.HasPrefix(d.Name(), ".") { + return fs.SkipDir + } + if strings.HasPrefix(d.Name(), "_") { + return fs.SkipDir + } + path, err = filepath.Abs(path) + if err != nil { + return err + } + filesToParse = append(filesToParse, path) + return nil + }, + ) if err != nil { - log.Fatal(err) + return nil, fmt.Errorf("enumerate files to parse: %w", err) } - return builder.Packages(), nil -} -func walkDirectories(path string, errChan chan<- error) <-chan string { - dirOut := make(chan string) + ctx, cancel := context.WithCancelCause(context.Background()) + defer cancel(nil) + + depVis, nodeOut := NewDependencyVisitor() + defer depVis.Close() + builder := NewPrimitiveBuilder(modulePath, moduleRootDir) + + var wg sync.WaitGroup + + wg.Add(1) go func() { - defer close(dirOut) - err := filepath.WalkDir( - path, - func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if !d.IsDir() { - return nil - } - if strings.HasPrefix(d.Name(), ".") { - return fs.SkipDir - } - if strings.HasPrefix(d.Name(), "_") { - return fs.SkipDir - } - path, err = filepath.Abs(path) - if err != nil { - return err - } - dirOut <- path - return nil - }, - ) + defer wg.Done() + err := buildDependencyGraph(builder, nodeOut, ctx.Done()) if err != nil { - errChan <- err + cancel(fmt.Errorf("build depedency graph: %w", err)) } }() - return dirOut -} - -func parseFiles( - dirOut <-chan string, - errChan chan<- error, - done <-chan struct{}, -) <-chan ast.Node { - depVis, nodeOut := NewDependencyVisitor() - go func() { - for { - select { - case dirPath, ok := <-dirOut: - if !ok { - depVis.Close() - return - } - fset := token.NewFileSet() - pkgs, err := parser.ParseDir(fset, dirPath, nil, 0) - if err != nil { - errChan <- err - } - - for _, pkg := range pkgs { - ast.Walk(depVis, pkg) - } + for _, file := range filesToParse { + fset := token.NewFileSet() + pkgs, err := parser.ParseDir(fset, file, nil, 0) + if err != nil { + cancel(fmt.Errorf("parse files: %s: %w", file, err)) + } - case <-done: - depVis.Close() - return + for _, pkg := range pkgs { + ast.Walk(depVis, pkg) } } + cancel(nil) }() - return nodeOut + + wg.Wait() + + err = context.Cause(ctx) + if !errors.Is(err, context.Canceled) { + return nil, err + } + err = builder.MarkupImportCycles() + if err != nil { + return nil, err + } + return builder.Packages(), nil } -func detectInputCycles( +func buildDependencyGraph( builder *PrimitiveBuilder, - cancel context.CancelFunc, nodeOut <-chan ast.Node, - errChan chan<- error, done <-chan struct{}, ) error { - go func() { - for { - select { - case node, ok := <-nodeOut: - if !ok { - cancel() - return - } - err := builder.AddNode(node) - if err != nil { - errChan <- err - return - } - - case <-done: - return + for { + select { + case node, ok := <-nodeOut: + if !ok { + return errors.New("failed to get next node") } + err := builder.AddNode(node) + if err != nil { + return err + } + + case <-done: + return nil } - }() - <-done - return builder.MarkupImportCycles() + } } From 99fb6dc4ff6af7f79a87b2fd06e0e68e9a0b25b7 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 10:57:51 -0500 Subject: [PATCH 03/14] s --- assets/examples/interlinked/file.dot | 2 +- internal/ast/build_primitives_for_module.go | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/assets/examples/interlinked/file.dot b/assets/examples/interlinked/file.dot index 8beaede..0e04f69 100644 --- a/assets/examples/interlinked/file.dot +++ b/assets/examples/interlinked/file.dot @@ -41,8 +41,8 @@ digraph { }; "pkg_a_file_a" -> "pkg_b_file_b" [color="#ff0000"]; - "pkg_b_file_b" -> "pkg_c_file_c" [color="#ff0000"]; "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; + "pkg_b_file_b" -> "pkg_c_file_c" [color="#ff0000"]; "pkg_c_file_c" -> "pkg_b_file_b" [color="#ff0000"]; "pkg_main_file_main" -> "pkg_a_file_a" [color="#000000"]; } diff --git a/internal/ast/build_primitives_for_module.go b/internal/ast/build_primitives_for_module.go index 3425125..a25d290 100644 --- a/internal/ast/build_primitives_for_module.go +++ b/internal/ast/build_primitives_for_module.go @@ -4,15 +4,13 @@ import ( "context" "errors" "fmt" + "github.com/samlitowitz/goimportcycle/internal" "go/ast" "go/parser" "go/token" "io/fs" "path/filepath" "strings" - "sync" - - "github.com/samlitowitz/goimportcycle/internal" ) func BuildPrimitivesForModule(modulePath string, moduleRootDir string) ([]*internal.Package, error) { @@ -52,11 +50,7 @@ func BuildPrimitivesForModule(modulePath string, moduleRootDir string) ([]*inter builder := NewPrimitiveBuilder(modulePath, moduleRootDir) - var wg sync.WaitGroup - - wg.Add(1) go func() { - defer wg.Done() err := buildDependencyGraph(builder, nodeOut, ctx.Done()) if err != nil { cancel(fmt.Errorf("build depedency graph: %w", err)) @@ -78,7 +72,7 @@ func BuildPrimitivesForModule(modulePath string, moduleRootDir string) ([]*inter cancel(nil) }() - wg.Wait() + <-ctx.Done() err = context.Cause(ctx) if !errors.Is(err, context.Canceled) { From 4b5940accede5fc80a0a5c477cf36c52e4b4f21b Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:09:39 -0500 Subject: [PATCH 04/14] Remove unused --- internal/directory/emitter.go | 36 ------- internal/directory/emitter_test.go | 168 ----------------------------- 2 files changed, 204 deletions(-) delete mode 100644 internal/directory/emitter.go delete mode 100644 internal/directory/emitter_test.go diff --git a/internal/directory/emitter.go b/internal/directory/emitter.go deleted file mode 100644 index 0a005a8..0000000 --- a/internal/directory/emitter.go +++ /dev/null @@ -1,36 +0,0 @@ -package directory - -import ( - "io/fs" -) - -type Emitter struct { - out chan<- string -} - -func NewEmitter() (*Emitter, <-chan string) { - output := make(chan string) - emitter := &Emitter{out: output} - - return emitter, output -} - -func (emitter *Emitter) WalkDirFunc(path string, d fs.DirEntry, err error) error { - // any error stops all processing - if err != nil { - return err - } - - // skip individual files - if !d.IsDir() { - return nil - } - - // emit directory path - emitter.out <- path - return nil -} - -func (emitter *Emitter) Close() { - close(emitter.out) -} diff --git a/internal/directory/emitter_test.go b/internal/directory/emitter_test.go deleted file mode 100644 index 5d0ea77..0000000 --- a/internal/directory/emitter_test.go +++ /dev/null @@ -1,168 +0,0 @@ -package directory_test - -import ( - "os" - "path/filepath" - "runtime" - "testing" - - "github.com/samlitowitz/goimportcycle/internal/directory" -) - -func TestEmitter_WalkDirFunc_EmitsNothingAfterError(t *testing.T) { - // REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L600 - // -- START -- // - if runtime.GOOS == "ios" { - restore := chtmpdir(t) - defer restore() - } - - tmpDir := t.TempDir() - - origDir, err := os.Getwd() - if err != nil { - t.Fatal("finding working dir:", err) - } - if err = os.Chdir(tmpDir); err != nil { - t.Fatal("entering temp dir:", err) - } - defer os.Chdir(origDir) - // -- END -- // - - emitter, output := directory.NewEmitter() - go func(output <-chan string) { - for range output { - t.Fatal("no directories should be emitted") - } - }(output) - - err = filepath.WalkDir(tmpDir+"/NONEXISTENT_DIR", emitter.WalkDirFunc) - if err == nil { - t.Fatal("failed to emit error") - } - emitter.Close() -} - -func TestEmitter_WalkDirFunc_EmitsAppropriateDirectories(t *testing.T) { - // REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L600 - // -- START -- // - if runtime.GOOS == "ios" { - restore := chtmpdir(t) - defer restore() - } - - tmpDir := t.TempDir() - - origDir, err := os.Getwd() - if err != nil { - t.Fatal("finding working dir:", err) - } - if err = os.Chdir(tmpDir); err != nil { - t.Fatal("entering temp dir:", err) - } - defer os.Chdir(origDir) - // -- END -- // - - tree := &Node{ - "testdata", - []*Node{ - {"a.go", nil}, - {"b", []*Node{}}, - {"c.go", nil}, - { - "d", - []*Node{ - {"e.go", nil}, - {"f", []*Node{}}, - { - "g", - []*Node{ - {"h.go", nil}, - }, - }, - }, - }, - }, - } - - expectedDirectories := makeTree(t, tree) - - emitter, output := directory.NewEmitter() - go func(output <-chan string, expectedFiles map[string]struct{}) { - for actualPath := range output { - if _, ok := expectedFiles[actualPath]; !ok { - t.Fatalf("unexpected path: %s", actualPath) - } - delete(expectedFiles, actualPath) - } - if len(expectedFiles) > 0 { - missedPaths := "" - for expectedFile := range expectedFiles { - missedPaths += ", " + expectedFile - } - t.Fatalf( - "not all expected paths sent: missing %s", - missedPaths, - ) - } - }(output, expectedDirectories) - err = filepath.WalkDir(tree.name, emitter.WalkDirFunc) - if err != nil { - t.Fatal(err) - } - emitter.Close() -} - -// REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L449 -type Node struct { - name string - entries []*Node // nil if the entry is a file -} - -// REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L481 -func walkTree(n *Node, path string, f func(path string, n *Node)) { - f(path, n) - for _, e := range n.entries { - walkTree(e, filepath.Join(path, e.name), f) - } -} - -// REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L488 -func makeTree(t *testing.T, tree *Node) map[string]struct{} { - directories := make(map[string]struct{}) - walkTree(tree, tree.name, func(path string, n *Node) { - if n.entries == nil { - fd, err := os.Create(path) - if err != nil { - t.Errorf("makeTree: %v", err) - return - } - fd.Close() - } else { - os.Mkdir(path, 0770) - directories[path] = struct{}{} - } - }) - return directories -} - -// REFURL: https://github.com/golang/go/blob/988b718f4130ab5b3ce5a5774e1a58e83c92a163/src/path/filepath/path_test.go#L553 -func chtmpdir(t *testing.T) (restore func()) { - oldwd, err := os.Getwd() - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - d, err := os.MkdirTemp("", "test") - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - if err := os.Chdir(d); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - return func() { - if err := os.Chdir(oldwd); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - os.RemoveAll(d) - } -} From bb66f8680a8c104eea5c7e52ba61633dc0035b8f Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:19:05 -0500 Subject: [PATCH 05/14] All github workflow and golangci config --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index b8de3ed..542fdc2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ !.editorconfig !.gitattributes !.gitignore +!.golangci.yaml + +!.github/ From cd23294a6f6f31c1c01a6549c2fb835f1c5a5f72 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:19:17 -0500 Subject: [PATCH 06/14] Add golangci config --- .golangci.yaml | 22 ++++++++++++++++++++++ tools/tools.go | 7 +++++++ 2 files changed, 29 insertions(+) create mode 100644 .golangci.yaml create mode 100644 tools/tools.go diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..38445ab --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,22 @@ +version: "2" +linters: + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/tools/tools.go b/tools/tools.go new file mode 100644 index 0000000..41172d6 --- /dev/null +++ b/tools/tools.go @@ -0,0 +1,7 @@ +//go:build tools + +package tools + +import ( + _ "github.com/golangci/golangci-lint/cmd/golangci-lint" +) From a684461efe482ed1edd1cf274af9ebac28ea8c14 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:19:58 -0500 Subject: [PATCH 07/14] Add Taskfile --- Taskfile.dist.yaml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Taskfile.dist.yaml diff --git a/Taskfile.dist.yaml b/Taskfile.dist.yaml new file mode 100644 index 0000000..da04a9d --- /dev/null +++ b/Taskfile.dist.yaml @@ -0,0 +1,45 @@ +version: '3' + +vars: + VERSION: + sh: git describe --tags|sed -e "s/\-/\./g" + BUILD: + sh: date +%FT%T%z + COMMIT: + sh: git rev-parse HEAD + TARGETDIR: + sh: echo $GOPATH/bin + BIN: 'goimportcycle' + PROJECT_PROTO_INCLUDE: + sh: cd .. && pwd + PROJECT_PROTO_OUT: + sh: cd ../../../ && pwd + +tasks: + clean: + cmds: + - rm -f {{.TARGETDIR}}/{{.BIN}} + + release: + cmds: + - go build {{.LDFLAGS}} -o {{.TARGETDIR}}//{{.BIN}} ./cmd/{{.BIN}} + vars: + LDFLAGS: -ldflags "-X main.Date={{.BUILD}} -X main.Commit={{.COMMIT}}" + + debug: + cmds: + - go build {{.LDFLAGS}} -o {{.TARGETDIR}}//{{.BIN}} ./cmd/{{.BIN}} + vars: + LDFLAGS: -ldflags "-s -w -X main.Version={{.VERSION}} -X main.Date={{.BUILD}} -X main.Commit={{.COMMIT}}" + + generate-examples: + cmds: + - ./scripts/generate-examples.sh + + lint: + cmds: + - golangci-lint run ./... + + test: + cmds: + - go test ./... From 963fb28e1968d4e5d90428037c065b2b3416ce07 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:20:04 -0500 Subject: [PATCH 08/14] Add github workflow configuration --- .github/workflows/pipes.yaml | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/pipes.yaml diff --git a/.github/workflows/pipes.yaml b/.github/workflows/pipes.yaml new file mode 100644 index 0000000..0b0bb5f --- /dev/null +++ b/.github/workflows/pipes.yaml @@ -0,0 +1,54 @@ +name: Pipes + +on: + pull_request: + branches: + - master + paths: + - '**.go' + push: + branches: + - master + paths: + - '**.go' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version: '1.24' + - name: Install Taskfile + run: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d + - name: Install deps + run: go mod download + - name: Build + run: task release + - name: Test + run: task test + + lint: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + timeout-minutes: 3 + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 1 + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version: '1.24' + - name: Install Taskfile + run: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d + - name: Install deps + run: go mod download + - name: Build + run: task release + - name: Test + run: task test + - name: Lint + run: task lint From 67f98f7eae875b255833ce28e52b58770c7a658e Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:20:29 -0500 Subject: [PATCH 09/14] Update gomod --- go.mod | 196 +++++++++++- go.sum | 977 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1164 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index f4e2772..e3c2063 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,200 @@ module github.com/samlitowitz/goimportcycle -go 1.18 +go 1.23.0 + +toolchain go1.24.3 require ( - golang.org/x/mod v0.14.0 + golang.org/x/mod v0.24.0 gopkg.in/yaml.v3 v3.0.1 ) -require github.com/go-playground/colors v1.3.1 +require ( + github.com/go-playground/colors v1.3.1 + github.com/golangci/golangci-lint v1.64.8 +) -require github.com/google/go-cmp v0.6.0 // indirect +require ( + 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect + 4d63.com/gochecknoglobals v0.2.2 // indirect + github.com/4meepo/tagalign v1.4.2 // indirect + github.com/Abirdcfly/dupword v0.1.3 // indirect + github.com/Antonboom/errname v1.0.0 // indirect + github.com/Antonboom/nilnil v1.0.1 // indirect + github.com/Antonboom/testifylint v1.5.2 // indirect + github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect + github.com/Crocmagnon/fatcontext v0.7.1 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect + github.com/alecthomas/go-check-sumtype v0.3.1 // indirect + github.com/alexkohler/nakedret/v2 v2.0.5 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect + github.com/alingse/nilnesserr v0.1.2 // indirect + github.com/ashanbrown/forbidigo v1.6.0 // indirect + github.com/ashanbrown/makezero v1.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bkielbasa/cyclop v1.2.3 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v4 v4.5.0 // indirect + github.com/breml/bidichk v0.3.2 // indirect + github.com/breml/errchkjson v0.4.0 // indirect + github.com/butuzov/ireturn v0.3.1 // indirect + github.com/butuzov/mirror v1.3.0 // indirect + github.com/catenacyber/perfsprint v0.8.2 // indirect + github.com/ccojocar/zxcvbn-go v1.0.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charithe/durationcheck v0.0.10 // indirect + github.com/chavacava/garif v0.1.0 // indirect + github.com/ckaznocha/intrange v0.3.0 // indirect + github.com/curioswitch/go-reassign v0.3.0 // indirect + github.com/daixiang0/gci v0.13.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingaikin/go-header v0.5.0 // indirect + github.com/ettle/strcase v0.2.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/firefart/nonamedreturns v1.0.5 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/ghostiam/protogetter v0.3.9 // indirect + github.com/go-critic/go-critic v0.12.0 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect + github.com/go-toolsmith/astequal v1.2.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gofrs/flock v0.12.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect + github.com/golangci/go-printf-func-name v0.1.0 // indirect + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect + github.com/golangci/misspell v0.6.0 // indirect + github.com/golangci/plugin-module-register v0.1.1 // indirect + github.com/golangci/revgrep v0.8.0 // indirect + github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect + github.com/google/go-cmp v0.7.0 + github.com/gordonklaus/ineffassign v0.1.0 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.5.0 // indirect + github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jgautheron/goconst v1.7.1 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jjti/go-spancheck v0.6.4 // indirect + github.com/julz/importas v0.2.0 // indirect + github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect + github.com/kisielk/errcheck v1.9.0 // indirect + github.com/kkHAIKE/contextcheck v1.1.6 // indirect + github.com/kulti/thelper v0.6.3 // indirect + github.com/kunwardeep/paralleltest v1.0.10 // indirect + github.com/lasiar/canonicalheader v1.1.2 // indirect + github.com/ldez/exptostd v0.4.2 // indirect + github.com/ldez/gomoddirectives v0.6.1 // indirect + github.com/ldez/grignotin v0.9.0 // indirect + github.com/ldez/tagliatelle v0.7.1 // indirect + github.com/ldez/usetesting v0.4.2 // indirect + github.com/leonklingele/grouper v1.1.2 // indirect + github.com/macabu/inamedparam v0.1.3 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/maratori/testableexamples v1.0.0 // indirect + github.com/maratori/testpackage v1.1.1 // indirect + github.com/matoous/godox v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mgechev/revive v1.7.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moricho/tparallel v0.3.2 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nishanths/exhaustive v0.12.0 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect + github.com/nunnatsa/ginkgolinter v0.19.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/polyfloyd/go-errorlint v1.7.1 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 // indirect + github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + github.com/raeperd/recvcheck v0.2.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/ryancurrah/gomodguard v1.3.5 // indirect + github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect + github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect + github.com/securego/gosec/v2 v2.22.2 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect + github.com/sivchari/tenv v1.12.1 // indirect + github.com/sonatard/noctx v0.1.0 // indirect + github.com/sourcegraph/go-diff v0.7.0 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/tdakkota/asciicheck v0.4.1 // indirect + github.com/tetafro/godot v1.5.0 // indirect + github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 // indirect + github.com/timonwong/loggercheck v0.10.1 // indirect + github.com/tomarrell/wrapcheck/v2 v2.10.0 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect + github.com/ultraware/funlen v0.2.0 // indirect + github.com/ultraware/whitespace v0.2.0 // indirect + github.com/uudashr/gocognit v1.2.0 // indirect + github.com/uudashr/iface v1.3.1 // indirect + github.com/xen0n/gosmopolitan v1.2.2 // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.3.0 // indirect + github.com/ykadowak/zerologlint v0.1.5 // indirect + gitlab.com/bosi/decorder v0.4.2 // indirect + go-simpler.org/musttag v0.13.0 // indirect + go-simpler.org/sloglint v0.9.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/sys v0.31.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/tools v0.31.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + honnef.co/go/tools v0.6.1 // indirect + mvdan.cc/gofumpt v0.7.0 // indirect + mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f // indirect +) diff --git a/go.sum b/go.sum index eb53e21..a37e044 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,977 @@ +4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= +4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= +4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= +4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E= +github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI= +github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= +github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= +github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA= +github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI= +github.com/Antonboom/nilnil v1.0.1 h1:C3Tkm0KUxgfO4Duk3PM+ztPncTFlOf0b2qadmS0s4xs= +github.com/Antonboom/nilnil v1.0.1/go.mod h1:CH7pW2JsRNFgEh8B2UaPZTEPhCMuFowP/e8Udp9Nnb0= +github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk= +github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Crocmagnon/fatcontext v0.7.1 h1:SC/VIbRRZQeQWj/TcQBS6JmrXcfA+BU4OGSVUt54PjM= +github.com/Crocmagnon/fatcontext v0.7.1/go.mod h1:1wMvv3NXEBJucFGfwOJBxSVWcoIO6emV215SMkW9MFU= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= +github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU= +github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/alingse/nilnesserr v0.1.2 h1:Yf8Iwm3z2hUUrP4muWfW83DF4nE3r1xZ26fGWUKCZlo= +github.com/alingse/nilnesserr v0.1.2/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= +github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= +github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU= +github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= +github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v4 v4.5.0 h1:iZRsEvDdyhd2La0FVi5k6tYehpOR/R7qIUjmKk7N74A= +github.com/bombsimon/wsl/v4 v4.5.0/go.mod h1:NOQ3aLF4nD7N5YPXMruR6ZXDOAqLoM0GEpLwTdvmOSc= +github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs= +github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos= +github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk= +github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8= +github.com/butuzov/ireturn v0.3.1 h1:mFgbEI6m+9W8oP/oDdfA34dLisRFCj2G6o/yiI1yZrY= +github.com/butuzov/ireturn v0.3.1/go.mod h1:ZfRp+E7eJLC0NQmk1Nrm1LOrn/gQlOykv+cVPdiXH5M= +github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= +github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= +github.com/catenacyber/perfsprint v0.8.2 h1:+o9zVmCSVa7M4MvabsWvESEhpsMkhfE7k0sHNGL95yw= +github.com/catenacyber/perfsprint v0.8.2/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/ckaznocha/intrange v0.3.0 h1:VqnxtK32pxgkhJgYQEeOArVidIPg+ahLP7WBOXZd5ZY= +github.com/ckaznocha/intrange v0.3.0/go.mod h1:+I/o2d2A1FBHgGELbGxzIcyd3/9l9DuwjM8FsbSS3Lo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= +github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= +github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c= +github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +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/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA= +github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.9 h1:j+zlLLWzqLay22Cz/aYwTHKQ88GE2DQ6GkWSYFOI4lQ= +github.com/ghostiam/protogetter v0.3.9/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= +github.com/go-critic/go-critic v0.12.0 h1:iLosHZuye812wnkEz1Xu3aBwn5ocCPfc9yqmFG9pa6w= +github.com/go-critic/go-critic v0.12.0/go.mod h1:DpE0P6OVc6JzVYzmM5gq5jMU31zLr4am5mB/VfFK64w= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-playground/colors v1.3.1 h1:MSxzNRpTqaJrmrnChv78je4nLEMW7Tyibh0Dfy1N+as= github.com/go-playground/colors v1.3.1/go.mod h1:5rTAoESUkprj1EHZvzGti8xkb8XwAGYzYEFmW18B8es= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= +github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= +github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= +github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= +github.com/golangci/golangci-lint v1.64.8 h1:y5TdeVidMtBGG32zgSC7ZXTFNHrsJkDnpO4ItB3Am+I= +github.com/golangci/golangci-lint v1.64.8/go.mod h1:5cEsUQBSr6zi8XI8OjmcY2Xmliqc4iYL7YoPrL+zLJ4= +github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= +github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= +github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= +github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= +github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= +github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= +github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= +github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc= +github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= +github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= +github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI= +github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM= +github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M= +github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= +github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= +github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= +github.com/ldez/exptostd v0.4.2 h1:l5pOzHBz8mFOlbcifTxzfyYbgEmoUqjxLFHZkjlbHXs= +github.com/ldez/exptostd v0.4.2/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ= +github.com/ldez/gomoddirectives v0.6.1 h1:Z+PxGAY+217f/bSGjNZr/b2KTXcyYLgiWI6geMBN2Qc= +github.com/ldez/gomoddirectives v0.6.1/go.mod h1:cVBiu3AHR9V31em9u2kwfMKD43ayN5/XDgr+cdaFaKs= +github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow= +github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk= +github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk= +github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I= +github.com/ldez/usetesting v0.4.2 h1:J2WwbrFGk3wx4cZwSMiCQQ00kjGR0+tuuyW0Lqm4lwA= +github.com/ldez/usetesting v0.4.2/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= +github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= +github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgechev/revive v1.7.0 h1:JyeQ4yO5K8aZhIKf5rec56u0376h8AlKNQEmjfkjKlY= +github.com/mgechev/revive v1.7.0/go.mod h1:qZnwcNhoguE58dfi96IJeSTPeZQejNeoMQLUZGi4SW4= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= +github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.19.1 h1:mjwbOlDQxZi9Cal+KfbEJTCz327OLNfwNvoZ70NJ+c4= +github.com/nunnatsa/ginkgolinter v0.19.1/go.mod h1:jkQ3naZDmxaZMXPWaS9rblH+i+GWXQCaS/JFIWcOH2s= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/polyfloyd/go-errorlint v1.7.1 h1:RyLVXIbosq1gBdk/pChWA8zWYLsq9UEw7a1L5TVMCnA= +github.com/polyfloyd/go-errorlint v1.7.1/go.mod h1:aXjNb1x2TNhoLsk26iv1yl7a+zTnXPhwEMtEXukiLR8= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= +github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU= +github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= +github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= +github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ= +github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/securego/gosec/v2 v2.22.2 h1:IXbuI7cJninj0nRpZSLCUlotsj8jGusohfONMrHoF6g= +github.com/securego/gosec/v2 v2.22.2/go.mod h1:UEBGA+dSKb+VqM6TdehR7lnQtIIMorYJ4/9CW1KVQBE= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY= +github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw= +github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= +github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= +github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= +github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= +github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/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/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8= +github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8= +github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.5.0 h1:aNwfVI4I3+gdxjMgYPus9eHmoBeJIbnajOyqZYStzuw= +github.com/tetafro/godot v1.5.0/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3 h1:y4mJRFlM6fUyPhoXuFg/Yu02fg/nIPFMOY8tOqppoFg= +github.com/timakin/bodyclose v0.0.0-20241017074812-ed6a65f985e3/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= +github.com/timonwong/loggercheck v0.10.1 h1:uVZYClxQFpw55eh+PIoqM7uAOHMrhVcDoWDery9R8Lg= +github.com/timonwong/loggercheck v0.10.1/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/tomarrell/wrapcheck/v2 v2.10.0 h1:SzRCryzy4IrAH7bVGG4cK40tNUhmVmMDuJujy4XwYDg= +github.com/tomarrell/wrapcheck/v2 v2.10.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= +github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= +github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= +github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= +github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= +github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= +github.com/uudashr/iface v1.3.1 h1:bA51vmVx1UIhiIsQFSNq6GZ6VPTk3WNMZgRiCe9R29U= +github.com/uudashr/iface v1.3.1/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg= +github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= +go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/musttag v0.13.0 h1:Q/YAW0AHvaoaIbsPj3bvEI5/QFP7w696IMUpnKXQfCE= +go-simpler.org/musttag v0.13.0/go.mod h1:FTzIGeK6OkKlUDVpj0iQUXZLUO1Js9+mvykDQy9C5yM= +go-simpler.org/sloglint v0.9.0 h1:/40NQtjRx9txvsB/RN022KsUJU+zaaSb/9q9BSefSrE= +go-simpler.org/sloglint v0.9.0/go.mod h1:G/OrAF6uxj48sHahCzrbarVMptL2kjWTaUeC8+fOGww= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4= +golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= +golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/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.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= +honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= +mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= +mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From b3ed28d252351077e13ef6d50021ab91385a71be Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:22:22 -0500 Subject: [PATCH 10/14] Update pipes --- .github/workflows/pipes.yaml | 49 +++++++++++++++++++++++++----------- Taskfile.dist.yaml | 4 +-- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/.github/workflows/pipes.yaml b/.github/workflows/pipes.yaml index 0b0bb5f..33917af 100644 --- a/.github/workflows/pipes.yaml +++ b/.github/workflows/pipes.yaml @@ -6,33 +6,44 @@ on: - master paths: - '**.go' + types: + - labeled + - unlabeled + - opened + - synchronize push: branches: - master paths: - '**.go' +env: + GO_VERSION: stable + GOLANGCI_LINT_VERSION: v2.6.1 + jobs: build: runs-on: ubuntu-latest + if: | + github.event_name == 'push' + || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'ci')) steps: - uses: actions/checkout@v5 - name: Setup Go uses: actions/setup-go@v6 with: - go-version: '1.24' + go-version: ${{ env.GO_VERSION }} - name: Install Taskfile run: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d - name: Install deps run: go mod download - name: Build - run: task release - - name: Test - run: task test + run: GOPATH=$(pwd) ./bin/task release lint: runs-on: ubuntu-latest - if: github.event_name == 'pull_request' + if: | + github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'ci') timeout-minutes: 3 steps: - uses: actions/checkout@v5 @@ -41,14 +52,22 @@ jobs: - name: Setup Go uses: actions/setup-go@v6 with: - go-version: '1.24' - - name: Install Taskfile - run: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d - - name: Install deps - run: go mod download - - name: Build - run: task release - - name: Test - run: task test + go-version: ${{ env.GO_VERSION }} - name: Lint - run: task lint + uses: golangci/golangci-lint-action@v9 + with: + version: ${{ env.GOLANGCI_LINT_VERSION }} + + test: + runs-on: ubuntu-latest + if: | + github.event_name == 'push' + || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'ci')) + steps: + - uses: actions/checkout@v5 + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version: ${{ env.GO_VERSION }} + - name: Test + run: go test ./... diff --git a/Taskfile.dist.yaml b/Taskfile.dist.yaml index da04a9d..ddf9749 100644 --- a/Taskfile.dist.yaml +++ b/Taskfile.dist.yaml @@ -22,13 +22,13 @@ tasks: release: cmds: - - go build {{.LDFLAGS}} -o {{.TARGETDIR}}//{{.BIN}} ./cmd/{{.BIN}} + - go build {{.LDFLAGS}} -o {{.TARGETDIR}}/{{.BIN}} ./cmd/{{.BIN}} vars: LDFLAGS: -ldflags "-X main.Date={{.BUILD}} -X main.Commit={{.COMMIT}}" debug: cmds: - - go build {{.LDFLAGS}} -o {{.TARGETDIR}}//{{.BIN}} ./cmd/{{.BIN}} + - go build {{.LDFLAGS}} -o {{.TARGETDIR}}/{{.BIN}} ./cmd/{{.BIN}} vars: LDFLAGS: -ldflags "-s -w -X main.Version={{.VERSION}} -X main.Date={{.BUILD}} -X main.Commit={{.COMMIT}}" From 8e52e6c8b341f90331388369cb36f0bd279f5d7f Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 11:56:30 -0500 Subject: [PATCH 11/14] Remove Makefile --- Makefile | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 9365725..0000000 --- a/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -.PHONY: clean - -build: - go build -o ${GOPATH}/bin/goimportcycle cmd/goimportcycle/main.go - -examples: build - ./scripts/generate-examples.sh - -clean: - rm -f ${GOPATH}/bin/goimportcycle From 4c3465e9e2c03035bd660f37bd3e7eaa0e49a37f Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 14:07:16 -0500 Subject: [PATCH 12/14] Remove comment --- internal/config/config.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 3555c04..d381b11 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -186,20 +186,3 @@ func fromExternalPalette(to *inColor.HalfPalette, from *ExternalPalette) error { } return nil } - -//# File Resolution -//1. package name -//1. package background -//1. file name -//1. file background -//1. import arrow -// -//1. not in cycle/in cycle -// -// -//# Package Resolution -//1. package name -//1. package background -//1. import arrow -// -//1. not in cycle/in cycle From 920502dcd0c73da3143e3e464d139ad20b6f7607 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 18:47:56 -0500 Subject: [PATCH 13/14] Do no visualize the same relationship between packages multiple times --- assets/examples/interlinked/file.dot | 2 +- assets/examples/none/file.dot | 8 ++++++-- assets/examples/none/file.png | Bin 15656 -> 20075 bytes examples/none/c/{c.go => c_1.go} | 4 ++-- examples/none/c/c_2.go | 12 ++++++++++++ examples/none/c/c_3.go | 12 ++++++++++++ internal/ast/dependency_visitor.go | 26 ++++++++++++++++++++++---- internal/dot/package_resolution.go | 17 +++++++++++++++-- 8 files changed, 70 insertions(+), 11 deletions(-) rename examples/none/c/{c.go => c_1.go} (75%) create mode 100644 examples/none/c/c_2.go create mode 100644 examples/none/c/c_3.go diff --git a/assets/examples/interlinked/file.dot b/assets/examples/interlinked/file.dot index 0e04f69..8beaede 100644 --- a/assets/examples/interlinked/file.dot +++ b/assets/examples/interlinked/file.dot @@ -41,8 +41,8 @@ digraph { }; "pkg_a_file_a" -> "pkg_b_file_b" [color="#ff0000"]; - "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_b_file_b" -> "pkg_c_file_c" [color="#ff0000"]; + "pkg_b_file_b" -> "pkg_a_file_a" [color="#ff0000"]; "pkg_c_file_c" -> "pkg_b_file_b" [color="#ff0000"]; "pkg_main_file_main" -> "pkg_a_file_a" [color="#000000"]; } diff --git a/assets/examples/none/file.dot b/assets/examples/none/file.dot index 570790f..ce870f7 100644 --- a/assets/examples/none/file.dot +++ b/assets/examples/none/file.dot @@ -28,7 +28,9 @@ digraph { fontcolor="#000000"; fillcolor="#ffffff"; - "pkg_c_file_c" [label="c.go", style="filled", fontcolor="#000000", fillcolor="#ffffff"]; + "pkg_c_file_c_1" [label="c_1.go", style="filled", fontcolor="#000000", fillcolor="#ffffff"]; + "pkg_c_file_c_2" [label="c_2.go", style="filled", fontcolor="#000000", fillcolor="#ffffff"]; + "pkg_c_file_c_3" [label="c_3.go", style="filled", fontcolor="#000000", fillcolor="#ffffff"]; }; subgraph "cluster_pkg_main" { @@ -41,6 +43,8 @@ digraph { }; "pkg_b_file_b" -> "pkg_a_file_a" [color="#000000"]; - "pkg_c_file_c" -> "pkg_b_file_b" [color="#000000"]; + "pkg_c_file_c_1" -> "pkg_b_file_b" [color="#000000"]; + "pkg_c_file_c_2" -> "pkg_b_file_b" [color="#000000"]; + "pkg_c_file_c_3" -> "pkg_b_file_b" [color="#000000"]; "pkg_main_file_main" -> "pkg_a_file_a" [color="#000000"]; } diff --git a/assets/examples/none/file.png b/assets/examples/none/file.png index 523b73529ee2e73eb05f98fb9e1b73d3d7f67302..2d51a08c6bd07357da467ae60b3accc95e09508d 100644 GIT binary patch literal 20075 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 J$D~WQ|1Ss_e0l%? literal 15656 zcmb`uc|4Wt+cv(WK@plnp%jwLQicqnghYfgmN7EVQ&EvZ=CNc*<`6QAN~VYsGA2{z zG4uEytNr|*-}}e={k-4jeI9#%c6+bA-0NP~b)DxioX7n{>59zmU59oN2!!3Tm!y>m zge^=20*MFN7Q8ao&9WVTY}b>QktS>s|B8E;96}%*CCEyjzvdJ@(d{U)uYKdpbjVhc zZHL(&JlI9{fQ>AZOl|+Cl2-eJ+5H`^Qrg+K*mR_|_jGE!f6%w9&0ahE{sXmFY3H=QFVx&o3j&(wKO!W?6s1UlN-=! z{qp?mvRheve0+9xb{GHEvgv6nu87rz3C%(7;

KwQBm0^$uoCXB%1@jOGfL&0lvT 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 diff --git a/examples/none/c/c.go b/examples/none/c/c_1.go similarity index 75% rename from examples/none/c/c.go rename to examples/none/c/c_1.go index 1889d68..8fa8a2b 100644 --- a/examples/none/c/c.go +++ b/examples/none/c/c_1.go @@ -6,7 +6,7 @@ import ( "github.com/samlitowitz/goimportcycle/examples/none/b" ) -func Fn() { +func Fn1() { b.Fn() - log.Println("C") + log.Println("C1") } diff --git a/examples/none/c/c_2.go b/examples/none/c/c_2.go new file mode 100644 index 0000000..0d69e50 --- /dev/null +++ b/examples/none/c/c_2.go @@ -0,0 +1,12 @@ +package c + +import ( + "log" + + "github.com/samlitowitz/goimportcycle/examples/none/b" +) + +func Fn2() { + b.Fn() + log.Println("C2") +} diff --git a/examples/none/c/c_3.go b/examples/none/c/c_3.go new file mode 100644 index 0000000..f0178b2 --- /dev/null +++ b/examples/none/c/c_3.go @@ -0,0 +1,12 @@ +package c + +import ( + "log" + + "github.com/samlitowitz/goimportcycle/examples/none/b" +) + +func Fn3() { + b.Fn() + log.Println("C3") +} diff --git a/internal/ast/dependency_visitor.go b/internal/ast/dependency_visitor.go index c202b5f..edc2dfd 100644 --- a/internal/ast/dependency_visitor.go +++ b/internal/ast/dependency_visitor.go @@ -47,7 +47,8 @@ func (decl FuncDecl) IsReceiver() bool { type DependencyVisitor struct { out chan<- ast.Node - fileImports map[string]struct{} + packageFiles map[string]*File + fileImports map[string]struct{} } func NewDependencyVisitor() (*DependencyVisitor, <-chan ast.Node) { @@ -62,10 +63,12 @@ func NewDependencyVisitor() (*DependencyVisitor, <-chan ast.Node) { func (v *DependencyVisitor) Visit(node ast.Node) ast.Visitor { switch node := node.(type) { case *ast.Package: - v.emitPackageAndFiles(node) + v.packageFiles = make(map[string]*File) + v.emitPackageAndCachePackageFiles(node) case *ast.File: v.fileImports = make(map[string]struct{}) + v.emitFile(node) case *ast.ImportSpec: v.emitImportSpec(node) @@ -108,7 +111,7 @@ func (v *DependencyVisitor) Visit(node ast.Node) ast.Visitor { return v } -func (v *DependencyVisitor) emitPackageAndFiles(node *ast.Package) { +func (v *DependencyVisitor) emitPackageAndCachePackageFiles(node *ast.Package) { var setImportPathAndEmitPackage bool var dirName string for filename, astFile := range node.Files { @@ -126,7 +129,13 @@ func (v *DependencyVisitor) emitPackageAndFiles(node *ast.Package) { setImportPathAndEmitPackage = true } - v.out <- &File{ + // DIRTY HACK + // We want to associate file names with the *ast.File. + // Unfortunately the Go AST does not support this directly or indirectly at the moment. + // We'll overwrite `GoVersion` because for our use case it does not matter at preset. + // This is **REALLY** bad and should be replaced at the earliest opportunity that is not right now. + astFile.GoVersion = absPath + v.packageFiles[astFile.GoVersion] = &File{ File: astFile, AbsPath: absPath, DirName: dirName, @@ -134,6 +143,15 @@ func (v *DependencyVisitor) emitPackageAndFiles(node *ast.Package) { } } +func (v *DependencyVisitor) emitFile(node *ast.File) { + file, ok := v.packageFiles[node.GoVersion] + if !ok { + return + } + + v.out <- file +} + func (v *DependencyVisitor) emitImportSpec(node *ast.ImportSpec) { node.Path.Value = strings.Trim(node.Path.Value, "\"") pieces := strings.Split(node.Path.Value, "/") diff --git a/internal/dot/package_resolution.go b/internal/dot/package_resolution.go index ef389c5..ed0f8f7 100644 --- a/internal/dot/package_resolution.go +++ b/internal/dot/package_resolution.go @@ -42,10 +42,15 @@ func writeRelationshipsForPackageResolution(buf *bytes.Buffer, cfg *config.Confi edgeDef := ` "%s" -> "%s" [color="%s"];` + pkgRelationships := make(map[string]map[string]bool) for _, pkg := range pkgs { if pkg.IsStub { continue } + pkgName := pkgNodeName(pkg) + if _, ok := pkgRelationships[pkgName]; !ok { + pkgRelationships[pkgName] = make(map[string]bool) + } for _, file := range pkg.Files { if file.IsStub { continue @@ -57,6 +62,14 @@ func writeRelationshipsForPackageResolution(buf *bytes.Buffer, cfg *config.Confi if imp.Package.IsStub { continue } + impPkgName := pkgNodeName(imp.Package) + // don't write a relationship multiple times + // this could happen when multiple files in a package import the same package + if _, ok := pkgRelationships[pkgName][impPkgName]; ok { + continue + } + pkgRelationships[pkgName][impPkgName] = true + arrowColor := cfg.Palette.Base.ImportArrow if imp.InImportCycle { arrowColor = cfg.Palette.Cycle.ImportArrow @@ -64,8 +77,8 @@ func writeRelationshipsForPackageResolution(buf *bytes.Buffer, cfg *config.Confi buf.WriteString( fmt.Sprintf( edgeDef, - pkgNodeName(pkg), - pkgNodeName(imp.Package), + pkgName, + impPkgName, arrowColor.Hex(), ), ) From bb358b72c16ee45fb6e5576ffedbb2317f88ba37 Mon Sep 17 00:00:00 2001 From: Sam L Date: Sun, 9 Nov 2025 19:20:15 -0500 Subject: [PATCH 14/14] Address linting issues --- .golangci.yaml | 6 +++ internal/ast/dependency_visitor.go | 3 ++ internal/ast/dependency_visitor_test.go | 6 +-- internal/color/color.go | 2 +- internal/dot/file_resolution.go | 54 ++++++++++++++----------- internal/dot/marshal.go | 12 +++--- internal/dot/package_resolution.go | 36 ++++++++++------- internal/primitives.go | 8 ++-- 8 files changed, 76 insertions(+), 51 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 38445ab..67eee9d 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -11,6 +11,12 @@ linters: - third_party$ - builtin$ - examples$ + - (.+)_test\.go + settings: + staticcheck: + checks: + - all + - '-SA1019' formatters: enable: - gofmt diff --git a/internal/ast/dependency_visitor.go b/internal/ast/dependency_visitor.go index edc2dfd..f752ac2 100644 --- a/internal/ast/dependency_visitor.go +++ b/internal/ast/dependency_visitor.go @@ -193,14 +193,17 @@ func (v *DependencyVisitor) emitFuncDecl(node *ast.FuncDecl) { case *ast.StarExpr: if expr.X == nil { // panic error, invalid receiver method + panic("invalid receiver method") } ident, ok := expr.X.(*ast.Ident) if !ok { // panic error, invalid receiver method + panic("invalid receiver method") } typName = ident.String() default: // panic error, invalid receiver method + panic("invalid receiver method") } receiverName = typName qualifiedName = typName + "." + node.Name.String() diff --git a/internal/ast/dependency_visitor_test.go b/internal/ast/dependency_visitor_test.go index b22589b..5a4a343 100644 --- a/internal/ast/dependency_visitor_test.go +++ b/internal/ast/dependency_visitor_test.go @@ -1330,9 +1330,9 @@ func makeTree(t *testing.T, tree *Node) map[string]struct{} { return } } - fd.Close() + _ = fd.Close() } else { - os.Mkdir(path, 0770) + _ = os.Mkdir(path, 0770) directories[path] = struct{}{} } }) @@ -1356,6 +1356,6 @@ func chtmpdir(t *testing.T) (restore func()) { if err := os.Chdir(oldwd); err != nil { t.Fatalf("chtmpdir: %v", err) } - os.RemoveAll(d) + _ = os.RemoveAll(d) } } diff --git a/internal/color/color.go b/internal/color/color.go index c6b5535..c3ef1bf 100644 --- a/internal/color/color.go +++ b/internal/color/color.go @@ -10,7 +10,7 @@ type Color struct { } func (c Color) Hex() string { - r, g, b, _ := c.Color.RGBA() + r, g, b, _ := c.RGBA() r = r >> 8 g = g >> 8 b = b >> 8 diff --git a/internal/dot/file_resolution.go b/internal/dot/file_resolution.go index e967a63..ce93396 100644 --- a/internal/dot/file_resolution.go +++ b/internal/dot/file_resolution.go @@ -9,6 +9,7 @@ import ( ) func writeNodeDefsForFileResolution(buf *bytes.Buffer, cfg *config.Config, pkgs []*internal.Package) { + var err error clusterDefHeader := ` subgraph "cluster_%s" { label="%s"; @@ -36,15 +37,17 @@ func writeNodeDefsForFileResolution(buf *bytes.Buffer, cfg *config.Config, pkgs pkgBackground = cfg.Palette.Cycle.PackageBackground } - buf.WriteString( - fmt.Sprintf( - clusterDefHeader, - pkgNodeName(pkg), - pkg.ModuleRelativePath(), - pkgText.Hex(), - pkgBackground.Hex(), - ), + _, err = fmt.Fprintf( + buf, + clusterDefHeader, + pkgNodeName(pkg), + pkg.ModuleRelativePath(), + pkgText.Hex(), + pkgBackground.Hex(), ) + if err != nil { + panic(err) + } for _, file := range pkg.Files { if file.IsStub { continue @@ -58,21 +61,24 @@ func writeNodeDefsForFileResolution(buf *bytes.Buffer, cfg *config.Config, pkgs fileText = cfg.Palette.Cycle.FileName fileBackground = cfg.Palette.Cycle.FileBackground } - buf.WriteString( - fmt.Sprintf( - nodeDef, - fileNodeName(file), - file.FileName, - fileText.Hex(), - fileBackground.Hex(), - ), + _, err = fmt.Fprintf( + buf, + nodeDef, + fileNodeName(file), + file.FileName, + fileText.Hex(), + fileBackground.Hex(), ) + if err != nil { + panic(err) + } } buf.WriteString(clusterDefFooter) } } func writeRelationshipsForFileResolution(buf *bytes.Buffer, cfg *config.Config, pkgs []*internal.Package) { + var err error edgeDef := ` "%s" -> "%s" [color="%s"];` @@ -96,14 +102,16 @@ func writeRelationshipsForFileResolution(buf *bytes.Buffer, cfg *config.Config, if _, ok := imp.ReferencedFilesInCycle[refTyp.File.UID()]; ok { arrowColor = cfg.Palette.Cycle.ImportArrow } - buf.WriteString( - fmt.Sprintf( - edgeDef, - fileNodeName(file), - fileNodeName(refTyp.File), - arrowColor.Hex(), - ), + _, err = fmt.Fprintf( + buf, + edgeDef, + fileNodeName(file), + fileNodeName(refTyp.File), + arrowColor.Hex(), ) + if err != nil { + panic(err) + } } } } diff --git a/internal/dot/marshal.go b/internal/dot/marshal.go index 2caf8b5..b8d7abb 100644 --- a/internal/dot/marshal.go +++ b/internal/dot/marshal.go @@ -36,17 +36,19 @@ func pkgCmpFn(a, b *internal.Package) int { } func writeHeader(buf *bytes.Buffer, modulePath string) { - buf.WriteString( - fmt.Sprintf( - `digraph { + _, err := fmt.Fprintf( + buf, + `digraph { labelloc="t"; label="%s"; rankdir="TB"; node [shape="rect"]; `, - modulePath, - ), + modulePath, ) + if err != nil { + panic(err) + } } func writeFooter(buf *bytes.Buffer) { diff --git a/internal/dot/package_resolution.go b/internal/dot/package_resolution.go index ed0f8f7..0fa094f 100644 --- a/internal/dot/package_resolution.go +++ b/internal/dot/package_resolution.go @@ -9,6 +9,7 @@ import ( ) func writeNodeDefsForPackageResolution(buf *bytes.Buffer, cfg *config.Config, pkgs []*internal.Package) { + var err error nodeDef := ` "%s" [label="%s", style="filled", fontcolor="%s", fillcolor="%s"];` @@ -26,19 +27,22 @@ func writeNodeDefsForPackageResolution(buf *bytes.Buffer, cfg *config.Config, pk pkgBackground = cfg.Palette.Cycle.PackageBackground } - buf.WriteString( - fmt.Sprintf( - nodeDef, - pkgNodeName(pkg), - pkg.ModuleRelativePath(), - pkgText.Hex(), - pkgBackground.Hex(), - ), + _, err = fmt.Fprintf( + buf, + nodeDef, + pkgNodeName(pkg), + pkg.ModuleRelativePath(), + pkgText.Hex(), + pkgBackground.Hex(), ) + if err != nil { + panic(err) + } } } func writeRelationshipsForPackageResolution(buf *bytes.Buffer, cfg *config.Config, pkgs []*internal.Package) { + var err error edgeDef := ` "%s" -> "%s" [color="%s"];` @@ -74,14 +78,16 @@ func writeRelationshipsForPackageResolution(buf *bytes.Buffer, cfg *config.Confi if imp.InImportCycle { arrowColor = cfg.Palette.Cycle.ImportArrow } - buf.WriteString( - fmt.Sprintf( - edgeDef, - pkgName, - impPkgName, - arrowColor.Hex(), - ), + _, err = fmt.Fprintf( + buf, + edgeDef, + pkgName, + impPkgName, + arrowColor.Hex(), ) + if err != nil { + panic(err) + } } } } diff --git a/internal/primitives.go b/internal/primitives.go index fa67707..90e0780 100644 --- a/internal/primitives.go +++ b/internal/primitives.go @@ -140,11 +140,11 @@ func (decl Decl) UID() string { return decl.QualifiedName() } -func (d Decl) QualifiedName() string { - if d.ReceiverDecl == nil { - return d.Name +func (decl Decl) QualifiedName() string { + if decl.ReceiverDecl == nil { + return decl.Name } - return d.ReceiverDecl.Name + "." + d.Name + return decl.ReceiverDecl.Name + "." + decl.Name } type Import struct {