Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
strategy:
matrix:
os: [Ubuntu]
go-version: ["1.23.x"]
go-version: ["1.24.x"]
runs-on: ${{ matrix.os }}-latest
permissions:
contents: read # for golangci-lint-action
Expand All @@ -39,6 +39,7 @@ jobs:
paths: "test-report.xml"
if: always()
- name: Lint
uses: golangci/golangci-lint-action@v7
uses: golangci/golangci-lint-action@v8
with:
version: v2.0.1
version: v2.1.6
args: --timeout=5m --verbose
2 changes: 1 addition & 1 deletion .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ linters:
#- exhaustruct # checks if all structure fields are initialized
- exptostd # Detects functions from golang.org/x/exp/ that can be replaced by std functions.
- fatcontext # finds nested context.WithValue calls in loops
# - forbidigo # forbids identifiers
#- forbidigo # forbids identifiers
#- forcetypeassert # finds forced type assertions
#- funlen # Tool for detection of long functions
#- ginkgolinter # Enforces the Ginkgo testing package guidelines.
Expand Down
186 changes: 175 additions & 11 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
apply = func(cmd *cli.Command) {
fieldValue.SetString(cmd.String(flagName))
}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32:
case reflect.Int:
var value int64
var err error
if tags.defaultValue != "" {
Expand All @@ -96,17 +96,76 @@
return fmt.Errorf("failed to parse int value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.IntFlag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: value,
Value: int(value),

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of a signed 64-bit integer from
strconv.ParseInt
to a lower bit size type int without an upper bound check.

Copilot Autofix

AI 12 months ago

Copilot could not generate an autofix suggestion

Copilot could not generate an autofix suggestion for this alert. Try pushing a new commit or if the problem persists contact support.

Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetInt(int64(cmd.Int(flagName)))
}
case reflect.Int8:
var value int64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseInt(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse int value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}
flag = &cli.Int8Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: int8(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of a signed 64-bit integer from
strconv.ParseInt
to a lower bit size type int8 without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to ensure that the value parsed by strconv.ParseInt is within the valid range for int8 (-128 to 127) before performing the conversion. If the value is out of bounds, we should handle it appropriately, such as returning an error or using a default value.

The fix involves:

  1. Adding a bounds check for the parsed value against math.MinInt8 and math.MaxInt8.
  2. Only performing the int8 conversion if the value is within the valid range.
  3. Returning an error or a default value if the bounds check fails.

The changes will be made in the case reflect.Int8 block of the processField function.


Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -117,2 +117,6 @@
 			}
+			// Check if the parsed value is within the range of int8
+			if value < math.MinInt8 || value > math.MaxInt8 {
+				return fmt.Errorf("value %d for field %s is out of range for int8", value, field.Name)
+			}
 		}
@@ -123,3 +127,3 @@
 			DefaultText: tags.defaultValue,
-			Value:       int8(value), //nolint: gosec
+			Value:       int8(value),
 			Sources:     sources,
EOF
@@ -117,2 +117,6 @@
}
// Check if the parsed value is within the range of int8
if value < math.MinInt8 || value > math.MaxInt8 {
return fmt.Errorf("value %d for field %s is out of range for int8", value, field.Name)
}
}
@@ -123,3 +127,3 @@
DefaultText: tags.defaultValue,
Value: int8(value), //nolint: gosec
Value: int8(value),
Sources: sources,
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetInt(int64(cmd.Int8(flagName)))
}
case reflect.Int16:
var value int64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseInt(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse int value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}
flag = &cli.Int16Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: int16(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of a signed 64-bit integer from
strconv.ParseInt
to a lower bit size type int16 without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to add explicit bounds checking before converting the int64 value to int16. The bounds for int16 are defined in the math package as math.MinInt16 and math.MaxInt16. If the parsed value falls outside this range, we should handle it gracefully, such as by returning an error or using a default value.

The changes will be made in the case reflect.Int16 block of the processField function in config.go. Specifically:

  1. Add a bounds check for value after parsing it with strconv.ParseInt.
  2. Ensure that the conversion to int16 only occurs if the value is within the valid range.

Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -143,3 +143,8 @@
 			DefaultText: tags.defaultValue,
-			Value:       int16(value), //nolint: gosec
+			Value: func() int16 {
+				if value < math.MinInt16 || value > math.MaxInt16 {
+					panic(fmt.Errorf("value %d out of range for int16 for field %s", value, field.Name))
+				}
+				return int16(value)
+			}(),
 			Sources:     sources,
EOF
@@ -143,3 +143,8 @@
DefaultText: tags.defaultValue,
Value: int16(value), //nolint: gosec
Value: func() int16 {
if value < math.MinInt16 || value > math.MaxInt16 {
panic(fmt.Errorf("value %d out of range for int16 for field %s", value, field.Name))
}
return int16(value)
}(),
Sources: sources,
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetInt(cmd.Int(flagName))
fieldValue.SetInt(int64(cmd.Int16(flagName)))
}
case reflect.Int32:
var value int64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseInt(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse int value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}
flag = &cli.Int32Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: int32(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of a signed 64-bit integer from
strconv.ParseInt
to a lower bit size type int32 without an upper bound check.

Copilot Autofix

AI 12 months ago

Copilot could not generate an autofix suggestion

Copilot could not generate an autofix suggestion for this alert. Try pushing a new commit or if the problem persists contact support.

Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetInt(int64(cmd.Int32(flagName)))
}
case reflect.Int64:
if _, ok := fieldValue.Interface().(time.Duration); ok { // special handling for time.Duration, which is a int64
Expand Down Expand Up @@ -140,7 +199,7 @@
}
}

