From df99a188bd55b27034b60d1c2f7daa7f62004917 Mon Sep 17 00:00:00 2001 From: barv Date: Sun, 2 Jun 2024 17:10:15 +0300 Subject: [PATCH 01/28] sbom ingestion --- cli/docs/flags.go | 4 + cli/docs/scan/enrich/help.go | 13 ++ cli/scancommands.go | 42 +++- commands/enrich/enrich.go | 331 ++++++++++++++++++++++++++++++++ enrichgraph/enrichgraph.go | 30 +++ enrichgraph/enrichgraph_test.go | 161 ++++++++++++++++ enrichgraph/params.go | 43 +++++ utils/results.go | 4 + utils/resultwriter.go | 33 ++++ 9 files changed, 660 insertions(+), 1 deletion(-) create mode 100644 cli/docs/scan/enrich/help.go create mode 100644 commands/enrich/enrich.go create mode 100644 enrichgraph/enrichgraph.go create mode 100644 enrichgraph/enrichgraph_test.go create mode 100644 enrichgraph/params.go diff --git a/cli/docs/flags.go b/cli/docs/flags.go index faec6ac8..66fb6e2c 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -21,6 +21,7 @@ const ( DockerScan = "docker scan" Audit = "audit" CurationAudit = "curation-audit" + Enrich = "enrich" // TODO: Deprecated commands (remove at next CLI major version) AuditMvn = "audit-maven" @@ -117,6 +118,9 @@ var commandFlags = map[string][]string{ url, user, password, accessToken, ServerId, SpecFlag, Threads, scanRecursive, scanRegexp, scanAnt, Project, Watches, RepoPath, Licenses, OutputFormat, Fail, ExtendedTable, BypassArchiveLimits, MinSeverity, FixableOnly, }, + Enrich: { + url, user, password, accessToken, ServerId, Threads, + }, BuildScan: { url, user, password, accessToken, ServerId, Project, Vuln, OutputFormat, Fail, ExtendedTable, Rescan, }, diff --git a/cli/docs/scan/enrich/help.go b/cli/docs/scan/enrich/help.go new file mode 100644 index 00000000..f1781017 --- /dev/null +++ b/cli/docs/scan/enrich/help.go @@ -0,0 +1,13 @@ +package enrich + +import ( + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" +) + +func GetDescription() string { + return "Enrich CycloneDX format JSON located on the local file-system with Xray." +} + +func GetArguments() []components.Argument { + return []components.Argument{{Name: "source pattern", Description: `Specifies the local file system path of the JSON to be scanned.`}} +} diff --git a/cli/scancommands.go b/cli/scancommands.go index 4e91bc29..7d329d98 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -24,15 +24,17 @@ import ( buildScanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/buildscan" curationDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/curation" dockerScanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/dockerscan" + enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/enrich" scanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/scan" "github.com/jfrog/jfrog-cli-security/commands/audit" "github.com/jfrog/jfrog-cli-security/commands/curation" + "github.com/jfrog/jfrog-cli-security/commands/enrich" "github.com/jfrog/jfrog-cli-security/commands/scan" "github.com/jfrog/jfrog-cli-security/utils" ) -const auditScanCategory = "Audit & Scan" +const auditScanCategory = "Audit & Scan & Import" const dockerScanCmdHiddenName = "dockerscan" @@ -47,6 +49,15 @@ func getAuditAndScansCommands() []components.Command { Category: auditScanCategory, Action: ScanCmd, }, + { + Name: "enrich", + Aliases: []string{"e"}, + Flags: flags.GetCommandFlags(flags.Enrich), + Description: enrichDocs.GetDescription(), + Arguments: enrichDocs.GetArguments(), + Category: auditScanCategory, + Action: EnrichCmd, + }, { Name: "build-scan", Aliases: []string{"bs"}, @@ -150,6 +161,35 @@ func getAuditAndScansCommands() []components.Command { } } +func EnrichCmd(c *components.Context) error { + if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { + return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) + } + serverDetails, err := createServerDetailsWithConfigOffer(c) + if err != nil { + return err + } + err = validateXrayContext(c, serverDetails) + if err != nil { + return err + } + var specFile *spec.SpecFiles + specFile = createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) + err = spec.ValidateSpec(specFile.Files, false, false) + if err != nil { + return err + } + threads, err := pluginsCommon.GetThreadsCount(c) + if err != nil { + return err + } + EnrichCmd := enrich.NewEnrichCommand(). + SetServerDetails(serverDetails). + SetThreads(threads). + SetSpec(specFile) + return commandsCommon.Exec(EnrichCmd) +} + func ScanCmd(c *components.Context) error { if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { return pluginsCommon.PrintHelpAndReturnError("providing either a argument or the 'spec' option is mandatory", c) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go new file mode 100644 index 00000000..4c7e8747 --- /dev/null +++ b/commands/enrich/enrich.go @@ -0,0 +1,331 @@ +package enrich + +import ( + "errors" + "github.com/jfrog/gofrog/parallel" + "github.com/jfrog/jfrog-cli-core/v2/common/spec" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" + "github.com/jfrog/jfrog-cli-security/enrichgraph" + "github.com/jfrog/jfrog-cli-security/formats" + "github.com/jfrog/jfrog-cli-security/scangraph" + "github.com/jfrog/jfrog-cli-security/utils" + xrutils "github.com/jfrog/jfrog-cli-security/utils" + "github.com/jfrog/jfrog-client-go/artifactory/services/fspatterns" + clientutils "github.com/jfrog/jfrog-client-go/utils" + "github.com/jfrog/jfrog-client-go/utils/errorutils" + ioUtils "github.com/jfrog/jfrog-client-go/utils/io" + "github.com/jfrog/jfrog-client-go/utils/io/fileutils" + "github.com/jfrog/jfrog-client-go/utils/log" + "github.com/jfrog/jfrog-client-go/xray/services" + "os" + "os/exec" + "regexp" + "strings" +) + +type FileContext func(string) parallel.TaskFunc +type indexFileHandlerFunc func(file string) + +type ScanInfo struct { + Target string + Result *services.ScanResponse +} + +const ( + BypassArchiveLimitsMinXrayVersion = "3.59.0" + indexingCommand = "graph" + fileNotSupportedExitCode = 3 +) + +type EnrichCommand struct { + serverDetails *config.ServerDetails + spec *spec.SpecFiles + threads int + fail bool + // The location of the downloaded Xray indexer binary on the local file system. + progress ioUtils.ProgressMgr +} + +func (enrichCmd *EnrichCommand) SetProgress(progress ioUtils.ProgressMgr) { + enrichCmd.progress = progress +} + +func (enrichCmd *EnrichCommand) SetThreads(threads int) *EnrichCommand { + enrichCmd.threads = threads + return enrichCmd +} + +func (enrichCmd *EnrichCommand) SetServerDetails(server *config.ServerDetails) *EnrichCommand { + enrichCmd.serverDetails = server + return enrichCmd +} + +func (enrichCmd *EnrichCommand) SetSpec(spec *spec.SpecFiles) *EnrichCommand { + enrichCmd.spec = spec + return enrichCmd +} + +func (enrichCmd *EnrichCommand) ServerDetails() (*config.ServerDetails, error) { + return enrichCmd.serverDetails, nil +} + +func (enrichCmd *EnrichCommand) SetFail(fail bool) *EnrichCommand { + enrichCmd.fail = fail + return enrichCmd +} + +func (enrichCmd *EnrichCommand) Run() (err error) { + defer func() { + if err != nil { + var e *exec.ExitError + if errors.As(err, &e) { + if e.ExitCode() != coreutils.ExitCodeVulnerableBuild.Code { + err = errors.New("Scan command failed. " + err.Error()) + } + } + } + }() + _, xrayVersion, err := xrutils.CreateXrayServiceManagerAndGetVersion(enrichCmd.serverDetails) + if err != nil { + return err + } + + // Validate Xray minimum version for graph scan command + err = clientutils.ValidateMinimumVersion(clientutils.Xray, xrayVersion, scangraph.GraphScanMinXrayVersion) + if err != nil { + return err + } + + log.Info("JFrog Xray version is:", xrayVersion) + + threads := 1 + if enrichCmd.threads > 1 { + threads = enrichCmd.threads + } + + // resultsArr is a two-dimensional array. Each array in it contains a list of ScanResponses that were requested and collected by a specific thread. + resultsArr := make([][]*ScanInfo, threads) + fileProducerConsumer := parallel.NewRunner(enrichCmd.threads, 20000, false) + fileProducerErrors := make([][]formats.SimpleJsonError, threads) + indexedFileProducerConsumer := parallel.NewRunner(enrichCmd.threads, 20000, false) + indexedFileProducerErrors := make([][]formats.SimpleJsonError, threads) + fileCollectingErrorsQueue := clientutils.NewErrorsQueue(1) + // Start walking on the filesystem to "produce" files that match the given pattern + // while the consumer uses the indexer to index those files. + enrichCmd.prepareScanTasks(fileProducerConsumer, indexedFileProducerConsumer, resultsArr, fileProducerErrors, indexedFileProducerErrors, fileCollectingErrorsQueue, xrayVersion) + enrichCmd.performScanTasks(fileProducerConsumer, indexedFileProducerConsumer) + + // Handle results + flatResults := []xrutils.ScaScanResult{} + for _, arr := range resultsArr { + for _, res := range arr { + flatResults = append(flatResults, xrutils.ScaScanResult{Target: res.Target, XrayResults: []services.ScanResponse{*res.Result}}) + } + } + if enrichCmd.progress != nil { + if err = enrichCmd.progress.Quit(); err != nil { + return err + } + + } + + fileCollectingErr := fileCollectingErrorsQueue.GetError() + var scanErrors []formats.SimpleJsonError + if fileCollectingErr != nil { + scanErrors = append(scanErrors, formats.SimpleJsonError{ErrorMessage: fileCollectingErr.Error()}) + } + scanErrors = appendErrorSlice(scanErrors, fileProducerErrors) + scanErrors = appendErrorSlice(scanErrors, indexedFileProducerErrors) + + scanResults := xrutils.NewAuditResults() + scanResults.XrayVersion = xrayVersion + scanResults.ScaResults = flatResults + + if err = xrutils.NewResultsWriter(scanResults). + AppendVulnsToJson(); err != nil { + return + } + + if err != nil { + return err + } + + if err = utils.RecordSecurityCommandOutput(utils.ScanCommandSummaryResult{Results: scanResults.GetSummary(), Section: utils.Binary}); err != nil { + return err + } + + // If includeVulnerabilities is false it means that context was provided, so we need to check for build violations. + // If user provided --fail=false, don't fail the build. + if enrichCmd.fail { + if xrutils.CheckIfFailBuild(scanResults.GetScaScansXrayResults()) { + return xrutils.NewFailBuildError() + } + } + if len(scanErrors) > 0 { + return errorutils.CheckErrorf(scanErrors[0].ErrorMessage) + } + log.Info("Enrich process completed successfully.") + return nil +} + +func NewEnrichCommand() *EnrichCommand { + return &EnrichCommand{} +} + +func (enrichCmd *EnrichCommand) CommandName() string { + return "xr_scan" +} + +func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, fileCollectingErrorsQueue *clientutils.ErrorsQueue, xrayVersion string) { + go func() { + defer fileProducer.Done() + // Iterate over file-spec groups and produce indexing tasks. + // When encountering an error, log and move to next group. + specFiles := enrichCmd.spec.Files + for i := range specFiles { + artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(&specFiles[i], indexedFileProducer, resultsArr, fileErrors, indexedFileErrors, xrayVersion) + taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) + + err := collectFilesForIndexing(specFiles[i], taskHandler) + if err != nil { + log.Error(err) + fileCollectingErrorsQueue.AddError(err) + } + } + }() +} + +func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(file *spec.File, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, xrayVersion string) FileContext { + return func(filePath string) parallel.TaskFunc { + return func(threadId int) (err error) { + // Add a new task to the second producer/consumer + // which will send the indexed binary to Xray and then will store the received result. + taskFunc := func(threadId int) (err error) { + fileContent, err := os.ReadFile(filePath) + if err != nil { + return err + } + params := &services.XrayGraphImportParams{ + SBOMJson: string(fileContent), + ScanType: services.Binary, + } + if enrichCmd.progress != nil { + enrichCmd.progress.SetHeadlineMsg("Scanning 🔍") + } + importGraphParams := enrichgraph.NewEnrichGraphParams(). + SetServerDetails(enrichCmd.serverDetails). + SetXrayGraphScanParams(params). + SetXrayVersion(xrayVersion) + xrayManager, err := utils.CreateXrayServiceManager(importGraphParams.ServerDetails()) + if err != nil { + return err + } + scanResults, err := enrichgraph.RunImportGraphAndGetResults(importGraphParams, xrayManager) + if err != nil { + indexedFileErrors[threadId] = append(indexedFileErrors[threadId], formats.SimpleJsonError{FilePath: filePath, ErrorMessage: err.Error()}) + return + } + resultsArr[threadId] = append(resultsArr[threadId], &ScanInfo{Target: filePath, Result: scanResults}) + return + } + + _, _ = indexedFileProducer.AddTask(taskFunc) + return + } + } +} + +func getAddTaskToProducerFunc(producer parallel.Runner, fileHandlerFunc FileContext) indexFileHandlerFunc { + return func(filePath string) { + taskFunc := fileHandlerFunc(filePath) + _, _ = producer.AddTask(taskFunc) + } +} + +func (enrichCmd *EnrichCommand) performScanTasks(fileConsumer parallel.Runner, indexedFileConsumer parallel.Runner) { + go func() { + // Blocking until consuming is finished. + fileConsumer.Run() + // After all files have been indexed, The second producer notifies that no more tasks will be produced. + indexedFileConsumer.Done() + }() + // Blocking until consuming is finished. + indexedFileConsumer.Run() +} + +func collectFilesForIndexing(fileData spec.File, dataHandlerFunc indexFileHandlerFunc) error { + + fileData.Pattern = clientutils.ReplaceTildeWithUserHome(fileData.Pattern) + patternType := fileData.GetPatternType() + rootPath, err := fspatterns.GetRootPath(fileData.Pattern, fileData.Target, "", patternType, false) + if err != nil { + return err + } + + isDir, err := fileutils.IsDirExists(rootPath, false) + if err != nil { + return err + } + + // If the path is a single file, index it and return + if !isDir { + dataHandlerFunc(rootPath) + return nil + } + fileData.Pattern = clientutils.ConvertLocalPatternToRegexp(fileData.Pattern, patternType) + return collectPatternMatchingFiles(fileData, rootPath, dataHandlerFunc) +} + +func collectPatternMatchingFiles(fileData spec.File, rootPath string, dataHandlerFunc indexFileHandlerFunc) error { + fileParams, err := fileData.ToCommonParams() + if err != nil { + return err + } + excludePathPattern := fspatterns.PrepareExcludePathPattern(fileParams.Exclusions, fileParams.GetPatternType(), fileParams.IsRecursive()) + patternRegex, err := regexp.Compile(fileData.Pattern) + if errorutils.CheckError(err) != nil { + return err + } + recursive, err := fileData.IsRecursive(true) + if err != nil { + return err + } + + paths, err := fspatterns.ListFiles(rootPath, recursive, false, false, false, excludePathPattern) + if err != nil { + return err + } + for _, path := range paths { + matches, isDir, err := fspatterns.SearchPatterns(path, false, false, patternRegex) + if err != nil { + return err + } + // Because paths should contain all files and directories (walks recursively) we can ignore dirs, as only files relevance for indexing. + if isDir { + continue + } + if len(matches) > 0 { + dataHandlerFunc(path) + } + } + return nil +} + +// Xray expects a path inside a repo, but does not accept a path to a file. +// Therefore, if the given target path is a path to a file, +// the path to the parent directory will be returned. +// Otherwise, the func will return the path itself. +func getXrayRepoPathFromTarget(target string) (repoPath string) { + if strings.HasSuffix(target, "/") { + return target + } + return target[:strings.LastIndex(target, "/")+1] +} + +func appendErrorSlice(scanErrors []formats.SimpleJsonError, errorsToAdd [][]formats.SimpleJsonError) []formats.SimpleJsonError { + for _, errorSlice := range errorsToAdd { + scanErrors = append(scanErrors, errorSlice...) + } + return scanErrors +} diff --git a/enrichgraph/enrichgraph.go b/enrichgraph/enrichgraph.go new file mode 100644 index 00000000..2a850271 --- /dev/null +++ b/enrichgraph/enrichgraph.go @@ -0,0 +1,30 @@ +package enrichgraph + +import ( + clientutils "github.com/jfrog/jfrog-client-go/utils" + "github.com/jfrog/jfrog-client-go/xray" + "github.com/jfrog/jfrog-client-go/xray/services" +) + +const ( + ScanTypeMinXrayVersion = "3.37.2" +) + +func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { + err := clientutils.ValidateMinimumVersion(clientutils.Xray, params.xrayVersion, ScanTypeMinXrayVersion) + if err != nil { + // Remove scan type param if Xray version is under the minimum supported version + params.xrayGraphImportParams.ScanType = "" + } + + scanId, err := xrayManager.ImportGraph(*params.xrayGraphImportParams) + if err != nil { + return nil, err + } + + scanResult, err := xrayManager.GetImportGraphResults(scanId) + if err != nil { + return nil, err + } + return scanResult, nil +} diff --git a/enrichgraph/enrichgraph_test.go b/enrichgraph/enrichgraph_test.go new file mode 100644 index 00000000..7c343234 --- /dev/null +++ b/enrichgraph/enrichgraph_test.go @@ -0,0 +1,161 @@ +package enrichgraph + +import ( + "github.com/jfrog/jfrog-client-go/xray/services" + "github.com/stretchr/testify/assert" + "reflect" + "testing" +) + +func TestFilterResultIfNeeded(t *testing.T) { + // Define test cases + tests := []struct { + name string + scanResult services.ScanResponse + params EnrichGraphParams + expected services.ScanResponse + }{ + { + name: "Should not filter", + scanResult: services.ScanResponse{}, + params: EnrichGraphParams{}, + expected: services.ScanResponse{}, + }, + { + name: "No filter level specified", + scanResult: services.ScanResponse{ + Violations: []services.Violation{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + Vulnerabilities: []services.Vulnerability{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + }, + params: EnrichGraphParams{ + severityLevel: 0, + }, + expected: services.ScanResponse{ + Violations: []services.Violation{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + Vulnerabilities: []services.Vulnerability{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + }, + }, + { + name: "Filter violations and vulnerabilities by high severity", + scanResult: services.ScanResponse{ + Violations: []services.Violation{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + Vulnerabilities: []services.Vulnerability{ + {Severity: "Low"}, + {Severity: "Medium"}, + {Severity: "High"}, + {Severity: "Critical"}, + }, + }, + params: v{ + severityLevel: 15, + }, + expected: services.ScanResponse{ + Violations: []services.Violation{ + {Severity: "High"}, + {Severity: "Critical"}, + }, + Vulnerabilities: []services.Vulnerability{ + {Severity: "High"}, + {Severity: "Critical"}, + }, + }, + }, + } + + // Run test cases + for i := range tests { + t.Run(tests[i].name, func(t *testing.T) { + // Call the function with the input parameters + actual := filterResultIfNeeded(&tests[i].scanResult, &tests[i].params) + // Check that the function returned the expected result + assert.True(t, reflect.DeepEqual(*actual, tests[i].expected)) + }) + } +} + +func TestGetFixableComponents(t *testing.T) { + // create test cases + testCases := []struct { + name string + components map[string]services.Component + expectedMap map[string]services.Component + }{ + { + name: "Returns an empty map when all components have no fixed versions", + components: map[string]services.Component{ + "vuln1": { + FixedVersions: []string{}, + }, + "vuln2": { + FixedVersions: []string{}, + }, + }, + expectedMap: map[string]services.Component{}, + }, + { + name: "Returns a filtered map with only components that have fixed versions", + components: map[string]services.Component{ + "vuln1": { + FixedVersions: []string{}, + }, + "vuln2": { + FixedVersions: []string{"1.0.0"}, + }, + "vuln3": { + FixedVersions: []string{"2.0.0", "3.0.0"}, + }, + "vuln4": { + FixedVersions: []string{}, + }, + }, + expectedMap: map[string]services.Component{ + "vuln2": { + FixedVersions: []string{"1.0.0"}, + }, + "vuln3": { + FixedVersions: []string{"2.0.0", "3.0.0"}, + }, + }, + }, + } + + // run test cases + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + actualMap := getFixableComponents(tc.components) + assert.Equal(t, len(tc.expectedMap), len(actualMap)) + for k, v := range tc.expectedMap { + if v.FixedVersions == nil { + assert.True(t, actualMap[k].FixedVersions == nil) + } else { + assert.Equal(t, len(actualMap[k].FixedVersions), len(v.FixedVersions)) + } + } + }) + } +} diff --git a/enrichgraph/params.go b/enrichgraph/params.go new file mode 100644 index 00000000..64aa9249 --- /dev/null +++ b/enrichgraph/params.go @@ -0,0 +1,43 @@ +package enrichgraph + +import ( + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-client-go/xray/services" +) + +type EnrichGraphParams struct { + serverDetails *config.ServerDetails + xrayGraphImportParams *services.XrayGraphImportParams + xrayVersion string +} + +func NewEnrichGraphParams() *EnrichGraphParams { + return &EnrichGraphParams{} +} + +func (sgp *EnrichGraphParams) SetServerDetails(serverDetails *config.ServerDetails) *EnrichGraphParams { + sgp.serverDetails = serverDetails + return sgp +} + +func (sgp *EnrichGraphParams) SetXrayGraphScanParams(params *services.XrayGraphImportParams) *EnrichGraphParams { + sgp.xrayGraphImportParams = params + return sgp +} + +func (sgp *EnrichGraphParams) SetXrayVersion(xrayVersion string) *EnrichGraphParams { + sgp.xrayVersion = xrayVersion + return sgp +} + +func (sgp *EnrichGraphParams) XrayGraphImportParams() *services.XrayGraphImportParams { + return sgp.xrayGraphImportParams +} + +func (sgp *EnrichGraphParams) XrayVersion() string { + return sgp.xrayVersion +} + +func (sgp *EnrichGraphParams) ServerDetails() *config.ServerDetails { + return sgp.serverDetails +} diff --git a/utils/results.go b/utils/results.go index 43870ac4..57bfb558 100644 --- a/utils/results.go +++ b/utils/results.go @@ -30,6 +30,10 @@ func (r *Results) GetScaScansXrayResults() (results []services.ScanResponse) { return } +func (r *Results) getScaScanFileName() string { + return r.ScaResults[0].Target +} + func (r *Results) GetScaScannedTechnologies() []coreutils.Technology { technologies := datastructures.MakeSet[coreutils.Technology]() for _, scaResult := range r.ScaResults { diff --git a/utils/resultwriter.go b/utils/resultwriter.go index ef2a1ed2..e4d55ee7 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io/ioutil" "strconv" "strings" @@ -47,6 +48,11 @@ type ResultsWriter struct { messages []string } +type Vulnerability struct { + BomRef string `json:"bom-ref"` + ID string `json:"id"` +} + func NewResultsWriter(scanResults *Results) *ResultsWriter { return &ResultsWriter{results: scanResults} } @@ -110,6 +116,33 @@ func (rw *ResultsWriter) PrintScanResults() error { } return nil } + +func (rw *ResultsWriter) AppendVulnsToJson() error { + fileName := rw.results.getScaScanFileName() + fileContent, err := ioutil.ReadFile(fileName) + if err != nil { + fmt.Println("Error reading file:", err) + return err + } + var data map[string]interface{} + err = json.Unmarshal(fileContent, &data) + if err != nil { + fmt.Println("Error parsing JSON:", err) + return err + } + var vulnerabilities []map[string]string + xrayResults := rw.results.GetScaScansXrayResults()[0] + for _, vuln := range xrayResults.Vulnerabilities { + for component := range vuln.Components { + vulnerability := map[string]string{"bom-ref": component, "id": vuln.Cves[0].Id} + vulnerabilities = append(vulnerabilities, vulnerability) + } + } + data["vulnerabilities"] = vulnerabilities + return PrintJson(data) + +} + func (rw *ResultsWriter) printScanResultsTables() (err error) { printMessages(rw.messages) violations, vulnerabilities, licenses := SplitScanResults(rw.results.ScaResults) From 56cb83f25f9280ae2fb336e6e3f7847bb76d03db Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 6 Jun 2024 13:53:38 +0300 Subject: [PATCH 02/28] sbom ingestion --- cli/scancommands.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/scancommands.go b/cli/scancommands.go index 7d329d98..0810afb3 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -50,8 +50,8 @@ func getAuditAndScansCommands() []components.Command { Action: ScanCmd, }, { - Name: "enrich", - Aliases: []string{"e"}, + Name: "sbom-enrich", + Aliases: []string{"se"}, Flags: flags.GetCommandFlags(flags.Enrich), Description: enrichDocs.GetDescription(), Arguments: enrichDocs.GetArguments(), From 0eac481ac2aced4703db20f6ccf4f3f22ecd9010 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 10:48:02 +0300 Subject: [PATCH 03/28] merge dev --- enrichgraph/enrichgraph.go | 11 --- enrichgraph/enrichgraph_test.go | 161 -------------------------------- utils/resultwriter.go | 4 + 3 files changed, 4 insertions(+), 172 deletions(-) delete mode 100644 enrichgraph/enrichgraph_test.go diff --git a/enrichgraph/enrichgraph.go b/enrichgraph/enrichgraph.go index 2a850271..00132b81 100644 --- a/enrichgraph/enrichgraph.go +++ b/enrichgraph/enrichgraph.go @@ -1,22 +1,11 @@ package enrichgraph import ( - clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/xray" "github.com/jfrog/jfrog-client-go/xray/services" ) -const ( - ScanTypeMinXrayVersion = "3.37.2" -) - func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { - err := clientutils.ValidateMinimumVersion(clientutils.Xray, params.xrayVersion, ScanTypeMinXrayVersion) - if err != nil { - // Remove scan type param if Xray version is under the minimum supported version - params.xrayGraphImportParams.ScanType = "" - } - scanId, err := xrayManager.ImportGraph(*params.xrayGraphImportParams) if err != nil { return nil, err diff --git a/enrichgraph/enrichgraph_test.go b/enrichgraph/enrichgraph_test.go deleted file mode 100644 index 7c343234..00000000 --- a/enrichgraph/enrichgraph_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package enrichgraph - -import ( - "github.com/jfrog/jfrog-client-go/xray/services" - "github.com/stretchr/testify/assert" - "reflect" - "testing" -) - -func TestFilterResultIfNeeded(t *testing.T) { - // Define test cases - tests := []struct { - name string - scanResult services.ScanResponse - params EnrichGraphParams - expected services.ScanResponse - }{ - { - name: "Should not filter", - scanResult: services.ScanResponse{}, - params: EnrichGraphParams{}, - expected: services.ScanResponse{}, - }, - { - name: "No filter level specified", - scanResult: services.ScanResponse{ - Violations: []services.Violation{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - Vulnerabilities: []services.Vulnerability{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - }, - params: EnrichGraphParams{ - severityLevel: 0, - }, - expected: services.ScanResponse{ - Violations: []services.Violation{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - Vulnerabilities: []services.Vulnerability{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - }, - }, - { - name: "Filter violations and vulnerabilities by high severity", - scanResult: services.ScanResponse{ - Violations: []services.Violation{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - Vulnerabilities: []services.Vulnerability{ - {Severity: "Low"}, - {Severity: "Medium"}, - {Severity: "High"}, - {Severity: "Critical"}, - }, - }, - params: v{ - severityLevel: 15, - }, - expected: services.ScanResponse{ - Violations: []services.Violation{ - {Severity: "High"}, - {Severity: "Critical"}, - }, - Vulnerabilities: []services.Vulnerability{ - {Severity: "High"}, - {Severity: "Critical"}, - }, - }, - }, - } - - // Run test cases - for i := range tests { - t.Run(tests[i].name, func(t *testing.T) { - // Call the function with the input parameters - actual := filterResultIfNeeded(&tests[i].scanResult, &tests[i].params) - // Check that the function returned the expected result - assert.True(t, reflect.DeepEqual(*actual, tests[i].expected)) - }) - } -} - -func TestGetFixableComponents(t *testing.T) { - // create test cases - testCases := []struct { - name string - components map[string]services.Component - expectedMap map[string]services.Component - }{ - { - name: "Returns an empty map when all components have no fixed versions", - components: map[string]services.Component{ - "vuln1": { - FixedVersions: []string{}, - }, - "vuln2": { - FixedVersions: []string{}, - }, - }, - expectedMap: map[string]services.Component{}, - }, - { - name: "Returns a filtered map with only components that have fixed versions", - components: map[string]services.Component{ - "vuln1": { - FixedVersions: []string{}, - }, - "vuln2": { - FixedVersions: []string{"1.0.0"}, - }, - "vuln3": { - FixedVersions: []string{"2.0.0", "3.0.0"}, - }, - "vuln4": { - FixedVersions: []string{}, - }, - }, - expectedMap: map[string]services.Component{ - "vuln2": { - FixedVersions: []string{"1.0.0"}, - }, - "vuln3": { - FixedVersions: []string{"2.0.0", "3.0.0"}, - }, - }, - }, - } - - // run test cases - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - actualMap := getFixableComponents(tc.components) - assert.Equal(t, len(tc.expectedMap), len(actualMap)) - for k, v := range tc.expectedMap { - if v.FixedVersions == nil { - assert.True(t, actualMap[k].FixedVersions == nil) - } else { - assert.Equal(t, len(actualMap[k].FixedVersions), len(v.FixedVersions)) - } - } - }) - } -} diff --git a/utils/resultwriter.go b/utils/resultwriter.go index 1d8d84aa..e2c245a6 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -58,6 +58,10 @@ func NewResultsWriter(scanResults *Results) *ResultsWriter { return &ResultsWriter{results: scanResults} } +func (r *Results) getScaScanFileName() string { + return r.ScaResults[0].Target +} + func (rw *ResultsWriter) SetOutputFormat(f format.OutputFormat) *ResultsWriter { rw.format = f return rw From 43b91371fefdd573f20f44a3b480956c314b244e Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 11:07:54 +0300 Subject: [PATCH 04/28] merge dev --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1f4892e6..5b526221 100644 --- a/go.mod +++ b/go.mod @@ -100,6 +100,6 @@ require ( replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240603153234-c15cde9842c7 -replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20240530101935-539b5837ce04 +replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240609130454-f39760d3c455 // replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go dev diff --git a/go.sum b/go.sum index d3373250..7ef7acfd 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240609130454-f39760d3c455 h1:zWqLYrGgRmNn2vh6aFIvrx8jvqw4fINDCHssO8hSU7g= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240609130454-f39760d3c455/go.mod h1:37RR4pYgXZM4w7tywyfRu8t2wagt0qf5wBtpDILWBsk= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= @@ -104,8 +106,6 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240603153234-c15cde9842c7 h1:pWVjLJ4kwm9jn0hEPWABtQTXT77phbvLGR7icTNvtOk= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240603153234-c15cde9842c7/go.mod h1:ckNDje4Ydeo7DPS4kiripqSZ7xF7mVE5Gca3uJ5vTik= -github.com/jfrog/jfrog-client-go v1.28.1-0.20240530101935-539b5837ce04 h1:ERLE/L7YPr6aCUTeAnE8SXU5VOZHd5/XK16rM1TEpts= -github.com/jfrog/jfrog-client-go v1.28.1-0.20240530101935-539b5837ce04/go.mod h1:37RR4pYgXZM4w7tywyfRu8t2wagt0qf5wBtpDILWBsk= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= From 2e580fe4770e14f291c28b026f1c27e304479500 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 12:07:41 +0300 Subject: [PATCH 05/28] merge dev --- cli/scancommands.go | 3 +-- commands/enrich/enrich.go | 32 +++++++++----------------------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/cli/scancommands.go b/cli/scancommands.go index 24d586e0..159ea2ba 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -174,8 +174,7 @@ func EnrichCmd(c *components.Context) error { if err != nil { return err } - var specFile *spec.SpecFiles - specFile = createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) + specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) err = spec.ValidateSpec(specFile.Files, false, false) if err != nil { return err diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 4c7e8747..05ba8290 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -21,7 +21,6 @@ import ( "os" "os/exec" "regexp" - "strings" ) type FileContext func(string) parallel.TaskFunc @@ -174,7 +173,7 @@ func NewEnrichCommand() *EnrichCommand { } func (enrichCmd *EnrichCommand) CommandName() string { - return "xr_scan" + return "xr_enrich" } func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, fileCollectingErrorsQueue *clientutils.ErrorsQueue, xrayVersion string) { @@ -183,20 +182,18 @@ func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProduc // Iterate over file-spec groups and produce indexing tasks. // When encountering an error, log and move to next group. specFiles := enrichCmd.spec.Files - for i := range specFiles { - artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(&specFiles[i], indexedFileProducer, resultsArr, fileErrors, indexedFileErrors, xrayVersion) - taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) - - err := collectFilesForIndexing(specFiles[i], taskHandler) - if err != nil { - log.Error(err) - fileCollectingErrorsQueue.AddError(err) - } + artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(indexedFileProducer, resultsArr, fileErrors, indexedFileErrors, xrayVersion) + taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) + + err := collectFilesForIndexing(specFiles[0], taskHandler) + if err != nil { + log.Error(err) + fileCollectingErrorsQueue.AddError(err) } }() } -func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(file *spec.File, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, xrayVersion string) FileContext { +func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, xrayVersion string) FileContext { return func(filePath string) parallel.TaskFunc { return func(threadId int) (err error) { // Add a new task to the second producer/consumer @@ -312,17 +309,6 @@ func collectPatternMatchingFiles(fileData spec.File, rootPath string, dataHandle return nil } -// Xray expects a path inside a repo, but does not accept a path to a file. -// Therefore, if the given target path is a path to a file, -// the path to the parent directory will be returned. -// Otherwise, the func will return the path itself. -func getXrayRepoPathFromTarget(target string) (repoPath string) { - if strings.HasSuffix(target, "/") { - return target - } - return target[:strings.LastIndex(target, "/")+1] -} - func appendErrorSlice(scanErrors []formats.SimpleJsonError, errorsToAdd [][]formats.SimpleJsonError) []formats.SimpleJsonError { for _, errorSlice := range errorsToAdd { scanErrors = append(scanErrors, errorSlice...) From c025dd19398d80b868137a310cf6c8245c7cd1ac Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 12:16:22 +0300 Subject: [PATCH 06/28] merge dev --- commands/enrich/enrich.go | 4 ++-- utils/resultwriter.go | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 05ba8290..9fd47b40 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -182,7 +182,7 @@ func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProduc // Iterate over file-spec groups and produce indexing tasks. // When encountering an error, log and move to next group. specFiles := enrichCmd.spec.Files - artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(indexedFileProducer, resultsArr, fileErrors, indexedFileErrors, xrayVersion) + artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(indexedFileProducer, resultsArr, indexedFileErrors, xrayVersion) taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) err := collectFilesForIndexing(specFiles[0], taskHandler) @@ -193,7 +193,7 @@ func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProduc }() } -func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, xrayVersion string) FileContext { +func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, indexedFileErrors [][]formats.SimpleJsonError, xrayVersion string) FileContext { return func(filePath string) parallel.TaskFunc { return func(threadId int) (err error) { // Add a new task to the second producer/consumer diff --git a/utils/resultwriter.go b/utils/resultwriter.go index e2c245a6..b3313507 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -4,10 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" - "strconv" - "strings" - "github.com/jfrog/jfrog-cli-core/v2/common/format" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-security/formats" @@ -19,6 +15,9 @@ import ( "github.com/jfrog/jfrog-client-go/xray/services" "github.com/owenrumney/go-sarif/v2/sarif" "golang.org/x/exp/slices" + "os" + "strconv" + "strings" ) const ( @@ -124,7 +123,7 @@ func (rw *ResultsWriter) PrintScanResults() error { func (rw *ResultsWriter) AppendVulnsToJson() error { fileName := rw.results.getScaScanFileName() - fileContent, err := ioutil.ReadFile(fileName) + fileContent, err := os.ReadFile(fileName) if err != nil { fmt.Println("Error reading file:", err) return err From 311877e067594252e1cf407ac88aacdc1c388789 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 12:19:49 +0300 Subject: [PATCH 07/28] merge dev --- commands/enrich/enrich.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 9fd47b40..a22deb92 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -112,7 +112,7 @@ func (enrichCmd *EnrichCommand) Run() (err error) { fileCollectingErrorsQueue := clientutils.NewErrorsQueue(1) // Start walking on the filesystem to "produce" files that match the given pattern // while the consumer uses the indexer to index those files. - enrichCmd.prepareScanTasks(fileProducerConsumer, indexedFileProducerConsumer, resultsArr, fileProducerErrors, indexedFileProducerErrors, fileCollectingErrorsQueue, xrayVersion) + enrichCmd.prepareScanTasks(fileProducerConsumer, indexedFileProducerConsumer, resultsArr, indexedFileProducerErrors, fileCollectingErrorsQueue, xrayVersion) enrichCmd.performScanTasks(fileProducerConsumer, indexedFileProducerConsumer) // Handle results @@ -176,7 +176,7 @@ func (enrichCmd *EnrichCommand) CommandName() string { return "xr_enrich" } -func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, fileErrors, indexedFileErrors [][]formats.SimpleJsonError, fileCollectingErrorsQueue *clientutils.ErrorsQueue, xrayVersion string) { +func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProducer parallel.Runner, resultsArr [][]*ScanInfo, indexedFileErrors [][]formats.SimpleJsonError, fileCollectingErrorsQueue *clientutils.ErrorsQueue, xrayVersion string) { go func() { defer fileProducer.Done() // Iterate over file-spec groups and produce indexing tasks. From 7665c860dfa18c1cf9ffbd44fab6b45137f28565 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 16:06:30 +0300 Subject: [PATCH 08/28] merge dev --- cli/cli.go | 6 + cli/sbomcommands.go | 53 ++ cli/scancommands.go | 29 - enrich_test.go | 19 + enrichgraph/enrichgraph.go | 4 + tests/testdata/other/enrich/enrich.json | 868 ++++++++++++++++++++++++ 6 files changed, 950 insertions(+), 29 deletions(-) create mode 100644 cli/sbomcommands.go create mode 100644 enrich_test.go create mode 100755 tests/testdata/other/enrich/enrich.json diff --git a/cli/cli.go b/cli/cli.go index 95f7abba..83ff4afb 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -16,5 +16,11 @@ func GetJfrogCliSecurityApp() components.App { Commands: getXrayNameSpaceCommands(), Category: "Command Namespaces", }) + app.Subcommands = append(app.Subcommands, components.Namespace{ + Name: "sbom", + Description: "Sbom commands.", + Commands: getSbomCommands(), + Category: "Command Namespaces", + }) return app } diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go new file mode 100644 index 00000000..dc302100 --- /dev/null +++ b/cli/sbomcommands.go @@ -0,0 +1,53 @@ +package cli + +import ( + commandsCommon "github.com/jfrog/jfrog-cli-core/v2/common/commands" + "github.com/jfrog/jfrog-cli-core/v2/common/spec" + pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + flags "github.com/jfrog/jfrog-cli-security/cli/docs" + enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/enrich" + "github.com/jfrog/jfrog-cli-security/commands/enrich" +) + +func getSbomCommands() []components.Command { + return []components.Command{ + { + Name: "enrich", + Aliases: []string{"se"}, + Flags: flags.GetCommandFlags(flags.Enrich), + Description: enrichDocs.GetDescription(), + Arguments: enrichDocs.GetArguments(), + Category: auditScanCategory, + Action: EnrichCmd, + }, + } +} + +func EnrichCmd(c *components.Context) error { + if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { + return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) + } + serverDetails, err := createServerDetailsWithConfigOffer(c) + if err != nil { + return err + } + err = validateXrayContext(c, serverDetails) + if err != nil { + return err + } + specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) + err = spec.ValidateSpec(specFile.Files, false, false) + if err != nil { + return err + } + threads, err := pluginsCommon.GetThreadsCount(c) + if err != nil { + return err + } + EnrichCmd := enrich.NewEnrichCommand(). + SetServerDetails(serverDetails). + SetThreads(threads). + SetSpec(specFile) + return commandsCommon.Exec(EnrichCmd) +} diff --git a/cli/scancommands.go b/cli/scancommands.go index 159ea2ba..8cf6f56c 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -29,7 +29,6 @@ import ( "github.com/jfrog/jfrog-cli-security/commands/audit" "github.com/jfrog/jfrog-cli-security/commands/curation" - "github.com/jfrog/jfrog-cli-security/commands/enrich" "github.com/jfrog/jfrog-cli-security/commands/scan" "github.com/jfrog/jfrog-cli-security/utils" "github.com/jfrog/jfrog-cli-security/utils/techutils" @@ -162,34 +161,6 @@ func getAuditAndScansCommands() []components.Command { } } -func EnrichCmd(c *components.Context) error { - if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { - return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) - } - serverDetails, err := createServerDetailsWithConfigOffer(c) - if err != nil { - return err - } - err = validateXrayContext(c, serverDetails) - if err != nil { - return err - } - specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) - err = spec.ValidateSpec(specFile.Files, false, false) - if err != nil { - return err - } - threads, err := pluginsCommon.GetThreadsCount(c) - if err != nil { - return err - } - EnrichCmd := enrich.NewEnrichCommand(). - SetServerDetails(serverDetails). - SetThreads(threads). - SetSpec(specFile) - return commandsCommon.Exec(EnrichCmd) -} - func ScanCmd(c *components.Context) error { if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { return pluginsCommon.PrintHelpAndReturnError("providing either a argument or the 'spec' option is mandatory", c) diff --git a/enrich_test.go b/enrich_test.go new file mode 100644 index 00000000..398d8cd5 --- /dev/null +++ b/enrich_test.go @@ -0,0 +1,19 @@ +package main + +import ( + securityTests "github.com/jfrog/jfrog-cli-security/tests" + securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" + "path/filepath" + "testing" +) + +func testXrayEnrichSbom(t *testing.T) string { + //securityTestUtils.InitSecurityTest(t, enrichgraph.EnrichMinimumVersionXray) + binariesPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.json") + return securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom enrich", binariesPath) +} + +func TestXrayeEnrichSbom(t *testing.T) { + output := testXrayEnrichSbom(t) + securityTestUtils.VerifyJsonScanResults(t, output, 0, 1, 1) +} diff --git a/enrichgraph/enrichgraph.go b/enrichgraph/enrichgraph.go index 00132b81..ccf9cdb4 100644 --- a/enrichgraph/enrichgraph.go +++ b/enrichgraph/enrichgraph.go @@ -5,6 +5,10 @@ import ( "github.com/jfrog/jfrog-client-go/xray/services" ) +const ( + EnrichMinimumVersionXray = "3.90" +) + func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { scanId, err := xrayManager.ImportGraph(*params.xrayGraphImportParams) if err != nil { diff --git a/tests/testdata/other/enrich/enrich.json b/tests/testdata/other/enrich/enrich.json new file mode 100755 index 00000000..40ba81ec --- /dev/null +++ b/tests/testdata/other/enrich/enrich.json @@ -0,0 +1,868 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.4", + "serialNumber": "urn:uuid:664daadd-2c58-ff42-d21d-a25d00000000", + "version": 1, + "metadata": { + "timestamp": "2024-05-22T08:20:45Z", + "component": { + "bom-ref": "pypi://services/web@main", + "type": "library", + "name": "pypi://services/web@main", + "version": "main", + "hashes": [ + { + "alg": "SHA-256", + "content": "0533c92d84bb439b537363b82396e4855af094afc5433ac55e6262e9ac854b99" + } + ], + "purl": "pkg:pypi/services/web@main" + }, + "supplier": { + "name": "", + "url": [], + "contact": [] + }, + "licenses": [] + }, + "components": [ + { + "bom-ref": "pypi://bidict@0.23.1", + "type": "library", + "name": "bidict", + "version": "0.23.1", + "licenses": [ + { + "license": { + "name": "Mozilla Public License 2.0 (MPL 2.0)" + } + } + ], + "purl": "pkg:pypi/bidict@0.23.1", + "externalReferences": [ + { + "url": "https://github.com/jab/bidict.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://blinker@1.8.2", + "type": "library", + "name": "blinker", + "version": "1.8.2", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/blinker@1.8.2", + "externalReferences": [ + { + "url": "https://github.com/pallets-eco/blinker.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://cffi@1.16.0", + "type": "library", + "name": "cffi", + "version": "1.16.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/cffi@1.16.0", + "externalReferences": [ + { + "url": "https://github.com/python-cffi/cffi.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://click@8.1.7", + "type": "library", + "name": "click", + "version": "8.1.7", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/click@8.1.7", + "externalReferences": [ + { + "url": "https://github.com/pallets/click.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://colorama@0.4.6", + "type": "library", + "name": "colorama", + "version": "0.4.6", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/colorama@0.4.6", + "externalReferences": [ + { + "url": "https://github.com/tartley/colorama.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://flask-socketio@5.3.6", + "type": "library", + "name": "flask-socketio", + "version": "5.3.6", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/flask-socketio@5.3.6", + "externalReferences": [ + { + "url": "https://github.com/miguelgrinberg/flask-socketio.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://flask-sqlalchemy@3.0.3", + "type": "library", + "name": "flask-sqlalchemy", + "version": "3.0.3", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/flask-sqlalchemy@3.0.3", + "externalReferences": [ + { + "url": "https://github.com/pallets-eco/flask-sqlalchemy.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://flask@2.3.1", + "type": "library", + "name": "flask", + "version": "2.3.1", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/flask@2.3.1", + "externalReferences": [ + { + "url": "https://github.com/pallets/flask.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://gevent-websocket@0.10.1", + "type": "library", + "name": "gevent-websocket", + "version": "0.10.1", + "licenses": [ + { + "license": { + "name": "Copyright 2011-2017 Jeffrey Gelens \u003cjeffrey@noppo.pro\u003e" + } + } + ], + "purl": "pkg:pypi/gevent-websocket@0.10.1", + "externalReferences": [ + { + "url": "", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://gevent@24.2.1", + "type": "library", + "name": "gevent", + "version": "24.2.1", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/gevent@24.2.1", + "externalReferences": [ + { + "url": "https://github.com/gevent/gevent.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://greenlet@3.0.3", + "type": "library", + "name": "greenlet", + "version": "3.0.3", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/greenlet@3.0.3", + "externalReferences": [ + { + "url": "https://github.com/python-greenlet/greenlet.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://gunicorn@20.1.0", + "type": "library", + "name": "gunicorn", + "version": "20.1.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/gunicorn@20.1.0", + "externalReferences": [ + { + "url": "https://github.com/benoitc/gunicorn.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://h11@0.14.0", + "type": "library", + "name": "h11", + "version": "0.14.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/h11@0.14.0", + "externalReferences": [ + { + "url": "https://github.com/python-hyper/h11.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://importlib-metadata@7.1.0", + "type": "library", + "name": "importlib-metadata", + "version": "7.1.0", + "licenses": [ + { + "license": { + "name": "Apache Software License" + } + } + ], + "purl": "pkg:pypi/importlib-metadata@7.1.0", + "externalReferences": [ + { + "url": "https://github.com/python/importlib_metadata.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://itsdangerous@2.2.0", + "type": "library", + "name": "itsdangerous", + "version": "2.2.0", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/itsdangerous@2.2.0", + "externalReferences": [ + { + "url": "https://github.com/pallets/itsdangerous.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://jinja2@3.1.4", + "type": "library", + "name": "jinja2", + "version": "3.1.4", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/jinja2@3.1.4", + "externalReferences": [ + { + "url": "https://github.com/pallets/jinja.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://markupsafe@2.1.5", + "type": "library", + "name": "markupsafe", + "version": "2.1.5", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/markupsafe@2.1.5", + "externalReferences": [ + { + "url": "https://github.com/pallets/markupsafe.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://pillow@8.4.0", + "type": "library", + "name": "pillow", + "version": "8.4.0", + "licenses": [ + { + "license": { + "name": "Historical Permission Notice and Disclaimer (HPND)" + } + } + ], + "purl": "pkg:pypi/pillow@8.4.0", + "externalReferences": [ + { + "url": "https://github.com/python-pillow/pillow.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://psycopg2-binary@2.9.6", + "type": "library", + "name": "psycopg2-binary", + "version": "2.9.6", + "licenses": [ + { + "license": { + "name": "GNU Library or Lesser General Public License (LGPL)" + } + } + ], + "purl": "pkg:pypi/psycopg2-binary@2.9.6", + "externalReferences": [ + { + "url": "https://github.com/psycopg/psycopg2.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://pycparser@2.22", + "type": "library", + "name": "pycparser", + "version": "2.22", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/pycparser@2.22", + "externalReferences": [ + { + "url": "https://github.com/eliben/pycparser.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://pycryptodomex@3.20.0", + "type": "library", + "name": "pycryptodomex", + "version": "3.20.0", + "licenses": [ + { + "license": { + "name": "Apache Software License" + } + } + ], + "purl": "pkg:pypi/pycryptodomex@3.20.0", + "externalReferences": [ + { + "url": "https://github.com/legrandin/pycryptodome.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://python-engineio@4.9.0", + "type": "library", + "name": "python-engineio", + "version": "4.9.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/python-engineio@4.9.0", + "externalReferences": [ + { + "url": "https://github.com/miguelgrinberg/python-engineio.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://python-socketio@5.11.2", + "type": "library", + "name": "python-socketio", + "version": "5.11.2", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/python-socketio@5.11.2", + "externalReferences": [ + { + "url": "https://github.com/miguelgrinberg/python-socketio.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://setuptools@59.6.0", + "type": "library", + "name": "setuptools", + "version": "59.6.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/setuptools@59.6.0", + "externalReferences": [ + { + "url": "https://github.com/pypa/setuptools.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://simple-websocket@1.0.0", + "type": "library", + "name": "simple-websocket", + "version": "1.0.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/simple-websocket@1.0.0", + "externalReferences": [ + { + "url": "https://github.com/miguelgrinberg/simple-websocket.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://sqlalchemy@2.0.28", + "type": "library", + "name": "sqlalchemy", + "version": "2.0.28", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/sqlalchemy@2.0.28", + "externalReferences": [ + { + "url": "https://github.com/sqlalchemy/sqlalchemy.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://typing-extensions@4.11.0", + "type": "library", + "name": "typing-extensions", + "version": "4.11.0", + "licenses": [ + { + "license": { + "name": "Python Software Foundation License" + } + } + ], + "purl": "pkg:pypi/typing-extensions@4.11.0", + "externalReferences": [ + { + "url": "https://github.com/python/typing_extensions.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://werkzeug@3.0.3", + "type": "library", + "name": "werkzeug", + "version": "3.0.3", + "licenses": [ + { + "license": { + "name": "BSD License" + } + } + ], + "purl": "pkg:pypi/werkzeug@3.0.3", + "externalReferences": [ + { + "url": "https://github.com/pallets/werkzeug.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://wsproto@1.2.0", + "type": "library", + "name": "wsproto", + "version": "1.2.0", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/wsproto@1.2.0", + "externalReferences": [ + { + "url": "https://github.com/python-hyper/wsproto.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://zipp@3.18.1", + "type": "library", + "name": "zipp", + "version": "3.18.1", + "licenses": [ + { + "license": { + "name": "MIT License" + } + } + ], + "purl": "pkg:pypi/zipp@3.18.1", + "externalReferences": [ + { + "url": "https://github.com/jaraco/zipp.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://zope-event@5.0", + "type": "library", + "name": "zope-event", + "version": "5.0", + "licenses": [ + { + "license": { + "name": "Zope Public License" + } + } + ], + "purl": "pkg:pypi/zope-event@5.0", + "externalReferences": [ + { + "url": "https://github.com/zopefoundation/zope.event.git", + "type": "vcs" + } + ] + }, + { + "bom-ref": "pypi://zope-interface@6.3", + "type": "library", + "name": "zope-interface", + "version": "6.3", + "licenses": [ + { + "license": { + "name": "Zope Public License" + } + } + ], + "purl": "pkg:pypi/zope-interface@6.3", + "externalReferences": [ + { + "url": "https://github.com/zopefoundation/zope.interface.git", + "type": "vcs" + } + ] + } + ], + "dependencies": [ + { + "ref": "pypi://bidict@0.23.1", + "dependsOn": [] + }, + { + "ref": "pypi://blinker@1.8.2", + "dependsOn": [] + }, + { + "ref": "pypi://cffi@1.16.0", + "dependsOn": [ + "pypi://pycparser@2.22" + ] + }, + { + "ref": "pypi://click@8.1.7", + "dependsOn": [ + "pypi://colorama@0.4.6", + "pypi://importlib-metadata@7.1.0" + ] + }, + { + "ref": "pypi://colorama@0.4.6", + "dependsOn": [] + }, + { + "ref": "pypi://flask-socketio@5.3.6", + "dependsOn": [ + "pypi://flask@2.3.1", + "pypi://python-socketio@5.11.2" + ] + }, + { + "ref": "pypi://flask-sqlalchemy@3.0.3", + "dependsOn": [ + "pypi://flask@2.3.1", + "pypi://sqlalchemy@2.0.28" + ] + }, + { + "ref": "pypi://flask@2.3.1", + "dependsOn": [ + "pypi://werkzeug@3.0.3", + "pypi://jinja2@3.1.4", + "pypi://itsdangerous@2.2.0", + "pypi://click@8.1.7", + "pypi://blinker@1.8.2", + "pypi://importlib-metadata@7.1.0" + ] + }, + { + "ref": "pypi://gevent-websocket@0.10.1", + "dependsOn": [ + "pypi://gevent@24.2.1" + ] + }, + { + "ref": "pypi://gevent@24.2.1", + "dependsOn": [ + "pypi://zope-event@5.0", + "pypi://zope-interface@6.3", + "pypi://greenlet@3.0.3", + "pypi://cffi@1.16.0" + ] + }, + { + "ref": "pypi://greenlet@3.0.3", + "dependsOn": [] + }, + { + "ref": "pypi://gunicorn@20.1.0", + "dependsOn": [ + "pypi://setuptools@59.6.0" + ] + }, + { + "ref": "pypi://h11@0.14.0", + "dependsOn": [ + "pypi://typing-extensions@4.11.0" + ] + }, + { + "ref": "pypi://importlib-metadata@7.1.0", + "dependsOn": [ + "pypi://zipp@3.18.1", + "pypi://typing-extensions@4.11.0" + ] + }, + { + "ref": "pypi://itsdangerous@2.2.0", + "dependsOn": [] + }, + { + "ref": "pypi://jinja2@3.1.4", + "dependsOn": [ + "pypi://markupsafe@2.1.5" + ] + }, + { + "ref": "pypi://markupsafe@2.1.5", + "dependsOn": [] + }, + { + "ref": "pypi://pillow@8.4.0", + "dependsOn": [] + }, + { + "ref": "pypi://psycopg2-binary@2.9.6", + "dependsOn": [] + }, + { + "ref": "pypi://pycparser@2.22", + "dependsOn": [] + }, + { + "ref": "pypi://pycryptodomex@3.20.0", + "dependsOn": [] + }, + { + "ref": "pypi://python-engineio@4.9.0", + "dependsOn": [ + "pypi://simple-websocket@1.0.0" + ] + }, + { + "ref": "pypi://python-socketio@5.11.2", + "dependsOn": [ + "pypi://bidict@0.23.1", + "pypi://python-engineio@4.9.0" + ] + }, + { + "ref": "pypi://services/web@main", + "dependsOn": [ + "pypi://psycopg2-binary@2.9.6", + "pypi://pillow@8.4.0", + "pypi://gunicorn@20.1.0", + "pypi://flask@2.3.1", + "pypi://flask-socketio@5.3.6", + "pypi://gevent-websocket@0.10.1", + "pypi://flask-sqlalchemy@3.0.3", + "pypi://pycryptodomex@3.20.0", + "pypi://sqlalchemy@2.0.28" + ] + }, + { + "ref": "pypi://setuptools@59.6.0", + "dependsOn": [] + }, + { + "ref": "pypi://simple-websocket@1.0.0", + "dependsOn": [ + "pypi://wsproto@1.2.0" + ] + }, + { + "ref": "pypi://sqlalchemy@2.0.28", + "dependsOn": [ + "pypi://typing-extensions@4.11.0", + "pypi://greenlet@3.0.3", + "pypi://importlib-metadata@7.1.0" + ] + }, + { + "ref": "pypi://typing-extensions@4.11.0", + "dependsOn": [] + }, + { + "ref": "pypi://werkzeug@3.0.3", + "dependsOn": [ + "pypi://markupsafe@2.1.5" + ] + }, + { + "ref": "pypi://wsproto@1.2.0", + "dependsOn": [ + "pypi://h11@0.14.0" + ] + }, + { + "ref": "pypi://zipp@3.18.1", + "dependsOn": [] + }, + { + "ref": "pypi://zope-event@5.0", + "dependsOn": [ + "pypi://setuptools@59.6.0" + ] + }, + { + "ref": "pypi://zope-interface@6.3", + "dependsOn": [ + "pypi://setuptools@59.6.0" + ] + } + ] +} + From e399bb6027a1c53d59cdaf5cbd60d6e377ddc7ff Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 17:48:35 +0300 Subject: [PATCH 09/28] merge dev --- cli/scancommands.go | 10 ---------- enrich_test.go | 5 +++-- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/cli/scancommands.go b/cli/scancommands.go index 8cf6f56c..9d25ed25 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -24,7 +24,6 @@ import ( buildScanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/buildscan" curationDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/curation" dockerScanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/dockerscan" - enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/enrich" scanDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/scan" "github.com/jfrog/jfrog-cli-security/commands/audit" @@ -49,15 +48,6 @@ func getAuditAndScansCommands() []components.Command { Category: auditScanCategory, Action: ScanCmd, }, - { - Name: "sbom-enrich", - Aliases: []string{"se"}, - Flags: flags.GetCommandFlags(flags.Enrich), - Description: enrichDocs.GetDescription(), - Arguments: enrichDocs.GetArguments(), - Category: auditScanCategory, - Action: EnrichCmd, - }, { Name: "build-scan", Aliases: []string{"bs"}, diff --git a/enrich_test.go b/enrich_test.go index 398d8cd5..701f8831 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -1,6 +1,7 @@ package main import ( + "github.com/jfrog/jfrog-cli-security/enrichgraph" securityTests "github.com/jfrog/jfrog-cli-security/tests" securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" "path/filepath" @@ -8,8 +9,8 @@ import ( ) func testXrayEnrichSbom(t *testing.T) string { - //securityTestUtils.InitSecurityTest(t, enrichgraph.EnrichMinimumVersionXray) - binariesPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.json") + securityTestUtils.InitSecurityTest(t, enrichgraph.EnrichMinimumVersionXray) + binariesPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "*") return securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom enrich", binariesPath) } From 2234fc38b25670cc7d28d2034e56c23af5c6526d Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 10 Jun 2024 17:53:54 +0300 Subject: [PATCH 10/28] merge dev --- cli/docs/{scan => }/enrich/help.go | 0 cli/sbomcommands.go | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename cli/docs/{scan => }/enrich/help.go (100%) diff --git a/cli/docs/scan/enrich/help.go b/cli/docs/enrich/help.go similarity index 100% rename from cli/docs/scan/enrich/help.go rename to cli/docs/enrich/help.go diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go index dc302100..669b0f6e 100644 --- a/cli/sbomcommands.go +++ b/cli/sbomcommands.go @@ -6,7 +6,7 @@ import ( pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" "github.com/jfrog/jfrog-cli-core/v2/plugins/components" flags "github.com/jfrog/jfrog-cli-security/cli/docs" - enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/scan/enrich" + enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/enrich" "github.com/jfrog/jfrog-cli-security/commands/enrich" ) From 5d0bda8be13706d0f21e2690556d1f011b782676 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 13 Jun 2024 13:49:28 +0300 Subject: [PATCH 11/28] tests & fixes --- cli/cli.go | 4 ++-- cli/docs/enrich/help.go | 3 ++- cli/docs/flags.go | 4 ++-- cli/sbomcommands.go | 9 +++++++-- cli/scancommands.go | 2 +- enrich_test.go | 40 ++++++++++++++++++++++++++++++++-------- go.mod | 4 ++-- go.sum | 7 +++---- 8 files changed, 51 insertions(+), 22 deletions(-) diff --git a/cli/cli.go b/cli/cli.go index 83ff4afb..4aa67fa2 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -17,10 +17,10 @@ func GetJfrogCliSecurityApp() components.App { Category: "Command Namespaces", }) app.Subcommands = append(app.Subcommands, components.Namespace{ - Name: "sbom", + Name: string(cliutils.Sbom), Description: "Sbom commands.", Commands: getSbomCommands(), - Category: "Command Namespaces", + Category: "sbom Namespaces", }) return app } diff --git a/cli/docs/enrich/help.go b/cli/docs/enrich/help.go index f1781017..c43d1a11 100644 --- a/cli/docs/enrich/help.go +++ b/cli/docs/enrich/help.go @@ -2,6 +2,7 @@ package enrich import ( "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + "github.com/jfrog/jfrog-cli-security/cli/docs" ) func GetDescription() string { @@ -9,5 +10,5 @@ func GetDescription() string { } func GetArguments() []components.Argument { - return []components.Argument{{Name: "source pattern", Description: `Specifies the local file system path of the JSON to be scanned.`}} + return []components.Argument{{Name: "source pattern", ReplaceWithFlag: docs.SpecFlag, Description: `Specifies the local file system path of the JSON to be scanned.`}} } diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 66fb6e2c..48f7626c 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -21,7 +21,7 @@ const ( DockerScan = "docker scan" Audit = "audit" CurationAudit = "curation-audit" - Enrich = "enrich" + Enrich = "sbom enrich" // TODO: Deprecated commands (remove at next CLI major version) AuditMvn = "audit-maven" @@ -119,7 +119,7 @@ var commandFlags = map[string][]string{ Project, Watches, RepoPath, Licenses, OutputFormat, Fail, ExtendedTable, BypassArchiveLimits, MinSeverity, FixableOnly, }, Enrich: { - url, user, password, accessToken, ServerId, Threads, + url, user, password, accessToken, ServerId, SpecFlag, Threads, }, BuildScan: { url, user, password, accessToken, ServerId, Project, Vuln, OutputFormat, Fail, ExtendedTable, Rescan, diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go index 669b0f6e..64dd9ee5 100644 --- a/cli/sbomcommands.go +++ b/cli/sbomcommands.go @@ -1,10 +1,12 @@ package cli import ( + "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" commandsCommon "github.com/jfrog/jfrog-cli-core/v2/common/commands" "github.com/jfrog/jfrog-cli-core/v2/common/spec" pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config" flags "github.com/jfrog/jfrog-cli-security/cli/docs" enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/enrich" "github.com/jfrog/jfrog-cli-security/commands/enrich" @@ -18,17 +20,20 @@ func getSbomCommands() []components.Command { Flags: flags.GetCommandFlags(flags.Enrich), Description: enrichDocs.GetDescription(), Arguments: enrichDocs.GetArguments(), - Category: auditScanCategory, Action: EnrichCmd, }, } } +func createServerDetails(c *components.Context) (*coreConfig.ServerDetails, error) { + return pluginsCommon.CreateServerDetailsWithConfigOffer(c, true, cliutils.Sbom) +} + func EnrichCmd(c *components.Context) error { if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) } - serverDetails, err := createServerDetailsWithConfigOffer(c) + serverDetails, err := createServerDetails(c) if err != nil { return err } diff --git a/cli/scancommands.go b/cli/scancommands.go index 9d25ed25..95e53157 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -33,7 +33,7 @@ import ( "github.com/jfrog/jfrog-cli-security/utils/techutils" ) -const auditScanCategory = "Audit & Scan & Import" +const auditScanCategory = "Audit & Scan" const dockerScanCmdHiddenName = "dockerscan" diff --git a/enrich_test.go b/enrich_test.go index 701f8831..2e5b1bcb 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -1,20 +1,44 @@ package main import ( - "github.com/jfrog/jfrog-cli-security/enrichgraph" + "encoding/json" + "fmt" securityTests "github.com/jfrog/jfrog-cli-security/tests" securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" + "github.com/stretchr/testify/assert" "path/filepath" "testing" ) -func testXrayEnrichSbom(t *testing.T) string { - securityTestUtils.InitSecurityTest(t, enrichgraph.EnrichMinimumVersionXray) - binariesPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "*") - return securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom enrich", binariesPath) +type Vulnerability struct { + BomRef string `json:"bom_ref"` + Id string `json:"id"` } -func TestXrayeEnrichSbom(t *testing.T) { - output := testXrayEnrichSbom(t) - securityTestUtils.VerifyJsonScanResults(t, output, 0, 1, 1) +type EnrichJson struct { + Vulnerabilities []Vulnerability `json:"vulnerabilities"` +} + +func UnmarshalJson(t *testing.T, output string) EnrichJson { + var jsonMap EnrichJson + err := json.Unmarshal([]byte(output), &jsonMap) + assert.NoError(t, err) + return jsonMap +} + +func TestXrayEnrichSbom(t *testing.T) { + securityTestUtils.InitSecurityTest(t, "") + // Configure a new server named "default". + securityTestUtils.CreateJfrogHomeConfig(t, true) + defer securityTestUtils.CleanTestsHomeEnv() + // Check curl command with the default configured server. + jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "*") + output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) + enrichedSbom := UnmarshalJson(t, output) + assert.Equal(t, len(enrichedSbom.Vulnerabilities), 12) + for _, vuln := range enrichedSbom.Vulnerabilities { + assert.NotEqual(t, vuln.BomRef, nil) + assert.NotEqual(t, vuln.Id, nil) + } + fmt.Println(enrichedSbom) } diff --git a/go.mod b/go.mod index 866c4892..9f1fe156 100644 --- a/go.mod +++ b/go.mod @@ -98,8 +98,8 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect ) -//replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 dev +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 -//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go dev +replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450 //replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go dev diff --git a/go.sum b/go.sum index e18474ab..5a90dc47 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4/go.mod h1:4iTSevmlThM1Aw5NAY4WyVxim5US4SkrmxHSHFimaqk= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= @@ -102,10 +104,7 @@ github.com/jfrog/gofrog v1.7.2 h1:VkAaA/9tmbw27IqgUOmaZWnO6ATUqL3vRzDnsROKATw= github.com/jfrog/gofrog v1.7.2/go.mod h1:WJFk88SR9Sr9mKl1bQBig7DmSdXiBGKV3WhL9O6jL9w= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-core/v2 v2.53.1 h1:odwPJlrUVw7yKIYctVIn7/8YW/Ynwq4vvsmrXOzAAa8= -github.com/jfrog/jfrog-cli-core/v2 v2.53.1/go.mod h1:4iTSevmlThM1Aw5NAY4WyVxim5US4SkrmxHSHFimaqk= -github.com/jfrog/jfrog-client-go v1.41.0 h1:g5OTFvreOVQ6U/5LUXFJfA3Bc+AZCo2PO/EzCLxLbLE= -github.com/jfrog/jfrog-client-go v1.41.0/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240303093859-ebce750e0f45/go.mod h1:aE5kYuqiZxu6hHkAQm34BvtGjLR8rk0/PUWpl4u5g0Q= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= From c5c03bcd423df9fcf6abcfb74fb35e89d15b0c99 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 13 Jun 2024 13:56:30 +0300 Subject: [PATCH 12/28] tests & fixes --- go.sum | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/go.sum b/go.sum index 5a90dc47..98b6ada2 100644 --- a/go.sum +++ b/go.sum @@ -20,7 +20,9 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 h1:p0uoVJ9e54Za58LeN4TXw8Lki6FTjLVgVxoAMavMKdI= github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4/go.mod h1:4iTSevmlThM1Aw5NAY4WyVxim5US4SkrmxHSHFimaqk= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450 h1:BjSFjYlfTJvlNm7Jm9Yf5AyAXhHvdDnNjm6LTSbxoFI= github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= @@ -104,7 +106,6 @@ github.com/jfrog/gofrog v1.7.2 h1:VkAaA/9tmbw27IqgUOmaZWnO6ATUqL3vRzDnsROKATw= github.com/jfrog/gofrog v1.7.2/go.mod h1:WJFk88SR9Sr9mKl1bQBig7DmSdXiBGKV3WhL9O6jL9w= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20240303093859-ebce750e0f45/go.mod h1:aE5kYuqiZxu6hHkAQm34BvtGjLR8rk0/PUWpl4u5g0Q= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= From 82d85d6de4802cfb7a166b1df8c8f1fa788b6c59 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 13 Jun 2024 14:40:42 +0300 Subject: [PATCH 13/28] tests & fixes --- cli/docs/enrich/help.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/docs/enrich/help.go b/cli/docs/enrich/help.go index c43d1a11..a7828819 100644 --- a/cli/docs/enrich/help.go +++ b/cli/docs/enrich/help.go @@ -6,7 +6,7 @@ import ( ) func GetDescription() string { - return "Enrich CycloneDX format JSON located on the local file-system with Xray." + return "Enrich sbom format JSON located on the local file-system with Xray." } func GetArguments() []components.Argument { From 8c4fd8f4d904426740389d59d710055356324ee9 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 13 Jun 2024 17:01:20 +0300 Subject: [PATCH 14/28] tests & fixes --- cli/sbomcommands.go | 2 +- commands/enrich/enrich.go | 46 ++++----------------------------------- enrich_test.go | 6 ++--- utils/resultwriter.go | 5 ++++- 4 files changed, 11 insertions(+), 48 deletions(-) diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go index 64dd9ee5..0d408c92 100644 --- a/cli/sbomcommands.go +++ b/cli/sbomcommands.go @@ -30,7 +30,7 @@ func createServerDetails(c *components.Context) (*coreConfig.ServerDetails, erro } func EnrichCmd(c *components.Context) error { - if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { + if len(c.Arguments) == 0 { return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) } serverDetails, err := createServerDetails(c) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index a22deb92..2b382a51 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -20,7 +20,6 @@ import ( "github.com/jfrog/jfrog-client-go/xray/services" "os" "os/exec" - "regexp" ) type FileContext func(string) parallel.TaskFunc @@ -185,7 +184,7 @@ func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProduc artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(indexedFileProducer, resultsArr, indexedFileErrors, xrayVersion) taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) - err := collectFilesForIndexing(specFiles[0], taskHandler) + err := FileForIndexing(specFiles[0], taskHandler) if err != nil { log.Error(err) fileCollectingErrorsQueue.AddError(err) @@ -251,8 +250,7 @@ func (enrichCmd *EnrichCommand) performScanTasks(fileConsumer parallel.Runner, i indexedFileConsumer.Run() } -func collectFilesForIndexing(fileData spec.File, dataHandlerFunc indexFileHandlerFunc) error { - +func FileForIndexing(fileData spec.File, dataHandlerFunc indexFileHandlerFunc) error { fileData.Pattern = clientutils.ReplaceTildeWithUserHome(fileData.Pattern) patternType := fileData.GetPatternType() rootPath, err := fspatterns.GetRootPath(fileData.Pattern, fileData.Target, "", patternType, false) @@ -265,48 +263,12 @@ func collectFilesForIndexing(fileData spec.File, dataHandlerFunc indexFileHandle return err } - // If the path is a single file, index it and return + // path should be a single file if !isDir { dataHandlerFunc(rootPath) return nil } - fileData.Pattern = clientutils.ConvertLocalPatternToRegexp(fileData.Pattern, patternType) - return collectPatternMatchingFiles(fileData, rootPath, dataHandlerFunc) -} - -func collectPatternMatchingFiles(fileData spec.File, rootPath string, dataHandlerFunc indexFileHandlerFunc) error { - fileParams, err := fileData.ToCommonParams() - if err != nil { - return err - } - excludePathPattern := fspatterns.PrepareExcludePathPattern(fileParams.Exclusions, fileParams.GetPatternType(), fileParams.IsRecursive()) - patternRegex, err := regexp.Compile(fileData.Pattern) - if errorutils.CheckError(err) != nil { - return err - } - recursive, err := fileData.IsRecursive(true) - if err != nil { - return err - } - - paths, err := fspatterns.ListFiles(rootPath, recursive, false, false, false, excludePathPattern) - if err != nil { - return err - } - for _, path := range paths { - matches, isDir, err := fspatterns.SearchPatterns(path, false, false, patternRegex) - if err != nil { - return err - } - // Because paths should contain all files and directories (walks recursively) we can ignore dirs, as only files relevance for indexing. - if isDir { - continue - } - if len(matches) > 0 { - dataHandlerFunc(path) - } - } - return nil + return errors.New("directory instead of a single file") } func appendErrorSlice(scanErrors []formats.SimpleJsonError, errorsToAdd [][]formats.SimpleJsonError) []formats.SimpleJsonError { diff --git a/enrich_test.go b/enrich_test.go index 2e5b1bcb..cc90c0d7 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "fmt" securityTests "github.com/jfrog/jfrog-cli-security/tests" securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" "github.com/stretchr/testify/assert" @@ -26,13 +25,13 @@ func UnmarshalJson(t *testing.T, output string) EnrichJson { return jsonMap } -func TestXrayEnrichSbom(t *testing.T) { +func TestXrayEnrichSbom_Success(t *testing.T) { securityTestUtils.InitSecurityTest(t, "") // Configure a new server named "default". securityTestUtils.CreateJfrogHomeConfig(t, true) defer securityTestUtils.CleanTestsHomeEnv() // Check curl command with the default configured server. - jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "*") + jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.json") output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) enrichedSbom := UnmarshalJson(t, output) assert.Equal(t, len(enrichedSbom.Vulnerabilities), 12) @@ -40,5 +39,4 @@ func TestXrayEnrichSbom(t *testing.T) { assert.NotEqual(t, vuln.BomRef, nil) assert.NotEqual(t, vuln.Id, nil) } - fmt.Println(enrichedSbom) } diff --git a/utils/resultwriter.go b/utils/resultwriter.go index b3313507..c08e9e09 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -58,7 +58,10 @@ func NewResultsWriter(scanResults *Results) *ResultsWriter { } func (r *Results) getScaScanFileName() string { - return r.ScaResults[0].Target + if len(r.ScaResults) > 0 { + return r.ScaResults[0].Target + } + return "" } func (rw *ResultsWriter) SetOutputFormat(f format.OutputFormat) *ResultsWriter { From 0592577e90ace7940ccbad3499a2ad411f817dd3 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 17 Jun 2024 17:20:28 +0300 Subject: [PATCH 15/28] tests & fixes --- commands/enrich/enrich.go | 33 +- enrich_test.go | 37 +- go.mod | 3 +- go.sum | 6 +- tests/testdata/other/enrich/enrich.xml | 1473 ++++++++++++++++++++++++ utils/resultwriter.go | 54 +- 6 files changed, 1594 insertions(+), 12 deletions(-) create mode 100644 tests/testdata/other/enrich/enrich.xml diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 2b382a51..09e1ff29 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -1,6 +1,7 @@ package enrich import ( + "encoding/xml" "errors" "github.com/jfrog/gofrog/parallel" "github.com/jfrog/jfrog-cli-core/v2/common/spec" @@ -73,6 +74,19 @@ func (enrichCmd *EnrichCommand) SetFail(fail bool) *EnrichCommand { return enrichCmd } +func isXML(scaResults []utils.ScaScanResult) (bool, error) { + if len(scaResults) == 0 { + return false, errors.New("unable to retrieve file") + } + fileName := scaResults[0].Target + var x interface{} + content, err := os.ReadFile(fileName) + if err != nil { + return false, err + } + return xml.Unmarshal(content, &x) == nil, nil +} + func (enrichCmd *EnrichCommand) Run() (err error) { defer func() { if err != nil { @@ -140,10 +154,21 @@ func (enrichCmd *EnrichCommand) Run() (err error) { scanResults.XrayVersion = xrayVersion scanResults.ScaResults = flatResults - if err = xrutils.NewResultsWriter(scanResults). - AppendVulnsToJson(); err != nil { + isxml, err := isXML(scanResults.ScaResults) + if err != nil { return } + if isxml { + if err = xrutils.NewResultsWriter(scanResults). + AppendVulnsToXML(); err != nil { + return + } + } else { + if err = xrutils.NewResultsWriter(scanResults). + AppendVulnsToJson(); err != nil { + return + } + } if err != nil { return err @@ -203,8 +228,8 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par return err } params := &services.XrayGraphImportParams{ - SBOMJson: string(fileContent), - ScanType: services.Binary, + SBOMInput: fileContent, + ScanType: services.Binary, } if enrichCmd.progress != nil { enrichCmd.progress.SetHeadlineMsg("Scanning 🔍") diff --git a/enrich_test.go b/enrich_test.go index cc90c0d7..158d1413 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "encoding/xml" securityTests "github.com/jfrog/jfrog-cli-security/tests" securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" "github.com/stretchr/testify/assert" @@ -18,6 +19,15 @@ type EnrichJson struct { Vulnerabilities []Vulnerability `json:"vulnerabilities"` } +type Bom struct { + Vulnerabilities struct { + Vulnerability []struct { + BomRef string `xml:"bom-ref,attr"` + ID string `xml:"id"` + } `xml:"vulnerability"` + } `xml:"vulnerabilities"` +} + func UnmarshalJson(t *testing.T, output string) EnrichJson { var jsonMap EnrichJson err := json.Unmarshal([]byte(output), &jsonMap) @@ -25,7 +35,14 @@ func UnmarshalJson(t *testing.T, output string) EnrichJson { return jsonMap } -func TestXrayEnrichSbom_Success(t *testing.T) { +func UnmarshalXML(t *testing.T, output string) Bom { + var xmlMap Bom + err := xml.Unmarshal([]byte(output), &xmlMap) + assert.NoError(t, err) + return xmlMap +} + +func TestXrayEnrichSbomJson_Success(t *testing.T) { securityTestUtils.InitSecurityTest(t, "") // Configure a new server named "default". securityTestUtils.CreateJfrogHomeConfig(t, true) @@ -34,9 +51,25 @@ func TestXrayEnrichSbom_Success(t *testing.T) { jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.json") output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) enrichedSbom := UnmarshalJson(t, output) - assert.Equal(t, len(enrichedSbom.Vulnerabilities), 12) + assert.Greater(t, len(enrichedSbom.Vulnerabilities), 0) for _, vuln := range enrichedSbom.Vulnerabilities { assert.NotEqual(t, vuln.BomRef, nil) assert.NotEqual(t, vuln.Id, nil) } } + +func TestXrayEnrichSbomXML_Success(t *testing.T) { + securityTestUtils.InitSecurityTest(t, "") + // Configure a new server named "default". + securityTestUtils.CreateJfrogHomeConfig(t, true) + defer securityTestUtils.CleanTestsHomeEnv() + // Check curl command with the default configured server. + jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.xml") + output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) + enrichedSbom := UnmarshalXML(t, output) + assert.Greater(t, len(enrichedSbom.Vulnerabilities.Vulnerability), 0) + for _, vuln := range enrichedSbom.Vulnerabilities.Vulnerability { + assert.NotEqual(t, vuln.BomRef, nil) + assert.NotEqual(t, vuln.ID, nil) + } +} diff --git a/go.mod b/go.mod index 9f1fe156..a43c0b25 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/jfrog/jfrog-cli-security go 1.22.3 require ( + github.com/beevik/etree v1.4.0 github.com/gookit/color v1.5.4 github.com/jfrog/build-info-go v1.9.29 github.com/jfrog/gofrog v1.7.2 @@ -100,6 +101,6 @@ require ( replace github.com/jfrog/jfrog-cli-core/v2 => github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 -replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450 +replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 //replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go dev diff --git a/go.sum b/go.sum index 98b6ada2..b80bb5d9 100644 --- a/go.sum +++ b/go.sum @@ -22,8 +22,10 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 h1:p0uoVJ9e54Za58LeN4TXw8Lki6FTjLVgVxoAMavMKdI= github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4/go.mod h1:4iTSevmlThM1Aw5NAY4WyVxim5US4SkrmxHSHFimaqk= -github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450 h1:BjSFjYlfTJvlNm7Jm9Yf5AyAXhHvdDnNjm6LTSbxoFI= -github.com/barv-jfrog/jfrog-client-go v0.0.0-20240610072103-f932d1184450/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 h1:dQQYwVj+0LNaySKzp0aZKcC+o430qPTN+a8X50/vPMg= +github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= +github.com/beevik/etree v1.4.0 h1:oz1UedHRepuY3p4N5OjE0nK1WLCqtzHf25bxplKOHLs= +github.com/beevik/etree v1.4.0/go.mod h1:cyWiXwGoasx60gHvtnEh5x8+uIjUVnjWqBvEnhnqKDA= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= diff --git a/tests/testdata/other/enrich/enrich.xml b/tests/testdata/other/enrich/enrich.xml new file mode 100644 index 00000000..5368b18e --- /dev/null +++ b/tests/testdata/other/enrich/enrich.xml @@ -0,0 +1,1473 @@ + + + + 2024-06-17T13:15:34Z + + + JFrog Inc. + Xray + 3.96.1 + + + + jfrog/jfrog-cli-v2-jf + 2.58.2 + + + + + 3.20:alpine-baselayout + 3.6.5-r0 + + 6b666dcbe0117c8c13245a8e9858d38853052819f7b01778f15049c8ac9eb73f + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:alpine-baselayout@3.6.5-r0 + + + 3.20:alpine-baselayout-data + 3.6.5-r0 + + 36f305ace93c0f019e415001f930893019e6b73a183052ec5f52e68846a95d76 + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:alpine-baselayout-data@3.6.5-r0 + + + 3.20:alpine-keys + 2.4-r1 + + c5cc621e8566b309e72573ba32b500fff863b48c959c08b9c44fa86ae475707e + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:alpine-keys@2.4-r1 + + + 3.20:apk-tools + 2.14.4-r0 + + 2e62f92a319ff72fb88d4caa187f35e4d5d3bd21a7042bfd76efbf7641f06e8e + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:apk-tools@2.14.4-r0 + + + 3.20:bash + 5.2.26-r0 + + 3e80857bccc5ca1ad57106796c532b314b6c574b55d2639a4b82703c34b2ac8c + + + + GPL-3.0-or-later + http://www.gnu.org/licenses/gpl-3.0-standalone.html + + + pkg:alpine/3.20:bash@5.2.26-r0 + + + 3.20:brotli-libs + 1.1.0-r2 + + b463a832baaba0e403a71f2814db98f7f21aa226486293f7629567e9425946bf + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:brotli-libs@1.1.0-r2 + + + 3.20:busybox + 1.36.1-r28 + + f2f7db28b183e2d0fd0c13d2f9919074ccfd9fbada85cc22528c98adff0b5691 + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:busybox@1.36.1-r28 + + + 3.20:busybox-binsh + 1.36.1-r28 + + bbb43c4b213b47b184991c06c6e5e6a0b1ece73c5bb1c0553c7cd903f4e79f41 + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:busybox-binsh@1.36.1-r28 + + + 3.20:c-ares + 1.28.1-r0 + + 9e01a28a920e9a743538a15d529f36bafdaac8aea9c8aa94294eaba623ac4469 + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:c-ares@1.28.1-r0 + + + 3.20:ca-certificates + 20240226-r0 + + acbd298d093ad87dc471443c7c94981fa7d952dbc19d20efa3617f52760ab7c2 + + + + MIT + http://www.opensource.org/licenses/MIT + + + MPL-2.0 + http://opensource.org/licenses/MPL-2.0 + + + pkg:alpine/3.20:ca-certificates@20240226-r0 + + + 3.20:ca-certificates-bundle + 20240226-r0 + + 5dfba5c4e80616d5770b83583b9faa3118c955402aa5f7205fc470efc9bc134d + + + + MIT + http://www.opensource.org/licenses/MIT + + + MPL-2.0 + http://opensource.org/licenses/MPL-2.0 + + + pkg:alpine/3.20:ca-certificates-bundle@20240226-r0 + + + 3.20:curl + 8.7.1-r0 + + a2992763146907128e607d5223487fc16c5040931150a8aa174af28699247955 + + + + curl + https://github.com/bagder/curl/blob/master/COPYING + + + pkg:alpine/3.20:curl@8.7.1-r0 + + + 3.20:jq + 1.7.1-r0 + + 6670448b471ecf62680777189e886e71fe56673f191327c755162013298d4b20 + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:jq@1.7.1-r0 + + + 3.20:libcrypto3 + 3.3.0-r2 + + 31c92fea489b54d40d96f4878815fa80849fa80f332c70abf22d9ad58ba263a9 + + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:alpine/3.20:libcrypto3@3.3.0-r2 + + + 3.20:libcurl + 8.7.1-r0 + + 9ab4513bb017d3b6dfe0fd22e6334fb40355a4be022d3de349eaff54b3750997 + + + + curl + https://github.com/bagder/curl/blob/master/COPYING + + + pkg:alpine/3.20:libcurl@8.7.1-r0 + + + 3.20:libidn2 + 2.3.7-r0 + + 60e4cb0fc0766388a8863803b01d5259643f93d2653ba0ad2bb1fe883e7a331d + + + + GPL-2.0-or-later + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + LGPL-3.0-or-later + http://www.gnu.org/licenses/lgpl-3.0-standalone.html + + + pkg:alpine/3.20:libidn2@2.3.7-r0 + + + 3.20:libncursesw + 6.4_p20240420-r0 + + 07639180ea04863756d864f542c0e15e1238c1d4ad0e33c10635f684ceb7b942 + + + + X11 + http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3 + + + pkg:alpine/3.20:libncursesw@6.4_p20240420-r0 + + + 3.20:libpsl + 0.21.5-r1 + + 900522f4392c5a8d9564623d2a96023dbafdb6e0d8e8f6e926047e6191b357c5 + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:libpsl@0.21.5-r1 + + + 3.20:libssl3 + 3.3.0-r2 + + d0324419e9efac6a0c430d9a2f1370ae101b41dadefe6a6806ac7ab3942da633 + + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:alpine/3.20:libssl3@3.3.0-r2 + + + 3.20:libunistring + 1.2-r0 + + c4053742bbc7a4e10ffeb69cea5cc2e3a4f12e33a93c83bd5034faae2f25b08a + + + + GPL-2.0-or-later + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + LGPL-3.0-or-later + http://www.gnu.org/licenses/lgpl-3.0-standalone.html + + + pkg:alpine/3.20:libunistring@1.2-r0 + + + 3.20:musl + 1.2.5-r0 + + 6844b689522a48af1a921a51720b8e56c689ed44f05864278ab1d7eccd1b1e4a + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:musl@1.2.5-r0 + + + 3.20:musl-utils + 1.2.5-r0 + + 4cc7271e4c28281d5e89517512c7c8afee8b97589cd5f7254959818fec519014 + + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + GPL-2.0-or-later + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:musl-utils@1.2.5-r0 + + + 3.20:ncurses-terminfo-base + 6.4_p20240420-r0 + + 911596ac00ff138fe8f7e9ddff1b74c4112206f20710e9087736a85013ca966f + + + + X11 + http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3 + + + pkg:alpine/3.20:ncurses-terminfo-base@6.4_p20240420-r0 + + + 3.20:nghttp2-libs + 1.62.0-r0 + + b8129d43e335f1eed40012353a3d69cad37a98fcf0279df19b65a4efd675ce90 + + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:alpine/3.20:nghttp2-libs@1.62.0-r0 + + + 3.20:oniguruma + 6.9.9-r0 + + 4ed2ccc6e503b20eb7ea82167d73f6c22fcaa1579c3684ed482dc63b74c89f29 + + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + pkg:alpine/3.20:oniguruma@6.9.9-r0 + + + 3.20:readline + 8.2.10-r0 + + 70fc1f52b0bc587fc7e44f9abef3ec3ebea09adaa5678f159fcc0acc2ad6dfb8 + + + + GPL-3.0-or-later + http://www.gnu.org/licenses/gpl-3.0-standalone.html + + + pkg:alpine/3.20:readline@8.2.10-r0 + + + 3.20:scanelf + 1.3.7-r2 + + 6ebb9a49243a2414378a6a3ba3cc44c69d53375470b07f91c8aa109298338294 + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:scanelf@1.3.7-r2 + + + 3.20:ssl_client + 1.36.1-r28 + + 9cca97be35a3247dd4093020d47f61aff44f50b0beb60ffb28c652fc9410cb51 + + + + GPL-2.0-only + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:ssl_client@1.36.1-r28 + + + 3.20:tzdata + 2024a-r1 + + d3697a4fe432c7d75e11fa6433beb5de0ea28cc86af9f7855d9301af1299b9c8 + + pkg:alpine/3.20:tzdata@2024a-r1 + + + 3.20:zlib + 1.3.1-r1 + + 72012e56c9daf3b4e929392e39a931a54f5975921f10fb23f3354aeff22f29b6 + + + + Zlib + http://www.opensource.org/licenses/Zlib + + + pkg:alpine/3.20:zlib@1.3.1-r1 + + + 3.20:zstd-libs + 1.5.6-r0 + + 54defd69b1c660eeed53040be20dff3511591b64a5eaf63902210752fdcf7318 + + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + GPL-2.0-or-later + http://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html + + + pkg:alpine/3.20:zstd-libs@1.5.6-r0 + + + dario.cat/mergo + 1.0.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/dario.cat%2Fmergo@1.0.0 + + + github.com/BurntSushi/toml + 1.3.2 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2FBurntSushi%2Ftoml@1.3.2 + + + github.com/CycloneDX/cyclonedx-go + 0.8.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2FCycloneDX%2Fcyclonedx-go@0.8.0 + + + github.com/ProtonMail/go-crypto + 1.0.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2FProtonMail%2Fgo-crypto@1.0.0 + + + github.com/VividCortex/ewma + 1.2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2FVividCortex%2Fewma@1.2.0 + + + github.com/acarl005/stripansi + 0.0.0-20180116102854-5a71ef0e047d + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Facarl005%2Fstripansi@0.0.0-20180116102854-5a71ef0e047d + + + github.com/agnivade/levenshtein + 1.1.1 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fagnivade%2Flevenshtein@1.1.1 + + + github.com/andybalholm/brotli + 1.1.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fandybalholm%2Fbrotli@1.1.0 + + + github.com/buger/jsonparser + 1.1.1 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fbuger%2Fjsonparser@1.1.1 + + + github.com/c-bata/go-prompt + 0.2.5 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fc-bata%2Fgo-prompt@0.2.5 + + + github.com/chzyer/readline + 1.5.1 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fchzyer%2Freadline@1.5.1 + + + github.com/cloudflare/circl + 1.3.7 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fcloudflare%2Fcircl@1.3.7 + + + github.com/cpuguy83/go-md2man/v2 + 2.0.4 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fcpuguy83%2Fgo-md2man%2Fv2@2.0.4 + + + github.com/cyphar/filepath-securejoin + 0.2.4 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fcyphar%2Ffilepath-securejoin@0.2.4 + + + github.com/davecgh/go-spew + 1.1.2-0.20180830191138-d8f796af33cc + + + ISC + http://www.opensource.org/licenses/ISC + + + pkg:go/github.com%2Fdavecgh%2Fgo-spew@1.1.2-0.20180830191138-d8f796af33cc + + + github.com/dsnet/compress + 0.0.2-0.20230904184137-39efe44ab707 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fdsnet%2Fcompress@0.0.2-0.20230904184137-39efe44ab707 + + + github.com/emirpasic/gods + 1.18.1 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + ISC + http://www.opensource.org/licenses/ISC + + + Mup + https://fedoraproject.org/wiki/Licensing/Mup + + + pkg:go/github.com%2Femirpasic%2Fgods@1.18.1 + + + github.com/forPelevin/gomoji + 1.2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2FforPelevin%2Fgomoji@1.2.0 + + + github.com/fsnotify/fsnotify + 1.7.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Ffsnotify%2Ffsnotify@1.7.0 + + + github.com/go-git/gcfg + 1.5.1-0.20230307220236-3a3c6141e376 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fgo-git%2Fgcfg@1.5.1-0.20230307220236-3a3c6141e376 + + + github.com/go-git/go-billy/v5 + 5.5.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fgo-git%2Fgo-billy%2Fv5@5.5.0 + + + github.com/go-git/go-git/v5 + 5.12.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fgo-git%2Fgo-git%2Fv5@5.12.0 + + + github.com/gocarina/gocsv + 0.0.0-20240520201108-78e41c74b4b1 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fgocarina%2Fgocsv@0.0.0-20240520201108-78e41c74b4b1 + + + github.com/golang-jwt/jwt/v4 + 4.5.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fgolang-jwt%2Fjwt%2Fv4@4.5.0 + + + github.com/golang/go + 1.22.4 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fgolang%2Fgo@1.22.4 + + + github.com/golang/groupcache + 0.0.0-20210331224755-41bb18bfe9da + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fgolang%2Fgroupcache@0.0.0-20210331224755-41bb18bfe9da + + + github.com/golang/snappy + 0.0.4 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fgolang%2Fsnappy@0.0.4 + + + github.com/google/uuid + 1.6.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fgoogle%2Fuuid@1.6.0 + + + github.com/gookit/color + 1.5.4 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fgookit%2Fcolor@1.5.4 + + + github.com/hashicorp/hcl + 1.0.0 + + + MPL-2.0 + http://opensource.org/licenses/MPL-2.0 + + + MPL-2.0-no-copyleft-exception + http://opensource.org/licenses/MPL-2.0 + + + pkg:go/github.com%2Fhashicorp%2Fhcl@1.0.0 + + + github.com/jbenet/go-context + 0.0.0-20150711004518-d14ea06fba99 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fjbenet%2Fgo-context@0.0.0-20150711004518-d14ea06fba99 + + + github.com/jedib0t/go-pretty/v6 + 6.5.9 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fjedib0t%2Fgo-pretty%2Fv6@6.5.9 + + + github.com/jfrog/archiver/v3 + 3.6.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fjfrog%2Farchiver%2Fv3@3.6.0 + + + github.com/jfrog/build-info-go + 1.9.29 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fbuild-info-go@1.9.29 + + + github.com/jfrog/gofrog + 1.7.2 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fgofrog@1.7.2 + + + github.com/jfrog/jfrog-apps-config + 1.0.1 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-apps-config@1.0.1 + + + github.com/jfrog/jfrog-cli + (devel) + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-cli@%28devel%29 + + + github.com/jfrog/jfrog-cli-core/v2 + 2.53.1 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-cli-core%2Fv2@2.53.1 + + + github.com/jfrog/jfrog-cli-platform-services + 1.3.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-cli-platform-services@1.3.0 + + + github.com/jfrog/jfrog-cli-security + 1.3.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-cli-security@1.3.0 + + + github.com/jfrog/jfrog-client-go + 1.41.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fjfrog%2Fjfrog-client-go@1.41.0 + + + github.com/jszwec/csvutil + 1.10.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fjszwec%2Fcsvutil@1.10.0 + + + github.com/kevinburke/ssh_config + 1.2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fkevinburke%2Fssh_config@1.2.0 + + + github.com/klauspost/compress + 1.17.7 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fklauspost%2Fcompress@1.17.7 + + + github.com/klauspost/cpuid/v2 + 2.2.7 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fklauspost%2Fcpuid%2Fv2@2.2.7 + + + github.com/klauspost/pgzip + 1.2.6 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fklauspost%2Fpgzip@1.2.6 + + + github.com/magiconair/properties + 1.8.7 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + Mup + https://fedoraproject.org/wiki/Licensing/Mup + + + pkg:go/github.com%2Fmagiconair%2Fproperties@1.8.7 + + + github.com/manifoldco/promptui + 0.9.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fmanifoldco%2Fpromptui@0.9.0 + + + github.com/mattn/go-runewidth + 0.0.15 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fmattn%2Fgo-runewidth@0.0.15 + + + github.com/minio/sha256-simd + 1.0.1 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fminio%2Fsha256-simd@1.0.1 + + + github.com/mitchellh/mapstructure + 1.5.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fmitchellh%2Fmapstructure@1.5.0 + + + github.com/nwaples/rardecode + 1.1.3 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + Mup + https://fedoraproject.org/wiki/Licensing/Mup + + + pkg:go/github.com%2Fnwaples%2Frardecode@1.1.3 + + + github.com/owenrumney/go-sarif/v2 + 2.3.0 + + + Unlicense + http://unlicense.org/ + + + pkg:go/github.com%2Fowenrumney%2Fgo-sarif%2Fv2@2.3.0 + + + github.com/pelletier/go-toml/v2 + 2.2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fpelletier%2Fgo-toml%2Fv2@2.2.0 + + + github.com/pierrec/lz4/v4 + 4.1.21 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fpierrec%2Flz4%2Fv4@4.1.21 + + + github.com/pjbgf/sha1cd + 0.3.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fpjbgf%2Fsha1cd@0.3.0 + + + github.com/pkg/browser + 0.0.0-20240102092130-5ac0b6a4141c + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + Mup + https://fedoraproject.org/wiki/Licensing/Mup + + + pkg:go/github.com%2Fpkg%2Fbrowser@0.0.0-20240102092130-5ac0b6a4141c + + + github.com/pkg/term + 1.1.0 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + pkg:go/github.com%2Fpkg%2Fterm@1.1.0 + + + github.com/pmezard/go-difflib + 1.0.1-0.20181226105442-5d4384ee4fb2 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fpmezard%2Fgo-difflib@1.0.1-0.20181226105442-5d4384ee4fb2 + + + github.com/rivo/uniseg + 0.4.7 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Frivo%2Funiseg@0.4.7 + + + github.com/russross/blackfriday/v2 + 2.1.0 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + pkg:go/github.com%2Frussross%2Fblackfriday%2Fv2@2.1.0 + + + github.com/sagikazarmark/slog-shim + 0.1.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fsagikazarmark%2Fslog-shim@0.1.0 + + + github.com/sergi/go-diff + 1.3.2-0.20230802210424-5b0b94c5c0d3 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fsergi%2Fgo-diff@1.3.2-0.20230802210424-5b0b94c5c0d3 + + + github.com/skeema/knownhosts + 1.2.2 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fskeema%2Fknownhosts@1.2.2 + + + github.com/spf13/afero + 1.11.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fspf13%2Fafero@1.11.0 + + + github.com/spf13/cast + 1.6.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fspf13%2Fcast@1.6.0 + + + github.com/spf13/pflag + 1.0.5 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fspf13%2Fpflag@1.0.5 + + + github.com/spf13/viper + 1.18.2 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fspf13%2Fviper@1.18.2 + + + github.com/stretchr/testify + 1.9.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fstretchr%2Ftestify@1.9.0 + + + github.com/subosito/gotenv + 1.6.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Fsubosito%2Fgotenv@1.6.0 + + + github.com/ulikunitz/xz + 0.5.12 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/github.com%2Fulikunitz%2Fxz@0.5.12 + + + github.com/urfave/cli + 1.22.15 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/github.com%2Furfave%2Fcli@1.22.15 + + + github.com/vbauerster/mpb/v7 + 7.5.3 + + + Unlicense + http://unlicense.org/ + + + pkg:go/github.com%2Fvbauerster%2Fmpb%2Fv7@7.5.3 + + + github.com/xanzy/ssh-agent + 0.3.3 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/github.com%2Fxanzy%2Fssh-agent@0.3.3 + + + github.com/xi2/xz + 0.0.0-20171230120015-48954b6210f8 + pkg:go/github.com%2Fxi2%2Fxz@0.0.0-20171230120015-48954b6210f8 + + + github.com/xo/terminfo + 0.0.0-20220910002029-abceb7e1c41e + pkg:go/github.com%2Fxo%2Fterminfo@0.0.0-20220910002029-abceb7e1c41e + + + golang.org/x/crypto + 0.24.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fcrypto@0.24.0 + + + golang.org/x/exp + 0.0.0-20240604190554-fc45aab8b7f8 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fexp@0.0.0-20240604190554-fc45aab8b7f8 + + + golang.org/x/mod + 0.18.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fmod@0.18.0 + + + golang.org/x/net + 0.26.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fnet@0.26.0 + + + golang.org/x/sync + 0.7.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fsync@0.7.0 + + + golang.org/x/sys + 0.21.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fsys@0.21.0 + + + golang.org/x/term + 0.21.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Fterm@0.21.0 + + + golang.org/x/text + 0.16.0 + + + BSD-3-Clause + http://opensource.org/licenses/BSD-3-Clause + + + pkg:go/golang.org%2Fx%2Ftext@0.16.0 + + + gopkg.in/ini.v1 + 1.67.0 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + pkg:go/gopkg.in%2Fini.v1@1.67.0 + + + gopkg.in/warnings.v0 + 0.1.2 + + + BSD-2-Clause + http://opensource.org/licenses/BSD-2-Clause + + + pkg:go/gopkg.in%2Fwarnings.v0@0.1.2 + + + gopkg.in/yaml.v3 + 3.0.1 + + + Apache-2.0 + http://licenses.nuget.org/Apache-2.0 + + + MIT + http://www.opensource.org/licenses/MIT + + + pkg:go/gopkg.in%2Fyaml.v3@3.0.1 + + + jfrog/jfrog-cli-v2-jf + 2.58.2 + + 556377977a536a9fb653940d7e18b96b531a3e20ce8901773fea90a704224f28 + + pkg:docker/jfrog%2Fjfrog-cli-v2-jf@2.58.2 + + + + diff --git a/utils/resultwriter.go b/utils/resultwriter.go index c08e9e09..04607bd5 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/beevik/etree" "github.com/jfrog/jfrog-cli-core/v2/common/format" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-security/formats" @@ -49,8 +50,16 @@ type ResultsWriter struct { } type Vulnerability struct { - BomRef string `json:"bom-ref"` - ID string `json:"id"` + BomRef string `json:"bom-ref" xml:"bom-ref,attr"` + ID string `json:"id" xml:"id"` +} + +type XMLVulnerability struct { + Vulnerability []Vulnerability `xml:"vulnerability"` +} + +type Vulnerabilities struct { + Vulnerabilities XMLVulnerability `xml:"vulnerabilities"` } func NewResultsWriter(scanResults *Results) *ResultsWriter { @@ -134,7 +143,7 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { var data map[string]interface{} err = json.Unmarshal(fileContent, &data) if err != nil { - fmt.Println("Error parsing JSON:", err) + fmt.Println("Error parsing XML:", err) return err } var vulnerabilities []map[string]string @@ -147,7 +156,46 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { } data["vulnerabilities"] = vulnerabilities return PrintJson(data) +} + +func (rw *ResultsWriter) createVulnXml() string { + xrayResults := rw.results.GetScaScansXrayResults()[0] + doc := etree.NewDocument() + vulns := doc.CreateElement("vulnerabilities") + for _, vuln := range xrayResults.Vulnerabilities { + for component := range vuln.Components { + addVuln := vulns.CreateElement("vulnerability") + addVuln.CreateAttr("bom-ref", component) + id := addVuln.CreateElement("id") + id.CreateText(vuln.Cves[0].Id) + } + } + doc.Indent(2) + doc.IndentTabs() + stringReturn, err := doc.WriteToString() + if err != nil { + return "" + } + return stringReturn +} +func (rw *ResultsWriter) AppendVulnsToXML() error { + fileName := rw.results.getScaScanFileName() + result := etree.NewDocument() + root := etree.NewDocument() + err := root.ReadFromString(rw.createVulnXml()) + if err != nil { + return err + } + err = result.ReadFromFile(fileName) + if err != nil { + return err + } + destination := result.FindElements("//bom")[0] + destination.AddChild(root.Child[0]) + stringReturn, _ := result.WriteToString() + log.Output(stringReturn) + return nil } func (rw *ResultsWriter) printScanResultsTables() (err error) { From 97cc333d938d51154666b065717701d902e15464 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 17 Jun 2024 17:39:21 +0300 Subject: [PATCH 16/28] tests & fixes --- utils/resultwriter.go | 37 +++++++++++-------------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/utils/resultwriter.go b/utils/resultwriter.go index 04607bd5..dc090658 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -158,10 +158,16 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { return PrintJson(data) } -func (rw *ResultsWriter) createVulnXml() string { +func (rw *ResultsWriter) AppendVulnsToXML() error { + fileName := rw.results.getScaScanFileName() + result := etree.NewDocument() + err := result.ReadFromFile(fileName) + if err != nil { + return err + } + destination := result.FindElements("//bom")[0] xrayResults := rw.results.GetScaScansXrayResults()[0] - doc := etree.NewDocument() - vulns := doc.CreateElement("vulnerabilities") + vulns := destination.CreateElement("vulnerabilities") for _, vuln := range xrayResults.Vulnerabilities { for component := range vuln.Components { addVuln := vulns.CreateElement("vulnerability") @@ -170,29 +176,8 @@ func (rw *ResultsWriter) createVulnXml() string { id.CreateText(vuln.Cves[0].Id) } } - doc.Indent(2) - doc.IndentTabs() - stringReturn, err := doc.WriteToString() - if err != nil { - return "" - } - return stringReturn -} - -func (rw *ResultsWriter) AppendVulnsToXML() error { - fileName := rw.results.getScaScanFileName() - result := etree.NewDocument() - root := etree.NewDocument() - err := root.ReadFromString(rw.createVulnXml()) - if err != nil { - return err - } - err = result.ReadFromFile(fileName) - if err != nil { - return err - } - destination := result.FindElements("//bom")[0] - destination.AddChild(root.Child[0]) + result.IndentTabs() + result.Indent(2) stringReturn, _ := result.WriteToString() log.Output(stringReturn) return nil From a2f16795da3314035e75ecccb4e426dad472ff8c Mon Sep 17 00:00:00 2001 From: barv Date: Wed, 26 Jun 2024 16:53:38 +0300 Subject: [PATCH 17/28] tests & fixes --- cli/cli.go | 2 +- cli/docs/enrich/help.go | 3 +- cli/sbomcommands.go | 6 +- commands/enrich/enrich.go | 41 ++----- .../enrich/enrichgraph}/enrichgraph.go | 0 .../enrich/enrichgraph}/params.go | 0 enrich_test.go | 102 ++++++++---------- formats/enrich_output.go | 14 +++ tests/utils/test_utils.go | 37 +++++++ utils/resultwriter.go | 19 +--- 10 files changed, 111 insertions(+), 113 deletions(-) rename {enrichgraph => commands/enrich/enrichgraph}/enrichgraph.go (100%) rename {enrichgraph => commands/enrich/enrichgraph}/params.go (100%) create mode 100644 formats/enrich_output.go diff --git a/cli/cli.go b/cli/cli.go index 4aa67fa2..8fc29f70 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -20,7 +20,7 @@ func GetJfrogCliSecurityApp() components.App { Name: string(cliutils.Sbom), Description: "Sbom commands.", Commands: getSbomCommands(), - Category: "sbom Namespaces", + Category: "Command Namespaces", }) return app } diff --git a/cli/docs/enrich/help.go b/cli/docs/enrich/help.go index a7828819..55c7c195 100644 --- a/cli/docs/enrich/help.go +++ b/cli/docs/enrich/help.go @@ -2,7 +2,6 @@ package enrich import ( "github.com/jfrog/jfrog-cli-core/v2/plugins/components" - "github.com/jfrog/jfrog-cli-security/cli/docs" ) func GetDescription() string { @@ -10,5 +9,5 @@ func GetDescription() string { } func GetArguments() []components.Argument { - return []components.Argument{{Name: "source pattern", ReplaceWithFlag: docs.SpecFlag, Description: `Specifies the local file system path of the JSON to be scanned.`}} + return []components.Argument{{Name: "source pattern", Description: `Specifies the local file system path of the JSON to be scanned.`}} } diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go index 0d408c92..8cf12b15 100644 --- a/cli/sbomcommands.go +++ b/cli/sbomcommands.go @@ -37,13 +37,11 @@ func EnrichCmd(c *components.Context) error { if err != nil { return err } - err = validateXrayContext(c, serverDetails) - if err != nil { + if err = validateXrayContext(c, serverDetails); err != nil { return err } specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) - err = spec.ValidateSpec(specFile.Files, false, false) - if err != nil { + if err = spec.ValidateSpec(specFile.Files, false, false); err != nil { return err } threads, err := pluginsCommon.GetThreadsCount(c) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 09e1ff29..67cd00ae 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -7,7 +7,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/common/spec" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" - "github.com/jfrog/jfrog-cli-security/enrichgraph" + enrichgraph2 "github.com/jfrog/jfrog-cli-security/commands/enrich/enrichgraph" "github.com/jfrog/jfrog-cli-security/formats" "github.com/jfrog/jfrog-cli-security/scangraph" "github.com/jfrog/jfrog-cli-security/utils" @@ -31,19 +31,11 @@ type ScanInfo struct { Result *services.ScanResponse } -const ( - BypassArchiveLimitsMinXrayVersion = "3.59.0" - indexingCommand = "graph" - fileNotSupportedExitCode = 3 -) - type EnrichCommand struct { serverDetails *config.ServerDetails spec *spec.SpecFiles threads int - fail bool - // The location of the downloaded Xray indexer binary on the local file system. - progress ioUtils.ProgressMgr + progress ioUtils.ProgressMgr } func (enrichCmd *EnrichCommand) SetProgress(progress ioUtils.ProgressMgr) { @@ -69,11 +61,6 @@ func (enrichCmd *EnrichCommand) ServerDetails() (*config.ServerDetails, error) { return enrichCmd.serverDetails, nil } -func (enrichCmd *EnrichCommand) SetFail(fail bool) *EnrichCommand { - enrichCmd.fail = fail - return enrichCmd -} - func isXML(scaResults []utils.ScaScanResult) (bool, error) { if len(scaResults) == 0 { return false, errors.New("unable to retrieve file") @@ -93,7 +80,7 @@ func (enrichCmd *EnrichCommand) Run() (err error) { var e *exec.ExitError if errors.As(err, &e) { if e.ExitCode() != coreutils.ExitCodeVulnerableBuild.Code { - err = errors.New("Scan command failed. " + err.Error()) + err = errors.New("Enrich command failed. " + err.Error()) } } } @@ -174,17 +161,6 @@ func (enrichCmd *EnrichCommand) Run() (err error) { return err } - if err = utils.RecordSecurityCommandOutput(utils.ScanCommandSummaryResult{Results: scanResults.GetSummary(), Section: utils.Binary}); err != nil { - return err - } - - // If includeVulnerabilities is false it means that context was provided, so we need to check for build violations. - // If user provided --fail=false, don't fail the build. - if enrichCmd.fail { - if xrutils.CheckIfFailBuild(scanResults.GetScaScansXrayResults()) { - return xrutils.NewFailBuildError() - } - } if len(scanErrors) > 0 { return errorutils.CheckErrorf(scanErrors[0].ErrorMessage) } @@ -209,7 +185,7 @@ func (enrichCmd *EnrichCommand) prepareScanTasks(fileProducer, indexedFileProduc artifactHandlerFunc := enrichCmd.createIndexerHandlerFunc(indexedFileProducer, resultsArr, indexedFileErrors, xrayVersion) taskHandler := getAddTaskToProducerFunc(fileProducer, artifactHandlerFunc) - err := FileForIndexing(specFiles[0], taskHandler) + err := FileForEnriching(specFiles[0], taskHandler) if err != nil { log.Error(err) fileCollectingErrorsQueue.AddError(err) @@ -231,10 +207,7 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par SBOMInput: fileContent, ScanType: services.Binary, } - if enrichCmd.progress != nil { - enrichCmd.progress.SetHeadlineMsg("Scanning 🔍") - } - importGraphParams := enrichgraph.NewEnrichGraphParams(). + importGraphParams := enrichgraph2.NewEnrichGraphParams(). SetServerDetails(enrichCmd.serverDetails). SetXrayGraphScanParams(params). SetXrayVersion(xrayVersion) @@ -242,7 +215,7 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par if err != nil { return err } - scanResults, err := enrichgraph.RunImportGraphAndGetResults(importGraphParams, xrayManager) + scanResults, err := enrichgraph2.RunImportGraphAndGetResults(importGraphParams, xrayManager) if err != nil { indexedFileErrors[threadId] = append(indexedFileErrors[threadId], formats.SimpleJsonError{FilePath: filePath, ErrorMessage: err.Error()}) return @@ -275,7 +248,7 @@ func (enrichCmd *EnrichCommand) performScanTasks(fileConsumer parallel.Runner, i indexedFileConsumer.Run() } -func FileForIndexing(fileData spec.File, dataHandlerFunc indexFileHandlerFunc) error { +func FileForEnriching(fileData spec.File, dataHandlerFunc indexFileHandlerFunc) error { fileData.Pattern = clientutils.ReplaceTildeWithUserHome(fileData.Pattern) patternType := fileData.GetPatternType() rootPath, err := fspatterns.GetRootPath(fileData.Pattern, fileData.Target, "", patternType, false) diff --git a/enrichgraph/enrichgraph.go b/commands/enrich/enrichgraph/enrichgraph.go similarity index 100% rename from enrichgraph/enrichgraph.go rename to commands/enrich/enrichgraph/enrichgraph.go diff --git a/enrichgraph/params.go b/commands/enrich/enrichgraph/params.go similarity index 100% rename from enrichgraph/params.go rename to commands/enrich/enrichgraph/params.go diff --git a/enrich_test.go b/enrich_test.go index 158d1413..092229df 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -1,8 +1,7 @@ package main import ( - "encoding/json" - "encoding/xml" + "github.com/jfrog/jfrog-cli-security/commands/enrich/enrichgraph" securityTests "github.com/jfrog/jfrog-cli-security/tests" securityTestUtils "github.com/jfrog/jfrog-cli-security/tests/utils" "github.com/stretchr/testify/assert" @@ -10,66 +9,57 @@ import ( "testing" ) -type Vulnerability struct { - BomRef string `json:"bom_ref"` - Id string `json:"id"` -} - -type EnrichJson struct { - Vulnerabilities []Vulnerability `json:"vulnerabilities"` -} - -type Bom struct { - Vulnerabilities struct { - Vulnerability []struct { - BomRef string `xml:"bom-ref,attr"` - ID string `xml:"id"` - } `xml:"vulnerability"` - } `xml:"vulnerabilities"` -} - -func UnmarshalJson(t *testing.T, output string) EnrichJson { - var jsonMap EnrichJson - err := json.Unmarshal([]byte(output), &jsonMap) - assert.NoError(t, err) - return jsonMap -} - -func UnmarshalXML(t *testing.T, output string) Bom { - var xmlMap Bom - err := xml.Unmarshal([]byte(output), &xmlMap) - assert.NoError(t, err) - return xmlMap -} - -func TestXrayEnrichSbomJson_Success(t *testing.T) { - securityTestUtils.InitSecurityTest(t, "") - // Configure a new server named "default". - securityTestUtils.CreateJfrogHomeConfig(t, true) - defer securityTestUtils.CleanTestsHomeEnv() - // Check curl command with the default configured server. - jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.json") - output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) - enrichedSbom := UnmarshalJson(t, output) - assert.Greater(t, len(enrichedSbom.Vulnerabilities), 0) - for _, vuln := range enrichedSbom.Vulnerabilities { +func testVulns(t *testing.T, vulns []struct { + BomRef string + Id string +}) { + for _, vuln := range vulns { assert.NotEqual(t, vuln.BomRef, nil) assert.NotEqual(t, vuln.Id, nil) } } -func TestXrayEnrichSbomXML_Success(t *testing.T) { - securityTestUtils.InitSecurityTest(t, "") - // Configure a new server named "default". +func TestXrayEnrichSbomOutput(t *testing.T) { + securityTestUtils.InitSecurityTest(t, enrichgraph.EnrichMinimumVersionXray) securityTestUtils.CreateJfrogHomeConfig(t, true) defer securityTestUtils.CleanTestsHomeEnv() - // Check curl command with the default configured server. - jsonPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", "enrich.xml") - output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", jsonPath) - enrichedSbom := UnmarshalXML(t, output) - assert.Greater(t, len(enrichedSbom.Vulnerabilities.Vulnerability), 0) - for _, vuln := range enrichedSbom.Vulnerabilities.Vulnerability { - assert.NotEqual(t, vuln.BomRef, nil) - assert.NotEqual(t, vuln.ID, nil) + testCases := []struct { + name string + inputPath string + isXml bool + }{ + { + name: "Json format", + inputPath: "enrich.json", + }, + { + name: "Xml format", + inputPath: "enrich.xml", + isXml: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + inputPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", tc.inputPath) + output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", inputPath) + if tc.isXml { + enrichedSbom := securityTestUtils.UnmarshalXML(t, output) + assert.Greater(t, len(enrichedSbom.Vulnerabilities.Vulnerability), 0) + testVulns(t, []struct { + BomRef string + Id string + }(enrichedSbom.Vulnerabilities.Vulnerability)) + + } else { + enrichedSbom := securityTestUtils.UnmarshalJson(t, output) + assert.Greater(t, len(enrichedSbom.Vulnerability), 0) + testVulns(t, []struct { + BomRef string + Id string + }(enrichedSbom.Vulnerability)) + + } + + }) } } diff --git a/formats/enrich_output.go b/formats/enrich_output.go new file mode 100644 index 00000000..32bac751 --- /dev/null +++ b/formats/enrich_output.go @@ -0,0 +1,14 @@ +package formats + +type Vulnerability struct { + BomRef string `json:"bom-ref" xml:"bom-ref,attr"` + ID string `json:"id" xml:"id"` +} + +type XMLVulnerability struct { + Vulnerability []Vulnerability `xml:"vulnerability"` +} + +type Vulnerabilities struct { + Vulnerabilities XMLVulnerability `xml:"vulnerabilities"` +} diff --git a/tests/utils/test_utils.go b/tests/utils/test_utils.go index 79a23f92..2bd26055 100644 --- a/tests/utils/test_utils.go +++ b/tests/utils/test_utils.go @@ -1,6 +1,8 @@ package utils import ( + "encoding/json" + "encoding/xml" "errors" "fmt" "github.com/jfrog/jfrog-cli-security/utils" @@ -24,6 +26,41 @@ import ( clientTests "github.com/jfrog/jfrog-client-go/utils/tests" ) +type Vulnerability struct { + BomRef string `json:"bom-ref"` + Id string `json:"id"` +} + +type EnrichJson struct { + Vulnerability []struct { + BomRef string `json:"bom-ref,"` + Id string `json:"id"` + } `json:"vulnerabilities"` +} + +type Bom struct { + Vulnerabilities struct { + Vulnerability []struct { + BomRef string `xml:"bom-ref,attr"` + Id string `xml:"id"` + } `xml:"vulnerability"` + } `xml:"vulnerabilities"` +} + +func UnmarshalJson(t *testing.T, output string) EnrichJson { + var jsonMap EnrichJson + err := json.Unmarshal([]byte(output), &jsonMap) + assert.NoError(t, err) + return jsonMap +} + +func UnmarshalXML(t *testing.T, output string) Bom { + var xmlMap Bom + err := xml.Unmarshal([]byte(output), &xmlMap) + assert.NoError(t, err) + return xmlMap +} + func InitSecurityTest(t *testing.T, xrayMinVersion string) { if !*configTests.TestSecurity { t.Skip("Skipping Security test. To run Security test add the '-test.security=true' option.") diff --git a/utils/resultwriter.go b/utils/resultwriter.go index dc090658..dd6c9708 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -49,24 +49,11 @@ type ResultsWriter struct { messages []string } -type Vulnerability struct { - BomRef string `json:"bom-ref" xml:"bom-ref,attr"` - ID string `json:"id" xml:"id"` -} - -type XMLVulnerability struct { - Vulnerability []Vulnerability `xml:"vulnerability"` -} - -type Vulnerabilities struct { - Vulnerabilities XMLVulnerability `xml:"vulnerabilities"` -} - func NewResultsWriter(scanResults *Results) *ResultsWriter { return &ResultsWriter{results: scanResults} } -func (r *Results) getScaScanFileName() string { +func getScaScanFileName(r *Results) string { if len(r.ScaResults) > 0 { return r.ScaResults[0].Target } @@ -134,7 +121,7 @@ func (rw *ResultsWriter) PrintScanResults() error { } func (rw *ResultsWriter) AppendVulnsToJson() error { - fileName := rw.results.getScaScanFileName() + fileName := getScaScanFileName(rw.results) fileContent, err := os.ReadFile(fileName) if err != nil { fmt.Println("Error reading file:", err) @@ -159,7 +146,7 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { } func (rw *ResultsWriter) AppendVulnsToXML() error { - fileName := rw.results.getScaScanFileName() + fileName := getScaScanFileName(rw.results) result := etree.NewDocument() err := result.ReadFromFile(fileName) if err != nil { From 0705cee0a4bc94a6c21afd5116b529ffa05a506b Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 27 Jun 2024 11:15:45 +0300 Subject: [PATCH 18/28] tests & fixes --- commands/enrich/enrich.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 67cd00ae..458cc581 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -61,7 +61,7 @@ func (enrichCmd *EnrichCommand) ServerDetails() (*config.ServerDetails, error) { return enrichCmd.serverDetails, nil } -func isXML(scaResults []utils.ScaScanResult) (bool, error) { +func isXML(scaResults []*utils.ScaScanResult) (bool, error) { if len(scaResults) == 0 { return false, errors.New("unable to retrieve file") } @@ -116,10 +116,10 @@ func (enrichCmd *EnrichCommand) Run() (err error) { enrichCmd.performScanTasks(fileProducerConsumer, indexedFileProducerConsumer) // Handle results - flatResults := []xrutils.ScaScanResult{} + var flatResults []*xrutils.ScaScanResult for _, arr := range resultsArr { for _, res := range arr { - flatResults = append(flatResults, xrutils.ScaScanResult{Target: res.Target, XrayResults: []services.ScanResponse{*res.Result}}) + flatResults = append(flatResults, &xrutils.ScaScanResult{Target: res.Target, XrayResults: []services.ScanResponse{*res.Result}}) } } if enrichCmd.progress != nil { From b7e6fcb45cb8ea064380930e7a16c6b158d94727 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 4 Jul 2024 12:44:02 +0300 Subject: [PATCH 19/28] tests & fixes --- cli/cli.go | 6 ----- cli/docs/flags.go | 2 +- cli/sbomcommands.go | 56 --------------------------------------------- cli/scancommands.go | 36 +++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 63 deletions(-) delete mode 100644 cli/sbomcommands.go diff --git a/cli/cli.go b/cli/cli.go index 8fc29f70..95f7abba 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -16,11 +16,5 @@ func GetJfrogCliSecurityApp() components.App { Commands: getXrayNameSpaceCommands(), Category: "Command Namespaces", }) - app.Subcommands = append(app.Subcommands, components.Namespace{ - Name: string(cliutils.Sbom), - Description: "Sbom commands.", - Commands: getSbomCommands(), - Category: "Command Namespaces", - }) return app } diff --git a/cli/docs/flags.go b/cli/docs/flags.go index 0c977999..b4fb01bc 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -20,7 +20,7 @@ const ( DockerScan = "docker scan" Audit = "audit" CurationAudit = "curation-audit" - Enrich = "sbom enrich" + Enrich = "sbom-enrich" // TODO: Deprecated commands (remove at next CLI major version) AuditMvn = "audit-maven" diff --git a/cli/sbomcommands.go b/cli/sbomcommands.go deleted file mode 100644 index 8cf12b15..00000000 --- a/cli/sbomcommands.go +++ /dev/null @@ -1,56 +0,0 @@ -package cli - -import ( - "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" - commandsCommon "github.com/jfrog/jfrog-cli-core/v2/common/commands" - "github.com/jfrog/jfrog-cli-core/v2/common/spec" - pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" - "github.com/jfrog/jfrog-cli-core/v2/plugins/components" - coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config" - flags "github.com/jfrog/jfrog-cli-security/cli/docs" - enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/enrich" - "github.com/jfrog/jfrog-cli-security/commands/enrich" -) - -func getSbomCommands() []components.Command { - return []components.Command{ - { - Name: "enrich", - Aliases: []string{"se"}, - Flags: flags.GetCommandFlags(flags.Enrich), - Description: enrichDocs.GetDescription(), - Arguments: enrichDocs.GetArguments(), - Action: EnrichCmd, - }, - } -} - -func createServerDetails(c *components.Context) (*coreConfig.ServerDetails, error) { - return pluginsCommon.CreateServerDetailsWithConfigOffer(c, true, cliutils.Sbom) -} - -func EnrichCmd(c *components.Context) error { - if len(c.Arguments) == 0 { - return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) - } - serverDetails, err := createServerDetails(c) - if err != nil { - return err - } - if err = validateXrayContext(c, serverDetails); err != nil { - return err - } - specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) - if err = spec.ValidateSpec(specFile.Files, false, false); err != nil { - return err - } - threads, err := pluginsCommon.GetThreadsCount(c) - if err != nil { - return err - } - EnrichCmd := enrich.NewEnrichCommand(). - SetServerDetails(serverDetails). - SetThreads(threads). - SetSpec(specFile) - return commandsCommon.Exec(EnrichCmd) -} diff --git a/cli/scancommands.go b/cli/scancommands.go index 40e0855b..b3ebd7cc 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -2,6 +2,8 @@ package cli import ( "fmt" + enrichDocs "github.com/jfrog/jfrog-cli-security/cli/docs/enrich" + "github.com/jfrog/jfrog-cli-security/commands/enrich" "os" "strings" @@ -49,6 +51,14 @@ func getAuditAndScansCommands() []components.Command { Category: auditScanCategory, Action: ScanCmd, }, + { + Name: "sbom-enrich", + Aliases: []string{"se"}, + Flags: flags.GetCommandFlags(flags.Enrich), + Description: enrichDocs.GetDescription(), + Arguments: enrichDocs.GetArguments(), + Action: EnrichCmd, + }, { Name: "build-scan", Aliases: []string{"bs"}, @@ -152,6 +162,32 @@ func getAuditAndScansCommands() []components.Command { } } +func EnrichCmd(c *components.Context) error { + if len(c.Arguments) == 0 { + return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) + } + serverDetails, err := createServerDetailsWithConfigOffer(c) + if err != nil { + return err + } + if err = validateXrayContext(c, serverDetails); err != nil { + return err + } + specFile := createDefaultScanSpec(c, addTrailingSlashToRepoPathIfNeeded(c)) + if err = spec.ValidateSpec(specFile.Files, false, false); err != nil { + return err + } + threads, err := pluginsCommon.GetThreadsCount(c) + if err != nil { + return err + } + EnrichCmd := enrich.NewEnrichCommand(). + SetServerDetails(serverDetails). + SetThreads(threads). + SetSpec(specFile) + return commandsCommon.Exec(EnrichCmd) +} + func ScanCmd(c *components.Context) error { if len(c.Arguments) == 0 && !c.IsFlagSet(flags.SpecFlag) { return pluginsCommon.PrintHelpAndReturnError("providing either a argument or the 'spec' option is mandatory", c) From 8d8913368ff15f873a6b42a3983b8bbe6857b647 Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 4 Jul 2024 17:41:54 +0300 Subject: [PATCH 20/28] tests & fixes --- enrich_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enrich_test.go b/enrich_test.go index 092229df..77d141ba 100644 --- a/enrich_test.go +++ b/enrich_test.go @@ -41,7 +41,7 @@ func TestXrayEnrichSbomOutput(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { inputPath := filepath.Join(filepath.FromSlash(securityTestUtils.GetTestResourcesPath()), "other", "enrich", tc.inputPath) - output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom", "enrich", inputPath) + output := securityTests.PlatformCli.RunCliCmdWithOutput(t, "sbom-enrich", inputPath) if tc.isXml { enrichedSbom := securityTestUtils.UnmarshalXML(t, output) assert.Greater(t, len(enrichedSbom.Vulnerabilities.Vulnerability), 0) From fce8692d776cf89a68820ebfd00e5573c240cbc1 Mon Sep 17 00:00:00 2001 From: barv Date: Sun, 7 Jul 2024 13:49:20 +0300 Subject: [PATCH 21/28] tests & fixes --- cli/docs/enrich/help.go | 2 +- cli/scancommands.go | 2 +- commands/enrich/enrich.go | 9 ++++----- commands/enrich/enrichgraph/enrichgraph.go | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cli/docs/enrich/help.go b/cli/docs/enrich/help.go index 55c7c195..fc5bbd41 100644 --- a/cli/docs/enrich/help.go +++ b/cli/docs/enrich/help.go @@ -9,5 +9,5 @@ func GetDescription() string { } func GetArguments() []components.Argument { - return []components.Argument{{Name: "source pattern", Description: `Specifies the local file system path of the JSON to be scanned.`}} + return []components.Argument{{Name: "Specific file path", Description: `Specifies the local file system path of the JSON to be scanned.`}} } diff --git a/cli/scancommands.go b/cli/scancommands.go index b3ebd7cc..0e8890ac 100644 --- a/cli/scancommands.go +++ b/cli/scancommands.go @@ -164,7 +164,7 @@ func getAuditAndScansCommands() []components.Command { func EnrichCmd(c *components.Context) error { if len(c.Arguments) == 0 { - return pluginsCommon.PrintHelpAndReturnError("providing a argument is mandatory", c) + return pluginsCommon.PrintHelpAndReturnError("providing a file path argument is mandatory", c) } serverDetails, err := createServerDetailsWithConfigOffer(c) if err != nil { diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 458cc581..cada26cd 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -7,9 +7,8 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/common/spec" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" - enrichgraph2 "github.com/jfrog/jfrog-cli-security/commands/enrich/enrichgraph" + "github.com/jfrog/jfrog-cli-security/commands/enrich/enrichgraph" "github.com/jfrog/jfrog-cli-security/formats" - "github.com/jfrog/jfrog-cli-security/scangraph" "github.com/jfrog/jfrog-cli-security/utils" xrutils "github.com/jfrog/jfrog-cli-security/utils" "github.com/jfrog/jfrog-client-go/artifactory/services/fspatterns" @@ -91,7 +90,7 @@ func (enrichCmd *EnrichCommand) Run() (err error) { } // Validate Xray minimum version for graph scan command - err = clientutils.ValidateMinimumVersion(clientutils.Xray, xrayVersion, scangraph.GraphScanMinXrayVersion) + err = clientutils.ValidateMinimumVersion(clientutils.Xray, xrayVersion, enrichgraph.EnrichMinimumVersionXray) if err != nil { return err } @@ -207,7 +206,7 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par SBOMInput: fileContent, ScanType: services.Binary, } - importGraphParams := enrichgraph2.NewEnrichGraphParams(). + importGraphParams := enrichgraph.NewEnrichGraphParams(). SetServerDetails(enrichCmd.serverDetails). SetXrayGraphScanParams(params). SetXrayVersion(xrayVersion) @@ -215,7 +214,7 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par if err != nil { return err } - scanResults, err := enrichgraph2.RunImportGraphAndGetResults(importGraphParams, xrayManager) + scanResults, err := enrichgraph.RunImportGraphAndGetResults(importGraphParams, xrayManager) if err != nil { indexedFileErrors[threadId] = append(indexedFileErrors[threadId], formats.SimpleJsonError{FilePath: filePath, ErrorMessage: err.Error()}) return diff --git a/commands/enrich/enrichgraph/enrichgraph.go b/commands/enrich/enrichgraph/enrichgraph.go index ccf9cdb4..0d59176f 100644 --- a/commands/enrich/enrichgraph/enrichgraph.go +++ b/commands/enrich/enrichgraph/enrichgraph.go @@ -6,7 +6,7 @@ import ( ) const ( - EnrichMinimumVersionXray = "3.90" + EnrichMinimumVersionXray = "3.101" ) func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { From 548dc2aacd7b0dab4ba080ea19049bf8bd2dfda9 Mon Sep 17 00:00:00 2001 From: barv Date: Sun, 7 Jul 2024 14:36:00 +0300 Subject: [PATCH 22/28] tests & fixes --- commands/enrich/enrich.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index cada26cd..ae307b94 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -11,6 +11,7 @@ import ( "github.com/jfrog/jfrog-cli-security/formats" "github.com/jfrog/jfrog-cli-security/utils" xrutils "github.com/jfrog/jfrog-cli-security/utils" + "github.com/jfrog/jfrog-cli-security/utils/xray" "github.com/jfrog/jfrog-client-go/artifactory/services/fspatterns" clientutils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/utils/errorutils" @@ -84,7 +85,7 @@ func (enrichCmd *EnrichCommand) Run() (err error) { } } }() - _, xrayVersion, err := xrutils.CreateXrayServiceManagerAndGetVersion(enrichCmd.serverDetails) + _, xrayVersion, err := xray.CreateXrayServiceManagerAndGetVersion(enrichCmd.serverDetails) if err != nil { return err } @@ -210,7 +211,7 @@ func (enrichCmd *EnrichCommand) createIndexerHandlerFunc(indexedFileProducer par SetServerDetails(enrichCmd.serverDetails). SetXrayGraphScanParams(params). SetXrayVersion(xrayVersion) - xrayManager, err := utils.CreateXrayServiceManager(importGraphParams.ServerDetails()) + xrayManager, err := xray.CreateXrayServiceManager(importGraphParams.ServerDetails()) if err != nil { return err } From 70e6f6b895adfb74db645a175fcaf83c19ebb96b Mon Sep 17 00:00:00 2001 From: barv Date: Sun, 7 Jul 2024 14:51:12 +0300 Subject: [PATCH 23/28] tests & fixes --- commands/enrich/enrich.go | 6 ++---- commands/enrich/enrichgraph/enrichgraph.go | 2 +- utils/resultwriter.go | 12 ++++++------ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index ae307b94..02653c5e 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -146,13 +146,11 @@ func (enrichCmd *EnrichCommand) Run() (err error) { return } if isxml { - if err = xrutils.NewResultsWriter(scanResults). - AppendVulnsToXML(); err != nil { + if err = utils.AppendVulnsToXML(scanResults); err != nil { return } } else { - if err = xrutils.NewResultsWriter(scanResults). - AppendVulnsToJson(); err != nil { + if err = utils.AppendVulnsToJson(scanResults); err != nil { return } } diff --git a/commands/enrich/enrichgraph/enrichgraph.go b/commands/enrich/enrichgraph/enrichgraph.go index 0d59176f..ccf9cdb4 100644 --- a/commands/enrich/enrichgraph/enrichgraph.go +++ b/commands/enrich/enrichgraph/enrichgraph.go @@ -6,7 +6,7 @@ import ( ) const ( - EnrichMinimumVersionXray = "3.101" + EnrichMinimumVersionXray = "3.90" ) func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { diff --git a/utils/resultwriter.go b/utils/resultwriter.go index 5621cc44..f84afa2b 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -130,8 +130,8 @@ func (rw *ResultsWriter) PrintScanResults() error { return nil } -func (rw *ResultsWriter) AppendVulnsToJson() error { - fileName := getScaScanFileName(rw.results) +func AppendVulnsToJson(results *Results) error { + fileName := getScaScanFileName(results) fileContent, err := os.ReadFile(fileName) if err != nil { fmt.Println("Error reading file:", err) @@ -144,7 +144,7 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { return err } var vulnerabilities []map[string]string - xrayResults := rw.results.GetScaScansXrayResults()[0] + xrayResults := results.GetScaScansXrayResults()[0] for _, vuln := range xrayResults.Vulnerabilities { for component := range vuln.Components { vulnerability := map[string]string{"bom-ref": component, "id": vuln.Cves[0].Id} @@ -155,15 +155,15 @@ func (rw *ResultsWriter) AppendVulnsToJson() error { return PrintJson(data) } -func (rw *ResultsWriter) AppendVulnsToXML() error { - fileName := getScaScanFileName(rw.results) +func AppendVulnsToXML(results *Results) error { + fileName := getScaScanFileName(results) result := etree.NewDocument() err := result.ReadFromFile(fileName) if err != nil { return err } destination := result.FindElements("//bom")[0] - xrayResults := rw.results.GetScaScansXrayResults()[0] + xrayResults := results.GetScaScansXrayResults()[0] vulns := destination.CreateElement("vulnerabilities") for _, vuln := range xrayResults.Vulnerabilities { for component := range vuln.Components { From e61129c0c015772bd9c8ec5bea17fd9ae28753db Mon Sep 17 00:00:00 2001 From: barv Date: Thu, 11 Jul 2024 09:54:24 +0300 Subject: [PATCH 24/28] tests & fixes --- go.mod | 12 +- go.sum | 1393 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1399 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8006abea..55664298 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.22.3 require ( github.com/beevik/etree v1.4.0 + github.com/google/go-github/v56 v56.0.0 github.com/gookit/color v1.5.4 github.com/jfrog/build-info-go v1.9.29 github.com/jfrog/froggit-go v1.16.0 @@ -40,14 +41,20 @@ require ( github.com/emirpasic/gods v1.18.1 // indirect github.com/forPelevin/gomoji v1.2.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-git/go-git/v5 v5.12.0 // indirect github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/grokify/mogo v0.62.6 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jedib0t/go-pretty/v6 v6.5.9 // indirect @@ -56,11 +63,13 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.3 // indirect github.com/klauspost/pgzip v1.2.6 // indirect + github.com/ktrysmt/go-bitbucket v0.9.73 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mattn/go-tty v0.0.3 // indirect + github.com/microsoft/azure-devops-go-api/azuredevops/v7 v7.1.0 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/nwaples/rardecode v1.1.3 // indirect @@ -85,6 +94,7 @@ require ( github.com/ulikunitz/xz v0.5.12 // indirect github.com/urfave/cli v1.22.15 // indirect github.com/vbauerster/mpb/v7 v7.5.3 // indirect + github.com/xanzy/go-gitlab v0.95.2 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect @@ -104,7 +114,7 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect ) -replace github.com/jfrog/jfrog-cli-core/v2 => github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 +//replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 dev replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 diff --git a/go.sum b/go.sum index 0463a67e..e7004e00 100644 --- a/go.sum +++ b/go.sum @@ -1,31 +1,643 @@ +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.44.3/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 v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +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/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CycloneDX/cyclonedx-go v0.8.0 h1:FyWVj6x6hoJrui5uRQdYZcSievw3Z32Z88uYzG/0D6M= github.com/CycloneDX/cyclonedx-go v0.8.0/go.mod h1:K2bA+324+Og0X84fA8HhN2X066K7Bxz4rpMQ4ZhjtSk= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4 h1:p0uoVJ9e54Za58LeN4TXw8Lki6FTjLVgVxoAMavMKdI= -github.com/barv-jfrog/jfrog-cli-core/v2 v2.0.0-20240613104628-62e679bfffa4/go.mod h1:4iTSevmlThM1Aw5NAY4WyVxim5US4SkrmxHSHFimaqk= github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 h1:dQQYwVj+0LNaySKzp0aZKcC+o430qPTN+a8X50/vPMg= github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= github.com/beevik/etree v1.4.0 h1:oz1UedHRepuY3p4N5OjE0nK1WLCqtzHf25bxplKOHLs= github.com/beevik/etree v1.4.0/go.mod h1:cyWiXwGoasx60gHvtnEh5x8+uIjUVnjWqBvEnhnqKDA= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= @@ -33,6 +645,12 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y= github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -42,32 +660,76 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/forPelevin/gomoji v1.2.0 h1:9k4WVSSkE1ARO/BWywxgEUBvR/jMnao6EZzrql5nxJ8= github.com/forPelevin/gomoji v1.2.0/go.mod h1:8+Z3KNGkdslmeGZBC3tCrwMrcPy5GRzAD+gL9NAwMXg= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab h1:+7KwW/yy/ThnRXW9khailFFncxJiiFpxyk5BI9GK9pI= +github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab/go.mod h1:IqOZzks2wlWCIai0esXnZPdPwxF2yOz0HcCYw5I4pCg= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= @@ -76,26 +738,153 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a h1:RYfmiM0zluBJOiPDJseKLEN4BapJ42uSi9SZBQ2YyiA= github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +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/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +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/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +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.3/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.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v56 v56.0.0 h1:TysL7dMa/r7wsQi44BjqlwaHvwlFlqkK8CtBWCX3gb4= +github.com/google/go-github/v56 v56.0.0/go.mod h1:D8cdcX98YWJvi7TLo7zM4/h8ZTx6u6fwGEkCdisopo0= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +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/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +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-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +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/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/grokify/mogo v0.62.6 h1:90QtIE5vvQ30QbrUcC1trvKHbBM/CqpMpD2y+EiVuFs= +github.com/grokify/mogo v0.62.6/go.mod h1:gK6Qf761S7iOxI3LrILjoTOJWdQPgs8LxSPdDmuX8Xo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= +github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedib0t/go-pretty/v6 v6.5.9 h1:ACteMBRrrmm1gMsXe9PSTOClQ63IXDUt03H5U+UV8OU= @@ -104,7 +893,6 @@ github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5 github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= github.com/jfrog/build-info-go v1.9.29 h1:3vJ+kbk9PpU6wjisXi9c4qISNpYkISh/NmB5mq1ZlSY= github.com/jfrog/build-info-go v1.9.29/go.mod h1:AzFJlN/yKfKuKcSBaGy5nNmKN1xzx6+XcRWAswCTLTA= - github.com/jfrog/froggit-go v1.16.0 h1:qNcerpWupkisdKf4BuofY/XdcUrQJHscSL7PGM6sETs= github.com/jfrog/froggit-go v1.16.0/go.mod h1:TEJSzgiV+3D/GVGE8Y6j46ut1jrBLD1FL6WdMdKwwCE= github.com/jfrog/gofrog v1.7.3 h1:34iaAZP9qY1dkjb8a0g0jn0u9/2k8RROx4hgnZNTAQw= @@ -113,8 +901,6 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-core/v2 v2.53.2 h1:gOao1CFLbNlvI18WigUnYNvJMy5CHFSWDD11ZLs19VQ= github.com/jfrog/jfrog-cli-core/v2 v2.53.2/go.mod h1:AVe+geiQQ4oG+xAh2oBuGcyR6kuQ14Z8s4EObV6YU+4= -github.com/jfrog/jfrog-client-go v1.41.2 h1:V3kg3K0NZEemew2qXXSAibLO/VOKbuvQfLScg+/b9C8= -github.com/jfrog/jfrog-client-go v1.41.2/go.mod h1:E7P25Wr22TlvwSk/eIbgpIOOSaZYKpXgyOd2a5WHibI= 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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= @@ -124,26 +910,38 @@ github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3t github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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/ktrysmt/go-bitbucket v0.9.73 h1:4SvrTHvqW3vqJUjg+62/QGFNz0TrvwWs7+YsUE/gsbQ= +github.com/ktrysmt/go-bitbucket v0.9.73/go.mod h1:8kiUmY5juS79IQnMd+SUYhSNlqIft31b1/bHx4clC7w= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -159,10 +957,16 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= +github.com/microsoft/azure-devops-go-api/azuredevops/v7 v7.1.0 h1:mmJCWLe63QvybxhW1iBmQWEaCKdc4SKgALfTNZ+OphU= +github.com/microsoft/azure-devops-go-api/azuredevops/v7 v7.1.0/go.mod h1:mDunUZ1IUJdJIRHvFb+LPBUtxe3AYB5MI6BMXNg8194= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 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/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= @@ -174,26 +978,44 @@ github.com/owenrumney/go-sarif/v2 v2.3.0 h1:wP5yEpI53zr0v5cBmagXzLbHZp9Oylyo3AJD github.com/owenrumney/go-sarif/v2 v2.3.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +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/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= @@ -205,6 +1027,10 @@ github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= @@ -220,9 +1046,12 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ 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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -239,6 +1068,8 @@ github.com/vbauerster/mpb/v7 v7.5.3 h1:BkGfmb6nMrrBQDFECR/Q7RkKCw7ylMetCb4079CGs github.com/vbauerster/mpb/v7 v7.5.3/go.mod h1:i+h4QY6lmLvBNK2ah1fSreiw3ajskRlBp9AhY/PnuOE= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xanzy/go-gitlab v0.95.2 h1:4p0IirHqEp5f0baK/aQqr4TR57IsD+8e4fuyAA1yi88= +github.com/xanzy/go-gitlab v0.95.2/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= @@ -251,15 +1082,43 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofm github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +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= github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +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.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= 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-20190820162420-60c769a6c586/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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -322,6 +1181,7 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= 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.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= @@ -336,12 +1196,53 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn 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-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-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= @@ -386,34 +1287,106 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ 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-20220601150217-0de741cfad7f/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.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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-20190222072716-a9d3bda3a223/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-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-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/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-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/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-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/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-20210423185535-09eb48e85fd7/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/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.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -423,7 +1396,10 @@ golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= 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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -433,37 +1409,444 @@ golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= 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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.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.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +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/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190206041539-40960b6deb8e/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-20190927191325-030b2cf1153e/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-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-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-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= 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.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= 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= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +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/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +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/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/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-20200513103714-09dca8ec2884/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/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +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/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 164aec51835160863c1b408a916ba81d3eab5e8d Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 15 Jul 2024 10:42:32 +0300 Subject: [PATCH 25/28] tests & fixes --- cli/docs/flags.go | 2 +- commands/enrich/enrichgraph/enrichgraph.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/docs/flags.go b/cli/docs/flags.go index ee7a7b59..05961519 100644 --- a/cli/docs/flags.go +++ b/cli/docs/flags.go @@ -136,7 +136,7 @@ var commandFlags = map[string][]string{ Project, Watches, RepoPath, Licenses, OutputFormat, Fail, ExtendedTable, BypassArchiveLimits, MinSeverity, FixableOnly, }, Enrich: { - url, user, password, accessToken, ServerId, SpecFlag, Threads, + url, user, password, accessToken, ServerId, Threads, }, BuildScan: { url, user, password, accessToken, ServerId, Project, Vuln, OutputFormat, Fail, ExtendedTable, Rescan, diff --git a/commands/enrich/enrichgraph/enrichgraph.go b/commands/enrich/enrichgraph/enrichgraph.go index ccf9cdb4..166121e0 100644 --- a/commands/enrich/enrichgraph/enrichgraph.go +++ b/commands/enrich/enrichgraph/enrichgraph.go @@ -6,7 +6,7 @@ import ( ) const ( - EnrichMinimumVersionXray = "3.90" + EnrichMinimumVersionXray = "3.101.3" ) func RunImportGraphAndGetResults(params *EnrichGraphParams, xrayManager *xray.XrayServicesManager) (*services.ScanResponse, error) { From 84e0fd807dc320353fe1e575db21561b6c3597e3 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 15 Jul 2024 12:03:40 +0300 Subject: [PATCH 26/28] tests & fixes --- cli/docs/enrich/help.go | 2 +- commands/enrich/enrich.go | 57 +++++++++++++++++++++++++++++++++++++-- formats/enrich_formats.go | 30 +++++++++++++++++++++ formats/enrich_output.go | 14 ---------- tests/utils/test_utils.go | 30 ++++----------------- utils/resultwriter.go | 54 +------------------------------------ 6 files changed, 92 insertions(+), 95 deletions(-) create mode 100644 formats/enrich_formats.go delete mode 100644 formats/enrich_output.go diff --git a/cli/docs/enrich/help.go b/cli/docs/enrich/help.go index fc5bbd41..fa06653a 100644 --- a/cli/docs/enrich/help.go +++ b/cli/docs/enrich/help.go @@ -9,5 +9,5 @@ func GetDescription() string { } func GetArguments() []components.Argument { - return []components.Argument{{Name: "Specific file path", Description: `Specifies the local file system path of the JSON to be scanned.`}} + return []components.Argument{{Name: "File path", Description: `Specifies the local file system path of the JSON to be scanned.`}} } diff --git a/commands/enrich/enrich.go b/commands/enrich/enrich.go index 02653c5e..5fb0071a 100644 --- a/commands/enrich/enrich.go +++ b/commands/enrich/enrich.go @@ -1,8 +1,11 @@ package enrich import ( + "encoding/json" "encoding/xml" "errors" + "fmt" + "github.com/beevik/etree" "github.com/jfrog/gofrog/parallel" "github.com/jfrog/jfrog-cli-core/v2/common/spec" "github.com/jfrog/jfrog-cli-core/v2/utils/config" @@ -61,6 +64,56 @@ func (enrichCmd *EnrichCommand) ServerDetails() (*config.ServerDetails, error) { return enrichCmd.serverDetails, nil } +func AppendVulnsToJson(results *utils.Results) error { + fileName := utils.GetScaScanFileName(results) + fileContent, err := os.ReadFile(fileName) + if err != nil { + fmt.Println("Error reading file:", err) + return err + } + var data map[string]interface{} + err = json.Unmarshal(fileContent, &data) + if err != nil { + fmt.Println("Error parsing XML:", err) + return err + } + var vulnerabilities []map[string]string + xrayResults := results.GetScaScansXrayResults()[0] + for _, vuln := range xrayResults.Vulnerabilities { + for component := range vuln.Components { + vulnerability := map[string]string{"bom-ref": component, "id": vuln.Cves[0].Id} + vulnerabilities = append(vulnerabilities, vulnerability) + } + } + data["vulnerabilities"] = vulnerabilities + return utils.PrintJson(data) +} + +func AppendVulnsToXML(results *utils.Results) error { + fileName := utils.GetScaScanFileName(results) + result := etree.NewDocument() + err := result.ReadFromFile(fileName) + if err != nil { + return err + } + destination := result.FindElements("//bom")[0] + xrayResults := results.GetScaScansXrayResults()[0] + vulns := destination.CreateElement("vulnerabilities") + for _, vuln := range xrayResults.Vulnerabilities { + for component := range vuln.Components { + addVuln := vulns.CreateElement("vulnerability") + addVuln.CreateAttr("bom-ref", component) + id := addVuln.CreateElement("id") + id.CreateText(vuln.Cves[0].Id) + } + } + result.IndentTabs() + result.Indent(2) + stringReturn, _ := result.WriteToString() + log.Output(stringReturn) + return nil +} + func isXML(scaResults []*utils.ScaScanResult) (bool, error) { if len(scaResults) == 0 { return false, errors.New("unable to retrieve file") @@ -146,11 +199,11 @@ func (enrichCmd *EnrichCommand) Run() (err error) { return } if isxml { - if err = utils.AppendVulnsToXML(scanResults); err != nil { + if err = AppendVulnsToXML(scanResults); err != nil { return } } else { - if err = utils.AppendVulnsToJson(scanResults); err != nil { + if err = AppendVulnsToJson(scanResults); err != nil { return } } diff --git a/formats/enrich_formats.go b/formats/enrich_formats.go new file mode 100644 index 00000000..2c70d261 --- /dev/null +++ b/formats/enrich_formats.go @@ -0,0 +1,30 @@ +package formats + +type Vulnerability struct { + BomRef string `json:"bom-ref" xml:"bom-ref,attr"` + ID string `json:"id" xml:"id"` +} + +type XMLVulnerability struct { + Vulnerability []Vulnerability `xml:"vulnerability"` +} + +type Vulnerabilities struct { + Vulnerabilities XMLVulnerability `xml:"vulnerabilities"` +} + +type EnrichJson struct { + Vulnerability []struct { + BomRef string `json:"bom-ref,"` + Id string `json:"id"` + } `json:"vulnerabilities"` +} + +type Bom struct { + Vulnerabilities struct { + Vulnerability []struct { + BomRef string `xml:"bom-ref,attr"` + Id string `xml:"id"` + } `xml:"vulnerability"` + } `xml:"vulnerabilities"` +} diff --git a/formats/enrich_output.go b/formats/enrich_output.go deleted file mode 100644 index 32bac751..00000000 --- a/formats/enrich_output.go +++ /dev/null @@ -1,14 +0,0 @@ -package formats - -type Vulnerability struct { - BomRef string `json:"bom-ref" xml:"bom-ref,attr"` - ID string `json:"id" xml:"id"` -} - -type XMLVulnerability struct { - Vulnerability []Vulnerability `xml:"vulnerability"` -} - -type Vulnerabilities struct { - Vulnerabilities XMLVulnerability `xml:"vulnerabilities"` -} diff --git a/tests/utils/test_utils.go b/tests/utils/test_utils.go index 8d4a02fa..f04b30f5 100644 --- a/tests/utils/test_utils.go +++ b/tests/utils/test_utils.go @@ -5,6 +5,7 @@ import ( "encoding/xml" "errors" "fmt" + "github.com/jfrog/jfrog-cli-security/formats" "os" "path/filepath" "strconv" @@ -28,36 +29,15 @@ import ( clientTests "github.com/jfrog/jfrog-client-go/utils/tests" ) -type Vulnerability struct { - BomRef string `json:"bom-ref"` - Id string `json:"id"` -} - -type EnrichJson struct { - Vulnerability []struct { - BomRef string `json:"bom-ref,"` - Id string `json:"id"` - } `json:"vulnerabilities"` -} - -type Bom struct { - Vulnerabilities struct { - Vulnerability []struct { - BomRef string `xml:"bom-ref,attr"` - Id string `xml:"id"` - } `xml:"vulnerability"` - } `xml:"vulnerabilities"` -} - -func UnmarshalJson(t *testing.T, output string) EnrichJson { - var jsonMap EnrichJson +func UnmarshalJson(t *testing.T, output string) formats.EnrichJson { + var jsonMap formats.EnrichJson err := json.Unmarshal([]byte(output), &jsonMap) assert.NoError(t, err) return jsonMap } -func UnmarshalXML(t *testing.T, output string) Bom { - var xmlMap Bom +func UnmarshalXML(t *testing.T, output string) formats.Bom { + var xmlMap formats.Bom err := xml.Unmarshal([]byte(output), &xmlMap) assert.NoError(t, err) return xmlMap diff --git a/utils/resultwriter.go b/utils/resultwriter.go index f84afa2b..78cf76e1 100644 --- a/utils/resultwriter.go +++ b/utils/resultwriter.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/beevik/etree" "github.com/jfrog/jfrog-cli-core/v2/common/format" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-security/formats" @@ -19,7 +18,6 @@ import ( "github.com/jfrog/jfrog-client-go/xray/services" "github.com/owenrumney/go-sarif/v2/sarif" "golang.org/x/exp/slices" - "os" "strconv" "strings" ) @@ -58,7 +56,7 @@ func NewResultsWriter(scanResults *Results) *ResultsWriter { return &ResultsWriter{results: scanResults} } -func getScaScanFileName(r *Results) string { +func GetScaScanFileName(r *Results) string { if len(r.ScaResults) > 0 { return r.ScaResults[0].Target } @@ -130,56 +128,6 @@ func (rw *ResultsWriter) PrintScanResults() error { return nil } -func AppendVulnsToJson(results *Results) error { - fileName := getScaScanFileName(results) - fileContent, err := os.ReadFile(fileName) - if err != nil { - fmt.Println("Error reading file:", err) - return err - } - var data map[string]interface{} - err = json.Unmarshal(fileContent, &data) - if err != nil { - fmt.Println("Error parsing XML:", err) - return err - } - var vulnerabilities []map[string]string - xrayResults := results.GetScaScansXrayResults()[0] - for _, vuln := range xrayResults.Vulnerabilities { - for component := range vuln.Components { - vulnerability := map[string]string{"bom-ref": component, "id": vuln.Cves[0].Id} - vulnerabilities = append(vulnerabilities, vulnerability) - } - } - data["vulnerabilities"] = vulnerabilities - return PrintJson(data) -} - -func AppendVulnsToXML(results *Results) error { - fileName := getScaScanFileName(results) - result := etree.NewDocument() - err := result.ReadFromFile(fileName) - if err != nil { - return err - } - destination := result.FindElements("//bom")[0] - xrayResults := results.GetScaScansXrayResults()[0] - vulns := destination.CreateElement("vulnerabilities") - for _, vuln := range xrayResults.Vulnerabilities { - for component := range vuln.Components { - addVuln := vulns.CreateElement("vulnerability") - addVuln.CreateAttr("bom-ref", component) - id := addVuln.CreateElement("id") - id.CreateText(vuln.Cves[0].Id) - } - } - result.IndentTabs() - result.Indent(2) - stringReturn, _ := result.WriteToString() - log.Output(stringReturn) - return nil -} - func (rw *ResultsWriter) printScanResultsTables() (err error) { printMessages(rw.messages) violations, vulnerabilities, licenses := SplitScanResults(rw.results.ScaResults) From cabfafd0d2dc36e025e3cd3c8d741aa8db04dec2 Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 15 Jul 2024 16:28:06 +0300 Subject: [PATCH 27/28] tests & fixes --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 55664298..cd20f294 100644 --- a/go.mod +++ b/go.mod @@ -116,7 +116,7 @@ require ( //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 dev -replace github.com/jfrog/jfrog-client-go => github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 +//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go dev //replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go dev diff --git a/go.sum b/go.sum index e7004e00..305b482b 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,6 @@ github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2 github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0 h1:dQQYwVj+0LNaySKzp0aZKcC+o430qPTN+a8X50/vPMg= -github.com/barv-jfrog/jfrog-client-go v0.0.0-20240617141757-718674183bc0/go.mod h1:AN+/mT2DIBE4oRZicJojqND2BEKLfA7f73i5rT3Lfcc= github.com/beevik/etree v1.4.0 h1:oz1UedHRepuY3p4N5OjE0nK1WLCqtzHf25bxplKOHLs= github.com/beevik/etree v1.4.0/go.mod h1:cyWiXwGoasx60gHvtnEh5x8+uIjUVnjWqBvEnhnqKDA= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -901,6 +899,8 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-core/v2 v2.53.2 h1:gOao1CFLbNlvI18WigUnYNvJMy5CHFSWDD11ZLs19VQ= github.com/jfrog/jfrog-cli-core/v2 v2.53.2/go.mod h1:AVe+geiQQ4oG+xAh2oBuGcyR6kuQ14Z8s4EObV6YU+4= +github.com/jfrog/jfrog-client-go v1.41.2 h1:V3kg3K0NZEemew2qXXSAibLO/VOKbuvQfLScg+/b9C8= +github.com/jfrog/jfrog-client-go v1.41.2/go.mod h1:E7P25Wr22TlvwSk/eIbgpIOOSaZYKpXgyOd2a5WHibI= 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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= From 1d9fb23299023df71aa6b68644dd8cfe1c17d1ed Mon Sep 17 00:00:00 2001 From: barv Date: Mon, 15 Jul 2024 17:11:54 +0300 Subject: [PATCH 28/28] tests & fixes --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cd20f294..08493238 100644 --- a/go.mod +++ b/go.mod @@ -116,7 +116,7 @@ require ( //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 dev -//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go dev +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20240715134305-9de1ac3f72f7 //replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go dev diff --git a/go.sum b/go.sum index 305b482b..5f03b694 100644 --- a/go.sum +++ b/go.sum @@ -899,8 +899,8 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-core/v2 v2.53.2 h1:gOao1CFLbNlvI18WigUnYNvJMy5CHFSWDD11ZLs19VQ= github.com/jfrog/jfrog-cli-core/v2 v2.53.2/go.mod h1:AVe+geiQQ4oG+xAh2oBuGcyR6kuQ14Z8s4EObV6YU+4= -github.com/jfrog/jfrog-client-go v1.41.2 h1:V3kg3K0NZEemew2qXXSAibLO/VOKbuvQfLScg+/b9C8= -github.com/jfrog/jfrog-client-go v1.41.2/go.mod h1:E7P25Wr22TlvwSk/eIbgpIOOSaZYKpXgyOd2a5WHibI= +github.com/jfrog/jfrog-client-go v1.28.1-0.20240715134305-9de1ac3f72f7 h1:OFL5R/hdcUnVNQ86wH9wzfuvRUHB0OnGfROmpnIPg5A= +github.com/jfrog/jfrog-client-go v1.28.1-0.20240715134305-9de1ac3f72f7/go.mod h1:E7P25Wr22TlvwSk/eIbgpIOOSaZYKpXgyOd2a5WHibI= 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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=