flag = &cli.IntFlag{
flag = &cli.Int64Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
Expand All @@ -149,10 +208,10 @@
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetInt(cmd.Int(flagName))
fieldValue.SetInt(cmd.Int64(flagName))
}
}
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
case reflect.Uint:
var value uint64
var err error
if tags.defaultValue != "" {
Expand All @@ -163,6 +222,90 @@
}

flag = &cli.UintFlag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: uint(value),

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of an unsigned 64-bit integer from
strconv.ParseUint
to a lower bit size type uint without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to ensure that the parsed uint64 value is within the range of the uint type before converting it. This can be achieved by adding an upper bound check using the math package. Specifically:

  1. Determine the maximum value of the uint type based on the platform (32-bit or 64-bit).
  2. Compare the parsed uint64 value against this maximum value.
  3. If the value exceeds the maximum, handle the error appropriately (e.g., return an error or use a default value).

The fix will involve modifying the code around line 229 to include the upper bound check.


Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -228,3 +228,8 @@
 			DefaultText: tags.defaultValue,
-			Value:       uint(value),
+			Value: func() uint {
+				if value > uint64(^uint(0)) { // Check if value exceeds the maximum for uint
+					panic(fmt.Errorf("value %d exceeds maximum uint value for platform", value))
+				}
+				return uint(value)
+			}(),
 			Sources:     sources,
EOF
@@ -228,3 +228,8 @@
DefaultText: tags.defaultValue,
Value: uint(value),
Value: func() uint {
if value > uint64(^uint(0)) { // Check if value exceeds the maximum for uint
panic(fmt.Errorf("value %d exceeds maximum uint value for platform", value))
}
return uint(value)
}(),
Sources: sources,
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetUint(uint64(cmd.Uint(flagName)))
}
case reflect.Uint8:
var value uint64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseUint(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse uint value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.Uint8Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: uint8(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of an unsigned 64-bit integer from
strconv.ParseUint
to a lower bit size type uint8 without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to add an upper bound check before converting the uint64 value to uint8. Specifically:

  1. Use the math.MaxUint8 constant from the math package to check if the parsed value exceeds the maximum allowable value for uint8.
  2. If the value is out of bounds, handle the error appropriately (e.g., return an error or use a default value).

This ensures that the conversion is safe and prevents unexpected truncation of values.


Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -8,2 +8,3 @@
 	"strings"
+	"math"
 	"time"
@@ -249,3 +250,8 @@
 			DefaultText: tags.defaultValue,
-			Value:       uint8(value), //nolint: gosec
+			Value:       func() uint8 {
+				if value > math.MaxUint8 {
+					panic(fmt.Errorf("value %d exceeds uint8 range for field %s", value, field.Name))
+				}
+				return uint8(value)
+			}(),
 			Sources:     sources,
EOF
@@ -8,2 +8,3 @@
"strings"
"math"
"time"
@@ -249,3 +250,8 @@
DefaultText: tags.defaultValue,
Value: uint8(value), //nolint: gosec
Value: func() uint8 {
if value > math.MaxUint8 {
panic(fmt.Errorf("value %d exceeds uint8 range for field %s", value, field.Name))
}
return uint8(value)
}(),
Sources: sources,
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetUint(uint64(cmd.Uint8(flagName)))
}
case reflect.Uint16:
var value uint64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseUint(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse uint value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.Uint16Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: uint16(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of an unsigned 64-bit integer from
strconv.ParseUint
to a lower bit size type uint16 without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to ensure that the value parsed from tags.defaultValue is within the valid range for uint16 (0 to 65535) before converting it. This can be achieved by adding an explicit bounds check after parsing the value with strconv.ParseUint. If the value is out of range, we should handle it appropriately, such as returning an error or using a default value.

The changes will be made in the case reflect.Uint16 block:

  1. Add a bounds check for value to ensure it is within the range of uint16.
  2. If the value is out of range, return an error or use a default value.

Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -263,2 +263,6 @@
 			}
+			// Ensure the value is within the range of uint16
+			if value > math.MaxUint16 {
+				return fmt.Errorf("value %d for field %s exceeds uint16 range", value, field.Name)
+			}
 		}
@@ -270,3 +274,3 @@
 			DefaultText: tags.defaultValue,
-			Value:       uint16(value), //nolint: gosec
+			Value:       uint16(value),
 			Sources:     sources,
EOF
@@ -263,2 +263,6 @@
}
// Ensure the value is within the range of uint16
if value > math.MaxUint16 {
return fmt.Errorf("value %d for field %s exceeds uint16 range", value, field.Name)
}
}
@@ -270,3 +274,3 @@
DefaultText: tags.defaultValue,
Value: uint16(value), //nolint: gosec
Value: uint16(value),
Sources: sources,
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetUint(uint64(cmd.Uint16(flagName)))
}
case reflect.Uint32:
var value uint64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseUint(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse uint value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.Uint32Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: uint32(value), //nolint: gosec

Check failure

Code scanning / CodeQL

Incorrect conversion between integer types High

Incorrect conversion of an unsigned 64-bit integer from
strconv.ParseUint
to a lower bit size type uint32 without an upper bound check.

Copilot Autofix

AI 12 months ago

To fix the issue, we need to ensure that the value parsed by strconv.ParseUint is within the valid range for uint32 before performing the conversion. The maximum value for uint32 is math.MaxUint32. If the value exceeds this limit, we should handle it appropriately, such as returning an error or using a default value.

The fix involves:

  1. Adding an upper bound check for value against math.MaxUint32 before converting it to uint32.
  2. Importing the math package to access math.MaxUint32.

Suggested changeset 1
config.go

Autofix patch

Autofix patch
Run the following command in your local git repository to apply this patch
cat << 'EOF' | git apply
diff --git a/config.go b/config.go
--- a/config.go
+++ b/config.go
@@ -7,2 +7,3 @@
 	"strconv"
+	"math"
 	"strings"
@@ -284,2 +285,6 @@
 			}
+			// Check if the value exceeds the maximum for uint32
+			if value > math.MaxUint32 {
+				return fmt.Errorf("value %d exceeds maximum uint32 value for field %s", value, field.Name)
+			}
 		}
EOF
@@ -7,2 +7,3 @@
"strconv"
"math"
"strings"
@@ -284,2 +285,6 @@
}
// Check if the value exceeds the maximum for uint32
if value > math.MaxUint32 {
return fmt.Errorf("value %d exceeds maximum uint32 value for field %s", value, field.Name)
}
}
Copilot is powered by AI and may make mistakes. Always verify output.
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetUint(uint64(cmd.Uint32(flagName)))
}
case reflect.Uint64:
var value uint64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseUint(tags.defaultValue, 10, 64)
if err != nil {
return fmt.Errorf("failed to parse uint value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.Uint64Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
Expand All @@ -171,9 +314,30 @@
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetUint(cmd.Uint(flagName))
fieldValue.SetUint(cmd.Uint64(flagName))
}
case reflect.Float32:
var value float64
var err error
if tags.defaultValue != "" {
value, err = strconv.ParseFloat(tags.defaultValue, 64)
if err != nil {
return fmt.Errorf("failed to parse float value %s for field %s: %w", tags.defaultValue, field.Name, err)
}
}

flag = &cli.Float32Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
DefaultText: tags.defaultValue,
Value: float32(value),
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetFloat(float64(cmd.Float32(flagName)))
}
case reflect.Float32, reflect.Float64:
case reflect.Float64:
var value float64
var err error
if tags.defaultValue != "" {
Expand All @@ -183,7 +347,7 @@
}
}

flag = &cli.FloatFlag{
flag = &cli.Float64Flag{
Name: flagName,
Aliases: tags.aliases,
Usage: tags.help,
Expand All @@ -192,7 +356,7 @@
Sources: sources,
}
apply = func(cmd *cli.Command) {
fieldValue.SetFloat(cmd.Float(flagName))
fieldValue.SetFloat(cmd.Float64(flagName))
}
case reflect.Bool:
var value bool
Expand Down
14 changes: 7 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@ require (
github.com/BurntSushi/toml v1.5.0
github.com/go-playground/validator/v10 v10.26.0
github.com/iancoleman/strcase v0.3.0
github.com/samber/lo v1.49.1
github.com/samber/lo v1.50.0
github.com/stretchr/testify v1.10.0
github.com/urfave/cli/v3 v3.1.1
github.com/urfave/cli/v3 v3.3.3
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sys v0.32.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/crypto v0.38.0 // indirect
golang.org/x/net v0.40.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
28 changes: 14 additions & 14 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
Expand All @@ -22,20 +22,20 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew=
github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o=
github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY=
github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/urfave/cli/v3 v3.1.1 h1:bNnl8pFI5dxPOjeONvFCDFoECLQsceDG4ejahs4Jtxk=
github.com/urfave/cli/v3 v3.1.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down